如何将XML格式标注文件转换为YOLO格式进行目标检测训练(附代码)

目标检测是计算机视觉中非常重要的任务,而YOLO(You Only Look Once)作为一种高效的目标检测算法,广泛应用于各类视觉任务中。在进行YOLO训练时,标注数据的格式是至关重要的。本文将详细介绍如何将XML格式的标注文件转换为YOLO所需的TXT格式标注,以便能够在YOLO框架中进行训练。

一、背景介绍

在计算机视觉任务中,尤其是目标检测任务,数据的标注格式常常不统一。常见的标注格式有:

  • PASCAL VOC 格式:基于 XML 文件,每个 XML 文件中包含图像信息和对应的目标框位置。

  • YOLO 格式:采用 TXT 文件,每一行记录一个物体的类别及其在图像中的位置(相对于图像的归一化坐标)。

YOLO 格式的标注文件要求每个物体信息以行的形式存储,每行包括以下数据:

复制代码
<类别ID> <x_center> <y_center> <width> <height>

其中,x_center、y_center、width 和 height 是相对于图像尺寸归一化后的值(取值范围为0到1)。

在本文中,我们将介绍如何将标准的PASCAL VOC XML格式标注转换为YOLO所需的TXT格式标注。

二、XML格式标注文件解析

PASCAL VOC XML格式标注文件通常包含如下结构:

复制代码
<annotation>
    <folder>JPEGImages</folder>
    <filename>image_1.jpg</filename>
    <size>
        <width>1920</width>
        <height>1080</height>
        <depth>3</depth>
    </size>
    <object>
        <name>drone</name>
        <bndbox>
            <xmin>400</xmin>
            <ymin>300</ymin>
            <xmax>500</xmax>
            <ymax>400</ymax>
        </bndbox>
    </object>
</annotation>

上述 XML 文件标注了图像的尺寸和目标物体(例如 drone)的位置,其中 <bndbox> 标签下包含了目标物体的边界框信息。

三、YOLO格式转换步骤

YOLO要求标注信息以TXT格式保存,每个标注文件对应一个图像。每一行包含一个物体的信息,格式如下:

复制代码
<类别ID> <x_center> <y_center> <width> <height>
  • 类别ID :从预定义的类别列表中获取(如本文中的 ["drone"])。

  • x_center, y_center :边界框中心的归一化坐标,分别为 (xmin + xmax) / 2 和 (ymin + ymax) / 2。

  • width, height :边界框的宽度和高度,分别为 (xmax - xmin) 和 (ymax - ymin)。

  • 归一化:YOLO要求坐标以相对于图像宽高的比例来表示。即:

    • x_center = (xmin + xmax) / 2 / 图像宽度

    • y_center = (ymin + ymax) / 2 / 图像高度

    • width = (xmax - xmin) / 图像宽度

    • height = (ymax - ymin) / 图像高度

四、实现代码

以下是将PASCAL VOC XML标注文件转换为YOLO格式标注文件的Python代码实现:

复制代码
import xml.etree.ElementTree as ET
import os
import glob

# 定义类别,这里定义自己的类别,有多少类按照顺序写上
classes = ["drone"]

# 将标注框转换为YOLO格式
def convert(size, box):
    dw = 1.0 / size[0]
    dh = 1.0 / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)

# 转换 XML 标注文件为 YOLO 格式
def convert_annotation(image_name):
    # 构造 XML 和 TXT 文件路径
    xml_path = os.path.join('./Annotations', image_name[:-3] + 'xml')
    txt_path = os.path.join('./labels', image_name[:-3] + 'txt')

    # 如果标签输出文件夹不存在,创建它
    os.makedirs(os.path.dirname(txt_path), exist_ok=True)

    # 打开并读取 XML 文件
    try:
        with open(xml_path, 'r') as f:
            xml_text = f.read()
            root = ET.fromstring(xml_text)
    except FileNotFoundError:
        print(f"XML 文件未找到: {xml_path}")
        return

    # 获取图片的宽度和高度
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    # 打开输出的 TXT 文件进行写入
    with open(txt_path, 'w') as out_file:
        # 遍历每个 object 标签
        for obj in root.iter('object'):
            cls = obj.find('name').text
            # 如果该类别不在指定类别列表中,跳过
            if cls not in classes:
                print(f"跳过类别: {cls}")
                continue
            cls_id = classes.index(cls)

            # 获取标注框信息
            xmlbox = obj.find('bndbox')
            b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text),
                 float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
            bb = convert((w, h), b)

            # 将转换后的结果写入输出文件
            out_file.write(f"{cls_id} {' '.join([str(a) for a in bb])}\n")

# 主程序
if __name__ == '__main__':
    # 遍历所有的 .jpg 图片文件,并转换成相应的 .xml 文件
    for image_path in glob.glob("./JPEGImages/*.jpg"):  # 图片路径
        image_name = os.path.basename(image_path)  # 获取图片文件名
        convert_annotation(image_name)  # 调用转换函数

五、代码解析

  1. 转换函数 convert:该函数将标注框从像素坐标转换为YOLO所需的归一化格式。

  2. convert_annotation 函数:该函数读取每个XML标注文件,提取图像的宽度、高度以及目标框信息,并将其转换为YOLO格式,最后保存到TXT文件中。

  3. 主程序 :遍历 ./JPEGImages/ 目录下的所有 .jpg 文件,依次调用 convert_annotation 函数进行转换。

六、总结

本文详细介绍了如何将 PASCAL VOC XML 格式标注文件转换为 YOLO 格式标注文件。这对于使用 YOLO 进行目标检测训练非常重要,因为YOLO要求标注数据以特定格式存储。通过 Python 脚本自动化这个过程,我们可以快速将原始标注数据转换为 YOLO 所需的格式,从而为模型训练做准备。

希望本文对你有所帮助,如果你有任何问题,欢迎留言讨论!

相关推荐
沃达德软件7 小时前
智慧无人机图像识别分析技术
人工智能·目标检测·计算机视觉·目标跟踪·视觉检测·无人机
William一直在路上8 小时前
把轻量化 YOLO 模型部署到你的手机上
yolo·智能手机
迪菲赫尔曼1 天前
【基础篇 11】把官方源码放到服务器:版本、解压层级和安装位置,一次弄清楚
运维·服务器·开发语言·人工智能·python·yolo·目标检测
迪菲赫尔曼1 天前
【基础篇 12】把环境与源码接起来:检查 GPU,再安装服务器上的项目
运维·服务器·开发语言·人工智能·python·yolo·目标检测
yyk333241 天前
YOLOv4算法
人工智能·yolo·目标跟踪
陈嘿萌1 天前
ACM MM 2026|告别密集交互!ProtoHGF-Net:基于原型超图的RGBT目标检测新范式
图像处理·人工智能·深度学习·目标检测·计算机视觉·学术研究与理论基础
pjj198541 天前
YOLO 目标检测算法系列梳理:从 V1 到 V5 的原理演进
算法·yolo·目标检测
爱吃火鸡面呀1 天前
YOLOv2、YOLOv3、YOLOv4、YOLOv5 全面对比与总结
yolo
SEO_juper2 天前
Go 站点地图生成器:从首页爬全站,一键生成 sitemap.xml
xml·开发语言·人工智能·golang·node.js·seo·外贸独立站
微尘hjx2 天前
【ByteTrack 04】多轨迹算法ByteTrack改进点
算法·yolo·目标检测·目标跟踪·bytetrack·ultralytics·车跟踪