本专栏将从论文的角度解读一下CV方向的一些经典神经网络模型及其贡献与意义,以期加深自己的印象,后续可以随时翻看并且学习其中好的tricks。这一期仍然介绍目标检测中one stage类的模型——SSD。
(图源网络)
论文相关信息
论文全名为《SSD: Single Shot MultiBox Detector》(链接),从名字可以看出,思路其实也是均匀地在图片的不同位置进行不同尺度的密集抽样,以适配不同形状的物体。作者相关信息如下:
网络架构
论文中与 YOLO 进行比较的 SSD 结构图:
而且 SSD 是基于 VGG-16 的。VGG-16网络结构(图源网络):
SSD 分别将 VGG-16 的全连接层 FC6 和 FC7 转换成 3x3 的卷积层 Conv6 和 1x1 的卷积层 Conv7,丢弃了 FC8 层和所有的 dropout 层,并加入了更多的卷积层,与 YOLO 最后采用全连接层不同,SSD最后直接融合不同卷积层上不同尺度的特征图来进行提取检测结果。值得一提的是 Pool5 层由原来的stride=2的 2×2 大小变成 stride=1 的 3×3大小,通过 Dilation Conv空洞卷积 来实现这种变化 (空洞卷积可以看这篇博客),目的是既想利用已经训练好的模型进行 fine-tuning,又想改变原结构的特征图大小。
tricks
1、多尺度特征图预测
老生常谈了…YOLO v3 相对于 v2 做出的最大改进 与 FPN 的精髓都是这个思路,比较大的特征图(浅层卷积层对边缘更加感兴趣,可以获得一些细节信息)用来检测相对较小的目标,而小的特征图(深层卷积层对由浅层特征构成的复杂特征更感兴趣,可以获得一些语义信息)负责检测大目标。
图转自这篇博客:
从这张细节架构图可以看出,SSD 融合了六个尺度(38×38、19×19、10×10、5×5、3×3、1×1)上的特征图,对于每张特征图上的每个点都预设了4个或6个不同大小的先验框,和 Faster R-CNN 中一样也是先预设框再通过 softmax 分类和 bounding box regression 来修正的思路(SSD 论文中把这样的先验框叫做 Default box,在 Faster R-CNN 中叫做anchor,没什么本质区别)。
不同之处在于,在 Faster R-CNN 中是人为设置的先验框尺寸,在 YOLO 系列中则是通过聚类来确定先验框尺寸,但在 SSD 中,先验框的尺寸遵循一个公式(随着特征图大小降低,先验框尺度线性增加):
其中sk表示先验框大小相对于图片的比例 ,m表示特征图个数,smin = 0.2,smax = 0.9,确定了 sk之后,按如下公式确定先验框的宽高:
其中 ar ∈ { 1, 2, 3, 1/2, 1/3 },当 ar = 1 时先验框为正方形,作者们还额外添加了一个不同大小但也为正方形的默认先验框:
这样就得到了6个不同大小的先验框,只使用4个先验框的特征图则去掉了 ar 为 3 和 1/3 的情况。
这样总共就产生了 8732 个先验框,最后送入 NMS 模块得到最后的框。
2、只预测框的相对变化量
与YOLO v2中类似,对于上述提到的 default box,每个 default box 都输出一套独立的值,即预测C个类别(包括背景类)的置信度评分和4个预测框相对于先验框的偏移参数(cx、cy、w、h)。
3、困难负例挖掘
通常称与 GT 匹配的先验框为正样本,反之,若一个先验框没有与任何 GT 进行匹配,那么该先验框只能与背景匹配,就是负样本,目标检测中普遍存在负样本远远大于正样本的问题。
在 YOLO 中,GT 的中心落在哪个单元格,该单元格中与其 IOU 最大的边界框负责预测它。但是在 SSD 中不同,匹配原则主要有两点:
首先,对于图片中每个 GT,找到与其 IOU 最大的先验框匹配,这样保证了每个 GT 一定与某个先验框匹配。如果仅按第一个原则匹配,很多先验框会是负样本,正负样本极其不平衡,为了缓解这种情况所以提出了第二个原则:对于剩余的未匹配先验框,若某个 GT 的 IOU 大于某个阈值(一般是0.5),那么该先验框也与这个 GT 进行匹配,视为正样本。
实际上,SSD 在不同尺度的特征图上面产生很多的先验框,映射到原始图像中,会获得一个密密麻麻的先验框集合,很少出现与某个 GT 匹配的先验框最高 IOU 小于阈值的情况,所以只考虑第二个原则也是可以的。最后对负样本进行抽样,以保证正负样本比例接近1:3。
损失函数为:
第一部分
其中 N 是先验框的正样本数量, xijk = 1时表示第 i 个先验框与第 j 个 GT 匹配,并且 GT 的类别为 k ,否则为0。
第二部分:
公式前一项是正样本(Pos)的损失,即分类为某个类别的损失(不包括背景),后一项是负样本(Neg)的损失,也就是类别为背景的损失。
总结
SSD的主要贡献是在不同的输出层特征图上使用不同尺度的先验框,即一种多尺度方法,其效果是非常不错的,运行速度可以和 YOLO 媲美,检测精度可以和 Faster R-CNN 媲美。SSD 能加速的原因也很好理解:首先 SSD 作为一种 one-stage 算法模型肯定比需要训练 RPN 产生候选框的 two-stage 模型 Faster R-CNN 更快,而 YOLO 虽然比 SSD 网络看起来简单,但YOLO网络中含有大量的全连接层,卷积层显然具有更少的参数。