【目标检测 深度学习】2.SSD系列算法原理


1.SSD系列算法简介

1.1 SSD算法介绍

(1)它是one-stage算法

  1. Wei Liu在ECCV2016提出
  2. 直接回归目标类别和位置
  3. 不同尺度的特征图上进行预测
  4. 端到端的训练
  5. 图像的分辨率时 比较低也能保证检测的精度

1.1.1框架图

它的框架图如下:
【目标检测 深度学习】2.SSD系列算法原理

  1. 主干网络:VGGNet。上面图中主干网络里只用了5层卷积
  2. 多尺度Feature Map预测。指的是在预测的时候会对VGG后面六个不同的尺寸分别进行预测。这六个尺寸分别包括六个feature map,分别作为后面检测层的输入。
  3. Default bouding boxes的类别分数、偏移量。将上面六层的每一层进行此操作。每个尺度都会提取anchor box。

2.详细介绍

2.1主干网络介绍

(1)VGG、ResNet、MobileNets等各种卷积神经网络都可以作为主干网络提取特征。
(2)VGG作为输入的时候,最后两个FC改成卷积,并增加4个卷积层

2.2多尺度Feature Map预测:

(1)针对不同层不同尺度的feature map进行预测。在上面图中分别对应了3838,1919,1010,55,33,11,这六种不同尺度的feature map分别作为后续预测网络的输入,不同尺度的网络通常会使用max pooling的方法来进行下采样
(2)Prior box:不同尺寸的feature map会输入到后层的预测网络中,后续网络中会包括Prior box层的提取过程,prior box对应faster rcnn中anchor的概念,在prior box层中,针对于feature map每一个点都会将它作为一个cell,以这个cell为中心,会通过等比的方法找到它在原始图像中的位置,以这个点为中心提取不同尺度的bounding box,这些不同尺度的bounding box即为prior box。对于不同的prior box通过和真值的比较就能拿到它的label。对于每个prior box会预测它的类别概率和坐标(x,y,w,h)。如果有C类,则prior box的输出大小则为C+4, 如果当前feature map大小为mn,即有mn个anchor,如果每个anchor提取k个prior box,则最终的prior box的维度为(c+4)km*n。总结如下:

  1. m*n个cell
  2. 每个cell上生成固定scale和aspect ratio的box,这是两个超参数
    假设一个feature Map有mc×n个cell,每个cell对应k个default box,每个defaultbox预测C个类别score和4个o则一共有(c+4)×k×m×n个输出。
  3. Scale:sk=Smin+(Smax-Smin)*(K+1)/(m-1),k∈[1,m]。这里表示第k个bouding box的尺度
    其中,Smin=0.2,最底层的scale是0.2;Smax=0.9,最高层的scale是0.9
  4. aspect ratio:ar={1,2,3,1/2,1/3} 。这里表示长宽比例
  5. 宽:wka=sk√ar
    高:hka=sk/√ar …这里是最终长和宽的大小
  6. aspect ratio=1,增加一种scale的default box:sk’=√(skSk+1)
  7. 每个feature map cell定义6种default box。这里的6是通过五个不同的ar长宽比例以及6里面增加的scale来得到
  8. 实际上面那个图里我们提取的box数量为:38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4=8732个prior box。这里每个加号前面两个数字指的是feature map的尺寸。
  9. 一般pror box 层shape数量越多形状越丰富,效果越好。

我们实际训练的并不是每个prior box都去计算Loss,prior box也要经过筛选。比如可以用prior box与GT Box做匹配,IOU>阈值则为正样本。在训练的时候要确保prior box的分类准确且尽可能回归到GT box 。

2.3样本构造

样本构造的时候我们尽量要进行难例挖掘,而且保证正负样本在1:3左右
(1)正样本

  1. 从GT box出发给找到最匹配的prior box放入候选正样本集
  2. 从prior box集出发,寻找与GT box满足IOU>0.5的最大prior box放入候选正样本集

(2)负样本 IOU小于阈值

(3)难例挖掘

  1. 对预测的loss进行排序
  2. 选择loss最高的几个prior box与正样本集进行匹配,如果匹配成功,则放入正样本中。
  3. 选择loss最高的几个prior box与负样本集进行匹配,如果匹配成功,则放入负样本中。
  4. 这样就可以把loss较高的几个样本挖掘出来,这几个样本是难例

(4)数据增强

  1. 随机采样多个patch,与物体之间IOU为:0.1,0.3,0.5,0.7与0.9
  2. 采样的patch比例是[0.3,1.0],aspect ratio在0.5或2
  3. GT box中心在采样patch中且面积大于0
  4. resize固定大小
  5. 以0.5的概率随机的水平翻转

2.4损失函数

分类loss+回归Loss:

  1. 分类loss:softmax loss
  2. 回归loss:Smooth L1 Loss
    【目标检测 深度学习】2.SSD系列算法原理

损失函数计算思路:
【目标检测 深度学习】2.SSD系列算法原理

2.5 SSD系列网络结构

【目标检测 深度学习】2.SSD系列算法原理
坐上角是主干网络,右边是prior box层,下面是分类和回归网络。主干网络的输出和真值作为prior box层的输入,prior box层的输出用于后续loss层的计算。且主干网络的输出也会直接输入进分类和回归网络。我们计算loss的时候,它的维度大小会同prior box层保持一致。

2.6使用细节

  1. 数据增强时,需要关注Crop采样大小
  2. 多任务网络的权重,即分类任务和回归任务的权重
  3. 正负样本比例 一般用1:3
  4. 难例挖掘方式默认只取64个最高的predictions loss来从中寻找负样本

2.7算法性能比较

2.7.1与不同算法的比较

【目标检测 深度学习】2.SSD系列算法原理
可以看到输入尺寸变大的时候SSD的算法性能更好 。
【目标检测 深度学习】2.SSD系列算法原理
【目标检测 深度学习】2.SSD系列算法原理
【目标检测 深度学习】2.SSD系列算法原理
它的FPS值相对于YOLO值有所降低,即速度低些,但比faster rcnn快

2.7.2 数据增强对SSD算法的影响

下表是数据增强对SSD算法的影响:
【目标检测 深度学习】2.SSD系列算法原理
可以看到:

  1. 数据增强对于结果提升非常明显
  2. 使用更多的feature maps对结果提升更大
  3. 使用更多的default boxes,结果也越好
  4. Atrous(空洞卷积)使得SSD又快又好,空洞卷积作用是不采用pooling增大卷积层的感受野。

2.7.3不同尺度的输入的影响

【目标检测 深度学习】2.SSD系列算法原理
输入尺寸越大,SSD算法性能越好,检测速度会下降。

3.SSD系列算法优化及扩展

【目标检测 深度学习】2.SSD系列算法原理
对于SSD算法,进行优化的时候主要强调对于主干网络的改进和对于后续预测网络的改进。

  1. 对于主干网络的改进比如我们可以采用resnet densenet。
  2. 对于后续预测层的改进主要集中在如何去优化loss层的输入的feature map

3.1DSSD

3.1.1综述

(1)2017年的CVPR,WeiLiu
(2)SSD算法对小目标不够鲁棒的主要原因是浅层feature map的表征能力不够强,改进措施:

  1. 加入上下文信息
  2. 更好的基础网络(Resnet)和Deconvolution(反卷积)层,skip连接来给浅层feature map更好的表征能力。

3.1.2网络结构

【目标检测 深度学习】2.SSD系列算法原理
我们可以看到DSSD中,对于prior box层的输入,分别采用反卷积以及结合之前的feature map通过相加来完成之前的prior box层的输入。对于1×1的prior box 输入是不变的,对于3×3层的prior box会通过1×1层的prior box反卷积之后得到3×3的卷积层,然后这个3×3的卷积层和原始3×3的卷积层相加得到后续的loss层的输入。通过反卷积的过程可以提取更多上下文的信息。

3.1.3实验结果

DSSD与SSD对比:
【目标检测 深度学习】2.SSD系列算法原理

3.2DSOD:

3.2.1综述

(1)2017年的ICCV2017
(2)DSOD可以从0开始训练数据,不需要预训练模型,而且效果可以和fine-tune的模型媲美
(3)SSD+DenseNet=DSOD
(4)它的核心思想如下:

  1. 可以从0开始训练得到一个好的目标检测网络吗?
  2. 如果可以,设计这样的网络有没有什么原则可以遵守?

3.2.2预训练模型优缺点

预训练模型的优点:

  1. 开源模型多,可以直接将他们用于目标检测
  2. 可以快速得到最终的模型,需要的训练数据也相对较少

预训练模型缺点:

  1. 预训练模型大,参数太多,模型结构灵活性差,难以改变网络结构,计算量也大,限制其应用场合
  2. 分类和检测任务的损失函数和类别分布是不一样的,优化空间存在差异
  3. 尽管微调可以减少不同目标类别分布的差异性,但是差异太大时,微调效果依然不理想

3.2.3DSOD设计原则

(1)基于候选区域提取的方法(two-stage)无法从0开始训练,不收敛,只有proposal-free方法(one stage)可以从0开始训练并收敛,作者认为(不一定正确)可能是ROI Pooling的原因,由于ROI Pooling层的存在可能会导致需要得到一些比较好的proposal,如果不采用预训练模型我们可能会得到一些较差的ROI Pooling的输出。
(2)densenet中更多的skip connections实现supervised signals传递
(3)作者设计densenet的时候增加dense blocks数量区别原先的固定数量
(4)stem block层优化,用3个3×3的卷积层和1个2×2的最大池化层来优化stem block层
(5)作者同样采用6个尺度特征图进行目标检测,再融合

3.2.4DSOD网络结构图

【目标检测 深度学习】2.SSD系列算法原理

3.2.5实验结果

与SSD对比:
【目标检测 深度学习】2.SSD系列算法原理
【目标检测 深度学习】2.SSD系列算法原理