web-dev-qa-db-ja.com

Kerasで画像セグメンテーション用の画像マスク(ラベル)をロードする方法

私はTensorflowをKerasのバックエンドとして使用しており、画像セグメンテーショントレーニング用にラベルを取り込む方法を理解しようとしています。

私は LFWパーツデータセット を使用しています。これには、グラウンドトゥルース画像と次のようなグラウンドトゥルースマスクの両方があります* 1500トレーニング画像:

Aaron_Peirsol_0002_ImageAaron_Peirsol_0002_Mask

プロセスを理解しているので、トレーニング中に両方をロードします

  • (X)画像
  • (Y)マスク画像

私のニーズを満たすためにこれをバッチで行う。今私の質問は、それらの両方(画像とマスク画像)をNumPy配列(N、N、3)としてロードするだけで十分ですか、それとも何らかの方法でマスク画像を処理/再形成する必要がありますか?事実上、マスク/ラベルは[R、G、B]ピクセルとして表されます。ここで:

  • [255、0、0]髪
  • [0、255、0]顔
  • [0、0、255]背景

私はそれを0-1に正規化するためにこのようなことをすることができました、しかし私は私がすべきかどうかわかりません:

im = Image.open(path)
label = np.array(im, dtype=np.uint8)
label = np.multiply(label, 1.0/255)

だから私は最終的に:

  • [1、0、0]髪
  • [0、1、0]顔
  • [0、0、1]背景

オンラインで見つけたものはすべて、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 (このリンクはワンホット値です)

7
Adam Venturella

これはセマンティックセグメンテーションであるため、画像内の各ピクセルを分類しているため、クロスエントロピー損失を使用している可能性があります。 KerasとTensorFlowでは、マスクが1つのホットエンコードされている必要があります。また、マスクの出力サイズは[batch、height、width、num_classes] <-のようにする必要があります。これは、同じ方法で再形成する必要があります。クロスエントロピーマスクを計算する前にマスクします。これは、基本的に、ロジットとマスクをテンソル形状[-1、num_classes]に再形成する必要があることを意味します。ここで、-1は「必要な数」を示します。

最後にここを見てください

あなたの質問はあなた自身の画像をロードすることについてなので、私はセグメンテーションのための入力パイプラインを自分で構築し終えたところですが、それはTensorFlowにあります、それでそれがあなたに役立つかどうかわかりません、興味があれば見てください: セグメンテーション用のTensorflow入力パイプライン

5
Hasnain Raza

Kerasでは、ラベルをワンホットエンコードする必要があります。したがって、入力は(N x N x n_classes)次元である必要があります。

0
shubhamgoel27