今天为大家解读一篇ICCV2019的oral paper。用于目标跟踪,思路奇特。值得认真学习一下。
项目及论文下载地址 here
研究背景
自从SiamFC横空出世,基于孪生网络的目标跟踪方法就几乎统治了跟踪领域。孪生网络通过学习模板和当前帧的相似度,判断目标最可能出现的位置,来达到跟踪的效果。自SiamFC之后,有SiamRPN,SiamMask,Cascade SiamRPN, SiamRPn++等都是跟踪领域精度最高的那几个模型,足以看出孪生网络在目标跟踪领域的地位。
所谓模板,就是第一帧中给出来的所要跟踪的目标,以这个目标作为模板,其他后续帧通过相似性学习,找到这个目标在其他帧中的相似度。相似度最大的位置,就差不多是目标位置了,在经过框回归,就能准确找到目标的精确位置。
采用模板有个好处,好处就是模板是固定的,总是来自第一帧给出的目标区域,所以模板可以说是很值得网络信赖的,毕竟确定就是网络需要跟踪的目标。随着网络后续帧处理之后,即便因为遮挡或者其他因素丢失了目标,只要这个目标重新出现之后,网络依然能利用模板这个最值得信赖的特征,找到真正要跟踪的目标,因为它们之间的相似度是最高的。
模板的一个坏处就是,一旦目标发生了很大的形变,或者严重的遮挡,甚至和第一帧的给定目标从视觉观感已经看不出是一个目标了,这个时候仍借助模板去跟踪目标,就不合适了。如果恰好出现了和目标相似类别的另一个背景目标出现,网络很可能出现误差漂移现象。
这就是GradNet被提出的初衷: 通过改变模板,不断是去适应目标的新形象,使得网络始终可以通过基于模板的cross correlation来获得高的相似度来跟踪目标。
事实上,在孪生跟踪领域,GradNet并不是第一个提出改变模板的策略,但GradNet的创新之处在于,它挖掘了梯度信息,并用梯度信息来实现模板的更新。这是首创。被ICCV2019评委Oral paper~!!!!!!
Motivation
梯度中包含了非常有用的信息。比如下面两张图,第一列将目标区域遮挡一部分,这张图的特征的梯度在被遮挡的区域会有很大的值(第二列玫瑰色的区域代表值很大)。第三列的图像展示了和目标相似的背景目标,一样会有很大的梯度。所以梯度是可以反映目标的变换以及背景的位置。
目前的一些跟踪方法中,有一些方法是用到了在线学习,就是在测试的时候,依然训练网络。这些方法也是要借助梯度更新参数,使网络适应目标的新形象。但是往往需要几十次的迭代,才能收敛,所以测试时间会非常慢。
而作者提出的GradNet,仅仅依靠两次前向计算和一次反向求梯度,就能实现更新模板并且准确跟踪。
主要贡献
- 第一个利用梯度去更新模板的孪生网络
- 提出了合理的训练方式,解决了网络不重视梯度以及过拟合的问题
- 取得SOTA效果,还能有80FPS!!!!!!
Method
首先GradNet以SiamFC作为BaseLine,同时简单的介绍了SiamFC。
Z是第一帧给定的目标区域,X是以上一帧预测结果为中心,在下一帧(当前帧上)选取的更大一点的搜索区域。fx,fzf_x, f_zfx?,fz?分别用来提取搜索区域特征和目标区域特征。有:
β=fz(Z)\beta = f_z(Z)β=fz?(Z)$
S=β?fx(X)S = \beta * f_x(X)S=β?fx?(X)
其中,β\betaβ就是模板了,S是score map,就是描述了在搜索区域上各个小区域和模板的相似度。 星号代表Corss correlation操作。 另外,在一些方法中,fz,fxf_z, f_xfz?,fx?是一个东西,参数共享。
SiamFC希望在Score map上最大值对应得位置上,就是正确的目标区域。
接下来就可以正式介绍GradNet了。
模板如何生成
GradNet更新模板分三步走。网络结构图如下
初始化一个模板
Z经过f2f_2f2?得到f2(Z)f_2(Z)f2?(Z),f2f_2f2?就是几个卷积层。然后计算得到fx(Z)f_x(Z)fx?(Z),同时得到一个初始模板
β=U1(f2(Z))\beta = U_1(f_2(Z))β=U1?(f2?(Z))
计算梯度
然后β\betaβ和fx(Z)f_x(Z)fx?(Z)通过Cross correlation操作得到Score map,用这个Score map和Label计算loss,求得
f2(Z)f_2(Z)f2?(Z)的梯度,**这里是对特征图求导,**然后把梯度送进另一个子网络U2U_2U2?,输出在加上f2(Z)f_2(Z)f2?(Z),得到h2(Z)h_2(Z)h2?(Z)
模板更新
h2(Z)h_2(Z)h2?(Z)经过U1U_1U1?,和之前的U1是一样的网络,参数共享,就得到了最优的模板,β?\beta^{*}β?,用这个β?\beta^{*}β?去和fx(Z)f_x(Z)fx?(Z)再做一次Cross correlation操作,得到的Score map就是最终的输出了。
GradNet的两个问题
作者在实验中发现,用一个视频的中抽取的两帧组成Batch,网络不重视梯度信息,因为U2这个子网络的权重值很低。说明最终的模板的值很大程度还是来自第一次的Cross correlation操作。另一个问题是出现了严重的过拟合。
于是作者提出了下面这种训练方式。
设T={(X1,Z1,Y1),(X2,Z2,Y2),...(XN,ZN,YN)}T = \left \{(X_1, Z_1, Y_1), (X_2, Z_2, Y_2),...(X_N, Z_N, Y_N) \right \}T={
(X1?,Z1?,Y1?),(X2?,Z2?,Y2?),...(XN?,ZN?,YN?)}是训练样本。X,Z含义和上面相同,Y是Label。下标代表来自不同的视频序列。
作者在一个Batch中,选择来自k个(在实验中k为4)视频的样本,组成训练样本对(pairs)。
重点来了,然后用第一个样本的Z,记作Z1Z_1Z1?,求β1\beta_1β1?,用来自第一个视频的Z求到的初始化模板β1\beta_1β1?,作为这一个Batch的模板。就是其他三个序列也用这个作初始化的模板。下面是一个示意图。
按照左边的方式训练,就会出现那两个问题。按照右边的方式训练,能避免提到的两个问题,从示意图中的右边,可以注意到,只用了一个Z1计算模板,用于Batch中的四个来自不同视频的image pairs。这样能帮助网络更在意来自梯度的信息。
Note: 这种训练方式从理论上来说,非常正确。因为如果按照第一种方式训练,本身就能够从第一次Cross Correlation操作得到很不错的相似性度量了,网络自然不会重视梯度信息。但是通过右边的方式学习,第一个视频的初始模板并不适合其他三个视频,毕竟是来自不同视频的数据。对于其他序列,网络不能从第一次的Cross correlation操作学习到东西,自然就依靠梯度给出的信息。
如何测试
在离线训练之后,整个网络参数就固定了,这和一般长短时更新继续训练的跟踪方法完全不同。
首先得到第一帧,以及给出的所要跟踪的目标,以及对应的label。继而得到Z1,X1Z_1, X_1Z1?,X1?,继而的到最佳模板β?\beta^*β?。同时保存h2(Z1)h_2(Z_1)h2?(Z1?),用于更新后续帧的初始模板,也就是在测试当前帧得到的h2(Zi)h_2(Z_i)h2?(Zi?),被当做下一帧需要的f2(Zi+1)f_2(Z_{i+1})f2?(Zi+1?),
还要保存一个值得信赖的pair(X,Y),根据这个值得信赖的样本以及对应的标签,去更新得到新的h2(Z)h_2(Z)h2?(Z)。
比如说,第一帧以及对应的label肯定是值得信赖的样本对(pair。给定的,自然是值得信赖的),然后两路都送进第一帧,用第一帧对应的lable得到梯度,用梯度得到目前的最佳模板β1?\beta_1^*β1??。同时保存h2(Z1)h2(Z1)h2(Z1)
对于第二帧,使用h2(Z1)h2(Z1)h2(Z1)作为f2(Z1)f_2(Z1)f2?(Z1),用最值得信赖的样本对更新得到适合第二帧跟踪的最佳模板β2?\beta_2^*β2??。以此类推。
什么是值得信赖的样本呢?选取规则如下:
- 设thre 为第一帧的score map的最大值
- 如果后续帧的socre map的最大值大于0.5*thre,这个帧以及对应的label作为值得信赖样本对。label来自于预测结果。
关于label的形式,好像是和score map类似的东西,这个需要看SiamFC才能明白了。还有框回归是否还需要呢,也是未知了。