Python 生成与统计 PASCAL VOC 格式标签数据
本文介绍如何使用 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 数据标注与目标检测的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









