——为什么会阅读这篇论文?原因很简单:SSD比Faster R-CNN准、比YOLO快。
——论文出处: UNC Chapel Hill(北卡罗来纳大学教堂山分校) 的 Wei Liu 新作
——论文代码:https://github.com/weiliu89/caffe/tree/ssd
——本文宗旨:拒绝逐行逐句翻译,从我的理解我的角度,综合很多博客论文的看法来深入分析SSD
Single Shot Multibox Detector
一、论文总体观:
1.1、总体观:
SSD方法提供了一套建立在一个简单网络上的目标检测的方法:一方面,通过人为事先设定默认框的坐标,通过网络的学习训练,与真实框的损失计算,逐渐回归到接近真实尺度;另一方面,该神经网络还会在多个卷积层输出相应类别预测;结合上面位置尺度、类别预测,SSD可以省略其他神经网络惯用的姿态:随机假设目标框、小管道候选、像素重采样、特征重采样、然后需要高效分类器:这些方法套路依托深层次的特征计算,对实时的检测时间花销更大,而且只能牺牲准确度来实现提速(比Faster R-CNN准、比YOLO快)——因此时间上有了很大的提高并且准确率上也是有所提升。本方法在仿真上主要在PASCAL VOC2007上进行训练和评估,并且最后在PASCAL VOC2012上进行测试。
所以,SSD快在省略了随机假设目标框、小管道候选、像素重采样、特征重采样等步骤;准确在整合每一层卷积层输出的预测信息(包括类别和四个位置偏移量),没有丢掉细小的信息;速度和准度两者的平衡靠的是端对端的训练;
1.2、摘要:
文章在既保证速度,又要保证精度的情况下,提出了 SSD 物体检测模型,与现在流行的检测模型一样,将检测过程整合成一个单一神经网络( single deep neural network)。便于训练与优化,同时提高检测速度。SSD 将输出一系列离散化(discretization)的 目标框(bounding boxes),这些目标框是在不同层次(layers)上的特征图( feature maps )上生成的,并且有着不同的高宽比(aspect ratio)。
在预训练(prediction)阶段:要计算出每一个默认框(default box)中的物体,其属于每个类别的可能性,即 (score)得分。本文首选 PASCAL VOC 数据集,总共有 20 类,那么得出每一个目标框中物体属于这 20 个类别的每一种的可能性。同时,要对这些目标框的形状(shape)进行微调,以使得其符合物体的 外接矩形。
还有就是,为了处理相同物体的不同尺寸的情况,SSD 结合了不同分辨率的特征图( feature maps )的预测( predictions)。
二、SSD框架:
其实恕我直言,本文的框架思路不算特别清晰易懂,所以我打算直接放图,从一个大局观来理解这个研究方法:起码,你知道这个方法在做些什,然后你才有动力去理解他的具体的实现过程:
首先输入图片经过VGG16的预处理,什么事VGG16?我在之前的博客里面有对它的每一层进行考究:
http://blog.csdn.net/errors_in_life/article/details/65950699
接下来的六层卷积层是作者的自建卷积层,因为VGG16网络自身的三个全连接层并不可以作为一个图像处理,他输出的知识对应每一个类别的置信分数,所以准确的来说,VGG16只适合作为一个分类器,但是改进过后变成一个全卷积的网络就可以在最后得到特征图,上面有人工定义的默认框:
然后在经过一个卷积预测器:得到一个可以理解为二维的矩阵:比如第一个38*38*512的层,经过卷积预测器后的输出值为(3*3*512*k)*(4+c)的矩阵(这个 算法中c=20);然后每一层产生的列数一致:每层行数叠加形成一个8732*(4+c)的矩阵。形成这个矩阵的每一行对应一个图像目标检测的框。这八千多个框经过非极大值抑制(后面提及)可以筛选剩下一个或者几个了;其中不满足的框标记为负数,其余留下的标为正数框。紧随其后:
而对于训练过程中的默认框和真框的匹配,基本思路是:让每一个默认框回归并且到真框,这个过程的调控我们需要损失层的帮助,他会计算真实值和预测值之间的误差,从而指导学习的走向。
具体过程是我们会让每一个默认框经过Jaccard系数计算和真实框的相似度,阈值只有大于百分之五十的才可以列为候选名单;假设选择出来的是N个匹配度高于百分之五十的框吧,我们令i表示第i个默认框,j表示第j个真实框,p表示第p个类:那么如图,我们就可以结合真实框和默认框( 预测框 )进行定位的损失计算;以及结合c进行置信度的计算(这里的c是表示置信度)。
三、方法介绍:3.1、非极大值抑制(NMS):
非极大值抑制顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法,而是用于在目标检测中用于提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。
在本SSD例子中,做法是:按照第二部方法每层行数叠加形成一个8732*(4+c)的矩阵:
行数和每一个特征图的卷积核有关;列数前四列是一个框的对角点横纵坐标值;后二十列是对应的二十个类中的每一个类的得分;摘选过程中,我们先选出每一类的最高分,然后在这个值对应的默认框和其他框进行重叠度计算,超过阈值,我们就认为这个类会在图片上出现,我们就继续留用。如此重复,可以选择出图片上有的所有目标的最有价值的框。
3.2、Jaccard相似度:
给定两个集合A,B,Jaccard 系数定义为A与B交集的大小与A与B并集的大小的比值,定义如下:
当集合A,B都为空时,J(A,B)定义为1。
与Jaccard 系数相关的指标叫做Jaccard 距离,用于描述集合之间的不相似度。Jaccard 距离越大,样本相似度越低。公式定义如下:
其中对参差(symmetric difference):
3.3、Softmax函数
首先逻辑斯谛函数也就是经常说的sigmoid函数,它的几何形状也就是一条sigmoid曲线。
那么看名字就知道了,就是如果某一个zj大过其他z,那这个映射的分量就逼近于1,其他就逼近于0,主要应用就是多分类,sigmoid函数只能分两类,而softmax能分多类,softmax是sigmoid的扩展。
而softmax本质就是将一个K 维的任意实数向量压缩(映射)成另一个K维的实数向量,其中向量中的每个元素取值都介于(0,1)之间。
Softmax把一个k维的real value向量(a1,a2,a3,a4….)映射成一个(b1,b2,b3,b4….)其中bi是一个0-1的常数,然后可以根据bi的大小来进行多分类的任务,如取权重最大的一维。
softmax函数形式如下:
SSD例子中:空间位置的损失:
其中:
置信度损失计算:
四、结果分析:5.1、性能对比:
下面表格显示了,我们的 SSD300 model 的精度已经超过了 Fast R-CNN,当我们用 SSD 在更大的图像尺寸上, 500×500 训练得到的 model,甚至要比 Faster R-CNN 还要高出 1.9% 的 mAP。
5.2、下图的第一行图片展示了列举三个类别物体:
它们的累计的百分数以及对应的错误:我么先定义白色部分是正确检测(Cor);其后,蓝色部分(Loc)为定位错误;而红色部分(Sim)为类别错误;绿色部分(Oth)为其他错误;紫色部分(BG)为背景识别错误;而中间的红色实线表达的是:随着检测数量增加,每一类返回值准确性(0.5重叠率之下)的改变;红色虚线表达的是:随着检测数量增加,每一类返回值准确性(0.1重叠率之下)的改变。
第二行图片展示了这些类对应的最容易出错的选项之间的百分比设置;
5.3、检测例子:
5.3.1、A类目标检测框里面完全包含有物体B:
分析:前置景象会比后面被遮挡的物体置信度更加高,可以判定不会受到背景的影响,只要自身轮廓和颜色倾斜程度不受到严重的干扰。
5.3.2、同类物体多目标重叠:
发现:尽管是包含的关系,同类物体的检测效果仍然是非常高的,两个框的重叠度达到100%的情况甚至会比重叠度只有10%—25%的原因可能是:神经网络检测上对于轮廓完全可辨的情况下的准确度是有所提升的
5.3.3、目标对象失焦:
分析:该图片的人影很明显处于昏暗环境下快速运动造成,导致了镜头进光量不足的失焦,但是在目标检测中我们仍然可以检测出是一个置信度为82%的人,应该是能达到我们日常生活中的理想状态的。