SSD(ECCV 2016)

SSD的英文全名是Single Shot MultiBox Detector,Single shot说明SSD算法属于one-stage方法,MultiBox说明SSD算法基于多框预测。

SSD是一种非常优秀的one-stage目标检测方法,one-stage算法就是目标检测和分类是同时完成的,其主要思路是利用CNN提取特征后,提取不同大小的特征层,均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同尺度和长宽比,物体分类与预测框的回归同时进行,整个过程只需要一步,所以其优势是速度快

原作者给了两种SSD结构,SSD 300和SSD 512,用于不同输入尺寸的图像识别。本文中以SSD 300为例

有什么优点?有什么缺点呢?
优点:
SSD在Yolo的基础上进行改进:多尺度特征图,利用卷积进行检测,设置先验框。这使得SSD在准确度上比Yolo更好,而且对于小目标检测效果也相对好一点。
速度快,one-stage算法,在不逊于Faster R-CNN的情况下,提升了速度

缺点:
但是均匀的密集采样的一个重要缺点是训练比较困难,这主要是因为正样本与负样本(背景)极其不均衡(参见Focal Loss),导致模型准确度稍低。
SSD是一种基于全卷积的网络的检测器,用不同层检测不同大小的物体。这中间有个矛盾,前面的featmap大,但semantic不够,后面的sematic够了,但经过太多的pooling,featmap太小了。要检测小物体,既需要一张足够大的featmap来提供更加精细的特征和做更加密集的采样,同时也需要足够的semantic meaning来与背景区分开。

1、主干网络介绍

1.1 VGG网络

VGG中根据卷积核大小和卷积层数目的不同,可分为 A , A − L R N , B , C , D , E A,A-LRN,B,C,D,E AALRN,B,C,D,E共6个配置(ConvNet Configuration),其中以 D , E D,E D,E两种配置较为常用,分别称为VGG16和VGG19。

下图给出了VGG的六种结构配置:

在这里插入图片描述
上图中,每一列对应一种结构配置。例如,图中绿色部分即指明了VGG16所采用的结构。
我们针对VGG16进行具体分析发现,VGG16共包含:

13个卷积层(Convolutional Layer),分别用conv3-XXX表示
3个全连接层(Fully connected Layer),分别用FC-XXXX表示
5个池化层(Pool layer),分别用maxpool表示

1.2 SSD网络

SSD相比普通的VGG16网络有一定的修改,主要修改的地方就是:

①将VGG16的FC6和FC7层转化为卷积层

采用VGG16做基础模型,首先VGG16是在ILSVRC CLS-LOC数据集预训练。然后借鉴了 DeepLab-LargeFOV,分别将VGG16的全连接层fc6和fc7转换成 3x3卷积层 conv6和 1x1 卷积层conv7,同时将池化层pool5由原来的stride=2的 2x2变成stride=1的 3x3 (猜想是不想reduce特征图大小),为了配合这种变化,采用了一种Atrous Algorithm,其实就是conv6采用扩展卷积或带孔卷积(Dilation Conv),其在不增加参数与模型复杂度的条件下指数级扩大卷积的视野,其使用扩张率(dilation rate)参数,来表示扩张的大小,如下图所示,(a)是普通的 3x3 卷积,其视野就是 3x3 ,(b)是扩张率为2,此时视野变成 7x7 ,©扩张率为4时,视野扩大为 15x15,但是视野的特征更稀疏了。Conv6采用 3x3大小但dilation rate=6的扩展卷积。

在这里插入图片描述

②去掉所有的Dropout层和FC8层

然后移除dropout层和fc8层,并新增一系列卷积层,在检测数据集上做finetune 。

③新增了Conv6(conv6_1、conv6_2)、Conv7(conv7_1、conv7_2)、Conv8(conv8_1、conv8_2)、Conv9(conv9_1、conv9_2)

a、输入一张图片后,被resize到300x300的shape
b、conv1,经过两次[3,3]卷积网络,输出的特征层为64,输出为(300,300,64),再2X2最大池化,输出net为(150,150,64)。
c、conv2,经过两次[3,3]卷积网络,输出的特征层为128,输出net为(150,150,128),再2X2最大池化,输出net为(75,75,128)。
d、conv3,经过三次[3,3]卷积网络,输出的特征层为256,输出net为(75,75,256),再2X2最大池化,输出net为(38,38,256)。
e、conv4,经过三次[3,3]卷积网络,输出的特征层为512,输出net为(38,38,512),再2X2最大池化,输出net为(19,19,512)。
f、conv5,经过三次[3,3]卷积网络,输出的特征层为512,输出net为(19,19,512),再3X3最大池化,输出net为(19,19,512)。
g、利用卷积代替全连接层,进行了一次[3,3]卷积网络和一次[1,1]卷积网络,输出的特征层为1024,因此输出的net为(19,19,1024)。(从这里往前都是VGG的结构)
h、conv6,经过一次[1,1]卷积网络,调整通道数,一次步长为2的[3,3]卷积网络,输出的特征层为512,因此输出的net为(10,10,512)。
i、conv7,经过一次[1,1]卷积网络,调整通道数,一次步长为2的[3,3]卷积网络,输出的特征层为256,因此输出的net为(5,5,256)。
j、conv8,经过一次[1,1]卷积网络,调整通道数,一次padding为valid的[3,3]卷积网络,输出的特征层为256,因此输出的net为(3,3,256)。
k、conv9,经过一次[1,1]卷积网络,调整通道数,一次padding为valid的[3,3]卷积网络,输出的特征层为256,因此输出的net为(1,1,256)。

在这里插入图片描述

在这个图中显示的是SSD和YOLO的对比区别,本图中的conv8,conv9,conv10,conv11相当于上图的Conv6、Conv7、Conv8、Conv9。
在这里插入图片描述

其中VGG16中的Conv4_3层将作为用于检测的第一个特征图。conv4_3层特征图大小是 38x38,但是该层比较靠前,其norm较大卷积层度较浅,所以在其后面增加了一个L2 Normalization层(参见 ParseNet,以保证和后面的检测层差异不是很大,这个和Batch Normalization(一篇文章搞懂Batch Normalization批标准化)层不太一样,其仅仅是对每个像素点在channel维度做归一化,而Batch Normalization层是在[batch_size, width, height]三个维度上做归一化。归一化后一般设置一个可训练的放缩变量gamma。

参考:

目标检测:SSD(ECCV 2016)
【深度学习】深入理解Batch Normalization批标准化
目标检测|SSD原理与实现

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页