语义分割动手实践 - bisenetv2、deeplabv3+语义分割模型训练
接上文https://blog.youkuaiyun.com/Hu_helloworld/article/details/118610897?spm=1001.2014.3001.5501
我们已经可以通过labelme工具标注语义分割数据,然后根据labelme提供的labelme_json_to_dataset脚本,将所有json文件批量生成如下的训练数据:

然后我们通过方法
1、moveSrcMasksImage()分别将原图(img.png)和掩膜图像(label.png)移动整理到JPEGImages和SegmentationClass文件夹。
2、通过couple_img_masks()方法制作、划分数据集。
deeplabv3+训练
这样划分出的数据集是一个原图img.png对应一个根据类别颜色分割的掩膜图像label.png。
采用VOC格式的数据集,img.png 和 label.png分别放入JPEGImages和SegmentationClass文件夹中,划分数据集将文件名写入train.txt和val.txt。训练时可选择resnet、mobilenet等多个backbone
用这样的数据集训练deeplab系列模型没问题。具体使用参见官方repo:https://github.com/jfzhang95/pytorch-deeplab-xception
bisenetv2训练
但这些数据在bisenetv2训练时出现“RuntimeError: copy_if failed to synchronize: cudaErrorIllegalAddress: an illegal memory access was encountered”的报错,原因是bisenetv2要求输入的标签是单通道的灰度图。而我们的mask图像仍然是RGB图
我们知道RGB图像可以用颜色区分类别,而灰度图每个像素只有0-255的灰度值,如何用单通道的灰度图表示多种类别呢?
解决思路巧妙的将每个类别的rgb颜色值用单通道的0,1…255灰度值置换。
其中我们用labelme脚本labelme_json_to_dataset生成的__json文件夹中:
- img.png 对应的局部的jpg原图文件,训练时要用
- label.png 局部语义类别标签
- label_names.txt 在这张图像上目标的分类名称
- label_viz.png 可视化标签图,便于我们确认是否标记正确
我们得到RGB的label.png(局部语义类别标签)后,还需要进行灰度类别转换成单通道的标签图像:
灰度类别转换后,属于背景区域的像素点的值全是0,属于标记目标的像素点按照所有类别名的顺序1,2…255排列。如属于cat的像素点值全是1。若再加一个dog像素点值就全是2
灰度类别转换 (局部类别标签RGB—>全局类别标签GRAY)
'''
TODO:
提取__json目录下的原图、并将label.png转换为最终的单通道标签。
param:
__jsondir: labelme生成的__json文件夹目录
class_txt: 所有像素的类别(包括背景0)
image_path: 提取的原图路径
label_path: 提取并转换的单通道全局标签路径
输出转换的标签数量、原图和标签的路径
Note:
__json文件夹已全部生成,并将img.png,label.png提取整理到不同路径
'''
def label2singlechannel(__jsondir, class_txt='class_name.txt', image_path=None, label_path=None):
class_txt = open(class_txt, "r", encoding='utf-8')
class_names

本文介绍如何使用labelme工具标注语义分割数据,并将其转换为适用于deeplabv3+和bisenetv2模型训练的格式。针对bisenetv2要求的单通道灰度标签图,提供了一种将RGB标签图转换的方法。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



