GNN简单来讲, 旨在通过融合顶点和边的特征进而提取出图(Graph)中的信息. 一个直觉的想法是, 在MOT中, 我们可以用顶点表示目标的特征, 边表示目标之间的关系, 进而一个构成的图就可以作为解决关联问题的一个很好的入口, GNN就可以成为解决问题的工具.
我想总结几篇经典的利用GNN做MOT的文献. 力争持续更新.
解决Offline的MOT问题, 主流是依靠最小(大)流算法. 这篇文章本质上利用GNN来对最小流算法进行求解.
摘要中说, MOT方法大家热衷于研究特征提取的策略, 然而本篇文章主要针对数据关联进行研究. 文章提出了一个消息传递网络, 来解决网络流问题. 换言之, 将网络流这个最优化问题变得可微了.
我们首先来建模, 弄清图中顶点与边的含义. 假定我们有了所有的检测, 定义检测集合 O = { o i } ∣ i = 1 n \mathcal{O}=\{o_i\}|_{i=1}^n O={oi}∣i=1n, 其中每个 o i o_i oi代表一个检测, 一个检测包含位置与时间信息, 因此令 o i = { a i , p i , t i } o_i=\{a_i,p_i,t_i\} oi={ai,pi,ti}, 其中 a i a_i ai表示原始像素(tracking-by-detection范式, 我们有现成的检测框), p i p_i pi表示位置, t i t_i ti表示这个检测所处的时间. 显然, 一个轨迹就可以用一系列的检测表示: T i = { o i k } ∣ k = 1 n i T_i=\{o_{ik}\}|_{k=1}^{n_i} Ti={oik}∣k=1ni.
我们现在构建图 G = ( V , E ) , V = { f i } , E ⊂ V × V G=(V,E), V=\{f_i\}, E\subset V\times V G=(V,E),V={fi},E⊂V×V, 其中 f i f_i fi对应目标特征, 边的含义是, 这两个检测之间是否构成轨迹. 具体来说, 我们用 T i = { o i k } ∣ k = 1 n i T_i=\{o_{ik}\}|_{k=1}^{n_i} Ti={oik}∣k=1ni 描述一个轨迹, 也等价于使用边集合 { ( i 1 , i 2 ) , ( i 2 , i 3 ) , . . . , } \{(i_1,i_2),(i_2,i_3),...,\} {(i1,i2),(i2,i3),...,}描述. 根据轨迹的特点, 一个目标仅能和最多一条轨迹相连. 那么用GNN解决最小流问题, 实际上就是, 将边进行分类, 判定其是否属于一条轨迹.
如果用
y
(
i
,
j
)
∈
{
0
,
1
}
y(i,j)\in\{0,1\}
y(i,j)∈{0,1}表示对边
(
i
,
j
)
(i,j)
(i,j)的分类结果, 则最小流问题叙述为:
min
∑
(
i
,
j
)
∈
E
c
(
i
,
j
)
y
(
i
,
j
)
s
.
t
.
y
(
i
,
j
)
∈
{
0
,
1
}
\min\sum_{(i,j)\in E}c(i,j)y(i,j) \\ s.t. \quad y(i,j)\in\{0,1\}
min(i,j)∈E∑c(i,j)y(i,j)s.t.y(i,j)∈{0,1}
我们知道, GNN在前向传播的过程中要不断聚合顶点与边的信息, 也就是跟CNN类似的感受野的效果. 那么如何设置聚合信息的策略, 也是一个值得研究的课题.
前已说过, 顶点表示目标, 边表示目标间的联系. 具体地, 在初始化时.顶点用目标的特征进行编码. 特征是利用现成的Re-ID网络提取的.
对于边, 用几何和外观两种特征来衡量目标之间的联系. 假设两个目标的位置分别为
(
x
i
,
y
i
,
h
i
,
w
i
)
,
(
x
j
,
y
j
,
h
j
,
w
j
)
(x_i,y_i,h_i,w_i), (x_j,y_j,h_j,w_j)
(xi,yi,hi,wi),(xj,yj,hj,wj), 外观特征分别为
f
i
,
f
j
f_i, f_j
fi,fj, 我们还需要时间差来衡量时间上的远近, 则边的初始特征向量为:
h
i
,
j
0
=
(
2
(
x
j
−
x
i
)
h
i
+
h
j
,
2
(
y
j
−
y
i
)
h
i
+
h
j
,
log
h
i
h
j
,
log
w
i
w
j
,
t
j
−
t
i
,
∣
∣
f
i
−
f
j
∣
∣
2
)
h_{i,j}^{0}=(\frac{2(x_j-x_i)}{h_i+h_j}, \frac{2(y_j-y_i)}{h_i+h_j}, \log{\frac{h_i}{h_j}},\log{\frac{w_i}{w_j}},t_j-t_i,||f_i-f_j||_2)
hi,j0=(hi+hj2(xj−xi),hi+hj2(yj−yi),loghjhi,logwjwi,tj−ti,∣∣fi−fj∣∣2)
在GNN一层一层传递的过程中, 既要边向顶点传递信息, 也要顶点向边传递信息, 先顶点到边,再边到顶点, 也就是如下的流程:
具体地, 在顶点向边传递的过程中, 会将两顶点的特征和边特征concat起来输入MLP
N
e
\mathcal{N}_e
Ne, 在边向顶点传递信息的过程中, 对于和该顶点相连的每条边, 首先将上一步计算出的边的特征和顶点的concat输入MLP
N
v
\mathcal{N}_v
Nv, 之后将得到的结果进行sum, 也就是如下两式:
还有一个细节, 为了在MLP中加入时间的先验信息, 在计算边到顶点信息传递时, 按照与该顶点相邻的顶点是past还是future分别进行计算, 并总是利用初始信息:
例如: 我们要计算下图中中间节点的更新的feature, 与它相连的有过去两个节点和未来两个节点, 则利用两个MLP分别计算过去节点和未来节点对应的结果, concat之后, 再输入一个MLP进行计算.
这是一个offline的方法, 利用GNN里比较常见的策略, 将匹配问题转化为graph中边分类问题. 做的一点小改动是将相连的顶点分为past和future. 不过迷惑的一点是, 没有看明白将edge进行分类后, 是如何满足约束条件的.
\space
文章主要针对三个问题:
提出的解决方法是:
利用整体的无向图来描述轨迹和检测之间的关系,将关联问题转换为图匹配问题,并且为了让整体都是可微的(端到端),将原来的图匹配放宽为连续二次规划,然后利用隐函数定理将其训练到一个深度图网络中.
整体算法的思路是, 先用GCN增强图的特征表示, 然后用图匹配问题解决关联问题.
图匹配问题是寻找两个图的顶点映射, 使得匹配后顶点和顶点之间的边的相似度要尽量相近. 如果我们对已有的轨迹建立一个图, 再将当前帧检测建立一个图, 那么MOT的匹配问题就是如何寻找这个顶点之间映射的问题.
我们还是先来构建图. 和MOTSolv类似, 对于检测图 G D = ( V D , E D ) G_D=(V_D,E_D) GD=(VD,ED), 顶点集合 V D V_D VD表示一个检测, 边表示检测之间的相似度. 对于轨迹图 G T = ( V T , E T ) G_T=(V_T,E_T) GT=(VT,ET), 顶点集 V T V_T VT表示该轨迹检测的集合, 边也是轨迹之间的相似度. 检测图和轨迹图都是完全图. 至于相似度如何定义, 会在后文说明.
图匹配问题, 是一个二次分配问题(QAP), 可以写成K-B形式: (数学不好, 这里背后的原理不懂)
我们必须先假定, 待匹配的两个图顶点数相同, 这是图匹配问题的规定
(1)式:
将图匹配问题表示为该最优化问题. 其中 A A A表示图的带权邻接矩阵, Π \Pi Π表示匹配关系, 约束条件的意思是: 我们保证匹配关系是一一对应的(双射, 1 n 1_n 1n为全1矩阵). , B B B表示顶点的亲和度矩阵.
因为根据K-B形式的特性, Π \Pi Π是正交矩阵, 因此可以写为如下形式:
F表示矩阵的F范数,
这个式子更加直观, 第一项表示边的匹配关系的差值, 也就是边的差异. 第二项表示匹配结果的顶点之间的相似度. 我们应该最小化边的差异, 最大化点的相似度.
进一步地, 可以证明, 正交矩阵 Π \Pi Π位于双随机矩阵的凸包内, 因此我们可以限定 Π \Pi Π的搜索范围, 转化为如下优化问题:
然而, 在MOT问题中, 带权邻接矩阵不该是二维的, 该是三维的, 因为每个元素都代表一个特征. 我们假定特征是经过归一化的, 为此, 我们按第三维展开, 将优化问题写为:
并将其重写为(为啥)?
(5)式中:
小写字母全部是原矩阵的拉直形式, M M M是 n 2 × n 2 n^2\times n^2 n2×n2矩阵, 表示所有可能的顶点匹配.
那么根据(3)式的结论, 我们可以转化为:
那么, 边和顶点之间的相似度都是用余弦距离度量的(保证了归一化), 如下两式所示:
通过一种方式(此处略掉了)把(7)的
M
e
u
,
v
M_e^{u,v}
Meu,v映射到(6)式的
M
M
M.
2.3.1 用于增强特征的cross-graph GCN
为什么要叫Cross-Graph呢? 是因为在增强特征的时候, 图卷积是对检测图和轨迹图一起做的, 这样可以关注到检测与轨迹的关系.
目标代表顶点, 顶点的初始特征用Re-ID网络的外观特征. 边代表两个目标之间的相似度, 对于检测图和轨迹图中内部顶点之间的边, 我们定义是边连接的顶点的特征拼接(并正则化), 即:
h
i
,
i
′
=
l
2
(
h
i
,
h
i
′
)
h_{i,i'}=l_2(h_i, h_{i'})
hi,i′=l2(hi,hi′)
其中
h
h
h代表特征.
聚合函数采用加权和形式, 即在第
l
l
l层的第
i
i
i个顶点:
m
i
(
l
)
=
∑
j
∈
G
T
w
i
,
j
h
j
h
i
(
l
+
1
)
=
M
L
P
(
h
i
(
l
)
+
∣
∣
h
i
(
l
)
∣
∣
2
m
i
(
l
)
∣
∣
m
i
(
l
)
∣
∣
2
)
i
∈
G
D
,
j
∈
G
T
m_i^{(l)}=\sum_{j\in G_T}w_{i,j}h_j \\ h_i^{(l+1)}=MLP(h_i^{(l)}+\frac{||h_i^{(l)}||_2m_i^{(l)}}{||m_i^{(l)}||_2}) \\ i\in G_D, j\in G_T
mi(l)=j∈GT∑wi,jhjhi(l+1)=MLP(hi(l)+∣∣mi(l)∣∣2∣∣hi(l)∣∣2mi(l))i∈GD,j∈GT
其中的权重如何定义呢? 我们用外观特征和运动特征一起衡量. 对于轨迹的运动预测采用Kalman滤波:
m
i
(
l
)
=
c
o
s
(
h
i
(
l
)
,
h
j
(
l
)
)
+
I
o
U
(
g
i
,
g
j
)
m_i^{(l)}=cos(h_i^{(l)},h_j^{(l)})+IoU(g_i,g_j)
mi(l)=cos(hi(l),hj(l))+IoU(gi,gj)
2.3.2 可微的图匹配层
前面用数学方法描述了MOT中的图匹配问题, 作者想把这个也变成可微的, 变成网络的一部分, 跟DeepMOT一样.
作者借鉴了OptNet, 是一个用网络解决最优化问题的算法. 作者说具体的证明在附录里, 然而我没找到附录在哪!!
这篇文章的可取之处在于利用跨图的GCN, 同时考虑检测和轨迹来更新特征. 并且将匹配问题转化为图匹配问题(而不再限于沟渠的二分图匹配——匈牙利算法的模式), 并且将图匹配算法变得可微.
有几个疑问之处, 一是图匹配如何具体实现可微的, 二是图匹配问题应该要求两个图的顶点个数一样, 当不一样时, 是如何处理的.
\space
这篇文章的亮点在于1. Joint detection and tracking 2. GNN. JDT的卖点在于数据关联可以和检测一起训练, 达到one-shot的效果.
对于过去的JDT的工作, 很多都没有考虑到object-object之间的关系. 而对于过去图网络的工作, 很多还是tracking-by-detection的(例如前两篇文献都是). 而这个工作, 是可以利用GNN的结构天然地对object-object关系进行建模, 也是JDT的, 如下图所示.
GSDT的原理比较简单. 为了实现JDT, 最直接的方式是从同一个特征图同时进行检测和目标特征的预测. 为了实现Online, 我们应该把过去的轨迹和当前帧的检测关联起来.
整体结构如下图:
假设在帧 t t t, 我们有 t − 1 t-1 t−1的特征图和第 t t t帧的特征图. 我们根据已有的轨迹, 利用ROIAlign将 t − 1 t-1 t−1的特征图对应的位置抠出来, 这样就得到了轨迹的特征. 我们希望学习过去和现在的object-object关系, 但是现在帧我们只有特征图, 没有检测. 因此只能把当前特征图整个都当成潜在检测, 例如特征图维度是 R c × h × w \mathbb{R}^{c\times h \times w} Rc×h×w, 就逐像素flatten成 h w hw hw个 c c c维的向量.
我们把轨迹的特征和当前特征图flatten出的特征当作图的顶点. 由于同一帧的目标不可能相互匹配, 因此我们建图的时候只需要建立 t − 1 t-1 t−1帧顶点到 t t t顶点即可. 此外, 只有相近目标关系才大, 因此边只需要连接轨迹和相近的像素. 随后GNN对特征进行更新. 然然而, 如果采用一层GNN, 则只有时间信息而没有空间信息. 因此可以采用多层, 在迭代的过程中, 特征会传播的更远, 就可以获取空间信息. GNN部分如下图:
经过GNN后,
h
w
hw
hw个
c
c
c维的向量已经得到了更新, 我们再重新reshape回
R
c
×
h
×
w
\mathbb{R}^{c\times h \times w}
Rc×h×w, 这样在此新特征图上进行不同任务的预测: 位置, 形状, 外观信息.
得到特征后, 数据关联阶段仍然采用检测的embedding和轨迹embedding计算亲和度, 匈牙利算法匹配.
GSDT利用GNN对当前帧feature map进行更新, 融合过去轨迹特征和空间信息. 然而, 过去特征实际上只用了
t
−
1
t-1
t−1帧的, 这样如果有的目标有模糊或者怎样, 外观信息可能不准, 可以对过去一定帧数取平均, 会好一些. GNN只利用了顶点信息:
其实对边也赋予特征可能会更丰富一点.
\space
文章从漏检这个问题入手, 指出MOT性能受限的一大因素是因为遮挡, 模糊等造成的漏检. 所以想用GNN来恢复漏检. 具体的做法是节点代表检测, 边代表两个检测之间的相似度(例如位置或者外观). 之后跟MOTSolv一样, 把两个检测是否属于同一目标, 转换成边分类的问题.
这个模型是Online的, 每次在相邻两帧进行, 并且不需要运动特征和额外的Re-ID网络, 是个JDT的模型(和GSDT一样).
在这两个部分, 作者提出了一个有趣的观点: “找到在FP和TP之间实现最佳权衡的检测阈值至关重要.” 其实, 对于以往处理漏检的方法, 主要有两个工作. 一是ByteTrack, 二是OMC. OMC没看过, ByteTrack实际上是通过降低阈值和多次匹配完成的性能提升, 然而这样会在降低FN的同时提高FP. 实际上, 像SGT这种利用特征重新关联的形式, 反而应该会好一些.
SGT基于FairMOT打造, 实际上做的是匹配阶段的优化.
SGT实际上是通过边分类对即将抛弃的检测进行恢复. 边代表节点(检测)之间的相似度, 用位置, 外观和IoU三个指标衡量:
与上述方法不同的是, 顶点并不是用Re-ID特征初始化, 而是用骨干网络提取的整个特征作为顶点初始化, 所有顶点共享.
下面对SGT的过程做一个笔记.
SGT实际上是针对低置信度抛弃问题的一个改进, 相比ByteTrack, 显得不那么暴力了, 而且通过顶点分类等方式有意识地抑制FP.
算法 | Online/Offline | 范式 | 整体思路 | 图形式 | 顶点含义 | 边含义 |
---|---|---|---|---|---|---|
MOTSolv | Offline | TBD | GNN解决最小流问题 | 完全图 | 目标的Re-ID feature | 目标相似度 |
GMTracker | Online | TBD | 将匹配问题转换为图匹配问题(顶点映射关系), 并利用隐函数定理将匹配层可微 | 完全图 | 目标的Re-ID feature | 目标相似度 |
GSDT | Online | JDT | 利用GNN更新当前feature map, 不同head再进行不同任务 | 稀疏图 | 一侧是轨迹的Re-ID feature, 一侧是feature map的像素特征 | - |
SGT | Online | JDT | 利用边分类来决定两个检测是否属于同一目标,以此恢复低置信度检测 | 稀疏图 | 整个feature map | 目标相似度 |