将.xml格式转换为YOLO所需的.txt文件格式

news2025/1/11 12:42:38

首先,原始的.xml数据集基础构成如下:

image目录结构如下:

label目录结构如下:

.xml内容如下:

之后修改代码如下:

import xml.etree.ElementTree as ET
import os, cv2
import numpy as np
from os import listdir
from os.path import join
from tqdm import tqdm
classes = []

# 这个函数接收图像尺寸和一个边界框坐标,然后将边界框的坐标转换为相对于图像尺寸的比例值。
# 这是YOLO模型所需要的格式,其中(x, y)是边界框中心点的位置,(w, h)是边界框的宽度和高度,所有值都在0到1之间。
def convert(size, box):
    dw = 1. / (size[0])  # 图像高度的倒数
    dh = 1. / (size[1])  # 图像高度的倒数
    x = (box[0] + box[1]) / 2.0 - 1  # 计算边界框中心点的 x 坐标
    y = (box[2] + box[3]) / 2.0 - 1  # 计算边界框中心点的 y 坐标
    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)


def convert_annotation(xmlpath, xmlname):
    # 打开XML文件以读取内容
    with open(xmlpath, "r", encoding='utf-8') as in_file:
        # 将XML文件名转换为对应的TXT文件名
        txtname = xmlname[:-4] + '.txt'
        # 构建TXT文件的完整路径
        txtfile = os.path.join(txtpath, txtname)

        # 解析XML文件
        tree = ET.parse(in_file)
        root = tree.getroot()  # 获取XML文档的根节点

        # 从XML中获取图像文件名
        filename = root.find('filename')

        # np.fromfile 方法从文件系统中读取图像数据,返回一个 NumPy 数组
        # 使用 OpenCV 的 imdecode 函数将图像数据解码为图像,cv2.IMREAD_COLOR 表示以彩色模式加载图像
        img = cv2.imdecode(np.fromfile('{}/{}.{}'.format(imgpath, xmlname[:-4], postfix), np.uint8), cv2.IMREAD_COLOR)
        h, w = img.shape[:2]

        res = []  # 初始化结果列表

        # 遍历XML中的每个对象
        for obj in root.iter('object'):
            cls = obj.find('name').text  # 获取对象的类别名称
            # 如果类别还未记录,则添加到全局类别列表中
            if cls not in classes:
                classes.append(cls)
            # 获取类别的索引
            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))
            # 调用convert函数,将边界框坐标转换为YOLO格式
            bb = convert((w, h), b)
            # 将类别ID和边界框信息组合成字符串,并添加到结果列表中
            res.append(str(cls_id) + " " + " ".join([str(a) for a in bb]))

        # 如果有对象被检测到,则将结果写入TXT文件
        if len(res) != 0:
            with open(txtfile, 'w+') as f:
                f.write('\n'.join(res))


if __name__ == "__main__":
    postfix = 'bmp'  # 设置图像文件的扩展名
    imgpath = r'C:\Users\guest_7\Desktop\fsdownload\data\04_color\04_datasets\image'  # 设置图像文件路径
    xmlpath = r'C:\Users\guest_7\Desktop\fsdownload\data\04_color\04_datasets\label'  # 设置 XML 标注文件路径
    txtpath = r'C:\Users\guest_7\Desktop\fsdownload\data\04_color\04_datasets\txt1'   # 设置输出的 TXT 文件路径

    # 检查输出路径是否存在,如果不存在则创建
    if not os.path.exists(txtpath):
        os.makedirs(txtpath, exist_ok=True)

    list = os.listdir(xmlpath)  # 获取 XML 文件列表
    error_file_list = []  # 初始化错误文件列表

    # 遍历 XML 文件列表
    for i in tqdm(range(0, len(list))):
        try:
            # 构建 XML 文件的完整路径
            path = os.path.join(xmlpath, list[i])
            # 检查文件是否为 XML 格式
            if ('.xml' in path) or ('.XML' in path):
                convert_annotation(path, list[i])
                print(f'file {list[i]} convert success.')
            else:
                print(f'file {list[i]} is not xml format.')
        except Exception as e:
            # 捕获并处理任何异常
            print(f'file {list[i]} convert error.')
            print(f'error message:\n{e}')
            # 将发生错误的文件添加到错误文件列表中
            error_file_list.append(list[i])

    print(f'this file convert failure\n{error_file_list}')  # 打印转换失败的文件列表
    print(f'Dataset Classes:{classes}')   # 打印数据集中的所有类别

代码加了很详细的注释,应该都能看懂。

大家转换的时候,只需要修改图像文件扩展名和三个路径。
修改部分如下:

if __name__ == "__main__":
    postfix = 'bmp'  # 设置图像文件的扩展名
    imgpath = r'C:\Users\guest_7\Desktop\fsdownload\data\04_color\04_datasets\image'  # 设置图像文件路径
    xmlpath = r'C:\Users\guest_7\Desktop\fsdownload\data\04_color\04_datasets\label'  # 设置 XML 标注文件路径
    txtpath = r'C:\Users\guest_7\Desktop\fsdownload\data\04_color\04_datasets\txt1'   # 设置输出的 TXT 文件路径

最后结果如下:

.txt内容如下:

到这边就没问题了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2097773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习(西瓜书)第 3 章 线性模型

3.1 基本形式 例如若在西瓜 问题中学得“/好瓜⑺- 0.2 • n色泽 0.5 •/根蒂 0.3 •力敲声 1”,则意味着可 通过综合考虑色泽、根蒂和敲声来判断瓜好不好,其中根蒂最要紧,而敲声比 色泽更重要. 本章介绍几种经典的线性模型.我们先从回归任务…

为什么正午选她演大女主戏?看到殷桃这个片段,我全懂了

最近小编听说正午的最新力作《凡人歌》要上了,而且女主还是我特别喜欢的殷桃,赶紧马不停蹄的去追剧,结果狠狠爱上了殷桃的演技! 剧里殷桃饰演的沈琳是一位家庭主妇,她以为她放弃了工作,做家庭主妇&#xff…

你还在为编程效率低下而烦恼吗?编程界的神级辅助!一键解锁高效编程模式,让你的工作效率飙升不止一倍!

哪个编程工具让你的工作效率翻倍? 第一章 引言 在软件开发领域,编程工具的重要性不言而喻。它们不仅能够加速开发过程,还能提高代码质量,从而显著提升开发人员的工作效率。随着技术的不断进步,越来越多的编程工具涌现…

多头切片的关键:Model 类 call解释;LlamaModel 类 call解释;多头切片的关键:cache的数据拼接

目录 Model 类 call解释 LlamaModel 类 call解释 方法签名 方法体 总结 Model 类 call解释 这段代码定义了一个特殊的方法 __call__,它是Python中的一个魔术方法(magic method),允许类的实例像函数那样被调用。在这个上下文中,这个方法很可能被定义在一个封装了某种…

java宠物商城网站系统的设计与实现

springboot508基于Springboot宠物商城网站系统 题目:宠物商城网站系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往…

算法图解(1)

配套代码: https://github.com/egonSchiele/grokking_algorithms?tabreadme-ov-filehttps://github.com/egonSchiele/grokking_algorithms?tabreadme-ov-file 理论 数据结构:组织和存储数据的方式,影响程序的性能和存储效率 算法&#…

OpenHarmony使用ArkUI Inspector分析布局

● 摘要:视图的嵌套层次会影响应用的性能,开发者应该移除多余的嵌套层次,缩短组件刷新耗时。本文会介绍如何使用ArkUI Inspector工具分析布局,提示应用响应性能。 ● 关键字:列举本文相关的关键字:OpenHar…

Linux防火墙问题排查记录

问题描述 在业务当中,开通了防火墙,导致外部数据无法通过SFTP服务访问本机的服务,根据防火墙策略判断,应该是有一些IP没有被加进accept策略导致的,所以需要查看防火墙日志来追溯哪些IP被过滤掉了,只要放通…

开学了 需要考研的同学快看过来!考研倒计时你的鞭策神器!

开学了 需要考研的同学快看过来!考研倒计时你的鞭策神器! 2025年考研准备又要开始了,考试科目包括思想政治理论、管理类联考综合能力、外国语、业务课一、业务课二等。考研初试是每位考生迈向研究生阶段的重要一步,希望考生在考试…

python+requests 搭建接口自动化测试框架【超详细】

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、前言 Python是一种简单易学、功能强大的编程语言,广泛应用于各种软件开发和测试场景中。requests是Python中流行的HTTP库,支持发送…

windows下安装elasticSearch和kibana

下载es 下载地址官网 下载后是个压缩包(elasticsearch-8.15.0-windows-x86_64),解压即可 启动 配置 改一下 /conf/jvm.options文件,最后加一行编码配置,这个是为了启动后防止控制台乱码 -Dfile.encodingGBK启动es 依赖jdk8环境&#xf…

Qt中的父窗口子窗口和父类子类的区别

好多人在开发初期,往往将父子窗口和父子类搅在一起容易搞混。 今天借着这篇文章给大家分辨一下。 C中我们常说子类继承自父类,子类具有父类所有的特性和功能。所以父类和子类是继承关系。 而子窗体和父窗体,不是继承关系,准确地讲…

安卓13拦截home功能 监听home键 禁用home键

总纲 android13 rom 开发总纲说明 目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 经常遇

数据结构与算法的代码实现(C++版)

数据结构与算法的代码实现(C版) 1. 线性表的顺序表示和实现1.1 线性表的初始化1.2 线性表的销毁1.3 线性表的清空1.4 线性表的长度1.5 判断线性表是否为空1.6 线性表的线性表取值1.7 线性表的顺序查找1.8 线性表的插入1.9 线性表的删除总结 2. 线性表的链…

EPLAN如何在插入设备的时候修改部件的数据?

EPLAN如何在插入设备的时候修改部件的数据? 默认情况下,插入部件的时候,部件的数据是无法更改的,那么如何设置在插入部件的时候对部件的数据进行修改呢? 具体可参考以下内容: 设置完成后,点击右…

QT实现简易记事本

QT的Qmainwindow实现简易记事本,不带有UI界面。 1、功能展示 1、编辑文件时,文件名左上角有个“*”,代表文件未保存 2、菜单栏有文件、编辑的选项 3、工具栏有保存、新建、打开、调节字体、调节颜色。 4、文件菜单中有,新建,保存、打开、…

【C语言从不挂科到高绩点】06-流程控制语句-循环语句

Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程 本套课程将会从0基础讲解C语言核心技术,适合人群: 大学中开设了C语言课程的同学想要专升本或者考研的…

2024测试开发必知必会:Pytest框架实战!

应用场景: pytest 框架可以解决我们多个测试脚本一起执行的问题。 它提供了测试用例的详细失败信息,使得开发者可以快速准确地改正问题。它兼容最新版本的 Python。它还兼容 unittest、doctest 和 nose,开箱即用。接下来我们详细了解下pyte…

LLM与知识图谱

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

昆仑山矿泉水《大湾区旅行者》正式开机,携手共赴一场净化心灵之旅

在这个快节奏的时代,我们总在寻找一片能让心灵得以栖息的地方。今年,昆仑山矿泉水与深圳卫视再度携手,推出充满人文温情与自然探索的慢生活旅行综艺《大湾区旅行者》,目前已于8月29日开机启航。本次旅行,昆仑山矿泉水与…