本文记录的目的是方便自己学习和复习,有误之处请谅解,欢迎指出。
近年来目标检测算法主要包括两种类型:One Stage和Two Stage。 之前已经介绍了R-CNN、Fast-RCNN以及Faster-RCNN三种目标检测网络的算法流程和理论,这三种网络都属于Two Stage,Two Stage字面意思就是需要两步完成检测,这种目标检测网络有个比较明显的缺陷是检测速度较慢。为了加快检测速度,出现了另外一种One Stage的目标检测网络,常见地例如SSD、Yolo算法。
首先看下目前比较流行目标检测网络的性能和速度对比,如下图。从图中可以看到R-CNN、Fast-RCNN、Faster-RCNN的检测速度比较慢,准确率一般,相比之下,SSD与YOLO的速度就快很多,同时SSD的检测准确率要明显高于YOLO。下面具体介绍SSD算法
一、SSD基本框架和流程
首先SSD网络结构基于VGG16进行调整,修改全连层FC6与FC7为卷积层Conv6与Conv7,后面再用卷积层获得不同尺度的特征图。算法步骤:
1、预训练VGG16网络参数,并修改网络结构
2、输入图像,抽取6中不同尺度的特征图,并且对这6种尺度特征图中每个元素点生成各种各样的Default box(生成规则后面介绍)
3、通过NMS(非极大值抑制)进行筛选,减少Default box数量,得到正负样本,训练模型loss
二、多尺度检测
SSD多尺度思路其实很简单,就是使用不同深度的特征图进行预测,SSD使用了六种尺度特征图——conv4_3,conv_7,conv8_2,conv7_2,conv8_2,conv9_2,conv10_2,conv11_2。如下图,与的特征图能够检测不同大小物体,左侧属于浅层特征,特征图中的元素能够映射到原图中范围较小,适用于检测小物体;右侧属于深层特征,每个像素点映射到原图中的范围较大,所以能够检测较大物体
三、Default box生成与预测
SSD借鉴了Faster R-CNN的anchor思想,对特征图中每个元素设置不同尺度和长宽比的Default box,然后对这些Default box进行分类和位置回归,初步筛选出一些符合条件的Default box。如下图
1、Default box数量:特征图中每个元素生成一定数量的Default box,不同尺度特征图设置的数量也不一样,例如SSD中,六种尺度特征图conv4_3,conv_7,conv8_2,conv7_2,conv8_2,conv9_2,conv10_2,conv11_2,对应的大小为(38,38),(19,19),(10,10),(5,5),(3,3),(1,1),设置的先验框数量分别为4,6,6,6,4,4,因此可以获得的总Default box数量为个。
2、Default box大小:先验框的大小主要与特征图大小有关,越深的特征图先验框越大,否则反之。先验框面积比例遵循如下公式
其中表示特征图尺度个数,SSD为5,按正常数量来讲应该为6,但是SSD的conv4_3层是单独设置的;表示先验框相对于原图的比例;与表示比例的最小值和最大值,SSD的和分别为0.2,0.9。
1)conv4_3:其先验框的尺度比例单独设置为,则相对于原图的大小为;
2)其他5层:对于后面的特征图,先验框尺度按照上面公式线性增加,但是先将尺度比例先扩大100倍,,则各个尺度的分别为,将这些比例除以100,然后再乘以图片大小,可以得到各个特征图的尺度为。
至此,得到了每种特征图先验框的大小,然后就是设置不同长宽比即可。SSD设置了6中比例。
3、Default box分类与回归:怎么对这些Default box进分类和回归呢?先来看看特征图中每个元素点需要多少个输出,假设分类类别为20,每个元素会生成6个Default box,则分类需要个输出,表示背景也算一类,边框回归需要个输出。每一个元素都需要这么多输出,SSD使用卷积分别对先验框类别和位置进行预测,所以分类需要的卷积核数量为,位置回归需要个卷积核。
四、正负训练样本
通过第三部分得到非常多的先验框,一般不会使用所有的先验框进行训练,需要进行筛选。首先使用的NMS(非极大值抑制,这是一种常用于目标检测减少先验框的方法)减少重复度高的先验框。现在再来确定训练需要的正负样本,筛选规则如下:
1、首先,对于图片中每个Ground truth,找到与其最大的先验框,该先验框与其匹配,标记为正样本,反之,若先验框没有与任意一个ground truth匹配则为负样本。这样可以保证每个Ground truth一定与某个先验框匹配。
2、第一步存在一个问题是,会造成过多的负样本,正样本非常少。因此需要增加正样本数量,对于剩余的未匹配先验框,若某个Ground truth的大于某个阈值(一般是0.5),那么该先验框也与这个Ground truth进行匹配。这意味着某个ground truth可能与多个先验框匹配,这是可以的。但是反过来不可以,一个先验框只能匹配一个Ground truth,如果多个ground truth与某个先验框大于阈值,那么先验框只与最大的那个ground truth进行匹配。
3、如果某个Ground truth所对应最大先验框小于阈值,并且所匹配的先验框却与另外一个Ground truth的大于阈值,那么该先验框应该匹配谁,答案应该是前者。(首先要确保某个ground truth一定有一个先验框与之匹配)
如图所示,TP、FP表示正样本和负样本,GT表示Ground truth。
尽管一个ground truth可以与多个先验框匹配,但是正样本还是太少了,所以负样本相对正样本会很多。为了保证正负样本尽量平衡,SSD采用了hard negative mining,就是对负样本进行抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差的较大的top-k作为训练的负样本,以保证正负样本比例接近1:3。
五、损失函数
损失函数与Faster RCNN基本差不多包括分类损失和坐标回归损失。分类损失使用多分类交叉熵损失,位置坐标回归损失与Fast RCNN一样使用(可以看之前RCNN和Fast RCNN),回归坐标偏移量。公式如下: