如何使用py-motmetrics实现多目标检测评估
因为课题的需要,需要用MOT算法实现一些特定任务,需要对结果进行评估,因此总结了一些如何实现MOT结果评估的方便的代码。首先接单介绍一下多目标追踪任务。
多目标追踪任务
多目标跟踪(Multi-Object Tracking,简称MOT)是一种用于维持对多个目标当前状态估计的技术,主要通过对接收到的量测信息进行处理来实现。主要涉及的技术包括目标检测、卡尔曼滤波等。现在已经由传统算法转向了以深度学习为主要技术路径的涉及多个方面的算法。
用于评估的文件格式
MOT中ground truth文件名称一般命名为gt.txt,其格式如下:
[frame,id,box_left,box_top,w,h,conf,x,y,z]
这种格式包含了3D目标追踪,如果是2D目标追踪,xyz的值默认为1,则格式为
[frame,id,box_left,box_top,w,h,1,-1,-1,-1]
py-motmetrics介绍
该项目已经在GitHub上开源,可以直接看源码,也可以直接用pip install py-motmetrics
安装使用。在pypi上也可以看到这个库的介绍和基本使用方法。
单个test评估
import motmetrics as mm
import numpy as np
import os
#评价指标
metrics = list(mm.metrics.motchallenge_metrics)
#导入gt和ts文件
gt_file= 'gt.txt'
ts_file= 'test.txt'
gt=mm.io.loadtxt(gt_file, fmt="mot16", min_confidence=-1)
ts=mm.io.loadtxt(ts_file, fmt="mot16")
name=os.path.splitext(os.path.basename(ts_file))[0]
#计算单个acc
acc=mm.utils.compare_to_groundtruth(gt, ts, 'iou', distth=0.5)
mh = mm.metrics.create()
summary = mh.compute(acc, metrics=metrics, name=name)
print(mm.io.render_summary(summary, formatters=mh.formatters,namemap=mm.io.motchallenge_metric_names))
打印后的结果
多个tests文件评估
我这里已经用一些代码将gt、test文件转化为列表形式,并且统一了次序,以防止出现gt和test文件对应不上。因为我的文件命名名称中包含数字,因此用re
库可以方便地实现列表文件的排序。这是一个示例代码。
def extract_number(s):
import re
match = re.search(r'\d+', s)
if match:
return int(match.group())
else:
return 0
a = ['a1324556', 'a2', 'a100', 'a4', 'a1000']
sorted_a = sorted(a, key=extract_number)
print(sorted_a)
接下来就是一次性实现多个test文件的评估,并且可以通过pandas
将结果保存到csv文件中,方便后续分析使用。
'''
gts # gt文件列表
results # test文件列表
names # 评估名称列表
'''
metrics = list(mm.metrics.motchallenge_metrics)
mh = mm.metrics.create()
accs = []
for gt_file, result_file in zip(gts, results):
gt = mm.io.loadtxt(gt_file, fmt='mot15-2D',min_confidence=0)
ts = mm.io.loadtxt(result_file,fmt='mot15-2D')
acc = mm.utils.compare_to_groundtruth(gt, ts, 'iou', distth=0.5)
accs.append(acc)
# compute_many与单个文件评估略有不同,并且参数name为names
summary = mh.compute_many(accs, metrics=metrics, names=names)
print(mm.io.render_summary(summary, formatters=mh.formatters,namemap=mm.io.motchallenge_metric_names))
with open("rtdetr-botsort.csv", "w", newline="") as csvfile:
summary.to_csv(csvfile, index=True, header=True)
下图是打印出来的结果。
参考资料
1、MOT多目标跟踪评价指标代码py-motmetrics
2、py-motmetrics在pypi上的介绍
3、py-motmetrics源码