解析VOC数据集标注文件xml的函数接口

解析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)))

猜你喜欢

转载自blog.csdn.net/weixin_50727642/article/details/127709819