从R-CNN到Mask R-CNN

文章目录:

  • 一、R-CNN
  • 二、Fast R-CNN
  • 三、Faster R-CNN
  • 四、Mask R-CNN
  • 五、拓展
    • 1、FCN

自从2012年的ILSVRC竞赛中基于CNN的方法一鸣惊人之后,CNN已成为图像分类、检测和分割的神器。其中在图像检测的任务中,R-CNN系列是一套经典的方法,从最初的R-CNN到后来的Fast R-CNN, Faster R-CNN 和今年的Mask R-CNN, 我们可以看到CNN在图像检测中是如何一点一点提高的。本文一道回顾R-CNN家族的发展史,了解这些方法的演变和这个演变过程中的那些富有创意的想法。

R-CNN 系列的四篇文章如下:

  • 1、R-CNN: arxiv.org/abs/1311.2524

  • 2、Fast R-CNN: arxiv.org/abs/1504.0808

  • 3、Faster R-CNN: arxiv.org/abs/1506.0149

  • 4、Mask R-CNN: arxiv.org/abs/1703.0687

图像的检测任务是从一个复杂场景的图像中找到不同的物体,并且给出各个物体的边界框。图像检测的三个著名的数据集是PASCAL VOC,ImageNet和微软COCO. PASCAL VOC包含20个物体的类别,而ImageNet包含一千多种物体类别,COCO有80种物体类别和150万个物体实例。

一、R-CNN

R-CNN的思路是很直观的三步曲:

  • 1、得到若干候选区域;
  • 2、 对每个候选区域分别用CNN分类
  • 3、对每个候选区域分别进行边框预测

在R-CNN出现之前,目标检测的流行思路是先从图像中得到一些候选区域,再从候选区域中提取一些特征,然后利用一个分类器对这些特征进行分类分类的结果候选区域的边界框就可以作为目标检测的输出。一种得到候选区域的方法是Selective Search, 该方法可以得到不同尺度的候选区域,每个候选区域是一个联通的区域。如下图中,左边得到的是较小的候选区域,右边是较大的候选区域,在该尺度下包含了整个人的区域。

R-CNN的想法是,既然CNN在图像分类任务中的表现很好,可以自动学习特征,何不用它来对每个候选区域进行特征提取呢?于是R-CNN在Selective Search得到的候选区域的基础上,将每个候选区域缩放到一个固定的大小,并且作为AlexNet(ImageNet 2012图像分类竞赛的冠军)的输入,依次对这些区域进行特征提取,然后再使用支持向量机各个区域的特征分别进行分类。R-CNN的过程如下:

这样就能得到一个检测的结果了。但是Slelective Search得到的候选区域并不一定和目标物体的真实边界相吻合,因此R-CNN提出对物体的边界框做进一步的调整,使用一个线性回归器预测一个候选区域中物体的真实边界。该回归器的输入就是候选区域的特征,而输出边界框的坐标

R-CNN的效果很不错,比VOC 2012的最好的结果提高了30%的准确度。但是问题就是太慢,主要有三方面原因:

  • 1、候选区域生成是一个耗时的过程;
  • 2、对候选区域特征提取需要在单张图像上使用AlexNet 2000多次;
  • 3、特征提取图像分类边框回归是三个独立的步骤,要分别进行训练,测试过程中的效率也较低。

二、Fast R-CNN

为了解决R-CNN中效率低的问题,Fast R-CNN想,一张图像上要使用AlexNet 2000多次来分别得到各个区域的特征,但很多区域都是重合的,可否避免这些重复计算,只在一张图像上使用一次AlexNet,然后再得到不同区域的特征呢?

于是Fast R-CNN提出了一个ROI Pooling的方法,先对输入图像使用一次CNN前向计算,得到整个图像的特征图再在这个特征图分别取提取各个候选区域的特征。由于候选区域的大小不一样,而对应的特征需要要具有固定的大小,因此该方法对各个候选区域分别使用POI Pooling, 其做法是:假设第 i 个候选区域ROI的大小 hi x wi, 要使输出的大小 h x w,那么就将该ROI分成 h x w 个格子,每一个格子的大小 (hi/h) x (wi/w), 然后对每一格子使用max-pooling得到大小 h x w 的特征图像。`


Fast R-CNN的第二点创意是把之前独立的三个步骤(特征提取、分类和回归)放到一个统一的网络结构中。该网络结构同时预测一个候选区域的物体类别该物体的边界框,使用两个全连接输出层分别进行类别预测边框预测(如下图所示),将这两个任务进行同时训练,利用一个联合代价函数

公式中的两项分别是 classification loss 和 regression loss。

使用VGG16作为特征提取网络,Fast R-CNN在测试图像上的处理时间比R-CNN快了200多倍,并且精度更高。如果不考虑生成候选区域的时间,可以达到实时检测。生成候选区域的Selective Search算法处理一张图像大概需要2s的时间,因此成为该方法的一个瓶颈。

三、Faster R-CNN

上面两种方法都依赖于Selective Search生成候选区域,十分耗时。考虑到CNN如此强大,Faster R-CNN提出使用CNN来得到候选区域。假设有两个卷积神经网络一个是区域生成网络,得到图像中的各个候选区域,另一个是候选区域的分类和边框回归网路。这两个网络的前几层都要计算卷积,如果让它们在这几层共享参数,只是在末尾的几层分别实现各自的特定的目标任务,那么对一幅图像只需用这几个共享的卷积层进行一次前向卷积计算,就能同时得到候选区域和各候选区域的类别及边框。

候选区域生成网络(Region Proposal Network, RPN 候选区域网络)如下,先通过对输入图像的数层卷积得到一个特征图像,然后在特征图像上生成候选区域。它使用一个 n x n(n=3)的滑动窗口,将局部的特征图像转换成一个低维特征, 预测 k 个的区域(cls层,2k 个输出)是否为候选区域和对应的 k 个边框(reg层,4k 个输出)。这里的k 个区域被称为锚(anchor), 对应着与滑动窗口具有相同的中心的不同大小和不同长宽比的矩形框。假设卷积后的特征图像大小为 W x H ,那么一共 W x H x k 个锚。这种特征提取和候选区域生成的方法具有位移不变性

使用RPN得到候选区域后,对候选区域的分类和边框回归仍然使用Fast R-CNN。这两个网络使用共同的卷积层。 由于Fast R-CNN的训练过程中需要使用固定的候选区域生成方法,不能同时对RPN和Fast R-CNN使用反向传播算法进行训练。该文章使用了四个步骤完成训练过程:

  • 1、单独训练RPN;
  • 2、使用步骤中1得到的区域生成方法单独训练Fast R-CNN;
  • 3、使用步骤2得到的网络作为初始网络训练RPN;
  • 4、再次训练Fast R-CNN, 微调参数。

Faster R-CNN的精度和Fast R-CNN差不多,但是训练时间和测试时间都缩短了10倍。

四、Mask R-CNN

Faster R-CNN 在物体检测中已达到非常好的性能,Mask R-CNN在此基础上更进一步:得到像素级别的检测结果。 对每一个目标物体,不仅给出其边界框,并且对边界框内的各个像素是否属于该物体进行标记。

Mask R-CNN利用Faster R-CNN中已有的网络结构,再添加了一个头部分支,使用FCN每个区域做二值分割

Mask R-CNN还提出了两个小的改进使分割的结果更好。
第一:对各个区域分割时,解除不同类之间的耦合。假设有K类物体,一般的分割方法直接预测一个有K个通道的输出,其中每个通道代表对应的类别。而Mask R-CNN预测K个2个通道前景和背景)的输出,这样各个类别的预测是独立的。
第二:Faster R-CNN中使用ROI Pooling之前的取整操作使特征图中所使用的ROI与原图中ROI的位置不完全对应。在Fast和Faster R-CNN中,在使用ROI Pooling之前的特征图大小是原图的1/16。假设一个ROI在原图中的横坐标范围是w0 到w1 ,纵坐标范围是h0 到 h1 ,那么在特征图中该ROI的横坐范围是w0/16 到 w1/16 , 纵坐标范围是h0/16 到h1/16 , 取整得到[w0/16] ,[w1/16] , [h0/16] 和 [h1/16] 。这样会导致Pooling前的特征图中的ROI与原图中的ROI没有完全对齐。这不会对分类和边框回归造成大的影响,但是会影响分割的结果,因为没有保持空间对应关系。Faster R-CNN 不取整,使用双线性插值得到 与原图中ROI对应的特征图中的区域,保留坐标的对应关系,该方法称作 ROIAlign .

五、拓展

1、FCN

FCN,也就是Fully Convolutional Network。 更多详细内容[参考])(https://zhuanlan.zhihu.com/p/22464571)
这里面所谓的不包含全连接层,实际上并不是标榜自己没有全连接层,而是为了保证计算过程中每一层数字的相对位置。在我们通常的印象中,全连接层需要把本来立体的图像拍平,这样原本存在的空间特性将被抹掉。为了确保我们识别出来的类别能和原来每一个像素点的位置对上,我们不能粗暴地把中间数据拍平,这也是网络中不使用全连接层的原因。

我们可以利用常规的分类CNN网络得到一个接近最终结果的中间层,这样层的数据往往已经可以代表了一些具有特定含义的特征,而不再像原始的像素亮度那样含义晦涩。因此我们可以从这样的信息出发得到一些分类信息,然后把这些分类信息重新映射到原始图片大小的区域上。

由于中间层的维度比原始图像小,那么恢复到原始大小必然意味着一些插值的工作。一旦使用了插值的算法(比方说bilinear),那么恢复的图像的精度一定会出现问题。所以大神们也曾经担心过这个问题。于是他们也想出过一些其他的方法。这些方法的特点就一条——维度不缩小!

https://zhuanlan.zhihu.com/p/22976342 #介绍用FCN进行语义分割




♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠

从R-CNN到Mask R-CNN相关推荐

  1. 给定两个数r和n_输出r的n次方 java_滴滴出行2018编程题

    [编程题] CIDR去重 时间限制:1秒 空间限制:65536K 无类别域间路由(CIDR)是一个用于对IPV4地址进行分类表述的方法.CIDR 路由描述的IP地址组的子网mask长度是可变长度, 例 ...

  2. Microsoft R 和 Open Source R,哪一个才最适合你?

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. R 是一个开源统计软件,在分析领域普及的非常快. 在过去几年中,无论业务规模如何,很多公司都采 ...

  3. 启动R环境并执行R脚本

    启动R环境并执行R脚本 # 打开window系统本身的cmd或者anaconda prompt # 输入R,就会进入R console环境: R可以用'demo()'来看一些示范程序,用'help() ...

  4. r语言线性回归_(R语言)线性回归:机器学习基础技术

    线性回归: 使用最小二乘法预测定量的结果的一种回归模型. Anscombe数据集 它由统计学家弗朗西斯·安斯库姆(Francis Anscombe)建立,用来强调数据可视化和异常值在数据分析中的重要性 ...

  5. r语言必学的十个包肖凯_30 天学会R DAY 14:R语言必学包dplyr

    原标题:30 天学会R DAY 14:R语言必学包dplyr 第14天 R语言必学包dplyr R语言非常讲究数据的整理,我们在7-13天的R语言学习内容中,着重都是关于R语言的整理,各种方法对数据进 ...

  6. 【数据分析R语言系列】R和RStudio的下载和安装, R在 Ubuntu 和CentOS 系统下的安装

    文章目录 准备工作 R 的下载和安装 RStudio 的下载和安装 配置(可选) 常见问题与方案 R 在 Linux 系统下的安装 Ubuntu 从源安装 R CentOS 从源安装 R Rtools ...

  7. 生活中回归分析实际例子_回归分析中R方和调整R方的区别

    介绍 当我开始我的数据科学之旅时,我探索的第一个算法是线性回归. 在理解了线性回归的概念和算法的工作原理之后,我非常兴奋地使用它并在问题陈述中做出预测.我相信你们大多数人也会这么做的.但是一旦我们建立 ...

  8. r语言代码html,R语言学习笔记-内附实例及代码

    R语言入门 R是开源的统计绘图软件,也是一种脚本语言,有大量的程序包可以利用. R中的向量.列表.数组.函数等都是对象,可以方便的查询和引用,并进行条件筛选. R具有精确控制的绘图功能,生成的图可以另 ...

  9. 在$x_0$处全导数可逆的函数$f:\mathbf{R^n}\to\mathbf{R^n}$的一个性质

    注:该文章宣布报废,因为结论是错误的.关键的错误证明已经用红字显示.我是看了matrix67的函数上某一点导数为正,该点邻域不一定形成单增区间才想起自己的错误的. 设$f:\mathbf{R}^n\t ...

  10. 8.编写程序,要求如下: 定义名为VolumeArea的抽象类,在其中定义圆周率的值为3.14159,并定义两个抽象方法volume(double r)和area(double r),它们的返回

    8.编写程序,要求如下: 定义名为VolumeArea的抽象类,在其中定义圆周率p的值为3.14159,并定义两个抽象方法volume(double  r)和area(double  r),它们的返回 ...

最新文章

  1. 将批注用于类型化 DataSet (摘自MSDN)
  2. 有一种灾难,叫数据中心被大火烧了
  3. 2019年总结 | 31岁,不过是另一个开始
  4. day30,网络编程和各种协议
  5. 我的十年创作之路(三)——书稿创作经验谈
  6. [导入]表单确认按钮——Javascript函数
  7. Atitit 数据库表文档生成解决方案
  8. Extjs EditorGridPanel
  9. 2022年第十九届五一数学建模竞赛 C题 火灾报警系统问题
  10. SpringBoot整合Elasticsearch之索引,映射,文档,搜索的基本操作案例分析
  11. 解决手机不能设置DeviceOwner权限提示already provisioned问题
  12. 安卓手机存储卡使用技巧。
  13. 720°VR全景网站制作
  14. 笔试 | 数字IC设计之1bit的半加器、全加器实现
  15. Android Automotive车载嵌入式系统
  16. 百面机器学习和百面深度学习-测试1
  17. 解决ubuntu下外接2k显示器却无法调2k分辨率问题
  18. 最近在读的一些文章-2019.1
  19. MySQL语句性能优化
  20. 智百威收银系统服务器,智百威商业连锁管理系统果蔬版

热门文章

  1. MySql第几行到第几行语句
  2. identifier starts immediately after numeric literal
  3. 简单的表单提交 by MVC 2
  4. 自学编程是从python语言还是c语言开始-初中生想学编程,请问先学C语言好还是先学Python?...
  5. python项目归纳总结-python总结七
  6. python计算机二级含金量-计算机二级 Python 怎么考?考什么?
  7. 用python绘制柱状图标题-Python笔记:用Python绘制炫酷的柱形图
  8. python自学用什么书好-适合python基础学习的好书籍
  9. python中文编码-python中文编码json中文输出问题
  10. python读取txt文件内容-python读取压缩包里面所有*.txt文件的内容