1. 数据增强工具、方法
大佬分享的图像增强软件,可同时增加xml、json标注文件:图像增强软件V2.0,适用于|目标检测|图像分割|图像分类|(本文第2节有xml转txt的代码)
2. labelImg使用方法
参考教程:labelImg使用教程
用cmd
打开,输入命令activate yolov5
激活进入到yolov5环境后(如果未安装labelImg的话,输入pip install labelImg
命令安装labelImg),然后再输入labelImg
启动labeImg标注软件。
labelImg界面:
![](https://i-blog.csdnimg.cn/blog_migrate/80a952dc3db0afb5505bd7e162c7063e.png#pic_center)
快捷键:
- W:创建方框
- A:上一张
- D:下一张
注意:
界面中Save
下面依次点击会有以下3种选项:
![](https://i-blog.csdnimg.cn/blog_migrate/66ea18c8ba526c3dcb440016ded0a877.png)
对应的标注文件格式分别是:
- CreateML----json
- PascalVOC----xml
- YOLO----txt
yolov系列的标注文件是txt类型的,以下是xml转txt格式的代码:
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
import glob
# 共6个类别,编号依次为0~5
classes = ['crazing', 'inclusion', 'patches', 'pitted_surface', 'rolled-in_scale', 'scratches']
def convert(size, box):
dw = 1. / size[0] # 得到一个百分比,float类型的(因为分子是1.)
dh = 1. / size[1]
x = (box[0] + box[1]) / 2.0 # 中心点
y = (box[2] + box[3]) / 2.0 # 网上那个代码在后面还会再-1
w = box[1] - box[0] # 相对的长宽
h = box[3] - box[2]
x = x * dw # 相对之后的归一化结果
w = w * dw
y = y * dh
h = h * dh
return (x, y, w, h)
def convert_annotation(image_name): # 转换标签函数
in_file = open('./validation/annotations/' + image_name[:-3] + 'xml') # 读取进来的xml文件
out_file = open('./validation/labels/' + image_name[:-3] + 'txt', 'w') # 写入到相应的txt文件中
tree = ET.parse(in_file) # 解析xml文件
root = tree.getroot()
size = root.find('size')
w = int(size.find('width').text) # 图像的长宽
h = int(size.find('height').text)
for obj in root.iter('object'): # 遍历
clses = obj.find('name').text
if clses not in classes:
print(clses)
continue
clses_id = classes.index(clses)
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
float(xmlbox.find('ymax').text))
bb = convert((w, h), b)
out_file.write(str(clses_id) + ' ' + ' '.join([str(a) for a in bb]) + '\n')
if __name__ == '__main__':
for image_path in glob.glob('validation/images/*.jpg'):
image_path = image_path.split('\\')[-1] # 读取文件夹中后缀为jpg的文件,然后只获取其name
# print(iamge_path)
convert_annotation(image_path) # 开始转换标签