前言 在之前的数据集标注中,导出的格式是pascal,完成以后我就删掉了记录,后来由于一些错误,需要对原来的数据集进行修改,但是pascal格式不支持导入,因此有了转换成xml格式的需求。
XML 首先观察xml格式的输出文件,拿出一个作为模板,只需修改其中的path以及x,y的max,min即可。 下一步就是读取pascal格式的xml文件。 这里使用了from xml.etree import ElementTree as ET
的方法
1 2 3 4 5 6 7 8 tree = ET.parse(path) root = tree.getroot() object = root.find('object' )xmin = bndbox.find('xmin' ).text
代码 这里的代码还加入了寻找漏标项目的功能,输出其文件名和位置 此外此方法还可以自动去除多标的情况 另外在列表中查询指定值的索引的代码在这次编程中才学会filenames.index(i)
返回filenames列表中i的出现位置索引 下面是全部代码: 默认是从outputs(pet)
读取pascal格式,然后输出xml格式到outputs
文件夹
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 import osimport timeimport keyboardimport pyautoguifrom xml.etree import ElementTree as ETer=[] th=[] filenames = os.listdir(r'outputs(pet)' ) for i in filenames: try : path = 'outputs(pet)\\' +i tree = ET.parse(path) root = tree.getroot() object = root.find('object' ) bndbox = object .find('bndbox' ) xmin = bndbox.find('xmin' ).text ymin = bndbox.find('ymin' ).text xmax = bndbox.find('xmax' ).text ymax = bndbox.find('ymax' ).text print (xmin, ymin, xmax, ymax) path = i[0 :-4 ] str = """<?xml version="1.0" ?> <doc> <path>F:\\air2\\pet\\""" +path+""".jpg</path> <outputs> <object> <item> <name>pet</name> <bndbox> <xmin>""" +xmin+"""</xmin> <ymin>""" +ymin+"""</ymin> <xmax>""" +xmax+"""</xmax> <ymax>""" +ymax+"""</ymax> </bndbox> </item> </object> </outputs> <time_labeled>1656409300728</time_labeled> <labeled>true</labeled> <size> <width>1920</width> <height>1080</height> <depth>3</depth> </size> </doc> """ path = 'outputs\\' +i fw = open (path, 'w' ) fw.write(str ) fw.close() except AttributeError: er.append(i) th.append(filenames.index(i)+1 ) print (er)print (th)