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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值