2017-07-18 107 views
3

我使用Tensorflow作爲Keras的後端,我正試圖瞭解如何爲我的圖像分割培訓帶來標籤。如何在Keras中加載用於圖像分割的圖像遮罩(標籤)

我使用LFW Parts Dataset同時具有地面實況圖像和地面實況面具,看起來像這樣* 1500個的訓練圖像:

Aaron_Peirsol_0002_Image Aaron_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]我在網上找到的背景

一切利用現有的數據集,張量流或keras。如果你有什麼可以被認爲是一個自定義數據集,沒有什麼是真正清楚如何解決問題的。

我發現這涉及到來自Caffe:https://groups.google.com/forum/#!topic/caffe-users/9qNggEa8EaQ

他們倡導的掩模圖像轉換爲(H, W, 1)(HWC)在我的班會0, 1 ,2爲背景,分別頭髮和臉部?

這可能是因爲這是一個重複這裏(類似於quesiton /答案的組合):

How to implement multi-class semantic segmentation?

Tensorflow: How to create a Pascal VOC style image

我發現處理PascalVOC成(N,N,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 

我認爲這可能接近我想要的,但沒有發現。我想我需要它(N,N,3),因爲我有3個班級?上述版本並且存在另一個源自這些2個位置:

https://github.com/martinkersner/train-CRF-RNN/blob/master/utils.py#L50

https://github.com/DrSleep/tensorflow-deeplab-resnet/blob/ce75c97fc1337a676e32214ba74865e55adc362c/deeplab_resnet/utils.py#L41(此鏈接獨熱的值)

回答

0

由於這是語義分割,因此您正在對圖像中的每個像素進行分類,因此您將最有可能使用交叉熵丟失。 Kera,以及TensorFlow要求你的面具是一個熱門編碼,而且你的面具的輸出尺寸應該是類似[批量,高度,寬度,num_classes] < - 你必須以同樣的方式重塑形狀你的掩碼在計算你的交叉熵掩碼之前,這基本上意味着你將不得不重塑你的logits和掩碼到張量形狀[-1,num_classes],其中-1表示'儘可能多'。

Have a look here at the end

由於您的問題是關於裝入自己的形象,我剛剛完成建設的分割輸入管道自己,它是在TensorFlow了,所以我不知道,如果它可以幫助你,看看如果您有興趣: Tensorflow input pipeline for segmentation

0

Keras要求標籤是獨熱編碼。所以你的輸入必須是(N x N x n_classes)維度。