私はTensorflowをKerasのバックエンドとして使用しており、画像セグメンテーショントレーニング用にラベルを取り込む方法を理解しようとしています。
私は LFWパーツデータセット を使用しています。これには、グラウンドトゥルース画像と次のようなグラウンドトゥルースマスクの両方があります* 1500トレーニング画像:
プロセスを理解しているので、トレーニング中に両方をロードします
私のニーズを満たすためにこれをバッチで行う。今私の質問は、それらの両方(画像とマスク画像)をNumPy配列(N、N、3)としてロードするだけで十分ですか、それとも何らかの方法でマスク画像を処理/再形成する必要がありますか?事実上、マスク/ラベルは[R、G、B]ピクセルとして表されます。ここで:
私はそれを0-1に正規化するためにこのようなことをすることができました、しかし私は私がすべきかどうかわかりません:
im = Image.open(path)
label = np.array(im, dtype=np.uint8)
label = np.multiply(label, 1.0/255)
だから私は最終的に:
オンラインで見つけたものはすべて、tensorflowまたはkerasの既存のデータセットを使用しています。カスタムデータセットと見なすことができるものがある場合、物事をどのように実行するかについて、それほど明確なことは何もありません。
これはCaffeに関連していることがわかりました: https://groups.google.com/forum/#!topic/caffe-users/9qNggEa8EaQ
そして、彼らはマスク画像を(H, W, 1)
(HWC)に変換することを提唱しています。私のクラスはそれぞれ背景、髪、顔の0, 1 ,2
になります。
これはここで重複している可能性があります(同様の質問/回答の組み合わせ):
マルチクラスセマンティックセグメンテーションを実装する方法は?
Tensorflow:Pascal VOCスタイルの画像を作成する方法
PascalVOCを(N、N、1)に処理する1つの例を見つけました。
LFW_PARTS_PALETTE = {
(0, 0, 255) : 0 , # background (blue)
(255, 0, 0) : 1 , # hair (red)
(0, 0, 255) : 2 , # face (green)
}
def convert_from_color_segmentation(arr_3d):
arr_2d = np.zeros((arr_3d.shape[0], arr_3d.shape[1]), dtype=np.uint8)
palette = LFW_PARTS_PALETTE
for i in range(0, arr_3d.shape[0]):
for j in range(0, arr_3d.shape[1]):
key = (arr_3d[i, j, 0], arr_3d[i, j, 1], arr_3d[i, j, 2])
arr_2d[i, j] = palette.get(key, 0) # default value if key was not found is 0
return arr_2d
これは私が望んでいるものに近いかもしれませんが、見つけられないかもしれません。クラスが3つあるので、(N、N、3)にする必要があると思いますか?上記のバージョンと、これら2つの場所から発信された別のバージョンがあります。
https://github.com/martinkersner/train-CRF-RNN/blob/master/utils.py#L5
https://github.com/DrSleep/tensorflow-deeplab-resnet/blob/ce75c97fc1337a676e32214ba74865e55adc362c/deeplab_resnet/utils.py#L41 (このリンクはワンホット値です)
これはセマンティックセグメンテーションであるため、画像内の各ピクセルを分類しているため、クロスエントロピー損失を使用している可能性があります。 KerasとTensorFlowでは、マスクが1つのホットエンコードされている必要があります。また、マスクの出力サイズは[batch、height、width、num_classes] <-のようにする必要があります。これは、同じ方法で再形成する必要があります。クロスエントロピーマスクを計算する前にマスクします。これは、基本的に、ロジットとマスクをテンソル形状[-1、num_classes]に再形成する必要があることを意味します。ここで、-1は「必要な数」を示します。
あなたの質問はあなた自身の画像をロードすることについてなので、私はセグメンテーションのための入力パイプラインを自分で構築し終えたところですが、それはTensorFlowにあります、それでそれがあなたに役立つかどうかわかりません、興味があれば見てください: セグメンテーション用のTensorflow入力パイプライン
Kerasでは、ラベルをワンホットエンコードする必要があります。したがって、入力は(N x N x n_classes)次元である必要があります。