如何将xml格式转换为yolov5所需的txt格式

        如今,深度学习非常热门,制作数据集是深度学习很重要的一环。制作数据集就离不开打标签,我们打出来的标签可能是 txt 格式 或者 xml 格式 或者json格式,但是yolo运行的标签格式是txt格式

       所以我们要将 xml 格式转换为 txt 格式 这个转换代码生成的txt文件是归一化后的,非常便捷

       以下代码就可以轻松将 xml 格式转换为 txt 格式。


      首先我们先来看一下xml文件内容

<annotation>
	<folder>锥桶</folder>
	<filename>29ba657e829a0ba447004b7ffd9b19fe.jpeg</filename>
	<path>G:\锥桶\29ba657e829a0ba447004b7ffd9b19fe.jpeg</path>
	<source>
		<database>Unknown</database>
	</source>
	<size>
		<width>550</width>
		<height>300</height>
		<depth>3</depth>
	</size>
	<segmented>0</segmented>
	<object>
		<name>zhuitong</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>37</xmin>
			<ymin>206</ymin>
			<xmax>77</xmax>
			<ymax>272</ymax>
		</bndbox>

我们来读一下这个xml文件核心内容

xmin ymin xmax ymax 这四个值代表了这个图像中的矩形框的位置 并且给这个位置取名为zhuitong 举个例子 一张有着可爱猫咪的图片 我们用框框把猫咪框起来 并且命名这个框为 猫咪

计算机就知道这个地方有个猫咪了

其次 我们来看一下转换的代码

import xml.etree.ElementTree as ET

import pickle
import os
from os import listdir , getcwd
from os.path import join
import glob

classes = ["cone tank", "water horse bucket"]

def convert(size, box):

    dw = 1.0/size[0]
    dh = 1.0/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_name):
    in_file = open('./indata/'+image_name[:-3]+'xml') #xml文件路径
    out_file = open('./labels/train/'+image_name[:-3]+'txt', 'w') #转换后的txt文件存放路径
    f = open('./indata/'+image_name[:-3]+'xml')
    xml_text = f.read()
    root = ET.fromstring(xml_text)
    f.close()
    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
        if cls not in classes:
            print(cls)
            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')

wd = getcwd()

if __name__ == '__main__':

    for image_path in glob.glob("./images/train/*.jpg"): #每一张图片都对应一个xml文件这里写xml对应的图片的路径
        image_name = image_path.split('\\')[-1]
        convert_annotation(image_name)

代码中有注释,大家自己理解一下哈

再给大家看一下我的文件结构

大家只要改三个路径 就能运行了

最终 给大家看一下生成的txt文件内容 

前面的0代表类别 举个例子 我们检测图片 里面有三个动物 分别是猫咪 狗狗 羊羊 那我们就把猫咪当作0 狗狗当作1 羊羊当作2 这样计算机很容易明白 0后面有四个数字 代表这个类别出现的位置,其实也就是矩形框

大功告成啦!

如果对你有帮助的话 请动动你发财的小手给我点个赞!不懂的地方可以留言

如果你的数据集是json格式想转换txt格式的 可以看我另一篇博客

评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值