小白解读SSD

前言

最近,一直在研究关于SSD目标检测的论文和代码,我想着从基础层面去理解它,作为研究小白的我(关于这方面没有任何专业背景,完全靠自己推),我需要尽量使用通俗的理解,于是,我决定写一个全面细致的解析,不仅可以加深我对SSD的理解,也希望能帮助更多的人去理解。(ps:仅供参考,如有误解,还望指出)

基本概念

简单来说,目标检测就是对目标进行特征分割自动提取,在复杂场景中,能够实时处理,并将其识别出来,识别的准确率和速度是判断模型优劣的重要标准。在现有的基于深度学习的图像目标检测模型中,主要分为两大类,一类是基于候选框的模型,一类是基于回归的模型:

  1. 基于候选框的目标检测模型,也称双阶段(Two-stages)目标检测模型,顾名思义,整个算法过程需要进行2个步骤:首先,对输入图像提取候选框(主要方法有滑窗法和选择性搜索,具体的方法在这里就不赘述了),候选框的目的就是为了进行图像的特征提取(通俗来说就是找一些特点以方便识别),以方便后期对这些候选框进行分类和位置回归,进而得到最终的检测结果。典型的算法代表有:R-CNN、Fast R-CNN和Faster R-CNN等;
  2. 基于回归的目标检测模型,也称单阶段(One-stage)目标检测模型,同理,整个算法过程只需要1个步骤,不需要生成候选框,直接对图像中的目标进行回归,生成目标对应的类别和位置信息。典型的算法代表有:YOLO系列、SSD系列(我们要讲的就是这个)、RetinaNet等。

两种类别的算法各有各的优势,基于候选框的算法由于需要进行2个步骤,因此在运算速度上会比基于回归的算法要逊色一些,当然,牺牲运算速度的同时,也会带来精度上的提高,因此在精度方面,Two-stages相对较好一些,总之,在后期的两大类模型衍生的一系列模型也在为弥补各自的缺陷而不断改进,在不同的应用场景下,根据我们的需求来进行选取,这也就是它们的应用价值所在。

本文主要讲解SSD目标检测算法的内容,下面就来介绍一下它的主要内容:

SSD(Single Shot MultiBox Detector):根据论文原文的描述,SSD采用特征金字塔的方式进行检测,也就是说利用不同卷积层产生不同的特征图,使用一个小卷积核(也称滤波器filter,只关注局部特征,局部大小取决于卷积核的大小)来预测特征图上一组固定的默认边界框类别和位置偏移量。在不同尺度的特征图上进行不同尺度的预测,并设置不同宽高比的边界框进行分离预测,以达到较高的精度。

整体框架

对于SSD目标检测模型,主要分成以下几个方面进行解析:

  1. 网络结构
  2. 先验框生成
  3. 定义损失函数
  4. L2正则化
  5. 模型训练

网络结构

SSD模型主要以VGG-16为网络基础(使用了前5层卷积,丢弃全连接层FC6和FC7,改成了两个卷积层conv6:3×3×1024和conv7:1×1×1024,将maxpooling5的参数变成kernel_size=3,stride=1,padding=1,移除Dropout层和FC8,并增加conv8, conv9, conv10, conv11,在检测数据集上做fineturing),输入图片尺寸要求为300×300。为了后续进行多尺度特征提取,在VGG的骨干网络后面还添加了卷积网络:
Conv8_2:3×3×512-s2
Conv9_2:3×3×256-s2
Conv10_2:3×3×256-s1
Conv11_2:3×3×256-s1

小白解读SSD

SSD模型有6层用于多尺度特征提取的卷积网络,每一层都进行回归和分类,得到相应的输出。提取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2层的特征图,在这6个卷积层的特征图上的每一点构造6个不同尺度大小的边界框(边界框的长宽比例默认有4个和6个,4个边界框的长宽比为1、2、0.5、1;6个边界框的长宽比为1、2、0.5、1、1/3、3),分别进行预测和分类,生成多个边界框,如上图所示,最后经过NMS(非极大值抑制)方法来筛选掉一些重叠或不正确的边界框,得到边界框的集合,也就是最终检测结果。

这6个卷积层中,由于Conv4_3层比较靠前,特征图的norm(范数)较大,所以在后面加一个L2 Normalization层(仅对每个像素点在channel维度上做归一化),以保证和后面的检测层差异不是很大。
小白解读SSD

先验框生成

从上图可以看出,SSD模型从Conv4_3开始,一共提取了6个特征图,尺寸大小为别为:(38,38)、(19,19)、(10,10)、(5,5)、(3,3)、(1,1),前面也已经提到,每个特征图上设置的先验框数量不同(预测的边界框是以先验框为基准的,在一定程度上可以减少训练难度)。
小白解读SSD
(ps:loc是位置坐标;conf是每个种类的得分)
先验框主要由尺度和长宽比两个方面来决定:
1.先验框的尺度遵守一个线性递增的规则:随着特征图的大小降低,先验框的尺度呈线性增加:
小白解读SSD
其中:
m指特征图的个数,等于5,因为第一层Conv4_3是单独设置的;
k代表一共有多少层特征图;
Sk表示先验框大小相对于图片的比例;
Smin和Smax表示比例的最小值与最大值,论文中取的是 0.2 和 0.9。

利用公式进行计算:
(1)第一个特征图是Conv4_3层,默认设置比例为Smin/2=0.2/2=0.1,则先验框尺度大小为300×0.1 = 30;
(2)从第二个特征图开始,按照公式线性增加,先将其尺度比例扩大100倍以方便计算,再计算得到Sk,然后将Sk缩小100倍,再乘以图片尺寸大小就可以得到每个特征图的先验框尺度大小了。
小白解读SSD
S1=20+17(1-1)=20;
S2=20+17(2-1)=37;
S3=20+17(3-1)=54;
S4=20+17(4-1)=71;
S5=20+17(5-1)=88。
于是,就有Sk∈{20,37,54,71,88},再缩小100倍,乘以原图尺寸大小300可得先验框尺度如下:
Sk∈{30,60,111,162,213,264}

2.先验框的长宽比一般设为{1,2,3,1/2,1/3},根据面积和长宽比就可以算出先验框的宽度w和高度h:
小白解读SSD小白解读SSD
3.每个单元的先验框中心点分布在各个单元的中心,其取值为:
小白解读SSD
其中:
|fk |为特征图的大小;
i, j分别代表在特征图的水平位置和垂直位置的第几格;
因此,由于每个先验框都会预测一个边界框,边界框/先验框的个数为:
38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4=8732个

损失函数

SSD算法的目标函数主要分类两个部分:先验框与目标类别的置信度损失(confidence loss,简称conf)和位置损失(location loss,简称loc),整个损失函数如下所示(conf与loc的加权和):
小白解读SSD
其中:
N是匹配(match)到真实值(Ground truth:标注的真实值)的先验框数量;
α是用来调整conf和loc之间比例的参数,默认值为1;
c是类别置信度的预测值;
l是先验框所对应的边界框的位置预测值;
g是Ground truth的位置参数。

针对这两类损失函数Lconf和Lloc,我们有如下定义:
(1)对于位置损失函数Lloc,对所有的正样本(与真实类别一致的样本,也就是每个Ground truth匹配到与其交并比IOU最大的先验框)采用Smooth L1 Loss(其实就是让L1损失函数变得光滑一点,因为L1损失函数有折点,会导致不稳定)
小白解读SSD
根据上述公式,转换算出所有的gj,再利用以下公式,与预测的先验框li作差,计算损失loss。
小白解读SSD
(2)对于置信度损失函数Lconf,为保证正负样本尽量均衡(如果不加以控制的话,很可能会出现所有样本都会是负样本,使得网络性能变差),SSD采用了hard negative mining(依据置信度对先验框进行降序排列,挑选置信度高的先验框进行训练)将正负样本按照1:3的比例把负样本抽样出来。
小白解读SSD
关于上述公式的参数说明:i表示先验框序号,j表示真实框序号,N表示先验框数量,p表示类别序号且p=0表示背景,cip(上标p,下标i)表示第i个先验框对应类别p的预测概率。

L2正则化

前面有提到过由于VGG16网络中的Conv4_3层(特征图大小为38×38)比较靠前,norm(范数)较大,因此需要增加一个L2 Normalization(仅对每个像素点在channel维度上做归一化),目的是为了保证与后面的检测层差别不是很大。

L2 norm的计算公式如下所示(其实就是向量中的每个元素除以向量的L2范数):
小白解读SSD
这里需要注意的是,如果不按比例缩小学习范围,简单的对一个卷积层的每个输入都进行归一化,它就会改变该层的规模,会减慢速度学习,所以在这里要引入一个尺度参数γi,于是:
小白解读SSD

模型训练

1.IOU计算

IOU(Intersection over Union)是指两个box区域的交并比:交集/并集,其实通过下图就可以很好的理解。

计算思路:

(1)先计算两个方框的左上角坐标点的最大值(max{x1_min, x2_min},max{y1_min, y2_min}),
再计算右下角坐标点的最小值(min{x1_max, x2_max}, min{y1_max, y2_max});

(2)计算交集的面积= | max{x1_min, x2_min} - min{x1_max, x2_max}| × | max{y1_min, y2_min} - min{y1_max, y2_max}|

(3)最后把交集面积除以对应的并集面积
并集面积 = 两个box的面积之和 – 交集面积
IOU = 交集面积÷并集面积
小白解读SSD
2.位置编码和解码

根据原文作者的阐述,预测与真实的边界框存在一个转换关系:
先验框的位置坐标:
小白解读SSD
真实框的位置坐标:
小白解读SSD
手动设置variance超参数用来调整检测值
位置编码:得到预测框相对于先验框的偏移量l
小白解读SSD
边界框的预测值l其实是g相对于d的转换值:
小白解读SSD
位置解码:从预测值l中得到边界框的真实值(解码其实就是对编码的一个反向操作,或者说是逆过程)
小白解读SSD
3.先验框的匹配

在训练的时候,我们需要确定训练图片的真实值(Ground truth)与先验框进行匹配,与之匹配的先验框所对应的边界框将负责预测它。

在SSD中,先验框与真实值匹配的原则主要有以下两点:

(1)对于图片中的每一个真实值,找到与其IOU最大的先验框进行匹配,其目的是为了保证每个真实值一定可以与某个先验框实现匹配;

(2)对于剩下没有匹配的先验框,如果某个真实值的IOU大于某个阈值(就是一个临界值,一般设为0.5),那么该先验框就与这个真实值进行匹配。

对于匹配原则,我们要注意以下几点:

(1)正样本:与真实值匹配的先验框,负样本:没有任何一个真实值匹配的先验框;

(2)某个真实值可以匹配多个先验框,但是每个先验框只能匹配一个真实值;

(3)如果出现了多个真实值与某一个先验框的IOU均大于阈值,那么先验框只与IOU最大的那个真实值进行匹配。

4.NMS(非极大值抑制)

非极大值抑制NMS(Non-maximum suppression)是一种去除非极大值的算法。一般是为了去掉模型预测后的多余框(NMS是消除表示同一类别的框),一般会设一个阈值nms_threshold=0.5,具体的操作思路如下:

(1)将所有的框的得分(scores)排序,选最高分及其对应的框;

(2)遍历其余的框,如果和当前最高分框的IOU大于设定的阈值(也就是0.5),就将框删除;

(3)从未处理的框中继续选一个得分最高的,如此往复循环操作上述过程。

5.最后补充定义一个Detection函数,用于模型测试,把预测出的loc和conf输入到detect函数中进行NMS,最后得出相应的结果。

说明

论文原文:SSD: Single Shot MultiBox Detector

论文链接:https://arxiv.org/abs/1512.02325v5

说明:
【1】本文内容仅供个人学习所用,某些部分参考了一些博主的看法,由于个人能力有限,在理解层面上可能存在很多问题,希望大家能够提出改进的意见,欢迎交流想法,谢谢!
【2】如果您对该博客感兴趣,想要转载该博客,请与我联系。(也可关注个人公众号:刘先森学术日常,或qq邮箱:[email protected])我会第一时间回复大家,谢谢!