Python 生成与统计 PASCAL VOC 格式标签数据

追风的人
追风的人
发布时间:2026-10-11 | 2人浏览过
原创

本文介绍如何使用 Python 生成符合 PASCAL VOC 标准的 XML 标签文件,并提供统计训练数据中目标类别及数量的脚本。通过 lxml 库构建 XML 结构,利用 xml.etree 解析并统计特定目标(如变压器)的图像与总数,辅助目标检测模型的数据准备。

生成 VOC 格式标签文件

在目标检测任务中,PASCAL VOC 格式是一种广泛使用的数据标注标准。利用 Python 的 lxml 库,可以方便地生成符合该规范的 XML 文件。以下代码展示了如何创建一个包含图像基本信息和边界框标注的 XML 结构。

from lxml import etree, objectify

def gen_txt(filename, h, w, c):
  E = objectify.ElementMaker(annotate=False)
  anno_tree = E.annotation(
    E.folder('VOC_OPEN_IMAGE'),
    E.filename(filename),
    E.source(
      E.database('The VOC2007 Database'),
      E.annotation('PASCAL VOC2007'),
      E.image('flickr'),
      E.flickrid("341012865")
    ),
    E.size(
      E.width(w),
      E.height(h),
      E.depth(c)
    ),
    E.segmented(0),
    E.object(
      E.name('1'),
      E.pose('left'),
      E.truncated('1'),
      E.difficult('0'),
      E.bndbox(
        E.xmin('0'),
        E.ymin('0'),
        E.xmax('0'),
        E.ymax('0')
      )
    ),
  )
  etree.ElementTree(anno_tree).write('ann/'+filename[:-4]+".xml", pretty_print=True)

该函数通过 objectify.ElementMaker 定义 XML 节点,并写入到 ann/ 目录下。生成的文件包含文件夹名、文件名、图像尺寸、深度以及对象边界框等关键信息,可直接被主流目标检测模型读取。

统计 VOC 标签数据

在准备训练数据时,了解数据集中各类目标的分布情况至关重要。以下脚本用于解析 VOC 格式的 XML 文件,统计特定类别的目标数量,并筛选包含特定目标的图像。

# coding:utf-8
import xml.etree.cElementTree as ET
import os
from collections import Counter
import shutil
 
# Counter({'towCounter({'tower': 3074, 'windpower': 2014, 'thermalpower': 689, 'hydropower': 261, 'transformer': 225})
# total_num: 6263
 
def count(pathdir,despath):
 category = []
 path = pathdir + '/XML/'
 for index,xml in enumerate(os.listdir(path)):
 # print(str(index) + ' xml: '+ xml)
 root = ET.parse(os.path.join(path, xml))
 objects = root.findall('object')
 
 # ==================select images which has a special object=============
 for obj in objects:
  obj_label = obj.find('name').text
  if obj_label == 'transformer':
  print(xml)
  imgfile = pathdir + 'JPEG/' + xml.replace('xml', 'jpg')
  img_despath = despath + xml.replace('xml', 'jpg')
  # if not os.path.exists(img_despath):
  shutil.copyfile(imgfile, img_despath)
 
 # ==================select images which has a special object=============
 
 category += [ob.find('name').text for ob in objects]
 print(Counter(category))
 total_num = sum([value for key, value in Counter(category).items()])
 print('total_num:',total_num)
 
if __name__ == '__main__':
 # pathdirs = list(set(os.listdir('./')) ^ set(['tools','count.py']))
 # print(pathdirs)
 # for pathdir in pathdirs:
 pathdir = '/summer/Desktop/power_traindata/'
 despath = '/transformer/'
 count(pathdir,despath)

脚本通过 xml.etree.cElementTree 解析 XML 文件,提取所有 object 节点。它统计了各类目标的出现次数,并筛选出包含特定目标(如 'transformer')的图像,将其复制到指定目录。这有助于快速了解数据分布,并为后续的数据增强或模型训练提供依据。

注意事项

在使用上述脚本时,请确保文件路径正确,并根据实际需求修改目标类别和输出目录。此外,生成的 XML 文件应遵循 PASCAL VOC 的标准格式,以确保与目标检测模型的兼容性。

以上就是 Python 生成与统计 PASCAL VOC 格式标签数据的详细内容,更多关于 Python 数据标注与目标检测的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表