【问题标题】:How to load Image Masks (Labels) for Image Segmentation in Keras如何在 Keras 中为图像分割加载图像掩码(标签)
【发布时间】: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


    【解决方案1】:

    我遇到了同样的问题,我想出了一个纯 Tensorflow 解决方案,它将 RGB 值从加载的蒙版图像 (128,128,3) 张量转换为 128x128 RGB 图像到 (128,128) 张量,其中张量编码区间 [0...number_of_classes].. 请看我的博文:https://www.spacefish.biz/2020/11/rgb-segmentation-masks-to-classes-in-tensorflow/

    您也可以通过省略最后一个“tf.argmax”步骤来获得一个热编码的张量,例如 (128,128,number_of_classes)。

    【讨论】:

      【解决方案2】:

      由于这是语义分割,您正在对图像中的每个像素进行分类,因此您很可能会使用交叉熵损失。 Keras 以及 TensorFlow 要求您的掩码是一种热编码,而且您的掩码的输出尺寸应该类似于 [batch, height, width, num_classes]

      Have a look here at the end

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

      【讨论】:

        【解决方案3】:

        Keras 要求标签是 one-hot 编码的。所以你的输入必须是 (N x N x n_classes) 维度。

        【讨论】:

          猜你喜欢
          • 2019-06-28
          • 2021-01-04
          • 2020-01-25
          • 2022-01-21
          • 2019-03-23
          • 2018-05-12
          • 2020-07-30
          • 2021-03-08
          • 2018-05-18
          相关资源
          最近更新 更多