深度学习-yolo标签xml转成txt

在yolo训练模型之前,需要处理数据,对训练集和测试集中的照片数据集打上标签,目前很多脚本打完标签之后是xml格式的,而yolo模型训练需要的是txt格式的,所以如何转化?

代码从网上down的,但是做一下批注,方便后续学习。

 1 import os
 2 import glob
 3 import xml.etree.ElementTree as ET
 4 
 5 xml_file=r'D:\pythonProject9\Annotations'
 6 
 7 l=['Ban', 'BanLeft','BanRight','BanStright','Bee','TurnLeft','TurnRight','GoStright','Park','Stop']
 8 
 9 def convert(box,dw,dh):
10     x=(box[0]+box[2])/2.0
11     y=(box[1]+box[3])/2.0
12     w=box[2]-box[0]
13     h=box[3]-box[1]
14 
15     x=x/dw
16     y=y/dh
17     w=w/dw
18     h=h/dh
19 
20     return x,y,w,h
21 
22 def f(name_id):
23     xml_o=open(r'D:\pythonProject9\Annotations\%s.xml'%name_id)
24     txt_o=open(r'D:\pythonProject9\labels1\%s.txt'%name_id,'w')
25 
26     pares=ET.parse(xml_o)
27     root=pares.getroot()
28     objects=root.findall('object')
29     size=root.find('size')
30     dw=int(size.find('width').text)
31     dh=int(size.find('height').text)
32 
33     for obj in objects :
34         c=l.index(obj.find('name').text)
35         bnd=obj.find('bndbox')
36 
37         b=(float(bnd.find('xmin').text),float(bnd.find('ymin').text),
38            float(bnd.find('xmax').text),float(bnd.find('ymax').text))
39 
40         x,y,w,h=convert(b,dw,dh)
41 
42         write_t="{} {:.5f} {:.5f} {:.5f} {:.5f}\n".format(c,x,y,w,h)
43         txt_o.write(write_t)
44 
45     xml_o.close()
46     txt_o.close()
47 
48 name=glob.glob(os.path.join(xml_file,"*.xml"))
49 for i in name :
50     name_id=os.path.basename(i)[:-4]
51     f(name_id)

需要修改的地方是第5、7行,第23、24行。

第5行,修改为xml文件所在的绝对路径。

 

 

 第7行是标签的类别,一定要按照当时0、1、2、3……的书顺序来写,代码中所示的,0表示的是‘Ban,1表示的是‘BanLeft’,这样去写。建议在写代码之前,做好规划。

第23行代码是写xml文件的路径,第24行代码是转换好txt文件之后,txt文件所保存的位置。

 

关于代码内容,不用过于纠结,还是比较简单的,就是文件读写,在xml文中读取图片的长宽高,把原图片中打好的标签坐标归一化,转到0导1之间,等等。建议直接用,问题不大!

亲测代码可以跑通的

 

后来想了想,虽然代码跑通了,但是结果对吗?

上图:

 

 一个是数据源提供的,一个是通过上边代码转换的,虽然有误差,但是绝对是可以接受的范围之内

posted @ 2022-07-20 18:52  理工—王栋轩  阅读(2149)  评论(6编辑  收藏  举报