从整体框架分类:
- TBD(Tracking-by-Detecton),或者DBT(Detection-based-Tracking),具体来说首先使用物体检测器检测目标,然后,利用运动、位置、外观线索或它们的组合,跨帧关联检测以形成与特定身份相对应的轨迹。对于在线应用程序,可以逐帧解决关联,也可以在序列上以跟踪方式离线解决关联。跟踪器的质量受限于检测器的质量;
- JDT(Joint-Detection-and-Tracking),或者TBR(Tracking-by-Regression),或者D2T(Detect-to-Track),一般来说检测和跟踪属于同一框架,同时执行检测和跟踪任务;
从是否使用embedding分类:
- w/o embedding
- SDE(Separate-Detection-and-Embedding),embedding单独用一个神经网络来做,耗时;
- JDE(Joint-Detection-and-Embedding),检测的同时输出embedding,只需要一步推理。
本文主要参考https://blog.csdn.net/weixin_43082343/article/details/127421908以及https://github.com/luanshiyinyang/awesome-multiple-object-tracking#metrics提供的MOT算法进行介绍。
1、运动模型
1.1 显式模型
1.1.1 线性运动
(1)无模型(可看作恒定位置模型):
[AVSS 2017] IOUTracker: High-Speed tracking-by-detection without using image information
直接用当前帧det与上一帧track做IOU匹配,即对上一帧的track不做位置预测。简单快速(100kfps),遮挡或漏检则会中断跟踪
(2)简单线性运动(平均速度)
[WACV 2023] C-BIoU: Hard to Track Objects with Irregular Motions and Similar Appearances? Make It Easier by Buffering the Matching Space
d
e
t
det
det位置作为
t
r
a
c
k
track
track的位置,若
t
r
a
c
k
track
track未匹配,则用估计的位置作为当前帧位置,取前
k
k
k帧速度求平均(速度为相邻帧的检测框中心点位置之差)。
[2022] GHOST: Simple Cues Lead to a Strong Multi-Object Tracker 也用了这种方式。
(3)卡尔曼滤波(恒速模型)
[ICIP 2016] SORT: Simple online and realtime trackin
卡尔曼滤波估计下一帧位置,匀速运动假设,状态变量为
[
x
,
y
,
s
,
γ
,
x
˙
,
y
˙
,
s
˙
]
[x,y,s,γ,\dot x,\dot y,\dot s]
[x,y,s,γ,x˙,y˙,s˙],经典之作。采用KF
恒速模型的MOT算法很多,也有对状态变量进行修改的,如OC-SORT的状态变量为
[
x
,
y
,
w
,
h
,
x
˙
,
y
˙
,
w
˙
,
h
˙
]
[x,y,w,h,\dot x,\dot y,\dot w,\dot h]
[x,y,w,h,x˙,y˙,w˙,h˙] 。
[ICRA 2017] CIWT: Combined image-and world-space tracking in traffic scenes
使用EKF(扩展卡尔曼滤波)
恒速模型。
此外,[2018] DetTA: Detection-Tracking for Efficient Person Analysis: The DetTA Pipeline 使用了Bi-EKF(双向扩展卡尔曼滤波)
恒速模型。
[2022] GIAOTracker: A comprehensive framework for MCMOT with global information and optimizing strategies in VisDrone 2021
使用UKF(无迹卡尔曼滤波)
恒速模型,在此基础上对于观测噪声R根据检测框的置信度进行修改:
R
~
k
=
(
1
−
c
k
)
R
k
\widetilde R_k=(1-c_k)R_k
R
k=(1−ck)Rk,作者称改进后的模型为NSA KF
【令人眼前一亮的思路,作者实验验证了可行性】。
[2022] StrongSORT: Make DeepSORT Great Again 也采用了这种方式。
1.1.2 非线性运动
(1)二次运动
[ECCV2020] DMM-Net: Simultaneous Detection and Tracking with Motion Modelling for Multiple Object Tracking
作者认为tracklet可以看作由N帧bbox构成的tube,tube的轴线即为中心点的轨迹,作者将其描述为二次运动轨迹,其中
P
4
×
3
P_{4×3}
P4×3是运动参数:
[
c
x
(
t
)
c
y
(
t
)
w
(
t
)
h
(
t
)
]
=
P
4
×
3
[
t
2
t
1
]
\begin{equation} \left[ \begin{array}{cccc} cx(t)\\ cy(t)\\ w(t)\\ h(t) \end{array} \right] =P_{4×3} \left[ \begin{array}{cccc} t^2\\ t\\ 1 \end{array} \right ] \end{equation}
cx(t)cy(t)w(t)h(t)
=P4×3
t2t1
(2)世界坐标系下匀速运动
[ICCV2021] PermaTrack: Learning to Track with Object Permanence
对于未匹配的
t
r
a
c
k
track
track,将图像坐标系位置坐标转换到世界坐标系下,按照匀速运动计算当前帧位置,再转换回图像坐标系。【长期未更新的track在图像坐标系下的运动显然不是匀速运动,在世界坐标系下,目标可以视作做匀速运动,这种方式比较合理,但变换矩阵不易求。】
类似的还有 [ICRA2018] MOTBeyondPixels: Beyond Pixels: Leveraging Geometry and Shape Cues for Online Multi-Object Tracking
1.2 隐式模型
(1)循环神经网络
[2021] DEFT: Detection Embeddings for Tracking
使用LSTM模块作为运动模块,限制外观特征的不合理匹配,作用同DeepSORT用空间距离门控限制外观距离。
[CVPR2021] ArTIST: Probabilistic Tracklet Scoring and Inpainting for Multiple Object Tracking
作者提出了一种基于随机自回归的运动模型ArTIST,显式地学习多模态下的自然运动轨迹,具体来说把连续的轨迹速度进行K-means,分成1024种特征,利用循环神经网络+全连接层输出4*1024,softmax后输出概率最大的偏移量 [ Δ x , Δ y , Δ w , Δ h ] [\Delta_x,\Delta_y,\Delta_w,\Delta_h] [Δx,Δy,Δw,Δh]
【注】基于RNN和LSTM的方法我只列出了2016年之后的MOT方法,在这之前也有不少算法使用。
(2) 网络回归
一般多为JDT的方法,在检测中增加一个预测运动的分支或者根据之前帧直接回归下一帧的位置,我也将其归纳到运动模型中,可以看作是一种位置的隐式传播。
[ICCV2017] D2T: Detect to Track and Track to Detect
应该算是最早的JDT类方法了,通过一个CNN网络联合执行检测和跟踪,具体来说结合两帧之间的特征输出位置偏移量 [ Δ x , Δ y , Δ w , Δ h ] [\Delta_x,\Delta_y,\Delta_w,\Delta_h] [Δx,Δy,Δw,Δh]。
[ICCV2019] Tracktor++: Tracking without bells and whistles
JDT经典方法之一,在Faster RCNN框架下,作者用上一帧的目标的位置作为region proposals,直接回归当前帧的目标位置,并且继承id。对于低置信度的目标直接剔除,对于重叠目标根据置信度做NMS,保留高置信度的id。此外,当视频帧率较低时,采用恒定速度假设估计位置作为region proposals。
[2020] MAT: Motion-Aware Multi-Object Tracking 是在Tracktor++基础上对前一帧bbox增加了运动模块:KF恒速模型和相机运动补偿。
[2020] SMOT: Single-Shot Multi Object Tracking
与Tracktor++类似,以SSD为框架,对上一帧的目标通过密集光流算法估计先验位置,后验位置选择与先验位置具有最高IOU的anchor,通过SSD网络回归目标位置。
[CVPR 2020] FFT: Multiple Object Tracking by Flowing and Fusing 在Tracktor++基础上,使用光流估计网络FlowTracker估计运动特征,作为region proposal。
[2021] TrackFormer: Multi-Object Tracking with Transformers
整体结构采用DETR,上一帧轨迹的embedding经过MSA(多头自注意力机制) 进行时空变换得到track query【这个过程我也将其看作一种运动变换】,再与object query一起送入解码器作为query与当前帧特征做交叉注意力计算。
[ECCV 2022] MOTR: End-to-End Multiple-Object Tracking with Transformer
整体结构采用deformable DETR,track query的概念与TrackFormer一样,但增加了QIM(Query Interaction Module)来管理track,主要是track的新增和消失,具体来说:将当前帧detect query和上一帧track query一起输入QIM,通过编码器产生跟踪得分继而判断是否保留track,将保留的track query通过一个TAN(Temporal Aggregation Network,实际上是一个多头自注意力模块)并与从detect query生成的track query级联作为当前帧的track query。
【对于两阶段法,将上一帧目标位置作为region proposals;对于一阶段法,将上一帧目标位置作为anchor或者anchor points;对于transformer方法,将上一帧目标位置作为query做交叉注意力计算】
[CVPR2021] SiamMOT: Siamese Multi-Object Tracking
同样以Faster RCNN为baseline,但是增加了额外的运动模型Siamese tracker,有显示和隐式两种运动模式:
(i) 隐式运动模型(IMM),使用MLP估计两帧之间的运动偏移
p
p
p和可见置信度
v
v
v
(ii) 显示运动模型(EMM):将上一帧特征图与当前帧的搜索区域的特征图做互相关,之后最后用全卷积网络输出运动偏移
p
p
p和置信度
v
v
v
[ECCV2020]CenterTrack: Tracking Objects as Points
在CenterNet框架下,输入结合上一帧图像和检测结果,输出增加一个预测位置偏移的head,根据当前帧的检测结果的置信度w从高到低,按最近匹配去关联上一帧的未匹配对象。若在半径k内没匹配到对象,则认为是新目标。(k定义为每个预测轨迹的预测边界框的高和宽的几何均值。)
[CVPR2021] TraDes: Track to Detect and Segment: An Online Multi-Object Tracker 也采用一样的方法预测帧间偏移
1.3 SOT跟踪器
SOT是给定一个初始位置,之后在目标附近进行搜索。
与MOT的区别:SOT是区分目标与背景、MOT是区分不同目标;SOT是邻近搜索,MOT是全局搜索。
(对于SOT我了解的比较浅,如有错误希望指出)
[ICCV 2017] STAM:Online Multi-Object Tracking Using CNN-based Single Object Tracker with Spatial-Temporal Attention Mechanism
对每一个目标用SOT跟踪器单独跟踪,运动模型是在线更新的带动量的匀速模型。
v
~
t
i
=
1
T
g
a
p
(
l
t
i
−
l
t
−
T
g
a
p
i
)
\widetilde v_t^i=\frac{1}{T_{gap}}(l_t^i-l^i_{t-T_{gap}})
v
ti=Tgap1(lti−lt−Tgapi)
v
t
i
=
α
t
i
v
t
−
1
i
+
(
1
−
α
t
i
)
v
~
t
i
v_t^i=\alpha^i_tv_{t-1}^i+(1-\alpha^i_t)\widetilde v_t^i
vti=αtivt−1i+(1−αti)v
ti
[AVSS 2018] V-IOU: Extending IOU Based Multi-Object Tracking by Visual Information
在前面提到的IOU Tracker基础上增加运动估计,对未匹配的 t r a c k track track用SOT跟踪器预测位置。
[ECCV 2018] Online Multi-Object Tracking with Dual Matching Attention Network
对每一个 t r a c k track track用SOT跟踪器单独跟踪,当SOT位置估计不可靠时,采用恒速模型估计位置。
[CVPR 2021] SOTMOT: Improving Multiple Object Tracking with Single Object Tracking
作者认为之前用到SOT跟踪器的MOT方法需要对每个 t r a c k track track使用一个跟踪器,时间与目标个数成正比,因此在CenterNet基础上增加一个SOT分支,可以同时对每一个目标做SOT跟踪(SOT 分支将目标视为点)
2、外观模型
即re-ID分支,根据是否单独提取外观特征可以分为JDE和SDE。
SDE直接采用成熟的re-id特征提取器或者简单的CNN网络,由于这种方式需要先进行目标检测再对目标单独提取特征,因此效率不高。
JDE在检测过程中同时提取外观特征,一般是在CNN类检测器增加一个head来提取,而transformer类结构则是隐式提取外观特征。下面简单列举几种
- [CVPR2019] MOTS:Multi-Object Tracking and Segmentation —— Mask RCNN+embedding head
- [ECCV2020] JDE: Towards Real-Time Multi-Object Tracking —— YOLOv3+embedding head
- [CVPR2020] RetinaTrack: Online Single Stage Joint Detection and Tracking —— RetinaNet+embedding head
- [IJCV2021] FairMOT: A Simple Baseline for Multi-Object Tracking —— CenterNet+embedding head
- [CVPR2021] CorrTracker/TLR: Multiple Object Tracking with Correlation Learning —— CenterNet+embedding head
- [CVPR2021] QDTrack: Quasi-Dense Similarity Learning for Multiple Object Tracking —— Faster RCNN+embedding head
这篇文章根据计算外观距离时的embedding形式来分类:
(1) one embedding
直接用网络输出的embedding
(2) scaled embedding
合并不同(尺度)特征层输出的embedding
[2021] DEFT: Detection Embeddings for Tracking
以CenterNet为baseline,根据预测目标的中心点位置映射到各个尺度特征层提取对应的embedding,经过1×1卷积并拼接起来作为目标的embedding
(3) embedding bank
每个track保存一个embedding库
[ICIP 2017] DeepSORT: Simple online and
realtime tracking with a deep association metric
计算代价函数时取库中所有embedding与检测框embedding的最小值
[2022] GHOST: Simple Cues Lead to a Strong Multi-Object Tracker
非活动轨迹
k
k
k与检测框
i
i
i关联时外观距离为前
N
k
N_k
Nk帧embedding与检测框
i
i
i的embedding的距离的平均值
d
i
,
k
=
1
N
k
∑
i
=
1
N
k
d
(
f
i
,
f
k
n
)
d_{i,k}=\frac{1}{N_k}\sum_{i=1}^{N_k}d(f_i,f_k^n)
di,k=Nk1i=1∑Nkd(fi,fkn)
此外,作者在附录实验中也对比了另外两种embedding:
- (i) Mode embedding:保存一个embedding库,取每个维度上的众数作为计算用的embedding
- (ii) Median embedding:保存一个embedding库,取每个维度上的中位数作为计算用的embedding
(4) MA embedding
用MA(移动平均)不断更新embedding,GHOST论文中提到Tracktor++用了这种方式
(5) EMA embedding
采用EMA(指数移动平均)不断更新embedding,匹配时用EMA平均的embedding来计算距离,这样在匹配时可以考虑历史外观信息,并且随着时间推移,前面的外观信息会越来越淡化,更加关注最近帧的外观信息。JDE、FairMOT、TraDes等都采用了这种方式:
e
i
t
=
α
e
i
t
−
1
+
(
1
−
α
)
f
i
t
e^t_i=\alpha e^{t-1}_i+(1-\alpha)f^t_i
eit=αeit−1+(1−α)fit
(6) EMA bank
计算每一帧的EMA embedding并保存在库中,计算时取与检测框embedding的最小值,GIAOTracker采用了这种方式
(7) other embedding
[CVPR 2021] TADAM: Online Multiple Object Tracking with Cross-Task Synergy
当多个目标重叠时,干扰目标(前景)会影响实际目标(后景)的外观特征,从而导致错误关联。为了解决这个问题,作者在Tracktor++基础上,提出一种同时增强为只预测和特征关联的模型,通过学习bbox中实际目标和干扰目标的注意力,并通过记忆聚合模块,区分并忽略干扰目标,生成实际目标的embedding
[CVPR 2022] MeMOT: Multi-Object Tracking with Memory
时空存储模块用来存储每个track在第T帧的embedding,记忆编码模块用来对存储的的特征进行融合,具体做法是:短时记忆模块将当前帧embedding作Q,对前 T s T_s Ts帧embedding做cross attentio;,长时记忆模块将上一帧记忆编码器的输出作Q,对前 T l T_l Tl帧embedding做cross attention;混合模块将长短时记忆模块的输出拼接做self attention作为当前帧的记忆编码模块输出 Q t c k Q_{tck} Qtck
3、代价函数
3.1 IOU类
IOU
是匹配bbox时最最最常用的,作为代价函数一般是
1
−
I
O
U
1-IOU
1−IOU
此外也有源码中采用GIOU
、DIOU
、CIOU
代替IOU使用的。
[WACV 2023] C-BIoU: Hard to Track Objects with Irregular Motions and Similar Appearances? Make It Easier by Buffering the Matching Space
匹配时在原来track和detection的bbox基础上进行等比放大,通过一个扩展因子b控制,之后再计算IOU,作者称这种方式为BIOU
。通过这种设置,可以省去对运动的精确估计,而仅仅通过扩大搜索范围即可,对于长期未更新的track效果更好,因为此时的运动不确定性很大。
3.2 距离类
最常用的距离函数为欧式距离
、余弦距离
、马氏距离
。
- 欧式距离,空间上的直观距离:
d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 d(x,y)=\sqrt{\sum_{i=1}^n(x_i-y_i)^2} d(x,y)=i=1∑n(xi−yi)2 - 余弦距离,方向的相似性:
d ( x , y ) = x ⋅ y ∥ x ∥ ∥ y ∥ d(x,y)=\frac{\boldsymbol{x}·\boldsymbol{y}}{\Vert \boldsymbol{x}\Vert \Vert \boldsymbol{y}\Vert} d(x,y)=∥x∥∥y∥x⋅y - 马氏距离,考虑变量分布的空间距离,早先在DeepSORT中使用:
d ( x , y ) = ( x − y ) T S − 1 ( x − y ) d(x,y)=\sqrt{(\boldsymbol{x}-\boldsymbol{y})^T \boldsymbol{S}^{-1} (\boldsymbol{x}-\boldsymbol{y})} d(x,y)=(x−y)TS−1(x−y)
此外还有一些其他的距离函数,比如
[2021]TransMOT: Spatial-Temporal Graph Transformer for Multiple Object Tracking
作者计算track和det的相关性时定义了一种归一化距离
D
t
o
p
=
∥
(
x
i
+
w
i
2
−
x
j
−
w
j
2
,
y
i
−
y
j
)
∥
h
i
D_{top}=\frac{\Vert(x_i+\frac{w_i}{2}-x_j-\frac{w_j}{2},y_i-y_j)\Vert}{h_i}
Dtop=hi∥(xi+2wi−xj−2wj,yi−yj)∥
计算的参数主要包括中心点距离
、embedding距离
、速度相似性
。
- 其中
中心点距离
绝大多数都采用欧式距离计算,det在与track关联时,一般是以det或track的中心点为圆心,以半径为 k k k的圆,在圆内进行贪婪匹配。
k = w h k=\sqrt{wh} k=wh
如CenterTrack、TraDes、PermaTrack、GIAOTracker
或 k = α v Δ t k=\alpha v\Delta t k=αvΔt
如
[CVPR 2021] Improving Multiple Pedestrian Tracking by Track Management and Occlusion Handling
速度相似性
主要是方向的一致性,采用余弦距离计算
[CVPR 2022] OC-SORT: Observation-Centric SORT: Rethinking SORT for Robust Multi-Object Tracking
使用了IOU和速度相似性的加权和作为代价函数
embedding距离
多用欧式距离和余弦距离计算
此外还有其他方式来计算embedding距离,如
QDTack作者采用BI-softmax计算embedding相似度,其中det有N个,track有M个:
f
(
i
,
j
)
=
[
e
x
p
(
n
i
⋅
m
j
)
∑
k
=
0
M
−
1
e
x
p
(
n
i
⋅
m
k
)
+
e
x
p
(
n
i
⋅
m
j
)
∑
k
=
0
N
−
1
e
x
p
(
n
k
⋅
m
j
)
]
/
2
f(i,j)=[\frac{exp(\boldsymbol{n}_i·\boldsymbol{m}_j)}{\sum_{k=0}^{M-1}exp(\boldsymbol{n}_i·\boldsymbol{m}_k)}+\frac{exp(\boldsymbol{n}_i·\boldsymbol{m}_j)}{\sum_{k=0}^{N-1}exp(\boldsymbol{n}_k·\boldsymbol{m}_j)}]/2
f(i,j)=[∑k=0M−1exp(ni⋅mk)exp(ni⋅mj)+∑k=0N−1exp(nk⋅mj)exp(ni⋅mj)]/2
一般来说,除了单独使用某一种度量方式外,大多数都是将IOU和距离或者不同距离作加权和,从而综合考量多个因素。
除了和的形式,也有考虑最小值的形式,比如
[2022] BoT-SORT: BoT-SORT: Robust Associations Multi-Pedestrian Tracking
当IOU和embedding距离都小于阈值时取二者最小值
f
(
i
,
j
)
=
m
i
n
(
I
O
U
,
d
c
o
s
(
⋅
)
)
f(i,j)=min(IOU,d_{cos}(·))
f(i,j)=min(IOU,dcos(⋅))
此外也有像DeepSORT、DEFT用运动信息限制(不合理的)外观距离的。
3.3 时间
GIAOTracker的代价函数考虑了时间上的差异并作为其中一项,主要是跨帧的数量。
3.4 关联度、相似度、亲和度
一般需要通过网络推理得到
[TPAMI 2019] DAN:Deep affinity network for multiple object tracking
通过一个特征提取器提取当前帧的特征后,与上一帧特征一起送入affinity estimator来估计前后两帧的亲和度矩阵,其形式为
(
N
m
+
1
)
×
(
N
m
+
1
)
(N_m+1)×(N_m+1)
(Nm+1)×(Nm+1),其中
N
m
N_m
Nm表示一阵中最多出现的目标数量,是可调参数,+1是为了对应未匹配的检测(表示新增track)以及未匹配的跟踪(表示track消失)。
上面提到的[2021]DEFT也用了DAN的思路,并进行了改进:计算一次(时间)正向亲和度和(时间)反向亲和度并取平均作为亲和度矩阵S,同时右侧拼接一个表示轨迹与检测不匹配的得分矩阵X,作为代价矩阵。
[CVPR 2021] CorrTracker/TLR: Multiple Object Tracking with Correlation Learning
作者为了解决仅利用外观信息不足以消除图像中多个相似区域的歧义问题,以FairMOT为baseline,在数据关联前增加一空间局部相关性层,仅在目标和其坐标周围(半径R范围内)目标之间计算特征相似度,将相似度矩阵correlation volume进行匈牙利匹配。
C
l
(
F
q
,
F
r
,
x
,
d
)
=
F
q
l
(
x
)
T
F
r
l
(
x
+
d
)
,
∣
∣
d
∣
∣
∞
<
=
R
C^l(F_q,F_r,x,d)=F^l_q(x)_TF^l_r(x+d),{||d||}_\infty<=R
Cl(Fq,Fr,x,d)=Fql(x)TFrl(x+d),∣∣d∣∣∞<=R
作者在生成embedding时即考虑了当前目标和周围目标的embedding相似度并。
F
c
l
=
F
t
l
+
M
L
P
l
(
C
l
(
F
t
l
,
F
t
l
)
)
F_c^l=F_t^l+MLP^l(C^l(F_t^l,F_t^l))
Fcl=Ftl+MLPl(Cl(Ftl,Ftl))
(我的理解是,在生成embedding时对目标和周围目标计算相似度并融入embedding中,是为了增加当前目标与周围目标的特征辨识度,外观越相似,则关联度越高,加上关联度后则区分度就变高了;而空间局部相关性层及关联矩阵是det只在其附近进行搜索,避免与更远处目标特征相近而错误关联)
[CVPR 2021] MTP: Discriminative Appearance Modeling with Multi-track Pooling for Real-time Multi-object Tracking
通过一个共享Bilinear LSTM结构融合track的历史外观特征,其隐藏层特征为
h
t
−
1
h_{t-1}
ht−1,此外通过一个二值分类网络Track Proposal Classifier对检测和轨迹对
(
d
t
,
T
1
(
t
−
1
)
)
(d_t,T_1(t-1))
(dt,T1(t−1))输出关联概率:
f
(
d
t
,
T
1
(
t
−
1
)
;
θ
)
=
p
(
d
t
∈
T
1
(
t
)
∣
T
1
(
t
−
1
)
)
f(d_t,T_1(t-1);\theta)=p(d_t \in T_1(t)|T_1(t-1) )
f(dt,T1(t−1);θ)=p(dt∈T1(t)∣T1(t−1))
[ECCV 2022] AiATrack: Attention in Attention for Transformer Visual Tracking
第一层自注意力机制可能学习到错误的注意力(空间上不合理,但特征相似),因此作者在注意力相关图上再增加一层self-attention,根据向量一致性判断之前的关联是否合理,有效排除噪声干扰。如图,下图中红线是错误的注意力关联
[CVPR2022] MeMOT: Multi-Object Tracking with Memory
以deformable DETR为baseline,将其输出的 Q p r o Q_{pro} Qpro以及上文提到的 Q t r k Q_{trk} Qtrk拼接作为decoder的 Q Q Q,对当前帧图像特征做cross attention,输出bbox及对应的两种置信度(遮挡置信度o和检测置信度u),总置信度为二者乘积,关联时先根据置信度筛选再对 Q p r o Q_{pro} Qpro继承id和 Q t r k Q_{trk} Qtrk新增id。
4、关联方式
(1)匈牙利算法
MOT中使用最最最多的匹配方法。
(2) 贪婪算法
MOT中使用第二多的匹配方法,一般计算中心点距离的方法多使用该关联方法,在上一节中提到了。
(3)最近邻搜索
目前看到的只有QDTrack用了这种关联方法。
(4)网络推理
多为隐式关联,比如Tracktor++这种CNN类的方法以及TrackFormer这种transformer类的方法,将之前帧的跟踪目标作为先验(proposal或者track query的形式),推理后得到的目标直接与先验目标进行关联(id继承)。
[CVPR 2019] DeepMOT: How To Train Your Deep Multi-Object Tracker
作者搭建一个端到端的网络,直接将MOTA、MOTP等指标作为损失函数,为此将匈牙利算法融入RNN构成DHN(Deep Hungarian Net),变成可微分函数。指标的可微形式很有趣,将在下节中提到。
[CVPR 2020] FFT: Multiple Object Tracking by Flowing and Fusing
使用FuseTracker模块通过IOU和检测置信度进行关联,以Faster RCNN为baseline,将光流估计网络输出的track和检测det作为proposal,经过两级NMS将track id继承给det,未继承id的det视为新的track。
5、其他策略
-
[CVPR 2019] DeepMOT: How To Train Your Deep Multi-Object Tracker
可微分的MOTA和MOTP,作者将FP、FN、IDS表示成如下形式,其中
A
~
\widetilde A
A
是可微匈牙利算法输出的关联矩阵(N×M,表示N个det与M个track关联);将矩阵增加一列阈值
δ
\delta
δ,对每一行做softmax计算,则最后一列之和为FP
,因为经过可微匈牙利匹配后关联矩阵已经可以进行分配了,
d
1
&
t
3
,
d
2
&
t
2
,
d
3
&
t
1
d_1\&t_3,d_2\&t_2,d_3\&t_1
d1&t3,d2&t2,d3&t1,但将
d
3
与
t
1
d_3与t_1
d3与t1关联则有些勉强,毕竟置信度低于定义的阈值
δ
\delta
δ,因此
d
3
d_3
d3可以看作错误的检测结果,即FP
;同理,将矩阵增加一行阈值
δ
\delta
δ,对每一行做softmax计算,则最后一行之和为FN
,
t
3
t_3
t3可以看作遗漏的检测,即FN
;IDS
是将上一帧的匹配结果作为mask,放在当前帧的匹配结果上,计算匹配发生改变的个数。
d
M
O
T
A
=
1
−
F
N
~
+
F
P
~
+
γ
I
D
S
~
M
dMOTA=1-\frac{\widetilde{FN}+\widetilde{FP}+\gamma \widetilde{IDS}}{M}
dMOTA=1−MFN
+FP
+γIDS
d
M
O
T
P
=
1
−
∣
∣
D
⨀
B
T
P
∣
∣
1
∣
∣
B
T
P
∣
∣
0
dMOTP=1-\frac{{||D\bigodot B^{TP}||}_1}{{||B^{TP}||}_0}
dMOTP=1−∣∣BTP∣∣0∣∣D⨀BTP∣∣1
其中,
D
D
D是融合中心点距离、IOU距离、外观距离的距离矩阵,
B
T
P
B^{TP}
BTP是当前帧的匹配结果,则DeepMOT的损失函数定义为:
L
D
e
e
p
M
O
T
=
(
1
−
d
M
O
T
A
)
+
λ
(
1
−
d
M
O
T
P
)
L_{DeepMOT}=(1-dMOTA)+\lambda(1-dMOTP)
LDeepMOT=(1−dMOTA)+λ(1−dMOTP)
-
[CVPR 2021] Improving Multiple Pedestrian Tracking by Track Management and Occlusion Handling
提出一种边界思想,当track出现在边界外且速度方向向外,则将其删除,防止与新出现的目标关联上,这是一种简单有效的思路。
此外,作者在离线方法中提出一种双向跟踪的策略,即时间正序跟踪一次,逆向再跟踪一次,将两次结果进行合并,与DEFT有异曲同工之妙(见3.4节)。
-
[ECCV 2022] ByteTrack: Multi-Object Tracking by Associating Every Detection Box
秉承“存在即合理”的思想,将检测框按照置信度分为高分/低分,先用高分检测框与track匹配,再用低分检测框与unmatched track匹配。这也是一个简单有效的思路,之后的很多算法都融入了这种思想。
- 有关插值的方式:
插值方式 | 举例 |
---|---|
线性插值 | OC-SORT、BoT-SORT 、GIAOTracker |
高斯平滑插值 | StrongSORT |
双向KF插值 | MAT |
- 相机运动补偿方法【细节待补充】
Tracktor++、Giaotracker、MAT、Detecting invisible people、Modelling ambiguous assignments for multi-person tracking in crowds
方法:Enhanced Correlation Coefficient (ECC) maximization、ORB特征匹配
6、Runtime
跟踪指标数据主要来自paperwithcode,一般都是论文中提到的最优结果(private detector 比 public detector结果好),推理速度主要来自论文或者MOT challenge,由于推理速度受实验环境影响较大,因此这里提供了实验设备(以论文中提到的为主)。目前只选取了两个热门数据集MOT17和MOT20,之后会加入DanceTrack等数据集。
- MOT17
Model | MOTA | IDF1 | HOTA | FPS | Hardware | 备注 |
---|---|---|---|---|---|---|
SMILEtrack | 81.06 | 80.5 | 65.24 | - | - | |
BoT-SORT | 80.6 | 79.5 | 64.6 | 6.6 | RTX 3060 | desktop |
BoT-SORT-ReID | 80.5 | 80.2 | 65 | 4.5 | RTX 3060 | desktop |
ByteTrack | 80.3 | 77.3 | 63.1 | 29.6 | V100 | 包括yolox的时间 |
StrongSORT | 79.6 | 79.5 | 64.4 | 7.1 | v100 | |
ppbytemot | 79.4 | 76.7 | 62.9 | 2219.6 | - | paddlepaddle库的bytetrack纯跟踪的时间 |
OCSORT | 78.0 | 77.5 | 63.2 | 29.0 | RTX 2080 | 包括yolox的时间,纯跟踪700fps+ |
Unicorn | 77.2 | 75.5 | 61.7 | - | - | 训练需要16块A100 |
FCG | 76.7 | 77.7 | 62.6 | - | - | |
TransMOT/STGT | 76.7 | 75.1 | 61.7 | 9.6 | V100 | |
SGT | 76.4 | 72.8 | 60.8 | 23.0 | V100 | |
TransCenter | 76.4 | 65.4 | - | 1.0 | V100 | |
SimpleTrack | 75.3 | 76.3 | 61.6 | 22.53 | RTX 2080Ti | 训练需要4块NVIDIA TITAN RTX,花费25h |
GTR | 75.3 | 71.5 | 59.1 | 19.6 | Titan Xp | 训练需要8块Quadro RTX 6000 |
Trackformer | 74.1 | 68 | - | 7.4 | - | 训练需要7*32块GPU,训练2天 |
FairMOT | 73.7 | 72.3 | 59.3 | 25.9 | RTX 2080Ti | |
OUTrack_fm | 73.5 | 70.2 | - | 25.4 | TITAN XP | |
LMOT | 72.0 | 70.3 | - | 28.6 | RTX 2070 Mobile | |
TraDeS | 69.1 | 63.9 | - | 17.5 | RTX 2080Ti | |
QDTrack | 68.7 | 66.3 | - | 20.3 | V100 | |
MPNTrack | 58.8 | 61.7 | - | 6.5 | - | |
Tracktor++v2 | 56.3 | 55.1 | 44.8 | 1.5 | Titan X |
- MOT20
Model | MOTA | IDF1 | HOTA | FPS | Hardware | 备注 |
---|---|---|---|---|---|---|
SMILEtrack | 81.06 | 80.5 | 65.24 | - | - | |
BoT-SORT | 77.8 | 76.3 | 62.6 | 6.6 | RTX 3060 | desktop |
BoT-SORT-ReID | 77.8 | 77.5 | 63.3 | 2.4 | RTX 3060 | desktop |
ByteTrack | 77.8 | 75.2 | 61.3 | 17.5 | V100 | 包括yolox的时间 |
TransMOT/STGT | 77.5 | 75.2 | - | 9.6 | V100 | |
OCSORT | 75.7 | 76.3 | 62.4 | 18.7 | RTX 2080 | 包括yolox的时间,单纯跟踪700fps+ |
StrongSORT | 73.8 | 77 | 62.6 | 1.4 | v100 | |
SGT | 72.8 | 70.6 | 57 | 19.9 | V100 | |
SimpleTrack | 72.6 | 70.2 | 57.6 | 7 | RTX 2080Ti | 训练需要4个NVIDIA TITAN RTX,花费25h |
TransCenter | 72.4 | 57.9 | - | 8.4 | V100 | |
TrackFormer | 68.6 | 65.7 | 54.7 | 7.4 | - | |
OUTrack_fm | 68.5 | 69.4 | - | 12.4 | TITAN XP | |
FCG | 68 | 69.7 | 57.3 | - | - | |
FairMOT | 61.8 | 67.3 | 54.6 | 13.2 | RTX 2080Ti | |
LMOT | 59.1 | 61.1 | - | 28.6 | RTX 2070 Mobile | |
MPNTrack | 57.6 | 59.1 | - | - | - | |
Tracktor++v2 | 52.6 | 52.7 | 42.1 | 1.2 | Titan X |
后记
这就是最近工作的简单汇总,许多东西在第一遍看的时候大概明白,但是在总结的时候又忘记了,希望用这种方式记录一些内容,方便自己也方便别人,此外也纪念一下自己第一次用latex敲公式。
这篇总结没有采用“面向对象”的方式来写,主要是类似的论文解读及速览很多,虽然有助于了解具体的方法内容,但是对于刚接触MOT的人来说不够条理,因此我采用了“面向过程”的方式,希望从MOT算法的通用流程入手,介绍出现过的方法以及演变过程。
尽管如此,我写得仍然不够详细,对于我完全不了解的方法,比如图卷积网络、孪生神经网络、SOT,为了不产生误导,我尽量不提或者一笔带过,同时有一些内容没有明显特色或者不确定具体该写在哪里的内容我也可能没有提到,希望日后可以补充完整。
最后,我也是接触MOT没多久,无法避免出现错误的理解,对于文中错误的地方希望大家指正,我会虚心改正!