深度学习-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之间,等等。建议直接用,问题不大!
亲测代码可以跑通的
后来想了想,虽然代码跑通了,但是结果对吗?
上图:
一个是数据源提供的,一个是通过上边代码转换的,虽然有误差,但是绝对是可以接受的范围之内