Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2|回复: 0

洞察Python脚本查找Yolo数据集中分隔标注标签并转化为Box框标注

[复制链接]

37万

主题

0

回帖

111万

积分

超级版主

Rank: 8Rank: 8

积分
1112587
发表于 3 天前 | 显示全部楼层 |阅读模式
使用场景
需要训练的Box标注数据集中包含了部分分隔标注的数据,需要将分隔标注的数据转化为Box标注

教程内容
1了解Box标注和分隔标注

2查找yolo的box标注数据集中存在的分隔标注标签

3将分隔标注转化为Box标注

1了解Box标注和分隔标注
Box标注:
也就是方框矩形的标注形式,格式为如下

索引左上角点x坐标左上角点y坐标宽度高度
比如下方这个Box标注标签内容,可以看到内容为固定的5个内容,也就是对应着上边我说的格式



Box标注的图为如下,可以看到是方框形式的标注



分隔标注:
也就是多边形的标注形式,格式为如下

索引点位1x坐标点位1y坐标点位2x坐标点位2y坐标
比如下方这个分隔标注标签内容,可以看到除了索引有8个元素,也就是有4个点位,当然,分隔标注对点位数量没有限制,毕竟是多边形



分隔标注的图为如下,如图可以看到为多边形



2查找yolo的box标注数据集中存在的分隔标注标签
为了演示,我这里将我的数据集中的某一条Box标注改为了分隔标注格式,如图



先附上查找分隔标注的脚本

importos

defcheck_labels_for_segmentation(labels_dir):
"""
检查标签目录中的每个标签文件是否包含分割标注格式。

Args:
labels_dir(str):标签文件所在的目录路径。

Returns:
list:包含分割标注格式的文件路径。
"""
segmentation_files=#用于存储包含分割标注的文件

forfilenameinoslistdir(labels_dir):
#构建完整的标签文件路径
filepath=ospathjoin(labels_dir,filename)
ifnotfilepathendswith('txt'):
continue#跳过非文本文件

withopen(filepath,'r')asf:
lines=freadlines()

forlineinlines:
parts=linestrip()split()#分割每一行
iflen(parts)5:#分割标注通常会有多边形点集,字段数大于5
#检查是否含有多边形点集
try:
floats=[float(x)forxinparts[5:]]#从第6个字段开始应为多边形点坐标
iflen(floats)%2==0:#检查点集是否为偶数对(x,y)
segmentation_files脚本end(filepath)
break#当前文件已经确定为分割标注格式,需再检查其余行
exceptValueError:
pass#如果法转换为浮点数,跳过该行

returnsegmentation_files


#使用示例
if__name__=="__main__":
labels_directory=r"D:\A01PythonProjects3123\labelImg-master\标签文件批量处理\slopev1iyolov8\train\labels"#替换为你的labels文件夹路径
segmentation_files=check_labels_for_segmentation(labels_directory)

ifsegmentation_files:
print("以下文件包含分割标注格式:")
forfileinsegmentation_files:
print(file)
else:
print("未找到包含分割标注格式的文件。")
在脚本中,我传入了需要检测分隔标注标签的所在目录,也就是数据集的labels目录,执行后结果如下



3将分隔标注转化为Box标注
如果我们的数据集中只有一条因为失误将box标注做成了分隔标注,手动改还好,要是多了可就不好改了,因此下面我提供批量将分隔标注转化为Box标注的脚本。

importos

defconvert_segmentation_to_box(labels_dir):
"""
将分割标注文件转换为框标注文件,并覆盖原文件。

Args:
labels_dir(str):分割标注文件的目录路径。

Returns:
None
"""
forfilenameinoslistdir(labels_dir):
input_path=ospathjoin(labels_dir,filename)

ifnotfilenameendswith('txt'):
continue#跳过非文本文件

withopen(input_path,'r')asinfile:
lines=infilereadlines()

withopen(input_path,'w')asoutfile:
forlineinlines:
parts=linestrip()split()
iflen(parts)<=5:
#如果不是分割标注格式,则直接写入原内容
outfilewrite(line)
continue

class_id=parts[0]
polygon_points=list(map(float,parts[5:]))
x_coords=polygon_points[::2]#偶数索引为x坐标
y_coords=polygon_points[1::2]#奇数索引为y坐标

#计算外接矩形
x_min,x_max=min(x_coords),max(x_coords)
y_min,y_max=min(y_coords),max(y_coords)
x_center=(x_min+x_max)2
y_center=(y_min+y_max)2
width=x_max-x_min
height=y_max-y_min

#转换为框标注格式
box_annotation=f"{class_id}{x_center:6f}{y_center:6f}{width:6f}{height:6f}\n"
outfilewrite(box_annotation)

print(f"转换完成,原标签文件已更新。")

#使用示例
if__name__=="__main__":
labels_directory=r"D:\A01PythonProjects3123\labelImg-master\标签文件批量处理\slopev1iyolov8\train\labels"#替换为你的分割标注目录路径
convert_segmentation_to_box(labels_directory)
在这个脚本中,我们还是传入了labels目录,将labels目录中的分隔标注全部转化为box标注,执行脚本,看看前后结果,如图可以看多边形的分隔标注转化为了外界的矩形标注形式



结语
以上是幽络源的利用Python脚本检测分隔标注并转化为Box标注的教程,感兴趣的小伙伴可加群交流

?

?



现在,大家对源码网都比较关注,希望能从中获得更多的收益。提供经过严格测试的免费源码、各种线上兼职和网络兼职的网创教程、编程及网络相关的技术教程分享,助您轻松获取资源和技术支持。https://www.youluoyuan.com/

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|足球新闻网

GMT+8, 2025-4-25 08:50 , Processed in 0.054383 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表