SSD: Single Shot MultiBox Detector

     在阅读这篇博客之前,推荐读者先阅读SSD之前的准备:Scalable Object Detection using Deep Neural Networks ,也就是论文中提到的DeepMultiBox(或者叫MultiBox)算法,因为SSD中大量提到了这个算法,如果事先没有对这个算法有一些了解的话很容易看得一头雾水。
     在这篇论文之前,主流的目标检测方法多是基于region proposals + classifier的框架进行的,这些方法包括但不限于R-CNNSPP-netFast R-CNN以及Faster R-CNN,虽然有一些方法尝试跳出这个框架,把目标检测当作一个回归问题而不是分类问题来做,但这些方法虽然能够在速度上有所提升,但是在精度上却是下降的,最具代表性的应该是YOLO了,下图是在VOC2007测试集上的结果,可以直观的反应以上描述的这种情况,即速度和精度总是在以牺牲一方的情况下让另一方得到提升。这里写图片描述
    从上图可以看到,在精度方面,Faster R-CNN做得很好,在速度方面,YOLO做得很好,几乎达到了实时的速度,那么问题就来了,能不能设计出一种网络,既能拥有Faster R-CNN那样的高精度,又能保持YOLO那么快的速度呢?
    答案是能,这个网络就是本文即将介绍的SSD(Single Shot MultiBox Detector)。上面的图还有另一半,完整的图如下图所示,可以看到SSD比较好的完成了既能保持精度,又能保持速度的要求。SSD512和Faster R-CNN相比,具有更高的精度和更快的速度,SSD512和YOLO相比,在速度相同的情况下,精度高了10%,这是一个非常大的提升。读者也可以自己分析SSD300和Faster R-CNN以及YOLO的对比,会得出类似的结果。
这里写图片描述
    下面从SSD的模型结构和训练方法两个方面来介绍:
    [1]模型结构
    SSD 是基于一个前向传播 CNN 网络,产生一系列 固定大小(fixed-size) 的bounding boxes,以及每一个bounding box 中包含物体实例的可能性,即score。之后,进行一个非极大值抑制(Non-maximum suppression) 得到最终的 predictions。网络的底层部分(base network)是来自于具有很好图像分类效果的网络结构的卷积层部分,比如说AlexNet、VGGNet、GoogLeNet的卷积层部分,事实上,前面介绍了几种目标检测方法也都采用了这样的方法,这也叫做迁移学习,即把分类的网络结构和权重迁移到用来作为检测框架的一部分。在底层部分之上,作者还添加了辅助的结构用于输出检测结果(检测结果无非就是预测的每一个default box的参数化坐标以及它的得分(score))。用来输出检测结果的网络具有以下的特点:
    [1.1]将多尺度的特征图(Feature Maps)用于目标检测
    在SSD的底层部分的最后,也就是底层的最后一个卷积层之上,加入了一些卷积层,这些卷积层在尺度上是逐层递减的,因此使得多尺度的目标检测得以实现。与之相对应的是,YOLO只在单个尺度的特征图(single scale feature map)上做了目标检测。
    [1.2]使用卷积预测器来预测目标检测的结果
    通过在底层的某些卷积层输出的特征图和之后加上的卷积层输出的特征图上使用使用一系列的卷积滤波器,可以使得每一个feature map都可以产生一系列固定个数的物体检测的预测结果(predict bounding box)。结构如下图所示:
这里写图片描述
    对于一个尺寸是m*n*p的feature map,其中p是通道数量,一个最基本的用于预测检测结果的元素就是一个3*3*p的滤波器,这个滤波器以滑窗的形式和m*n上的3*3位置依次卷积,每次卷积会输出一个值,这个值要么代表属于某一类的分数(score),要么代表相对于卷积中心对应的default box的一个偏移量(一个偏移量指的比如x坐标的偏移或者y或者宽度或者高度的偏移,总而言之,每一个3*3*p的滤波器和m*n上的3*3的位置做卷积的时候只输出一个值,default box在后续将会介绍到)。
    [1.3]默认的矩形(default boxes)和宽高比
    我将每一个用于预测目标检测结果的在feature map中的元素(cell,其实就是feature map上的每一个像素)都和一系列默认的矩形(default bounding boxes或者default boxes)关联起来。每一个default box和它对应的元素的相对位置是固定的,下图展示了当feature map是8*8和4*4的情况下的default boxes:
这里写图片描述
    假设在每一个元素(cell)上面,要产生k个default boxes,且要检测的物体的类别是C类,那么对于一个cell,就要预测k(C+4)个值,因此需要k(C+4)个滤波器,而一个m*n的feature map上有mn个cell,那么就会预测k(C+4)mn个值,而滤波器呢,还是只需要k(C+4)个。如果了解Faster R-CNN的话,会发现这里的defaul boxes的设计和Faster R-CNN里面的anchor的思想是高度一致的。只是在Faster R-CNN中,anchor仅仅在一个feature map上做的,而这里是在多个不同尺度的feature map上做的,因此default boxes比anchor更具有丰富性,能够更好的应对一张图片中不同尺度的目标的检测问题。
    [2]训练方法:
    训练SSD和训练一个region proposal+分类器的神经网络相比最关键的不同之处在于,训练SSD的时候真值信息(ground truth information)将被分配给SSD输出的固定数量的所有default boxes中的某一些boxes。如果对分配这个行为感到陌生的话可以先参考博客DeepMultiBox,这里面如何分配是其中的核心问题之一。一旦分配问题解决了,就可以计算损失函数并使用反向传播进行随机梯度下降了。训练还包括选择每个cell输出多少个default boxes、在什么尺度下的feature map上进行这样的预测以及hard negative mining以及数据增广策略。下面分四个点来描述:
    [2.1]匹配(分配)策略
    在训练阶段需要决定将每一个ground truth detection分别分配给哪一个default box,并以此对网络进行训练。最开始,是按照哪一个default box和ground truth detection有最好的jaccard overlap,就把ground truth detection分配给哪个default box,但是后面对这一策略进行了调整,改为了哪些(注意不是哪一个了而是哪一些)default boxes和ground truth detection的jaccard overlap超过了阈值0.5,就把ground truth detection分配给那些default boxes。这样一来,对于一个ground truth detection,可能会对应多个default boxes。
    [2.2]训练的目标函数
    SSD训练的目标来自于MulitiBox,但是这里又将其进行了扩展使其可以处理多个目标类别(在MultiBox中,目标只有两类,一类是物体,一类是不是物体,这里是要进行更为具体的是哪一类物体的分类)。用xij(p)表示第i个default box是否和第j个属于p类的ground truth detection匹配上了,如果匹配上了则为1,反之为0。在[2.1]的匹配策略中,有这里写图片描述,因为对一个ground truth detection,可能会对应多个default boxes,这在[2.1]中是提到过的。总的目标损失函数(objective loss function)就由 localization loss(loc) 与 confidence loss(conf) 的加权求和,如下图所示:
这里写图片描述
    其中N是被匹配上的default boxes的个数,alpha设为1,定位误差(Lloc)是求预测的box和对应的default box之间的差距l和真值g与对应的default box之间的差距的Smooth L1误差(Smooth L1的具体形式在这篇博客中有提到http://blog.csdn.net/xbcreal/article/details/76084605,注意看下面的表达式中g和g^的区别)。
    Lloc的损失函数如下图所示:
这里写图片描述
    其中N表示匹配上的default boxes的数量,d表示一个default box,(cx,cy)表示一个box的中心,(w,h)表示一个box的宽和高,l表示预测的box的参数,g表示ground truth detection。
    Lconf的损失函数如下图所示:这里写图片描述
    [2.3]改变default boxes的尺度和宽高比
    假设我们要在m个feature map上做预测,那么对于每一层的feature map上预测的default box的尺度计算公式如下:
这里写图片描述
    此处smin等于0.2,smax等于0.9,也就是说最底层的尺度是0.2,最上层的尺度是0.9,中间层就均匀在这中间变化即可。除了尺度,我们还将不同的宽高比用在了default boxes上面,表示为ar,ar属于{1,2,3,1/2,1/3}。有了每一层的尺度和宽高比,就可以求出每一层下的default box的宽度和高度了,分别是:
这里写图片描述
这里写图片描述
    值得一提的是,之前对尺度(scale)概念一直很模糊,看到这个表达式之后可以反推回去发现scale的含义其实是box的面积的平方根值。比如上式中的w和h相乘,就得到sk的平方了。另外对于宽高比为1 的default boxes,加入了额外的尺度为这里写图片描述的新尺度sk’,因此,对于每一个feature map的cell,都会产生6个default boxes。每一个default box的中心为这里写图片描述,其中|fk|是feature map一个方向的维度(长或者宽,因为长和宽都一样所以这里都可以的),i,j分别表示在长宽方向上的索引,所以这里写图片描述。上面的式子除以fk的原因无非就是让坐标表示归一化到整个图片尺寸上来,而+0.5则是为了将default box的中心挪到cell的中心来。
    [2.3]hard negative mining
    在匹配那一步结束之后,大多数的default boxes都是不被激活的,这导致了negative boxes和posotive boxes的个数不均衡。因此,本文采取,先将每一个物体位置上对应 predictions(default boxes)是 negative 的 boxes 进行排序,按照 default boxes 的 confidence 的大小。 选择最高的几个,保证最后 negatives、positives 的比例在 3:1。
    [2.4]数据增广
     本文同时对训练数据做了 data augmentation,数据增广。每一张训练图像,随机的进行如下几种选择:
    1、使用原始的图像
    2、采样一个 patch,与物体之间最小的 jaccard overlap 为:0.1,0.3,0.5,0.7 与 0.9
    3、随机的采样一个 patcbsp;
    采样的 patch 是原始图像大小比例是 [0.1,1],aspect ratio 在 12 与 2 之间;当groundtruth box 的 中心(center)在采样的 patch 中时,我们保留重叠部分。
    在这些采样步骤之后,每一个采样的 patch 被 resize 到固定的大小,并且以 0.5 的概率随机的 水平翻转(horizontally flipped)
    到此,SSD的核心部分就结束了,论文中还做了大量的对比实验也是非常值得我们去看的,所以最后推荐大家再把论文多读几遍,会有更多收获。
    原作者的SSD项目地址: https://github.com/weiliu89/caffe/tree/ssd

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值