写前bb
写的第一篇论文阅读博客,作为目标跟踪的小白,感觉应该把第一次献给了SiameseFC。(主要KCF太久远了,而且有很多优秀的博客写的都很好!!!)话不多说,开始Markdown这篇论文。第二篇准备献上自己对Gayhub上复现的代码解读(纯自己理解,有说错的地方大佬请指正!)
Method
We trained a Siamese network to locate an examplar image within a larger search image. A further contribution is a novel Siamese architecture that is fully-convolutional with respect to the search image: dense and efficient sliding-window evaluation is achieved with a bilinear layer that computes the cross-correlation of its two inputs.
作者通过训练一个Siamese网络来在搜索区域的图片上来定位模板图片所在的位置。该方法的一个特点就是全卷积,即无padding操作,同时采用密集且有效的滑窗评价操作。(简单明了,思路很好理解)
Framework
从Framework的图中可以很清楚理解该网络工作的思路,通过输入一对图片,z(examplar img),x(search region img),同时通过一个translation function(也就是常见的分类backbone,该文是AlexNet),将z得到的feature当做卷积核和x得到的feature做相关操作(不是很清楚我说相关这个词是不是对的,看许多博客上有人说相关和卷积不是同一个概念,但我认为在该文中就是做了一个类似卷积的操作)。
f
(
z
,
x
)
=
φ
(
z
)
∗
φ
(
x
)
+
b
1
f(z,x)=\varphi(z)*\varphi(x)+b\ \Bbb{1}
f(z,x)=φ(z)∗φ(x)+b 1最后得到一个score map,该map上响应值最高的点我们认为是我们所要跟踪的目标(其实就是通过相似度的大小来寻找我们所要跟踪的目标),通过这个点的位置反推回最初frame上的位置。(x图上红蓝两个subwindows对应在score map上的红蓝两个点)
最后附上backbone的结构:
(其实对于最后三行的chans的大小我不是很理解,按理我觉得应该是384,384,256,我看有的博客说是因为采用了group的方式进行卷积)
Algorithm
作者说我们提出的这个网络是全卷积的,所以是满足平移不变性的。
附上表达式: h ( L k τ x ) [ u ] = L τ h ( x ) h(L_{k\tau}x)[u]=L_\tau h(x) h(Lkτx)[u]=Lτh(x)
因此,作者说我们之后采取的center crop目标出来进行训练这个操作是不会让网络学习到位置偏移(一开始我也不是很明白这个是什么意思,看到后面的Siamrpn++等文章明白是说训练出来的结果不会仅对中心位置响应大)。
Training 阶段:
我们采取的loss function:
l
(
y
,
v
)
=
log
(
1
+
exp
(
−
y
v
)
)
l(y,v)=\log(1+\exp(-yv))
l(y,v)=log(1+exp(−yv))(v表示在x_img上crop出来的subwindow最后在scoremap上的得分,y表示该subwindows的真实标签{-1/1})。
接着我们定义整张score map的loss function是:
L
(
y
,
v
)
=
1
∣
D
∣
∑
u
∈
D
l
(
y
[
u
]
,
v
[
u
]
)
L(y,v)={1\over |D|}\sum_{u\in D}l(y[u],v[u])
L(y,v)=∣D∣1u∈D∑l(y[u],v[u])公式中,
y
[
u
]
∈
{
+
1
,
−
1
}
y[u]\in {{\{+1,-1\}}}
y[u]∈{+1,−1}是指score map上每个位置each position
u
∈
D
u\in D
u∈D 的真实标签,而
v
[
u
]
v[u]
v[u]是指score map上每个位置each position
u
∈
D
u\in D
u∈D 的分数。
我们训练的方法:SGD(随机梯度下降)求解conv-net
θ
\theta
θ
arg
min
θ
E
(
z
,
x
,
y
)
L
(
y
,
f
(
z
,
x
;
θ
)
)
\arg\min_\theta \mathop{\Bbb E}_{(z,x,y)}L(y,f(z,x;\theta))
argθminE(z,x,y)L(y,f(z,x;θ))To be honest,我并没有很理解
θ
\theta
θ是干什么的…(conv-net是MATLAB的那个库吧?难道和这个有关?有大佬懂得可以评论下哈)
我们打标签的方法:既然上面用到了标签这个东西,那该怎么create label呢?作者说在距离scoremap中心以R为半径的圆内的elements都算作正样本(考虑到网络的步长k)。其实这句话有点绕,就是在score map上以中心为圆心,在以半径为R/k画圆,在此范围内的elements都是正样本。
我们获取训练样本的方法:训练的图像对是从同一个视频中抽取获得的,当sub-window的大小超过了图片的边缘时,超出的部分用RBG的均值来填充。
(忽略我的文字,当我看完代码后,那些问题都烟消云散了哈哈哈哈,说明还是要看代码才能深入理解论文想表达的意思。)
我们采用的数据集:ImageNet Video (train) ALOV/OTB/VOT (test)
Practical consideration
这个部分准备在下一篇代码解读的时候一起写好了,毕竟有些操作结合代码一起看会比较好理解一些。
Q&A
Q1.为什么我们训练的时候要采用center-crop?
A1:应该是为了更好地去学习我们想要学习的跟踪对象的特征,其他干扰我学习的物体(背景信息)我就让他们统统消失,其实后面的论文也指出有时候一些适当的背景信息也是有利于我们进行inference。(论文中其实也给出了他们的解释:Since our network is fully-convolutional,there is no risk that it is effective to consider search images centred on the target because it is likely that the most difficult sub-windows,and those which have the most influence on the performance of the tracker,are those adjacent to the target.)
Q2.为什么加余弦窗就可以对大位移进行惩罚?
A2:emmm这个我也不知道,但是感觉很多论文都是加了余弦窗,可能是个常规操作?哭了,感觉自己是信号没学好还是图像处理的知识不扎实。
Q3.怎么通过score map返回到最原始的frame上?
A3:应该是乘相应的步长然后一步步推回去,具体的操作看代码就好了。
改进思路
其实在SiameseFC上修改的地方有很多,而且很多论文也实现了这些想法,例如backbone的修改,bb的回归,度量方式的改变,模板更新策略的添加等等。(感觉大佬们已经玩出花了,而我还在山脚下,哭泣)