欢迎光临散文网 会员登陆 & 注册

SSD(Single Shot MultiBox Detector)

2023-04-09 10:47 作者:xhy2023  | 我要投稿

论文地址:https://ar5iv.labs.arxiv.org/html/1512.02325

  • 简述

SSD(Single Shot MultiBox Detector)属于one - stage套路。在保证了精度的同时,又提高了检测速度,相比当时的Yolo和Faster R-CNN是最好的目标检测算法了,可以达到实时检测的要求。对于Faster R-CNN,它是一个two - stage的方法,先通过CNN得到候选框,然后再进行分类和回归,而Yolo与SSD可以一步到位完成检测。相比于YOLO,SSD采用CNN来直接进行检测,而不是像YOLO那样在全连接层之后再做检测。SSD相比于YOLO还有两个重要的改变,一是SSD提取不同尺度的特征图来做检测,大尺度特征图(较靠前的特征图)用来检测小物体,小尺度特征图(较靠后的特征图,感受野大)用来检测大物体;二是SSD采用了不同尺度和长宽比的先验框(Prior boxes, Default boxes,在Faster R-CNN中叫做锚,Anchors)。Yolo算法的缺点是难以检测小目标,而且定位不准,但是这几点重要的改进使得SSD在一定程度上克服这些缺点。PASCAL VOC,COCO和ILSVRC数据集上的实验结果证实,SSD对于利用额外的目标建议(object proposal)的方法具有竞争性的准确性,并且速度更快,同时为训练和预测提供了统一的框架。对于300×300的输入,SSD在VOC2007测试中以59FPS的速度在Nvidia Titan X上达到74.3%的mAP,对于512×512的输入,SSD达到了76.9%的mAP,优于目前为止最先进的Faster R-CNN模型。与其他一步法目标检测算法相比,即使输入图像尺寸较小,SSD也具有更高的精度。                                                                                             

  • 网络结构

SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了部分卷积层,其网络结构如下图所示:

整体网络结构
VGG-16网络结构

VGG-16有16层,包括13个卷积层和3个全连接层,卷积层卷积核的大小为3×3,步长为1,通过卷积层可以实现通道数的增加,池化层大小为2×2,步长为2,作用是降低特征图尺寸并能提高网络抗干扰能力,所有隐藏层后都带有ReLU非线性激活函数。第一次经过64个卷积核的两次卷积后,采用一次pooling;第二次经过两次128个卷积核卷积后,采用pooling;再经过3次256个卷积核卷积后,采用pooling;再经过3次512个卷积核卷积,采用pooling;再经过3次512个卷积核卷积,采用pooling,最后经过三次全连接。SSD网络结构对VGG16做了修改,将VGG16的全连接层fc6和fc7转换成3×3卷积层conv6和1×1卷积层conv7。修改细节如下:

SSD与YOLO不同之处是除了在最终的特征图上做目标检测之外,还选取前面5种尺寸的特征图进行检测,这6种特征图所在的层为: Conv4_3,Conv7,Conv8_2,Conv9_2,Conv10_2,Conv11_2,各自的尺寸分别为:(38,38), (19,19), (10,10), (5,5), (3,3), (1,1)。它们在原图上的感受野不同,尺寸越小的特征图看到原图的视野越大,因此大的特征图用来检测小目标,小的特征图用来检测大目标。Conv6采用带孔卷积,在不增加参数与模型复杂度的条件下扩大特征图的感受野,其使用扩张率(dilation rate)参数,来表示扩张的大小,Conv6采用3*3大小但dilation rate=6的扩展卷积,视野为13*13。                                                             

计算带孔卷积感受野的时候,把空洞也算进去了。原图的尺寸是 300*300,从conv7特征图开始,感受野的尺寸就大于原图的尺寸了,所以后面5种特征图的视野是整张输入图像,在这5种特征图上检测目标时只需要关心想检测的目标物尺寸,而不需要关心检测区域是否落入感受野范围内。                                                                                                                                  

网络结构的最后两个部分是:Detection Layer和NMS。前面指定的6种特征图都需要接入Detection Layer,Detection Layer的输出与损失函数直接相关,因为这一层的网络结构由先验框决定。NMS是极大值抑制,它在网络的训练阶段没有使用,模型训练好后,测试时需要用NMS对预测结果进行筛选,去掉无效的、重复的结果。

  • 先验框

SSD为6种特征图每个像素点都设置了一些尺度和宽长比(纵横比)不同的框,称为先验框(default box,anchor box,prior box),设置先验框的目的是为了提取不同尺寸,不同位置的目标。不同特征图设置的先验框数目不同(同一个特征图上每个像素设置的先验框是相同的)。先验框的设置,包括尺度(或者说大小)和长宽比两个方面,特征图越小,先验框越大,使其能够检测出大目标;特征图越大,先验框越小,使其能够检测出小目标。

6种特征图总共会产生多少个先验框?论文里是这么设置的:

把最后一列求和,一共有8732个先验框。先验框的设置是以特征图上的像素点为单位的,像素的中心就是先验框的中心。确定了先验框数量后,那先验框的尺度该如何设置?尺度一般表示为长*宽的形式,但如果是正方形,那它的尺度只给出一个量即可,即边长。论文是先给出一个正方形的先验框,然后调整这个正方形的宽高比来产生不同形状的先验框。对于先验框的尺度,其遵守一个线性递增规则:随着特征图大小降低,先验框尺度线性增加:

除了这一个尺度,论文里还计算了另外一个尺度:

两个尺度设计总结在下表:

每个先验框的宽高比(纵横比)如何设置?第二种尺度的宽高比例只有1,即正方形框。第1,5,6个特征图具有相同的宽高比,第2,3,4个特征图的宽高比多了3和1/3。

一张图片喂给神经网络,网络中的每个先验框都需要去匹配一个真实框,这个真实框是记录在该图像的xml文件里的,以坐标(xmin,ymin,xmax,ymax)的形式给出,也会给出真实框对应的目标类别。一个先验框与匹配到的真实框之间会存在位置误差,假设第 i 个 default box 与第 j 个 gt box 匹配,其位置信息分别表示为:

那么两者之间的位置误差会被编码为:

神经网络训练的一个目标就是要去拟合这个位置误差。另外一个目标就是常见的多分类问题,使正确类别对应神经元输出的概率最大。

那么Detection Layer这一层网络就很容易设置了,输入一张图片,网络中的每个先验框都需要输出4个位置误差和21个类别置信度(需要做softmax),使用卷积层实现,每张特征图都需要接入卷积层作为输出,将需要输出的信息放在channel维度,即设置的输出卷积层的通道数分别为4和21。

  • 先验框与真实框匹配策略

  • 损失函数

损失函数定义为位置误差 (locatization loss, loc) 与置信度误差 (confidence loss, conf) 的加权和:

N是所有正样本的个数,位置误差只统计正样本,使用smooth_l1_loss进行拟合。置信度误差统计正负样本,采用交叉熵损失函数。

  • 代码

1. 先验框生成

2. SSD网络结构

3. 先验框和真实框匹配

4. 损失函数

5. 训练

6. 预测


SSD(Single Shot MultiBox Detector)的评论 (共 条)

分享到微博请遵守国家法律