批量删除VOC的XML中的某些节点

本博客介绍了一段Python代码,用于处理VOC数据集中的XML标注文件,通过遍历并移除不属于预定义类别的对象标签,实现数据集的类别过滤。代码涉及XML解析、文件操作等技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import xml.etree.cElementTree as ET
import os
path_root = ['E:\data-VOC0712\VOC2007\Annotations',
             'E:\data-VOC0712\VOC2012\Annotations']

CLASSES = [
           "bottle",
           "cat", "chair",  "diningtable",
           "dog", "motorbike", "person",
           "pottedplant","sofa",
           "tvmonitor"]
for anno_path in path_root:
    xml_list = os.listdir(anno_path)
    for axml in xml_list:
        path_xml = os.path.join(anno_path, axml)
        tree = ET.parse(path_xml)
        root = tree.getroot()

        for child in root.findall('object'):
            name = child.find('name').text
            if not name in CLASSES:
                root.remove(child)

        tree.write(os.path.join('E:\data-myVOC0712\Annotations', axml))
 

转载:https://blog.youkuaiyun.com/qq_36735489/article/details/80732346

<think>嗯,用户的问题是关于如何在Python中读取并可视化VOC格式的XML文件中的边界框。首先,我需要回忆一下VOC标注文件的结构。通常,每个XML文件对应一张图片,里面包含图片的尺寸信息,比如宽度、高度、深度,然后每个object有名称和边界框的坐标(xmin, ymin, xmax, ymax)。 接下来,用户需要可视化这些边界框到对应的图片上。这涉及到几个步骤:解析XML文件,提取坐标,然后用绘图库在图片上绘制矩形和标签。我记得Python常用的库有xml.etree.ElementTree来处理XML,用PIL或OpenCV来读取图片和绘图。 首先,如何解析XML?可能需要用ElementTree来遍历节点,找到size和object的信息。比如,图片的宽度和高度可能在size标签下的width和height子标签里,而每个object的bndbox则包含四个坐标值。需要将这些值提取出来,可能转换成整数类型。 然后,读取图片的话,可以用PIL的Image.open或者OpenCV的cv2.imread。不过要注意路径的问题,确保XML文件和图片文件在正确的目录下。用户可能需要指定图片文件夹和XML文件夹的路径,然后根据XML文件名找到对应的图片文件。 接下来是绘制边界框。可以用PIL的ImageDraw模块来画矩形,或者用OpenCV的rectangle函数。两种方法都可以,但颜色格式需要注意,PIL用的是RGB,而OpenCV是BGR。此外,还需要在框的旁边显示类别名称,这样可视化效果更好。 可能还需要处理多个object的情况,每个object都要单独提取并绘制。同时,不同类别可以用不同颜色区分,比如预先定义一个颜色映射,或者随机生成颜色。 用户的示例代码中提到了plot_one_box函数,这个函数可能需要接收坐标、图片对象、颜色和标签作为参数,然后在图片上画出矩形框和文字。此外,还需要将处理后的图片保存到指定目录,可能需要创建输出文件夹。 另外,用户提到的引用中,有关于如何处理没有object的图片的情况,比如负样本,这时候可能没有对应的XML文件。但在当前问题中,用户可能已经确保有XML文件,所以暂时不需要处理这种情况,但可能在代码中加入一些异常处理会更好。 测试代码的时候,用户需要确保路径正确,比如图片路径和XML路径是否匹配,是否存在对应的文件。可能需要用os模块来遍历文件,或者处理单个文件。 最后,可能需要将整个流程封装成函数,方便调用。比如,定义一个show_labels函数,接收图片目录、标注目录和输出目录,然后处理每个文件。 总结步骤:解析XML获取坐标和类别,读取图片,绘制矩形和标签,保存图片。需要用到ElementTree、PIL/OpenCV、os等库。</think>以下是使用Python读取并可视化VOC格式XML边界框的步骤实现: ### 1. 准备工作 安装依赖库: ```bash pip install opencv-python pillow matplotlib ``` ### 2. 核心代码实现 ```python import os import xml.etree.ElementTree as ET from PIL import Image, ImageDraw def parse_voc_xml(xml_path): """解析VOC格式XML文件,返回图片信息和边界框列表""" tree = ET.parse(xml_path) root = tree.getroot() size = root.find('size') width = int(size.find('width').text) height = int(size.find('height').text) boxes = [] for obj in root.iter('object'): cls = obj.find('name').text bndbox = obj.find('bndbox') xmin = int(bndbox.find('xmin').text) ymin = int(bndbox.find('ymin').text) xmax = int(bndbox.find('xmax').text) ymax = int(bndbox.find('ymax').text) boxes.append((cls, (xmin, ymin, xmax, ymax))) return {'width': width, 'height': height}, boxes def visualize_boxes(image_path, boxes, output_path=None): """可视化边界框""" image = Image.open(image_path) draw = ImageDraw.Draw(image) for cls, (x1, y1, x2, y2) in boxes: # 绘制矩形框 draw.rectangle([x1, y1, x2, y2], outline='red', width=2) # 添加文本标签 draw.text((x1+5, y1+5), cls, fill='yellow') if output_path: image.save(output_path) return image # 使用示例 xml_path = 'annotations/000001.xml' image_path = 'images/000001.jpg' output_path = 'output/000001_visualized.jpg' # 解析并可视化 _, boxes = parse_voc_xml(xml_path) visualize_boxes(image_path, boxes, output_path) ``` ### 3. 关键代码说明 1. **XML解析**: - 通过`xml.etree.ElementTree`解析XML层级结构 - 使用`.find()`方法逐层获取`size`和`object`节点信息 - 边界框坐标会转换为整数类型 2. **可视化实现**: - 使用PIL库的`ImageDraw`模块绘制矩形框 - 框线颜色为红色(RGB: 255,0,0),文本颜色为黄色 - 支持将结果保存为图片文件 3. **路径处理**: - 需要确保输入图片路径与XML标注路径对应 - 输出目录需要预先创建 ### 4. 扩展功能建议 - **颜色随机化**:为不同类别分配唯一颜色 ```python import random def get_color(cls): return (random.randint(0,255), random.randint(0,255), random.randint(0,255)) ``` - **批量处理**:遍历整个标注目录 ```python for xml_file in os.listdir(xml_dir): if xml_file.endswith('.xml'): xml_path = os.path.join(xml_dir, xml_file) image_name = xml_file.replace('.xml', '.jpg') image_path = os.path.join(image_dir, image_name) ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值