Yolov5 多边形标签转换,所有json文件自动转成txt格式[详细过程]

本文详细介绍了如何将使用Labelme工具进行图像标注后得到的json文件转换为Yolov5训练所需的txt格式。重点在于处理多边形标签,将其转换为矩形,并进行坐标规范化。通过Python代码实现json到txt的转换,包括遍历多边形点,获取边界框,以及数字标准化。提供的完整代码包含了从json文件读取、转换和写入txt文件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

问题引入

Labelme简要介绍

多边形标签的处理方法

 转换后的txt格式如下:

代码实现

多边形标签代码实现方法

json转化为txt的部分代码如下:

 数字规范化的代码如下:

 最后附上我的完整代码


问题引入

网上的json转化为txt的教程都比较简要,查找了很多资料之后,再自己一个一个的运行代码最后才终于知道其原理。

Labelme简要介绍

通过labelme对图进行标注后,得到的是json文件,而Yolov5对数据进行模型构建的时候,读取需要的是txt格式的文件。所以需要先通过Python进行文件格式的转换

注:labelme是麻省理工(MIT)的计算机科学和人工智能实验室(CSAIL)研发的图像标注工具,人们可以使用该工具创建定制化标注任务或执行图像标注,项目源代码已经开源。

Labelme程序运行,通过标注后如图所示:

 图1 Labelme标注

 此图片可以得到以下格式的json文件:

 文件中的字段如下:

‘version’——版本号

‘shapes’——里面装的是Yolov5需要的数据

        ‘label’——你在labelme里面设置的类

        ‘points’——点的坐标

 我这里的label如图1所示共有5类,等下进行json转化为txt的时候用

 对应这些类创一个字典以便json进行转换

例:name2id={'bike':0,'arrow':1,'crossline':2,'building':3,'car':4,'person':5}

 可能某一张图片中可能不存在上述的某个类,所以这里请以某个json中最多的类创建这个字典。

多边形标签的处理方法

由于yolov5 仅支持矩形图形的识别,所以需要通过数据处理,将多边形变换为矩形。

处理原理:遍历该标签所有的坐标,获取最大x_max,y_max,最小x_min,y_min的x和y的坐标。

然后再进行数据的规范化。

 转换后的txt格式如下:

第一个是类,比如第一行中的第一个数字是4,我的name2id中car也为4,即这里指代的就是'car'这个标签。

第一行 第二个 和 第三个数字 为数字为图片中心点(x,y)的坐标

第四个数字和第五个数字对应的是 这个标签的 宽和高。 

代码实现

多边形标签代码实现方法

                x_max=0
                y_max=0
                x_min=float("inf")
                y_min=float("inf")
                for lk in range(len(i['points'])):
                    x1=float(i['points'][lk][0])
                    y1=float(i['po
### YOLOv5 中实现多边形标注的方法 YOLOv5 主要用于矩形框的目标检测,对于多边形标注的支持并不直接内置。为了在 YOLOv5 中实现多边形标注,可以考虑集成第三方工具或扩展框架功能。 #### 方法一:使用支持多边形标注的标注工具并转换标签格式 一些先进的标注工具有能力创建复杂的几何形状,如 LabelMe 或者 X-Anylabeling 自动标注软件[^1]。这些工具允许用户绘制任意多边形来标记对象边界。完成标注后,通过编写脚本将生成的 XML 文件或其他格式文件中的坐标信息提取出来,并化为适合 YOLO 的 txt 格式的 bounding box 形式保存。不过需要注意的是,在这种情况下,实际训练过程中仍然会按照矩形框处理物体位置关系。 ```python import xml.etree.ElementTree as ET def convert_labelme_to_yolo(xml_file, output_txt): tree = ET.parse(xml_file) root = tree.getroot() with open(output_txt, 'w') as f: for obj in root.findall('object'): label = obj.find('name').text polygon_points = [] for pt in obj.find('polygon').findall('pt'): x = float(pt.find('x').text) y = float(pt.find('y').text) polygon_points.append((x,y)) # 计算包围盒 (xmin ymin xmax ymax) xmin = min([p[0] for p in polygon_points]) ymin = min([p[1] for p in polygon_points]) xmax = max([p[0] for p in polygon_points]) ymax = max([p[1] for p in polygon_points]) line = f"{label} {xmin} {ymin} {xmax} {ymax}\n" f.write(line) convert_labelme_to_yolo('input.xml', 'output.txt') ``` #### 方法二:修改 YOLOv5 源码以适应多边形输入 另一种更复杂但也更具灵活性的方式是对 YOLOv5 进行源代码级别的改动,使其可以直接接受多边形作为输入形式之一。这涉及到调整网络结构以及损失函数的设计,使得模型能够在预测阶段输出多个顶点的位置而不是简单的中心点加宽高参数。此过程较为繁琐且技术难度较大,建议有一定开发经验的研究人员尝试。 #### 工具辅助方案 考虑到上述两种方式各有优劣,也可以探索像 LabelGo-Yolov5AutoLabelImg 这样的专用解决方案[^2]。这类平台可能已经集成了对多种标注类型的良好支持,包括但不限于多边形、线段等高级形态,从而简化了整个工作流程。
评论 54
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

askxiaozhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值