SSD算法解析

目标检测算法主要分为两类:

  • Two-stage方法:如R-CNN系列算法,主要思路就是通过Selective Search或者CNN网络产生一系列的稀疏矩阵的候选区域,然后对这些候选区域进行分类和回归,two-stage的方法优势在于准确率度高;
  • One-stage方法:如YOLO系列方法,主要思路就是均匀地在图片上不同位置进行密集采样,采样时使用不同尺度和长宽比box,然后利用CNN提取特征后直接进行分类和回归,整个过程只需要一步,所以优势在于速度快。我们接下来介绍的SSD方法也是单阶段的算法。

SSD算法的全名是Single Shot MultiBox Detector,Single shot指明了SSD算法属于one-stage方法,MultiBox指明了SSD是多框预测。对于Faster R-CNN,先通过CNN得到候选框,然后进行分类和回归,而YOLO和SSD可以一步完成检测,SSD的特点是:

  • SSD提取了不同尺度的特征图来做检测,大尺度特征图可以用来检测小物体,而小特征图用来检测大物体;
  • SSD采用了不同尺度和长宽比的先验框,在faster r-cnn和yoloV2,V3中称为Anchors。

1 SSD网络结构

SSD是YOLO V1出来后,YOLO V2出来前的一款One-stage目标检测器。SSD用到了多尺度的特征图,在之后的YOLO V3的darknet53中,也是用到了多尺度特征图的思想。较浅层的特征图上,每个cell的感受野不是很大,所以适合检测较小的物体,而在较深的特征图上,每个cell的感受野就比较大了,适合检测较大的物体。

SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。
SSD网络有两种:SSD 300和SSD 512,用于不同的输入尺寸。下文主要以 SSD 300为例进行分析。

下图就是VGG300的总体结构:

SSD算法解析
整个网络分为三部分:
  • backbone: VGG16用于图片特征提取的网络
  • Extra: 用来获得更多的特征图
  • Loc和cls: 用于框位置回归和目标分类的网络

; 1.1 backbone

网络的backbone采用VGG16作为基础模型,并在此基础上做了稍微的改动。使用imagenet数据进行预训练后,将conv4-1前一层的maxpooling中池化模式padding改为same(图中对应pytorch中的ceil_mode=True,即向上取整),使得输出为38×38,Conv4-3得到的特征图就是多尺度特征中的第一个38×38的特征图 (即第一个用于后续目标检测网络进行位置回归和分类的计算的特征图),因为该层比较靠前,所以在其后面增加了一个L2 Normalization层,对每个像素点在channle维度做归一化。VGG16倒数第3个和倒数第2个全连接层分别转换成 3×3 的卷积层conv6和1×1的卷积层conv7,把最后一个全连接层删除,同时将最后的池化层由原来的stride=2的 2×2 变成stride=1的 3×3的池化层。(卷积层conv7得到的特征图是第二个用于后续目标检测网络进行位置回归和分类计算的特征图))

下图为原始的VGG16网络和SSD中的VGG16的差别:

SSD算法解析
其中conv6使用的Dilated Convolutions,可以翻译为扩张卷积或空洞卷积。与普通的卷积相比,增加了一个扩张率(dilation rate)参数,主要用来表示扩张的大小。扩张卷积与普通卷积的相同点在于,卷积核的大小是一样的,在神经网络中参数数量不变,区别在于扩张卷积具有更大的感受野。如下图所示:(下图中红点代表卷积核大小,这三幅图中卷积核大小均为3×3,蓝绿色代表感受野大小,相当于这里对应的卷积核参数为0)
SSD算法解析
(a) 普通卷积,1-dilated convolution,卷积核的感受野为3×3=9。 (b) 扩张卷积,2-dilated convolution,卷积核的感受野为7×7=49。 © 扩张卷积,4-dilated convolution,卷积核的感受野为15×15=225。

空洞卷积的好处

  • 扩大感受野,且不丢失分辨率:在deep net中为了增加感受野且降低计算量,总要进行降采样(pooling或s2/conv),这样虽然可以增加感受野,但空间分辨率降低了。为了能不丢失分辨率(即可以不改变图像输出特征图的尺寸),且仍然扩大感受野,可以使用空洞卷积。这在检测,分割任务中十分有用。一方面感受野大了可以检测分割大目标,另一方面分辨率高了可以精确定位目标。
  • 捕获多尺度上下文信息:空洞卷积有一个参数可以设置dilation rate,具体含义就是在卷积核中填充dilation rate-1个0,因此,当设置不同dilation rate时,感受野就会不一样,也即获取了多尺度信息。当然这样的操作不影响特征图的尺寸,又避免下采样造成信息损失,同时也利用到多尺度信息。
  • 知识补充:我们知道,神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;相反,值越小则表示其所包含的特征越趋向局部和细节。因此感受野的值可以用来大致判断每一层的抽象层次。

潜在问题 :远距离获取的信息没有相关性:由于空洞卷积稀疏的采样输入信号,使得远距离卷积得到的信息之间没有相关性,影响分类结果。

普通卷积和扩张卷积的直观区别:

SSD算法解析
扩张卷积的感受野的计算方法是:
SSD算法解析

所以对于图b,F=2(2-1) (3-1)+3=7,即卷积核的感受野为7×7
对于图c,F=2
(4-1)
(3-1)+3=15,即卷积核的感受野为15×15

1.2 extra部分

为了进行后续的多尺度特征提取,在VGG后面又添加了一些卷积层,如下图所示:

新增的Conv8_2,Conv9_2,Conv10_2,Conv11_2得到的特征图都会送到后续的目标检测网络中用于位置的回归和分类的计算,特征图的大小如下表所示:

SSD算法解析
红框中的内容是进行多尺度分析的特征图,再加上backbone部分的Conv4_3和Conv7获取的特征图,共提取了6个特征图,其大小分别是 (38, 38), (19, 19), (10, 10), (5, 5), (3, 3), (1, 1),我们将其送入到loc和cls中进行目标检测,从而实现多尺度目标检测。

下图是SSD网络的框架:

SSD算法解析

注意:

图中的红框部分是用于预测的特征层,这里共有6个预测特征层,分别是:Conv4_3, Conv7,Conv8_2, Conv9.2,Conv10_2, Conv11_2

图中的Conv6 (FC6)表示图像的卷积层Conv6对应着原来VGG模型的全连接层FC6的位置,FC6是VGG16中的第一个全连接层

图中的Conv7 (FC7)表示图像的卷积层Conv7对应着原来VGG模型的全连接层FC7的位置,FC7是VGG16中的第二个全连接层

; 1.3 loc和cls

在backbone和 Extras 在提取的6个特征图的基础上,进行位置信息和分类信息的提取,其结构如下图所示(这里选取其中一个特征图进行分析,其余5个特征图的分析过程与之类似):

SSD算法解析

该部分主要有3个支路构成,

  • 分支一:Default Box层,用来生成先验框,也就相当于fasterRCNN中的anchor box,假设特征图的每个单元格上有3个先验框,而特征图的大小是5×5,所以一共产生5x5x3=75个先验框
  • 分支二:Localization: 使用一个 3×3 卷积来进行完成,输出的特征图尺寸为5x5x12,其中12代表的是先验框的坐标信息,因为每个先验框有4个坐标信息,特征图的每个单元格上产生3个先验框,所以共有3×4=12个坐标信息
  • 分支三:类别置信度confdence:使用一个 3×3 卷积来进行完成,输出的特征图尺寸为5x5x63,其中63代表先验框的类别信息,因为每个先验框有21个类别预测结果(VOC数据集,共20个类别加一个背景),特征图的每个单元格上产生3个先验框,共有3×21=63个预测结果
    最后经过修正边界,分类和NMS过滤就得到最终的预测结果

注意:在原论文中,将anchor称作Default Box,其实它们都是一个意思,都表示先验框的意思

整个过程如下图所示(图中以每个单元格产生3个先验框为例进行讲解):

SSD算法解析

1.3.1 Default Box层先验框的生成方法

在这里我们着重介绍Default Box层先验框的生成方法:

SSD一共有6个不同尺度的特征图,不同特征图上设置的先验框数量,尺度,宽高比都是不同的(即同一个特征图上每个单元设置的先验框是相同的,但是不同特征图上每个单元是不同的,这里的数目指的是一个单元的先验框数目)。

先验框的设置:包括尺度(或者说大小)和长宽比两个方面。

SSD算法解析
  • 先验框的尺度
    先验框的尺度遵守一个线性递增规则:随着特征图大小降低(此时检测目标逐渐变大),先验框尺度线性增加,
    其中每个先验框的尺度相对于原图大小的比例S K S_K S K ​的计算公式如下所示:

    SSD算法解析
    其中:
    k表示第K+1个特征图,它的取值范围是[1,5],因为第一个特征图并不是按照上面公式进行计算,所以K的取值不是从0开始;m 指的特征图个数,虽然参与计算的特征图个数是6,但是这里将m设为5 ,因为第一个特征图(Conv4_3层生成的特征图)上的先验框的尺度是单独设置的,不需要根据上面公式进行计算,只有第二个到第六个特征图的尺度才按照上面公式计算。S K S_K S K ​表示第k+1个特征图上先验框大小相对于图片的比例,而S m i n S_{min}S min ​和S m a x S_{max}S ma x ​表示比例的最小值与最大值,它是超参数,论文中的取值为0.2和0.9。
  • 对于第一个特征图,其先验框的尺度比例一般设置为 s m i n s_{min}s min ​/2=0.1,尺度为 300×0.1=30。这里的300指的是输入到网络中的图片的宽和高

    SSD算法解析
  • 这样各个特征图的S K S_{K}S K ​为20,37,54,71,88。将这些比例除以100,我们可以计算出第二到第六个特征图的尺度比例S K S_{K}S K ​的取值分别为0.20, 0.37,0. 54, 0.71, 0.88
  • 然后再乘以原图的大小300,再综合第一个特征图的先验框尺寸,则可得各个特征图的先验框尺度为30,60,111, 162,213,264。

  • 先验框的长宽比 一般选取

    SSD算法解析
    根据下面公式,由先验框尺度和长宽比可以得到先验框的宽度和高度(下面计算公式中的 S K S_{K}S K ​均指的是先验框实际尺度,而不是尺度比例):
    SSD算法解析
    默认情况下,每个特征图除了上面5个比例的先验框,还会设置一个尺度为
    SSD算法解析
    的先验框,这样每个特征图都设置了两个长宽比为1但大小不同的正方形先验框。

注意:根据前面的计算公式,当k=5时,Sk+1=315

因此,每个特征图一共会产生两种尺度,5种长宽比的先验框,其中第一种尺寸(小尺度)的先验框的 长宽比分别是 1, 2, 3, 1/2, 1/3,第二种尺寸(大尺度)的先验框的长宽比是 1 ,所以每个特征图共产生6种先验框。但是在实现时,Conv4_3,Conv10_2和Conv11_2层仅使用4种先验框,它们不使用长宽比为 3, 1/3 的先验框。

SSD算法解析
对于送入网络中的一幅图像,SSD一共可以产生 38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4=8732个先验框,网络需要对这些先验框进行分类和回归生成预测框,即对于一个300×300的图像就有8732个预测结果,是非常的多的,所以说SSD本质上是密集采样。

SSD算法解析

下图是6个预测特征图的先验框尺寸核数目:

SSD算法解析

但是在github实现的SSD源码中,先验框尺寸与论文中有所不同

SSD算法解析
SSD算法解析

; 1.3.2 loc的预测结果

网络输出的结果是回归偏移量,而不是我们真正想要的结果(即预测框的真正位置,也就是修正后的先验框位置),这里还需要进行转换,具体的转换转换关系如下所示:

SSD算法解析

2.模型训练

2.1 正负样本标记

在训练过程中,首先需要确定训练图片中的 ground truth 与哪一个先验框来进行匹配,只有与之匹配的先验框才负责预测目标 。

SSD的先验框和ground truth匹配原则:

  • 正样本

1、对于图片中的每个gt,找到与其IOU最大的先验框,该先验框与其匹配,这样可以保证每个gt一定与某个先验框匹配。

2、对于剩余未匹配的先验框,若与某个gt的IOU大于某个阈值(一般0.5),那么该先验框与这个gt匹配

SSD中正样本的选取标准和Faster RCNN中的相同

  • 负样本

除了正样本外,其余的先验框标记为负样本,但是在很多情况下,正样本的数量要远小于负样本的数量,为了避免在训练过程中正负样本严重不平衡情况,SSD采用了hard negative mining策略,也就是在训练的过程中,我们并不是拿所有的负样本进行训练,而是对负样本进行抽样,抽样时按照置信度误差进行降序排列,选取误差的较大的top-k作为训练的负样本,以保证正负样本比例接近1:3

负样本的置信度损失越大,那么网络就会将该负样本预测为包含目标的概率越大,所以它属于困难样本,故使用这些困难样本来训练网络的效果更好

注意:

1、某个gt可以和多个先验框匹配,而每个先验框只能和一个gt进行匹配

2、如果多个gt和某一个先验框的IOU均大于阈值,那么先验框只与IOU最大的那个进行匹配

2.2 损失函数

SSD的损失函数和Faster RCNN中的损失函数基本一致,它包括位置损失( loc)与类别置信度损失(conf)的加权和:

SSD算法解析

这里的N是正样本数量,权重系数 α 设置为1。

其中类别损失如下所示:它其实就是多分类的交叉熵损失(也叫做softmax损失)

SSD算法解析

其中的定位损失如下所示;定位损失只针对正样本进行损失计算

SSD算法解析

; 3 模型预测

预测过程比较简单,

SSD算法解析
主要步骤如下:
  • 对于每个预测框,首先根据类别置信度确定其类别(置信度最大者)与置信度值,并过滤掉属于背景的预测框。
  • 然后根据置信度阈值(如0.5)过滤掉阈值较低的预测框。
  • 对于留下的预测框进行解码 (解码的意思是网络输出的结果是对先验框的修正量,并不是修正后的先验框的位置结果,所以还需要进行转换),根据先验框得到其真实的位置参数(解码后一般还需要做clip,防止预测框位置超出图片)。
  • 解码之后,一般需要根据置信度进行降序排列,然后仅保留top-k(如400)个预测框。
  • 进行NMS算法,过滤掉那些重叠度较大的预测框。
  • 最后剩余的预测框就是检测结果了。

Original: https://blog.csdn.net/m0_56192771/article/details/124191394
Author: 无码不欢的我
Title: SSD算法解析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/625058/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球