前言
在之前的数据集标注中,导出的格式是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 os import time import keyboard import pyautogui from xml.etree import ElementTree as ET er=[] 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)
|