继上一篇文章Object Detection: One-stage Detector DenseBox,我们了解到一种类似于分割的训练风格(segmentation-like training procedure),通过真值生成(Ground Truth Generation),来引导模型对人脸、汽车等目标的检测。单阶段模型常常遇到的一个问题就是样本平衡(Sample Balance),DenseBox给出了相应的解决思路,如设定忽视区域(Ignoring Grey zone),难例挖掘(Hard negative mining),随机截取(Random Crop)等方式。当然,该模型还有一个亮点在于采用多任务训练的方式,不仅包括检测框分类与定位分支,还加入了关键点定位分支(Landmark localization)来显式(explicit)、隐式(implicit)地调整(refine)模型的检测结果。下面,要给大家带来的是极具里程碑意义的单阶段目标检测器系列的第三篇,SSD。
YOLO -> DenseBox -> SSD -> YOLO v2 -> Retina -> YOLO v3 -> CornerNet -> CenterNet -> AlignDet
SSD: Single Shot MultiBox Detector
论文地址:1512.0232
1. 背景介绍
从解耦(disentangle)的角度,两阶段检测器在解决目标检测问题上有了较好的诠释。以Faster-RCNN为例,首先使用区域提议生成网络(Region Proposal Network, RPN)生成可能包含目标的区域,这一过程包括区域提议的生成(hypothesize bounding boxes),特征/像素重采样(feature/pixel resample),检测框回归(bounding box regression);接着选用高质量的分类器(high quality classification)对生成的区域提议(proposals)进行分类,同时进行二次检测框回归,得到最终的检测结果。得益于其较好的性能表现,遵循这种模式(pipeline)的检测器在当时目标检测的基准数据集(benchmarks)上非常火热,如PASCAL VOC,COCO,和 ILSVRC detection。然而,由于两阶段模型存在大量计算(computationally intensive),在实时应用(real-time application)上的速度可能达不到预期。
虽然有许多工作致力于提升两阶段模型的检测速度,但是最终的结果是通过牺牲精度的方式,没有很好的做到速度与精度的权衡(trade-off)。所以作者提出SSD(single shot detector),通过撤去(eliminate)区域提议生成与特征重采样,来提升模型的检测速度,同时通过其它手段,例如使用更小的卷积核,使用不同尺度的特征分别预测不同尺寸的目标,来确保模型的检测性能。(原文链接1)
原文链接1: Our improvement include using a small convolutional filter to predict object categories and offsets in bounding box locations, using separate predictors (filters) for different aspect ratio detections, and applying these filters to multiple feature maps from the later stages of a network in order to perform detection at multiple scales.With these modifications — especially using multiple layers for prediction at different scales — we can achieve high-accuracy using relative low resolution input, further increasing detection speed.
最终,论文的贡献如下:
- 达到单阶段检测模型最佳性能(state-of-the-art,SOTA),同时也不弱于耗时较大但准确率较高的两阶段检测模型
- SSD的核心是使用小卷积核去预测默认设定好的检测框(a fixed set of default bounding boxes)的类别分数及检测框偏移(offset)
- 使用多个尺度的特征图去检测多个尺度的目标,如使用浅层的特征图去检测小尺度目标,用深层的特征图去检测大尺度目标
- SSD的这种设计不仅能够端到端训练(end-to-end),尤其输入低分辨率图片,还能保持较高的性能表现,进一步改善了速度与准确度之间的权衡
- 通过大量实验对输入不同大小图片的预测时间(timing)和准确率(accuracy)进行分析,并与过去SOTA方法进行对比。
(补充:这篇论文的第四部分Related Work 总结的不错,有兴趣的可以看看,有助于了解当时SSD提出时的背景~)
2. 模型介绍
作者在论文的摘要中,非常简练的概括了SSD的思想:SSD通过给不同层的特征图的每个位置设定不同尺寸(scale),不同长宽比(ratio)的固定检测框(用Faster-RCNN的说法就是anchor),以将输出空间(output space)进行离散化(discretize)。在预测阶段,SSD为每个固定检测框生成对应的类别分数,并生成检测框偏移(offset)使得检测框能够更好的匹配(match)目标。不仅如此,SSD还为不同尺寸的目标训练不同的检测器,使得模型能够充分利用各层的特征。(原文链接2)
原文链接2: Our approach, named SSD, discretizes the output space of per feature map location. At prediction time, the network generates scores for the presence of each object category in each default box and produces adjustments to the box to better match the object shape. Additionally, the network combines predictions from multiple feature maps with different resolutions to naturally handle objects of various sizes.
下面我们来详细介绍SSD模型。
2.1 SSD的核心思想
上图便是SSD的核心思想:图a展示了训练SSD所需要的输入:输入的图像以及目标的标注(ground truth boxes)。图b、c 展示了SSD为不同尺寸的特征图的每一个位置设定不同尺寸与长宽比的先验框(anchors)。图c展示了SSD为每个先验框作出的预测:所有类别的置信度(confidence) ( c 1 , c 2 , . . . , c p ) (c_1, c_2, ..., c_p) (c1,c2,...,cp),边框偏移(shape offset) △ ( c x , c y , w , h ) \triangle(cx, cy, w, h) △(cx,cy,w,h)。在训练的过程中,首先需要将这些先验框与标注的检测框进行匹配:图b的两个蓝色先验框与图a蓝色标注的检测框匹配,图c的红色先验框与图a红色标注的检测框匹配。匹配的先验框定义为正样本(positive),对于没有匹配成功的检测框,则定义为负样本(negative)。在预测过程中,需要采取非极大值抑制(non-maximum suppression, NMS)筛选得到最后的结果。整个模型的损失(loss)是定位损失(Smooth L1)与置信度损失(Softmax)的加权和。
2.2 网络设计
模型可大致分为:骨干网络(backbone/base network),辅助结构(auxiliary)。
- 基准/骨干网络 (base Network / backbone)
基于VGG-16,在ILSVRC CLS-LOC 数据集上预训练,作者将VGG-16的全连接层FC_6 (FC-4096) 和 FC_7 (FC-4096) 转化成3x3的卷积层Conv_6 和 1x1的Conv_7,同时将Pool_5 (FC_6前的maxpool) 从原来2x2-s2变成3x3-s1 (核的大小由2变3,步长由2变1)。为了保持特征图不变小的情况下仍能有下采样后的感受野,Conv_6采用了一种Atrous Algorithm,简单来说就是采用了空洞卷积 (Dilation Conv),在不增加参数与模型复杂度的条件下指数级扩大卷积的视野。空洞卷积使用扩张率(dilation rate)参数来表示扩张的大小,如下图所示(图自小小将)。最后再移除dropout层和全连接层FC_8,构成基准网络。模型使用初始学习率为 1 0 − 3 10^{-3} 10−3进行随机梯度下降(SGD),动量(momentum)为0.9, 权重衰减系数(weight decay)是0.0005,批大小(batch-size)是32。不同数据集使用的学习率衰减不一样,详见实验部分。
下面来看辅助结构,也就是下图中Extra Feature Layers部分:
- 新添加的卷积层采用xavier的方式进行初始化 。Conv4_3作为用于检测的第一个特征图,由于该层靠前,特征图上特征值的范围与其它检测层的差异较大,所以在后面添加了一个L2 归一化层(Normalization Layer)对每个像素点在channel维度做归一化,以确保该层和后面层的差异不会太大。归一化后一般设置一个可训练的放缩变量gamma(l2_norm*gamma)。
- 使用了多个尺度的特征图进行预测:从上图可以得知,SSD300(输入图片大小为300x300) 使用了Conv4_3 (38x38)、Conv7 (19x19)、Conv8_2 (10x10)、Conv9_2 (5x5)、Conv10_2 (3x3)、Conv11_2 (1x1)的特征图对不同长宽比和尺寸的目标分别预测,即相当于训练了多个检测器。SSD512(输入图片大小为512x512)在上图的基础上额外增加了Conv12_2进行预测。
- 使用小卷积核生成每个位置的预测结果(置信度与偏移):假设特征图的尺寸为 m ∗ n ∗ p m*n*p m∗n∗p,则卷积核的尺寸为 3 ∗ 3 ∗ p 3*3*p 3∗3∗p,每个卷积核分别负责输出一个置信度或者一个边框偏移变量。正是因为这种卷积预测的方式,卷积核在每个位置上的输出都是与该位置的先验框相关的(原文链接3),所以可以输出各个先验框对应的置信度以及边框偏移。下图可视化了该过程(图来自小小将)。
- 先验框的设置:SSD为Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2这些层的特征图的每一个位置(cell)设定了一组先验框,这组框可由尺寸(scale)与长宽比(ratio)计算出来,而不同层的尺寸范围是不一样的。假设为特征图每个单元设定 k k k个先验框,则每个单元需要 ( c + 4 ) k (c+4)k (c+4)k个卷积核,则 m ∗ n m*n m∗n的特征图的输出为 m ∗ n ∗ ( c + 4 ) k m*n*(c+4)k m∗