语义分割-bisenetv2模型训练 an illegal memory access was encountered问题解决

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

语义分割动手实践 - 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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值