python – 语义图像分割NN(DeepLabV3)的内存问题太多

我首先解释一下我的任务:我有来自两条不同绳索的近3000张图像.它们包含绳索1,绳索2和背景.我的标签/面具是图像,其中例如像素值0表示背景,1表示第一根绳子,2表示第二根绳子.您可以在下面的图片1和2中看到输入图片和地面实况/标签.请注意,我的基础事实/标签只有3个值:0,1和2.

我的输入图片是灰色的,但是对于DeepLab,我将其转换为RGB图片,因为DeepLab是在RGB图片上训练的.但我转换的图片仍然不包含颜色.

《python – 语义图像分割NN(DeepLabV3)的内存问题太多》
《python – 语义图像分割NN(DeepLabV3)的内存问题太多》
《python – 语义图像分割NN(DeepLabV3)的内存问题太多》

这个任务的想法是神经网络应该从绳索学习结构,所以它可以正确地标记绳索,即使有结.因此,颜色信息并不重要,因为我的绳索颜色不同,所以很容易使用KMeans来创建地面真相/标签.

为此,我选择了一个名为DeepLab V3的语义分段网络,其中TensorFlow为后端.我想用近3000幅图像训练NN.图像的大小小于100MB,它们是300×200像素.
也许DeepLab不是我的任务的最佳选择,因为我的图片不包含颜色信息,我的图片尺寸非常小(300×200),但到目前为止我没有找到任何更好的语义分割NN.

从Keras网站我知道如何使用flow_from_directory加载数据以及如何使用fit_generator方法.我不知道我的代码是否符合逻辑……

以下是链接:

https://keras.io/preprocessing/image/

https://keras.io/models/model/

https://github.com/bonlime/keras-deeplab-v3-plus

我的第一个问题是:

通过我的实现,我的显卡几乎使用了所有内存(11GB).我不知道为什么. DeepLab的权重是否可能那么大?我的Batchsize默认为32,所有近300张图片都不到100MB.我已经使用了config.gpu_options.allow_growth = True代码,请参阅下面的代码.

一般问题:

有人为我的任务知道一个好的语义分割NN吗?我不需要使用彩色图像训练的NN.但我也不需要NN,它们是用二进制真实图片训练的……
我用DeepLab测试了我的原始彩色图像(图3),但我得到的结果标签不好……

到目前为止,这是我的代码:

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "3"

import numpy as np
from model import Deeplabv3
import tensorflow as tf
import time
import tensorboard
import keras
from keras.preprocessing.image import img_to_array
from keras.applications import imagenet_utils
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import TensorBoard


config = tf.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.Session(config=config)

from keras import backend as K
K.set_session(session)

NAME = "DeepLab-{}".format(int(time.time()))

deeplab_model = Deeplabv3(input_shape=(300,200,3), classes=3)

tensorboard = TensorBoard(log_dir="logpath/{}".format(NAME))

deeplab_model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=['accuracy'])

# we create two instances with the same arguments
data_gen_args = dict(featurewise_center=True,
                     featurewise_std_normalization=True,
                     rotation_range=90,
                     width_shift_range=0.1,
                     height_shift_range=0.1,
                     zoom_range=0.2)
image_datagen = ImageDataGenerator(**data_gen_args)
mask_datagen = ImageDataGenerator(**data_gen_args)

# Provide the same seed and keyword arguments to the fit and flow methods
seed = 1
#image_datagen.fit(images, augment=True, seed=seed)
#mask_datagen.fit(masks, augment=True, seed=seed)

image_generator = image_datagen.flow_from_directory(
    '/path/Input/',
    target_size=(300,200),
    class_mode=None,
    seed=seed)

mask_generator = mask_datagen.flow_from_directory(
    '/path/Label/',
    target_size=(300,200),
    class_mode=None,
    seed=seed)

# combine generators into one which yields image and masks
train_generator = zip(image_generator, mask_generator)

print("compiled")

#deeplab_model.fit(X, y, batch_size=32, epochs=10, validation_split=0.3, callbacks=[tensorboard])
deeplab_model.fit_generator(train_generator, steps_per_epoch= np.uint32(2935 / 32), epochs=10, callbacks=[tensorboard])

print("finish fit")
deeplab_model.save_weights('deeplab_1.h5')
deeplab_model.save('deeplab-1')

session.close()

这是我测试DeepLab的代码(来自Github):

from matplotlib import pyplot as plt
import cv2 # used for resize. if you dont have it, use anything else
import numpy as np
from model import Deeplabv3
import tensorflow as tf
from PIL import Image, ImageEnhance

deeplab_model = Deeplabv3(input_shape=(512,512,3), classes=3)
#deeplab_model = Deeplabv3()
img = Image.open("Path/Input/0/0001.png")
imResize = img.resize((512,512), Image.ANTIALIAS)
imResize = np.array(imResize)
img2 = cv2.cvtColor(imResize, cv2.COLOR_GRAY2RGB)

w, h, _ = img2.shape
ratio = 512. / np.max([w,h])
resized = cv2.resize(img2,(int(ratio*h),int(ratio*w)))
resized = resized / 127.5 - 1.
pad_x = int(512 - resized.shape[0])
resized2 = np.pad(resized,((0,pad_x),(0,0),(0,0)),mode='constant')
res = deeplab_model.predict(np.expand_dims(resized2,0))
labels = np.argmax(res.squeeze(),-1)
plt.imshow(labels[:-pad_x])
plt.show()

最佳答案 第一个问题:DeepLabV3是一个非常大的模型(我假设您正在使用Xception主干?!)和11 GB的所需GPU容量是完全正常的32 bachsize 32×300像素:)(训练DeeplabV3,我需要大约. 11 GB使用5个500×500像素的批量大小).您问题的第二句的一个注释:所需的GPU资源受许多因素(模型,优化器,批量大小,图像裁剪,预处理等)的影响,但数据集的实际大小不应影响它.因此,如果您的数据集大小为300MB或300GB并不重要.

一般问题:您使用的是小型数据集.选择DeeplabV3& Xception可能不太适合,因为模型可能太大.这可能会导致过度拟合.如果您还没有获得满意的结果,那么您可以尝试使用更小的网络.如果你想坚持使用DeepLab框架,你可以将骨干网从Xception网络切换到MobileNetV2(在已经实现的官方tensorflow版本中).或者,您可以尝试使用独立网络,例如带有FCN头的Inception网络……

在每种情况下,必须使用具有良好训练的特征表示的预训练编码器.如果您没有根据灰度输入图像找到所需模型的良好初始化,只需使用预先训练过RGB图像的模型,并使用灰度数据集扩展预训练(基本上您可以将任何大的rgb数据集转换为灰度)并在使用数据之前微调灰度输入上的权重.

我希望这有帮助!干杯,弗兰克

点赞