caffe-ssd细节梳理

为期一周结合ssd源码对ssd的细节进行梳理,其实有些地方仍然不是很明白,但是还是要对自己一周的工作进行总结。

ssd算法,其英文全名是Single Shot MultiBox Detector,属于one-stage方法,MultiBox指明了ssd算法是多框预测,是相对于RCNN系列目标检测算法,yolo系列目标检测算法的改进算法,ssd算法在准确度和速度上都比yolo要好很多,对于Faster R-CNN,首先通过CNN得到候选框,然后再进行分类与回归,而yolo与ssd可以一步到位完成检测。相比yolo,ssd采用CNN来直接进行检测,而不是像yolo那样在全连接层之后做检测。其实采用卷积直接做检测只是SSD相比Yolo的其中一个不同点,另外还有两个重要的改变,一是SSD提取了不同尺度的特征图来做检测,大尺度特征图(较靠前的特征图)可以用来检测小物体,而小尺度特征图(较靠后的特征图)用来检测大物体;二是SSD采用了不同尺度和长宽比的先验框(Prior boxes, Default boxes,在Faster R-CNN中叫做锚,Anchors)。Yolo算法缺点是难以检测小目标,而且定位不准,但是这几点重要改进使得SSD在一定程度上克服这些缺点。下面我们详细讲解SDD算法的原理。

SSD网络结构

ssd是采用VGG16作为基础网络的,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。SSD的网络结构如图所示。在论文中将ssd和yolo的网络结构进行对比,可以明显看到ssd利用了多尺度的特征图做检测,模型的输入图片大小是300×300。

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

 

SSD的与众不同

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

多尺度指的是采用不同大小的特征图,结合ssd的网络结构和上图可以看出,ssd采用了特征金字塔结构进行检测,即检测时用到了conv4-3,conv7,conv6-2,comv7-2,conv8_2,conv9_2这些大小不同的faeture maps,在多个feature maps上同时进行softmax分类和位置的回归。SSD使用6个不同特征图检测不同尺度的目标。低层预测小目标,高层预测大目标。

2prior box

在SSD中引入了Prior Box,实际上与anchor非常类似,就是一些目标的预选框,后续通过softmax分类+bounding box regression获得真实目标的位置。SSD按照如下规则生成prior box:

以feature map上每个点的中点为中心(offset=0.5),生成一系列同心的prior box(然后中心点的坐标会乘以step,相当于从feature map位置映射回原图位置)

prior box的长宽以及个数的计算主要根据以下原则,结合网络结构来说明:

  • 先以min_size确定宽高生成一个框
  • 若存在max_size,则用sqrt(min_size*max_size)确定宽高生成一个框
  • 若存在aspect_ratio,则再去确定宽高生成宽,举例说明,如上图的网络结构中,aspect_ratio为2,3,则就会自动添加aspect_ratio=1/2、1/3,然后根据如下方法进行计算:

box_width = min_size*sqrt(ar)

box_height =min_size/sqrt(ar)

其中ar = aspect_ratio=2、3、1/2、1/3

所以中心点所能产生的prior_box的数量为cout(min_size)*1+cout(max_size)*1+cout(aspect_ratio)*n,n为aspect_ratio的个数。

3数据增强

ssd在训练阶段进行了数据预处理,对数据进行了裁剪,放大,缩小,旋转等操作。

SSD中使用了两种数据增强的方式:
放大操作: 随机crop,patch与任意一个目标的IOU为0.1,0.3,0.5,0.7,0.9,每个patch的大小为原图大小的[0.1,1],宽高比在1/2到2之间。能够生成更多的尺度较大的目标。
缩小操作: 首先创建16倍原图大小的画布,然后将原图放置其中,然后随机crop,能够生成更多尺度较小的目标。

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

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

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

SSD损失函数

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

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

SSD训练过程

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

SSD 训练的目标函数(training objective)源自于 MultiBox 的目标函数,但是在论文中将其拓展,使其可以处理多个目标类别。具体过程是我们会让每一个 prior box 经过Jaccard系数计算和真实框的相似度,阈值只有大于 0.5的才可以列为候选名单;假设选择出来的是N个匹配度高于百分之五十的框吧,我们令 i 表示第 i个默认框,j表示第 j个真实框,p表示第p个类。那么x_{ij}^p表示 第 i 个 prior box 与 类别 p 的 第 j 个 ground truth box 相匹配的Jaccard系数,若不匹配的话,则x_{ij}^p=0。总的目标损失函数(objective loss function)就由 localization loss(loc) 与 confidence loss(conf) 的加权求和:

  • N 是与 ground truth box 相匹配的 prior boxes 个数

  • localization loss(loc) 是 Fast R-CNN 中 Smooth L1 Loss,用在 predict box(l) 与 ground truth box(g) 参数(即中心坐标位置,width、height)中,回归 bounding boxes 的中心位置,以及 width、height

  • confidence loss(conf) 是 Softmax Loss,输入为每一类的置信度 c

  • 权重项 α,可在protxt中设置 loc_weight,默认设置为 1

猜你喜欢

转载自blog.csdn.net/qq_35699505/article/details/89377872
今日推荐