本文的主要内容是提出了一种新的既能够保证一定速度又能保证一定精度的目标检测算法,这种算法成为“SSD”目标检测模型。
1. 综述
这篇论文提出了一种仅适用单一深度神经网络的图像中的目标检测算法。这种算法称为 SSD,它输出一系列 离散化 的 bounding boxes,这些 bounding boxes 是在不同的层次(layers)上的 feature maps 上生成的,并且有着不同的 aspect ratio(长宽比)。
在预测阶段的大致流程为:
- 计算出每一个 default box 中的物体属于每个类别的可能性,也就是计算出一个 得分(score)
- 同时,对这些 bounding boxes 的 shape 进行微调,以此来使其符合物体的物体的真实边框。
- 此外,为了处理相同物体的不同尺寸的情况,SSD 结合了不同分辨率的 feature maps 的 prediction 进行联合预测。
与那些需要目标的 region proposal 的方法相比,SSD 是一种比较简单的方法。因为 SSD 完全去掉了 region proposal 生成,pixel resampling 或是 feature resampling 这些操作。这使得 SSD 更容易进行优化训练以及更为容易地将检测模型融合到整个检测系统中。
在 PASCAL VOC,COCO, 以及 ILSVRC 数据集上的实验已经证实了 SSD 在保证检测精度的同时,它的速度比现有的,使用 region proposal 的方法快得多。
SSD 相比较于其他的单结构模型(YOLO)能够取得更高的精度,即使是在输入图像较小的情况下也能够得到比较好的效果。
2. 整体框架
目前的最好的物体检测算法都是使用以下方法的变体形式:
假设边界框位置,为每个框重新采样像素或特征,并在这些边界框上应用高质量分类器。
根据这种流程已经产生了目前效果最好的目标检测方法,并且已经在各个数据集上都有着 state-of-art 的效果。在达到高准确率的同时,这些方法同样拥有高复杂度,这些方法对于嵌入式系统,甚至是高端嵌入硬件来说,对于实时应用都太慢了。
按照上面这种流程进行目标检测的速度大多是 帧/秒(SPF)级别的,即使是目前最快的目标检测方法 Faster-RCNN 也只能达到 7帧/秒。目前已经有许多方法尝试通过改变这种流程来获得更快的检测速度,但是到目前为止,显着提高的速度仅以代价显着降低的检测精度为代价。
本文提出了第一个基于深度网络的物体检测器并且它不对边界框假设的像素或特征进行重采样,并且与之前所做的方法一样精确。因此可以看出 SSD 在速度方面的提升来自于消除 bounding box proposal 以及 subsequent pixel 或是 feature resampling stage。本文所做的工作不仅仅是取消了这些过程,而且还使用一系列小尺寸的卷积核来预测目标的勒边以及 bounding box 位置的偏移;使用单独的预测器(滤波器)来检测不同宽高比,并将这些滤波器应用于网络后期的多个特征映射中,以便在多个尺度上执行检测。通过利用上述方法对网络进行改进后,尤其是利用多尺度检测信息,使得本文的结构对于地分辨率图像的输入也能有一个比较好的检测精度。
最后对本文的 contributions 进行总结:
- 介绍了 SSD 这种新的目标检测方案,比目前已有的 YOLO 检测算法更快并且拥有更高的准确率。准确率甚至已经达到了那些 使用 region proposal 的方法(Faster R-CNN)。
- SSD的核心是使用应用于特征映射的小卷积滤波器来预测固定的一组默认边界框的类别分数和框偏移量。
- 为了实现高检测精度,我们根据不同尺度的特征地图生成不同尺度的预测,并通过纵横比明确地分开预测。
- 即使在低分辨率的输入图像上,这些设计功能也可以实现简单的端到端培训和高精度,从而进一步提高速度与精度之间的平衡。
- 实验包括在 PASCAL VOC,COCO 和 ILSVRC 上评估不同输入大小的模型的时序和准确性分析,并与最新的一系列最新方法进行比较。
3.The Single Shot Detector(SSD)
这部分的内容主要是对 SSD 的整体框架以及内部具体实现细节进行说明。下面进行分点介绍。
3.1 Model
SSD 方法是基于一个前馈卷积网络,该网络可生成固定大小的边界框集合,并在这些框中预测存在对象的类别,然后进行非最大抑制(NMS)以产生最终检测结果。早起的网络是基于标准的高质量的分类网络(在分类层之前),将这部分的网络结构称之为“base network”,也就是 基础网络。然后再在这个 基础网络的基础上增加一些辅助的结构用来进行目标检测并有以下的特征:
- Multi-scale feature maps for detection
- Convolutional predictors for detection
- Default boxes and aspect ratios
下面对上面的三点进行分别介绍
3.1.1 Multi-scale feature maps for detection
为了获得检测目标的多尺度特性,作者在得到的 base network 的后面添加了一些卷积特征层。这些层逐渐减小,并允许在多个尺度上对检测结果进行预测。预测检测的卷积模型对于每个特征层是不同的。
3.1.2 Convolutional predictors for detection
每个增加的特征层(或者可选的来自基础网络的特征层)可以使用一组卷积滤波器产生一组固定的检测预测。这些在下图中的SSD网络架构的顶部表示出来。
对于一个尺寸为
m×n
并且具有
p
个通道的特征图(feature maps)来说,预测潜在检测参数的基本元素是一个
在这里需要进行一个简单的说明,所谓的 边界框的默认位置,也就是“default box”,需要先明白 feature map cell ,而 feature map cell 就是将 feature map 切分成为
8×8
或者是
4×4
大小之后的每个 cell。
因此,default box 指的是在每个格子上,一系列固定大小的 boxes,也就是下图中的虚线所形成的一系列的 boxes。
3.1.3 Default boxes and aspect ratios
每一个 box 相对于与其对应的 feature maps cell 的位置是固定的。在每个 feature map cell 中,我们要预测的是 box 与 default box 之间的 offsets(偏移量),以及每一个 box 中包含物体的 score(每个类别的概率都需要计算出来)。
因此,对于一个位置上的 k 个 boxes 中的每一个 box,需要计算出
c
个类的 score,以及这个 box 相对于它的 default box 的 4 个偏移值(offsets)。因此,在 feature map 中的每一个 feature map cell 上,就需要有
可以看到,SSD 中的 default box 非常类似与 Faster R-CNN 中的 Anchor boxes,但是与 Anchor boxes 最大的不同是,本文中的 default boxes 是用在不同的分辨率的 feature maps 上。
3.2 Training
在训练时,SSD 的训练方法与之前那些使用 region proposal + pooling 方法的区别是,SSD 训练图像中的 ground-truth 需要赋予到那些固定输出的 boxes 上。在上文中也已经提到,SSD 输出的是实现定义好的,一系列固定大小的 bounding boxes。事实上,这种方法在 YOLO, Faster R-CNN 中的 RPN 阶段以及 MultiBox 中都有使用。只要将训练图像中的 ground truth 与固定输出的 boxes 对应之后,就可以进行端到端的损失函数计算以及反向传播的计算更新了。
至于如何进行对应,论文中用下图进行介绍:
在上图中,右边狗狗的 ground truth 是红色的 bounding box,但是在进行 label 标注的时候,要将红色的 ground truth 赋予上图(c) 中一系列固定输出的 boxes 中的一个,也就是图(c)中的红色虚线框。而至于为什么选择这个虚线框而非其余的虚线框,是因为这个虚线框的与 ground truth 的 IoU 最大。
在训练过程中同样会引入一些其他的问题。大致如下所示:
- Matching stategy -> 也就是如何选择一系列的 default boxes
- Training objective -> 目标损失函数的选择
- Choosing scales and aspect ratios for default boxes -> 选择 default boxes 的尺度问题
- hard negative mining -> 负样本问题
- Data augmentation -> 数据增强问题
下面进行分别介绍:
3.2.1 Matching strategy
在训练过程中,首先需要确定的一个问题是:如何将 ground truth boxes 与 default 进行匹配,以此组成 label ?
对于每个 ground truth box,我们都从默认的框中进行选择,这些框根据位置,长宽比和比例而变化。在开始的时候,使用 MultiBox 中的 best jaccard overlap(也就是 IoU)来匹配每一个 ground truth box 与 default box,这样就能保证每一个 ground truth box 与唯一一个 default box 对应起来。但是又不同于 MultiBox,SSD 在进行这步之后又将 default box 与任意的 ground truth box 进行匹配,只要两者之间的 jaccard overlap 大于一个阈值即可,本文中的阈值取的是 0.5.
像上面这样操作简化了学习问题,使网络可以预测多个重叠默认框的高分,而不是只挑选最大重叠的框。
3.2.2 Training objective
SSD 的训练时的目标函数源自于 MultiBox 的目标函数,但是 SSD 的目标函数又将其进行拓展,使其能够处理多个目标类别。这里使用
xpij=1
表示 第
i
个 default box 与 类别 p 的 第
根据上面这种匹配策略,我们会得到
∑ixpi,j≥1
。最后总的目标函数(objective loss function)就是由 localization loss (loc)与 confidence loss(conf)的加权求和:
上面公式中:
-
N
是与 ground truth box 相匹配的 default boxes 的个数。特别的,当
N=0 时,这是我们令总损失 loss=0 。 - Lloc 就是 Fast R-CNN 中的 Smooth L1 Loss,具体的形式在之前的 博客 中已经有详细介绍,这里不再赘述。只需要知道,我们回归的是default boxes 的中心点相对于真实的偏移以及宽度和高度。
- confidence loss(conf)是 Softmax Loss,其中输入为每一类的置信度
c
。具体表达还如下所示:
Lconf(x,c)=−∑i∈PosNxpijlog(c^pi)−∑i∈Neglog(c^0i) where c^pi=exp(cpi)∑pexp(cpi) - 权重项为 α ,实验中设置为 1。
3.2.3 Choosng scales and aspect ratios for default boxes
为了处理对不同尺度物体的检测,之前的一些方法(Overfeat,SPP-Net 等)将图像本身转换成为不同尺度,然后将这些图像独立的通过 CNN 网络进行处理,再将这些不同尺度的图像进行结合以适应于不同尺度图像的检测。
但是,通过使用一个网络结构中的不同层次的特征(feature map)我们同样可以得到相同的效果。而且 此时在所有物体尺度中共享参数。
之前的论文(FCN 等)就是使用了 CNN 前面的 层,以此来提高图像的分割的效果,因为越是底层的 layers,越是能够保存图像的底层特征,也就是能够更多的保留图像的细节信息。
受到上面方法的启示,在 SSD 中同时使用 “lower feature maps”以及“upper feature maps”进行检测的预测,也就是说,在 SSD 中同时利用底层特征和高层特征进行目标检测。在下图中展示了在 本文中使用的两种尺度 feature map,分别是 8×8 和 4×4 的feature map:
在实际的使用中,我们可以使用不同的或是更多的 feature maps 用以目标检测。
因为来自不同层的 feature maps 有着不同的感受野(receptive field)。这里的感受野,指的是输出的 feature map 上的一个点,对应输入图像上尺寸的大小。感受野的计算,可以参考:CNN中感受野的计算
但是幸运的是,在 SSD 中,default boxes 不需要与每一层 layer 的 receptive fields 相对应。在本文中,所使用的方法是
在 feature map 中的特定的位置,来负责图像中特定的区域,以及物体的特定尺寸。
也就是说,假如我们使用 m 个 feature maps 来进行 预测(predictions),每一个 feature map 中 default box 的 尺寸大小计算方法如下所示:
其中:
- smin=0.2 ,表示最底层的尺度为 0.2。
- smax=0.9 ,表示最顶层的尺度为 0.9。
- 可以看出从最底层到顶层是所使用的尺度是逐渐变化的。
由上面的公式可以计算出每层的 default box 的尺寸,然后再使用不同的 aspect ratio (宽高比)的 default boxes,这里使用 ar 表示: ar={1,2,3,1213} ,则每个 default box 的 宽高都可以使用下面的公式计算出来:
对于 ratio = 1(也就是宽高相等)时,文中还增加了一个 default box,这个 box 的 scale 为: s′k=sksk+1−−−−−√ 。所以在最终每个 feature map location 上,一共有 6 个 default boxes。
对于每一个 default box 的中心设置为: (i+0.5|fk|,j+0.5|fk|) ,其中 |fk| 是第 k 个 feature map 的大小,且有
通过对来自许多 feature map 的所有位置的具有不同尺度和高宽比的所有 default boxes 进行预测,我们有多种预测,涵盖各种输入对象大小和形状。
在上图中,狗狗的 ground truth box 与 4×4 feature map 中的红色 box 温和,所以其余的 boxes 都看做是负样本。
3.2.4 Hard negative mining
在进行匹配之后,大多数的 default boxes 都会被判定为是负样本(negatives),尤其是当 default boxes 的数量很大的时候。因此这会造成正负样本之间的不平衡。因此这里并不适用全部的负样本,而是对 default boxes 按照置信度最高进行排序,再挑选前面最高的 default boxes,使得负样本与正样本之间的比例大致为 3:1。使用这种方法可以加快优化速度以及使训练过程更加稳定。
3.2.5 Data augmentation
为了使整个模型对不同尺寸和形状的目标更具鲁棒性,作者对训练数据进行了数据增强,也就是对每张训练的图片都使用下面的方法随机剪裁:
- 使用原始图像
- 在原始图像上采样一个 patch,使得最小的 overlap 为 0.1,0.3,0.5,0.7 或 0.9
- 随机的采样,取得一个 patch
采样的 patch 与原图像大小比例为
[0.1,1]
,aspect ratio 在
12
与
2
之间。当 ground truth box 的中心在采样得到的 patch 中时,我们保留重叠部分。
在这些采样步骤之后,每一个采样得到的 patch 都被 resize 到固定的大小,并且以 0.5 的概率进行随机 水平翻转(horizontally flipped)。
4. Experimental Result
在论文中这部分主要讲的是提出的 SSD 模型在不同的检测数据集上的实际效果,以及与当前流行的其余的目标检测模型的对比情况。
这里我主要对 文中 在这部分一开始讲解的一个算法进行介绍,虽然文中没有细讲,因为这个算法来自于其他的论文,目前还没有看到这篇论文,因此直接将这种算法写到这里。
4.1 a` trous algorithm
这个算法的主要文献来自于谷歌的这篇论文 DeepLab,主要是介绍一种图像的语义分割算法。
本文的 Base Network 是基于 ICLR 2015,VGG16 来完成的,并且在 ILSVRC CLS-LOC 数据集上进行了预训练。与 DeepLab 工作类似,本文将 VGG 中的 FC6 layer、FC7 layer 转成为 卷积层,并对模型的 FC6、FC7 上的参数进行下采样从而得到这两个卷积层。并且将 Pool5 的
2×2−s2
变为
3×3−s1
,然后使用
a` trous
algorithm 来填充“holes”。
如下图所示:图片来自于 论文阅读:SSD: Single Shot MultiBox Detector
但是在对 Pool5 做这样的变化后,会改变生成的 feature map 的感受野(receptive field)的大小,因此,才会采用
a` trous
algorithm 算法,以此用来填充 “hole”,使得改变 Pool5 前后生成的 feature map 每个点对应的感受野大小保持不变,只有这样,才能依然使用原来的网络参数对整个模型进行 fine tune(微调)。
这里的矛盾是“既想利用已经训练好的模型进行 微调,又想改变网络结构从而得到更加 dense 的 score map”
在上图(a) (b)中,在以往的卷积或者是 池化过程中,一个 卷积核中相邻的权重作用在 feature map 上的位置都市物理上连续的。但是为了保证感受野不发生变化,在某一层的 stride 由 2 变成 1 后,后面的层就需要采用 hole 算法,具体来说就是即将连续的连接关系根据 hole size 的大小变成 skip 连接的。(图(c)为了显示方便直接画在本层上了)。pool4的stride由2变为1,则紧接着的 conv5_1, conv5_2 和conv5_3 中 hole size为2 。接着 pool5 由 2 变为 1 , 则后面的 fc6 中 hole size 为 4 。
下面给出 DeepLab 中的图:DeepLab
deeplab hole algorithm
最早用的就是 deeplab 的文章了,这篇文章和 fcn 不同的是,在最后产生 score map 时,不是进行 upsampling,而是采用了 hole algorithm,就是在 pool4 和 pool5 层,步长由2变成1,必然输出的 score map 变大了,但是 receptive field 也变小了,为了不降低 receptive field,怎么做呢?利用 hole algorithm,将卷积 weights 膨胀扩大,即原来卷积核是3x3,膨胀后,可能变成 7x7 了,这样receptive field变大了,而 score map 也很大,即输出变成dense的了。
这么做的好处是,输出的 score map 变大了,即是 dense 的输出了,而且 receptive field 不会变小,而且可以变大。这对做分割、检测等工作非常重要。
最后在 SSD 所使用的模型中,还将 fully convolutional reduced (atrous) VGGNet 中的所有的 dropout layers、fc8 layer 移除了。