【发布时间】:2017-12-24 00:20:24
【问题描述】:
我正在使用 Tensorflow 作为 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] 背景
我在网上找到的所有内容都使用 tensorflow 或 keras 中的现有数据集。如果您拥有可被视为自定义数据集的数据,那么如何实现这一目标并不清楚。
我发现这与 Caffe 相关:https://groups.google.com/forum/#!topic/caffe-users/9qNggEa8EaQ
他们主张将遮罩图像转换为 (H, W, 1) (HWC)?我的类将分别为 0, 1 ,2 用于背景、头发和面部。
这可能是这里的重复(类似问题/答案的组合):
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 节课?上面的版本,还有一个来自这两个位置:
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(这个链接one-hot是值)
【问题讨论】:
标签: tensorflow keras image-segmentation