前言
目标检测近年来已经取得了很重要的进展,主流的算法主要分为两个类型:
(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)是以这些先验框为基准的
,在一定程度上减少训练难度。
在上图中,
- 输入图片 size为 300* 300* 3,经过 VGG16的 Conv4后得到 38* 38* 512的特征图,对此特征图机芯正则化后对38* 38* 4=5776个候选框进行分类和回归,由于该特征图常用来检测小物体,所以在该特征图上并未检测到图片中的汽车。
- 接着对上一步的特征图进行卷积操作得到 19* 19* 1024的特征图,对生成的19* 19* 6=2166个候选框进行分类和回归,在该特赠图上仍未检出物体。
- 继续做卷积操作,得到 10* 10* 512的特征图,对生成的 10* 10* 6=600个候选框进行分类和回归,仍未检出目标物体。
- 继续做卷积操作,得到 5* 5* 256的特征图,对生成的 5* 5* 6=150个候选框进行分类和回归,检出两个目标。
- 继续做卷积操作,得到 3* 3* 256的特征图,对生成的 3* 3* 4=36个候选框进行分类和回归,检出一个目标。
- 继续做卷积操作,得到 1* 1* 256的特征图,对生成的 1* 1* 4=4个候选框进行分类和回归,检出一个目标。
- 对这 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条线路,如上图:
- 经过
一次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个目标+背景)。在预测过程中,置信度最高的那个类别就是边界框所属的类别。 - 经过
一次batch norm+一次卷积
后,生成了[1, 4* num_priorbox, layer_height, layer_width]大小的feature map
用于bounding box regression(即每个先验框prior box一组边界框相对于先验框的偏移量offset=[lcx,lcy,lw,lh]) - 生成了
[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