gpt4 book ai didi

python - 如何更新XML中的对象信息?

转载 作者:太空宇宙 更新时间:2023-11-03 14:28:35 27 4
gpt4 key购买 nike

我有一个 XML 文件 (gt.xml),如下所示:

<annotation>
<object>
<name>class1</name>
<pose>Unspecified</pose>
<bndbox>
<xmin>805</xmin>
<ymin>140</ymin>
<xmax>975</xmax>
<ymax>300</ymax>
</bndbox>
</object>
<object>
<name>class2</name>
<pose>Unspecified</pose>
<bndbox>
<xmin>816</xmin>
<ymin>386</ymin>
<xmax>1000</xmax>
<ymax>575</ymax>
</bndbox>
</object>
</annotation>

我有一个包含新信息的对象:

objects=[{'name': 'class1', 'bbox': [813, 141, 964, 296]}, {'name': 'class2', 'bbox': [824, 389, 989, 568]}]

我想将 name 对应的 bbox 值更新到 XML 文件中。因此 gt.xml XML 文件中预期的新信息将是:

<annotation>
<object>
<name>class1</name>
<pose>Unspecified</pose>
<bndbox>
<xmin>813</xmin>
<ymin>141</ymin>
<xmax>964</xmax>
<ymax>296</ymax>
</bndbox>
</object>
<object>
<name>class2</name>
<pose>Unspecified</pose>
<bndbox>
<xmin>824</xmin>
<ymin>389</ymin>
<xmax>989</xmax>
<ymax>568</ymax>
</bndbox>
</object>
</annotation>

这是我的更新功能:

def update_xml(filename, object):
""" Parse a PASCAL VOC xml file """
xml_file = os.path.join(dst_xml_dir, filename)
tree = ET.parse(xml_file)
print (len(object))
for obj in tree.findall('object'):
for obj_rotate in range(len(object)):
print (object[obj_rotate]['bbox'])
if(obj.find('name').text == object[obj_rotate]['name']):
bbox=object[obj_rotate]['bbox']
obj.find('bndbox').find('xmin').text= str(bbox[0])
obj.find('bndbox').find('ymin').text = str(bbox[1])
obj.find('bndbox').find('xmax').text= str(bbox[2])
obj.find('bndbox').find('ymax').text = str(bbox[3])
tree.write(xml_file)

它可以更新 XML,但有一个问题,我必须使用两个循环在条件 if 中插入类名。我想我们可以有更好的方法来使用来自 objects 信息的单个循环。我们可以用 Python 来做吗?

最佳答案

我的方法是首先提出修改后的dict -

objects=[{'name': 'class1', 'bbox': [813, 141, 964, 296]}, {'name': 'class2', 'bbox': [824, 389, 989, 568]}]

objects_an = { obj['name']:obj['bbox'] for obj in objects }

这会给 -

{'class2': [824, 389, 989, 568], 'class1': [813, 141, 964, 296]}

别碍事,现在只是遍历。这是完整的代码 -

objects=[{'name': 'class1', 'bbox': [813, 141, 964, 296]}, {'name': 'class2', 'bbox': [824, 389, 989, 568]}]

objects_an = { obj['name']:obj['bbox'] for obj in objects }
print(objects_an)

from xml import etree
e = etree.ElementTree.parse('gt.xml')
root = e.getroot()

obj_xml = root.findall('object')

for obj in obj_xml:
name = obj.find('name')
bbox_mod = objects_an[name.text] # do a try catch here

bbox_original = obj.find('bndbox')
bbox_original.find('xmin').text = str(bbox_mod[0])
bbox_original.find('ymin').text = str(bbox_mod[1])
bbox_original.find('xmax').text = str(bbox_mod[2])
bbox_original.find('ymax').text = str(bbox_mod[3])

e.write('gt2.xml')

您可以将其包装在一个函数中,它应该可以解决问题。希望这有帮助!

关于python - 如何更新XML中的对象信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47466282/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com