对于某个文件夹下的所有图片,使用labelimg进行标注,获得voc类型的xml格式的标签。由于在进行标注工作时,将不同的类别分开标注了,得到标签文件夹有两个,第一个文件夹存储了类别 a 和类别 b 的 labels ,第二个文件夹存储了类别 c, d, e… 的 labels 。现在想要将相同图片的标签进行,即原本一张图片可能有两个对应的 xml,现在要使得一张图片只有一个对应的 xml。
原图: 标签1 标签2 标签合并
通过分析 xml 文件,得知关键的标签信息存在于 xml 中的 object节点中,那么只要将相同图片的两个 xml 文件中的object进行拼接即可。
例如:
xml1:
<annotation> <folder>images</folder> <filename>1_191.jpg</filename> <path>/home/shan/Desktop/VOC/images/1_191.jpg</path> <source> <database>Unknown</database> </source> <size> <width>1920</width> <height>1080</height> <depth>3</depth> </size> <segmented>0</segmented> <object> <name>no</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>240</xmin> <ymin>37</ymin> <xmax>290</xmax> <ymax>79</ymax> </bndbox> </object> <object> <name>no</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>401</xmin> <ymin>23</ymin> <xmax>460</xmax> <ymax>65</ymax> </bndbox> </object> </annotation>xml2:
<annotation> <folder>xu</folder> <filename>1_191.jpg</filename> <path>/home/aibc/Desktop/xu/1_191.jpg</path> <source> <database>Unknown</database> </source> <size> <width>1920</width> <height>1080</height> <depth>3</depth> </size> <segmented>0</segmented> <object> <name>excavator arm</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>938</xmin> <ymin>38</ymin> <xmax>1063</xmax> <ymax>116</ymax> </bndbox> </object> <object> <name>person</name> <pose>Unspecified</pose> <truncated>1</truncated> <difficult>0</difficult> <bndbox> <xmin>1037</xmin> <ymin>1</ymin> <xmax>1047</xmax> <ymax>28</ymax> </bndbox> </object> </annotation>xml1 和 xml2 都是 图片1_191.jpg 的标签,我们现在将它们合并。
读取
读取文档:tree = ET.parse() 获得根节点:root = tree.getroot() 获得所有子节点:list() 查找子节点,注意这里不会递归查找所有子节点:root.findall('object') 查找子节点,递归查找所有子节点:root.iter() 查看节点名称:root.tag
写入
创建节点:root = ET.Element) 创建文档:tree = ET.ElementTree() 设置文本值:element.text 设置属性:element.set() 添加节点:root.append() 写入文档:tree.write()
得到的输出结果为:
<annotation> <folder>images</folder> <filename>1_191.jpg</filename> <path>/home/shan/Desktop/VOC/images/1_191.jpg</path> <source> <database>Unknown</database> </source> <size> <width>1920</width> <height>1080</height> <depth>3</depth> </size> <segmented>0</segmented> <object> <name>no</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>240</xmin> <ymin>37</ymin> <xmax>290</xmax> <ymax>79</ymax> </bndbox> </object> <object> <name>no</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>401</xmin> <ymin>23</ymin> <xmax>460</xmax> <ymax>65</ymax> </bndbox> </object> <object> <name>excavator arm</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>938</xmin> <ymin>38</ymin> <xmax>1063</xmax> <ymax>116</ymax> </bndbox> </object> <object> <name>person</name> <pose>Unspecified</pose> <truncated>1</truncated> <difficult>0</difficult> <bndbox> <xmin>1037</xmin> <ymin>1</ymin> <xmax>1047</xmax> <ymax>28</ymax> </bndbox> </object> </annotation>可以看到,问题解决_
参考链接:
Python中XML的读写总结