【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 为
1)中间层的scale通过以下公式得到
2)每一层有5种ratio
对于 ratio=1 的情况,额外指定一个
3)每个 default box 的中心为
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.
- 【R-CNN系列目标检测】(7)SSD算法
- 【R-CNN系列目标检测】(1)R-CNN算法
- 目标检测方法系列:R-CNN, SPP, Fast R-CNN, Faster R-CNN, YOLO, SSD
- 【R-CNN系列目标检测】(2)SPP-Net算法
- 【R-CNN系列目标检测】(5)YOLO算法
- 【R-CNN系列目标检测】(6)YOLO2算法
- 【R-CNN系列目标检测】(3)FAST R-CNN算法
- 【R-CNN系列目标检测】(4)FASTER R-CNN算法
- 目标检测方法系列——R-CNN, SPP, Fast R-CNN, Faster R-CNN, YOLO, SSD
- 目标检测方法系列——R-CNN, SPP, Fast R-CNN, Faster R-CNN, YOLO, SSD
- 【深度学习:目标检测】深度学习检测方法梳理:R-CNN,SPP-NET, Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列
- CNN目标检测(三):SSD详解
- 目标检测:R-CNN
- 目标检测R-CNN
- 深度学习目标检测模型全面综述:Faster R-CNN、R-FCN和SSD
- 深度学习目标检测模型全面综述:Faster R-CNN、R-FCN和SSD
- 深度学习目标检测模型全面综述:Faster R-CNN、R-FCN和SSD
- R-CNN,SPP-NET, Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列深度学习检测方法梳理
- php反射常用的函数
- Linux系统,基本操作指令整理
- PS薄纱飘带字体制作
- java面试题目
- 错误总结
- 【R-CNN系列目标检测】(7)SSD算法
- Windows下JDK环境配置
- intell IDEA import module 配置
- react-native报错-unrecognized
- eclipse 远程服务器端代码调试
- Unity中的Undo操作如何对脚本起作用
- Android TextView不同文字显示不同颜色
- HDU5768(初试中国剩余定理)
- Centos7 设置Mongodb开机启动-自定义服务