【模式识别4】YOLO目标检测数据集xml格式转txt格式

news/2024/7/9 23:46:28 标签: YOLO, 目标检测, xml
xmlns="http://www.w3.org/2000/svg" style="display: none;">

YOLO目标检测数据集xml格式转txt格式

    • 1. 转换前的xml格式
    • 2. xml格式转txt格式代码
      • 2.1 源代码
      • 2.2 需要修改的地方
    • 3. 转换后的txt格式

代码资源:voc2txt.py

xml_5">1. 转换前的xml格式

如果我们使用LabelImg工具标注数据集,生成的xml文件如下:
在这里插入图片描述
xml中各标签含义:

  • <object>:检测的目标
  • <name>:检测对象 / 类别
  • <pose>:拍摄角度(Left:左//Right:右//Unspecified:未指明)
  • <truncated>:是否被截断(0 代表检测目标完整//1 代表检测目标被截断)
  • <difficult>:是否容易被检测(0 代表容易检测)
  • <bndbox> :bounding-box(包含左上角 x,y 坐标<xmin>、<ymin>和右下角 x,y 坐标<xmax>、<ymax>) (单位:像素)

xmltxt_15">2. xml格式转txt格式代码

2.1 源代码

# 导入相关库
import os
from lxml import etree
from tqdm import tqdm


def voc2txt():
    # 获取xml文件夹下的所有xml文件名,存入列表
    xmls_list = os.listdir(xmls_ori_path)
    for xml_name in tqdm(xmls_list):
        # 打开写入文件
        txt_name = xml_name.replace('xml', 'txt')

        f = open(os.path.join(txts_save_path, txt_name), 'w')  # 代开待写入的txt文件
        with open(os.path.join(xmls_ori_path, xml_name), 'rb') as fp:
            # 开始解析xml文件
            xml = etree.HTML(fp.read())
            width = int(xml.xpath('//size/width/text()')[0])
            height = int(xml.xpath('//size/height/text()')[0])
            # 获取对象标签
            obj = xml.xpath('//object')
            for each in obj:
                name = each.xpath("./name/text()")[0]
                classes = dic[name]
                xmin = int(each.xpath('./bndbox/xmin/text()')[0])
                xmax = int(each.xpath('./bndbox/xmax/text()')[0])
                ymin = int(each.xpath('./bndbox/ymin/text()')[0])
                ymax = int(each.xpath('./bndbox/ymax/text()')[0])
                # 归一化
                dw = 1 / width
                dh = 1 / height
                x_center = (xmin + xmax) / 2
                y_center = (ymax + ymin) / 2
                w = (xmax - xmin)
                h = (ymax - ymin)
                x, y, w, h = x_center * dw, y_center * dh, w * dw, h * dh
                # 写入
                f.write(str(classes) + ' ' + str(x) + ' ' + str(y) + ' ' + str(w) + ' ' + str(h) + ' ' + '\n')
        f.close()  # 关闭txt文件


if __name__ == '__main__':
    dic = {'zero': "0",  # 创建字典用来对类型进行转换
           'one': "1",   # 此处的字典要与自己的classes.txt文件中的类对应,且顺序要一致
           'two': "2",
           'three': "3",
           'four': "4",
           'five': "5",
           'six': "6",
           'seven': "7",
           'eight': "8",
           'nine': "9",
           }

    xmls_ori_path = r"xml"         # xml文件所在的文件夹
    txts_save_path = r"txt"         # txt文件所在的文件夹

    os.mkdir(txts_save_path) if not os.path.exists(xmls_ori_path) else None

    voc2txt()
    

2.2 需要修改的地方

  • 目标的类别
    LabelImg标注完会生成“classes.txt”,如下为真实类别名称,从上到下类别代号分别为0、1、2、…
    在这里插入图片描述
    因此,需要建立字典映射,将classes.txt的真实类别名称(如下左列)分别映射到代号0、1、2…(如下右列)
    在这里插入图片描述

  • 修改数据集路径
    修改为自己的xml文件夹路径以及保存的txt文件夹路径即可
    在这里插入图片描述

3. 转换后的txt格式

在这里插入图片描述
每行表示(类别,中心x相对坐标,中心y相对坐标,相对宽度、相对高度)


http://www.niftyadmin.cn/n/251312.html

相关文章

C++之深入解析std::thread的使用

一、C11 线程创建 每一个 C11 程序都包含一个主线程即 main() 函数&#xff0c;在 C11 中可以通过创建 std::thread 对象来创建新的线程&#xff0c;每个 std::thread 对象都可以与一个线程相关联。需要引用的头文件&#xff1a; #include <thread>二、std::thread 的构…

【超算/先进计算学习】日报3

目录 今日已完成任务列表遇到的问题及解决方案任务完成详细笔记作业管理系统 slurm作业管理系统及常用用户命令节点状态查询/作业提交命令作业队列查询/作业取消命令任务练习 调试器 GDB实时调试core 文件调试 对自己的表现是否满意简述下次计划其他反馈 今日已完成任务列表 4-…

操作系统基础知识介绍之PFP调度协议(包含时间分区PFP)

一、算法思想 PFP算法是一种在RTOS中实现抢占式固定优先级调度的方法。它的基本思想是&#xff1a; 对于每个任务&#xff0c;根据其最坏情况执行时间和截止时间&#xff0c;计算其优先级。 在运行时&#xff0c;根据任务的到达时间和优先级&#xff0c;将任务放入一个就绪队列…

springboot+vue幼儿园管理系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的幼儿园管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌…

Node第三方包 【mysql2】

文章目录 &#x1f31f;前言&#x1f31f;访问数据库&#x1f31f;MySQL驱动&#x1f31f;mysql2&#x1f31f;安装 &#x1f31f;方法&#x1f31f;连接数据库&#x1f31f;通过 query() 方法执行SQL语句&#x1f31f;通过 execute() 方法执行SQL语句 &#x1f31f;使用连接池…

STM32平衡小车 TB6612电机驱动学习

TB6612FNG简介 单片机引脚的电流一般只有几十个毫安&#xff0c;无法驱动电机&#xff0c;因此一般是通过单片机控制电机驱动芯片进而控制电机。TB6612是比较常用的电机驱动芯片之一。 TB6612FNG可以同时控制两个电机&#xff0c;工作电流1.2A&#xff0c;最大电流3.2A。 VM电…

音视频开发开发核心知识+小白入门必看基础知识

音视频开发是一个广泛的领域&#xff0c;它涉及到多个技术领域&#xff0c;包括音频编解码、视频编解码、媒体容器格式、流媒体传输、音视频处理等。以下是音视频开发的一些基础知识&#xff1a; 音频编解码器&#xff1a;音频编解码器是将数字音频信号编码成一种压缩格式&…

ESP32设备驱动-LPS25H压阻式压力传感器驱动

LPS25H压阻式压力传感器驱动 文章目录 LPS25H压阻式压力传感器驱动1、LPS25H介绍2、硬件准备3、软件准备4、驱动实现1、LPS25H介绍 LPS25H 是一款超紧凑型绝对压阻式压力传感器。它包括一个单片传感元件和一个能够从传感元件获取信息并向外部世界提供数字信号的 I2C 接口。 传…