【R-CNN系列目标检测】(7)SSD算法

来源:互联网 发布:中学生英语学习软件 编辑:程序博客网 时间:2024/06/05 06:14

【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通过以下公式得到

sk=smin+smaxsminm1,k[1,m]

2)每一层有5种ratio ar{1,2,12,3,13} 用于计算 default box 的宽高
{wak=skarhak=skar

对于 ratio=1 的情况,额外指定一个sk=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

L(x,c,l,g)=1N(Lconf(x,c)+αLloc(x,l,g))

  • 其中 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.


阅读全文
0 0