1. 前言
目标检测随着深度学习的应用取得了很重要的进展,目前主要的算法主要分为两类,(1) two-stage方法,如R-CNN算法,主要思路是先通过启发式方法(selective search)或者CNN网络产生一系列的候选框,然后对候选框利用回归和分类,该方法的优势是准确率高;(2)one-stage方法,如yolo和SSD,主要思路是均匀的在图片的不同位置进行密集抽样,抽样时可以采用不同的尺度和长宽比,然后利用CNN提取特征后直接进行回归和分类,整个过程只需要一步,其优势是速度快,缺点是训练困难,主要是因为正样本和负样本极不均衡,导致模型准确度稍低,不同算法的性能如下图.
下图为不同算法的基本框图
2. 网络结构
SSD网络结构如下图所示,利用多尺度特征图进行目标检测,并依次进行边界框回归和分类判断。不同层次的特征图表示不同的语义信息,低层次的特征图代表低层次的语义信息(更多细节,如图像的边),可检测到小目标物体,高层次的特征图代表更高层的语义信息,可检测到大目标物体。因此利用SSD可以检测出小目标物体,实现代码可参考之前一篇关于SSD模型pytorch实现分析的博客。
SSD网络使用了6个不同大小的特征图,利用VGG16网络结构的Conv5_3 层(第一特征层),同时将FC6和FC7变成两个卷积层,FC7(conv7)层的输出作为第二个特征层,后面接多个卷积层得到第三到第六个特征层(Conv8_2、Conv9_2、Conv10_2、Conv11_2),每个网络都是利用
1
∗
1
1*1
1∗1和
3
∗
3
3*3
3∗3卷积。与YOLO相比,YOLO网络只使用了一层特征来进行目标检测。
下图为输入图像,在每层中的特征大小,以及6个特征图进行检测和分类的default boxes数量统计。
下表为SSD300每个stage特征图输出图像大小、Detector和classifier输出特征大小
表1
stage | name | Output size | Detector | classifier | def.boxes num |
---|---|---|---|---|---|
1 | Conv4_3 | 38 ∗ 38 ∗ 512 38*38*512 38∗38∗512 | 38 ∗ 38 ∗ 16 38*38*16 38∗38∗16 | 38 ∗ 38 ∗ 84 38*38*84 38∗38∗84 | 4 |
2 | FC7 | 19 ∗ 19 ∗ 1024 19*19*1024 19∗19∗1024 | 19 ∗ 19 ∗ 24 19*19*24 19∗19∗24 | 19 ∗ 19 ∗ 126 19*19*126 19∗19∗126 | 6 |
3 | Conv8_2 | 10 ∗ 10 ∗ 512 10*10*512 10∗10∗512 | 10 ∗ 10 ∗ 24 10*10*24 10∗10∗24 | 10 ∗ 10 ∗ 126 10*10*126 10∗10∗126 | 6 |
4 | Conv9_2 | 5 ∗ 5 ∗ 256 5*5*256 5∗5∗256 | 5 ∗ 5 ∗ 24 5*5*24 5∗5∗24 | 5 ∗ 5 ∗ 126 5*5*126 5∗5∗126 | 6 |
5 | Conv10_2 | 3 ∗ 3 ∗ 256 3*3*256 3∗3∗256 | 3 ∗ 3 ∗ 16 3*3*16 3∗3∗16 | 3 ∗ 3 ∗ 84 3*3*84 3∗3∗84 | 4 |
6 | Conv1_2 | 1 ∗ 1 ∗ 256 1*1*256 1∗1∗256 | 1 ∗ 1 ∗ 16 1*1*16 1∗1∗16 | 1 ∗ 1 ∗ 84 1*1*84 1∗1∗84 | 4 |
如下图为stage 4中得到特征图后的处理,其中localization表示进行边界框回归,其中24表示
6
∗
4
6*4
6∗4,每个特征点有6个box,每个box使用4个值表示box位置,confidence表示分类判断,
126
=
6
∗
21
126=6*21
126=6∗21,每个box输出21个输出表示voc07的21个分类.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g02r01eG-1576640301219)(SSD/1.PNG)]
box位置回归和分类处理如下,以stage 4中的特征为实例说明.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L3tt8j5B-1576640301221)(SSD/2.PNG)]
3. default boxes生成
类似于Faster-RCNN中的Anchor,本文中起名为default boxes,def. boxes的选择直接决定了检测的性能。SSD中根据每个stage的Feature Map的大小,按照固定的Scale和Radio生成Default Boxes。SSD的default boxes的边长宽度为
w
k
a
=
s
k
a
r
w _ { k } ^ { a } = s _ { k } \sqrt { a _ { r } }
wka=skar和高度为
h
k
a
=
s
k
/
a
r
h _ { k } ^ { a } = s _ { k } / \sqrt { a _ { r } }
hka=sk/ar,其中
a
r
a _ { r }
ar为高宽比,
a
r
∈
{
1
,
2
,
3
,
1
2
,
1
3
}
a _ { r } \in\left\{ 1,2,3 , \frac { 1 } { 2 } , \frac { 1 } { 3 } \right\}
ar∈{1,2,3,21,31},对高宽比为1时为正方形box,还有一个正方形box,边长为
s
k
′
=
s
k
S
k
+
1
s _ { k } ^ { \prime } = \sqrt { s _ { k } S _ { k + 1 } }
sk′=skSk+1,每个box的中心坐标为
(
i
+
0.5
∣
f
k
∣
,
j
+
0.5
∣
f
k
∣
)
\left( \frac { i + 0.5 } { \left| f _ { k } \right| } , \frac { j + 0.5 } { \left| f _ { k } \right| } \right)
(∣fk∣i+0.5,∣fk∣j+0.5),其中
∣
f
k
∣
|f_k|
∣fk∣表示当前特层的正方形的宽度,上面提到的
s
k
s_k
sk按照下面的公式计算得到,然后乘以对应的输入图像宽度。
s
k
=
s
min
+
s
max
−
s
min
m
−
1
(
k
−
1
)
,
k
∈
[
1
,
m
]
s _ { k } = s _ { \min } + \frac { s _ { \max } - s _ { \min } } { m - 1 } ( k - 1 ) , \quad k \in [ 1 , m ]
sk=smin+m−1smax−smin(k−1),k∈[1,m]
其中
s
m
i
n
=
0.2
s_{min}=0.2
smin=0.2,
s
m
a
x
=
0.9
s_{max}=0.9
smax=0.9,下图中的中间框为default boxes,使用的缩放比例为2,1/2;如表1,不同的stage使用的default box数量不同,其中为4的未使用3和1/3的长宽比。实际使用过程中根据实际进行调节boxes的大小。
4. 训练策略
4.1. 正负样本
给定输入图像以及每个物体的Ground Truth,首先找到每个Ground True box对应的default box中IOU最大的最为正样本.然后,在剩下的default box中寻找与Ground Truth 的IOU大于0.5的default box作为正样本.一个Ground Truth可能对应多个正样本default box.其他的default box作为负样本.下图中给定的输入图像和Ground Truth,分别在两个不同尺度(feature map大大小为
8
∗
8
,
4
∗
4
8*8,4*4
8∗8,4∗4)下的匹配情况,有两个default box与猫匹配(
8
∗
8
8*8
8∗8),一个default box与狗匹配(
4
∗
4
4*4
4∗4).
通过上述放大得到的正样本数量相对负样本数量会少很多,为了保证样本尽量平衡,SSD采用了hard nagative mining,即对负样本进行抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行奖序排列,选取误差较大的top-k作为训练的负样本,保证正负样本比例接近1:3.
4.2. 目标函数
目标函数为训练过程中的优化标准,目标函数也称损失函数,主要包括位置误差(localization loss,loc) 与置信度误差(confidence loss,conf,分类损失)的加权和,定义
x
i
j
p
=
{
1
,
0
}
x_{ij}^p=\{1,0\}
xijp={1,0}为第i个默认框和对应的第j个Ground Truth box,相应的类别为p.目标函数定义为:
L
(
x
,
c
,
l
,
g
)
=
1
N
(
L
c
o
n
f
(
x
,
c
)
+
α
L
l
o
c
(
x
,
l
,
g
)
)
L ( x , c , l , g ) = \frac { 1 } { N } \left( L _ { c o n 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))
其中,N为匹配的默认框.如果N0,loss为0.
L
c
o
n
f
L_{conf}
Lconf为预测框
l
l
l和Ground Truth
g
g
g的Smooth L1 loss,
α
\alpha
α值通过cross validation设置为1.
L
1
(
x
)
=
{
0.5
x
2
if
∣
x
∣
<
1
∣
x
∣
−
0.5
otherwise
_ { L _ { 1 } } ( x ) = \left\{ \begin{array} { l l } { 0.5 x ^ { 2 } } & { \text { if } | x | < 1 } \\ { | x | - 0.5 } & { \text { otherwise } } \end{array} \right.
L1(x)={0.5x2∣x∣−0.5 if ∣x∣<1 otherwise
L
l
o
c
L_{loc}
Lloc定义如下:
L
l
o
c
(
x
,
l
,
g
)
=
∑
i
∈
P
o
s
m
∈
{
c
x
,
c
y
,
w
,
h
}
N
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 m \in \{ c x , c y , w , h \} } ^ { N } x _ { i j } ^ { k } \operatorname { smooth } _ { \mathrm { L } 1 } \left( l _ { i } ^ { m } - \hat { g } _ { j } ^ { m } \right)
Lloc(x,l,g)=i∈Posm∈{cx,cy,w,h}∑NxijksmoothL1(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 \hat { g } _ { j } ^ { c x } = \left( g _ { j } ^ { c x } - d _ { i } ^ { c x } \right) / d _ { i } ^ { w } \quad \hat { g } _ { j } ^ { c y } = \left( g _ { j } ^ { c y } - d _ { i } ^ { c y } \right) / d _ { i } ^ { h } g^jcx=(gjcx−dicx)/diwg^jcy=(gjcy−dicy)/dih
g ^ j w = log ( g j w d i w ) g ^ j h = log ( g j h d i h ) \hat { g } _ { j } ^ { w } = \log \left( \frac { g _ { j } ^ { w } } { d _ { i } ^ { w } } \right) \quad \hat { g } _ { j } ^ { h } = \log \left( \frac { g _ { j } ^ { h } } { d _ { i } ^ { h } } \right) g^jw=log(diwgjw)g^jh=log(dihgjh)
其中, l l l为预测框, g g g为Ground Truth. ( c x , c y ) (cx,cy) (cx,cy)为补偿后的默认框 d d d的中心, ( w , h ) (w,h) (w,h)为默认框的宽和高.
L
c
o
n
f
L_{conf}
Lconf定义为多类别softmax loss,公式如下:
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)
4.3. 数据增强
采用数据扩增(data Augmentation)可提升SSD性能,主要采用的技术有水平翻转(horizontal flip),随机裁剪加颜色扭曲(random crop & color distortion),随机采样块域(Randomly sample a patch)(获取小目标训练样本),如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wjYcGnaK-1576640301221)(SSD/SSD-data1.png)]
5.性能评估
SSD在VOC2007,VOC2012和COCO数据集上的性能如下表所示.SSD512性能好一些,加*的表示使用了数据增强技术,创建了小样本,来提升SSD在小目标上的检测效果,性能会提升.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V6pT3FEh-1576640301222)(SSD/SSD-result1.png)]
SSD与其它检测算法对比结果(VOC2007)如下,SSD与Faster-RCNN有同样的准确度,并且与YOLO具有同样快的检测速度.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jPGEBZdx-1576640301223)(SSD/SSD-result2.png)]
文中对使用的各种Trick做了分析,下表为各种track组合对SSD性能的影响,从表中可以得出如下结论:
1).数据增强技术对提升mAP作用很大;
2)使用不同长宽比的先验框可以得到更好的结果;
采用多尺度的特征图用于检测至关重要,如下表:
6. 总结
本文就SSD实现过程中的几个关键问题进行了总结,主要包括网络模型,default boxes生成,训练策略等;SSD在YOLO的基础上主要进行了三点改进:多尺度特征图,利用卷积进行检测,设置先验框.多尺度检测中利用前几层的卷积进行检测,对小目标检测效果要好一些.
7. 参考
1.https://blog.csdn.net/xiaohu2022/article/details/79833786
2.https://jizhi.im/blog/post/gpu-p6
3.https://zhuanlan.zhihu.com/p/25100992
4.https://zhuanlan.zhihu.com/p/24954433
6.https://www.jianshu.com/p/0903b160d554
7.https://blog.csdn.net/neu_chenguangq/article/details/79057655