利用Python获取VOC中的xml标注文件中的目标框

       首先引用这篇博客:https://www.cnblogs.com/xiaobingqianrui/p/8405813.html 中解说的关于python解析xml文件的一些方法,如下:

      python解析XML常见的有三种方法:一是xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合;二是xml.sax.*模块,它是SAX API的实现,这个模块牺牲了便捷性来换取速度和内存占用,SAX是一个基于事件的API,这就意味着它可以“在空中”处理庞大数量的的文档,不用完全加载进内存;三是xml.etree.ElementTree模块(简称 ET),它提供了轻量级的Python式的API,相对于DOM来说ET 快了很多,而且有很多令人愉悦的API可以使用,相对于SAX来说ET的ET.iterparse也提供了 “在空中” 的处理方式,没有必要加载整个文档到内存,ET的性能的平均值和SAX差不多,但是API的效率更高一点而且使用起来很方便。

      上述博客关于python解析xml文件过程还是比较详尽的,并且网上有关此类的文章也有很多,每种方法均有优劣,而且有时你搭建程序时还要考虑如:最熟悉哪种方法?前后工程使用的方法是否统一?读取解析的速度要求等等,因为我是参照PyFasterRCNN程序中有关读取xml文件的部分,它采用的是xml.etree.ElementTree模块,它把xml文件解析成一棵树,每一个节点上存放一个关键字或关键字和其值。这种数据树型数据结构十分清晰明了。下面上一段读取VOC中xml文件中的目标矩形框的程序,依程序带动解析xml文件的大致过程。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 2018/08/15 by DQ
# get annotation object bndbox location
try:
    import xml.etree.cElementTree as ET  #解析xml的c语言版的模块
except ImportError:
    import xml.etree.ElementTree as ET
											         
##get object annotation bndbox loc start 
def GetAnnotBoxLoc(AnotPath):#AnotPath VOC标注文件路径
    tree = ET.ElementTree(file=AnotPath)  #打开文件,解析成一棵树型结构
    root = tree.getroot()#获取树型结构的根
    ObjectSet=root.findall('object')#找到文件中所有含有object关键字的地方,这些地方含有标注目标
    ObjBndBoxSet={} #以目标类别为关键字,目标框为值组成的字典结构
    for Object in ObjectSet:
        ObjName=Object.find('name').text
        BndBox=Object.find('bndbox')
        x1 = int(BndBox.find('xmin').text)#-1 #-1是因为程序是按0作为起始位置的
        y1 = int(BndBox.find('ymin').text)#-1
        x2 = int(BndBox.find('xmax').text)#-1
        y2 = int(BndBox.find('ymax').text)#-1
        BndBoxLoc=[x1,y1,x2,y2]
        if ObjBndBoxSet.has_key(ObjName):
        	ObjBndBoxSet[ObjName].append(BndBoxLoc)#如果字典结构中含有这个类别了,那么这个目标框要追加到其值的末尾
        else:
        	ObjBndBoxSet[ObjName]=[BndBoxLoc]#如果字典结构中没有这个类别,那么这个目标框就直接赋值给其值吧
    return ObjBndBoxSet
##get object annotation bndbox loc end

使用xml.etree.ElementTree模块解析xml是很简单的,有读取xml的需要,也有创建xml的时候,也是使用这个模块,当然也是比较简单的,后面抽时间写点

 

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
VOC格式的XML文件包括对象的标注信息,可以使用以下代码将普通的XML文件转换为VOC格式的XML文件: ```python import os import xml.etree.ElementTree as ET def convert_voc(xml_path, save_path): # 打开xml文件 tree = ET.parse(xml_path) root = tree.getroot() # 创建XML文件 new_root = ET.Element('annotation') # 添加文件名 filename = ET.SubElement(new_root, 'filename') filename.text = os.path.basename(xml_path).split('.')[0] + '.jpg' # 添加标注信息 for obj in root.findall('object'): # 获取对象的名称 name = obj.find('name').text # 获取对象的位置信息 bbox = obj.find('bndbox') xmin = int(bbox.find('xmin').text) ymin = int(bbox.find('ymin').text) xmax = int(bbox.find('xmax').text) ymax = int(bbox.find('ymax').text) # 创建新的对象 new_obj = ET.SubElement(new_root, 'object') new_name = ET.SubElement(new_obj, 'name') new_name.text = name new_bbox = ET.SubElement(new_obj, 'bndbox') new_xmin = ET.SubElement(new_bbox, 'xmin') new_xmin.text = str(xmin) new_ymin = ET.SubElement(new_bbox, 'ymin') new_ymin.text = str(ymin) new_xmax = ET.SubElement(new_bbox, 'xmax') new_xmax.text = str(xmax) new_ymax = ET.SubElement(new_bbox, 'ymax') new_ymax.text = str(ymax) # 保存XML文件 new_tree = ET.ElementTree(new_root) new_tree.write(save_path) xml_path = 'example.xml' save_path = 'example_voc.xml' convert_voc(xml_path, save_path) ``` 在上面的代码,`xml_path` 参数是需要转换的普通XML文件的路径,`save_path` 参数是转换后的VOC格式XML文件的保存路径。代码,我们首先打开原始XML文件,然后创建一个新的XML文件,并将文件名添加到新的XML文件。接下来,我们遍历原始XML文件的每个对象,并获取对象的名称和位置信息。然后,我们将这些信息添加到新的XML文件,并将其保存。注意,我们假设原始XML文件的图像文件名与其对应的JPEG文件名相同,只是扩展名不同。因此,在保存VOC格式的XML文件时,我们将文件名更改为原始XML文件名的基础上加上'.jpg' 扩展名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值