标注文件转换:MOT15(txt)文件转换XML文件

原因:有些同学希望将Mot15数据集用于目标检测模型训练,而模型训练需要的标注文件为VOC的XML文件

目标:将MOT15(txt)文件转换为VOC的XML文件

代码:

import os
import xml.etree.ElementTree as ET

def convert_mot_to_voc(mot_file, output_dir):
    with open(mot_file, 'r') as f:
        lines = f.readlines()

    prev_frame_num = -1  # 上一帧的帧数
    xml_root = None  # XML 根节点

    for line in lines:
        data = line.strip().split(',')
        frame_num = int(data[0])
        track_id = int(data[1])
        bbox = [int(float(data[i])) for i in range(2, 6)]

        if frame_num != prev_frame_num:  # 遇到新的帧数,生成新的 XML 文件
            if xml_root is not None:  # 将之前的 XML 文件保存
                xml_string = ET.tostring(xml_root, encoding='unicode')
                xml_file_path = os.path.join(output_dir, f"{prev_frame_num:04d}.xml")
                with open(xml_file_path, 'w') as xml_file:
                    xml_file.write(xml_string)

            xml_root = ET.Element('annotation')  # 创建新的 XML 根节点
            ET.SubElement(xml_root, 'folder').text = output_dir
            ET.SubElement(xml_root, 'filename').text = f"{frame_num:04d}.jpg"
            ET.SubElement(xml_root, 'path').text = os.path.join(output_dir, f"{frame_num:04d}.jpg")

            xml_size = ET.SubElement(xml_root, 'size')
            ET.SubElement(xml_size, 'width').text = str(960)
            ET.SubElement(xml_size, 'height').text = str(540)
            ET.SubElement(xml_size, 'depth').text = str(3)

        xml_object = ET.SubElement(xml_root, 'object')  # 创建目标节点
        ET.SubElement(xml_object, 'name').text = 'car'
        ET.SubElement(xml_object, 'pose').text = 'Unspecified'
        ET.SubElement(xml_object, 'truncated').text = '0'
        ET.SubElement(xml_object, 'difficult').text = '0'

        xml_bndbox = ET.SubElement(xml_object, 'bndbox')  # 创建边界框节点
        ET.SubElement(xml_bndbox, 'xmin').text = str(bbox[0])
        ET.SubElement(xml_bndbox, 'ymin').text = str(bbox[1])
        ET.SubElement(xml_bndbox, 'xmax').text = str(bbox[0] + bbox[2])
        ET.SubElement(xml_bndbox, 'ymax').text = str(bbox[1] + bbox[3])

        prev_frame_num = frame_num

    if xml_root is not None:  # 处理最后一帧的 XML 文件
        xml_string = ET.tostring(xml_root, encoding='unicode')
        xml_file_path = os.path.join(output_dir, f"{prev_frame_num:04d}.xml")
        with open(xml_file_path, 'w') as xml_file:
            xml_file.write(xml_string)


# 指定 MOT15 格式的 txt 标注文件路径
mot_file_path = 'mot_file_path/mot_file_path.txt'

# 指定转换后的 VOC 格式的 XML 标注文件保存目录
output_directory = 'output_directory/output_directory'

# 调用函数进行转换
convert_mot_to_voc(mot_file_path, output_directory)

这段代码会根据 MOT15 格式的 txt 标注文件将每一帧的多个目标转换为对应的 XML 文件,并保存在指定的输出目录下。各位同学请确保正确指定输入和输出的文件路径。

喜欢的各位观众点点赞和收藏,以免以后需要时找不到~

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

居然是这样的吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值