voc,xml文件解析统计 标签名字 import xml.etree.ElementTree as ET

解析xml数据
python的xml库提供了几种不同的方法来解析xml文件,下面我们来介绍如何通过ElementTree和minidom来解析xml文件

使用ElementTree解析xml数据 通过ElementTree解析xml数据主要分为下面几个步骤:

  1. 使用getroot方法来获取xml的根节点信息
  2. 使用find方法来找到不需要遍历节点的信息
  3. 通过iter来编译包含多个相同节点的信息
    这个简单短点推荐这个
import xml.etree.ElementTree as ET

def parse_xml(xml_path):
    #读取xml文件
    rf = open(xml_path,"r")
    #开始解析xml文件
    tree = ET.parse(rf)
    #获取根节点信息
    root = tree.getroot()

    #获取图片的路径
    img_path = root.find("filename").text
    #获取图片的size节点的信息
    size = root.find("size")
    #获取图片的宽
    img_width = size.find("width").text
    #获取图片的高
    img_height = size.find("height").text

    #解析图片的box信息
    #遍历object节点的信息
    label_infos = []
    for object in root.iter("object"):
        #获取类别的名称
        name = object.find("name").text
        #获取标签的识别难度
        occluded = object.find("occluded").text
        #获取标签的box信息
        bndbox = object.find("bndbox")
        xmin = float(bndbox.find('xmin').text)
        xmax = float(bndbox.find('xmax').text)
        ymin = float(bndbox.find('ymin').text)
        ymax = float(bndbox.find('ymax').text)
        box = (xmin,xmax,ymin,ymax)
        label_infos.append((name,occluded,box))
    return label_infos,img_width,img_height

使用minidom来解析xml文件
使用minidom来解析xml相对于ElementTree来说要稍微复杂一点,minidom主要通过getElementsByTagName函数来寻找节点,然后再通过childNodes来逐步解析xml文件,我将minidom解析xml文件以及封装成了三个函数:

  1. get_all_node获取节点下面所有的子节点
  2. get_node_value获取节点的值
  3. get_node_name获取节点的名称
from xml.dom import minidom

def parse_xml_by_minidom(xml_path):

    def get_node_name(node):
        """获取节点的名字
        :param node:
        :return:
        """
        return node.nodeName


    def get_node_value(node):
        """获取node的值
        :param node:
        :return:
        """
        child_nodes = node.childNodes
        return child_nodes[0].nodeValue

    def get_all_node(node,node_list):
        """获取所有的节点
        :param node:
        :param node_list:
        :return:
        """
        for child_node in node.childNodes:
            if isinstance(child_node,minidom.Element):
                child_nodes = child_node.childNodes
                if len(child_nodes) == 1:
                    node_list.append(child_node)
                else:
                    get_all_node(child_node,node_list)


    def get_all_child_value(node):
        """获取节点所有子节点信息
        :param node:
        :return:
        """
        node_list = []
        get_all_node(node,node_list)
        node_info = {}
        for node in node_list:
            node_name = get_node_name(node)
            node_value = get_node_value(node)
            if node_value is not None:
                node_info[node_name] = node_value
        return node_info


    doc = minidom.parse(xml_path)
    #获取跟节点
    root = doc.documentElement
    #获取图片的路径
    img_path_node = root.getElementsByTagName("filename")[0]
    #获取节点的名称
    node_name = get_node_name(img_path_node)
    #获取节点的值
    img_path = get_node_value(img_path_node)
    size_node_list = root.getElementsByTagName("size")
    size_info = get_all_child_value(size_node_list[0])
    #获取图片的宽和高
    img_width = size_info["width"]
    img_height = size_info["height"]
    #获取标签信息
    box_info_list = []
    object_node_list = root.getElementsByTagName("object")
    for object_node in object_node_list[:1]:
        box_node_info = get_all_child_value(object_node)
        box_info_list.append(box_node_info)
    return box_info_list,img_width,img_height

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在VS Code中将XML格式转换为VOC格式,您可以按照以下步骤进行操作: 1. 首先,确保您已经安装了Python和所需的库。您可以使用以下命令安装所需的库: ``` pip install xmltodict ``` 2. 创建一个Python脚本文件(例如convert_xml_to_voc.py),并在VS Code中打开它。 3. 在脚本文件中,导入所需的库和模块: ```python import os import xml.etree.ElementTree as ET import xmltodict ``` 4. 定义一个函数来解析XML文件并生成VOC格式的标注数据: ```python def convert_xml_to_voc(xml_file): with open(xml_file, 'r') as f: xml_data = f.read() data_dict = xmltodict.parse(xml_data) # 提取图像尺寸信息 image_width = int(data_dict['annotation']['size']['width']) image_height = int(data_dict['annotation']['size']['height']) image_depth = int(data_dict['annotation']['size']['depth']) # 创建VOC格式的标注数据字符串 voc_data = f"{image_width}\n{image_height}\n{image_depth}\n" # 提取目标对象信息并生成VOC格式的标注数据字符串 for obj in data_dict['annotation']['object']: xmin = int(obj['bndbox']['xmin']) ymin = int(obj['bndbox']['ymin']) xmax = int(obj['bndbox']['xmax']) ymax = int(obj['bndbox']['ymax']) label = obj['name'] voc_data += f"{label} {xmin} {ymin} {xmax} {ymax}\n" return voc_data ``` 5. 定义一个函数来遍历指定目录下的所有XML文件,并调用上面的函数进行转换: ```python def batch_convert_xml_to_voc(xml_dir, output_dir): for xml_file in os.listdir(xml_dir): if xml_file.endswith('.xml'): xml_path = os.path.join(xml_dir, xml_file) voc_data = convert_xml_to_voc(xml_path) # 生成VOC格式的标注数据文件 output_file = os.path.splitext(xml_file)[0] + '.txt' output_path = os.path.join(output_dir, output_file) with open(output_path, 'w') as f: f.write(voc_data) ``` 6. 在脚本文件中,调用上面的函数并传入您的XML文件目录和输出目录: ```python xml_dir = 'path/to/xml/files' output_dir = 'path/to/output/directory' batch_convert_xml_to_voc(xml_dir, output_dir) ``` 7. 保存并运行脚本文件,它将遍历指定目录下的所有XML文件,并将转换后的VOC格式标注数据保存到指定的输出目录中。 请注意,上述代码仅提供了一个简单的示例,并假设XML文件的结构符合您的需求。您可能需要根据自己的数据集结构进行适当的修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值