版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wwwhp/article/details/85047884
paper:: SSD Single Shot MultiBox Detector(单摄多框检测器)
link:SSD paper
code:https://github.com/weiliu89/caffe/tree/ssd
摘要
- 提出目标检测方法SSD:
- one-stage的检测方法,不需要额外的proposal生成过程;
- 将bbox的输出空间离散化到每个feature map预设的多长宽比例和多尺度的boxes上;(具体含义是将学习到的bbox直接映射到预设的box上)
- 通过合并不同size feature map的方法来处理检测目标多尺度的问题;
- SSD性能:
- 的输入分辨率,SSD在VOC07 test数据集上能达到74.3%mAP,59FPS(Titan X);
- 输入分辨率能达到76.9%mAP,比Faster-RCNN的精度更高;
- 在提升了数据增强策略后性能有了进一步的提升: 达到77.2%mAP, 达到79.8%mAP;
引言
- SSD方法带来的提升和贡献:
- 提出一个one-stage的目标检测方法:在速度比同为one-stage方法YOLO v1快的同时精度能达到two-stage方法Faster-RCNN的水平;
- SSD的核心思想是用小尺寸卷积核对预设的bbox预测对应的classes score和coord offsets;
- 在不同尺寸的feature map上预测不同长宽比例的bbox提升检测精度;
- 实现了同时权衡精度和速度的端到端的目标检测训练框架;
- 在实验阶段进行了全方位的速度和性能的对比;
Single Shot Detector
本节主要内容是针对SSD算法框架和对应的训练方法进行描述:
- SSD在训练阶段需要训练图像以及对应object的ground truth label;
- 在卷积预测阶段:针对不同尺寸feature map上每一个location按照不同长宽比例预测和预设bbox集合相对的坐标偏移和类别置信度;
- 训练阶段的loss是坐标Smooth L1 loss和类别Softmax loss的加权求和;
SSD model design
SSD原始实现的backbone是VGG-16,在此基础上添加了一些辅助结构以产生最后的检测预测结果:
- 多尺度feature map检测:SSD同时在多个尺度的feature map上预测结果,相反在YOLO v1的方法中只在单一的feature map预测检测结果;上图SSD pipeline中最终会产生8732个bbox,对此number进行解析:
- feature map box数目:
- feature map box数目:
- feature map box数目:
- feature map box数目:
- feature map box数目:
- feature map box数目:
- YOLO v1最后使用全连接层来生成最后的预测结果,SSD则采用 直接对输出的特征图进行卷积操作计算预测值(注意:同一个特征图中每个单元的先验框数目相同,每一个单元的先验框的设置<大小和长宽比>不同);
- 先验框priorBox的设置:针对特征图上每一个cell需要预测k个bbox,因此每一个输出的特征图都需要 个卷积核,其中c表示类别数(SSD中将背景也当做特殊的类别,SSD实际要预测c+1个类别置信度,其中包括bbox属于背景的置信度,论文中c类别已经包含了背景这个类别),4表示坐标相关数目,SSD中priorBox的设计参考了Faster-RCNN的anchor boxes,不同的是SSD的priorBox应用在不同分辨率的特征图;
- 从priorBox到Bbox解析的实现细节(结合Faster-RCNN部分内容):
- 当背景类的置信度最高时,表示预测的bbox不包含目标,当其他类别置信度最高时就代表bbox所含目标的类别,SSD网络对feature map上的每一个cell的每一个priorBox都要预测两组值 和 ,通常bbox的位置信息由中心坐标和长宽表示,但是实际上SSD的预测值只是priorBox到Bbox的转换值(offset/transformation),SSD里面使用的坐标转换策略和Faster-RCNN相同;
- 已知先验框 和目标边界框 ,其转换过程为: ,在目标检测领域中这个过程叫做bbox位置信息的编码encode,预测解析是其逆向过程为位置信息的解码decode,从预测值和priorBox解析得到预测Bbox;
- 位置信息解码阶段: ;(具体的解析过程可以通过源码实现来学习)
- 当前特征图 要预测 个值,一共需要 哥卷积核完成特征图的预测值计算过程;
SSD training
SSD训练过程中的关键点是如何将ground truth信息和网络预测输出的信息匹配上,一旦信息匹配上就能端到端的训练了(这里可以理解为预测值和GT值为loss function的两个输入,需要进行相应值的转换才才能符合loss function的输入标准):
- 匹配策略:在SSD的训练过程中,当预测bbox和任一gt bbox的jaccard overlap(IOU值)大于0.5时都被当做正样本(由于图像中GT很少,目的是防止负样本过多这个样本过少,学习难度大),其实即使是这样训练过程中由于ground truth太少,正负样本还是极度不平衡;
- 训练目标(loss函数):SSD的损失函数为位置损失函数loc loss和类别置信度损失函数的conf loss的加权和: ,根据交叉验证求出 为1;其中N表示先验框为正样本的数量,当 时loss设定为0,loc loss代表预测box l和GT box g之间的Smooth L1 loss(绝对值loss),和Faster-RCNN的回归思路相同针对cell 对priorBox d的中心坐标和w h进行回归, ,其中 为1时表示第i个先验框和第j个GT匹配,匹配类别为k,由于 的存在loc loss只针对正样本计算,loc loss输入数据需要特别注意:首先对GT的box进行encode处理得到 ,网络的预测值也是编码值(SSD caffe里面还有variance_encoded_in_target参数为TRUE时候编码需要加上variance,具体看实现吧);置信度loss采用Softmax loss: ;
- 先验框的尺寸和长宽比的选择:SSD中大特征图用于检测小目标(底层特征图能捕获图像更多的细节),小特征用于检测大目标,SSD先验框的尺度设计思路为随着特征图size变小先验框尺度线性增加: ,其中m代表特征图的数目5, 表示先验框相对于网络输入图像size的比例,论文里面设定 ;第一层输出的size单独设置的 , 计算过程:1. 先乘100计算的时候向下取整2. 然后求出步长17对应每一层的 3.然后再除以100乘以网络输入图像大小得到 ;论文里面长宽比设定为 ,与此对应的w和h计算方法为 ,除了默认的比例为1的先验框以外还会增加一个额外的框 ,因此每一个特征图的cell对应6个先验框,但实际上有三个输出特征层只有4个先验框 (具体哪几层见多尺度FM检测分析部分);先验框的中心点分布在各cell的中心 ,其中 为特征图的大小;
- 困难负样本挖掘:在训练过程中正负样本数量极不平衡,SSD采用hard negative mining方法对负样本进行抽样,按照置信度误差降序排序(负样本背景类别的置信度越小,误差越大),选取误差较大的部分负样本保持和正样本的比例为 进行训练,能使得训练过程更稳定收敛更快;
- 数据增强:为了使得模型更加鲁棒,SSD训练阶段采用的数据增强策略如下,其中采集的size为原图的
,长宽比为
,每一张图像都有0.5的概率会进行水平翻转;
- 原始图像输入;
- 采集块区域是的和目标的IOU值为0.1、0.3、0.5、0.7、0.9;
- 随机采集块区域;
SSD inference
SSD的预测过程主要分为以下几个阶段:
- 首先根据类别置信度确定其类别与其对应的置信度值,并过滤掉属于背景的预测框;
- 根据置信度阈值0.5对预测框进行过滤,对剩下的预测框进行解码和校正,得到预测框真实的位置信息;
- 根据置信度进行降序排列,保留部分预测框并进行NMS,过滤掉那些重叠度较大的预测框得到最终检测结果;
实验结果
论文中分析了SSD和其他几种既有代表性的检测方法在VOC、COCO等数据集上的性能表现,实验部分的分析比较繁琐在此我就不再多阐述了,直接看表格比较直观:
- PASCAL VOC2007
- PASCAL VOC2012
- COCO
- 数据增强后提升小目标检测的准确率
总结
- SSD新特征:多尺度特征图检测,直接使用小卷积核来计算预测结果,设置了priorBox(anchor);
- SSD性能:速度比YOLO v1快小目标检测效果更好(这也是YOLO v1的缺点),精度和Faster-RCNN这种two-stage检测方法相匹配;
- SSD可以很方便地部署到大规模系统的目标检测模块上;
- SSD算法里面有很多实现细节没有列出来,需要阅读源码,目前基于SSD算法的思想出现了许多改进的检测方法(更换backbone只是最基础的一种方法);