VOC格式(xml)标签批量转换为yolo格式(txt)标签
常见的数据集标签格式多为四种,分别是voc格式、yolo格式、json格式、coco格式。如何将voc转yolo格式的脚本文件。
voc格式标签的开源数据集VOC2007、VOC2012、VOC2017
<annotation>
<folder>a</folder>
<filename>syx15_DJI_0058.jpg</filename>
//图片名称
<path>O:\ultralytics-main\_learn\样本\a\syx15_DJI_0058.jpg</path>
//图片位置
<source>
<database>Unknown</database>
</source>
//图片宽、高
<size>
<width>510</width>
<height>510</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
//目标类别
<object>
<name>a1</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
//目标box坐标,左上与右下顶点
<bndbox>
<xmin>226</xmin>
<ymin>95</ymin>
<xmax>278</xmax>
<ymax>131</ymax>
</bndbox>
</object>
</annotation>
yolo格式标签
4 0.516492 0.469388 0.912516 0.748282
4 //类别编号、从0开始
0.516492 0.469388 //box中心,归一化后的坐标
0.912516 0.748282 //box归一化后的长和宽
//归一化:box长宽分别除以图片的长宽得到的值(box在图上的比)
好了介绍完了区别,现在上干货voc2yolo脚本核心
def convert(size, box):
x_center = (box[0]+box[1])/2.0
y_center = (box[2]+box[3])/2.0
x = x_center / size[0]
y = y_center / size[1]
w = (box[1] – box[0]) / size[0]
h = (box[3] – box[2]) / size[1]
return (x,y,w,h)
def convert_annotation(xml_files_path, save_txt_files_path, classes):
line_data = []
with open(xml_files_path,'r') as f:
for line in f.readlines():
line = line.strip()
x = line.split(";",6)
print(x)
print(x[0])
out_txt_path = os.path.join(save_txt_files_path, x[0].split('.')[0] + '.txt')
if x[5] == 'warning':
class_id = 0
if x[5] == 'prohibitory':
class_id = 1
if x[5] == 'mandatory':
class_id = 2
b = (float(x[1]),float(x[3]),float(x[2]),float(x[4]))
img = Image.open('F:/CCTSDB_one/GroundTruth/'+x[0])
w, h = list(img.size)
print(w,h,b)
bb = convert((w,h), b)
with open(out_txt_path, 'w') as f:
f.write(str(class_id) + " " + " ".join([str(a) for a in bb]) + '\n')
训练
接下来就是训练模型了,笔者在这里选用的是从预训练的*.pt模型开始训练,执行命令如下:
yolo task=detect mode=train model=datasets/yolov8s.pt epochs=10 batch=1 data=datasets/Helmet.yaml
当然,你也可以选择其它两种方式:
从yaml构建一个全新的模型,训练命令如下:
yolo task=detect mode=train model=yolov8s.yaml epochs=10 batch=1 data=datasets/Helmet.yaml
从yaml中构建一个新模型,将预训练的权重转移到它并开始训练。
yolo task=detect mode=train model=yolov8s.yaml pretrained=yolov8s.pt epochs=10 batch=1 data=datasets/Helmet.yaml
其中,
task:选择任务类型,可选[‘detect’, ‘segment’, ‘classify’, ‘init’]。
mode: 选择是训练、验证还是预测的任务类型,可选[‘train’, ‘val’, ‘predict’]。
model: 选择yolov8不同的模型配置文件,可选yolov8s、yolov8m、yolov8l、yolov8x、yolov8n。
data: 选择生成的数据集配置文件。
epochs:指的就是训练过程中整个数据集将被迭代多少次(我这里是cpu训练所以调的比较小)。
batch:一次看完多少张图片才进行权重更新(同上)。
pretrained:预训练模型。
环境搭建
1、安装cuda11.8 ,cudnn,anaconda
2、anaconda中配置虚拟python3.8环境
3、安装pytorch “conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia”
4、验证
import torch
torch.cuda.is_available()
如果是 True,意味着你可以使用 GPU。
5、安装yolo “import ultralytics yolo labelimg ”
6、验证“yolo predict model=yolov8n.pt source=’ultralytics/assets/bus.jpg’”如果报错“在 .\ultralytics-main路径下执行 pip uninstall ultralytics 然后重新 pip install ultralytics 即可”
7、训练“yolo task=detect mode=train model=O:\ultralytics-main_learn\ybb\dataset\yolov8x.pt epochs=60 batch=1 data=O:\ultralytics-main_learn\ybb\dataset\poppy.yaml”