使用Python将yolov5的推理保存的txt文本格式转换为XML格式

目标检测是计算机视觉中的基础任务,可以让机器在图像中识别和定位物体。为了高效地标注和存储目标检测数据,我们使用了各种不同的数据格式。其中一种常用的格式是XML结构,通常用于VOC数据集格式。在本文中,我们将探讨一个Python脚本,它可以将目标检测标注从特定的文本文件格式转换为XML格式。

问题描述

假设您有一个图像数据集,同时还有相应的文本文件,其中包含目标检测的标注信息。每个文本文件都提供了有关图像中存在的物体的信息。例如,在每个文本文件中,每行可能包含物体类别、边界框坐标等信息。然而,您希望将这些标注信息转换为XML格式,以便更好地组织和管理数据。

Python脚本实现

以下是一个使用Python编写的脚本,用于将目标检测标注从文本格式转换为XML格式:

# 导入所需库
import os
import cv2
import shutil
from xml.dom.minidom import Document# 定义物体类别
cls_names = ['人', '狗']def makexml(picPath, txtPath, xmlPath):# 删除已有的XML保存路径,并创建新的路径if os.path.exists(xmlPath):shutil.rmtree(xmlPath)os.makedirs(xmlPath)# 获取图片文件列表files = os.listdir(picPath)# 遍历每个图片文件for i, name in enumerate(files):ss = os.path.join(picPath, name)print(ss)img = cv2.imread(ss)Pheight, Pwidth, Pdepth = img.shape# 创建XML文档对象xmlBuilder = Document()annotation = xmlBuilder.createElement("annotation")  # 创建annotation标签xmlBuilder.appendChild(annotation)# 添加folder标签folder = xmlBuilder.createElement("folder")folderContent = xmlBuilder.createTextNode("VOC2007")folder.appendChild(folderContent)annotation.appendChild(folder)# 添加filename标签filename = xmlBuilder.createElement("filename")filenameContent = xmlBuilder.createTextNode(name)filename.appendChild(filenameContent)annotation.appendChild(filename)# 添加size标签size = xmlBuilder.createElement("size")width = xmlBuilder.createElement("width")widthContent = xmlBuilder.createTextNode(str(Pwidth))width.appendChild(widthContent)size.appendChild(width)height = xmlBuilder.createElement("height")heightContent = xmlBuilder.createTextNode(str(Pheight))height.appendChild(heightContent)size.appendChild(height)depth = xmlBuilder.createElement("depth")depthContent = xmlBuilder.createTextNode(str(Pdepth))depth.appendChild(depthContent)size.appendChild(depth)annotation.appendChild(size)# 读取对应的文本文件txt = os.path.join(txtPath, name[0:-3] + "txt")if not os.path.exists(txt):# 若文本文件不存在,则直接保存XML文件并处理下一张图片print(txt)f = open(os.path.join(xmlPath, name[0:-4] + '.xml'), 'w', encoding="utf-8")xmlBuilder.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='utf-8')f.close()continue# 若文本文件存在,则读取文本内容并添加相应的标签txtFile = open(txt)txtList = txtFile.readlines()for i in txtList:oneline = i.strip().split(" ")object = xmlBuilder.createElement("object")picname = xmlBuilder.createElement("name")nameContent = xmlBuilder.createTextNode(cls_names[int(oneline[0])])picname.appendChild(nameContent)object.appendChild(picname)# 添加pose、truncated、difficult等标签# 添加bndbox标签,并计算bounding box的坐标# 将以上标签添加至annotation标签下pose = xmlBuilder.createElement("pose")poseContent = xmlBuilder.createTextNode("Unspecified")pose.appendChild(poseContent)object.appendChild(pose)truncated = xmlBuilder.createElement("truncated")truncatedContent = xmlBuilder.createTextNode("0")truncated.appendChild(truncatedContent)object.appendChild(truncated)difficult = xmlBuilder.createElement("difficult")difficultContent = xmlBuilder.createTextNode("0")difficult.appendChild(difficultContent)object.appendChild(difficult)bndbox = xmlBuilder.createElement("bndbox")xmin = xmlBuilder.createElement("xmin")mathData = int(((float(oneline[1])) * Pwidth + 1) - (float(oneline[3])) * 0.5 * Pwidth)xminContent = xmlBuilder.createTextNode(str(mathData))xmin.appendChild(xminContent)bndbox.appendChild(xmin)ymin = xmlBuilder.createElement("ymin")mathData = int(((float(oneline[2])) * Pheight + 1) - (float(oneline[4])) * 0.5 * Pheight)yminContent = xmlBuilder.createTextNode(str(mathData))ymin.appendChild(yminContent)bndbox.appendChild(ymin)xmax = xmlBuilder.createElement("xmax")mathData = int(((float(oneline[1])) * Pwidth + 1) + (float(oneline[3])) * 0.5 * Pwidth)xmaxContent = xmlBuilder.createTextNode(str(mathData))xmax.appendChild(xmaxContent)bndbox.appendChild(xmax)ymax = xmlBuilder.createElement("ymax")mathData = int(((float(oneline[2])) * Pheight + 1) + (float(oneline[4])) * 0.5 * Pheight)ymaxContent = xmlBuilder.createTextNode(str(mathData))ymax.appendChild(ymaxContent)bndbox.appendChild(ymax)object.appendChild(bndbox)annotation.appendChild(object)# 保存生成的XML文件f = open(os.path.join(xmlPath, name[0:-4] + '.xml'), 'w', encoding="utf-8")xmlBuilder.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='utf-8')f.close()# 调用函数进行转换
makexml("../data/images/", "../runs/detect/exp19/labels/", "../data/all/annotations/")

结论

通过使用上述Python脚本,您可以将yolov5的推理保存的txt从文本格式转换为更为常见的XML格式,从而更好地管理和组织您的数据集。转换后的XML格式可以被广泛用于各种目标检测算法和数据处理工具中,为计算机视觉研究和应用提供便利。

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

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

相关文章

sed编辑器

sed:类似于vim,就是一个文本编辑器,按行来进行编辑和处理 grep,sed,awk:文本三剑客都是针对文件内容的行来进行处理 sed的主要作用就是对文本内容进行增删改查 sed可以支持正则表达式。支持扩展正则表达式 …

浏览器对跨域请求携带Cookie的方法

文章目录 一、前后端协商配置1.1 前端页面搭建1.2后端服务器搭建 二、配置允许跨域浏览器三、Chrome浏览器安装ModHeader插件 企业开发时会分开发环境、测试环境以及生产环境,但是有的企业开发只有真正发布到线上的生产环境的流程才会严格配置,有的项目开…

呼吸灯——FPGA

文章目录 前言一、呼吸灯是什么?1、介绍2、占空比调节示意图 二、系统设计1、系统框图2、RTL视图 三、源码四、效果五、总结六、参考资料 前言 环境: 1、Quartus18.0 2、vscode 3、板子型号:EP4CE6F17C8 要求: 将四个LED灯实现循环…

《深入理解计算机系统》(美)布赖恩特(Bryant,R.E.) 等

适合对象:对计算机感兴趣的朋友。 需要相关资料的可私信我。 持续更新中: 第一章:计算机系统漫游 主要知识点:解读全书结构框架,解释OS的原理和相关硬件软件。计算机系统是由硬件和系统软件组成,共同协作…

Linux小程序:倒计时和进度条

Linux小程序 在Linux中我们实现两个小程序来体会\r和\n的区别,以及缓冲区是什么? 文章目录 Linux小程序前言回车和换行的区别缓冲区 小程序的实现倒计时程序进度条程序 总结 前言 回车和换行的区别 对于 \r 和 \n 的理解: \n 表示换行且回…

Sentinel授权规则与规则持久化

🌳🌳🌳🌳🌳🌳🌳 学习授权规则前,先想想SpringCloud Gateway的黑白名单,请求过网关,gateway会去鉴权。但如果有人把微服务信息泄露出去了呢?此时微…

前端(八)——深入探索前端框架中的Diff算法:优化视图更新与性能提升

😊博主:小猫娃来啦 😊文章核心:深入探索前端框架中的Diff算法:优化视图更新与性能提升 文章目录 前端框架中的Diff算法概述vue和react框架的diff算法React的diff算法:Vue的diff算法: Diff算法在…

HTTP传输协议请求报文响应报文

一个完整的HTTP请求: 1 建立连接 -- 三次挥手 2 前端发送请求 3 后端返回响应 4 断开连接 -- 四次握手 一个完整的请求报文: 1 请求行 请求方式 例如get、post 请求路径 (请求url) 传输协议 2 请求头 一些本次请…

基于深度学习的高精度课堂人脸检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度课堂人脸检测系统可用于日常生活中或野外来检测与定位课堂人脸目标,利用深度学习算法可实现图片、视频、摄像头等方式的课堂人脸目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标…

C# 未提供必须形参对应的实参

这个问题是在写观察者模式中遇到的一个问题。 具体的代码可以到《设计模式(十五)之观察者模式》中下载,下边只是部分代码。 我在抽象类中定义了构造函数,代码如下: using System; using System.Collections.Generic;…

力扣75——双指针

总结leetcode75中双指针的算法题解题思路。 上一篇:力扣75——数组与字符串 以下代码大部分为本人所写,少部分为官方示例代码。 力扣75——双指针 1 移动零2 判断子序列3 K 和数对的最大数目4 盛最多水的容器1-4 解题总结 1 移动零 题目: 给…

设计模式-享元模式在Java中的使用示例-围棋软件

场景 享元模式 简介 当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题。 例如在一个文本字符串中存在很多重复的字符,如果每一个字符都用一个单独的对象来表示,将会占用 较多的内存空间…

【案例教程】基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用能力

Python是功能强大、免费、开源,实现面向对象的编程语言,能够在不同操作系统和平台使用,简洁的语法和解释性语言使其成为理想的脚本语言。除了标准库,还有丰富的第三方库,Python在数据处理、科学计算、数学建模、数据挖…

Vue中值的传递(父传子,子传父,子父同步)

1.父组件->子组件传递数据 ①父组件通过 v-bind: 属性绑定的形式,把数据传递给子组件 如果不需要动态绑定,则可以直接写number“张三” ②子组件中,通过props接收父组件传递过来的数据 2.子组件->父组件传递数据 1.在子组件中&#xf…

实现外部缓存-Redis

目录 实现 RedisTemplate RedisTemplate的序列化 RedisSerializer 创建Redis缓存配置类 测试使用 创建配置类 创建注解测试实体 创建配置文件 创建单元测试类进行测试 实现 RedisTemplate XXXTemplate 是 Spring 的一大设计特色,其中,RedisTe…

【基础算法】——双指针算法

文章目录 一、算法原理二、算法实战1. 力扣283 移动零2. 力扣1089 复写零3. 力扣15 三数之和4. 力扣18 四数之和 三、总结 一、算法原理 双指针算法是指在遍历对象的过程中不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(…

Tomcat服务器下载安装及配置教程(IDEA中使用Tomcat)

目录 友情提醒第一章、Tomcat下载与安装1.1)Tomcat介绍1.2)官网下载 第二章、Tomcat配置环境变量2.1)windows环境变量配置2.2)验证Tomcat配置是否成功2.3)报错解决 第三章、IDEA整合Tomcat3.1)打开IDEA开发…

【深度学习笔记】随机梯度下降法

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记,视频由网易云课堂与 deeplearning.ai 联合出品,主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习,视频的链接如下: 神经网络和…

springboot项目创建整个完成过程和注意事项

1:application.yml文件配置 server:port: 8088servlet:context-path: /test spring:datasource:name: text #????url: jdbc:mysql://localhost:3306/dsdd?serverTimezoneGMT&useUnicodetrue&characterEncodingutf-8&useSSLtrueusername: root #…

Rust 数据类型 之 结构体(Struct)

目录 结构体(Struct) 定义与声明 结构体定义 结构体实例 结构体分类 单元结构体(Unit Struct) 元组结构体(Tuple Struct) 具名结构体(Named Struct) 结构体嵌套 结构体方法…