参考代码:SiamMask
1. 概述
导读:这篇文章在基于孪生网络的目标跟踪算法离线训练的过程中嵌入一个mask分割分支,从而可到一个既可以做VOT也可以做VOS(分割性能这块可以还有很大空间)的网络结构SiamMask(含3和2输出的两个变种)。训练完成之后只需要给定初始的边界框初始化就可以产生跟踪目标的分割mask与对应的旋转外接矩(或者更加符合跟踪目标的边界框表达),此外由于不需要finetune且网络简单因而额速度很快能达到55FPS,但是分割性能就差一些。这篇文章将跟踪与分割组合点子还是不错的,使人想到了mask rcnn。
下面是使用文章的方法进行跟踪与目标分割的结果展示:

这篇文章的基础是基于孪生网络(不同数据输入,网络权值共享)的跟踪算法,文章很大的灵感是来自于SiamFC与SiamRPN的,下面也将会这两个网络进行介绍。
SiamFC
在孪生网络对于当前帧与参考目标运算之后会得到两个特征图(
x
,
z
x,z
x,z),之后使用参考目标的特征图当作滑动窗口(文中对应位response of a candidate window,RoW)在当前帧的特征图上进行滑动,计算不同位置处的cross-correlated:
g
θ
n
=
f
θ
(
z
)
⋅
f
θ
n
(
θ
)
g_{\theta}^n=f_{\theta}(z)\cdot f_{\theta}^n(\theta)
gθn=fθ(z)⋅fθn(θ)
其中,
n
n
n就是对应的滑动窗口位置索引。之后SiamFC就在这些位置上去寻找最大响应的地方,之后通过卷积的映射关系还原出目标在当前帧的位置,使用的损失函数是Logistic Loss(记为
L
s
i
m
L_{sim}
Lsim)。文章对相关性分析这块进行了改进,使用了
n
∗
c
n*c
n∗c维度上的分组卷积进行实现。
SiamRPN
这个方法是在SiamFC的基础上进行改进的,改进之处就是给网络添加了RPN的网络结构,每个RoW编码
k
k
k个anchor box,输出是每个框的置信度与偏移量回归,使用的损失函数是交叉熵损失函数与Smooth L1损失函数,记作
L
s
c
o
r
e
,
L
b
o
x
L_{score},L_{box}
Lscore,Lbox。
2. SiamMask方法
SiamMask方法参考了之前讲到的SiamFC与SiamRPN方法,对应的就是文章提出的带有3个输出分支与2个输出分支的版本了。对应见图2所示:

2.1 分割分支
这里假设输入的目标样本分辨率为
w
∗
h
w*h
w∗h,则对应的分割分支也需要生成对应大小的mask结果
h
ϕ
h_{\phi}
hϕ,这是有由两层的卷积网络实现的(对于每个RoW都会有一个Mask),这里对分割掩膜的生成与之前的FCN类的分割方法还不太一样,其是在RoW的channel维度上增加,从而提升性能。因而对于第
n
n
n个RoW其生成的分割掩膜为:
m
n
=
h
ϕ
(
g
θ
n
(
z
,
x
)
)
m_n=h_{\phi}(g_{\theta}^n(z,x))
mn=hϕ(gθn(z,x))
这里生成的掩膜是二值的,使用的损失函数是Logistic Loss,二值目标标签为
y
n
∈
{
−
1
,
1
}
y_n\in \{-1,1\}
yn∈{−1,1},则对应的分割损失函数为:
L
m
a
s
k
(
θ
,
ϕ
)
=
∑
n
(
1
+
y
n
2
w
h
∑
i
,
j
l
o
g
(
1
+
e
c
n
i
,
j
m
n
i
,
j
)
)
L_{mask}(\theta,\phi)=\sum_{n}(\frac{1+y_n}{2wh}\sum_{i,j}log(1+e^{c_n^{i,j}m_n^{i,j}}))
Lmask(θ,ϕ)=n∑(2wh1+yni,j∑log(1+ecni,jmni,j))
从上面的损失计算过程可以看出这里只对正样本做了损失计算。
上面的分割约束过程是在Cross-Correlation结果的spatial上的一个点上做的,也就是说上面的每个点就是一个mask的预测,在给出的代码里面使用,下面的代码来将这个点转化为一个分割结果:
# ref: https://github.com/foolwood/SiamMask/blob/master/models/siammask.py
# N*(63*63)*1*1-->N*1*1*(63*63)-->N*1*63*63
p_m = p_m.permute(0, 2, 3, 1).contiguous().view(-1, 1, o_sz, o_sz)
除了上面提到的在channel维度上增加(为了去预测63*63大小的分割结果) ,文章还是使用了低层次特征来优化的方式,类似于分割模型里面的decoder部分。其结构见下图所示:

其中的上采样连接模块为:

这部分的代码请参考:
https://github.com/foolwood/SiamMask/blob/master/experiments/siammask_sharp/custom.py
https://github.com/foolwood/SiamMask/blob/master/models/siammask_sharp.py
2.2 网络结构的变种
文章添加了Mask分支之后产生了对应两个模型分支(带有3或2个输出分支),对应的2分支的损失函数为:
L
2
B
=
λ
1
L
m
a
s
k
+
λ
2
L
s
i
m
L_{2B}=\lambda_1 L_{mask}+\lambda_2 L_{sim}
L2B=λ1Lmask+λ2Lsim
对应的3分支的损失函数为:
L
3
B
=
λ
1
L
m
a
s
k
+
λ
2
L
s
c
o
r
e
+
λ
3
L
b
o
x
L_{3B}=\lambda_1 L_{mask}+\lambda_2 L_{score}+\lambda_3 L_{box}
L3B=λ1Lmask+λ2Lscore+λ3Lbox
其中,
λ
1
=
32
,
λ
2
=
λ
3
=
1
\lambda_1=32,\lambda_2=\lambda_3=1
λ1=32,λ2=λ3=1。
3. 实验结果
跟踪性能:

视频分割性能:

消融实验:

推荐文章:
本文详细介绍了SiamMask论文,这是一种结合目标跟踪与分割的在线算法。通过在孪生网络中添加分割分支,SiamMask实现了快速跟踪(55FPS)并同时提供分割结果。它基于SiamFC和SiamRPN,添加了3个或2个输出分支的网络结构,使用Logistic Loss和Smooth L1损失函数进行训练。实验结果显示了其在跟踪和分割任务上的优秀性能。
377

被折叠的 条评论
为什么被折叠?



