论文地址:论文
之所以要做这篇文章的笔记, 是因为这篇是少有的专门针对遮挡情形的工作. 此外, 最近越来越多的算法利用自监督(无监督)的方式(本篇文章,以及Wang 等人的Multiple object tracking with correlation learning)或者对比学习(QDTrack)来对目标特征进行学习. 这种方式的好处是不需要像JDE或者FairMOT那样将特征学习转换为大量标签的分类问题. 因为数据集很大的话, 目标个数会非常多, 因此利用有限维数的向量来进行大数目的分类可能不会有很好地效果.
此外, 本文提出了非常有意思的应对遮挡的策略. 也就是利用类似热度图的方式, 建立一个单独的分支来预测画面某位置发生目标相互遮挡的可能性, 进而在关联阶段, 加入额外的匹配步骤, 来应对被遮挡目标的恢复.
这篇文章的Related Works写的很好, 因此主要对这部分和方法部分做一个说明.
1. Related Works
文章针对两个大问题, 一是无监督Re-ID, 二是遮挡估计, 基于FairMOT进行的改进. 因此Related Works部分重点介绍了Re-ID的相关工作和遮挡处理的相关工作.
1.1 Re-ID相关工作
Re-ID大致可分为有监督和无监督两种. 对于有监督的, 一些方法把检测出的目标提取出来, 然后再次提取特征. 这样很浪费时间和计算. 为了解决这个问题, 一些方法把Re-ID和backbone特征共享, 例如JDE和FairMOT这种.
对于无监督的, 大致有两种方式. 一是使用伪ID(persuade ID), 通过聚类或者tracking的方式得到, 然而这样的ID数目不一定精确, 而且错误会累积. 第二种就是ID free的, 也就是不需要对ID数目进行估计. 本文就是采取的后一种方式.
1.2 遮挡应对相关工作
当前MOT算法处理遮挡的方式可以分为两种:
1.在检测阶段处理遮挡. 例如在一个建议框(proposal)内检测多个目标, 或者分别检测行人的头和身体. 然而这种方式需要谨慎地设计NMS算法.
2.在跟踪阶段处理遮挡. 最直接的方式是利用SOT的方式处理, 例如一些方法为每个目标创建一个SOT. 还有一种是假定相邻帧的拓扑关系不变, 借助邻域的拓扑关系找到漏检.
2. Method
这个工作主要分为两方面, 1. 无监督Re-ID 2. 遮挡估计. 以下分别进行说明.
2.1 无监督Re-ID的设计
无监督的整体优化目标大致为让相同目标的特征表示尽量相似, 不同目标的特征表示尽量无关.
假设有相邻两帧 I t − 1 , I t I_{t-1}, I^t It−1,It, 其中的目标个数分别为 N t − 1 N^{t-1} Nt−1和 N t N^t Nt. 当然相邻的两帧里大概率有很多重复的目标. 不管这一点, 我们先把两帧的目标收尾相接, 这样我们一共有 N t − 1 + N t N^{t-1}+N^t Nt−1+Nt个目标. 如何设计无监督的学习方式呢? 要遵循以下两个大的原则:
- 同一帧的目标之间不可以相互匹配, 这是强约束.
- 两帧里有很多重复目标, 因此一帧里的目标大概率要在另一帧中找到匹配. 这是弱约束.
关于匹配的关系, 很自然我们可以用矩阵表示. 假如我们将两帧共
N
t
−
1
+
N
t
N^{t-1}+N^t
Nt−1+Nt个目标的匹配关系写成矩阵, 也就如下图所示:
上图中, 黄色区域表示帧内匹配, 根据强约束, 这是不允许的. 蓝色区域表示两帧间的匹配, 这是弱约束. 显然这个矩阵是对称矩阵.
我们将这个矩阵表示为 S ∈ R ( N t − 1 + N t ) × ( N t − 1 + N t ) S\in\mathbb{R}^{(N^{t-1}+N^t)\times (N^{t-1}+N^t)} S∈R(Nt−1+Nt)×(Nt−1+Nt), 我们令对角线上的元素全为负无穷(根据强约束, 不能在帧内 自己与自己匹配), 其余元素为向量的余弦相似度, 即:
S i , j = cos < f i , f j > , if i ≠ j , = − ∞ , otherwise S_{i,j}=\cos{<f_i, f_j>}, \text{if} i\ne j, \\ = -\infty ,\text{otherwise} Si,j=cos<fi,fj>,ifi=j,=−∞,otherwise
显然, 我们希望表示同一目标的 S i , j S_{i,j} Si,j应尽量大, 不同目标的 S i , j S_{i,j} Si,j应尽量小. 我们可以等价地转换为概率表示, 也就是按行对 S S S作softmax:
M = softmax ( S ) , M i , j = e S i , j T ∑ j e S i , j T M=\text{softmax}(S), \\ M_{i,j}=\frac{e^{S_{i,j}T}}{\sum_j e^{S_{i,j}T}} M=softmax(S),Mi,j=∑jeSi,jTeSi,jT
其中 T = 2 log ( N t − 1 + N t + 1 ) T=2\log{(N^{t-1}+N^t+1)} T=2log(Nt−1+Nt+1)为softmax函数的参数.
根据强约束, 帧内的目标不应该相互匹配, 因此黄色区域内的值应该尽量小, 也等价于其和尽量小, 因此定义帧内损失:
L i d i n t r a = ∑ 0 ≤ i , j ≤ N t − 1 M i , j + ∑ N t − 1 ≤ i , j ≤ N t + N t − 1 M i , j L_{id}^{intra}=\sum_{0\le i,j \le N^{t-1}}M_{i,j}+\sum_{N^{t-1}\le i,j \le N^t+N^{t-1}}M_{i,j} Lidintra=0≤i,j≤Nt−1∑Mi,j+Nt−1≤i,j≤Nt+Nt−1∑Mi,j
对于弱约束, 我们希望匹配的置信度越高越好. 也就是说, 对于目标id i i i, 最有可能的匹配对象是 j ∗ = arg max j M i , j j^*=\arg\max_j{M_{i,j}} j∗=argmaxjMi,j. 我们希望让这个 j ∗ j^* j∗的置信度尽量大, 其余的置信度尽量小. 因此定义帧间损失:
L i d i n t e r = ∑ i max ∀ j ′ ≠ j ∗ { max { M i , j ′ + m − M i , j ∗ } , 0 } L_{id}^{inter}=\sum_i\max_{\forall j'\ne j^*}\{\max\{M_{i,j'}+m-M_{i,j^*}\},0\} Lidinter=i∑∀j′=j∗max{max{Mi,j′+m−Mi,j∗},0}
这个式子的意义, 是让
max
{
M
i
,
j
′
\max\{M_{i,j'}
max{Mi,j′尽量小,
M
i
,
j
∗
M_{i,j^*}
Mi,j∗尽量大, 如此便可让整个的损失接近0. 其中
m
=
0.5
m=0.5
m=0.5为正常数.
然而, 这样有一个问题. 就是当存在新目标或者消失目标的时候, 可能找不到合适的匹配. 这里采取了一个trick, 和DeepMOT(CVPR2020, How to train your multi-object tracker)一样, 增加一个空列, 以不大的正数填充, 这样给匹配不到的目标一个位置安放.
前面已经说, M M M理论上是对称矩阵, 因此对称位置的差应尽量小, 因此定义循环损失项:
L i d c y c l e = ∑ i , j ∣ M i , j − M j , i ∣ L_{id}^{cycle}=\sum_{i,j}|M_{i,j}-M_{j,i}| Lidcycle=i,j∑∣Mi,j−Mj,i∣
最终的损失函数为以上三项的线性组合.
2.2 遮挡估计
要估计遮挡, 首先要明白如何判定遮挡. 在真值文件里, 都有目标边界框的标注. 假设两个边界框
b
i
,
b
j
b_i,b_j
bi,bj有重叠, 重叠区域为
o
i
,
j
o_{i,j}
oi,j. 如果
o
i
,
j
o_{i,j}
oi,j的面积足够大, 我们就认为这两个目标间发生了遮挡, 具体地, 定义函数
H
H
H判定是否遮挡:
H
(
o
i
,
j
)
=
1
,
if
A
r
e
a
(
o
i
,
j
)
min
{
A
r
e
a
(
b
i
)
,
A
r
e
a
(
b
j
)
}
>
τ
=
0
,
o
t
h
e
r
w
i
s
e
H(o_{i,j})=1, \text{if}\frac{Area(o_{i,j})}{\min\{Area{(b_i)}, Area{(b_j)}\}}>\tau\\ =0, otherwise
H(oi,j)=1,ifmin{Area(bi),Area(bj)}Area(oi,j)>τ=0,otherwise
用heatmap来表示遮挡可能发生的位置, 在实现上是用CNN预测的. 跟TransCenter等方法一样, 我们根据高斯函数生成真值来学习. 具体地, 在我们认定遮挡的区域, 定义真值为高斯函数的最大值. 而高斯函数的方差与区域大小有关. 具体地:
Y
x
,
y
=
max
{
G
(
o
i
,
j
,
(
x
,
y
)
)
}
,
s
.
t
.
H
(
o
i
,
j
)
=
1
Y_{x,y}=\max\{G(o_{i,j}, (x,y))\}, s.t. H(o_{i,j})=1
Yx,y=max{G(oi,j,(x,y))},s.t.H(oi,j)=1
其中
G
=
exp
{
−
(
(
x
,
y
)
−
p
i
,
j
)
2
2
σ
i
,
j
2
}
G=\exp\{-\frac{((x,y)-p_{i,j})^2}{2\sigma_{i,j}^2}\}
G=exp{−2σi,j2((x,y)−pi,j)2}表示高斯函数, 均值为遮挡区域的中心点
p
i
,
j
p_{i,j}
pi,j, 方差
σ
i
,
j
2
\sigma_{i,j}^2
σi,j2与区域大小有关.
这部分的loss与类似的方法一样, 都采用focal loss, 是交叉熵的形式.
重点是, 对遮挡的map进行估计后, 是如何利用在数据关联里的.
在关联阶段, 首先进行正常的检测与轨迹的关联. 对于没有匹配到检测的轨迹, 很可能是在这一帧被遮挡了, 因此没有被检测出来.
假设这个目标在上一帧的框为
b
t
−
1
b^{t-1}
bt−1, 这一帧没有框, 因此我们先利用卡尔曼滤波来估计这一帧的框
b
t
b^t
bt.
如果这个目标发生了遮挡, 则遮挡区域的中心点一定在 b t b^t bt内. 我们不仅要找到中心点, 而且要找到和它互相遮挡的目标 b j b^j bj.
为此, 对于预测出的遮挡map, 我们计算落在
b
t
b^t
bt内的遮挡中心点
p
i
,
k
p_{i,k}
pi,k. 并且根据检测结果计算和其余检测框的重叠区域
o
i
,
j
o_{i,j}
oi,j. 为了找到最好的
j
,
k
j,k
j,k, 令:
j
∗
,
k
∗
=
arg
max
j
,
k
G
(
o
i
,
j
,
p
i
,
k
)
j^*,k^*=\arg\max_{j,k}G(o_{i,j}, p_{i,k})
j∗,k∗=argj,kmaxG(oi,j,pi,k).
其实上式的本质就是依据预测的遮挡中心点, 找一个其余的最近的框. 有了匹配的遮挡框和中心点, 就容易根据几何关系得到被遮挡框的位置.
2.3 整体结构
整体结构就是将检测、Re-ID和遮挡估计三部分并行进行:
3. 评价
这篇文章的方法还是很新颖的, 利用自监督进行Re-ID, 让帧间目标尽量匹配. 不过将两帧所有目标都放一起, 显得有些冗杂, 但我也想不到更好的方式. 遮挡部分是个亮点, 通过对遮挡直接进行预测来对丢失的检测进行重新拾取. 这对解决遮挡问题是一个新思路.