我正在使用xml来描述边界框,并打算过滤掉xml文件的某些元素。典型的xml可能看起来像:
<annotation>
<folder>original2</folder>
<filename>beach146.jpg</filename>
<path>/home/train/original/beach146.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>800</width>
<height>533</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>person</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>314</xmin>
<ymin>315</ymin>
<xmax>559</xmax>
<ymax>400</ymax>
</bndbox>
</object>
<object>
<name>boat</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>580</xmin>
<ymin>193</ymin>
<xmax>602</xmax>
<ymax>205</ymax>
</bndbox>
</object>
</annotation>
我正在对bbox坐标进行一些检查,如有必要,请删除包含相应bbox的object
。
我正在使用类似以下内容的坐标:
xmin = int(obj.find('bndbox').find('xmax').text)
但是看起来很尴尬和丑陋,所以我切换到:
xmin = int(obj[4][0].text)
这似乎好一点。 obj
来自objs = tree.findall('object')
,因此甚至可以通过对根应用相同的索引来对其进行优化,例如:
print(root[7][4][0].tag, root[7][4][0].text)
xmin 580
我的问题是索引系统是否一致,并且将在每个xml文件中按预期工作。这意味着它将以文件中写入元素的顺序返回元素。我的xml文件应具有相同的元素顺序。在其他情况下,应该对obj[4][0].tag
进行检查,以确认我正在处理预期的元素。
答案 0 :(得分:1)
我认为索引系统是一致的。但是按索引访问元素可能会造成混淆,并且容易出错。
我的建议是使用findtext()
。
from xml.etree import ElementTree as ET
tree = ET.parse("annotation.xml")
for obj in tree.findall("object"):
xmin = obj.findtext('bndbox/xmin')
...