如何为多类语义分割预处理 RGB 分割掩码?

Posted

技术标签:

【中文标题】如何为多类语义分割预处理 RGB 分割掩码?【英文标题】:How to pre-process RGB segmentation mask for multi-class semantic segmentation? 【发布时间】:2021-04-15 13:03:36 【问题描述】:

我正在研究一个多类语义分割数据集,该数据集具有原始图像的 RGB 地面实况分割掩码。数据集有 24 个类。下表显示了这些类及其各自的 RGB 值:

name r g b
unlabeled 0 0 0
paved-area 128 64 128
dirt 130 76 0
grass 0 102 0
gravel 112 103 87
water 28 42 168
rocks 48 41 30
pool 0 50 89
vegetation 107 142 35
roof 70 70 70
wall 102 102 156
window 254 228 12
door 254 148 12
fence 190 153 153
fence-pole 153 153 153
person 255 22 96
dog 102 51 0
car 9 143 150
bicycle 119 11 32
tree 51 51 0
bald-tree 190 250 190
ar-marker 112 150 146
obstacle 2 135 115
conflicting 255 0 0

示例 RGB 地面实况分割掩码图像:

数据集中有 400 张图片,每张图片的形状为 (4000 px X 6000 px)。数据集的目录结构如下图所示:

dataset_folder
├── original_images
│   ├── 000.png
│   ├── 001.png
│   ├── ...
|   ├── 399.png
|   └── 400.png
└── masks
    ├── 000.png
    ├── 001.png
    ├── ...
    ├── 399.png
    └── 400.png

我想从 RGB 掩码创建语义分割掩码,方法是将整数值分配给 0-23 范围内的像素(其中每个整数代表一个类)并将它们保存到工作目录。有人可以为这项任务推荐一个有效的代码吗?

【问题讨论】:

嗨,我尝试使用我在这里找到的代码:[bulentsiyah.com/… 也许它对你有用。 【参考方案1】:

我遇到了类似的问题。 我的解决方案可能不是最有效的,但由于没有其他答案,我还是分享一下:

首先从图像中获取一个数组,例如用openCV打开它..

例如,让我们用三个通道制作一个 4*3 px 的“图像”:

img=np.array([[
    [128, 64,128],
    [  0,  0,  0],
    [  0,  0,  0],
    [  0,  0,  0]],
   [[128, 64,128],
    [  0,102,  0],
    [  0,  0,  0],
    [  0,  0,  0]],
   [[130, 76,  0],
    [130, 76,  0],
    [130, 76,  0],
    [130, 76,  0]]])

制作一个与掩码的所需值相关联的 RGB 值的字典(作为示例,我手动将其写下来,但如果您有如上所示的表格,则可以使用 pandas 来完成),然后列出图像中遇到的值,最后用对应的分类值创建掩码。

unlabeled = str([0, 0, 0])
paved_area = str([128,  64, 128])
dirt = str([130,  76,   0])
grass = str([  0, 102,   0])

labels = unlabeled:0, paved_area:1, dirt:2, grass:3

print(labels)
>>> '[0, 0, 0]': 0, '[128, 64, 128]': 1, '[130, 76, 0]': 2, '[0, 102, 0]': 3

width = img.shape[1]
height = img.shape[0]

values = [str(list(img[i,j])) for i in range(height) for j in range(width)]
print(values)
>>> ['[128, 64, 128]', '[0, 0, 0]', ..., '[130, 76, 0]']
print(len(values))
>>> 12      # width*height 

mask=list([0]*width*height)
for i, value in enumerate(values):
    mask[i]=labels[value]

mask = np.asarray(mask).reshape(height,width)

print(mask)
>>> array([[1, 0, 0, 0],
           [1, 3, 0, 0],
           [2, 2, 2, 2]])

【讨论】:

以上是关于如何为多类语义分割预处理 RGB 分割掩码?的主要内容,如果未能解决你的问题,请参考以下文章

keras/tensorflow中语义图像分割的多类加权损失

如何实现多类语义分割?

多类语义分割模型评估

多类语义分割 - 输出激活?

如何使用tensorflow实现多类语义分割

为啥训练多类语义分割的unet模型中的分类交叉熵损失函数非常高?