基于语义分割Ground Truth(GT)转换yolov5图像分割标签(路面积水检测例子)

基于语义分割Ground Truth(GT)转换yolov5图像分割标签(路面积水检测例子)

概述

随着开发者在issues中对 用yolov5做分割任务的呼声高涨,yolov5团队真的在帮开发者解决问题,v6.0版本之后推出了最新的解决方案并配指导教程。

image-20230128172549462

之前就有使用改进yolo添加分割头的方式实现目标检测和分割的方法,最新的v7.0版本有了很好的效果,yolov8在分割方面也是重拳出击

image-20230128172654729

img

因此使用yolo进行完成目标检测也是落地项目的一个选择,而且yolo的生态更适合落地,并且实现试试检测。但是目前的公开数据集大部分使用的是其他分割领域模型,当然标签也是适配其他模型。我在做极市平台的比赛时想到了这一点,路面积水感觉用目标检测更省力,但是他却给了分割数据,

img

img

我尝试转换GT图像标签到yolo的格式,查了好久也没有找到好的解决办法,因此根据之前的转目标检测经验,我尝试修改。

流程

由于没有对应分割区域的json格式或者其他格式的标签,因此需要根据GT找到对应坐标,可以理解为Polygon标签格式,每个拐点除标记,常规使用lableimg标注的来,所以需要通过轮廓检测获取大致的坐标点,在转换为yolo需要的格式

1、查找分割区域,
2、获取分割区域的轮廓坐标
3、精简坐标点
4、转存txt

上面的所有操作都基于OpenCV进行

读取并处理

转换为单通道灰度图并对二值化图像进行处理,让图像自动转换阈值,

cv2.threshold (src, thresh, maxval, type)

src:源图片,必须是单通道
thresh:阈值,取值范围0~255
maxval:填充色,取值范围0~255
type:阈值类型,具体见下表

阈值类型:

阈值参数类型小于阈值的像素点大于阈值的像素点
0cv2.THRESH_BINARY置0置填充色
1cv2.THRESH_BINARY_INV置填充色置0
2cv2.THRESH_TRUNC保持原色置灰色
3cv2.THRESH_TOZERO置0保持原色
4cv2.THRESH_TOZERO_INV保持原色置0

image-20230129101726731

这里我使用了自动阈值调整,因此只需要给定范围0-255即可。

gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,bin_img = cv2.threshold(gray_img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

查询轮廓并获取坐标点

单通道图会送到边缘检测算法中进行轮廓点的查询,因为GT标签的标注是很精细的,所有边缘点会很多,在检测过程中需要使用一个点估计量较少的方法,或者是筛选方法

cv2.findContours(image, mode, method[, offset])

method:轮廓近似方法有以下几种方法

cv2.CHAIN_APPROX_NONE:存储所有的轮廓点
cv2.CHAIN_APPROX_SIMPLE:压缩水平,垂直和对角线段,只留下端点。 例如矩形轮廓可以用4个点编码。
cv2.CHAIN_APPROX_TC89_L1,cv2.CHAIN_APPROX_TC89_KCOS:使用Teh-Chini chain近似算法

经过测试cv2.CHAIN_APPROX_TC89_KCOS方法比较符合我们的需求,下面是几种方法的对比图:

原图

image-20230129102601475

cv2.CHAIN_APPROX_NONE

image-20230129103241865

cv2.CHAIN_APPROX_SIMPLE

image-20230129103345849

cv2.CHAIN_APPROX_TC89_L1

image-20230129103557153

cv2.CHAIN_APPROX_TC89_KCOS

image-20230129103640467

yolo的标签格式是转折或者较长的边缘添加标注点,因此不需要太多相邻点,给出大概的轮廓即可,对比上面最合适的是cv2.CHAIN_APPROX_TC89_KCOS近似方法,

但是从最后的结果图看,依然存在一些不需要的点,因此我们选择一个简单原则,相邻的点在x或者y上如果变化超过一个阈值才保留,否则不标注和不作为分割点。阈值不固定,我设置为30的效果如下

image-20230129102920513

上面部分的代码

cnt,hit = cv2.findContours(bin_img,cv2.RETR_TREE,cv2.CHAIN_APPROX_TC89_KCOS)
cv2.drawContours(img1,cnt,-1,(0,255,0),5)
cnt = list(cnt)
for j in cnt:
    result = []
    pre = j[0]
    for i in j:
        if abs(i[0][0] - pre[0][0]) > 30 or abs(i[0][1] - pre[0][1]) > 30:
            pre = i
            temp = list(i[0])
            #根据yolo的归一化方式,x,y分别除以原图的宽和高
            temp[0] /= W
            temp[1] /= H
            result.append(temp)
            cv2.circle(img1,i[0],1,(0,0,255),2)

计算并转存txt

按每个类别的坐标存入,有的坐标会很多,所以要一个数组写一次。先写入的“0”是当前的类别,如果多分类的需要单独处理

f.write("0 ")
for line in result:
    line = str(line)[1:-2].replace(",","")
    # print(line)
    f.write(line+" ")
f.write("\n")

效果演示:https://live.youkuaiyun.com/v/271857

完整代码:https://github.com/magau123/优快云/blob/master/GT2yolo-seg.py

### 关于 COCO 数据集中的语义分割 Ground Truth 文件 COCO (Common Objects in Context) 是一个大规模的目标检测、分割和图像描述数据集[^2]。它提供了丰富的标注信息,其中包括用于语义分割的任务所需的 ground truth 标签。 #### 地址与下载方式 要获取 COCO 数据集中有关语义分割ground truth 文件,可以访问官方提供的链接或镜像站点。通常情况下,这些文件位于 `annotations` 子目录下。对于语义分割任务而言,ground truth 的标注文件是以 JSON 格式存储的,并且可以通过以下地址下载: - 训练集标注文件路径:`stuff_train2017.json` - 验证集标注文件路径:`stuff_val2017.png` 上述文件可以从 COCO 官方网站或者其指定的镜像资源中找到并下载[^5]。 #### 文件结构解析 当加载如下代码片段时: ```python coco = COCO("/home/xxxx/Downloads/coco2017/annotations/stuff_train2017.json") ``` 此操作实际上是通过 Python API 加载了一个名为 `stuff_train2017.json` 的 JSON 文件,其中包含了训练集中每张图片对应的类别以及像素级掩码的信息。具体来说,JSON 文件记录了每个实例及其所属类别的 ID 和边界框坐标等元数据[^1]。 另外,在某些版本的数据集中还可能提供 PNG 图片形式的 mask 结果作为补充材料;这类二值化后的掩膜可以直接用来表示哪些区域属于特定物体种类的一部分[^4]。 #### 数据格式说明 针对语义分割部分,COCO 使用了一种特殊的编码方案来压缩mask信息以便节省空间同时保持精度。这种编码方法由 pycocotools 库实现,详情可参阅相应文档页面: - **RLE(Run-Length Encoding)**: 对连续相同数值序列采用长度计数方式进行简化表达. 例如给定这样一个简单例子 `[1,1,0,0,1,1]`,经过 RLE 处理后变为 `{size=6,"counts":"LL00LL"}`. 因此当我们读取到某个目标对象的相关字段比如 'segmentation' 时候如果发现它是字典而非列表则意味着这里采用了前述提到过的紧凑型表述法需要借助专门工具解码还原成原始形态再进一步分析利用[^3]. #### 总结 综上所述,为了完成基于 COCO 数据集上的语义分隔项目开发工作流程一般会经历以下几个环节: - 下载包含有 stuff annotations 的压缩包; - 解压之后定位至对应子目录下的 json 或 png 类型档案; - 借助第三方库如 PyTorch torchvision 或者自定义脚本解析相关内容供后续建模调优阶段使用; 希望以上介绍能够帮助您更好地理解和应用 COCO 数据集内的语义分割相关资料!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值