本文主要是介绍卷积神经网络在图像分割中的进化史:从R-CNN到Mask R-CNN,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
转自量子心
卷积神经网络(CNN)不仅能用来对图像进行分类,还在图像分割任务重有着广泛的应用。
DhruvParthasarathy就职于Athelas,一家专注于深度学习技术的医疗健康公司。他在Medium上发布了一篇博客文章,介绍了在具体的图像分割任务中如何应用卷积神经网络,来得到更好的效果。
以下内容编译自Parthasarathy文章:
自从深度学习鼻祖Geoff Hinton与他的研究生Alex Krizhevsky和Ilya Sutskever在2012年ImageNet大规模视觉识别挑战赛中获得冠军,卷积神经网络(CNN)已经成为了图像分类的黄金标准。从那时起,卷积神经网络一直在改进,现在已经在辨别ImageNet数据集的1000类日常对象上超过人类了。
虽然网络分类结果令人感到欣喜,但在人类真实生活中的视觉理解要远比图像分类复杂多样。
在分类任务中,一张图像通常只具有单个焦点对象,任务是说出这个对象的类别。但是在实际的世界中,我们会看到往往不止一个物体对象,这是一项更复杂的任务。
在一个复杂的情景中,通常有多个互相重叠的对象和不同的背景,我们不仅要对这些不同的对象分类,而且也要识别对象间的边界、差异和彼此的关系。
卷积神经网络可以帮助我们处理这个复杂的任务吗?对于更复杂的图像,我们可以使用卷积神经网络来区分图像中的不同对象及其边界吗?Ross Girshick和他的同事们用最近几年的研究工作,给出了一个肯定的答案。
本文目标
这篇文章将会介绍一些用于对象检测和图像分割的主流技术,并了解其网络状态的演化过程。
具体来说,我们将介绍首先解决了这个问题的R-CNN网络,以及后来发展出来的Fast R-CNN和Faster R-CNN。另外,我们还将介绍Mask R-CNN网络,这是FacebookResearch组最近发布的一篇文章,其扩展了这种对象检测技术,且提供了像素级分割的技术。以下是这篇文章所引用的论文:
1. R-CNN:https://arxiv.org/abs/1311.2524
2. Fast R-CNN:https://arxiv.org/abs/1504.08083
3. Faster R-CNN:https://arxiv.org/abs/1506.01497
4. Mask R-CNN:https://arxiv.org/abs/1703.06870
2014年:R-CNN - 将CNN用于对象检测的起源
受到多伦多大学Hinton实验室研究工作的启发,加州大学伯克利分校Jitendra Malik教授领导的团队,提出了一个在如今看来好像是不可避免的问题:
能否将Krizhevsky等人提出的网络模型泛化应用到对象检测上?
对象检测技术是一项通过标出图像中不同对象并对其进行分类的任务。在对象检测挑战赛PASCAL VOC上,由Ross Girshick,Jeff Donahue和Trevor Darrel组成的这个团队,发现这个问题可以通过Krizhevsky的研究成果来进行解决。
他们写道:
这篇论文首先说明一个事实,与基于更简单的用方向梯度直方图(HOG)类特征构建的系统相比,卷积神经网络可以显着提高PASCAL VOC上的对象检测性能。
接下来,我们将会深入了解他们的Regions WithCNNs (R-CNN)架构是如何运作的。
理解R-CNN
R-CNN的目标是分析图像,并正确识别图像中主要对象,通过边界框标出对象的具体位置。
输入:图像
输出:图像中每个对象的边界框和标签
但是我们如何确定这些边界框的大小和位置呢?R-CNN网络通过以下操作完成了一个我们直观上可以完成的任务:在图像中提出了多个边框,并判断这其中的任何一个是否对应着一个具体对象。
R-CNN网络使用了选择性搜索的方法,来创建这些边界框或区域建议(region proposal)。在图6中,选择性搜索通过不同大小的边框分析图像,并且对于每个图像块,尝试通过纹理、颜色或强度将相邻像素组合在一起,以识别对象。
想深入了解选择性搜索,请阅读:
http://www.cs.cornell.edu/courses/cs7670/2014sp/slides/VisionSeminar14.pdf
创建了区域建议后,R-CNN网络将该区域块变形标准的方形,并将其输入到改进版的AlexNet网络,具体步骤如图7所示。AlexNet是在ImageNet 2012比赛中的最优网络,R-CNN灵感就来源于它。
在CNN的输出层,R-CNN网络还应用了支持向量机(SVM)的方法,它能够判断该图像是否为对象,以及是什么对象。
改善边界框
现在,我们已经能在边界框中找到对象,但是还能缩小边界框来适应对象的真实尺寸吗?可以的,这就是构建R-CNN网络的最后一个步骤。R-CNN网络对区域建议进行简单的线性回归操作,来获得更贴近的边界框坐标,获得了R-CNN网络的最终输出结果。回归模型的输入和输出分别为:
输入:与对象相对应的图像子区域。
输出:子区域中对象的新边界框坐标。
所以,R-CNN网络总结为以下几个步骤:
1. 为边界框生成一组区域建议;
2. 通过预先训练好的AlexNet网络来判断边框中的图像是否为有效区域,最后通过支持向量机算法来确定边框中的图像类别;
3. 在确定边框图像的类别后,应用线性回归模型,来输出更紧密的边框坐标。
2015年:Fast R-CNN - 加速并简化R-CNN
R-CNN网络的性能很好,但是实际上训练起来很慢,有以下几个原因:
1. 单个图像的每个区域建议都需要利用AlexNet网络进行判断,每次判断大约需要2000次前向传播。
2. 此网络必须单独训练三种不同的模型:提取图像特征的CNN网络,判断类别的分类器和缩小边框的回归模型。这样子很难训练这些网络。
2015年,R-CNN网络的第一作者Ross Girshick解决了这两个问题,发明了新的网络Fast R-CNN。现在我们来了解Fast R-CNN网络的主要创新点。
创新点1:引入感兴趣区域池化(ROI Pooling)
在CNN的前向传递过程中,Girshick意识到,每个图像的多个区域总是互相重叠,导致我们多次运行相同的CNN计算,多达2000次。他的创新很简单:可不可以对每个图像只运行一次CNN运算,然后在2000次前向传播过程中找到一种共享这个计算结果的方法?
这正是Fast R-CNN网络用感兴趣区域池化(RoIPool,Region ofInterest Pooling)技术所做的创新。其创新点在于,RoIPool层共享了CNN网络在图像子区域中的前向传播过程。在图9中,是从CNN的特征图谱中选择相应的区域来获取每个区域的CNN抽象特征。然后,通常使用最大池化操作来合并每个区域中的初级抽象特征。所以我们只进行了原始图像的一次前向传播操作,而不是2000次。
创新点2:将所有模型整合到一个网络中
Fast R-CNN的第二个创新点是在一个模型中联合训练卷积神经网络、分类器和边界框回归模型。在R-CNN中,我们使用了卷积神经网络来提取图像特征,用支持向量机来分类对象和用了回归模型来缩小边界框,但是Fast R-CNN使用单个网络模型来实现以上三个功能。
图10是Fast R-CNN网络的过程示意图。Fast R-CNN在CNN输出层用softmax函数代替了SVM分类器,来输出对象类别。同时在CNN输出层,还加入了用来输出边界框坐标的线性回归层。这样单个网络就可以输出所需信息。
整个模型的输入和输出分别为:
输入:带多个区域建议的图像。
输出:具有更紧密边界框的每个区域的对象类别。
2016年:Faster R-CNN - 加快区域建议
即使Fast R-CNN的性能有了很大的改善,但是仍然存在一个短板——区域建议生成方式(region proposer)。在上面已经提到,为了检测图像中对象位置,第一步是要产生一系列随机多尺度的边界框或是待测试的感兴趣区域。在Fast R-CNN中,通过选择性搜索方法创建这些区域,这是一个相当缓慢的过程,被认为是整个流程的短板。
在2015年中期,由任少卿,何恺明,Ross Girshick和孙剑组成的一个微软研究院团队发现了一种叫做“Faster R-CNN”的网络结构,几乎把边框生成过程的运算量降为0。
FasterR-CNN的创新点在于,区域建议取决于通过CNN里的第一个卷积层前进传播过程中的图像特征。那为什么不对单独运行选择性搜索算法的方式进行改变,重复利用多个区域建议中相同的CNN结果呢?
这正是Faster R-CNN团队所取得的成果。图12中解释了该如何使用单个CNN网络来实现区域建议和对象分类。这样,只需要训练一个CNN网络,我们几乎不花费计算量获得了所需的区域建议。作者在文章中写道:
我们观察到,Fast R- CNN网络里区域检测器所使用的卷积特征图谱,也可用于生成区域建议,从而把区域建议的运算量几乎降为0。
该模型的输入和输出分别为:
输入:图像(不需要带有区域建议)。
输出:图像中对象的类别和边界框坐标。
如何生成区域
接下来我们来看下Faster R-CNN如何从CNN特征中生成这些区域建议。Faster R-CNN在CNN特征的顶部添加了一个完全卷积网络(FCN),创建了所谓的区域建议网络(Region Proposal Network)。
区域建议网络通过在CNN特征图谱上依次滑动窗口,并在每个窗口中输出k个可能的边界框和分值,来评估这些边界框包含对象的可能性。这k个边框代表了什么?
直观上,我们知道图像中的对象应该符合某些常见的纵横比和大小。例如,我们想要创建一些适合人类形状的矩形框。这样当遇到非常窄的边界框时可以排除是人类对象的可能性。以这种方式,我们创建大小为k的通用长宽比,称为锚点盒(anchor box)。对于每个这样的锚点盒,我们对应输出一个边界框坐标和每个位置的分值。
考虑到这些锚点盒,这个区域建议网络的输入和输出分别为:
输入:CNN特征图谱。
输出:每个锚点的边界框。该边界框中的图像作为对象的可能性用输出分值表示。
然后,我们只将每个可能是目标对象的边界框传递到Fast R-CNN中,以实现对象分类和缩紧边界框。
2017年:Mask R-CNN - 扩展Faster R-CNN用于像素级分割
到目前为止,我们已经了解到如何能够以许多有趣的方式使用CNN特征,来有效地用边界框定位图像中的不同对象。
我们可以进一步扩展这些技术,定位到每个对象的精确像素,而不是仅限于边框吗?这个问题就是经典的图像分割问题。何恺明和Girshick等研究人员,在Facebook人工智能研究部门里使用了一种被称为Mask R-CNN的网络结构来探索这个问题。
和Fast R-CNN、Faster R-CNN很相似,Mask R-CNN的基本思想是简单直观的:Faster R-CNN在物体检测上效果很好,那么我们能否将其扩展并应用到像素级分割?
MaskR-CNN通过向Faster R-CNN网络添加一个分支来输出一个二进制掩码,来说明给定像素是否为对象的一部分。在图17中的白色分支仅仅是CNN特征图谱上的完全卷积网络。
该模型的输入和输出分别为:
输入:CNN特征图。
输出:在像素属于对象的所有位置上都具有1s的矩阵,其他位置为0s,这种规则被称为二进制掩码。
但Mask R-CNN网络的作者不得不进行一次小小的调整,使这个训练按预期往前推进。
RoiAlign:重新对齐RoIPool,使结果更准确
Mask R-CNN作者发现,在最初的Faster R-CNN网络结构中, RoIPool所选择的特征图谱区域与原始图像的区域略微不对齐。由于图像分割需要像素级特异性,与边框确定过程不同,这自然就导致了不准确。
作者通过调整RoIPool方法,实现更准确的对齐,巧妙地解决了这个问题,这个调整后的方法叫做RoIAlign方法。
假设我们有一个尺寸大小为128x128的图像和大小为25x25的特征图谱。如果我们想要在特征图谱中表示原始图像中左上角15x15像素的区域,该如何从特征图中选择这些像素?
我们知道原始图像中的每个像素对应于特征图谱中的25/128个像素。要从原始图像中选择15像素,我们就在特征图谱中选择15*(25/128)=2.93个像素。
在RoIPool中,我们会舍弃小数点后的部分,只选择2个像素,导致轻微的错位。然而,在RoIAlign中,我们避免了这样的舍弃。相反,我们使用双线性插值来精确地得到这2.93像素中的信息。这样子在很大程度上避免了RoIPool方法造成的像素错位。
MaskR-CNN在生成这些掩码后,将它们与Faster R-CNN输出层的对象类别和边界框组合起来,产生了奇妙的精确分割。
未来展望
在过去短短的3年时间里,我们看到了对图像分割问题的研究,是如何从Krizhevsky等人的R-CNN,经过不断发展,最后得到Mask R-CNN的奇妙分割效果。
单独来看,Mask R-CNN所呈现的结果似乎是无法达到的巨大飞跃。然而,我希望大家通过这篇文章可以认识到,这些成果,实际上由多年来辛勤工作和团队合作带来的直观、渐进式提升累积而来。R-CNN、Fast R-CNN、Faster R-CNN和最终的Mask R-CNN,每个想法并不一定都是跨越式的进步,但是叠加这些进步后,最终的Mask R-CNN却带来了非常显著的奇妙效果,使目前的计算机视觉技术向人类的视觉能力更靠近了一些。
让我感到特别兴奋的是,从R-CNN网络进化到Mask R-CNN网络,一共只用了三年时间。随着更多的资金、更多的关注和更多的支持,计算机视觉在三年后会有怎样的进展呢?让我们拭目以待。
如果想更深入了解CNN在图像分割中的进展,极其背后的原理,别忘了我们在文章开头提到的这四篇论文:
1. R-CNN:https://arxiv.org/abs/1311.2524
2. Fast R-CNN:https://arxiv.org/abs/1504.08083
3. Faster R-CNN:https://arxiv.org/abs/1506.01497
4. Mask R-CNN:https://arxiv.org/abs/1703.06870
以及文中提到的选择性搜索:
http://www.cs.cornell.edu/courses/cs7670/2014sp/slides/VisionSeminar14.pdf
这篇关于卷积神经网络在图像分割中的进化史:从R-CNN到Mask R-CNN的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!