背景
论文地址:SSD: Single Shot MultiBox Detector
代码地址:GitHub
视频:Video
这篇文章发表于 ECCV 2016,在 YOLO 的 grid cell 之上做了一些工作,结合 Faster R-CNN 的 anchor,使用卷积方式对每幅图只计算一次就能够得到最终检测结果。速度比 YOLO 快,且精度高于 Faster R-CNN。
现状
- 在 R-CNN 提出之前的一堆通过滑动窗口+特征方式做目标检测,以 DPM 为代表
- 在 YOLO 之前一堆通过定位+分类方式,对每个 proposal 进行分类,R-CNN 系列为代表
- R-FCN 也提取 proposal,但是对所有的 proposal 统一做一次 pooling 计算,去除了上面对每个 proposal 有子网络速度慢的缺点
- YOLO 提出来对图片画格子方法,对每个格子进行检测
贡献
- 速度提升:300x300 的输入尺寸,速度可以达到 58 fps
- 精度提升:500x500 的输入尺寸,精读可达 75.1%
- 输入可调:输入图片的尺寸可以自定义,尺寸大的话精度高但速度慢,尺寸小速度快精度低
方法
一句话概括就是去除了 YOLO 网络中的全连接层,改为卷积层,加入金字塔模型,与此同时修改了每个 cell 贡献的 bounding-box 个数(anchor)。下面分别介绍这几个优化的操作方法。
金字塔模型
YOLO 和本文都使用了一个 feature map 的概念,feature map 是指基础网络(如 VGG-16)的最后一个卷积层输出。YOLO 只对一个 feature map 获取信息,而本文中对基础网络产生的 feature map 后接继续卷积层,产生另外一个 feature map,后面再加卷积层又有一个 feature map,这样每个 feature map 都可以产生预测值,由此加入了多尺度的概念。
卷积检测(主要贡献点)
YOLO 中对 feature map 产生预测使用的是全连接层,参数较多,本文改为使用卷积产生预测,卷积核一般是 3×3×p ,其中
- 3 是经验值
- p=k×(#Classes+4) ,k 就是 anchor 的个数
再看一眼 YOLO 的格式是 k×5+#Classes ,与 YOLO 的不同之处在于每个 bounding box 可以有不同的分类,并且舍弃了是否是 object 这一项的预测。
网格对应的默认边框以及长宽比例
文中的 Default Boxes 困扰了我很久,其实作用就是为了获取网格对应的训练真值。可能是因为人工标注的真值没办法与上面的 k 个 bbox 对应,所以作者新建 k 个 default box 作为训练时的真值。每个 default box 的长宽比例保持固定。
训练方法
默认边框与标注真值的匹配方法
YOLO 中使用物体中心点落入网格当中进行匹配,SSD 改为计算 IoU 的方式。
- 每个 ground truth 的边框与最大 IoU 的 default box 边框匹配
- 每个 default box 边框随机挑选一个的 IoU 大于 0.5 的 ground truth 匹配
损失函数
等号右面的第一项为 softmax 的损失函数,第二项和 Faster R-CNN 一样
默认边框长啥样
在金字塔模型中,每个 feature map 有不同的尺寸,假设有 m 层金字塔。Default box 与输入图片比例为 sk
其中 smin=0.2,smax=0.95 表示 default box 的边长最小占整幅图片的 20%,最大占 95%。Default box 边长的长款比例为 ar∈{1,2,3,12,13} ,并且对长宽比是 1 的增加一个 s′k=sksk+1−−−−−√ 。所以每个网格对应 6 个 default boxes。于是我们有
- 边框中心为 (i+0.5|fk|,j+0.5|fk|) , |fk| 为第 k 层 feature map 的尺寸, i,j∈[0,|fk|]
- 边框边长为 (wak=skar−−√,hak=skar√)
上图 a)是手动标注的真值边框,b)c)为不同的 feature map,网格对应固定个数的 default boxes 作为训练时的真值,因为 IoU 阈值,所以只有个别的 default box 被认为是包括物体。
负样例挑选
上面会产生过多的负样本,影响网络的分布。所以对负样本的可信度(how)排序,挑选 top N,使得正负样本接近 1:3。
训练数据集扩展
全部原始图像 + 随机采样 + 采样
实验
- 使用 VGG16 作为基础模型,fc6 & fc7 转为卷积层,也是用洞洞算法
- learning rate = 0.001
- momentum = 0.9
- weight decay = 0.0005
- batch size = 32
结论
- 训练数据 augmentation 很有必要,表 2 中显示能提升 6.7% mAP
- 金字塔模型很 OK
- default box 的长宽比例越多越好
- atrous 算法又快又好