版权声明:本文为博主原创文章,转载需注明出处。          https://blog.csdn.net/qianqing13579/article/details/82106664        </div><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css"><div id="content_views" class="markdown_views prism-atom-one-dark"><!-- flowchart 箭头图标 勿删 --><svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg><hr>

前言

五一假期期间,写了几篇SSD源码解读系列文章,阅读完源码之后,SSD的很多细节都弄懂了,经过这几个月的工作和学习,对SSD又有了新的理解,这里跟大家一起分享我对SSD的一些理解,欢迎一起讨论交流。


目录

  • 前言
  • 目录
  • SSD效果为什么这么好
  • 原因1:多尺度
  • 原因2:设置了多种宽高比的default box
    • 理论感受野和有效感受野
    • 为什么要设置default box?
    • default box的匹配
    • 为什么要设置多种宽高比的default box?
    • 如何选择default box的scale和aspect ratio?
  • 原因3:数据增强
  • SSD的缺点及改进
  • SSD与MTCNN
    • SSD与MTCNN的区别
  • 结束语
  • 参考文献

SSD效果为什么这么好

虽然SSD这个算法出来已经两年了,但是至今依旧是目标检测中应用最广泛的算法,虽然后面有很多基于SSD改进的算法,但至今也没有哪一种检测算法在速度和精度上能够完全碾压SSD的。那么为什么SSD效果这么好?SSD效果好主要有三点原因:

1. 多尺度
2. 设置了多种宽高比的default box(anchor box)
3. 数据增强

下面一一对他们进行分析。


原因1:多尺度

由SSD的网络结构可以看出,SSD使用6个不同特征图检测不同尺度的目标。低层预测小目标,高层预测大目标。

作者在论文中通过实验验证了,采用多个特征图做检测能够大大提高检测精度,从上面的表格可以看出,采用6个特征图检测的时候,mAP为74.3%,如果只采用conv7做检测,mAP只有62.4%。


原因2:设置了多种宽高比的default box

在特征图的每个像素点处,生成不同宽高比的default box(anchor box),论文中设置的宽高比为{1,2,3,1/2,1/3}。假设每个像素点有k个default box,需要对每个default box进行分类和回归,其中用于分类的卷积核个数为c*k(c表示类别数),回归的卷积核个数为4*k。

SSD300中default box的数量:(38*38*4 + 19*19*6 + 10*10*6 + 5*5*6 + 3*3*4 + 1*1*4)= 8732

讲到这里,我想对于刚学习SSD的朋友,一定有这些疑惑:

1. 为什么要设置default box?
2. 为什么要设置多种宽高比的default box?
3. 为什么在6个特征图上使用3x3的卷积核进行卷积就可以做检测了呢?

这些问题曾经困恼我很长时间,当我看完SSD的源码,并通过很长时间的实践,对这些问题豁然开朗,下面分享自己对这些问题的一些理解,希望对你理解SSD能够提供一些帮助。

理论感受野和有效感受野

这里先简单说明一下理论感受野和有效感受野的概念,更加详细的介绍参考论文:Understanding the Effective Receptive Field in Deep Convolutional Neural Networks[1]。这两个概念的理解对于理解default box(anchor)非常重要。

影响某个神经元输出的输入区域就是理论感受野,也就是我们平时说的感受野,但该输入区域的每个像素点对输出的重要性不同,越靠近中心的像素点影响越大,呈高斯分布,也就是说只有中间的一小部分区域对最后的输出有重要的影响,这个中间的一小部分区域就是有效感受野

图a中,整个黑色区域就是理论感受野(TRF),中间呈高斯分布的白色点云区域就是有效感受野(ERF)
图b中,图中黑色虚线区域对应理论感受野,蓝色虚线部分对应有效感受野,红色实线框是anchor大小,他比理论感受野小很多,但是能够匹配有效感受野。

为什么要设置default box?

SSD在6个特征图上使用2组3x3的卷积核分别做分类和boundingbox回归,所以SSD是一个全卷积神经网络。我们知道每个特征图上每个像素点对应一个理论感受野,所以SSD相当于对原图中所有的理论感受野作分类和回归,由于有效感受野在理论感受野中有重要的影响,其他区域的影响可以忽略,所以这里我们认为SSD是对有效感受野作分类和回归,那么问题来了,既然是对所有的有效感受野做分类和回归,那每个有效感受野的分类的label和回归的label是如何确定的呢?default box就是用来干这个的。

每一层的default box设置了每一层特征图的有效感受野,然后使用这些default box与ground truth进行匹配来确定特征图上每个像素点的实际的有效感受野的label(包含分类label和回归label),分别用于分类和boundingbox回归。说的简单点,default box就是用来确定特征图上每个像素点实际的有效感受野的label的。

既然default box是确定实际有效感受野的label的,所以如果default box设置的有效感受野能够很好的匹配实际的有效感受野,SSD模型效果就会很好,如果两者相差较大,模型效果就会很差。

上图中,某一层特征图的某个像素点对应的实际有效感受野是红色区域,这个实际有效感受野的label应该是猫,但是SSD训练时这个红色区域的label是由default box确定的,如果default box设置的有效感受野对应的是蓝色区域,通过对default box与ground truth进行匹配我们发现,蓝色区域的label不是猫,而是背景,这样由default box确定的labe与实际有效感受野的真实的label就匹配不上了,如果用这个label作为红色区域的真实label就不对了,训练效果就会很差。

由于default box只要匹配实际的有效感受野就可以了,而实际的有效感受野要比理论感受野小很多,所以SSD中每一层的default box的大小可以比理论感受野小很多。作者在论文中也提到了这一点:
Feature maps from different levels within a network are known to have different (empirical) receptive field sizes .Fortunately, within the SSD framework, the default boxes do not necessary need to correspond to the actual receptive fields of each layer. We design the tiling of default boxes so that specific feature maps learn to be responsive to particular scales of the objects.
大意就是:SSD中default box不必响应实际的感受野,default box只对特定尺度的目标响应。也就是说,SSD的default box只要能够响应有效感受野就可以了。

所以在训练SSD的时候,default box大小的设置非常重要。目前实际的有效感受野的大小还不能精确计算出来,如何让default box设置的有效感受野更好的匹配实际的有效感受野还需要进一步研究。这一点作者在论文中也提到了:
An alternative way of improving SSD is to design a better tiling of default boxes so that its position and scale are better aligned with the receptive field of each position on a feature map. We leave this for future work.

了解了default box的作用后,我们就很容易知道SSD的本质了

SSD对6个特征图上所有的default box进行分类和回归,其实就是对6个特征图对应的实际的有效感受野进行分类和回归,说得更加通俗一点,这些有效感受野其实就是原图中的滑动窗口,所以SSD本质上就是对所有滑动窗口进行分类和回归。这些滑动窗口图像其实就是SSD实际的训练样本。知道SSD的原理后我们发现深度学习的目标检测方法本质与传统的目标检测方法是相同的,都是对滑动窗口的分类。

注:
1. 这里要好好理解这两个概念:“每一层实际的有效感受野”“default box设置的有效感受野”
2. 注意全卷积神经网络与非全卷积神经网络的区别,一般的分类网络比如AlexNet只需要对整幅图像提取特征然后做分类,感受野是整幅图像,所以最后会用全连接层,而SSD中,由于要对每一个感受野做分类,所以只能用卷积层。

default box的匹配

现在我们知道了default box是用来确定label的,那么是如何确定label的呢?
在训练阶段,SSD会先寻找与每个default box的IOU最大的那个ground truth(大于IOU阈值0.5),这个过程叫做匹配。如果一个default box找到了匹配的ground truth,则该default box就是正样本,该default box的类别就是该ground truth的类别,如果没有找到,该default box就是负样本。图1(b)中8x8特征图中的两个蓝色的default box匹配到了猫,该default box的类别为猫,图1(c)中4x4特征图中的一个红色的default box匹配到了狗,该default box的类别为狗。图2显示了实际的匹配过程,两个红色的default box分别匹配到了猫和狗,左上角的default box没有匹配,即为负样本。


图1


图 2

关于匹配更多的细节,参考Caffe源码multibox_loss_layer.cpp中的FindMatches()函数,前面的博客:SSD源码解读3-MultiBoxLossLayer中也讲到了该函数。

为什么要设置多种宽高比的default box?

我们知道default box其实就是SSD的实际训练样本,如果只设置了宽高比为1的default box,最多只有1个default box匹配到,如果设置更多宽高比的default box,将会有更多的default box匹配到,也就相当于有更多的训练样本参与训练,模型训练效果越好,检测精度越高。

作者实验结果表明,增加宽高比为1/2,2,1/3,3的default box,mAP从71.6%提高到了74.3%。

如何选择default box的scale和aspect ratio?

假设我们用m个feature maps做预测,那么对于每个featuer map而言其default box的scale是按以下公式计算的。

Sk=Smin+Smax−Sminm−1(k−1)Sk=Smin+Smax−Sminm−1(k−1)

,因此,对于每个feature map cell而言,一共有6种default box。

示例:
假设m=6,即使用6个特征图做预测, 则每一层的scale:0.2,0.34,0.48,0.62,0.76,0.9
对于第一层,scale=0.2,对应的6个default box为:

宽高比
1 0.200000 0.200000
2 0.282843 0.141421
3 0.346410 0.115470
1/2 0.141421 0.282843
1/3 0.115412 0.346583
最后增加的default box 0.260768 0.260768

注:表格中每个宽高比的default box的实际宽和高需要乘以输入图像的大小,如SSD300,则需要使用上面的数值乘以300得到default box实际大小。

Caffe源码中default box的宽高比以及scale的设置参考prior_box_layer.cpp,前面的博客:SSD源码解读2-PriorBoxLayer也对该层进行过解读。


原因3:数据增强

SSD中使用了两种数据增强的方式
放大操作: 随机crop,patch与任意一个目标的IOU为0.1,0.3,0.5,0.7,0.9,每个patch的大小为原图大小的[0.1,1],宽高比在1/2到2之间。能够生成更多的尺度较大的目标
缩小操作: 首先创建16倍原图大小的画布,然后将原图放置其中,然后随机crop,能够生成更多尺度较小的目标

作者实验表明,增加了数据增强后,mAP从65.5提高到了74.3!

数据增强对应Caffe源码annotated_data_layer.cpp,前面的博客:SSD源码解读1-数据层AnnotatedDataLayer也对该层进行过解读。


SSD的缺点及改进

SSD主要缺点:SSD对小目标的检测效果一般,作者认为小目标在高层没有足够的信息。

论文原文:
This is not surprising because those small objects may not even have any information at the very top layers. Increasing the input size (e.g. from 300× 300 to 512× 512) can help improve detecting small objects, but there is still a lot of room to improve.

对SSD的改进可以从下面几个方面考虑:
1. 增大输入尺寸
2. 使用更低的特征图做检测
3. 设置default box的大小,让default box能够更好的匹配实际的有效感受野


SSD与MTCNN

这里为什么会提到MTCNN[2]呢?如果你了解过MTCNN这个算法,一定对PNet这个网络不陌生,仔细比较SSD与PNet,你就会发现SSD与PNet之间有着千丝万缕的联系。


其实我对SSD的理解就是源于MTCNN中的PNet,实际上SSD可以看成是由6个不同的PNet组合而成,最大的不同是数据层,MTCNN需要事先手动将所有的训练数据生成好,然后输入到网络中训练,而SSD直接输入原图就可以,实际的训练数据由数据层和priorbox层共同完成,其中priorbox层用来确定每个样本的label。SSD实现了真正意义上的端到端的训练。

这里用原论文中的SSD300的结构与MTCNN作比较

SSD与MTCNN的区别

  1. 生成训练数据的方式不同
    MTCNN需要将训练样本事先生成好,同时生成label(分类label和回归label),然后输入到网络中训练,而SSD直接输入原图,实际的训练数据由数据层和priorbox层共同完成,其中priorbox层用来确定每个样本的label,也就是说SSD将MTCNN的生成训练数据的部分融合到一个网络中,实现了真正意义上的端到端。
  2. MTCNN和SSD实现了两种滑动窗口检测策略
    MTCNN:首先构建图像金字塔,然后使用固定大小的滑动窗口在金字塔每一级滑动,对每个滑动窗口分类回归。这个固定大小的滑动窗口的大小就是PNet的输入大小,滑动窗口操作由全卷积PNet实现。
    SSD: 在原图中设置了不同大小的滑动窗口,对不同大小的滑动窗口进行分类和回归。由于SSD可以看作是由6个不同的PNet组成,所以这些不同大小的滑动窗口其实对应了6种PNet。
    不管是MTCNN,还是SSD,本质上是对所有滑动窗口的分类。这与传统的目标检测方法本质上是一样的。
  3. SSD使用3x3卷积核进行分类和回归,而MTCNN使用1x1卷积核进行分类和回归
    3x3的卷积核覆盖了该像素点的感受野以及它的领域,加入了局部信息,使得模型更加鲁棒。

结束语

SSD在目标检测领域中具有里程碑式的意义,非常值得我们学习和研究,由于接触SSD的时间并不是很长,加上时间精力有限,不可能深入理解SSD的每一个细节,文中有什么不妥的地方,欢迎大家批评指正,有喜欢SSD算法的朋友,也欢迎留言一起交流讨论。

2018-8-27 08:08:36
Last Updated:2018-8-28 15:44:27


参考文献

[1] [2016 NIPS] Understanding the Effective Receptive Field in Deep Convolutional Neural Networks
[2] [2016 ISPL] Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks


非常感谢您的阅读,如果您觉得这篇文章对您有帮助,欢迎扫码进行赞赏。

深度学习算法之-SSD(一)相关推荐

  1. 一文梳理深度学习算法演进

    来源:https://zhuanlan.zhihu.com/p/464515049 作者:Peter潘欣 编辑:蘑菇先生 学习记涉及语音.图像.nlp.强化学习.隐私保护.艺术创作.目标检测.医疗.压 ...

  2. 深度学习算法原理_用于对象检测的深度学习算法的基本原理

    深度学习算法原理 You just got a new drone and you want it to be super smart! Maybe it should detect whether ...

  3. 深度学习算法简要综述(下)

    点击上方"算法猿的成长",关注公众号,选择加"星标"或"置顶" 总第 124 篇文章,本文大约 3731 字,阅读大约需要 10 分钟 原文 ...

  4. 深度学习算法简要综述(上)

    点击上方"算法猿的成长",关注公众号,选择加"星标"或"置顶" 总第 123 篇文章,本文大约 2300 字,阅读大约需要  7 分钟 原文 ...

  5. 回顾6年深度学习算法实践和演进

    作者:Peter(滑铁卢大学 计算机) 原文链接:https://zhuanlan.zhihu.com/p/464515049 本文转载自知乎,著作权归属原作者,如有侵权,请联系删文. 01 前言 如 ...

  6. 华南理工深度学习与神经网络期末考试_深度学习算法地图

    原创声明:本文为 SIGAI 原创文章,仅供个人学习使用,未经允许,不能用于商业目的. 其它机器学习.深度学习算法的全面系统讲解可以阅读<机器学习-原理.算法与应用>,清华大学出版社,雷明 ...

  7. 推荐 | 一个统计硕士的深度学习算法工程师的成长之路

    公众号推荐 推荐人/文文 俗话说,一个人走得快,但一群人可以走的远.在数据科学和机器学习的道路上,相信每个人都不是闭门造车的人.技术学习除了在个人努力外,交流和分享也是很重要的一部分. 今天给大家推荐 ...

  8. 深度学习算法实现———基础环境

    前言: 深度学习是包含在机器学习里的一个特殊领域,他是基于人工神经网络的一种特征学习算法的领域.自卷积神经网络现世以来深度学习开始迅速发展,相比于机器学习它更适合处理超高维特征.现如今深度学习在图像. ...

  9. ONNX 浅析:如何加速深度学习算法工程化?

    AlphaGo击败围棋世界冠军李世石以来,关于人工智能和深度学习的研究呈现井喷之势. 各种新的算法和网络模型层出不穷,令人眼花缭乱.与之相随的,深度学习的训练和推理框架也在不断的推陈出新,比较著名的有 ...

最新文章

  1. 学会python爬虫怎么赚钱-学会Python爬虫能赚大钱吗?Python爬虫赚钱渠道分享
  2. <马哲>生产方式是社会发展的决定力量2017-12-27
  3. 常用数据类型(C#)
  4. 《计算机组成原理》_学习笔记(二)
  5. Android 动态设置 layout_centerInParent
  6. 一步步编写操作系统21 x86虚拟机bochs 跟踪bios
  7. IDEA配置jdk (SDK)
  8. python-kafka 常用 api 汇总
  9. 信息学奥赛C++语言:求n个数的和
  10. 14.4.3.5 Configuring InnoDB Buffer Pool Flushing 配置InnoDB Buffer Pool 刷新:
  11. MySQL 8.0安装记录
  12. JAVA学习day06
  13. HTML5、canvas颜色拾取器
  14. 深度学习技术在遥感中应用的综述
  15. 【java】多线程_并发_同步_快乐影院
  16. win11 windows安全中心无法打开
  17. Oracle number类型详解
  18. docker pull拉取镜像_Docker拉取镜像的完整步骤
  19. python编程语言的缺点-多种编程语言的优缺点梳理
  20. 石家庄12重点项目开工,滹沱新区更名为正定新区

热门文章

  1. gs--常见函数说明
  2. Win10系统 格式化分配单元大小的解释与分配方法
  3. Disk Manager — 可视化的硬盘分区对象
  4. 记 PS2020 打开闪退问题
  5. 2023首届大学生算法大赛——补题
  6. “我数学太烂,但高考136分!”刷完上万道题后,我找到2个月多考58分的捷径…...
  7. 人工智能专家:总结AI在医疗的发展
  8. XDP/BPF Github教程
  9. 用C语言实现电脑小游戏——扫雷
  10. Altium Designer入门学习笔记和快捷键整理