标签图像应该如何进行语义分割?

How should be a labelled image for semantic segmentation?

正如我从下面的解释中了解到的,将有两种类型的图像用于语义分割,即输入和掩码。蒙版图像是包含 'label' 像素值的图像,它可以是某个整数(ROAD 为 0,TREE 为 1,ROAD 为 (100,100,100)(TREE 为 0,255,0).

Semantic segmentation describes the process of associating each pixel of an image with a class label, (such as flower, person, road, sky, ocean, or car). https://se.mathworks.com/help/vision/ug/semantic-segmentation-basics.html

根据我的研究,有很多类型的标签图像用于语义分割。除了不同的扩展名(.png .jpg .gif .bmp...),其中一些是 RGB 标记(3 通道) 图像,一些是 GRAY (1 通道) 图像。下面,有两个例子可以更好地说明这种情况。

  1. 标有扩展名“.png”的 RGB

    https://github.com/divamgupta/image-segmentation-keras#user-content-preparing-the-data-for-training

  2. 标有扩展名“.gif”的灰阶

    https://www.kaggle.com/kmader/vgg16-u-net-on-carvana/#data

如果我的图像被标记为灰度,我基本上通过复制 3 个 RGB 通道的这个灰色通道的每个值来使其成为 RGB。恰恰相反,通过对 RGB 通道进行平均,我可以将标记图像设为灰度。有什么不同?哪个更适合哪个任务(二进制分割或其他)?

就我而言,我有 4 类 并尝试进行多类语义分割。 I've already labelled about 600 images on DataTurks。这意味着,我只有对象的多边形,而且我必须自己制作带标签的图像。目前,我的输入图像和蒙版图像的扩展名分别是“.jpg”和“.png”。我应该如何标记我的图像以及哪个扩展名?

您可以将蒙版保存为灰度 png 图像,其值是 0、1、2、3 之一(因为您有 4 个 classes)在对应于 class 的每个位置输入图像中像素值的(树、灌木等)。

您可以通过执行此操作来验证是否正确生成了掩码图像。

import cv2
import numpy as np
lbl_img = '<path_to_mask_image>'
mask = cv2.imread(lbl_img, 0)
print(np.unique(mask))

[0 1 2 3] # this will vary based on number of classes present in mask image