yolo图像检测数据集格式转换:xml 与 txt格式相互转换

2023-05-16

格式介绍

在这里插入图片描述
一图流介绍的比较详细,一般图像检测数据集格式为txt或者xml格式,在使用labelimg进行标注的时候,可以设置获得不同格式的数据集,以满足不同算法训练格式要求:
在这里插入图片描述
一般建议使用pascalVoc:即PASCAL VOC数据集格式,关于该数据集的参见:PASCAL VOC
因为这样的数据方便在标注软件中看到对应的框;

xml转txt

对于xml格式数据集,如果要用yolo对其进行使用时候,先将其转化为txt格式,再进行训练,转换代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import copy
from lxml.etree import Element, SubElement, tostring, ElementTree

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

classes = ["0", "1", "2", "3"]  # 类别

CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))


def convert(size, box):
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    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(image_id):
    in_file = open('./label_xml\%s.xml' % (image_id), encoding='UTF-8')

    out_file = open('./label_txt\%s.txt' % (image_id), 'w')  # 生成txt格式文件
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    for obj in root.iter('object'):
        cls = obj.find('name').text
        # print(cls)
        if cls not in classes:
            continue
        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))
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

xml_path = os.path.join(CURRENT_DIR, './label_xml/')

# xml list
img_xmls = os.listdir(xml_path)
for img_xml in img_xmls:
    label_name = img_xml.split('.')[0]
    print(label_name)
    convert_annotation(label_name)

txt转xml

txt格式的数据不方便进行一些数据增强操作,可以先将其转换成xml格式后再进行相关标注工作或者
增强操作;

#!/user/bin/env python3
# _*_ coding:utf-8 -*_
# using: 将yolo txt label 转换成xml标签

from xml.dom.minidom import Document
import os
import cv2

def makexml(txtPath, xmlPath, picPath):  # 读取txt路径,xml保存路径,数据集图片所在路径
        dict = {'0': "0",  # 字典对类型进行转换
                '1': "1",
                '2': "2",
                '3': "3"}
        files = os.listdir(txtPath)
        for i, name in enumerate(files):
          xmlBuilder = Document()
          annotation = xmlBuilder.createElement("annotation")  # 创建annotation标签
          xmlBuilder.appendChild(annotation)
          txtFile=open(txtPath+name)
          txtList = txtFile.readlines()
          img = cv2.imread(picPath+name[0:-4]+".jpg")
          Pheight, Pwidth, Pdepth=img.shape
          flag = 0
          for i in txtList:
          	 flag += 1
             oneline = i.strip().split(" ")
             folder = xmlBuilder.createElement("folder")  # folder标签
             folderContent = xmlBuilder.createTextNode("VOC2007")
             folder.appendChild(folderContent)
             annotation.appendChild(folder)
             if flag == 1:
             	filename = xmlBuilder.createElement("filename")  # filename标签
             	filenameContent = xmlBuilder.createTextNode(name[0:-4]+".jpg")
             	filename.appendChild(filenameContent)
             	annotation.appendChild(filename)

             	size = xmlBuilder.createElement("size")  # size标签
             	width = xmlBuilder.createElement("width")  # size子标签width
             	widthContent = xmlBuilder.createTextNode(str(Pwidth))
             	width.appendChild(widthContent)
             	size.appendChild(width)
             	height = xmlBuilder.createElement("height")  # size子标签height
             	heightContent = xmlBuilder.createTextNode(str(Pheight))
             	height.appendChild(heightContent)
             	size.appendChild(height)
             	depth = xmlBuilder.createElement("depth")  # size子标签depth
             	depthContent = xmlBuilder.createTextNode(str(Pdepth))
             	depth.appendChild(depthContent)
             	size.appendChild(depth)
             	annotation.appendChild(size)

             object = xmlBuilder.createElement("object")
             picname = xmlBuilder.createElement("name")
             nameContent = xmlBuilder.createTextNode(dict[oneline[0]])
             picname.appendChild(nameContent)
             object.appendChild(picname)
             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)

          f = open(xmlPath+name[0:-4]+".xml", 'w')
          xmlBuilder.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='utf-8')
          f.close()


makexml("./label_txt/","./label_xml/","./image/")

其中:

  • label_txt: 存放txt格式的文件
  • label_xml: 存放xml格式的文件
  • image: 存放本地图片

参考

  • https://arleyzhang.github.io/articles/1dc20586/
  • https://zhuanlan.zhihu.com/p/58392978
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

yolo图像检测数据集格式转换:xml 与 txt格式相互转换 的相关文章

随机推荐

  • log4net(winform)使用方法

    前言 xff1a log4net是 Net下一个非常优秀的开源日志记录组件 log4net记录日志的功能非常强大 它可以将日志分不同的等级 xff0c 以不同的格式 xff0c 输出到不同的媒介 第一步 xff1a 引入组件 xff1a 引
  • cefsharp111.2.20(winform)版本体验

    第一步 xff1a 更新步骤 xff1a 先下载再本地更新会快一点 https globalcdn nuget org packages cefsharp winforms 111 2 20 nupkg https globalcdn nu
  • CefSharp.WinForms 112.2.70最新版体验

    一 准备 下载最新包及依赖包 对应 NET4 5 2 后续版本可能4 6 2 到packages中 本地升级更快 NuGet Gallery CefSharp WinForms 112 2 70 NuGet Gallery CefSharp
  • VUE3(.NET6)管理后台

    基于Admin NET框架 xff0c 预览下效果 内置功能 主控面板 xff1a 控制台页面 xff0c 可进行工作台 xff0c 分析页 xff0c 统计等功能的展示 用户管理 xff1a 对企业用户和系统管理员用户的维护 xff0c
  • 2011年养成的一个工作习惯

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 有一句名言 xff0c 没有记录的公司 xff0c 迟早要垮掉的 xff0c 多么尖锐 个人也不是如此吗 xff1f 在下半年 xff0c
  • Cefsharp.WinForms-v112.3.0 带您最新版体验(小更新)

    一 准备 下载最新包及依赖包 对应 NET4 5 2 后续版本可能4 6 2 到packages中 本地升级更快 NuGet Gallery CefSharp WinForms 112 3 0 NuGet Gallery CefSharp
  • 无人机飞行控制算法、控制律设计软件与半物理仿真

    工业级多功能可编程飞行控制系统专业的图形化控制律设计软件灵活强大的工程应用开发平台DSP处理器及高精度传感器自定义高速遥测数据采集嵌入式半物理仿真系统丰富的用户设备接口适用于固定翼 旋翼机 特殊飞行器 车船艇 机器人 云台等 概 述 xff
  • 程序调试记录

    最近把师兄的程序在万兆网络上进行测试 xff0c 现在把调试中出现的问题进行记录 xff1a 1 xff09 其中一共是十六块板子 xff0c 板子的配置文件是sipixel xml xff0c 每块板子的配置信息里都有对应的IP xff0
  • 华清远见嵌入式学习day27——编译工具和环境搭建

    0 系统移植四天课程安排 1 编译工具 xff0c 环境搭建 2 bootloader 3 kernel 4 文件系统 1 嵌入式系统的应用领域 1 军事 2 医疗 3 移动设备 4 家电 5 工控 2 什么是嵌入式系统 一般的定义 xff
  • tf.Variable函数的用法

    tf Variable xff08 initializer xff0c name xff09 xff1a initializer是初始化参数 xff0c 可以有tf random normal xff0c tf constant xff0c
  • Docker入门操作+文件备份

    文件备份操作 bin sh it is a shell script which provides function of auto backup ecology logfiles regularly by 494389 date 61 9
  • Qnap Docker(Container Station)更改国内镜像源

    0x01qpkg环境 通常qnap市场中下载的qpkg应用 xff0c 其环境变量就在自己的包环境中 所以要修改系统中的配置 xff0c 通常需要修改qpkg应用中对应的配置 即 share CACHEDEV1 DATA qpkg xxx
  • docker源码编译(containerd+runc源码编译)

    目录 源码下载docker cli docker enginebugsgo get timeoutdebian超时git clone TLS containerd源码编译runc源码编译docker 43 containerd 43 run
  • ros中激光雷达的消息类型(sensor_msgs/LaserScan Message)说明

    最近在做一些视觉和激光数据融合的项目 xff0c 但是对激光数据的结构不是太了解 xff0c 因此查了很多相关的内容 xff0c 记录以下 下图是在http wiki ros org中截取的图片 xff1a Header 是一个结构体 xf
  • Linux下安装常见的configure错误列表

    Linux下安装常见的configure错误列表 标签 xff1a linux nginx configure 安装 错误 it 附一些常见的configure错误列表供参考 configure error No curses termca
  • 世界上不存在完美的人性

    白夜追凶 观后感 作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 前几天看了克里斯多福 诺兰导演的惊悚电影 白夜追凶 剧情大致如下 xff1a 威尔 多莫 xff08 阿尔 帕西诺饰 x
  • k210-arduino深度学习视觉机械臂抓取

    一 arduino对机械臂的基础控制 1 首先实现arduino对机械臂的控制 xff08 点动和自动 xff09 xff0c 六个轴分别定义为xyzjkl 点动 xff1a 点动方式为按一下对应按键使对应轴正转或反转3度 xff0c 此方
  • stm32串口助手配置步骤

    串口设置的一般步骤可以总结为如下几个步骤 xff1a 1 串口时钟使能 xff0c GPIO 时钟使能 2 设置引脚复用器映射 xff1a 调用 GPIO PinAFConfig 函数 3 GPIO 初始化设置 xff1a 要设置模式为复用
  • linux查看新增串口、USB设备,Minicom + Usb转串口

    查看新增串口 USB设备 注意 xff1a 虚拟机环境下的ubuntu默认情况下是不能自动识别的 xff0c 需要在虚拟机窗口右下角点击 34 Prolific USB Serial Controller 34 xff0c 然后选择 34
  • yolo图像检测数据集格式转换:xml 与 txt格式相互转换

    格式介绍 一图流介绍的比较详细 xff0c 一般图像检测数据集格式为txt或者xml格式 xff0c 在使用labelimg进行标注的时候 xff0c 可以设置获得不同格式的数据集 xff0c 以满足不同算法训练格式要求 xff1a 一般建