前言

在之前的数据集标注中,导出的格式是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
#读取xml文件
tree = ET.parse(path)
#获取根节点(root)
root = tree.getroot()
#在根节点(root)寻找object节点
object = root.find('object')
#在object节点中读取xmin的值
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)