DeepLearing—CV系列(九)——多类多目标物体的侦测——SSD

一、SSD核心设计理念

DeepLearing—CV系列(九)——多类多目标物体的侦测——SSD
SSD在Yolo的基础上主要改进了三点:多尺度特征图,利用卷积进行检测,设置先验框。这使得SSD在准确度上比Yolo更好,而且对于小目标检测效果也相对好一点。

1.1 采用多尺度特征图用于检测

所谓多尺度采用大小不同的特征图,CNN网络一般前面的特征图比较大,后面会逐渐采用stride=2的卷积或者pool来降低特征图大小,这正如上图所示,一个比较大的特征图和一个比较小的特征图,它们都用来做检测。这样做的好处是比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标。

1.2 采用卷积进行检测

与YoloV1最后采用全连接层不同,SSD直接采用卷积对不同的特征图来进行提取检测结果。对于形状为 [mxnxp] 的特征图,只需要采用 [3x3xp] 这样比较小的卷积核得到检测值。

1.3 设置先验框

在Yolo中,每个单元预测多个边界框,但是其都是相对这个单元本身(正方块),但是真实目标的形状是多变的,Yolo需要在训练过程中自适应目标的形状。而SSD借鉴了Faster R-CNN中anchor的理念,每个单元设置尺度或者长宽比不同的先验框,预测的边界框(bounding boxes)是以这些先验框为基准的,在一定程度上减少训练难度。一般情况下,每个单元会设置多个先验框,其尺度和长宽比存在差异,如下图所示,可以看到每个单元使用了4个不同的先验框,图片中猫和狗分别采用最适合它们形状的先验框来进行训练。
DeepLearing—CV系列(九)——多类多目标物体的侦测——SSD

SSD的检测值也与Yolo不太一样。对于每个单元的每个先验框,其都输出一套独立的检测值,对应一个边界框,主要分为两个部分。第一部分是各个类别的置信度或者评分,值得注意的是SSD将背景也当做了一个特殊的类别,如果检测目标共有 [c] 个类别,SSD其实需要预测 [c+1] 个置信度值,其中第一个置信度指的是不含目标或者属于背景的评分。后面当我们说 [c] 个类别置信度时,请记住里面包含背景那个特殊的类别,即真实的检测类别只有 [c-1] 个。在预测过程中,置信度最高的那个类别就是边界框所属的类别,特别地,当第一个置信度值最高时,表示边界框中并不包含目标。第二部分就是边界框的location,包含4个值 [cx,cy,w,h] ,分别表示边界框的中心坐标以及宽高。但是真实预测值其实只是边界框相对于先验框的转换值。先验框位置用 [dcx,dcy,dw,dh] 表示,其对应边界框用 [bcx,bcy,bw,bh] 表示,那么边界框的预测值 [l] 其实是 [b] 相对于 [d] 的转换值:
DeepLearing—CV系列(九)——多类多目标物体的侦测——SSD
习惯上,我们称上面这个过程为边界框的编码(encode),预测时,你需要反向这个过程,即进行解码(decode),从预测值 [l] 中得到边界框的真实位置 [b] :
DeepLearing—CV系列(九)——多类多目标物体的侦测——SSD

DeepLearing—CV系列(九)——多类多目标物体的侦测——SSD

二、网络结构

DeepLearing—CV系列(九)——多类多目标物体的侦测——SSD
采用VGG16做基础模型,首先VGG16是在ILSVRC CLS-LOC数据集预训练。然后借鉴了DeepLab-LargeFOV,分别将VGG16的全连接层fc6和fc7转换成 [3x3] 卷积层 conv6和 [1x1] 卷积层conv7,同时将池化层pool5由原来的stride=2的 [2x2] 变成stride=1的 [3x3] (猜想是不想reduce特征图大小),为了配合这种变化,采用了一种Atrous Algorithm,其实就是conv6采用扩展卷积或带孔卷积(Dilation Conv),其在不增加参数与模型复杂度的条件下指数级扩大卷积的视野,其使用扩张率(dilation rate)参数,来表示扩张的大小,如下图所示,(a)是普通的 [3x3] 卷积,其视野就是 [3x3] ,(b)是扩张率为2,此时视野变成 [7x7] ,©扩张率为4时,视野扩大为 [15x15] ,但是视野的特征更稀疏了。Conv6采用 [3x3] 大小但dilation rate=6的扩展卷积。
DeepLearing—CV系列(九)——多类多目标物体的侦测——SSD