SSD:Single Shot MultiBox Detector

论文链接:https://arxiv.org/abs/1512.02325

论文翻译链接:https://blog.csdn.net/quincuntial/article/details/78854930

    本文提出的SSD算法是一种直接预测目标类别和bounding box的多目标检测算法。与faster rcnn相比,该算法没有生成 proposal 的过程,这就极大提高了检测速度。针对不同大小的目标检测,传统的做法是先将图像转换成不同大小(图像金字塔),然后分别检测,最后将结果综合起来。而SSD算法则利用不同卷积层的 feature map 进行综合也能达到同样的效果。算法的主网络结构是VGG16,将最后两个全连接层改成卷积层,并随后增加了4个卷积层来构造网络结构。对其中5种不同的卷积层的输出(feature map)分别用两个不同的 3×3 的卷积核进行卷积,一个输出分类用的confidence,每个default box 生成21个类别confidence;一个输出回归用的 localization,每个 default box 生成4个坐标值(x, y, w, h)。此外,这5个feature map还经过 PriorBox 层生成 prior box(生成的是坐标)。上述5个feature map中每一层的default box的数量是给定的(8732个)。最后将前面三个计算结果分别合并然后传给loss层。

基础

 

 

feature map cell:是指feature map中每一个小格子,就是上图中的每个小方格,上图分别有64个feature map cell 和16个feature                               map cell 

default box:是指每个feature map cell上都有一系列固定大小的box,也就是上图中的虚线框。

ground truth: 在机器学习中,数据是有标注的, t是正确标注的ground truth。就好像上图中x是框的信息,t就是猫或者狗                          的信息。

prior box:是指在实际选择fdefault box 过程中(在实际选择中我们并不是每个feature map cell的k个default box 都取)也就是说                   default box是一种概念,prior box则是实际的选取。

           训练中一张完整的图片送进网络获得各个feature map,对于正样本训练来说,需要先将prior box与ground truth box做匹配(就是把一张图片 输入到 region network中,判断有物体的区域就是prior box,可以看一下fast rcnn的解释),匹配成功说明这个prior box所包含的是个目标,但离完整目标的ground truth box还有段距离,训练的目的是保证default box的分类confidence的同时将prior box尽可能回归到ground truth box。

             举个列子:在上图中一个训练样本中有2个ground truth box,所有的feature map中获取的default  box一共有8732个。那个可能分别有10、20个prior box能分别与这2个ground truth box匹配上。训练的损失包含定位损失和回归损失两部分。

             假设每个feature map cell有k个default box,那么对于每个default box都需要预测c个类别score和4个offset,那么如果一个feature map的大小是m×n,也就是有m*n个feature map cell,那么这个feature map就一共有(c+4)*k * m*n 个输出。这些输出个数的含义是:采用3×3的卷积核对该层的feature map卷积时卷积核的个数,包含两部分(实际code是分别用不同数量的3*3卷积核对该层feature map进行卷积):数量c*k*m*n是confidence输出,表示每个default box的confidence,也就是类别的概率;数量4*k*m*n是localization输出,表示每个default box回归后的坐标

卷积核配置 :假设Feature Map通道数为P,SSD网络中每个Stage的卷积核大小统一为3*3*P。其中padding和stride都为1。                              保证卷积后的Feature Map和卷积前是一样大小。

卷积滤波器 :每个Feature Map上mxn个大小的特征点对应K个Default Boxes,假设类别数+背景=c,最终通过卷积滤波器得到                          c+4维特征向量。那么一个Feature Map上的每个点就需要使用kx(c+4)个这样的滤波器。

论文贡献

  1.  我们提出了SSD,一个多分类单杆检测器(single-shot detector),比现在的单杆检测器(YOLO)更快,和那些较慢技术精度一样,并且超过了区域提议(region proposals)和池化(pooling)的方法,包括faster R-CNN.
  2.   SSD的核心部分是预测分类得分和一个固定集合的默认边界框的框偏移,这些是通过使用卷积滤波器到特征图上实现的。 
  3. 为了获得高检测精度,我们会从不同比例的特征图来产生不用比例的预测,通过纵横比来分开预测。
  4.  这些设计特征可以进行端到端训练,精度还很高,在输入图片分辨率很低的情况下精度也能保持高精度。改进了速度和进度折中均衡的局面。
  5.  实验包含模型之间速度和精度的分析,用了不同输入大小,数据集为PASCALVOC,COCO和ILSVRC,比较了最近的最新的方法。

网络

Default Box

     default box在上文中已经介绍,那么default box的scale(大小)和aspect ratio(横纵比)要怎么定呢?假设我们用m个feature maps做预测,那么对于每个featuer map而言其default box的scale是按以下公式计算的: 

S_{k}=S_{min}+\frac{(S_{max}-S_{min})}{m-1}(k-1),k∈[1,m]

这里smin是0.2,表示最底层的scale是0.2;smax是0.9,表示最高层的scale是0.9。

至于aspect ratio,用a_{r}表示为下式:注意这里一共有5种aspect ratio 

ar={1,2,3,1/2,1/3}

因此每个default box的宽的计算公式为: 

W_{k}^{a}=S_{k}\sqrt{a_{r}}

高的计算公式为:(很容易理解宽和高的乘积是scale的平方) 

h_{k}^{a}=S_{k}/\sqrt{a_{r}}

另外当aspect ratio为1时,作者还增加一种scale的default box: 

S^{'}_{k}=\sqrt{S_{k}S_{k+1}}

因此,对于每个feature map cell而言,一共有6种default box。 

可以看出这种default box在不同的feature层有不同的scale,在同一个feature层又有不同的aspect ratio,因此基本上可以覆盖输入图像中的各种形状和大小的object!

 

正负样本

prior box 和 grount truth box 按照IOU(JaccardOverlap)进行匹配,匹配成功则这个prior box就是positive example(正样本),如果匹配不上,就是negative example(负样本),显然这样产生的负样本的数量要远远多于正样本。这里将前向loss进行排序,选择最高的num_sel个prior box序号集合 D。那么如果Match成功后的正样本序号集合P。那么最后正样本集为 P-D\cap P,负样本集为 D-D\cap P同时可以通过规范num_sel的数量(是正样本数量的三倍)来控制使得最后正、负样本的比例在 1:3 左右。

jaccard overlap 就是交并比 ,也就是IOU

 

正样本:

我们已经在图上画出了prior box,同时也有了ground truth,那么下一步就是将prior box匹配到ground truth上。值得注意的是先是从groudtruth box出发给每个groudtruth box找到了最匹配的prior box放入候选正样本集,然后再从prior box出发为prior box集中寻找与groundtruth box满足IOU>0.5IOU>0.5的一个IOU最大的prior box(如果有的话)放入候选正样本集,这样显然就增大了候选正样本集的数量。

 

负样本:

在生成一系列的 prior boxes 之后,会产生很多个符合 ground truth box 的 positive boxes(候选正样本集),但同时,不符合 ground truth boxes 也很多,而且这个 negative boxes(候选负样本集),远多于 positive boxes。这会造成 negative boxes、positive boxes 之间的不均衡。训练时难以收敛。

      因此,本文采取,先将每一个物体位置上对应 predictions(prior boxes)loss 进行排序。 对于候选正样本集:选择最高的几个prior box与正样本集匹配(box索引同时存在于这两个集合里则匹配成功),匹配不成功则删除这个正样本(因为这个正样本不在难例里已经很接近ground truth box了,不需要再训练了);对于候选负样本集:选择最高的几个prior box与候选负样本集匹配,匹配成功则作为负样本。

         这就是一个难例挖掘的过程,举个例子,假设在这8732个prior box里,经过FindMatches后得到候选正样本P个,候选负样本那就有8732−P个。将prior box的prediction loss按照从大到小顺序排列后选择最高的M个prior box。如果这P个候选正样本里有a个box在这M个prior box里,将这a个box从候选正样本集中踢出去。如果这8732−P个候选负样本集中包含的8732−P有M−a个在这M个prior box,则将这M−a个候选负样本作为负样本。SSD算法中通过这种方式来保证 positives、negatives 的比例。实际代码中有三种负样本挖掘方式:

Data augmentation

本文同时对训练数据做了 data augmentation,数据增广。

每一张训练图像,随机的进行如下几种选择:

  • 使用原始的图像
  • 随机采样多个 patch(CropImage),与物体之间最小的 jaccard overlap 为:0.1,0.3,0.5,0.7 与 0.9

采样的 patch 是原始图像大小比例是 [0.3,1.0],aspect ratio 在 0.5 或 2。

当 groundtruth box 的 中心(center)在采样的 patch 中且在采样的 patch中 groundtruth box面积大于0时,我们保留CropImage。

在这些采样步骤之后,每一个采样的 patch 被 resize 到固定的大小,并且以 0.5 的概率随机的 水平翻转(horizontally flipped,翻转不翻转看prototxt,默认不翻转)

这样一个样本被诸多batch_sampler采样器采样后会生成多个候选样本,然后从中随机选一个样本送人网络训练

LOSS

       和Faster RCNN的基本一样,由分类和回归两部分组成,可以参考Faster RCNN,这里不细讲。总之,回归部分的loss是希望预测的box和prior box的差距尽可能跟ground truth和prior box的差距接近,这样预测的box就能尽量和ground truth一样。

\bg_white L(x,c,l,g)=\frac{1}{N}(L_{conf}(x,c)+\alpha L _{loc}(x,l,g))

上面得到的8732个目标框经过Jaccard Overlap筛选剩下几个了;其中不满足的框标记为负数,其余留下的标为正数框。紧随其后:

定位损失是预测框L与真实框g之间的平滑l_{1}l损失,置信损失是softmax的多分类置信度。先学习重合度高的框的位置信息在学习类别信息。

 

网络结构

    SSD的结构在VGG16网络的基础上进行修改,训练时同样为conv1_1,conv1_2,conv2_1,conv2_2,conv3_1,conv3_2,conv3_3,conv4_1,conv4_2,conv4_3,conv5_1,conv5_2,conv5_3(512),fc6经过3*3*1024的卷积(原来VGG16中的fc6是全连接层,这里变成卷积层,下面的fc7层同理),fc7经过1*1*1024的卷积,conv6_1,conv6_2(对应上图的conv8_2),conv7_1,conv7_2,conv,8_1,conv8_2,conv9_1,conv9_2,loss。然后一方面:针对conv4_3(4),fc7(6),conv6_2(6),conv7_2(6),conv8_2(4),conv9_2(4)(括号里数字是每一层选取的default box种类)中的每一个再分别采用两个3*3大小的卷积核进行卷积,这两个卷积核是并列的(括号里的数字代表prior box的数量,可以参考Caffe代码,所以上图中SSD结构的倒数第二列的数字8732表示的是所有prior box的数量,是这么来的38*38*4+19*19*6+10*10*6+5*5*6+3*3*4+1*1*4=8732)。这两个3*3的卷积核一个是用来做localization的(回归用,如果prior box是6个,那么就有6*4=24个这样的卷积核,卷积后map的大小和卷积前一样,因为pad=1,下同),另一个是用来做confidence的(分类用,如果prior box是6个,VOC的object类别有20个,那么就有6*(20+1)=126个这样的卷积核)。

知道prior  box 如何产生的,下面分析如何使用。以conv4_3为例:

 

在conv4_3 feature map网络pipeline分为了3条线路

  1. 经过一次batch norm+一次卷积后,生成了[1, num_class*num_priorbox, layer_height, layer_width]大小的feature用于softmax分类目标和非目标(其中num_class是目标类别,SSD 300中num_class = 21)
  2. 经过一次batch norm+一次卷积后,生成了[1, 4*num_priorbox, layer_height, layer_width]大小的feature用于bounding box regression(即每个点一组[dxmin,dymin,dxmax,dymax])
  3. 生成了[1, 2, 4*num_priorbox]大小的prior box blob,其中2个channel分别存储prior box的4个点坐标和对应的4个variance

缩进后续通过softmax分类+bounding box regression即可从priox box中预测到目标,熟悉Faster RCNN的读者应该对上述过程应该并不陌生。其实pribox box的与Faster RCNN中的anchor非常类似,都是目标的预设框,没有本质的差异。区别是每个位置的prior box一般是4~6个,少于Faster RCNN默认的9个anchor;同时prior box是设置在不同尺度的feature maps上的,而且大小不同。 缩进还有一个细节就是上面prototxt中的4个variance,这实际上是一种bounding regression中的权重。在图4线路(2)中,网络输出[dxmin,dymin,dxmax,dymax],其中的dxmin等可以参考这篇文章 https://blog.csdn.net/wfei101/article/details/79809332

https://blog.csdn.net/zijin0802034/article/details/77685438/

Permute,Flatten And Concat Layers

上面以conv4_3 feature map分析了如何检测到目标的真实位置,但是SSD 300是使用包括conv4_3在内的共计6个feature maps一同检测出最终目标的。在网络运行的时候显然不能像图6一样:一个feature map单独计算一次softmax socre+box regression(虽然原理如此,但是不能如此实现)。那么多个feature maps如何协同工作?这时候就要用到Permute,Flatten和Concat这3种层了

Permute是SSD中自带的层,上面conv4_3_norm_mbox_conf_perm的的定义。Permute相当于交换caffe blob中的数据维度。在正常情况下caffe blob的顺序为: bottom blob = [batch_num, channel, height, width]

经过conv4_3_norm_mbox_conf_perm后的caffe blob为: top blob = [batch_num, height, width, channel]

而Flattlen和Concat层都是caffe自带层

那么接下来以conv4_3和fc7为例分析SSD是如何将不同size的feature map组合在一起进行prediction。图展示了conv4_3和fc7合并在一起的过程中caffe blob shape变化(其他层类似,考虑到图片大小没有画出来,请脑补)。

对于conv4_3 feature map,conv4_3_norm_priorbox(priorbox层)设置了每个点共有4个prior box。由于SSD 300共有21个分类,所以conv4_3_norm_mbox_conf的channel值为num_priorbox * num_class = 4 * 21 = 84;而每个prior box都要回归出4个位置变换量,所以conv4_3_norm_mbox_loc的caffe blob channel值为4 * 4 = 16。

fc7每个点有6个prior box,其他feature map同理。 经过一系列图7展示的caffe blob shape变化后,最后拼接成mbox_conf和mbox_loc。而mbox_conf后接reshape,再进行softmax(为何在softmax前进行reshape,Faster RCNN有提及)。 最后这些值输出detection_out_layer,获得检测结果 

训练过程

训练过程中的 prior boxes 和 ground truth boxes 的匹配,基本思路是:让每一个 prior box 回归并且到 ground truth box,这个过程的调控我们需要损失层的帮助,他会计算真实值和预测值之间的误差,从而指导学习的走向。

你可能感兴趣的:(卷积神经网络)