VOC格式转YOLO格式,xml文件转txt文件简单通用代码

目录

前言

思路介绍

代码

完整代码

拓展代码


前言

        很多人在进行目标检测训练时习惯将得到的数据标注为XML文件的VOC格式,或者在网上获取的数据集被标注为XML文件,但是不同的标注工具进行的标注会产生不同的标注xml文件,这里我写了一种通用的针对含有最基本图片和标注坐标信息的xml进行转换,在这里简单介绍并分享出来

思路介绍

        xml文件中最基本需要含有的信息为size,object下的name和bndbox,具体示例如下图(如果xml文件中没有size也就是图片的宽和高则需要单独对每个图片进行读取,感兴趣可以私聊,这里不展开介绍)

 

        可以看到这几个标签下包含了标注的全部信息,接着进行转换

代码

        核心代码为,提取所需要的信息

size = root.find('size')
width = int(size.find('width').text)
height = int(size.find('height').text)
# 存储name和对应的归一化坐标
objects = []
# 遍历XML中的object标签
for obj in root.findall('object'):name = obj.find('name').textif name in category_to_index:category_index = category_to_index[name]else:continue  # 如果name不在指定类别中,跳过该objectbndbox = 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)

        归一化代码如下,这也是YOLO格式的通用归一化代码

x_center = (xmin + xmax) / 2.0
y_center = (ymin + ymax) / 2.0
w = xmax - xmin
h = ymax - yminx = x_center / width
y = y_center / height
w = w / width
h = h / height

        这里最下边四行代码即为txt中每一行后四位数字

完整代码

        完整代码如下

import os
import xml.etree.ElementTree as ET# 定义类别顺序
categories = ['eggplant']
category_to_index = {category: index for index, category in enumerate(categories)}# 定义输入文件夹和输出文件夹
input_folder = r'D:\Annotations'  # 替换为实际的XML文件夹路径
output_folder = r'D:\labels'  # 替换为实际的输出TXT文件夹路径# 确保输出文件夹存在
os.makedirs(output_folder, exist_ok=True)# 遍历输入文件夹中的所有XML文件
for filename in os.listdir(input_folder):if filename.endswith('.xml'):xml_path = os.path.join(input_folder, filename)# 解析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)# 存储name和对应的归一化坐标objects = []# 遍历XML中的object标签for obj in root.findall('object'):name = obj.find('name').textif name in category_to_index:category_index = category_to_index[name]else:continue  # 如果name不在指定类别中,跳过该objectbndbox = 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)# 转换为中心点坐标和宽高x_center = (xmin + xmax) / 2.0y_center = (ymin + ymax) / 2.0w = xmax - xminh = ymax - ymin# 归一化x = x_center / widthy = y_center / heightw = w / widthh = h / heightobjects.append(f"{category_index} {x} {y} {w} {h}")# 输出结果到对应的TXT文件txt_filename = os.path.splitext(filename)[0] + '.txt'txt_path = os.path.join(output_folder, txt_filename)with open(txt_path, 'w') as f:for obj in objects:f.write(obj + '\n')

拓展代码

        这个代码类别还需要自己获取并填写,这里给出一种更简单的方法,可以省去填写标签列表的环节并且自动类别编号,完整代码如下

import os
import xml.etree.ElementTree as ET
names_set = set()input_folder = r'D:\Annotations'  # 替换为实际的XML文件夹路径
output_folder = r'D:\labels'  # 替换为实际的输出TXT文件夹路径for filename in os.listdir(input_folder):if filename.endswith('.xml'):tree = ET.parse(os.path.join(input_folder, filename))root = tree.getroot()for obj in root.findall('object'):name = obj.find('name').textnames_set.add(name)
# 输出所有的name
categories = []
for name in names_set:categories.append(name)
print(categories)category_to_index = {category: index for index, category in enumerate(categories)}
os.makedirs(output_folder, exist_ok=True)# 遍历输入文件夹中的所有XML文件
for filename in os.listdir(input_folder):if filename.endswith('.xml'):xml_path = os.path.join(input_folder, filename)# 解析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)# 存储name和对应的归一化坐标objects = []# 遍历XML中的object标签for obj in root.findall('object'):name = obj.find('name').textif name in category_to_index:category_index = category_to_index[name]else:continue  # 如果name不在指定类别中,跳过该objectbndbox = 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)# 转换为中心点坐标和宽高x_center = (xmin + xmax) / 2.0y_center = (ymin + ymax) / 2.0w = xmax - xminh = ymax - ymin# 归一化x = x_center / widthy = y_center / heightw = w / widthh = h / heightobjects.append(f"{category_index} {x} {y} {w} {h}")# 输出结果到对应的TXT文件txt_filename = os.path.splitext(filename)[0] + '.txt'txt_path = os.path.join(output_folder, txt_filename)with open(txt_path, 'w') as f:for obj in objects:f.write(obj + '\n')

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

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

相关文章

边缘混合计算智慧矿山视频智能综合管理方案:矿山安全生产智能转型升级之路

一、智慧矿山方案介绍 智慧矿山是以矿山数字化、信息化为前提和基础,通过物联网、人工智能等技术进行主动感知、自动分析、快速处理,实现安全矿山、高效矿山的矿山智能化建设。旭帆科技TSINGSEE青犀基于图像的前端计算、边缘计算技术,结合煤…

Java预约家政5.0服务本地服务源码(APP+小程序+公众号+H5)

预约家政本地服务平台系统:一站式解决家居需求🏠💼 一、引言:开启便捷家居新时代 在快节奏的现代生活中,我们渴望拥有更多的时间和精力去享受生活,而不是被繁琐的家务所困扰。预约家政本地服务平台系统应…

创意设计师,如何在AIGC时代寻找价值?

在当今AIGC(人工智能生成内容)时代,技术的浪潮席卷了各个行业,创意设计领域也不例外。对于创意设计师来说,这既是一个充满挑战的时代,也是一个蕴藏无限机遇的时代。在这个时代背景下,如何寻找并…

MindSpore中NumPy变量转换为Tensor张量使用的Tensor.from_numpy()函数到底是深拷贝还是浅拷贝

在NumPy转换为Tensor使用的Tensor.from_numpy()函数到底是深拷贝还是浅拷贝 使用Tensor()将NumPy变量转换为Tensor变量。 类似数组转换张量的方法 n np.ones(5) t Tensor.from_numpy(n) print(f"t: {t}", type(t)) np.add(n, 1, outn) print(f"n: {n}"…

PHP 界的扛把子 Swoole 异步通信利器

大家好,我是码农先森。 引言 我今天主要介绍的内容是包括但不仅限于 Swoole ,也有一部分 Go 语言的内容。 为什么要介绍 Swoole ? 先说一说背景吧,我们项目组之前要为《香港 01》开发一个积分系统的项目,这个系统的主要功能包…

做PPT时素材图片不清晰怎么办?

做 PPT 时,总会遇到很多尴尬事,比方说需要一张素材图,却怎么也下载不到高清的,这在现实生活中是经常会遇到的。那么遇到这种情况我们到底该如何处理?今天就教给大家几个方法,轻松应对素材图不清晰这个难题&…

内网一键部署k8s-kubeshpere,1.22.12版本

1.引言 本文档旨在指导读者在内网环境中部署 Kubernetes 集群。Kubernetes 是一种用于自动化容器化应用程序部署、扩展和管理的开源平台,其在云原生应用开发和部署中具有广泛的应用。然而,由于一些安全或网络限制,一些组织可能选择在内部网络…

python f.write中文乱码怎么解决

举个例子: #coding:utf-8 s u中文 f open("test.txt","w") f.write(s) f.close() 原因是编码方式错误,应该改为utf-8编码。 解决方案一: #coding:utf-8 s u中文 f open("test.txt","w") f.writ…

nacos在k8s上的集群安装实践

目录 概述实践nfs安装使用 k8s持久化nacos安装创建角色部署数据库执行数据库初始化语句部署nacos ingress效果展示 结束 概述 本文主要对 nacos 在k8s上的集群安装 进行说明与实践。主要版本信息,k8s: 1.27.x,nacos: 2.0.3。运行环境为 centos 7.x。 实…

消息队列MQ相关面试题

消息队列MQ相关面试题 1 RabbitMQ 1.1 你们项目中哪里用到了RabbitMQ ? 难易程度:☆☆☆ 出现频率:☆☆☆☆ 我们项目中很多地方都使用了RabbitMQ , RabbitMQ 是我们项目中服务通信的主要方式之一 , 我们项目中服务通信主要有二种方式实现 : 通过Fei…

大模型训练十大戒律!!

1.切勿微调(Thou Shalt Not Fine-Tune):尽量写prompt,利用大模型本身的能力zeroshot,必要时辅以少量样本(few-shot examples)或检索增强生成(RAG)。微调成本高、速度慢且…

苹果电脑安装双系统步骤 教你苹果电脑如何装双系统

许多人刚买来苹果电脑时,对苹果的IOS操作系统比较陌生,显得非常不适应,都会去想吧苹果电脑去安装一个自己熟悉的Windows系统,方便自己办公娱乐,那么苹果电脑安装双系统的步骤怎么样呢 小编给大家介绍下吧。 许多人刚买…

“ONLYOFFICE 8.1:提升用户体验和编辑功能的全面升级”

引言 官网链接 在当今快节奏的工作环境中,高效地处理文档是每个职场人士必备的技能。ONLYOFFICE 桌面编辑器凭借其强大的功能和用户友好的界面,成为了提升文档处理效率的得力助手。本文将介绍 ONLYOFFICE 桌面编辑器的核心特性,并展示如何通…

ElasticSearch8.X查询DSL语法案例进阶实战

什么是Query DSL Query DSL主要由两部分组成:查询和过滤。 查询部分:用于指定搜索条件和匹配规则。例如,可以使用match查询进行全文检索,term查询进行精确匹配,range查询进行范围匹配等。过滤部分:用于对查…

数据资产风险管理与合规性:全面识别、科学评估并有效应对数据风险,确保企业数据资产的安全性与合规性,为企业稳健发展提供坚实保障

一、引言 在数字化时代,数据资产已成为企业运营和决策的核心要素。然而,随着数据量的快速增长和技术的不断演进,数据资产面临的风险也日益增多,如数据泄露、数据篡改、数据滥用等。同时,数据保护法律法规的不断完善&a…

文华财经盘立方均线-支撑压力自动画线多空声音预警指标公式源码

文华财经盘立方多空均线-支撑压力自动画线指标公式源码: //MA5:MA(C,5); //MA10:MA(C,10); MA20:MA(C,20),COLORRED; MA60:MA(C,60),COLORGREEN; TY:CLOSE; HD:FILTER(BACKSET(FILTER(REF(TY,10)HHV(TY,2*101),10),101),10); LD:FILTER(BACKSET(FILTER(REF(T…

Java版小程序商城免费搭建-直播商城平台规划及常见营销模式解析

平台概述 1. 平台组成 管理平台:提供全方位的系统设置、数据统计、商家管理、订单管理等后台管理功能。商家端:支持PC端和移动端操作,便于商家进行商品管理、订单处理、营销活动设置等。买家平台:覆盖H5网页、微信公众号、小程序…

基于UDP的网络聊天室(多线程实现收和发消息)

要求&#xff1a;1.有新用户登录&#xff0c;其他在线的用户可以收到登录信息 2.有用户群聊&#xff0c;其他在线的用户可以收到群聊信息 3.有用户退出&#xff0c;其他在线的用户可以收到退出信息 4.服务器可以发送系统信息 效果图&#xff1a; service.c #include <head…

【unity笔记】八、Unity人物动画介绍

一、效果预览 本内容仅介绍为unity场景中的任务添加简单的动画效果。 二、小试牛刀 2.1 插件准备 在unity 中导入人物模型。常使用的免费人物模型和动画模型有Robot Kyle&#xff0c;Unity-Chan! Model&#xff0c;Basic Motions FREE。 其中Robot Kyle仅支持URP渲染。如…

Netdiscover基本使用 - 发现局域网中存活主机

目录 0x00 介绍0x01 常用参数0x02 常用方式1. 主动模式2. 被动模式 0x00 介绍 原理&#xff1a;是一个二层&#xff08;数据链路层&#xff09;的ARP发现工具&#xff0c;执行命令的时候可以通过Wireshark查看是基于arp协议的。在不使用DHCP的无线网络上非常有用。 作用&#…