如何为多类语义分割预处理 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 分割掩码?的主要内容,如果未能解决你的问题,请参考以下文章