主要工作:
提出一个基于检测器的多目标跟踪框架。
主要贡献:
- 提出一种多目标跟踪器,利用检测器的边界框回归进行目标边界框的临时配准(利用跟踪在当前帧的边界框预测其在下一帧的边界框)。
- 利用行人重识别孪生网络(利用行人重识别匹配失效跟踪与检测,重新激活匹配上的失效跟踪,并用被匹配的检测作为其在当前帧的位置)和基于相机运动补偿的运动模型(利用强化的相关系数最大化进行图像配准,解决不稳定的相机运动造成帧间目标位移较大而导致的匹配出错问题)来扩展原始跟踪器 。
- 详细研究了多目标跟踪中失败情况和具有挑战性的场景(能见度低的场景,目标尺寸较小的场景,低帧率的场景),显示没有一个专门的跟踪方法能够优于本文提出的基于检测器回归的方法。
- 提出了一种新的利用检测器的多目标跟踪范式,使研究人员可以关注其他更复杂的跟踪问题。进行了一个指明最具前景的研究方向的扩展研究(利用gt信息来代替跟踪过程中的一个或多个操作,例如利用gt信息来进行跟踪killing策略,利用gt信息来进行边界框回归,利用gt信息进行运动模型,利用gt信息进行行人重识别)。
逐帧跟踪方式
如图所示,对于给定帧:
- 将每个跟踪在t-1帧的边界框输入到检测器中得到对应目标在t帧的边界框 b t b^t bt和分类分数 s t s^t st。
- 利用每个跟踪的分类分数 s k t s_k^t skt kill潜在的被遮挡跟踪。
- 利用目标检测器得到t帧的检测集 D t D^t Dt(或者公共检测集)。
- 将检测集 D t D^t Dt中与当前帧的目标边界框 b t b^t bt没有显著IOU的检测初始化为新跟踪。
整体跟踪流程
伪代码表示
利用公开检测集的整体跟踪流程可以用下面的伪代码表示得到(不包括行人重识别与运动模型):
// 有序图像列表表示的单个视频序列
I
I
I={
i
0
i_0
i0,
i
1
i_1
i1, …,
i
T
−
1
i_{T-1}
iT−1},
i
t
i_t
it表示t帧的图像。
// 公共检测集
D
D
D={
D
0
D_0
D0,
D
1
D_1
D1, …,
D
T
−
1
D_{T-1}
DT−1},
D
t
D_t
Dt表示t帧的检测列表。
// 目标的跟踪轨迹集
T
T
T={
T
1
T_1
T1,
T
2
T_2
T2, …,
T
k
T_k
Tk}
// 有序边界框列表
T
k
T_k
Tk={
b
t
1
k
b_{t_1}^k
bt1k,
b
t
2
k
b_{t_2}^k
bt2k, …,
b
t
N
k
b_{t_N}^k
btNk | 0
≤
\le
≤
t
1
t_1
t1,
t
2
t_2
t2, …,
t
N
t_N
tN
≤
\le
≤T-1},
b
t
k
b_t^k
btk=(x, y, w, h)为边界框坐标。
T
T
T,
T
a
c
t
i
v
e
T_{active}
Tactive
←
\leftarrow
← 0;
f
o
r
for
for
i
t
i_t
it
D
t
D_t
Dt
∈
\in
∈
z
i
p
(
I
,
D
)
zip(I,D)
zip(I,D)
d
o
do
do
B
B
B,
S
S
S
←
\leftarrow
← 0;
f
o
r
for
for
T
k
T_k
Tk
∈
\in
∈
T
a
c
t
i
v
e
T_{active}
Tactive
d
o
do
do
//获取跟踪上一帧的边界框
b
t
−
1
k
b_{t-1}^k
bt−1k
←
\leftarrow
←
T
k
[
−
1
]
T_k[-1]
Tk[−1];
//预测跟踪在当前帧的边界框和分类得分
b
t
k
b_t^k
btk,
s
t
k
s_t^k
stk
←
\leftarrow
← dectector.reg and class(
b
t
−
1
k
b_{t-1}^k
bt−1k);
//利用分类得分kill掉可能被遮挡的目标
i
f
if
if
s
t
k
s_t^k
stk <
σ
a
c
t
i
v
e
\sigma_{active}
σactive
t
h
e
n
then
then
T
a
c
t
i
v
e
T_{active}
Tactive
←
\leftarrow
←
T
a
c
t
i
v
e
T_{active}
Tactive - {
T
k
T_k
Tk};
T
T
T
←
\leftarrow
←
T
T
T + {
T
k
T_k
Tk};
//添加当前帧跟踪边界框以及跟踪分类得分
e
l
s
e
else
else
B
B
B
←
\leftarrow
←
B
B
B + {
b
t
k
b_t^k
btk};
S
S
S
←
\leftarrow
← + {
s
t
k
s_t^k
stk};
//利用NMS kill掉被遮挡跟踪
B
B
B
←
\leftarrow
← NMS (
B
,
S
,
λ
a
c
t
i
v
e
B, S, \lambda_{active}
B,S,λactive);
//将kill掉的跟踪从激活跟踪中剔除
f
o
r
for
for
k
k
k,
T
k
T_k
Tk
∈
\in
∈
T
a
c
t
i
v
e
T_{active}
Tactive
d
o
do
do
i
f
if
if
k
k
k
∉
\notin
∈/
B
B
B
t
h
e
n
then
then
T
a
c
t
i
v
e
T_{active}
Tactive
←
\leftarrow
←
T
a
c
t
i
v
e
T_{active}
Tactive - {
T
k
T_k
Tk};
T
T
T
←
\leftarrow
←
T
T
T + {
T
k
T_k
Tk};
//将未被剔除的边界框添加到对应跟踪轨迹中
f
o
r
for
for
T
k
T_k
Tk
b
t
k
b_t^k
btk
∈
\in
∈ zip(
T
a
c
t
i
v
e
,
B
T_{active}, B
Tactive,B)
d
o
do
do
T
k
T_k
Tk
←
\leftarrow
←
T
k
T_k
Tk + {
b
t
k
b_t^k
btk};
S
S
S
←
\leftarrow
← 0;
//利用检测器改善检测集的边界框以及得到分类分数
f
o
r
for
for
d
t
d_t
dt
∈
\in
∈
D
t
D_t
Dt
d
o
do
do
d
t
d_t
dt,
s
t
s_t
st
←
\leftarrow
← detector.reg and class(
d
t
d_t
dt);
//利用分类得分剔除被遮挡检测
i
f
if
if
s
t
<
σ
a
c
t
i
v
e
s_t < \sigma_{active}
st<σactive
t
h
e
n
then
then
D
t
D_t
Dt
←
\leftarrow
←
D
t
D_t
Dt - {
d
t
d_t
dt};
e
l
s
e
else
else
S
S
S
←
\leftarrow
←
S
S
S + {
s
t
s_t
st};
//利用NMS kill掉被遮挡的检测
D
t
D_t
Dt
←
\leftarrow
← NMS(
D
t
,
S
,
λ
n
e
w
D_t, S, \lambda_{new}
Dt,S,λnew);
//利用IoU将检测与跟踪进行匹配
f
o
r
for
for
d
t
d_t
dt
∈
\in
∈
D
t
D_t
Dt
d
o
do
do
f
o
r
for
for
b
t
k
∈
B
b_t^k \in B
btk∈B
d
o
do
do
i
f
if
if IoU(
d
t
,
b
t
k
d_t, b_t^k
dt,btk)>
λ
n
e
w
\lambda_{new}
λnew
t
h
e
n
then
then
D
t
D_t
Dt
←
\leftarrow
←
D
t
D_t
Dt - {
d
t
d_t
dt};
//匹配剩余的检测初始化为新跟踪(如果有reid模块,则在初始化新跟踪之前会进行reid)
f
o
r
for
for
d
t
d_t
dt
∈
\in
∈
D
t
D_t
Dt
d
o
do
do
T
k
T_k
Tk
←
\leftarrow
← 0;
T
k
T_k
Tk
←
\leftarrow
←
T
k
T_k
Tk + {
d
t
d_t
dt};
T
a
c
t
i
v
e
T_{active}
Tactive
←
\leftarrow
←
T
a
c
t
i
v
e
T_{active}
Tactive + {
T
k
T_k
Tk};
T
T
T
←
\leftarrow
←
T
a
c
t
i
v
e
T_{active}
Tactive;
行人重拾别流程
- 计算每个未激活跟踪与匹配剩余检测的外观模型距离矩阵。
- 计算每个未激活跟踪与匹配剩余检测之间的iou矩阵。
- 利用iou矩阵以及reid阈值得到mask矩阵。
- 利用mask将距离矩阵中不可能的匹配所对应的元素设置为一个极大值。
- 利用更改后的距离矩阵进行二元分配。
- 激活匹配上的未激活跟踪,用匹配的检测位置更新跟踪的位置,剩余的跟踪继续作为未激活跟踪,并对长时间未激活的跟踪进行终结,剩余的检测初始化为新跟踪。
个人看法
- 利用检测器来预测跟踪在当前帧的边界框以及得到分类分数就保证了边界框的精确,得到了目标的被遮挡情况。
- 精确的边界框可以直接作为跟踪在当前帧的位置(减少了FP),不需要用检测来更新跟踪的边界框。
- 利用分类分数来进行kill,一定程度上解决了遮挡问题。
- 由于检测器的精确性,经过分类分数和NMS kill的跟踪预测与改善检测在匹配阶段不需要再次kill。匹配时不采用基于匈牙利算法的数据关联,直接逐一将检测与跟踪进行匹配(减少了IDSW),没有匹配上的跟踪依然是激活跟踪,没有匹配上的检测用于初始化新跟踪(减少了FN),大幅度提高了MOTA值。
- 测试代码,google colab上的训练代码,训练代码的损失包括两对分类损失和回归损失,其中一对训练了一个检测器中没用到的部分,可以在定义损失时改正。