目录
问题引入
网上的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