解析VOC数据集的xml文件,直接返回一个字符串,使用空格间隔不同目标之间的信息
类别是使用的目标名称返回的,使用时需要将目标类别转换一下
还需要注意的是对返回值判断,如果返回值是空,说明没有目标信息
函数decodeVocAnnotationToStr是直接可以使用的,输入是一个voc格式的xml路径,输出所有目标的bbox,class信息
更多有关xml文件解析参考连接
import os
import xml.etree.ElementTree as ET
def decodeVocAnnotationToStr(voc_xml_path) -> str:
"""
voc数据集格式的文件解析,将一个文件解析成一个字符串,
字符串的格式是:x1,y1,x2,y2,class x1,y1,x2,y2,class ...
使用空格间隔不同对象
注意:返回的类别不是整型,而是字符串的类别名称
注意判断返回值是否为 空,如果是空说明没有目标,是一张背景图
:param voc_xml_path:
:return:
"""
assert voc_xml_path.endswith(".xml"), "voc_xml_path must endswith .xml"
xml_file = open(voc_xml_path, 'r', encoding='utf-8')
# 打开xml文件,并返回根节点
root = ET.ElementTree().parse(xml_file)
# 定义一个列表,专门保存目标
information = []
# 查找root节点下所有目标信息
for obj in root.iter('object'):
# 目标的名称
name = obj.find('name').text
# 目标的bbox坐标,一般voc是保存的corner格式的bbox
box = obj.find('bndbox')
xmin = box.find('xmin').text
ymin = box.find('ymin').text
xmax = box.find('xmax').text
ymax = box.find('ymax').text
# 添加一个目标的信息
information.append(f"{xmin},{ymin},{xmax},{ymax},{name}")
xml_file.close()
return " ".join(information)
if __name__ == '__main__':
# 测试
path = r"Z:\Datasets\VOC\VOCdevkit\VOC2012\Annotations"
for file in os.listdir(path)[:100]:
print(decodeVocAnnotationToStr(os.path.join(path, file)))