论文地址: https://arxiv.org/abs/2110.06864
代码地址: https://github.com/ifzhang/ByteTrack

摘要

MOT任务旨在评估视频中的目标边界框和身份信息。大多数方法是选项将那些检测置信度高于某一阈值的边界框进行关联,并且直接丢弃那些由于遮挡等问题产生的低置信度的边界框。这带来了不可忽略的真实物体丢失和碎片轨迹。为此ByteTrack提出了一个考虑所有边界框的关联方法。对于低置信度的边界框,利用他们与之前的轨迹进行之间进行相似度对比,实现恢复真实目标和过滤背景检测。当应用于其他多种不同的追踪器上时,IDF1都有明显的提升。并且该论文也是使得MOT任务中MOTA首次突破了80的。

直接贴图,下图为各个追踪器的MOTA-IDF1-FPS的对比图,可以看出ByteTrack的优越性,各种指标均达到了最高。

介绍

ByteTrack描述的现象正如下图所示,在帧 t 1 t_1 t1时刻,模型初始化了三个高置信度的检测框作为追踪轨迹,但是在 t 3 t_3 t3 t 3 t_3 t3帧时由于遮挡问题,导致这两个真实目标的检测框的置信度被严重降低。如果对于筛选高置信度的检测框的方法,那么这些真实目标就直接被丢弃了,这也就导致了目标的丢失,产生了轨迹的断裂。

实时上ByteTrack思考的就是如何将这些低置信度的目标筛选回来。本文中ByteTrack选择定义低置信度检测目标与轨迹的相似度作为判断的线索(这里主要还是位置信息)。如下图(c)中,红色目标轨迹存在,则导致后面的黄色目标能够被查询到。但是背景目标由于找不到与之前匹配的轨迹,则会被丢弃。

作者将他们的关联方法命名为BYTE,具体做法如下:
首先,基于运动相似度来实现高得分的检测框与轨迹的匹配,具体的使用卡尔曼滤波来预测目标在下一帧中的位置信息,运动相似度的计算由当前帧的检测目标框和卡尔曼滤波预测边界框之间的IoU体现,实现效果如图上图(b)。
然后,实现未匹配轨迹的第二次匹配(红色虚线边界框和低置信度边界框之间的匹配)。匹配成功后如上图(c)效果,真实目标过滤下来,背景目标丢弃。

最终模型的确定,ByteTrack选择了以YOLOX为检测器获取检测信息,BYTE的检测关联方法。并且实验中,他放弃了ReID分支(外貌特征),仅用简单的运动线索,就能很好的处理遮挡与关联问题。

BYTE关联方法

这一节主要介绍BYTE的关联实现,步骤如下伪代码算法图。

首先,算法的输入由一个视频片段 V V V,相应的还有一个检测器 D e t Det Det和一个卡尔曼滤波器 K F KF KF。同时设定三个阈值 τ high  , τ low  \tau_{\text {high }}, \tau_{\text {low }} τhigh ,τlow  ϵ \epsilon ϵ。前两个为检测的分数阈值,后一个为追踪得分阈值。BYTE的最终输出为视频的轨迹 T \mathcal{T} T,其中的每条轨迹包括目标的检测框和身份。

(3-13行):对于所有的由检测器产生的检测框和得分信息,将他们分为两部分,检测得分高于阈值 τ high  \tau_{\text {high }} τhigh 的归类为 D high  \mathcal{D}_{\text {high }} Dhigh  ,同时检测得分低于阈值 τ low  \tau_{\text {low }} τlow 的归类为 D low  \mathcal{D}_{\text {low }} Dlow 

(14-16行):对于轨迹集合 T \mathcal{T} T中的所有轨迹,利用卡尔曼滤波 K F KF KF预测其在当前帧中的坐标。

(17-19行):首先对高得分的检测 D high  \mathcal{D}_{\text {high }} Dhigh 和所有轨迹 T \mathcal{T} T进行第一次关联。相似度由模型预测和滤波预测的检测框之间的IoU计算,然后利用匈牙利算法进行匹配。对于相似度小于 0.2 0.2 0.2的拒绝匹配。对于未匹配的检测框,存放于 D r e m a i n D_{remain} Dremain,未匹配成功的轨迹,存放于 T r e m a i n \mathcal{T}_{remain} Tremain。(如果需要,这里也可以加入外貌特征的匹配,如DeepSort。)

(20-21行):对于低得分的检测框 D l o w D_{low} Dlow和剩余轨迹 T r e m a i n \mathcal{T}_{remain} Tremain进行第二次的匹配,未匹配成功的轨迹存放于 T r e − r e m a i n \mathcal{T}_{re-remain} Treremain,未匹配的低的分的检测直接删除。(这里作者认为由于遮挡,运动模糊等问题,会造成外貌特征的不准确,所以也依旧使用IoU作为相似度。)

(22行):对于 T r e − r e m a i n \mathcal{T}_{re-remain} Treremain中的轨迹,认为是暂时丢失了目标,将其放入 T l o s t \mathcal{T}_{lost} Tlost,如果 T l o s t \mathcal{T}_{lost} Tlost中轨迹存在超过一定时间(30帧),则从T中删除,否则继续在 T \mathcal{T} T中保存。(如果后期匹配到,也会从 T l o s t \mathcal{T}_{lost} Tlost中将其删除。)

(23-27行):对于 D r e m a i n D_{remain} Dremain中的检测,如果检测得分高于 ϵ \epsilon ϵ且存活超过两帧,则初始化为新的轨迹。

对于每帧的输出,只会输出 T \mathcal{T} T关于当前帧的边界框和对应的ID。

ByteTrack

整体模型的检测使用的是YOLOX,关联使用的是BYTE关联方法。
骨干网络和YOLOV5相同,骨干网络后有两个解耦头,一个用于回归,一个用于分类。作者在回归头中加入一个额外的IoU注意分支,用来预测预测框和GT框之间的IoU。回归头每个位置的直接预测4个值,即网格左上角的两个偏移量,以及预测框的高度和宽度。回归头由GIoU损失监督,分类头和IoU头由二元交叉熵损失监督。

具体的样本分配策略以及训练标签构建等这里就不介绍了,详细看论文或者代码吧。

实验结果

1.相同模型,不同的关联方法的对比:

2. SORT和BYTE匹配方法在不同检测阈值下的MOTA和IDF1效果对比。

3.可以看出,BYTE关联在在对低置信度的检测处理时,引入的TP还是很多的,也证明了这么处理的有效性。

4.MOT17上不同模型使用BYTE关联的效果对比,在不同程度上有涨点。

5.输入尺寸的消融实验。

6.数据集的消融实验。


7.后处理轨迹差值的消融。(差值公式为 B t = B t 1 + ( B t 2 − B t 1 ) t − t 1 t 2 − t 1 B_{t}=B_{t_{1}}+\left(B_{t_{2}}-B_{t_{1}}\right) \frac{t-t_{1}}{t_{2}-t_{1}} Bt=Bt1+(Bt2Bt1)t2t1tt1

8.可视化效果。

9.MOT17私有检测结果对比。

10.MOT20测试集对比。

代码部署

在这里推荐一个ByteTrack的部署,大佬写的很详细了。