【1】SSD(Single Shot MultiBox Detector)算法可以理解为 YOLO + Faster R-CNN 的进化方法。
严格来说,YOLO 、YOLO2 和 SSD 已经不是 R-CNN 的思路了:
1)R-CNN 系列(R-CNN、SPPnet、Fast R-CNN、Faster R-CNN)基于 “Proposal + Classification”的路线,mAP 比较高,但速度不理想;
2)YOLO 系列将分类问题转为回归问题,速度达到实时的要求,但精度有所下降,并且先天性的对小目标效果不好。
SSD 作为 YOLO 的超级改进版,同时兼顾了 mAP 和实时性的要求。对于 300*300 的输入,在 Titan X 上达到 58 fps、72.1%的mAP
图1. 系列算法的 FPS 和 mAP 对比(摘自这里)
SSD算法思路
概括来说,SSD 同时考察网络中不同层次的卷积(feature map)结果,具有多尺度的特性;采用类似 YOLO 的固定网格方法确定目标位置,用类似 Faster-RCNN 里 Anchor 的 scale 和 ratio 调整目标框
多尺度 feature map
参考这篇知乎专栏,SSD 以 VGG16 为基础,使用前5层,将后面的全连接层 fc6 和 fc7 转换为两个卷积层,后面增加 3 个卷积层和 1 个 average pool 层。不同层次的 feature map 用于对 default box 偏移和所属类别的预测
图2. SSD 与 YOLO 的网络
1)fc6 和 fc7 的转换应用了 atrous algorithm 技术。因为全连接层变为卷积层会导致感受野(receptive field)变小。参考这里,atrous 通过将连续的连接关系变成 skip 连接来扩大每个神经元的感受野(图3)
图3. atrous 通过设置 rate 弥补感受野的损失(来自这里)
此外,文章《卷积神经网络物体检测之感受野大小计算》和《CNN中感受野的计算》对感受野概念做了介绍,并给出了感受野的计算方法:
采用 top to down 的方式,从当前层逐层传到第一层
# 令 RF 为当前层的感受野(size * stride)
for layer in (top layer To down layer):
RF = ((RF-1) * stride + fsize)
# 得到的结果就是当前层在整个网络的感受野
2)关于 default box
如《论文阅读:SSD: Single Shot MultiBox Detector》所述:
- feature map cell 就是将 feature map 切分成 8×8 或者 4×4 之后的一个个 格子;
default box 就是每一个格子上,一系列固定大小的 box,即图中虚线所形成的一系列 boxes
图4. (b)(c)将卷积结果分成8x8和4x4的feature map cell;
每个格子上由不同scale和ratio生成的 default box
假定一共抽取 m 个不同层做预测,最底层的 scale 为
smin=0.2
,最高层为
smax=0.95
1)中间层的scale通过以下公式得到
2)每一层有5种ratio ar∈{1,2,12,3,13} 用于计算 default box 的宽高
对于 ratio=1 的情况,额外指定一个 s′k=sksk+1−−−−−√ ,这样一共有 6 种不同的 default box
3)每个 default box 的中心为 (i+0.5|fk|,j+0.5|fk|) ,其中 |fk| 为第k个 feature map 的大小, i,j∈[0,|fk|]
3)抽取特定的卷积层用于多尺度预测
这篇文章从代码层面分析,SSD 抽取 conv4_3(4)、fc7(6)、conv6_2(6)、conv7_2(6)、conv8_2(4)、conv9_2(4)输出的 feature map(括号里面是 default box 的数量)
每一个后面再采用两套并列的 3*3 卷积核做卷积,一个用于回归 box 偏移位置(假设default box为6,那么一共6*4=24个卷积核),一个用于确定类别的confidence(假设default box为6,类别为20+1,那么一共6*21=126个卷积核)
训练过程
1)样本处理
YOLO系列与 “Proposal + Classification”最大的不同在于:最终的目标位置在一开始就是确定的(default box 微调的结果)
因此在训练时需要首先将样本的 ground true box 与某个 default box 对应,实际参与回归的其实是那个对应的 default box
在实际操作中,将那些与 ground true box 的 IoU 大于 0.5 的 default box 作为正样本(一个 ground true box 可能对应多个正样本),其余 default box 为负样本
2)目标函数
与常见的 Object Detection 相同,分为类别置信度和 box 位置回归。类别置信度采用 Softmax Loss(Faster R-CNN为 log loss),box 回归采用与 Faster R-CNN 一样的 Smooth L1 loss
- 其中 N 是与 ground true box 相匹配的 default box 个数
Lloc 采用 Smooth L1 Loss,回归 bounding box 的(中心位置,width, height)- Lconf 采用 Softmax Loss,输入为每一类的置信度 c
- α=1
3)hard negative mining
feature map 上每个点对应 6 个不同的 default box,绝大部分为负样本,这样导致正负样本不平衡
训练时根据 confidence loss 对所有 loss 排序,选择最高的几个,使正负样本比例保持在 1:3,mAP 最终提高了4%
4)data augmentation
又称“数据增广”,详细的介绍可以参考文章《Must Know Tips/Tricks in Deep Neural Networks 》
对每一张训练图像,随机的从如下3种方法选择一种:
- 使用原始图像
- 采样一个 patch,与物体间最小的 IoU 为[0.1, 0.3, 0.5, 0.7, 0.9]
- 随机采样一个 patch
采样的 patch 与原始图像大小比例为 [0.1, 1],宽高比在 [0.5, 2] 之间
当 ground true box 的中心在采样的 patch 中时,保留重叠部分
最后,将每个 patch resize 到固定的大小,并以 0.5 的概率随机水平翻转
最终的实验表明,数据增广的应用对结果的提升非常明显(将 mAP 从 65.4% 提高到了 72.1%)
代码实现
作者在 github 上提供了基于 caffe 的实现
文章《 r-cnn系列代码编译及解读(4)》对官方做编译和修改,实现了自己数据的训练和检测
【1】Liu W, Anguelov D, Erhan D, et al. Ssd: Single shot multibox detector[C]//European conference on computer vision. Springer, Cham, 2016: 21-37.