目标检测-SSD理解

目标检测-SSD理解

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 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 16 38*38*16 38 38 84 38*38*84 4
2 FC7 19 19 1024 19*19*1024 19 19 24 19*19*24 19 19 126 19*19*126 6
3 Conv8_2 10 10 512 10*10*512 10 10 24 10*10*24 10 10 126 10*10*126 6
4 Conv9_2 5 5 256 5*5*256 5 5 24 5*5*24 5 5 126 5*5*126 6
5 Conv10_2 3 3 256 3*3*256 3 3 16 3*3*16 3 3 84 3*3*84 4
6 Conv1_2 1 1 256 1*1*256 1 1 16 1*1*16 1 1 84 1*1*84 4

​ 如下图为stage 4中得到特征图后的处理,其中localization表示进行边界框回归,其中24表示 6 4 6*4 ,每个特征点有6个box,每个box使用4个值表示box位置,confidence表示分类判断, 126 = 6 21 126=6*21 ,每个box输出21个输出表示voc07的21个分类.
在这里插入图片描述

box位置回归和分类处理如下,以stage 4中的特征为实例说明.
在这里插入图片描述

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 } } 和高度为 h k a = s k / a r h _ { k } ^ { a } = s _ { k } / \sqrt { a _ { r } } ,其中 a r a _ { r } 为高宽比, a r { 1 , 2 , 3 , 1 2 , 1 3 } a _ { r } \in\left\{ 1,2,3 , \frac { 1 } { 2 } , \frac { 1 } { 3 } \right\} ,对高宽比为1时为正方形box,还有一个正方形box,边长为 s k = s k S k + 1 s _ { k } ^ { \prime } = \sqrt { s _ { k } S _ { k + 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) ,其中 f k |f_k| 表示当前特层的正方形的宽度,上面提到的 s k s_k 按照下面的公式计算得到,然后乘以对应的输入图像宽度。
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 ]
​ 其中 s m i n = 0.2 s_{min}=0.2 , s m a x = 0.9 s_{max}=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 )下的匹配情况,有两个default box与猫匹配( 8 8 8*8 ),一个default box与狗匹配( 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\} 为第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)
其中,N为匹配的默认框.如果N0,loss为0. L c o n f L_{conf} 为预测框 l l 和Ground Truth 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.
L l o c L_{loc} 定义如下:
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)

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 ^ 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)

其中, l l 为预测框, g g 为Ground Truth. ( c x , c y ) (cx,cy) 为补偿后的默认框 d d 的中心, ( w , h ) (w,h) 为默认框的宽和高.

L c o n f L_{conf} 定义为多类别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) }

4.3. 数据增强

​ 采用数据扩增(data Augmentation)可提升SSD性能,主要采用的技术有水平翻转(horizontal flip),随机裁剪加颜色扭曲(random crop & color distortion),随机采样块域(Randomly sample a patch)(获取小目标训练样本),如下图所示:
在这里插入图片描述

在这里插入图片描述

5.性能评估

​ SSD在VOC2007,VOC2012和COCO数据集上的性能如下表所示.SSD512性能好一些,加*的表示使用了数据增强技术,创建了小样本,来提升SSD在小目标上的检测效果,性能会提升.
在这里插入图片描述

​ SSD与其它检测算法对比结果(VOC2007)如下,SSD与Faster-RCNN有同样的准确度,并且与YOLO具有同样快的检测速度.
在这里插入图片描述

​ 文中对使用的各种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

5.deepsystem.ai

6.https://www.jianshu.com/p/0903b160d554

7.http://www.noobyard.com/article/p-ntzhquzp-qb.html

8.SSD slide