如何在Keras中加载用于图像分割的图像蒙版(标签)

Ada*_*lla 6 image-segmentation keras tensorflow

我使用Tensorflow作为Keras的后端,我正在尝试了解如何引入我的标签进行图像分割训练.

我正在使用LFW零件数据集,它具有地面实况图像和地面实况掩模,看起来像这样的*1500训练图像:

Aaron_Peirsol_0002_Image Aaron_Peirsol_0002_Mask

据我了解这个过程,在训练期间,我加载了两个

  • (X)图像
  • (Y)面具图像

分批执行此操作以满足我的需求.现在我的问题是,将它们(图像和蒙版图像)加载为NumPy数组(N,N,3)是否足够,或者我是否需要以某种方式处理/重塑Mask图像.实际上,掩码/标签表示为[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)
Run Code Online (Sandbox Code Playgroud)

所以我最终得到:

  • [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用于Background,Hair和Face.

这可能是重复的(类似问题/答案的组合):

如何实现多类语义分割?

Tensorflow:如何创建Pascal VOC样式图像

我找到了一个将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
Run Code Online (Sandbox Code Playgroud)

我认为这可能接近我想要的但没有发现.我想我需要它(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 (这个链接是一个热门的值)

Has*_*aza 9

由于这是语义分割,您正在对图像中的每个像素进行分类,因此您很可能会使用交叉熵损失。Keras 和 TensorFlow 要求您的掩码是一种热编码,而且掩码的输出维度应该类似于 [batch, height, width, num_classes] <- 您必须以与您的相同的方式重塑在计算交叉熵掩码之前使用掩码,这实质上意味着您必须将 logits 和掩码重塑为张量形状 [-1, num_classes],其中 -1 表示“尽可能多”。

最后看看这里

由于您的问题是关于加载您自己的图像,我刚刚完成了自己构建用于分割的输入管道,不过它在 TensorFlow 中,所以我不知道它是否对您有帮助,如果您有兴趣,请查看: Tensorflow input pipeline for分割