微信号:bit_tiger

介绍:“有趣,有用,有效”.刷项目,做实战,捅破技术的那层纸.

一文看懂近年火到不行的CNN图像识别:从R-CNN到Mask R-CNN

2018-08-09 02:26 翻译作品

近年来,CNN在图像识别领域大显身手,最近的表现甚至已经比人类更胜一筹。当然了,能有这样的成就一定不是一蹴而就的,今天我们就来看看CNN图像识别的发展简史。本文翻译自Athelas博客文章,本文原作者为Dhruv Parthasarathy。这篇文章在Medium上获得了5000多个赞,英文原文链接可在底部看到。


卷积神经网络(Convolutional Neural Networks, CNNs)在Athelas中除了用于解决分类问题,还在很多地方有着广泛应用。本文主要介绍如何CNNs在图像实例分割中起到的巨大作用。


自从2012年Alex Krizhevsky,Geoff Hinton和Ilya Sutskever在ImageNet挑战赛获胜以来,CNNs已经成为图像分类的黄金标准。此后CNN不断优化,现在在ImageNet挑战赛中的表现甚至超过了人类的水平。



在ImageNet挑战赛中,CNN的表现已经比人类的更胜一筹,上图中Y轴表示错误率。虽然这些成果令人震惊,但图像分类相对于人类视觉理解的复杂性和多样性来说还算是不足的。



分类挑战中使用的图像示例。这个图像里只有一个物体,需要关注的是怎样把它完整地框起来。在分类中,通常一个图像只关注一个目标,任务是分辨出那个图像是什么(如上面)。但当我们观察周围的世界时,我们需要处理更复杂的情况。



现实生活中的景象通常是由许多不同的、重叠的物体、背景和动作组成的。


我们看到复杂的景象,有许多重叠的物体和不同的背景,我们不仅能分辨这些不同的物体,而且还识别它们的边界、差异和它们相互之间的关系!


在图像分割中,我们的目标是对图像中的不同对象进行分类,并识别它们的边界。来源:Mask R-CNN paper。


CNNs能否帮助我们完成如此复杂的任务?也就是说,给出一张复杂的图像,能否利用CNNs识别图像中的不同目标以及他们的边界呢?Ross Girshick和他的同事近几年的研究表明,答案是肯定的!


本文目标


本文主要介绍目标检测和分割中所用到的主要技术背后的知识以及这些技术的演进过程,特别是R-CNN(Regional CNN,CNN最早应用于检测和分割问题的方法)及其衍生出来的Fast R-CNN和Faster R-CNN,最后我们会介绍Mask R-CNN,它是Facebook Research发表的一篇论文中提出的,把目标检测问题扩展到像素级分割。本文中引用的论文如下:

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(CNNs在目标检测中的早期应用)


目标检测算法(如R-CNN)识别图像中主要物体的位置和类别,来源:https://arxiv.org/abs/1311.2524。


受多伦多大学Hinton实验室研究成果的启发,加州大学伯克利分校Jitendra Malik教授带领的小团队提出了一个不可避免的问题:如何将Krizhevsky等人的成果扩展到目标检测?


目标检测从图像中找到不同的物体并对其进行分类(如上图所示)。Ross Girshick(后续会再次出现的人名)、Jeff Donahue和Trevor Darrel的团队发现了可以借助Krizhevsky的研究成果解决并在PASCAL VOC挑战赛(一个类似于ImageNet的目标检测挑战赛)中进行测试的方法。他们的论文中提到:与基于更简单的HOG-like特性的系统相比,本文首次证明了在PASCAL VOC挑战赛中,CNN可以显著提高目标检测性能。


接下来我们一起了解一下Regions CNN(R-CNN)工作的架构。


了解R-CNN


R-CNN的目标是借助边界框(Bounding Box)获取图像,并正确地识别图像中的主要对象:

- 输入:图像

- 输出:图像中每个物体的边界框+ 标签


如何找出边界框的位置呢?R-CNN采用我们直觉上会做的方式:给出一堆图像可能的框,然后判断这些框是否和物体对应。


选择性搜索(Selective Search)方法通过不同尺寸的窗口的滑动寻找相近纹理、颜色或亮度的相邻像素。来源:https://www.koen.me/research/pub/uijlings-ijcv2013-draft.pdf。


R-CNN采用选择性搜索的方法给出边界框或者区域建议(region proposal)。换个角度看,选择性搜索通过不同尺寸的窗口在图像中进行滑动(如上图所示),对于每个尺寸方法都试图通过纹理、颜色或亮度将邻近的像素聚合在一起,实现对物体的识别。

生成一组区域建议之后,R-CNN采用改进后的AlexNet判断这些区域建议是否是有效的区域。来源:https://arxiv.org/abs/1311.2524。


生成一组区域建议之后,R-CNN将这些区域变换为标准的方形尺寸并采用改进后的AlexNet判断这些区域建议是否是有效的区域,如上图所示。


在CNN的最终层,R-CNN增加了支持向量机(Support Vector Machine, SVM),用于简单判断区域中是否包含目标以及它是什么(就像上图中的第4步)。


调整边界框


现在已经找到框中的物体,接下来能否调整边界框,使其更贴近物体的真实范围呢?当然,这也是R-CNN的最后一步,R-CNN对区域建议进行简单的线性回归,从而生成调整后的边界框并作为最终结果。回归模型的输入和输出如下:

- 输入:物体在图像中的子区域(sub-region)

- 输出:子区域中物体的新边界框坐标


小结一下,R-CNN的步骤如下:

- 为边界框生成一组区域建议;

通过受过训练的AlexNet和后面的SVM判断边界框中对应的图像是什么;

对已分类的边界框进行线性回归,输出这些框对应的更加贴近的坐标。


2015: Fast R-CNN(针对R-CNN进行提速和简化)


Ross Girshick提出了R-CNN和Fast R-CNN。他在Facebook Research继续推动计算机视觉(Computer Vision)的发展。


R-CNN效果非常好,但是效率太低了,主要的原因:

- 需要对每个图像的每个区域建议进行CNN (AlexNet)前向传播(forward pass),每个图像大约2000次前向传播。

必须分别训练三个不同的模型——CNN来生成图像特征,分类器来预测类别,回归模型来收紧边框。这使得所有模型极其难以很好地训练。


2015年,R-CNN的作者Ross Girshick解决了上述两个问题,并提出了Fast R-CNN的方法,接下来介绍一下Fast R-CNN。


Fast R-CNN改进点一:感兴趣区域池(Region of Interest Pooling/RoIPool)


Ross Girshick发现,对于CNN的前向传播,每张图像的很多区域建议总是重叠的,从而导致重复的CNN前向传播(可能达到2000次)。他的想法非常简单——为什么不让每张图像只计算一次CNN,然后在2000个区域建议中找到一种方法来分享计算结果呢?


在RoIPool方法中,进行一次完整的前向传播并从前向传播结果中提取每个感兴趣区域的conv特征。来源:Stanford’s CS231N slides by Fei Fei Li, Andrei Karpathy, and Justin Johnson。


RoIPool(Region of Interest Pooling)就是Fast R-CNN解决重复计算问题的方法。这个方法的核心是RoIPool把图片CNN前向传播结果分享给子区域。如上图所示,需要注意的是如何从CNN特征图(CNN Feature Map)中选择一个对应的区域来获取每个区域的CNN特征。接下来对每个区域的特征进行池化(pooled)操作(一般采用最大池化,max pooling)。这样的话我们只需要一次原始图像的CNN前向传播,而不是2000次!


Fast R-CNN改进点二:将所有模型整合到一个网络中


Fast R-CNN将CNN、分类器和边界框线性回归融合到一个单独的网络中。来源:https://www.slideshare.net/simplyinsimple/detection-52781995。


Fast R-CNN第二个改进点是将CNN、分类和边界框线性回归的训练融合到单一模型中。之前我们有不同的模型来提取图像特征(CNN)、分类(SVM)和收紧边界框(回归),而Fast R-CNN则使用单一的网络计算这三个。


您可以在上图中看到融合是如何实现的:Fast R-CNN采用CNN上层的softmax 层取代了SVM分类器来输出类别。它还增加了一个平行于softmax层的线性回归层,以输出边界框坐标。这样,所有需要的输出都来自一个网络!以下是这个整体模型的输入和输出:

- 输入:带区域建议的图像

- 输出:每个区域的目标分类以及更紧密的边界框


2016: Faster R-CNN(针对区域建议提速)


经过上述的改进,Fast R-CNN仍然存在一个瓶颈——区域建议。正如我们所看到的,检测目标位置的第一步是生成一堆要测试的潜在边界框或感兴趣区域。在Fast R-CNN中,这些建议是通过选择性搜索产生的,但这是一个相当缓慢的过程,是限制Fast R-CNN效率的主要瓶颈。


Jian Sun是微软研究院的首席研究员,他带领的研究团队提出了Faster R-CNN。来源: https://blogs.microsoft.com/next/2015/12/10/microsoft-researchers-win-imagenet-computer-vision-challenge/#sm.00017fqnl1bz6fqf11amuo0d9ttdp


2015年年中,由Shaoqing Ren, Kaiming He, Ross Girshick和Jian Sun组成的微软研究团队提出了新方法,使得区域建议变得非常高效,他们将这种方法命名为“Faster R-CNN”。


Faster R-CNN的想法来源于区域建议的特征计算依赖于图像的特征,这些特征已经通过CNN的前向传播(分类的第一步),那么为何不重用这些相同的CNN特征进行区域建议,从而取代单独的选择性搜索呢?


Faster R-CNN方法中采用一个单独的CNN进行区域建议和分类。来源:Towards Real-Time Object Detection with Region Proposal Networks。


实际上,这就是Faster R-CNN方法的最大的改进。上图展示了一个单独CNN完成区域建议和分类的过程。只需要这样训练一个CNN,区域建议的计算成本基本可以忽略。提出团队这么描述Faster R-CNN:我们的观察是基于区域的探测器(如Fast R- CNN)所使用的卷积特征图也可以用于生成区域建议(从而实现几乎无成本的区域建议)。


模型的输入和输出如下:

- 输入:图像(不需要区域建议)

- 输出:图像中物体的类别及其对应的边界框坐标


区域是如何产生的


接下来看一下Faster R-CNN如何从CNN特征中生成这些区域建议。Faster R-CNN在CNN的功能上增加了一个全卷积网络,即区域建议网络(Region Proposal Network)。


区域建议网络滑动CNN特征上的窗口,对于每个窗口的位置,网络在每个锚点输出一个分数和一个边界框(因此有4k个框坐标,k是锚点的个数)。来源:https://arxiv.org/abs/1506.01497


区域建议网络在CNN特征图上和每个窗口上通过一个滑动窗口来工作,输出k个潜在的边界框和分数并根据这些框的预期好坏。那么这k个框代表什么?


我们知道,人的边界框往往是矩形和垂直的。我们可以利用这种直觉通过创建这样维度锚来指引我们的区域建议网络。

图片来源:http://vlm1.uta.edu/~athitsos/courses/cse6367_spring2011/assignments/assignment1/bbox0062.jpg


直觉上,我们会认为图像中的物体应该符合一定的长宽比和尺寸,比如人的形状一般是是矩形框。类似地,我们一般也不会关注那些非常窄的框。据此,我们构建了k个这样的常见的长宽比,并称作锚点框(anchor boxes)。每个锚点框输出边界框和图像中每个位置的得分。


考虑这些锚点框,区域建议网络的输入和输出如下:

- 输入:CNN特征图

- 输出:每个锚点对应一个边界框。分数表示边界框中对应图像部分是物体的可能性。


然后我们将每个这样很可能是一个目标的边界框传递到Fast R-CNN来生成类别并收紧边界框。


2017: Mask R-CNN(把Faster R-CNN扩展到像素级分割)


图像实例分割的目标是识别场景中像素级的目标。来源:https://arxiv.org/abs/1703.06870。


至此,我们已经看到了如何以许多有趣的方式使用CNN特性来有效地用边界框定位图像中的不同物体。


我们是否可以扩展这些技术,使其实现定位每个物体的精确像素,而不仅仅是边界框?这个问题被称为图像分割(image segmentation),这一个包括Kaiming He、Girshick等人的研究团队在Facebook AI上使用一种名为Mask R-CNN的架构进行的探索。


Kaiming He是一个Facebook AI的研究人员,主导了Mask R-CNN,同时他也是Faster R-CNN的合作者之一。


类似于Fast R-CNN和Faster R-CNN,Mask R-CNN的灵感来源也是很直接的,鉴于Faster R-CNN在目标检测中的效果,我们是否可以将其扩展到像素级的图像分割中呢?


Mask R-CNN在Faster R-CNN的CNN特征的上层增加一个全卷积网络(Fully Convolutional Network,FCN)用于生成mask(分割输出结果)。这与Faster R-CNN中的分类和边界框回归网络的并行的。来源:https://arxiv.org/abs/1703.06870


Maks R-CNN在Faster R-CNN的基础上增加一个分支实现的,这个分支用于输出一个Binary Mask,表示给定像素是否属于目标的一部分。上述分支(上图中白色部分)就是一个置于CNN特征图上层的全卷积网络。它的输入和输出如下:

- 输入:CNN特征图

- 输出:在当前像素属于目标的所有位置上为1s 的矩阵,其他位置为0s(这被称为binary mask)


但是Mask R-CNN的作者做了少量调整使得流程按预期工作。


RoiAlign - 调整RoIPool使它更加准确


用RoIAlign取代RoIPool对图像进行传递,从而使得RoIPool选择区域的特征图与原始图像对应更加精确,这是必需的,因为是像素级的分割比边界框需要更细粒度的对齐。来源:https://arxiv.org/abs/1703.06870


在没有对原始的Faster R-CNN架构进行修改前,Mask R-CNN的作者意识到,由RoIPool选择的特征图的区域与原始图像的区域稍有偏差。与边界框不同,图像分割需要像素级的特征,少量的偏差自然会导致不准确。作者通过巧妙地采用RoIAlign的方法调整RoIPool,使之更精确地对齐,从而解决了这个问题。


如何将原始图像的感兴趣区域和特征图精确对齐?


假设有一个128x128的图像和一个25x25的特征图。如果我们想要在原始图像中左上角的15x15像素区域映射到特征图中。我们如何从特征图中选择这些像素呢?


我们知道原始图像中的每个像素对应于特征图中的~ 25/128个像素。要从原始图像中选择15个像素,我们只需选择15x25/128 ~= 2.93个像素。


在RoIPool中,我们将对其进行四舍五入,并选择3个像素(译者注:原文为2个像素,应当是原作者笔误),从而导致轻微的不对齐。然而,在RoIAlign中,我们避免了这样的四舍五入。相反,我们使用双线性插值(bilinear interpolation)来一个精确的值,即2.93。这是能够避免RoIPool造成的不对齐的原因。


这些mask生成后,Mask R-CNN将它们与Faster R-CNN的分类和边界框结合在一起,得到精确的分割:


Mask R-CNN能够对图像中的目标进行分割和分类。来源:https://arxiv.org/abs/1703.06870


源码


如果你有兴趣自己试验一下这些算法,这里是相关的源码库:

Faster R-CNN

- Caffe: rbgirshick/py-faster-rcnn

- PyTorch: longcw/faster_rcnn_pytorch

- MatLab: ShaoqingRen/faster_rcnn

Mask R-CNN

- PyTorch: felixgwu/mask_rcnn_pytorch

- TensorFlow: CharlesShang/FastMaskRCNN


展望


在短短3年时间里,我们已经看到研究社区如何从Krizhevsky的早期成果到R-CNN,一直到Mask R-CNN这样强大的结果。像Mask R-CNN这样的成果看起来是巨大的飞跃,难以企及。然而,通过这篇文章,我希望大家已经看到这些进步如何通过多年的努力和合作实现,每一次的进步实际上是有迹可循和循序渐进的。R-CNN、Fast R-CNN、Faster R-CNN以及Mask R-CNN的提出,每个想法都不是跳跃的,但共同努力的产物已经产生了非常显著的成果,使我们更接近人类水平的视觉。


让我特别兴奋的是,从R-CNN演进到Mask R-CNN的时间只有三年!通过持续的资金、关注和支持,未来三年计算机视觉能够取得多大的提升?


亲自上手实战CNN


对CNN感兴趣?不如跟着拥有十余年数据科学领域经验的Stephen老师一起线上解析代码,亲自上手搭建一个属于你的CNN应用!本活动完全免费!


项目主题:老板接近就自动切屏的深度学习应用如何实现?


核心技术点:深度学习,CNN,OpenCV


主讲嘉宾:Stephen,Fortinet高级数据科学家,前IBM资深软件研发工程师,拥有十五年在深度学习与数据科学领域的工业界经验。


美西时间 8月13日 周一 07:00 PM

北京时间 8月14日 周二 10:00 AM


扫码报名或点击阅读原文报名⤴️



原文链接:

https://blog.athelas.com/a-brief-history-of-CNN-in-image-segmentation-from-r-cnn-to-mask-r-cnn-34ea83205de4

 
BitTiger 更多文章 转专业学Coding怎么会这么难? 你不可不知的UX设计师养成秘籍 如何用最通俗易懂的方式解释API是什么? 假如LinkedIn只是一个像模拟人生一样的游戏…… Airbnb Head of Data Science:一文带你看懂数据科学
猜您喜欢 .NET英文技术文章导读(2017-03-23) WXCOP技术沙龙 产品经理专场 4月23日 第十九期 上海站 “垂死项目”复活记(长文) 高逼格!程序猿睡前发「73 76 79 86 85」 女孩熬夜破解..竟是表白 WEB调试工具-内网穿透利器