当前位置: 首页 > news >正文

【图像标签转换】XML转为TXT图像数据集标签

引言

该脚本用于将包含对象标注的 XML 文件转换为 YOLO(You Only Look Once)对象检测格式的 TXT 文件。脚本读取 XML 文件,提取对象信息,规范化边界框坐标,并将数据写入相应的 TXT 文件。此外,它还生成一个 classes.txt 文件,列出所有对象类别。

 效果:

环境和依赖

  • Python 3.x
  • 库:os, xml.etree.ElementTree

目录结构

  • 输入目录:包含对象标注的 XML 文件。
  • 输出目录:将包含转换后的 TXT 文件和 classes.txt 文件。

 

目录

1. 引入必要的库

 2. 定义输入和输出目录,以及类别列表

3. 获取所有 XML 文件的文件名

 4. 获取所有分类

5. 转换坐标到 YOLO 格式

6. 读取 XML 文件并转换为 TXT 文件

7. 主函数 

完整程序


1. 引入必要的库

  • os 用于处理文件和目录操作。
  • xml.etree.ElementTree 用于解析 XML 文件
import os
import xml.etree.ElementTree as ET

 2. 定义输入和输出目录,以及类别列表

input_dir = r'D:/lenovo/Archie/shujukuochongv1.0/xmlall1'
out_dir = r'D:/lenovo/Archie/shujukuochongv1.0/txtall1'
class_list = ['1','2','3','4','5','6','7','8','9']
  • input_dir 是存放 XML 文件的目录。
  • out_dir 是保存转换后 TXT 文件的目录。
  • class_list 是初始定义的类别名列表。

3. 获取所有 XML 文件的文件名

遍历输入目录,获取所有 XML 文件的文件名(不带扩展名)。

def file_name(input_dir):F = []for root, dirs, files in os.walk(input_dir):for file in files:if os.path.splitext(file)[1] == '.xml':t = os.path.splitext(file)[0]F.append(t)  # 将所有的文件名添加到 F 列表中return F  # 返回 F 列表

 4. 获取所有分类

解析每个 XML 文件,获取对象的类别,并添加到类别列表中(跳过 difficult 属性为 1 的对象)。

def get_class(filelist):for i in filelist:f_dir = input_dir + "\\" + i + ".xml"in_file = open(f_dir, encoding='UTF-8')filetree = ET.parse(in_file)in_file.close()root = filetree.getroot()for obj in root.iter('object'):difficult = obj.find('difficult').textcls = obj.find('name').textif cls not in class_list and int(difficult) == 0:class_list.append(cls)

5. 转换坐标到 YOLO 格式

 将 XML 文件中的像素坐标转换为 YOLO 格式的归一化坐标。

def ConverCoordinate(imgshape, bbox):xmin, xmax, ymin, ymax = bboxwidth = imgshape[0]height = imgshape[1]dw = 1. / widthdh = 1. / heightx = (xmin + xmax) / 2.0y = (ymin + ymax) / 2.0w = xmax - xminh = ymax - yminx = x * dwy = y * dhw = w * dwh = h * dhreturn x, y, w, h

6. 读取 XML 文件并转换为 TXT 文件

读取 XML 文件,提取目标信息,将其转换为 YOLO 格式,并写入 TXT 文件。

def readxml(i):f_dir = input_dir + "\\" + i + ".xml"txtresult = ''outfile = open(f_dir, encoding='UTF-8')filetree = ET.parse(outfile)outfile.close()root = filetree.getroot()size = root.find('size')width = int(size.find('width').text)height = int(size.find('height').text)imgshape = (width, height)for obj in root.findall('object'):obj_name = obj.find('name').textobj_id = class_list.index(obj_name)bbox = obj.find('bndbox')xmin = float(bbox.find('xmin').text)xmax = float(bbox.find('xmax').text)ymin = float(bbox.find('ymin').text)ymax = float(bbox.find('ymax').text)bbox_coor = (xmin, xmax, ymin, ymax)x, y, w, h = ConverCoordinate(imgshape, bbox_coor)txt = '{} {} {} {} {}\n'.format(obj_id, x, y, w, h)txtresult += txtwith open(out_dir + "\\" + i + ".txt", 'w+') as f:f.write(txtresult)

7. 主函数 

  • 获取 XML 文件列表。
  • 提取所有分类并打印。
  • 逐个将 XML 文件转换为 YOLO 格式的 TXT 文件。
  • 生成一个 classes.txt 文件,列出所有类别。
filelist = file_name(input_dir)
get_class(filelist)
print(class_list)for i in filelist:readxml(i)with open(out_dir + "\\classes.txt", 'a') as f:classresult = '\n'.join(class_list) + '\n'f.write(classresult)

完整程序

该脚本用于将 XML 文件中的对象标注转换为 YOLO 格式的 TXT 文件,并生成一个包含所有类别的 classes.txt 文件。通过这些步骤,可以方便地将标注数据用于 YOLO 模型的训练。

import os
import xml.etree.ElementTree as ET# xml文件存放目录(不要以\结尾)
input_dir = r'D:/lenovo/Archie/shujukuochongv1.0/xmlall1'# 输出txt文件目录(不要以\结尾)
out_dir = r'D:/lenovo/Archie/shujukuochongv1.0/txtall1'
#类别名
class_list = ['1','2','3','4','5','6','7','8','9']# 获取目录所有xml文件
def file_name(input_dir):F = []for root, dirs, files in os.walk(input_dir):for file in files:# print file.decode('gbk')    #文件名中有中文字符时转码if os.path.splitext(file)[1] == '.xml':t = os.path.splitext(file)[0]F.append(t)  # 将所有的文件名添加到L列表中return F  # 返回L列表# 获取所有分类
def get_class(filelist):for i in filelist:f_dir = input_dir + "\\" + i + ".xml"in_file = open(f_dir, encoding='UTF-8')filetree = ET.parse(in_file)in_file.close()root = filetree.getroot()for obj in root.iter('object'):difficult = obj.find('difficult').textcls = obj.find('name').textif cls not in class_list or int(difficult) == 1:class_list.append(cls)def ConverCoordinate(imgshape, bbox):# 将xml像素坐标转换为txt归一化后的坐标xmin, xmax, ymin, ymax = bboxwidth = imgshape[0]height = imgshape[1]dw = 1. / widthdh = 1. / heightx = (xmin + xmax) / 2.0y = (ymin + ymax) / 2.0w = xmax - xminh = ymax - ymin# 归一化x = x * dwy = y * dhw = w * dwh = h * dhreturn x, y, w, hdef readxml(i):f_dir = input_dir + "\\" + i + ".xml"txtresult = ''outfile = open(f_dir, encoding='UTF-8')filetree = ET.parse(outfile)outfile.close()root = filetree.getroot()# 获取图片大小size = root.find('size')width = int(size.find('width').text)height = int(size.find('height').text)imgshape = (width, height)# 转化为yolov的格式for obj in root.findall('object'):# 获取类别名obj_name = obj.find('name').textobj_id = class_list.index(obj_name)# 获取每个obj的bbox框的左上和右下坐标bbox = obj.find('bndbox')xmin = float(bbox.find('xmin').text)xmax = float(bbox.find('xmax').text)ymin = float(bbox.find('ymin').text)ymax = float(bbox.find('ymax').text)bbox_coor = (xmin, xmax, ymin, ymax)x, y, w, h = ConverCoordinate(imgshape, bbox_coor)txt = '{} {} {} {} {}\n'.format(obj_id, x, y, w, h)txtresult = txtresult + txt# print(txtresult)f = open(out_dir + "\\" + i + ".txt", 'w+')f.write(txtresult)f.close()# 获取文件夹下的所有文件
filelist = file_name(input_dir)# 获取所有分类
get_class(filelist)# 打印class
print(class_list)# xml转txt
for i in filelist:readxml(i)# 在out_dir下生成一个class文件
f = open(out_dir + "\\classes.txt", 'a')
classresult = ''
for i in class_list:classresult = classresult + i + "\n"
f.write(classresult)
f.close()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何预防网站爬虫攻击
  • SQL39道常见题型
  • 【微信小程序实战教程】之微信小程序原生开发详解
  • el-date-picker 时间控件校验选择时间必须早于当前时间(带时分秒)
  • CSS常见属性详解——内边距与外边距
  • 今日份感悟
  • 智慧工地视频汇聚管理平台:打造现代化工程管理的全新视界
  • Qt 使用视口和窗口作图
  • Windows本地启动Redis
  • Linux——管理本地用户和组(详细介绍了Linux中用户和组的概念及用法)
  • 上传项目到GitHub
  • 数据结构:二叉搜索树(简单C++代码实现)
  • 代码随想录day23 ||39组合总和1 40组合总和2 131分割回文串
  • dynslam的安装
  • 【GoF23种设计模式+简单工厂模式】
  • css系列之关于字体的事
  • echarts花样作死的坑
  • javascript面向对象之创建对象
  • PhantomJS 安装
  • python3 使用 asyncio 代替线程
  • Service Worker
  • 笨办法学C 练习34:动态数组
  • 当SetTimeout遇到了字符串
  • 浮动相关
  • - 概述 - 《设计模式(极简c++版)》
  • 规范化安全开发 KOA 手脚架
  • 学习ES6 变量的解构赋值
  • 学习使用ExpressJS 4.0中的新Router
  • ionic入门之数据绑定显示-1
  • 选择阿里云数据库HBase版十大理由
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • # C++之functional库用法整理
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (04)odoo视图操作
  • (AngularJS)Angular 控制器之间通信初探
  • (C11) 泛型表达式
  • (Python) SOAP Web Service (HTTP POST)
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)计算机毕业设计ssm电影分享网站
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (转载)虚函数剖析
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .net连接oracle数据库
  • .Net中的设计模式——Factory Method模式
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @WebServiceClient注解,wsdlLocation 可配置
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色