Real-Time MDNet (ECCV2018) 论文地址 代码
写在前面
这篇论文的作者之一Bohyung Han是MDNet,TCNN的作者。这篇论文从题目中也可以看到,是一个加速了的MDNet,总体网络结构和MDNet一样,就是加了一个RoIAlign层,把从卷积层输出的特征压成了 3 ∗ 3 3*3 3∗3的,这样就加快了速度。并且他们的损失函数使用了两个损失项,一项是对于某个类的前景背景分类损失,一个是类之间的分类损失,通过这个提升了网络的精度,得到了加快的MDNet,并且精度几乎和原始的MDNet一样。
Motivation
在目标跟踪领域,利用深度学习的方法以牺牲时间为代价来获得高精度结果,MDNet的提出很大程度提高了目标跟踪的精度,但是MDNet很难区分未见过的物体,特别是这个物体和目标有相似的语义。而且目前的这些网络其实用的分类的数据集,这样就造成了网络只能有效的做前景背景的区分,但是很难去辨别两个物体之间的差距。
Contribution
- 他们使用了RoIAlign技术来加快网络的特征提取,并且保持了网络的精度,提出了一个实时的跟踪算法;
- 他们使用了Multi-task的损失函数,(1)区分目标和背景;(2)区分物体实例;
- 比MDNet快了25倍,几乎保持了一样的精度。
Algorithm
这篇文章的网络结构如下:
网络一共有三个卷积层+一个自适应的RoIAlign层+三个全连接层。其中前三层的参数跟VGG-M一样,三个全连接层参数随机初始化。一张输入图像,在经过三个卷积层提取特征后,进入了自适应的RoIAlign层提取RoI,这个操作减少了很多时间。然后提取的RoI传入下面的两个全连接层,这两个全连接层的输出是二值化的,代表这个proposal是前景和背景的score。与MDNet一样,最后一个全连接层被分为D个branch (
f
c
6
1
−
f
c
6
D
fc6^1 -fc6^D
fc61−fc6D),每一个分支代表一个一个domain,也就是一个minibatch中的一个视频序列。(上图从第一个全连接层就开始分成三个,但是论文里只提到了最后一层分成D个,大概这图也只是示意,并不是分开的意思把~)
Adaptive RoIAlign
因为直接在第三层出来的特征上做RoIAlign太粗糙了,第三层输出的特征太少了,所以他们把第二个卷积层后面的Maxpooling层删掉了,然后还在第三层上做了一个加大的卷积操作,主要功能就是放大conv3的尺寸,感兴趣的可以看参考文献[1]。
这里的自适应其实是指在做RoIAlign时的步长,他们提出如果RoIAlign步长大于feature map,那就会丢掉很多信息,所以把步长都设成了
[
w
w
′
]
[\frac{w}{w'}]
[w′w],
w
w
w是conv3出来特征图的维度,
w
′
w'
w′是最终得到的RoI维度,
[
⋅
]
[\cdot]
[⋅]是向下取整,这里是
7
∗
7
7*7
7∗7。所以这个RoIAlign就是自适应的了,文章表明这个管用可能是因为在跟踪任务中,一点小的调整可能对最终跟踪结果影响很大。
Instance Embedding(Pretraining)
这边就是将实例的损失加入总的损失函数中,这里的想法就是将其他domain的前景目标加入到某个特定的domain中,获得更加具有语义区分度的跟踪器。主要的做法如下,对于一个属于Domain d的图片
x
d
x^d
xd和它的bbox,得到一个输出如下:
f
d
=
[
ϕ
1
(
x
d
;
R
)
,
ϕ
2
(
x
d
;
R
)
,
.
.
.
ϕ
D
(
x
d
;
R
)
]
∈
R
2
∗
D
f^d = [\phi^1 (x^d; R),\phi^2 (x^d;R),...\phi^D(x^d;R)]\in R^{2*D}
fd=[ϕ1(xd;R),ϕ2(xd;R),...ϕD(xd;R)]∈R2∗D
就是将每个
f
c
6
fc6
fc6的输出都连接起来,其中
ϕ
d
(
⋅
;
⋅
)
\phi^d(\cdot ;\cdot )
ϕd(⋅;⋅)只有两个值,表示这个目标是前景还是背景。
然后根据以上输出就可以计算一个前景背景分类损失
σ
c
l
s
\sigma_{cls}
σcls 和实例分类损失
σ
i
n
s
t
\sigma_{inst}
σinst:
[
σ
c
l
s
(
f
d
)
]
i
j
=
e
x
p
(
f
i
j
d
)
∑
k
=
1
2
e
x
p
(
f
i
j
d
)
[\sigma_{cls}(f^d)]_{ij} = \frac{exp({f_{ij}}^d)}{\sum_{k=1}^2exp({f_{ij}}^d)}
[σcls(fd)]ij=∑k=12exp(fijd)exp(fijd)
[
σ
i
n
s
t
(
f
d
)
]
i
j
=
e
x
p
(
f
i
j
d
)
∑
k
=
1
D
e
x
p
(
f
i
j
d
)
[\sigma_{inst}(f^d)]_{ij} = \frac{exp({f_{ij}}^d)}{\sum_{k=1}^Dexp({f_{ij}}^d)}
[σinst(fd)]ij=∑k=1Dexp(fijd)exp(fijd)
其实从上面两个式子也可以看出,上一个是为了得到当前目标在当前Domain中被分类为前景的概率占总的概率;下一个是得到当前目标在当前Domain中分类的score与它在所有Domain中的score和之间的比例。这个网络的损失函数就是把这两项加起来:
L
=
L
c
l
s
+
L
i
n
s
t
L = L_{cls}+L_{inst}
L=Lcls+Linst
其中
L
c
l
s
L_{cls}
Lcls和
L
i
n
s
t
L_{inst}
Linst如下:
L
c
l
s
=
−
1
N
∑
i
=
1
N
∑
c
=
1
2
[
y
i
]
c
d
^
(
k
)
⋅
l
o
g
(
[
σ
c
l
s
(
f
i
d
^
(
k
)
)
]
c
d
^
(
k
)
)
L_{cls} = -\frac{1}{N}\sum_{i=1}^N \sum_{c =1}^2 [y_i]_{c\hat{d}(k)} \cdot log([\sigma_{cls}({f_i}^{\hat{d}(k)})]_{c\hat{d}(k)})
Lcls=−N1i=1∑Nc=1∑2[yi]cd^(k)⋅log([σcls(fid^(k))]cd^(k))
L
i
n
s
t
=
−
1
N
∑
i
=
1
N
∑
d
=
1
D
[
y
i
]
+
d
⋅
l
o
g
(
[
σ
i
n
s
t
(
f
i
d
)
]
+
d
)
L_{inst} = -\frac{1}{N}\sum_{i=1}^N \sum_{d =1}^D [y_i]_{+d} \cdot log([\sigma_{inst}({f_i}^{d})]_{+d})
Linst=−N1i=1∑Nd=1∑D[yi]+d⋅log([σinst(fid)]+d)
其中 d ^ ( k ) = ( k % D ) \hat{d}(k) = (k \% D) d^(k)=(k%D)
其中
L
i
n
s
t
L_{inst}
Linst只取为前景的,加了这个
L
i
n
s
t
L_{inst}
Linst效果如下图:
Online Tracking
在跟踪的时候,在第一帧提取proposal来fine-tune网络,并训练boundingbox回归的参数,在模型更新也跟MDNet一样的时候长短时间更新,然后也有hard negative mining,都和MDNet一样,这里就不赘述了。具体的网络训练和更新细节可以去看论文。
Experiments
他们在OTB2015,UAV123和TempleColor上做的测试,文章里没有涉及到VOT的库,这篇文章和MDNet存在同样的问题,当出现过分遮挡、运动过快、out-of-plane时会失败:
总结
这篇论文引入了RoIAlign的方式来加快,然后通过优化损失函数来提高精度,虽然在精度上和MDNet差不多,但是时间确实是快了,不知道能不能应用在目前比较慢的一些算法中,ECO、CCOT这样的。
优点
- 引入了RoIAlign的方式,受到了Faster R-CNN的启发,其实也在告诉我们现在的趋势是偏向多领域结合;
- 在损失函数上加了一个实例级别的损失项,强调了实例之间的区分,对网络的精度做了很大的贡献。
缺点
- 精度比原来的MDNet还差一点点,并且也比不过ECO,CCOT,和现在18年的Siamese网络速度和精度上都还有一定差距;
- 这篇文章虽说是增强了实例级别的区分能力,但其实做的还是在已知的类之间的区分,遇到训练数据集中没有出现过的类可能效果就不会好;
- 模型还是需要在线的fine-tune,花费了很多时间。
参考文献
[1]DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs, 论文链接