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")
        
### 多边形标注与矩形标注的概念 多边形标注是一种数据标注方式,允许用户通过定义多个顶点来精确描绘目标对象的边界[^1]。这种方式适用于形状不规则的目标物体,能够提供更高的精度。相比之下,矩形标注则更为简单直观,它通过绘制一个包围框(Bounding Box)来标记目标的位置[^2]。 --- ### 使用场景分析 #### 矩形标注的应用场景 矩形标注通常用于检测具有清晰轮廓的对象,例如车辆、行人或其他几何形状较为规整的目标。由于其操作简便且计算成本较低,在许多计算机视觉任务中被广泛采用,比如目标检测模型训练中的YOLO系列算法或Faster R-CNN等。 #### 多边形标注的应用场景 对于复杂背景下的图像分割任务或多边形区域识别需求较高的项目来说,多边形标注显得尤为重要。例如医学影像处理领域内的肿瘤边缘界定或者遥感卫星图上的建筑物提取等工作都需要依赖于这种高精度的手动勾勒技术才能获得满意的效果。 --- ### 工具对比:LabelImg vs LabelMe - **LabelImg**: 主要支持矩形标注功能,适合快速创建大量简单的bounding box标签文件;而如果想要实现更精细控制,则需借助其他插件扩展能力。 - **LabelMe**: 提供了更加灵活丰富的绘图选项,其中包括但不限于圆形、椭圆以及最重要的自由手绘路径即所谓的“Polygon Mode”,这使得即使面对再怎么扭曲变形的事物也依然可以准确无误地标记出来。 --- ### 安装与基本使用说明 以下是基于Windows系统的`labelme`环境配置指南: ```bash # 创建新的虚拟环境并激活 conda create -n labelme_env python=3.8 conda activate labelme_env # 安装必要库 pip install labelme ``` 启动应用程序命令如下所示: ```bash labelme ``` 当界面加载完成后即可按照提示选择对应模式开始作业——切换至polygon视图后利用鼠标点击拖拽形成闭合回路从而完成一次完整的多边形选取过程。 至于在线平台如VIA(video image annotation),访问官方文档链接获取最新版本下载地址及相关参数设置教程会更有帮助一些。 --- ### 转换Mask图片的方法 假设已经完成了全部所需帧数的画面打码工作,下面给出一段脚本用来批量生成二值掩模(binary mask): ```python import cv2 import numpy as np from skimage import measure def polygon_to_mask(image_shape, polygons): mask = np.zeros(image_shape[:2], dtype=np.uint8) for poly in polygons: pts = np.array([list(p.values()) for p in poly['points']], np.int32).reshape((-1)) cv2.fillPoly(mask,[pts],color=(255)) return mask if __name__ == "__main__": img_height,img_width = 512 ,512 # 替代实际尺寸大小 sample_polygon=[{'points':[(100,100),(200,100),(200,200)]}] result=polygon_to_mask((img_height,img_width),sample_polygon) contours,hierarchy=cv2.findContours(result,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[-2:] filled_contour=np.zeros_like(result) cv2.drawContours(filled_contour,contours,-1,(255),thickness=-1) print('Conversion Done.') ``` 上述代码片段展示了如何将JSON格式存储下来的坐标序列化为可供后续深度学习框架读取的标准位图形式。 ---
评论 54
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

askxiaozhang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值