写在前面

上一篇博客我们简要的说明了什么是MOT,以及从KITTI数据集中MOT任务的标签构成出发进一步理解了MOT,然而,在KITTI数据集中怎样合理的评价MOT算法等等问题并没有给出答案,因此,在本博客将主要介绍如下的内容:

  • KITTI数据集中的多目标跟踪MOT细节问题一二
  • KITTI数据集中的多目标跟踪MOT评价指标——HOTA

KITTI数据集中的多目标跟踪MOT细节问题一二

在真正介绍MOT评价指标HOTA之前,我们还有一些内容需要去了解

Q1:KITTI评价什么类别的目标

KITTI评价汽车和行人的轨迹,但官方README中写到了也可以选择跟踪“自行车”这个类别,但KITTI官方榜上没有自行车这个细分类别的排名,因此对于自行车我们可以忽略
行人
汽车

Q2:什么是三维MOT和二维MOT,在KITTI中评估的是几维MOT

三维MOT和二维MOT就是字面意思,根据被跟踪的检测框而被区分为三维和二维,MOT根据传感器分类可以被分为单传感器和多传感器,如果只有相机单传感器而想要获取三维检测框这是一件比较困难的事情,因此在以三维MOT为其评估标准(AMOTP、AMOTA)的数据集上,例如Nuscenes,跟踪算法几乎都包含有激光传感器。而针对KITTI上的MOT,我们只看MOT的名字(Object Tracking Evaluation(2D bounding box))便应该知道他评估的是几维MOT
KITTI MOT
没错,他是二维MOT,而对于三维检测结果在评估算法性能时候怎么办呢,答案是投影到像素平面,使用HOTA标准进行评估

Q3:只是评估检测框的跟踪效果有些无聊,在KITTI上有没有一些更有意思的工作

当然有,KITTI上的多目标跟踪被更加细分了三种任务,普通的MOT,和图片像素级跟踪的两种,大家可以去KITTI官网上进行详细了解

KITTI数据集中的多目标跟踪MOT评价指标——HOTA

HOTA这篇文章比较新,发表于2020年的IJCV上,其主要贡献就是提供了一个更新更有效的二维多目标跟踪的评价标准,官网给我们提供了这样一篇博客,笔者觉得写的很好,有英语基础的同学可以看原版博客,在本博客笔者将结合上述博客给出一些自己的思考和理解:

HOTA总览

HOTA被视为三个IoU得分的结合, 即分为三个子指标: detection、association、localization,三个子指标又有并列的关系又有递进的关系

localization

预测检测和真实检测之间的空间对齐,强调单个物体
此部分的指标叫LocA,是由Loc-IoU这个指标的平均值构成
LocA
详细来说:

  • locA其实就是所有对应TP(真实检测框)与GT(ground truth)的2D IoU(其实就是Loc-IoU)的平均值
  • 如何获得TP和GT的对应关系?我们经常构造所有检测框和GT的IoU矩阵进而使用匈牙利算法获得匹配关系(获得GT的检测框也就是TP了),构造IoU矩阵时候需要将Loc-IoU(2D IoU)小于阈值的值剔除
  • Loc-IoU的阈值alpha的选择影响了后续的detection和association这两个指标

detection

所有预测检测的集合和所有真实检测的集合之间的对齐,强调所有物体
此部分的指标叫DetA,是由Det-IoU这个子指标构成
Det-IoU:
Det-iou
DetA:
DETA
DetRe和DetPr(召回率和准确率):
detprre
详细来说:

  • 公式中的TP代表在localization匹配后获得的正确检测;FN代表没有获得匹配的真值GT,也就是GT的漏检;FP代表匹配后剩余的检测,也就是误检
  • 可以通过使用整个数据集上的 TP、FN 和 FP 的计数来简单地计算 Det-IoU 来衡量整体检测精度(DetA)
  • 这个值与LocA中的阈值有关,为什么有关?
    • 阈值大的话,一些检测就会因为没有达到阈值而被抛弃,这可能导致检测召回率的下降(也可能带来准确率的上升)
    • 阈值小的话,一些误检就会被包含而来,这可能导致检测召回率的上升(也可能带来准确性的下降)

association

跟踪器随着时间的推移将检测链接到相同身份 (ID) 的程度,这个值跟采样点有一定关系
此部分的指标叫AssA,是由Ass-IoU这个子指标的平均值构成
Ass-IoU:
Assiou
AssA:
assa
AssRe和AssPr(召回率和准确率):
Assprre
详细来说:

  • 首先要承认的是,association这部分的指标理解起来有一定难度,这部分指标存在的原因是过去的一部分对于MOT评价指标过于关注检测效果如何,而忽视了“关联”这部分的指标,例如一段gt轨迹被识别成四段轨迹(也就是把一段轨迹上的同一物体分配了四个track id,如果还是不理解,想一想上一个文章说到的ID switch问题),这样的算法我们一定不能说他的跟踪性能优秀,为了合理评价MOT算法性能才提出了AssA
  • 公式中TPA(c)、FNA(c) 和 FPA(c) 的直观示例(thank to 这个博客):
    assa图片
  • AssA中的c是什么(thank to 这个博客),c是一个属于TP的点,可以是TP中的任意一个,根据这个点,我们总能确定出来一个唯一的GT轨迹,同时如果有pred轨迹与GT轨迹在这个点相交的话,我们还能确定出来一条pred轨迹(pred轨迹—>与c点同一个track id的所有检测框)
  • 同一条GT轨迹上不同的c点,也会产生不同的TPA(c),FNA(c),FPA(c),因此这三个值只能与采样绑定,不与数据集绑定
  • AssA具体怎么计算?
    • 我们在localization那部分子指标中已经获得TP和GT的对应关系,我们可以将所有的TP都算Ass-IoU,再取平均值
    • 取所有的TP可行吗?放一张图感受一下
      11scenes-val
      图片中我们是取了21个场景其中的11个场景作为val数据集,并通过官方算法评估脚本评估的算法效果,可以看到11个场景就有将近7000个TP,取所有的TP当然可以是可行的,或者我们也可以采样一些TP点,但如何合理的采样又是一个问题,本文不再赘述,笔者想强调的是,通过上述的讲解相信大家对于AssA和采样点有关有了更加深层次的理解
  • 就像detection的召回率和准确率,association的召回率recall描述了跟踪器避免将同一对象拆分为多个较短的轨道的能力,association的准确率precision描述了跟踪器避免将多个对象合并到一个轨道中的能力
  • 由于association和TP有关,TP和Loc中的阈值alpha有关,因此,AssA也是一个跟alpha有关的值

HOTA计算

计算公式:
HOTA计算
详细来说:

  • 正因为DetA和AssA都与Loc中的阈值alpha有关,为了测试算法在不同情况下的性能,HOTA离散求和了不同阈值aplha下的子HOTA

一个例子

图片来源还是KITTI推荐的这篇博客
例子
这里假设gt是一个连续出现在100帧的轨迹,每个预测的检测都是一个TP,我们挨个计算跟踪器的性能(因为检测都是TP,aplha也失去了他的作用,HOTA在所有阈值下都一样):

  • 对于跟踪器C
    • DetA-Re=(25+25+25+25)/100=1,DetA-Pr=(25+25+25+25)/(25+25+25+25)=1
    • 对于Ass,让我们假设在每一个轨迹上采样了一个点
    • AssA-Re=4*[25(TPA)/(25(TPA)+75(FNA))]/4=0.25
    • AssA-Pr=4*[25(TPA)/(25(TPA)+0(FPA))]/4=1
    • 根据公式求AssA(0.25)和DetA(1),可以求出HOTA=0.5
  • 对于跟踪器B
    • DetA-Re=(35+35)/100=0.7,DetA-Pr=(35+35)/(35+35)=1
    • 对于Ass,让我们假设在每一个轨迹上采样了一个点
    • AssA-Re=2*[35(TPA)/(35(TPA)+65(FNA))]/2=0.35
    • AssA-Pr=2*[35(TPA)/(35(TPA)+0(FPA))]/2=1
    • 根据公式求AssA(0.35)和DetA(0.7),可以求出HOTA=0.494(约等0.5)
  • 对于跟踪器A
    • DetA-Re=(50)/100=0.5,DetA-Pr=(50)/(50)=1
    • 对于Ass,让我们假设在每一个轨迹上采样了一个点
    • AssA-Re=1*[50(TPA)/(50(TPA)+50(FNA))]/1=0.5
    • AssA-Pr=1*[50(TPA)/(50(TPA)+0(FPA))]/1=1
    • 根据公式求AssA(0.5)和DetA(0.5),可以求出HOTA=0.5

写在最后

至此,我们大概把KITTI上的MOT问题交代明白了,花了较大的篇幅介绍HOTA指标更是为了大家能够更加进一步理解多目标跟踪MOT,两篇博客讲述了MOT是什么和MOT在KITTI的表现,在下一篇博客中笔者将介绍解决MOT问题的pipeline