天天看点

Object Detection:One-stage Detector SSD

继上一篇文章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的核心思想

Object Detection:One-stage Detector 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)。

Object Detection:One-stage Detector SSD
  • 基准/骨干网络 (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。不同数据集使用的学习率衰减不一样,详见实验部分。

Object Detection:One-stage Detector SSD

下面来看辅助结构,也就是下图中Extra Feature Layers部分:

Object Detection:One-stage Detector SSD
  • 新添加的卷积层采用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),所以可以输出各个先验框对应的置信度以及边框偏移。下图可视化了该过程(图来自小小将)。
    Object Detection:One-stage Detector SSD
  • 先验框的设置: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∗n∗(c+4)k。这些先验框与Faster-RCNN中的anchor非常相似,只不过在SSD中用到了多个尺度的特征图上。正因为有了在多尺度特征图上设定不同尺度的先验框,使得SSD可以高效的将模型的输出空间离散化成经过修正的先验框。
原文链接3: The default boxes tile the feature map in a convolutional manner, so that the position of each box relative to its corresponding cell is fixed.

2.3 模型训练

为了端到端(end-to-end)的前传与后传,需要将标注信息转化(assign)成与模型输出相匹配的形式,以训练SSD多个尺度的检测器。不仅如此,训练过程还涉及先验框匹配、难例挖掘和数据增强策略。

(1)先验框的匹配策略(Matching strategy)。SSD选择与标注框交并比超过0.5的先验框(the best jaccard overlap, 其实就是IoU)作为正样本。论文提到之所以不只选择交并比最大的先验框,是因为这样在一定程度上能简化学习问题,即允许模型对多个重合的先验框进行预测 (原文链接4)。对于这个解释,我是这么理解的:与标注框交并比最大的先验框不一定就是最合适的框,或许小一点的交并比的先验框会更合适,如果只保留交并比最大的先验框,相当于剔除了更为合适的先验框,使得模型被迫去接受一个不是最合适的先验框,这一定程度上增加了模型的学习难度。也就是说,如果使用阈值的方式,可以给模型更多选择,模型的学习难度就会大大降低。

原文链接4: Unlike MultiBox, we then match default boxes to any ground truth with jaccard overlap higher than a threshold (0.5). This simplifies the learning problem, allowing the network to predict high scores for multiple overlapping default boxes rather than requiring it to pick only the one with maximum overlap.

(2)是定义模型的损失函数。定义先验框与标注框的匹配标识 x i j p x_{ij}^p xijp​,表示第i个先验框与第j个标注为类别p的真值框匹配。根据上文的匹配规则,一个标注框可以匹配多个先验框,可以归纳成 ∑ i x i j p ≥ 1 \sum_ix_{ij}^p\geq1 ∑i​xijp​≥1。将定位损失与置信度损失的加权和(weighted sum)定义为模型损失,则模型总体损失函数如下:

L ( x , c , l , g ) = 1 N ( L c o n f ( x , c ) + a L l o c ( x , l , g ) ) L(x, c, l, g) = \frac{1}{N}(L_{conf}(x, c)+aL_{loc}(x, l, g)) L(x,c,l,g)=N1​(Lconf​(x,c)+aLloc​(x,l,g))

其中,N表示匹配的先验框个数,如果N为0,则将损失L定义为0。在目标检测中,定位损失常用Smooth L1 Loss,用于衡量预测框(predicted box) l 与标注框(ground truth) g之间的差距(distance),即回归得到边框中心(cx, cy), 以及边框的宽w和高h四个参数相对于先验框d的偏移(offset)。 a a a根据交叉验证(cross validation)设置为1。

Object Detection:One-stage Detector SSD

使用Smooth L1 Loss,简单来说就是起到限制梯度的作用:当l与g差别很大时,梯度不至于过大,这能确保训练初期的稳定性;当l与g差别很小时,梯度能够足够小,确保在训练后期模型能够继续收敛以达到更高的精度。(参考链接:尹相楠的回答)

Object Detection:One-stage Detector SSD

PS:这里简单提一下,在代码实现中用到了variance超参数来调整检测值,SSD是沿用之前别人工作的设定。

weiliu89: It is used to encode the ground truth box w.r.t. the prior box. You can check this function. Note that it is used in the original MultiBox paper by Erhan etal. It is also used in Faster R-CNN as well. I think the major goal of including the variance is to scale the gradient. Of course you can also think of it as approximate a gaussian distribution with variance of 0.1 around the box coordinates.

分类损失使用的是Softmax Loss,用于衡量预测类别的置信度c与类别标注x间的差距。分类损失包含两个部分,一部分是正样本损失,一部分是负样本损失。 c ^ i p \hat{c}_i^p c^ip​是指来自正样本的第i个先验框是类别p的softmax概率, c ^ i 0 \hat{c}_i^0 c^i0​是指来自负样本的第i个先验框是背景的softmax概率。

Object Detection:One-stage Detector SSD

(3)为先验框选择尺度与长宽比。为了解决目标尺度问题,之前的工作从图片层面的角度,提出输入图像金字塔的方式,将不同尺度图片的网络输出进行合并(有点类似后融合late-fusion)。受前人的工作启发(原文链接5),SSD则是从特征层面的角度,通过充分利用不同层的特征图做预测以达到同样的效果,而且这种方式使得不同尺度的目标检测器可以共享参数(share parameters),一定程度上减少了预测的时间及模型的参数量。

原文链接5: Previous works have shown that using feature maps from the lower layers can improve semantic segmentation quality because the lower layers capture more fine details of the input objects. Similarly, showed that adding global context pooled from a feature map can help smooth the segmentation results.

与Faster-RCNN的区域提议网络(Region Proposal Network, RPN)不同的是,SSD中的先验框不需要对应到它当前层的感受野(receptive field),通过绑定先验框的方式(tiling of default boxes),固定每一层先验框的尺度与长宽比,引导各特征图对各特定尺度的目标作出响应,把边框校正这一任务交给网络去学习(原文链接6)。

原文链接6: Feature map from different levels within a network are known to have different (empirical) receptive filed sizes. Fortunately, within the SSD framework, the default boxes do not necessary need to correspond to the actual receptive fields of each layer. We design the tiling of default boxes so that specific feature maps learn to be responsive to particular scales of the objects.

先验框的尺度计算如下(随着特征图大小降低,先验框尺度线性增加):

s k = s m i n + s m a x − s m i n m − 1 ( k − 1 ) , k ∈ [ 1 , m ] s_k = s_{min} + \frac{s_{max}-s_{min}}{m-1}(k-1), k\in[1, m] sk​=smin​+m−1smax​−smin​​(k−1),k∈[1,m]

其中 s m i n = 0.2 s_{min}=0.2 smin​=0.2, s m a x = 0.9 s_{max}=0.9 smax​=0.9 代表最浅层也就是Conv7的先验框尺寸为0.2 (SSD300中Conv4_3先验框尺寸单独设置为0.1,SSD512中Conv4_3先验框尺寸单独设置为0.07,且 s m i n = 0.15 s_{min}=0.15 smin​=0.15),最深层也就是Conv11_2的先验框尺寸为0.9, s k s_k sk​代表第k个用于预测的特征图的先验框尺寸, m m m指用于预测的特征图数量。(ps: 源码好像是另一套计算方式)

先验框的长宽比范围: a r ∈ { 1 , 2 , 3 , 1 2 , 1 3 } a_r \in \{1, 2, 3, \frac{1}{2}, \frac{1}{3}\} ar​∈{1,2,3,21​,31​},由此可以计算出5个先验框的长宽:

w k a = s k a r , h k a = s k / a r w_k^a = s_k\sqrt a_r, h_k^a=s_k/\sqrt a_r wka​=sk​a

​r​,hka​=sk​/a

​r​

由于论文中为长宽比为1单独增加了一个尺寸为 s k ′ = s k s k + 1 s_k'=\sqrt{s_ks_{k+1}} sk′​=sk​sk+1​

​,所以特征图的每一个位置共有6个先验框(Conv4_3, Conv10_2, Conv11_2的特征图的每个位置只设置四个先验框,长宽比为 1 , 2 , 1 2 {1,2,\frac{1}{2}} 1,2,21​)。设定先验框的中心为 ( i + 0.5 ∣ f k ∣ , j + 0.5 ∣ f k ∣ ) (\frac{i+0.5}{|f_k|}, \frac{j+0.5}{|f_k|}) (∣fk​∣i+0.5​,∣fk​∣j+0.5​), ∣ f k ∣ |f_k| ∣fk​∣是第k个用于预测的特征图的尺寸,即 i , j ∈ [ 0 , ∣ f k ∣ ] i, j \in [0,|f_k|] i,j∈[0,∣fk​∣]。文中提到可以为特定数据集去寻找最为合适的先验框分布,但最优的设定方法(optimal tiling)目前仍是一个开放的问题。

(4)难例挖掘(Hard Negative Mining)。在先验框匹配之后,未匹配的先验框会被标记为负样本,由于未匹配的检测框会占较大比例,便存在正负样本不平衡(imbalance)的问题。解决方案是:将所有负样本按照置信度损失从高到低排列,取排名前列的负样本加入模型训练中,需要确保训练时的正样本与负样本的比例至多为3:1。难例挖掘使得模型优化速度更快,训练过程更加稳定。

(5)数据增广(Data Augmentation)。为了让模型能够对不同大小、形状的目标的检测更具鲁棒性,每一张训练图片都会随机进行其中一种处理:

  • 使用原图作为输入
  • 对原图采样得到与目标交并比为0.1, 0.3, 0.5, 0.7, 0.9的图片块(image patch)
  • 对原图随机采样图像块

采样得到的图像块的尺寸(scale)是原图的 [ 0.1 , 1 ] [0.1, 1] [0.1,1],长宽比(ratio)是 [ 1 2 , 2 ] [\frac{1}{2}, 2] [21​,2]。采样图像块的过程中如果标注框(ground truth)的中心位于图像块中,则保留图像块与原图标注框交叠的部分(原文链接7)。

原文链接7: We keep the overlapped part of the ground truth box if the center of it is in the sampled patch.

不仅如此,每个采样得到的图像块都会被缩放(resize)到固定大小(fixed size)并以 p = 0.5 p = 0.5 p=0.5的概率进行水平翻转,同时还会采取颜色扭曲(photo-metric distortion)。

3. 实验

3.1 PASCAL VOC 2007

在Pascal VOC 2007数据集上,作者将SSD300、SSD512与Fast R-CNN、Faster R-CNN进行一系列对比,所有模型都是基于相同的预训练VGG16模型进行微调(finetune)。从数据data一栏可以看到,训练数据有“07”, “07+12”,“07+12+COCO”,分别代表VOC2007 trainval,VOC2007 整个数据集 + VOC2012 trainval,COCO trainval135k 然后用07+12数据集微调。

从结果上看,训练集为VOC2007 trainval时,SSD300 超过了Fast RCNN,SSD512超过了Faster RCNN;训练集为 “07+12”, “07+12+COCO”时,SSD300与SSD512都超过Faster-RCNN。

Object Detection:One-stage Detector SSD

为了进一步了解SSD的性能增益,作者做了下图的可视化实验(Visualization)。白色区域说明SSD能够在多个类别上实现较高的检测性能;与R-CNN相比,SSD实现了更少的定位错误(localization error);然而,SSD在相似(similar)类别出现混淆(confuse),尤其是动物(animal)一类,见下图第二行的红色区域,作者认为这是SSD对不同类别共享位置导致的(share locations for multiple categories),换句话说就是这种基于位置的检测方法可能会导致相似类的混淆,因为缺少了两阶段模型中基于类别(class-specific)的边框回归。

Object Detection:One-stage Detector SSD

下图说明了SSD对检测框的尺寸非常敏感。SSD对多个尺度的目标检测还是很鲁棒的,尤其是大目标,但SSD对小目标的检测表现较差。虽然增加输入图片尺寸在一定程度上能提升小目标的检测性能,但是仍然还有很大的提升空间。

Object Detection:One-stage Detector SSD

3.2 模型分析/消融实验(Ablation Studies)

从下图可以看出:(1)数据增广技术很重要;(2)使用更多尺度的先验框可以得到更好的结果;(3)使用Atrous版本的VGG-16虽然性能提升较小,但能提升20%的速度。

Object Detection:One-stage Detector SSD

下图可以看出:多尺度特征预测的重要性。为了公平,以下消融实验中先验框的数量较为接近,这是通过增加可选择的先验框尺寸实现的。

Object Detection:One-stage Detector SSD

3.3 PASCAL VOC 2012

在“07++12”上,SSD300/512 超过Fast/Faster R-CNN与YOLO;在“07++12+COCO”上,SSD300/512超过Faster R-CNN。

Object Detection:One-stage Detector SSD

3.4 COCO

因为COCO目标尺寸整体比PASCAL小,所以论文中采用了更小尺度的先验框。SSD300在[email protected]与[email protected][0.5:0.95]上性能超越了Fast R-CNN,在[email protected]上与ION、Faster-RCNN相近,但在[email protected]上逊色于ION、Faster-RCNN。SSD512达到SOTA,有趣的是:SSD512相对于SSD300,在[email protected]高了5.3%,在[email protected]仅高了1.2%。

Object Detection:One-stage Detector SSD

3.5 数据增广对小目标准确率的影响

“拉近(zoom in)”和“拉远(zoom out)” 的数据增广策略有助于提升小目标准确率。其中,“拉近”可由随机截取(Random Crop)实现,而“拉远”则是采用一种扩张(expansion)方式:将原图随机放在16倍的用均值(mean value)填充的画布(canvas)上,然后对其做随机截取 (原文链接8)。因为通过数据增广增加了训练集规模,论文将迭代的次数调整为原来的2倍。

原文链接8: We first randomly place an image on a canvas of 16x of the original image size filled with mean values before we do any random crop operation.

由下面两图可以体会到数据增广对小目标准确率的提升是有很大帮助的。作者还提出了一种提升SSD性能的可选方案:设计更好的贴瓷砖(“先验框”)方式 (只可意会,不好翻译呀),使其能够更好的对齐特征图上每个位置的感受野(原文链接9)。

原文链接9: An alternating way of improving SSD is to design a better tiling of default boxes so that its position and scale are better aligned with the receptive filed of each position on a feature map.
Object Detection:One-stage Detector SSD
Object Detection:One-stage Detector SSD

3.6 预测阶段 (Inference Time)

  • 根据类别置信度确定其类别与置信度,过滤属于背景的预测框
  • 根据置信度阈值筛去不符合条件的预测框
  • 将剩下的预测框进行解码,并做裁剪(避免预测框位置超出原图), 得到对应到原图中的位置参数
  • 按照置信度降序排列,保留top-k个预测框
  • 进行NMS,筛去重叠较多的预测框。
  • 最终剩下的框便是检测结果。

SSD有80%的前传时间花在骨干网络上。下图是各模型性能对比:

Object Detection:One-stage Detector SSD

4. 总结

SSD 融合了两阶段模型Faster-RCNN的先验框机制(anchor)与单阶段模型的回归思想(regression),借助多层特征(multiple feature maps)预测以及数据增强等手段,在实现高精度(high precision)的同时又保证了实时速度(real-time spped)。SSD是目标检测单阶段模型的其中一个里程碑,非常值得大家去精读!

参考链接:

SSD解析好文推荐:目标检测|SSD原理与实现

继续阅读