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

本文主要是介绍基于语义分割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 = itemp = list(i[0])#根据yolo的归一化方式,x,y分别除以原图的宽和高temp[0] /= Wtemp[1] /= Hresult.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.csdn.net/v/271857

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

这篇关于基于语义分割Ground Truth(GT)转换yolov5图像分割标签(路面积水检测例子)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/311106

相关文章

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

Java实现XML与JSON的互相转换详解

《Java实现XML与JSON的互相转换详解》这篇文章主要为大家详细介绍了如何使用Java实现XML与JSON的互相转换,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. XML转jsON1.1 代码目的1.2 代码实现2. JSON转XML3. JSON转XML并输出成指定的

Java实现将Markdown转换为纯文本

《Java实现将Markdown转换为纯文本》这篇文章主要为大家详细介绍了两种在Java中实现Markdown转纯文本的主流方法,文中的示例代码讲解详细,大家可以根据需求选择适合的方案... 目录方法一:使用正则表达式(轻量级方案)方法二:使用 Flexmark-Java 库(专业方案)1. 添加依赖(Ma