SSD介绍:

        是作者Wei Liu在ECCV 2016上发表的论文提出的。对于输入尺寸300*300的SSD网络使用Nvidia Titan X在VOC 2007测试集上达到74.3%mAP以及59FPS(每秒可以检测59张图片);对于输入512*512的SSD网络,达到了76.9%mAP,超越了当时最强的Faster RCNN(73.2%mAP)。达到真正的实时检测。

SSD网络结构:(可以达到在不同特征尺度上预测不同尺度的目标)

目标检测网络 损失函数 目标检测网络ssd_ssd

         1、会对输入的图像进行缩放,必须是300*300*3的RGB图像。

第5个卷积部分的第三层)及之前的部分结构,如图:通过Conv4_3,得到第一个特征预测层,输出为38*38*512的特征矩阵。当通过该网络后,特征矩阵输出大小为19*19*512。

目标检测网络 损失函数 目标检测网络ssd_深度学习_02

        3、接下来通过3*3*1024的卷积层,输出19*19*1024的特征矩阵(可以看成是VGG16的第一个全连接层)。

第二个特征预测层,输出19*19*1024的特征矩阵(可以看成是VGG16的第二个全连接层)。

第三个特征预测层,输出10*10*512的特征矩阵。

第四个特征预测层,输出为5*5*256的特征矩阵。

第五个特征预测层,输出为3*3*256的特征矩阵。

第6个特征预测层,输出为1*1*256的特征矩阵。

        注意卷积层步距为2的padding则为1,步距为0的padding则为0。

随着抽象程度加深,让后面的特征预测层去检测更大的目标。

SSD原论文示例:

 

目标检测网络 损失函数 目标检测网络ssd_目标检测网络 损失函数_03

抽象程度较低一些,所以它会保留更多的细节信息,就可以预测较小的目标。在图a猫的面积相对于狗的面积较小一些,所以就在8*8的feature map进行预测猫的目标边界框。很显然在图c中,4*4的Default Box(类似于Faster R-cnn的anchor box)可以很好的匹配GT box。

SSD中的Default Box的scale(尺度)以及aspect(比例)的设定:

        原论中scale的计算:  

目标检测网络 损失函数 目标检测网络ssd_目标检测网络 损失函数_04

         在很多实现的方法中,都没有采用该方法去计算,所以在这里直接给出每个预测特征层的目标尺度以及对应比例:

目标检测网络 损失函数 目标检测网络ssd_目标检测网络 损失函数_05

两个scale?

因为在原论文当中,对于比例为1的情况,我们会额外增加一个default box。这个增加的default的scale的值为

目标检测网络 损失函数 目标检测网络ssd_深度学习_06

,其中sk指的是第一个scale值(如21),sk+1指的是第二个scale值(如45),其中sk+1对应着下一层的第一个scale值。

接下来,将直接给出6个特征预测层的default boxs的尺寸比例,以及数量:

        

目标检测网络 损失函数 目标检测网络ssd_深度学习_07

        如图:在第一个特征预测层,特征矩阵为38*38,其中default box的尺寸有两种:

1、scale大小为21,有三种比例:1:2,1:1,2:1

2、scale大小为

目标检测网络 损失函数 目标检测网络ssd_ssd_08

,只有一种比例:1:1

特征层①⑤⑥会生成4个,特征层②③④会生成6个。

        所以,对于特征图层①,因为其特征图的大小为38*38以及每个位置会生成4个default box,所以在该特征层中,总计会生成38*38*4个defaul box。

        依次类推,总计8732个default box,与原论中一样。

对于Default Box的再次理解:

目标检测网络 损失函数 目标检测网络ssd_深度学习_09

        上图给出预测特征图1以及预测特征图4,以及标注了预测特征层1和预测特征层4的scale以及aspect信息。并假设在feature map1的该点位置生成它的default boxs,

        通过映射信息,找到该点对应原图的坐标,然后以它为中心,去绘制default box。如上图,对于左边的4个default box,三个较小的是通过该scale和aspect绘制而来

目标检测网络 损失函数 目标检测网络ssd_目标检测网络 损失函数_10

;外面较大的是通过该

目标检测网络 损失函数 目标检测网络ssd_ssd_11

绘制而来。

Predictor(预测器)的实现:

        即如何在这6个预测特征矩阵层上进行预测?

目标检测网络 损失函数 目标检测网络ssd_卷积_12

用3*3*p的卷积层,生成概率分数以及坐标偏移量(边界框回归参数)(实现方法类似于Faster R-CNN)。 

        那对于每一个特征预测层,要使用多少个卷积核呢?

目标检测网络 损失函数 目标检测网络ssd_目标检测_13

对于m*n的特征矩阵而言,就会生成m*n*k*(c+4)个输出值。

        解释上文:(c+4)*k=c*k+4*k

        

目标检测网络 损失函数 目标检测网络ssd_卷积_14

 每一个default box都会预测c个类别分数,这里的c个类别分数包括了背景类别(即会预测背景概率)。比如csk Voc测试集,所需预测的类别个数为20,所以它所对应的c为21,且第一个为背景的分数,后面依次为所预测目标的分数。

目标检测网络 损失函数 目标检测网络ssd_卷积_15

 四个参数分别为中心坐标,宽度以及高度的预测。(注意这里与Faster R-CNN有点不同,这里对每个default box都只生成4个参数,而Faster R-CNN,会对每一个anchor box 进行分类生成,即4*c个参数,c为类别个数)。

训练SSD模型时,正负样本的选取:

        原论文给出2个准则:1、对每一个ground truth box去匹配与它 iou值最大的default box,则也是正样本。   2、对于任意一个default box,只要它与任意一个ground truth box的iou值大于0.5,则是正样本。(与Faster R-CNN类似)

目标检测网络 损失函数 目标检测网络ssd_目标检测_16

         选取策略:在上面剩下的所有负样本,计算它们的最大confidence loss(可以理解为越大,越不能被选取),选取值较小的作为负样本,数量为正样本的3倍。

损失的计算:

目标检测网络 损失函数 目标检测网络ssd_目标检测_17

        (说明:以上各图并非原创)