【追踪数据集gt格式转换】mot15的gt格式转换为mot17的gt格式

文章讨论了在使用yolov8_tracking时遇到MOTA(多目标跟踪精度)为负的情况,原因是数据集gt格式与MOT17的标准格式不符。MOT15的数据集按帧排序列出所有ID,而MOT17则是逐帧逐ID。为了解决这个问题,文章提供了一个名为`sort_file_content`的函数,该函数读取gt文件,按特定规则排序后重新写入,以匹配MOT17的格式。通过修改gt文件格式,可以期望得到更准确的跟踪指标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原因:在使用yolov8_tracking的时候,运行val.py以后发现mota是负的,很奇怪,然后观察了一下它给出的MOT17-mini的数据集格式,发现我的数据集gt格式和mot17的gt数据集格式不同。
具体说明:mot15对应的格式是按帧排序的,每一帧的所有id列举下去

1, 0, 83, 421, 88, 130, 1, 1, 1
1, 1, 335, 355, 54, 150, 1, 1, 1
1, 2, 239, 269, 44, 135, 1, 1, 1
1, 3, 366, 264, 48, 136, 1, 1, 1
1, 4, 521, 167, 59, 124, 1, 1, 1
1, 5, 570, 155, 57, 89, 1, 1, 1
1, 6, 769, 174, 55, 101, 1, 1, 1
1, 7, 749, 217, 34, 125, 1, 1, 1
1, 8, 721, 344, 71, 120, 1, 1, 1
1, 9, 847, 352, 50, 151, 1, 1, 1
2, 0, 85, 421, 88, 131, 1, 1, 1
2, 1, 331, 357, 60, 148, 1, 1, 1
2, 2, 240, 267, 47, 138, 1, 1, 1
2, 3, 368, 262, 47, 139, 1, 1, 1
2, 4, 522, 164, 62, 127, 1, 1, 1
2, 5, 574, 153, 62, 89, 1, 1, 1
2, 6, 763, 172, 58, 96, 1, 1, 1
2, 7, 743, 219, 40, 123, 1, 1, 1
2, 8, 721, 344, 76, 120, 1, 1, 1
2, 9, 847, 351, 50, 151, 1, 1, 1

mot17的格式是逐帧逐id的

1,1,912,484,97,109,0,7,1.0
2,1,912,484,97,109,0,7,1.0
3,1,912,484,97,109,0,7,1.0
4,1,912,484,97,109,0,7,1.0
1,2,1338,418,167,379,1,1,1.0
2,2,1342,417,168,380,1,1,1.0
3,2,1346,417,170,380,1,1,1.0
4,2,1351,417,171,381,1,1,1.0
1,3,586,447,85,263,1,1,1.0
2,3,586,446,85,264,1,1,1.0
3,3,586,446,85,264,1,1,1.0
4,3,586,446,85,264,1,1,1.0
1,4,1585,-1,336,578,0,9,0.98153
2,4,1585,-1,336,578,0,9,0.97777
3,4,1585,-1,336,578,0,9,0.974
4,4,1585,-1,336,578,0,9,0.97023
1,5,1163,441,33,89,0,8,1.0
2,5,1163,441,33,89,0,8,1.0
3,5,1163,441,33,89,0,8,1.0
4,5,1163,441,33,89,0,8,1.0

具体的代码:

# -*- coding: utf-8 -*-
"""
@Time : 2023/5/10 10:57

所以,如果用yolov8_tracking的val文件来跑的话,就会出现负的mota之类的,
为了更准确的显示指标,需要对数据集的gt格式进行修改。
"""
def sort_file_content(file_path):
    # 读取文件内容到列表
    with open(file_path, 'r') as f:
        lines = f.readlines()
    lines = [line.strip() for line in lines]

    # 将列表中的元素转换为元组,方便排序
    tuples = []
    for line in lines:
        parts = line.split(',')
        tup = (int(parts[0]), int(parts[1]), ','.join(parts[2:]))
        tuples.append(tup)

    # 自定义排序规则:先按照第二个元素升序排列,再按照第一个元素升序排列
    def key_func(tup):
        return (tup[1], tup[0])

    # 按照指定规则对元组列表进行排序
    sorted_tuples = sorted(tuples, key=key_func)

    # 将排好序的元组列表转换为字符串列表
    sorted_lines = [f"{tup[0]},{tup[1]},{tup[2]}" for tup in sorted_tuples]

    # 将排序结果存储回文件中
    with open(file_path, 'w') as f:
        for line in sorted_lines:
            f.write(line + '\n')


if __name__ == "__main__":
    folder_path = '/root/datasetName/train/'
    folders = os.listdir(folder_path)
    for folder in folders:
        filename = os.path.join(folder_path,folder,'gt/gt.txt')

        sort_file_content(filename)
        print('file format has been change ',filename)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值