首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >语义图像分割神经网络(DeepLabV3+)的内存过多问题

语义图像分割神经网络(DeepLabV3+)的内存过多问题
EN

Stack Overflow用户
提问于 2019-02-21 19:03:32
回答 2查看 1.8K关注 0票数 6

我首先解释我的任务:我有来自两种不同方法的近3000张图片。它们包含绳索1、绳索2和背景。我的标签/蒙版是图像,例如,像素值0代表背景,1代表第一个绳索,2代表第二个绳索。你可以在下面的图片1和2上看到输入图片和地面实况/标签。请注意,我的地面实况/标签只有3个值: 0,1和2。我的输入图片是灰色的,但对于DeepLab,我将其转换为RGB图片,因为DeepLab是在RGB图片上训练的。但我转换后的图片仍然不包含颜色。

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

对于这项任务,我选择了一个名为DeepLab V3+的语义分割网络,在Keras中使用TensorFlow作为后端。我想用我的近3000张图片来训练神经网络。所有图像的大小都在100MB以下,大小为300x200像素。也许DeepLab不是我的任务的最佳选择,因为我的图片不包含颜色信息,并且我的图片非常小(300x200),但到目前为止,我还没有找到更好的语义分割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

我的第一个问题是:

在我的实现中,我的显卡使用了几乎所有的内存(11 my )。我也不知道原因。有没有可能,来自DeepLab的权重有那么大?我的Batchsize默认是32,我所有的近300张图片都小于100MB。我已经使用了config.gpu_options.allow_growth = True代码,请参阅下面的代码。

一个一般性的问题:

有人知道我的任务的好的语义分割神经网络吗?我不需要NN,它是用彩色图像训练的。但我也不需要神经网络,它是用二进制地面实况图片训练的……我用DeepLab测试了我的原始彩色图像(图3),但我得到的标签不好……

到目前为止,我的代码如下:

代码语言:javascript
复制
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):

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-28 19:03:19

第一个问题: DeepLabV3+是一个非常大的模型(我假设您使用的是Xception主干?!)和11 GB所需的图形处理器容量是完全正常的大小32与200x300像素:) (训练DeeplabV3+,我需要大约。11 GB,批量大小为5,像素为500x500 )。你的问题的第二句话需要注意的一点是:所需的GPU资源受许多因素(模型、优化器、批处理大小、图像裁剪、预处理等)的影响,但数据集的实际大小不应影响它。因此,无论您的数据集是300MB还是300‘t大小都没有关系。

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

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

我希望这能帮到你!干杯,弗兰克

票数 3
EN

Stack Overflow用户

发布于 2020-11-03 12:21:12

IBM的大型模型支持(LMS)库支持训练大型深度神经网络,这通常会在训练时耗尽GPU内存。LMS通过在不需要时将张量临时交换到主机内存来管理GPU内存的这种超额订阅。

说明- https://developer.ibm.com/components/ibm-power/articles/deeplabv3-image-segmentation-with-pytorch-lms/

Pytorch - https://github.com/IBM/pytorch-large-model-support

TensorFlow - https://github.com/IBM/tensorflow-large-model-support

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54805568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档