SSD【论文笔记】/ SSD / YOLOv1 / YOLOv2对比


开始之前学习一个单词热热身:

     freebie 英[ˈfriːbi]
     n. (常指公司提供的) 免费品;


1 前言

     SSD是一种one-stage目标检测方法,即目标检测和分类是同时完成的,这一点与YOLO相同。SSD的主要思路是利用CNN提取特征后,均匀地在图片的不同位置进行密集抽样,用于抽样的锚框可以采用不同尺度和长宽比,物体分类与预测框的回归同时进行,相比于R-CNN系列的two-stage算法,其检测速度很快。
     SSD的英文全名是Single Shot MultiBox Detector,Single shot说明SSD算法属于one-stage方法,MultiBox说明SSD算法基于多框预测。


2 SSD目标检测网络

2.1 SSD主干网络结构

     SSD采用的主干特征提取网络是在VGG-16基础上修改得到的,首先来看下VGG-16网络的结构组成。

     可以看到VGG-16网络是由5组卷积层、5组最大池化层、3个全连接层和一个softmax层组成的。而SSD主干特征提取网络在VGG-16的基础上主要修改的地方有:

  1. 将VGG16的FC6和FC7层转化为卷积层Conv6、Conv7(上图中的前两个蓝色长方体);
  2. 去掉所有的Dropout层和FC8层(全连接层后接的Dropout层和上图中的最后一个蓝色长方体);
  3. 新增了Conv8、Conv9、Conv10、Conv11。

     如上图所示为SSD网络结构整体模型。接下来详细介绍该神经网络的整个流程:

a、将输入的图片resize到300x300大小;

b、conv1,经过两次[3,3]卷积网络,输出特征图大小为(300,300,64),再经过2X2最大池化层,输出特征图大小为(150,150,64);

c、conv2,经过两次[3,3]卷积网络,输出特征图大小为(150,150,128),再经过2X2最大池化层,输出特征图大小为(75,75,128);

d、conv3,经过三次[3,3]卷积网络,输出特征图大小为(75,75,256),再经过2X2最大池化层,输出特征图大小为(38,38,256);

e、conv4,经过三次[3,3]卷积网络,输出特征图大小为(38,38,512),再经过2X2最大池化层,输出特征图大小为(19,19,512);

f、conv5,经过三次[3,3]卷积网络,输出特征图大小为(19,19,512),再步长为1,卷积核大小为3X3的最大池化层,输出特征图大小为(19,19,512);

g、conv6、conv7,利用卷积代替全连接层,进行了一次[3,3]卷积网络和一次[1,1]卷积网络,输出的特征层通道数为1024,因此输出特征图大小为为(19,19,1024);(从开始到这里都是VGG-16的结构,唯一不同的是步骤 f 中最大池化层采用的步长为1,即没有将特征图大小减半)

h、conv,8,经过一次[1,1]卷积网络,调整通道数,一次步长为2的[3,3]卷积网络,输出特征图大小为(10,10,512);

i、conv9,经过一次[1,1]卷积网络,调整通道数,一次步长为2的[3,3]卷积网络,输出特征图大小为(5,5,256);

j、conv10,经过一次[1,1]卷积网络,调整通道数,一次步长为1的[3,3]卷积网络,输出特征图大小为(3,3,256);

k、conv9,经过一次[1,1]卷积网络,调整通道数,一次步长为1的[3,3]卷积网络,输出特征图大小为(1,1,256)。

2.2 从特征图中获取预测结果

     了解了SSD神经网络模型后,再结合上图,可以看到分别取conv4的第三次卷积后的特征图、fc7后的特征图、conv6的第二次卷积后的特征图、conv7的第二次卷积后的特征图、conv8的第二次卷积后的特征图、conv9的第二次卷积后的特征图,为了和普通特征层区分,将这几个特征层称为有效特征层,来获取预测结果。

     对获取到的每一个有效特征层,分别对其进行一次num_priors x 4的卷积、一次num_priors x num_classes的卷积、并需要计算每一个有效特征层对应的先验框,而num_priors指的是该特征层所拥有的先验框数量。

其中:

     num_priors x 4 的卷积用于预测该特征层上每一个网格内的每一个先验框的中心坐标x、y的调整参数及宽高w、h的调整参数,这个参数4即代表x, y, w ,h
     num_priors x num_classes的卷积用于预测该特征层上每一个网格内的每一个预测框对应的种类;

     每一个有效特征层对应的先验框对应着该特征层上每一个网格中国预先设定好的多个框。

     所有的特征层对应的预测结果的shape如下:

2.3 预测结果的解码

     我们通过对每一个特征层的处理,可以获得三个内容,分别是:

  • num_priors x 4的卷积后的结果用于预测该特征层上每一个网格内的每一个先验框的调整参数;

  • num_priors x num_classes的卷积后的结果 用于预测该特征层上每一个网格内的每一个预测框对应的种类;

  • 每一个有效特征层对应的先验框对应着该特征层上每一个网格中预先设定好的多个框。

     结合 num_priors x 4的卷积后的结果 与 每一个有效特征层对应的先验框 可以获得框的真实位置。

     每一个有效特征层对应的先验框就是,如图所示的作用:

     每一个有效特征层将整个图片分成S×S的网格,如conv4-3的特征层就是将整个图像分成38x38个网格;然后从每个网格中心建立多个先验框,如conv4-3的特征层就是建立了4个先验框,故该层一共包含了38x38x4=5776个先验框。

     先验框的位置及大小是人为设定的,因此还需要经过神经网络的调整,num_priors x 4中的num_priors表示了这个网格点所包含的先验框数量,其中的4表示了x_offset、y_offset、h和w的调整情况。其中x_offset与y_offset代表了真实框距离先验框中心的xy轴偏移情况;h和w代表了真实框的宽与高相对于先验框的变化情况。

     SSD解码过程就是将每个网格的中心点加上它对应的x_offset和y_offset,得到的结果就是预测框的中心,然后再结合先验框和h、w计算出预测框的长和宽。这样就能得到整个预测框的调整之后的精确位置。

     当然得到最终的预测结构后还要进行得分排序与非极大抑制筛选,这一部分基本上是所有目标检测通用的部分。

  1. 取出每一类得分大于self.obj_threshold的框和得分。
  2. 利用框的位置和得分进行非极大抑制。

3 SSD与YOLOv1 / YOLOv2的对比

     R-CNN系列算法、YOLO系列算法以及SSD算法的问世顺序是R-CNN——Fast R-CNN——Faster R-CNN——YOLOv1——SSD——YOLOv2——YOLOv3——YOLOv4,在当时学习YOLO系列算法时一口气学到了YOLOv4,而忽略了从YOLOv1到SSD再到YOLOv2的算法思想演变过程。回头学习SSD算法时,发现其首先融合了YOLOv1与Faster R-CNN算法的优势,且在YOLOv2中也可以看到SSD的影子,故这里总结一下SSD与YOLOv1 / YOLOv2的对比以捋清它们之间的发展关系。

3.1 多尺度预测

  • YOLOv1中最终生成7×7大小的特征图,相当于将原图片分割成7×7大小的网格,图片物体中心落在哪一个网格中,则该网格就负责预测该物体,但是若多个物体中心同时落在同一网格中,该网格仅能检测一种物体,故YOLOv1仍属于单尺度预测;
  • SSD中采用多尺度特征图用于目标检测,具体说来就是选用了6个特征图,分别是:conv4_3,conv7,conv8_2,conv9_2,conv10_2和conv11_2的输出来进行检测。通过结合不同分辨率的特征图进行预测,以适应不同大小的目标;
  • YOLOv2中通过引入passthrough层来利用更精细的特征图,该层与ResNet网络中的shortcut类似,passthrough层要把浅层特征图(26 x 26 x 512)连接到深层特征图(13 x 13 x 1024)上,最终得到一个13 x 13 x 3072大小的特征图,相当于做了一次特征融合,然后在此基础上进行预测,有利于对小目标的检测。

3.2 Anchor的设计

  • YOLOv1中没有使用anchor;
  • SSD中的anchor的宽高比例(aspect ratio)是手动设定的,带有一定的主观性。SSD在6个特征图上进行预测,而每个特征上都要对Anchor进行设计,并且不同特征图上Anchor的数目并非固定。论文中给出的情况是conv4_3、conv10_2和conv11_2有4个anchor,conv7、conv8_2和conv9_2有6个anchor;
  • YOLOv2中通过K-means聚类算法选取了5个先验框,通过对训练集中所有的边界框做聚类分析,能够在开始训练时就为网络设定更合理的先验框,将使学习变得更加容易。

3.3 模型的预测值

     对应一个边界框,模型预测值主要分为两个部分。第一部分是边界框的定位,第二部分是各个类别的置信度。

对于边界框的定位:

  • YOLOv1中得到的关于边界框的定位参数为边界框相对于7×7大小特征图左上角点的(0, 1)范围内的比例。因为它没有使用anchor,故将预测结果直接乘以原图片大小即可得到最后的边界框位置参数;
  • SSD中,它预测的4个值 l l l表示为(cx,cy,w,h),分别表示边框的中心坐标以及宽高的调整参数。要特别注意的是模型的预测值只是边框相对于先验框的调整值。先验框的位置参数用 d d d=(dcx,dcy,dw,dh)表示,该先验框所对应的真实边界框用 b b b=(bcx,bcy,bw,bh)表示,那么边框的预测值 l l l其实是 d d d相对于 b b b的转换值:

     上面这个过程即为通常所说的边界框位置的编码(encode)过程,在预测过程中,可以逆向进行这个过程,即假定已知 l l l d d d,获得预测的真实边界框的位置 b b b,这个过程为通常所说的解码(decode)过程。

  • YOLOv2中,改用预测边界框中心点相对于对应单元格(cell)左上角位置的相对偏移值的方式,目的是为了将边界框中心点约束在当前网格内。通过使用sigmoid函数来处理偏移值,这样预测的偏移值就锁定在(0,1)范围内(每个网格的尺度看做1)。根据边框预测的4个值(tx,ty,tw,th),可以按如下公式计算出边界框预测出的实际位置:

         其中(cx,cy)为当前网格左上角坐标(注意是相对坐标)。由于sigmoid函数的处理,边界框的中心位置会约束在当前网格内部,不会像SSD中那样——预测的边界框中心点会落到其他网格中去。而 pw和 ph 是先验框的宽度与长度,它们的值也是相对于特征图大小的,在特征图中每个网格的长和宽均为1。若记特征图的大小为(w,h),可以将预测边界框相对于特征图的位置和大小计算出来(4个值均在0和1之间):

    最后如果将上面的4个值分别乘以原图片的宽度和长度(像素值),即可以得到边界框的最终位置和大小。

     对于置信度,SSD中将背景也当做一个特殊的类别,即SSD对应的类别预测共有c+1个类别,而YOLO系列算法的预测类别有c个,不包含背景类。

3.4 损失函数

  • SSD的损失是位置损失(如:Smooth L1)和分类置信度损失(如: Softmax)的加权和。
    其中N表示训练集中正样本的数量。
  • SSD中规定正样本的方法如下:
  1. 遍历图片中的每个真实框gt(i),找到与其IOU最大的先验框anchor(j),该先验框anchor(j)则与真实框gt(i)匹配。就这一步可以保证每个真实框gt一定会有一个与之匹配的先验框,这些先验框(确切地说是这些先验框对应的预测框)当然也就是正样本。

  2. 反之,如果一个先验框没有与任何真实框匹配,那它就是负样本。但是目前来看一张图片中的负样本过多,正负样本不均衡会提高网络训练难度甚至发散,故需要想办法减少负样本数量。对于第1步剩余的未匹配上任何gt的先验框,若和某个gt的IOU大于一个给定的阈值(通常是0.5),那么该先验框也算作是正样本。

  3. 即使经历了这两步,正样本数量相对于负样本数量还是太少,为了保证正负样本尽量平衡,SSD采用了hard negative mining(难样本挖掘),即对负样本进行抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差较大的top-k作为训练的负样本,以保证正负样本比例接近1:3。
    其中位置损失计算方式如下:

分类置信度损失计算方式如下:

  • YOLOv1的损失函数如下:
  • 关于YOLOv2的损失函数,论文中并未详细提到。查找资料后发现网络上有人认为v2的损失函数与v1相同,也有人通过撕源码总结出YOLOv2的损失函数如下:

     以上,第一项表示训练集中的负样本的置信度误差;第二项用来计算Anchor boxes和预测框的坐标误差,但是只在前12800个iter计算,这一项应该是促进网络学习到真实框的形状;后三项表示训练集中的正样本的坐标损失、置信度损失以及分类损失。

4 总结

     SSD是一种one-stage目标检测方法,它是在YOLOv1之后、YOLOv2之前诞生的,在SSD出现后,YOLOv2也通过K-means聚类算法引入了anchor机制,使得模型更易于训练。本文首先详细的描述了SSD网络对一张输入图片的整个预测过程,其次对YOLOv1、SSD、YOLOv2之间的对比演进过程进行了总结。

参考博客1
参考博客2

欢迎关注【OAOA

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值