Learning Spatial-Aware Regressions for Visual Tracking 论文地址 代码
写在前面
这篇文章是CVPR2018的Spotlight,在VOT2017上的效果超过了ECO和CCOT,表现还是很强的。这篇文章是将相关滤波和CNN相结合,首先提出了一个新的核函数,然后再将相关滤波的损失计算转化为用网络计算,简化了计算过程与计算复杂度。然后又使用了一个Space-Aware的CNN来做目标的提取,最后直接将这两个部分线性结合来一起跟踪,总体思路就是两个部分比较简单的结合,我觉得亮点应该就是使用神经网络来解相关滤波中的对偶计算(本人相关滤波只看过KCF的,有错见谅)。
Motivation
- 相关滤波和CNN的跟踪方法只注重一些全局的特征,没有注意到一个空间信息,也没有意识到不同的区域应当有不同的权重;
- 相关滤波需要生成很多的负样本,导致了冗余计算;
- 相关滤波方法需要的参数很少,生成的模型不够有区分度,但是CNN的方法参数又太多,容易过拟合,所以可以考虑将这两种方法互补结合。
Contribution
- 提出了一个跨patch的相似性核,使得KRR(Kernelized ridge regression)具有识别空间特征的能力;
- 使用深度神经网络来计算KRR的参数,这些参数可以在端到端的网络中一次计算出来;
- 在CNN中使用了空间正则化的滤波核,使得每个滤波核集作用于局部区域(有点像Attention),又使用了two-stream的网络来避免过拟合;
- 将KRR和CNN互补结合,KRR致力于全局的特征,CNN则负责小和局部的区域。
Algorithm
1 Spatial-Aware KRR
这一节主要解释如何从最原始的脊回归问题到对偶空间,如何做到Cross-Patch, 还有如何使用神经网络来计算脊回归。
1.1 KRR with Cross-Patch Similarity(KRRCPS)
给定第
t
t
t 帧的
N
N
N个训练样本
{
(
x
i
,
y
i
)
}
i
=
1
N
\{(x_i,y_i)\}_{i=1}^N
{(xi,yi)}i=1N,传统的脊回归方程如下:
其中
x
i
x_i
xi代表样本
i
i
i ,
y
i
y_i
yi 代表此样本的标签,我们可以上式转化到对偶空间计算(对偶空间其实就是使用不同的基表示向量,该向量在这个空间线性可分):
其中
k
i
.
j
k_{i.j}
ki.j 代表特征
x
i
x_i
xi 和
x
j
x_j
xj 的核函数值,目前都是用线性和高斯核来计算
k
i
.
j
k_{i.j}
ki.j,但是这样没有充分利用目标的空间信息,所以这里他们将一个sample分成M个patch,分别计算两个sample的每个patch的和函数值:
其中
m
,
n
m,n
m,n代表 M 个patch,即计算
x
i
x_i
xi和
x
j
x_j
xj 每个patch的一一对应值。使用这个核函数至少有两个优点:
(a)这个核函数的参数是通过网络学习到的,可以自适应于模型,也可使模型更加focus on那些可靠区域的相似性;
(b)patch之间更相似的部分被考虑到,可以使模型更加具有区分度。
所以为了求脊回归,我们的优化问题变成以下:
将上面式子带入得:
其中K表示核函数值矩阵:
K
i
j
=
∑
m
,
n
=
1
M
β
m
,
n
t
x
i
m
T
x
j
n
K_{ij} = \sum_{m,n= 1}^M \beta_{m,n}^t{x_i^m}^Tx_j^n
Kij=∑m,n=1Mβm,ntximTxjn
1.2 Network Structure for KRRCPS
观察式子
J
(
α
,
β
)
J(\alpha ,\beta)
J(α,β)的最后一行,后面两项都是正则化项,所以我们计算出第一项,就可以得到后面两项了,文章将:
∑
m
,
n
=
1
M
f
m
T
β
m
,
n
t
f
n
α
t
\sum_{m,n=1}^Mf_m^T\beta_{m,n}^tf_n\alpha_t
m,n=1∑MfmTβm,ntfnαt
分为三个部分来计算:
分成了这三个部分后,就可以使用神经网络来解了,这三个部分对应一下网络的三个部分,这个网络输入是特征图,输出是该特征图上的heat map,用来定位目标:
Module A:
由上一帧得到的目标位置,先是割出一个矩形区域(一般是比上一帧的尺寸大),得到的特征图尺寸:
H
×
W
×
C
H \times W \times C
H×W×C,然后在上面进行密集采样,得到的每个sample尺寸为
d
=
(
h
×
w
×
C
)
d = (h \times w \times C)
d=(h×w×C),采样后的特征矩阵:
D
t
∈
R
d
×
N
D_t \in \R^{d\times N}
Dt∈Rd×N,然后对每个sample进行权值整合得:
z
=
D
t
α
t
z = D_t \alpha _t
z=Dtαt
其中
α
t
∈
R
N
×
1
\alpha_t \in \R^{N\times 1}
αt∈RN×1,
N
N
N表示采样到的样本数,
α
t
\alpha_t
αt是需要学习的参数。得到的
z
z
z 是一个
h
×
w
×
C
h \times w \times C
h×w×C 的矩阵,再把
z
z
z 分割成
M
=
M
×
M
M = \sqrt{M}\times \sqrt{M}
M=M×M个子区域,每个区域的尺寸为
(
h
/
M
)
×
(
w
/
M
)
×
C
(h/\sqrt{M})\times (w/\sqrt{M})\times C
(h/M)×(w/M)×C,然后用
v
1
t
.
.
.
v
m
t
v_1^t ... v_m^t
v1t...vmt 表示这些子区域,也就是式子A的值。
Module B
这个部分是用来算上面的B式,可以转化为于一个卷积层,使用的卷积核就是上一个部分算出来的
v
1
t
.
.
.
v
m
t
v_1^t ... v_m^t
v1t...vmt。这个部分是先把
X
t
X_t
Xt划分为M个子区域,其中
f
m
f_m
fm代表的是
X
t
X_t
Xt的第m个子区域,然后每个子区域都与
v
1
t
.
.
.
v
m
t
v_1^t ... v_m^t
v1t...vmt分别做卷积,所以对每个子区域都会得到一个通道数为M的输出,因为我们一共有M个子区域,所有最终有M个输出。(这边比较难理解,文章的描述不够清晰,想要搞懂需要看代码)
Module C
这个部分就是把模块B得到的M个输出连接在一起,然后使用一个尺寸为
1
×
1
×
M
2
1\times 1\times M^2
1×1×M2的卷积核(也就是式C中的
β
m
,
n
t
\beta_{m,n}^t
βm,nt)对该输出进行卷积,最后得到的就是只有一个
r
r
r,也就是预测到的标签。最后的参数更新公式如下(与SRDCF相似):
2 Spatial-Aware CNN
目前基于CNN的跟踪器都忽略了目标的空间结构,这样每个卷积核只作用与一个局部区域,由于CNN的目标跟踪具有局限性,所以这个文章使用了two-stream的方法(这个地方十分耗时)。主要过程如下图:
2.1 Spatial Regularized Kernels
这个网络主要为了提取目标的空间信息,他们先是把输入特征图按通道分成
C
1
/
4
C1/4
C1/4 个组,每个组的特征map尺寸:
46
×
46
×
(
C
1
/
4
)
46\times 46\times (C_1/4)
46×46×(C1/4),其中
C
1
C_1
C1为前两层卷积后输出的通道数,然后每个组负责目标的一个部分。先是利用伯努利分布给特征图上蒙一层mask,在这一组中所有卷积核权重定义如下:
W
c
(
p
,
q
,
r
)
=
M
c
(
p
,
q
)
W_c(p,q,r) = M_c(p,q)
Wc(p,q,r)=Mc(p,q)
也就是这整个组的核都作用于一个区域。经过这个层卷积后的输出:
O
c
=
(
F
c
⊙
W
c
)
∗
W
c
+
b
O_c = (F_c \odot W_c)*W_c +b
Oc=(Fc⊙Wc)∗Wc+b
上式中的
⊙
\odot
⊙是指值对值的乘积,也就是把权重作用在一个具体值上,
∗
*
∗代表卷积值。
F
c
∈
R
K
h
×
K
w
×
K
c
F_c \in \R^{K_h \times K_w \times K_c}
Fc∈RKh×Kw×Kc,代表通道c的卷积核。
在计算完四个部分的输出之后,使用一个距离转移池化层(Distance Transform Pooling Layer)来整合四个部分。公式如下:
D
f
(
s
)
=
max
t
∈
ϱ
(
f
(
t
)
−
d
(
s
−
t
)
)
D_f(s) = \max_{t \in \varrho}(f(t)-d(s-t))
Df(s)=t∈ϱmax(f(t)−d(s−t))
其中
d
(
s
−
t
)
d(s-t)
d(s−t)是一个二次凸函数,其实这边的思路就是将这四个通道中值最大的整合起来,得到最有可靠的特征map。
2.2 Two-Stream Training Strategy
由于该网络训练需要的参数太多,但是数据不够,容易出现一些过拟合的情况,所以文章使用两个共享分支来计算,上一个分支就跟图三左边的网络一样,上面那个分支使用的原始的目标训练,下面使用的是旋转后的图片训练,这样可以增强网络对一些in-plane-rotation的鲁棒性,然后使用一个Maxout池化方法来将两个部分结合起来,其效果如下:
Tracking
跟踪的时候就简单把KRR和SRK-CNN结合结合起来:
f
(
X
t
)
=
f
K
R
R
+
λ
f
C
N
N
(
X
t
)
f(X_t) = f_{KRR} + \lambda f_{CNN}(X_t)
f(Xt)=fKRR+λfCNN(Xt)
就是需要过两个网络,得到的response线性结合,得到最终结果。
模型更新
使用SGD来更新模型,两个模型都要更新。
Experiment
总结
其实这篇文章花了很大的篇幅在讲公式推导,如果对公式的推导不是特别关注的话,其实看想法就可以了,沉迷公式推导反倒会陷入里面出不来~
优点
- 分析了基于相关滤波方法和CNN的方法的局限性和两个之间的互补情况,并将二者的优点香结合,得到精度高、鲁棒性强的效果;
- 利用神经网络来解回归问题,十分具有开创性,节约了很多计算耗费;
- 使得CNN更加注重目标的空间信息。
缺点
- 十分耗费时间,对于每个测试视频,都需要过两个网络,然后再结合;
- 相关滤波和CNN的结合十分简单,就是一个线性组合;
- 后面为了防止过拟合和旋转应用了两个网络,个人感觉十分浪费时间和空间,因为相关滤波对旋转还是具有一定鲁棒性的。