SSD 学习笔记

前言

目标检测近年来已经取得了很重要的进展,主流的算法主要分为两个类型:
(1)two-stage方法,如R-CNN系算法,其主要思路是先通过启发式方法(selective search)或者CNN网络(RPN)产生一系列稀疏的候选框,然后对这些候选框进行分类与回归,two-stage方法的优势是准确度高;
(2)one-stage方法,如Yolo和SSD,其主要思路是均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同尺度和长宽比,然后利用CNN提取特征后直接进行分类与回归,整个过程只需要一步,所以其优势是速度快,但是均匀的密集采样的一个重要缺点是训练比较困难,这主要是因为正样本与负样本(背景)极其不均衡(参见Focal Loss),导致模型准确度稍低。不同算法的性能如图所示,可以看到两类方法在准确度和速度上的差异。
在这里插入图片描述

概述

SSD算法,其英文全名是Single Shot MultiBox Detector,名字取得不错,Single shot指明了SSD算法属于one-stage方法,MultiBox指明了SSD是多框预测。

Yolo算法缺点是难以检测小目标,而且定位不准,SSD在一定程度上克服这些缺点。SSD和Yolo一样都是采用一个CNN网络来进行检测,相比Yolo,SSD采用CNN来直接进行检测,而不是像Yolo那样在全连接层之后做检测。但是却采用了多尺度的特征图,其基本架构如图所示。下面将SSD核心设计理念总结为以下三点:
在这里插入图片描述
(1)多尺度特征图用于检测

一个比较大的特征图和一个比较小的特征图,它们都用来做检测。这样做的好处是比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标。

(2)采用卷积进行检测

与Yolo最后采用全连接层不同,SSD直接采用卷积对不同的特征图来进行提取检测结果。对于形状为m* n* p 的特征图,只需要采用3* 3* p这样比较小的卷积核来生成一个检测结果,获取表示长度为c+4的向量,c代表类别置信度,4代表基于相对预设框的偏移[x,y,w,h];

(3)设置先验框

在Yolo中,每个单元预测多个边界框,但是其都是相对这个单元本身(正方块),但是真实目标的形状是多变的,Yolo需要在训练过程中自适应目标的形状。而SSD借鉴了Faster R-CNN中anchor的理念,每个单元设置尺度或者长宽比不同的先验框(Prior boxes, Default boxes,在Faster R-CNN中叫做锚,Anchors),预测的边界框(bounding boxes)是以这些先验框为基准的,在一定程度上减少训练难度。

在这里插入图片描述在这里插入图片描述在上图中,

  1. 输入图片 size为 300* 300* 3,经过 VGG16的 Conv4后得到 38* 38* 512的特征图,对此特征图机芯正则化后对38* 38* 4=5776个候选框进行分类和回归,由于该特征图常用来检测小物体,所以在该特征图上并未检测到图片中的汽车。
  2. 接着对上一步的特征图进行卷积操作得到 19* 19* 1024的特征图,对生成的19* 19* 6=2166个候选框进行分类和回归,在该特赠图上仍未检出物体。
  3. 继续做卷积操作,得到 10* 10* 512的特征图,对生成的 10* 10* 6=600个候选框进行分类和回归,仍未检出目标物体。
  4. 继续做卷积操作,得到 5* 5* 256的特征图,对生成的 5* 5* 6=150个候选框进行分类和回归,检出两个目标。
  5. 继续做卷积操作,得到 3* 3* 256的特征图,对生成的 3* 3* 4=36个候选框进行分类和回归,检出一个目标。
  6. 继续做卷积操作,得到 1* 1* 256的特征图,对生成的 1* 1* 4=4个候选框进行分类和回归,检出一个目标。
  7. 对这 5776+2166+600+150+36+4=8732个候选框分类和回归之后,对检出结果进行非极大值抑制后得到最终的检测结果。

在这里插入图片描述

二、算法细节

1、多尺度特征

不同的feature map中含有不同的特征,而不同的特征可能对我们的检测有不同的作用。总的来说,浅层卷积层对边缘更加感兴趣,可以获得一些细节信息(位置信息),而深层网络对由浅层特征构成的复杂特征更感兴趣,可以获得一些语义信息,对于检测任务而言,如果我们同时在不同的feature map上面进行目标检测,理论上面应该会获得更好的检测效果。

2、Default box 和 Prior box(先验框

一般情况下,每个单元会设置多个先验框,其尺度和长宽比存在差异,如图所示,可以看到每个单元使用了4个不同的先验框,图片中猫和狗分别采用最适合它们形状的先验框来进行训练,后面会详细讲解训练过程中的先验框匹配原则
在这里插入图片描述
图片被送进网络之后先生成一系列 feature map,传统框架会在 feature map(或者原图)上进行 region proposal 提取出可能有物体的部分然后进行分类,这一步可能非常费时,所以 SSD 就放弃了 region proposal,而选择直接生成一系列 defaul box(筛选出prior boxes投入训练),然后以prior box 为初始bounding boxes,将初始bounding boxes回归到正确的GT位置上去,预测出的定位信息实际上是回归后的bounding boxes回归前的(prior box)相对坐标。整个过程通过网络的一次前向传播就可以完成。

Defalut box
在这里插入图片描述SSD中的Defalut box和Faster-rcnn中的anchor机制很相似。就是预设一些目标预选框,后续通过softmax分类+bounding box regression获得真实目标的位置。对于不同尺度的feature map 上使用不同的Default boxes。如上图所示,我们选取的feature map包括38x38x512、19x19x1024、10x10x512、5x5x256、3x3x256、1x1x256。具体怎么得到的看下面的表。我们总共可以获得8732个box,然后我们将这些box送入NMS模块中,获得最终的检测结果。

Prior box

训练中还有一个东西:Prior box,是指实际中选择的要投入训练过程的Default box(每一个feature map cell 不是k个Default box都取)

也就是说Default box是一种概念,Prior box则是实际的选取

对于正样本训练来说,需要先将prior box与ground truth box做匹配,匹配成功说明这个prior box所包含的是个目标,但离完整目标的ground truth box还有段距离,训练的目的是保证default box的分类confidence的同时将prior box尽可能回归到ground truth box。

举个列子:假设一个训练样本中有2个ground truth box,所有的feature map中获取的prior box一共有8732个。那可能分别有10、20个prior box能分别与这2个ground truth box匹配上。

Defalut box生成规则:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

layer {  
  name: "conv4_3_norm_mbox_priorbox"  
  type: "PriorBox"  
  bottom: "conv4_3_norm"  
  bottom: "data"  
  top: "conv4_3_norm_mbox_priorbox"  
  prior_box_param {  
    min_size: 30.0  
    max_size: 60.0  
    aspect_ratio: 2  
    flip: true  
    clip: false  
    variance: 0.1  
    variance: 0.1  
    variance: 0.2  
    variance: 0.2  
    step: 8  
    offset: 0.5  
  }  
}  

在这里插入图片描述Prior box如何使用

知道了Prior box如何产生,接下来分析Prior box如何使用。这里以conv4_3为例进行分析。在这里插入图片描述 在conv4_3 feature map网络pipeline分为了3条线路,如上图:

  1. 经过一次batch norm+一次卷积后,生成了[1, num_class* num_priorbox, layer_height, layer_width]大小的feature map用于softmax进行目标分类,即每一个先验框prior box都输出一套独立的检测值,对应一个边界框:各个类别的置信度或者score 评分(其中num_class是目标类别数目,num_priorbox是用到的prior box数目,SSD 300的VOC数据集中num_class = 21,即20个目标+背景)。在预测过程中,置信度最高的那个类别就是边界框所属的类别。
  2. 经过一次batch norm+一次卷积后,生成了[1, 4* num_priorbox, layer_height, layer_width]大小的feature map用于bounding box regression(即每个先验框prior box一组边界框相对于先验框的偏移量offset=[lcx,lcy,lw,lh])在这里插入图片描述
  3. 生成了[1, 2, 4* num_priorbox]大小的prior box blob,其中2个channel分别存储prior box的4个点坐标和对应的4个variance。4个variance,这实际上是一种bounding regression中的权重,设置variance超参数来调整检测值,用来对 l 的4个值进行放缩,此时边界框需要这样解码:在这里插入图片描述

后续通过softmax分类+bounding box regression即可从priox box中预测到目标。

综上所述,对于一个大小 m * n的特征图,共有mn 个单元,每个单元设置的先验框数目记为 k ,那么每个单元共需要(c+4)* k 个预测值,所有的单元共需要(c+4)* k * m * n个预测值,由于SSD采用卷积做检测,所以就需要(c+4)* k卷积核完成这个特征图的检测过程。

有一个细节是只有conv4_3层后加了一个Normalization 操作,其他的几层都没有,具体原因参考另一篇文章:Normalization on conv4_3 in SSD :https://blog.csdn.net/ytusdc/article/details/86612355

三、SSD训练过程:

然后看一张训练流程图,比较清晰明了:
在这里插入图片描述(1)每一个 prior box 经过Jaccard系数计算和GT框的相似度。
(2)阈值只有大于 0.5 的才可以列为候选名单;假设选择出来的是N个匹配度高于百分之五十的框。
(3)我们令 i 表示第 i 个default box,j 表示第 j 个ground truth box,p表示ground truth且类别是p。

损失函数 Loss计算:

训练样本确定了,然后就是损失函数了。损失函数定义为位置误差(locatization loss, loc)与置信度误差(confidence loss, conf)的加权和:
在这里插入图片描述
对于位置误差,其采用Smooth L1 loss,定义如下:
在这里插入图片描述
对于置信度误差,其采用softmax loss:
在这里插入图片描述在这里插入图片描述更详细的解释看一看下图:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述**4)**筛选default boxes, 计算完所有default boxes 的分类 loss后,按照 loss 排序,选择 loss 较大且与任意 gt_bbox 之间的 iou 小于 阈值neg_overlap 的样本中的前 3*num_positive 个负样本(保证留下的负样本“够坏”,同时保证1:3的正负比例)。

而后,这正负比为1:3的部分default boxes就是筛选全体default box后剩下的prior boxes,用这些prior box作为参考,对所有预测框其进行分类和回归,进行反向传播更新网络参数,即训练。

3、Data augmentation(数据增强):
在这里插入图片描述在这里插入图片描述

5、NMS(非极大值抑制)

在SSD算法中,NMS至关重要,因为多个feature map 最后会产生大量的BB,然而在这些BB中存在着大量的错误的、重叠的、不准确的BB,这不仅造成了巨大的计算量,如果处理不好会影响算法的性能。仅仅依赖于IOU(即预测的BB和GT的BB之间的重合率)是不现实的,IOU值设置的太大,可能就会丢失一部分检测的目标,即会出现大量的漏检情况;IOU值设置的太小,则会出现大量的重叠检测,会大大影响检测器的性能,因此IOU的选取也是一个经验活,常用的是0.65,建议使用论文中作者使用的IOU值,因为这些值一般都是最优值。即在IOU处理掉大部分的BB之后,仍然会存在大量的错误的、重叠的、不准确的BB,这就需要NMS进行迭代优化。

四、SSD性能评估

1、模块性能评估
在这里插入图片描述在这里插入图片描述

五、SSD网络结构优劣分析

优点:

SSD算法的优点应该很明显:运行速度可以和YOLO媲美,检测精度可以和Faster RCNN媲美。SSD对不同横纵比的object的检测都有效,这是因为算法对于每个feature map cell都使用多种横纵比的default boxes,这也是本文算法的核心。最后本文也强调了增加数据集的作用,包括随机裁剪,旋转,对比度调整等等。

缺点:

1、需要人工设置prior box的min_size,max_size和aspect_ratio值。网络中prior box的基础大小和形状不能直接通过学习获得,而是需要手工设置。而网络中每一层feature使用的prior box大小和形状恰好都不一样,导致调试过程非常依赖经验。(相比之下,YOLO2使用聚类找出大部分的anchor box形状,这个思想能直接套在SSD上)

2、虽然采用了pyramdial feature hierarchy的思路,但是对小目标的recall依然一般,并没有达到碾压Faster RCNN的级别。作者认为,这是由于SSD使用conv4_3低级feature去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。所以增加输入图像的尺寸对于小的object的检测有帮助。另外增加数据集(此处主要是指裁剪)对于小的object的检测也有帮助,原因在于随机裁剪后的图像相当于“放大”原图像,所以这样的裁剪操作不仅增加了图像数量,也放大了图像。

转:
https://blog.csdn.net/ytusdc/article/details/86577939
目标检测|SSD原理与实现:https://zhuanlan.zhihu.com/p/33544892

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值