SSD目标检测(Single Shot MultiBox Detector)(一)
1. SSD目标检测概述
1.1 SSD的套路
SSD全称Single Shot MultiBox Detector,是大神Liu Wei在2015年发表的惊世之作(至少笔者这么认为,也是为什么先讨论SSD的原因)。 SSD提供300*300和512*512两个尺度的检测。与前辈Faster R-CNN一样,都是采用了Region Proposal的路线,不同点在于对预选框(Prior Box)选取策略和多尺度上。
SSD目标检测算法先是在固定的六个中间层(Feature Map)上选取预选框(Prior Box或Anchors),然后在训练过程中,通过Prior Box与Ground True的IOU来确定正例和负例,最后经过Smooth L1 Loss的定位损失和交叉熵的置信损失的组合来激励反向优化。其中边框回归(Bounding Regression)用于调整边框以获得精确地目标定位。
1.2 SSD的优点和缺点
多尺度,目标检测尺寸跨度大;
采用不同宽高比例构建Prior Box,对于形态轮廓多变的目标具有良好的精确度;
占比更小的目标具有更好的检测效果(相比Faster-rcnn);
单次检测多目标,比以前的算法YOLO更准更快,并没有使用RPN和Pooling操作;
2 SSD目标检测基本原理
2.1 SSD的设计理念
SSD的设计理念也是很明朗,初始阶段是一个经典的VGG16网络,FC6和FC7用卷积来替代。然后添加多个卷积-池化-ReLU组。通过选取其中6个卷积层作为类别和定位计算层。这留个卷积层分别是Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2,这六个卷积层的分辨率分别是38*38,19*19, 10*10, 5*5, 3*3, 1*1。通过在这六个卷积层上创建prior box,记录每个prior box相应匹配的grouth truth的坐标信息,计算prior box与ground truth的IOU作为得分,选取大于阈值(通常选0.5)的prior box作为正例,选择3倍于正例数量的反例。计算正例与反例相结合的交叉熵信息作为分类置信损失,通过正例记录坐标与预测坐标的L1平滑计算定位损失,分类置信损失与定位损失的和(分别乘以不同属性的权值)作为总的损失。
2.2 SSD的网络结构
引用一幅经典的结构图。
由图中可以看出,SSD在网络的起始阶段采用VGG16进行特征的提取,同时将VGG16的FC6和FC7用卷积层替代。除此之外,还去掉所有的Dropout层和FC8层,添加了Atrous算法(hole算法),将Pool5从2x2-S2变换到3x3-S1。
抽取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2层的feature map,然后分别在这些feature map层上面的每一个点构造4-6个不同尺度大小的Prior Box,然后分别进行检测和分类。最后通过NMS来抑制重叠,去除伪目标框。
2.3 Prior box
Prior Box类似于Fast Rcnn的anchors,是事先选取的锚点(推荐点)。在上述六个卷集层上,对应于feature map的每一个cell,设计对应于原图(300*300)不同长款的区域,作为用于计算Loss的区域。同样引用一张图来说明:
(该图引自于CSDN 大写的ZDQ《最详细的目标检测SSD算法讲解》一文)
先不关心b图和c图中的框的颜色,b和c图中,每个框的基准来自于对应于feature map中的每一个cell,针对不同的长和宽,来计算对应于原图的区域。
再来说蓝色框和红色框,蓝色框对应于a图中的CAT,红色框对应于a图中的DOG,因为IOU都大于阈值(一般为0.5)所以标记为正例。
2.4 Feature Map和多尺度
如图所示,SSD的多尺度体现在利用六个不同分辨率的卷集层作为Feature Map,来计算损失。越靠前的卷集层,能够检测更小的区域,对应于更小的目标,反之,越靠后的Feature Map越能检测较大的目标。
Conv4_3的每个Cell对应于原图的8*8的一个区域,Conv11_2则对应于原图300*300的全区域。
续:我们将在SSD目标检测(Single Shot MultiBox Detector)(二)中探讨SSD的两个关键点:三个生成网络和LOSS计算。
3. SSD目标检测的几个关键点
3.1 三个生成网络
3.2 定位损失和置信损失