分享一下xml标签文件转换成YOLOtxt文件的方法

有很多小伙伴使用YOLO进行一些目标检测、实例分割、分类等的任务,YOLO标签文件需要为txt文件,在网络上找数据集时很多都为jason文件和xml文件,这就限制了我们使用公开数据集的便利性。

jason转txt,可以看下如下文章

分享一下用YOLO进行实例分割时数据集jason转txt的方式_jason 转txt-CSDN博客

xml转txt

首先看一下xml文件在pycharm上的显示

xml文件

如上图所示,xml文件包含了filename文件名称,size图片尺寸,name标注物体的名称,points标注框的四个坐标信息。

txt文件

第一个整数代表种类如上述4代表classeslist中的第五个Van

小数前两个代表框的中心点x,y的相对像素坐标

x = (246+270)➗ 2 ➗1000      1000为照片像素宽度,如上图中的size

y = (403+411)➗ 2 ➗1000      1000为照片像素高度

小数后两位代表框的相对宽度和高度

相对宽度高度同理做减法

有细心的小伙伴已经发现了,上述坐标连线生成的框不是一个标准的矩形框如403和402不一致,其实这是正常现象,由于标注软件的差异有些坐标可能会有个位数像素的差距,一般不影响训练

下面附上完整代码

import os
import xml.etree.ElementTree as ET

def get_image_dimensions(xml_file):
    tree = ET.parse(xml_file)
    root = tree.getroot()

    size_elem = root.find('size')
    width = int(size_elem.find('width').text)
    height = int(size_elem.find('height').text)

    return width, height

def xml_to_txt(xml_folder, output_folder):
    xml_files = [f for f in os.listdir(xml_folder) if f.endswith('.xml')]

    for xml_file in xml_files:
        xml_path = os.path.join(xml_folder, xml_file)
        txt_path = os.path.join(output_folder, xml_file.replace('.xml', '.txt'))

        img_width, img_height = get_image_dimensions(xml_path)

        tree = ET.parse(xml_path)
        root = tree.getroot()

        with open(txt_path, 'w') as txt_file:
            for obj in root.findall('objects/object'):
                class_name = obj.find('possibleresult/name').text.strip()
                if class_name in classes_lst:
                    class_id = classes_lst.index(class_name)

                    points = obj.find('points')
                    xmin = float(points[2].text.split(',')[0].strip())
                    ymin = float(points[2].text.split(',')[1].strip())
                    xmax = float(points[0].text.split(',')[0].strip())
                    ymax = float(points[0].text.split(',')[1].strip())

                    # Calculate center coordinates
                    center_x = (xmin + xmax) / 2 / img_width
                    center_y = (ymin + ymax) / 2 / img_height

                    # Calculate relative dimensions
                    width_rel = abs(xmax - xmin) / img_width
                    height_rel = abs(ymax - ymin) / img_height

                    # Write to txt file
                    txt_file.write(f"{class_id} {center_x} {center_y} {width_rel} {height_rel}\n")

if __name__ == "__main__":
    classes_lst = ['Small Car', 'Bus', 'Cargo Truck', 'Dump Truck', 'Van', 'Trailer',   # 
                   'Tractor', 'Excavator', 'Truck Tractor', 'other-vehicle']
    xml_folder = r'D:\2\car_det_train\car_det_train\xml'  # XML文件路径
    output_folder = r'D:\2\car_det_train\car_det_train\txt'  # 新建保存TXT文件的路径

    xml_to_txt(xml_folder, output_folder)

注意:classeslist中的名称顺序一定要与训练时yaml文件中的名称顺序保持一致,不然肯定会出错!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值