原因:在使用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)