转载请注明作者: 梦里茶 https://github.com/ahangchen
Single Shot MultiBox Detector
Introduction
一句话概括: SSD 就是关于类别的多尺度 RPN 网络
基本思路:
基础网络后接多层 feature map
多层 feature map 分别对应不同尺度的固定 anchor
回归所有 anchor 对应的 class 和 bounding box
Model
输入: 300x300
经过 VGG-16(只到 conv4_3 这一层)
经过几层卷积, 得到多层尺寸逐渐减小的 feature map
每层 feature map 分别做 3x3 卷积, 每个 feature map cell(又称 slide window)对应 k 个类别和 4 个 bounding box offset, 同时对应原图中 6(或 4)个 anchor(又称 default box)
38x38, 最后 3x3, 1x1 三个 feature map 的每个 feature map cell 只对应 4 个 anchor, 分别为宽高比: 1:1 两种, 1:2, 2:1 两种, 因此总共有 38 * 38 * 4 + 19 * 19 * 6 + 10 * 10 * 6 + 5 * 5 * 6 + 3 * 3 * 4 + 1 * 1 * 4 = 8732 个 anchor
其他 feature map 的 feature map cell 对应 6 个 anchor, 分别为宽高比: 1:1 两种, 1:2, 2:1 两种, 1:3, 3:1 两种
每层的 feature map cell 对应的 anchor 计算方法如下
位置: 假设当前 feature map cell 是位于第 i 行, 第 j 列, 则 anchor 的中心为 ((i+0.5)/|fk|,(j+0.5)/|fk|), fk 是第 k 层 feature map 的 size(比如 38)
缩放因子:
其中 smin 为 0.2,smax 为 0.9,m 为添加的 feature map 的层数, 缩放因子就是为不同 feature map 选择不同的大小的 anchor, 要求小的 feature map 对应的 anchor 尽量大, 因为越小的 feature map, 其 feature map cell 的感受野就越大
anchor 宽高:
其中, ar{1,2,3,1/2,1/3}, 可以理解为在缩放因子选择好 anchor 尺寸后, 用 ar 来控制 anchor 形状, 从而得到多尺度的各种 anchor, 当 ar=1 时, 增加一种 sk=sqrt(sk-1sk+1), 于是每个 feature map cell 通常对应 6 种 anchor.
网络的训练目标就是, 回归各个 anchor 对应的类别和位置
Training
样本
正样本
选择与 bounding box jaccard overlap(两张图的交集 / 并集)大于 0.5 的 anchor 作为正样本
样本比例
Hard negative mining: 由于负样本很多, 需要去掉一部分负样本, 先整图经过网络, 根据每个 anchor 的最高类置信度进行排序, 选择置信度靠前的样本, 这样筛选出来的负样本也会更难识别, 并且最终正负样本比例大概是 1:3
Loss
还是一如既往的 location loss + classification loss, 并为 location loss 添加了系数α(然而实际上α=1)进行平衡, 并在 batch 维度进行平均
x 是 xijp 的集合 xijp={1,0}, 用于判断第 i 个 anchor 是否是第 j 个 bounding box 上的 p 类样本
c 是 cip 的集合, cip 是第 i 个 anchor 预测为第 p 类的概率
l 是预测的 bounding box 集合
g 是 ground true bounding box 集合
其中定位 loss 与 faster rcnn 相同
这个式子里的 k 不是很明确, 其实想表达不算背景 0 类的意思, 且前景类只为 match 的类算 location loss
分类 loss 就是很常用的 softmax 交叉熵了
核心的内容到这里就讲完了, 其实跟 YOLO 和 faster rcnn 也很像, 是一个用 anchor box 充当固定的 proposal 的 rpn, 并且用多尺度的 anchor 来适应多种尺度和形状的目标对象.
Detail
在训练中还用到了 data augmentation(数据增强 / 扩充), 每张图片多是由下列三种方法之一随机采样而来
使用整图
crop 图片上的一部分, crop 出来的 min 面积为 0.1,0.3,0.5,0.7,0.9
完全随机地 crop
然后这些图片会被 resize 到固定的大小, 随机水平翻转, 加入一些图像上的噪声, 详情可以参考另一篇论文:
Some improvements on deep convolutional neural network based image classification
从切除实验中, 可以看到 data augmentaion 是很重要的(从 65.6 到 71.6)
这个表中还提到了 atrous, 其实是指空洞卷积, 是图像分割 (deeplab) 领域首先提出的一个卷积层改进, 主要是能让测试速度更快. 具体可以参考 ICLR2015 Deeplab https://arxiv.org/pdf/1412.7062.pdf
从这个表中也可以看出多种形状的 anchor 可以提升准确率
Result
输入尺寸为 300x300,batch size 为 8 的 SSD300 可以做到实时 (59FPS) 且准确 (74.3% mAP) 的测试
Summary
SSD 算是一个改进性的东西, 站在 Faster RCNN 的肩膀上达到了实时且准确的检测
来源: https://www.cnblogs.com/hellocwh/p/8729260.html