6

最初に自分の仕事について説明します。2 つの異なるロープから 3000 近くの画像があります。それらには、ロープ 1、ロープ 2、および背景が含まれています。私のラベル/マスクは画像です。たとえば、ピクセル値 0 は背景を表し、1 は最初のロープを表し、2 は 2 番目のロープを表します。下の図 1 と 2 で、入力画像とグラウンド トゥルース/ラベルの両方を確認できます。私のグラウンド トゥルース/ラベルには 0、1、2 の 3 つの値しかないことに注意してください。私の入力画像は灰色ですが、DeepLab は RGB 画像でトレーニングされているため、DeepLab ではそれを RGB 画像に変換しました。しかし、変換された画像にはまだ色が含まれていません。

これは私のネットワークの入力画像です これがグラウンド トゥルースです 生のカラー画像

このタスクの考え方は、ニューラル ネットワークがロープから構造を学習する必要があるため、結び目があってもロープに正しくラベルを付けることができるということです。私のロープは異なる色を持っているので、色情報は重要ではありません。そのため、KMeans を使用してグラウンド トゥルース/ラベルを作成するのは簡単です。

このタスクでは、バックエンドとして TensorFlow を使用する Keras の DeepLab V3+ と呼ばれるセマンティック セグメンテーション ネットワークを選択します。3000 枚近くの画像を使用して NN をトレーニングしたいと考えています。すべての画像のサイズは 100MB 未満で、300x200 ピクセルです。私の写真には色情報が含まれておらず、写真のサイズが非常に小さい (300x200) ため、DeepLab は私のタスクに最適な選択ではないかもしれませんが、これまでのところ、私のタスクに適したセマンティック セグメンテーション NN は見つかりませんでした。

Keras Web サイトから、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()
4

2 に答える 2

1

IBM の大規模モデル サポート (LMS) ライブラリを使用すると、通常はトレーニング中に GPU メモリを使い果たす大規模なディープ ニューラル ネットワークのトレーニングが可能になります。LMS は、必要のないテンソルを一時的にホスト メモリにスワップすることで、GPU メモリのオーバーサブスクリプションを管理します。

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

パイトーチ - https://github.com/IBM/pytorch-large-model-support

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

于 2020-11-03T04:21:11.993 に答える