我使用Tensorflow作爲Keras的後端,我正試圖瞭解如何爲我的圖像分割培訓帶來標籤。如何在Keras中加載用於圖像分割的圖像遮罩(標籤)
我使用LFW Parts Dataset同時具有地面實況圖像和地面實況面具,看起來像這樣* 1500個的訓練圖像:
據我瞭解的過程中,在訓練期間,我加載兩者
- (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