文章介绍
(SSD: Single Shot MultiBox Detector,ECCV2016)
本文提出一种利用单个深度神经网络来实现图像目标检测的算法——SSD(Single Shot MultiBox Detector)。该算法相比现有的目标检测算法进一步提升了目标检测的速度,也保证了目标检测准确率。此外,在低分辨的情况下也可以达到很高的检测准确率、进一步提升检测速度。
SSD算法将边界框的输出空间离散化为一组默认框,每个特征映射位置有不同的长宽比和比例, 以及在预测时,网络为每个默认框中每个对象类别的存在生成分数,并对框进行调整以更好地匹配对象形状。该算法基于 feed-forward convolutional network——前馈卷积网络(该篇文章的SSD是基于VGG-16网络),其网络为这些框中分类实例的存在产生固定大小的边界框和分数集合,随后是non-maximum suppression step——非最大抑制步骤,产生最终检测结果。
算法模型
模型介绍
1. Multi-scale feature maps
SSD uses multiple feature maps of decreasing resolution to output bounding boxes of increasing size.图 1
2. More default boxes
SSD discretizes bounding boxes spaces into many bins, preventing box coordinates averaging when several likely hypotheses are present in the same default box.
图 2
3. SSD Architecture
SSD网络中分为了6个stage,每个stage能学习到一个特征图,然后进行边框回归和分类。SSD网络以VGG16的前5层卷积网络作为第1个stage,然后将VGG16中的fc6和fc7两个全连接层转化为两个卷积层Conv6和Conv7作为网络的第2、第3个stage。接着在此基础上,SSD网络继续增加了Conv8、Conv9、Conv10和Conv11四层网络,用来提取更高层次的语义信息。如图3所示就是SSD的网络结构。在每个stage操作中,网络包含了多个卷积层操作,每个卷积层操作基本上都是小卷积.。
骨干网络:SSD前面的骨干网络选用的VGG16的基础网络结构,如上图所示,虚线框内的是VGG16的前5层网络。然后后面的Conv6和Conv7是将VGG16的后两层全连接层网络(fc6, fc7)转换而来。
另外:在此基础上,SSD网络继续增加了Conv8和Conv9、Conv10和Conv11四层网络。图中所示,立方体的长高表示特征图的大小,厚度表示是channel。
图 3
SSD模型中的几个重要组成部分:
- Multi-scale feature maps(图1所示);
- Convolutional predictors;
- Default boxes and aspect ratios.
training中涉及到的关键技术:
- Choosing scales and aspect ratios for default boxes;
- The hard negative mining;
- Data augmentation.
此外,在训练时在前馈网络上新添加的所有卷积层参数初始化采用xavier方法。
(联合)损失函数(Loss function):该损失函数是局部化损失和置信损失的加权和。
L ( x , c , l , g ) = 1 N ( L con f ( x , c ) + α L l o c ( x , l , g ) ) L(x, c, l, g)=\frac{1}{N}\left(L_{\operatorname{con} f}(x, c)+\alpha L_{l o c}(x, l, g)\right) L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))
其中,
L
l
o
c
(
x
,
l
,
g
)
=
∑
i
∈
P
o
s
N
∑
m
∈
{
c
x
,
c
y
,
w
,
h
}
x
i
j
k
smooth
L
1
(
l
i
m
−
g
^
j
m
)
L_{l o c}(x, l, g)=\sum_{i \in P o s}^{N} \sum_{m \in\{c x, c y, w, h\}} x_{i j}^{k} \text { smooth }_{\mathrm{L} 1}\left(l_{i}^{m}-\hat{g}_{j}^{m}\right)
Lloc(x,l,g)=i∈Pos∑Nm∈{cx,cy,w,h}∑xijk smooth L1(lim−g^jm)
g
^
j
c
x
=
(
g
j
c
x
−
d
i
c
x
)
/
d
i
w
g
^
j
c
y
=
(
g
j
c
y
−
d
i
c
y
)
/
d
i
h
g
^
j
w
=
log
(
g
j
w
d
i
w
)
g
^
j
h
=
log
(
g
j
h
d
i
h
)
\begin{aligned} \hat{g}_{j}^{c x}=\left(g_{j}^{c x}-d_{i}^{c x}\right) / d_{i}^{w} & \hat{g}_{j}^{c y}=\left(g_{j}^{c y}-d_{i}^{c y}\right) / d_{i}^{h} \\ \hat{g}_{j}^{w}=\log \left(\frac{g_{j}^{w}}{d_{i}^{w}}\right) & \hat{g}_{j}^{h}=\log \left(\frac{g_{j}^{h}}{d_{i}^{h}}\right) \end{aligned}
g^jcx=(gjcx−dicx)/diwg^jw=log(diwgjw)g^jcy=(gjcy−dicy)/dihg^jh=log(dihgjh)
L
c
o
n
f
(
x
,
c
)
=
−
∑
i
∈
P
o
s
N
x
i
j
p
log
(
c
^
i
p
)
−
∑
i
∈
N
e
g
log
(
c
^
i
0
)
where
c
^
i
p
=
exp
(
c
i
p
)
∑
p
exp
(
c
i
p
)
L_{c o n f}(x, c)=-\sum_{i \in P o s}^{N} x_{i j}^{p} \log \left(\hat{c}_{i}^{p}\right)-\sum_{i \in N e g} \log \left(\hat{c}_{i}^{0}\right) \quad \text { where } \quad \hat{c}_{i}^{p}=\frac{\exp \left(c_{i}^{p}\right)}{\sum_{p} \exp \left(c_{i}^{p}\right)}
Lconf(x,c)=−i∈Pos∑Nxijplog(c^ip)−i∈Neg∑log(c^i0) where c^ip=∑pexp(cip)exp(cip)
N
N
N 是匹配默认框的数量,
α
\alpha
α由交叉验证设置为1,其余的一些具体细节请参考文章。
模型分析
图4 给出了不同关键技术对于检测准确率影响得到的结果。
从图4的结果以及后续的实验结果可得以下结论( 此处只给出一组实验结果,其余的实验结果请参考该文章):
- Data augmentation是至关重要的,对于检测的准确率影响很大,特别是小目标的检测准确率;
- Multiple output layers对于不同分辨率的图像得到的检测准确率也是很不错的,特别是对低分辨率的图像依旧可以有很好的正确检测率;
- 该算法对于小目标的检测准确率还有很大的提升空间;
- 通过增大训练图像的尺寸可以进一步提升检测准确率。
复现代码
Caffe代码:Caffe
Paddlepaddle代码:Paddlepaddle
Tensorflow代码:Tensorflow
Pytorch代码:Pytorch
Keras代码:Keras
未来的工作
- 针对小目标检测做进一步的研究;
- 考虑如何设计出更好的 tiling of default boxes;
- 用更快的基础网络来进一步提升SSD的速度。
参考文献
[1]: https://zhuanlan.zhihu.com/p/32929487
[2]: https://arleyzhang.github.io/articles/786f1ca3/
[3]: https://zhuanlan.zhihu.com/p/33544892
[4]: http://www.cs.unc.edu/~wliu/