这篇blog是我刚入目标检测方向,导师发给个人文献导读,深刻浅出总结了object detection two-stage流派Faster R-CNN的发展史,读起来很是有趣。我一直想翻译这篇博客,在知乎上发现已经有人作过了,并且翻译的很好,我将其转载到这里。ios
这里贴一下我对R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN的对比,看完下面的文章后不妨回来看看个人总结,有问题的地方欢迎讨论。git
如下内容转载自CNN图像分割简史:从R-CNN到Mask R-CNN(译)github
原文A Brief History of CNNs in Image Segmentation: From R-CNN to Mask R-CNN算法
在Athelas中能够看到,卷积神经网络(Convolutional Neural Networks,CNNs)应用很是普遍,不只仅是用于解决分类问题。这篇博文主要介绍如何利用CNNs进行图像实例分割。网络
自从Alex Krizhevsky, Geoff Hinton, and Ilya Sutskever赢得ImageNet 2012,CNNs开始成为图像分类任务中的黄金准则。事实上,CNNs以后不断提高ImageNet比赛中的图像分类精度,甚至超过了人类的水准。架构
虽然分类结果很是惊人,但图像分类任务相对于人类视觉理解任务的复杂性和多样性来讲是很是简单的。app
图像分类任务中的一张图像通常只关注一个目标,从而预测图像是什么(如图2所示)。可是咱们在观察周围世界时要完成很是复杂的事情。ide
现实世界中的复杂场景通常存在相互重叠的目标和不一样背景,咱们在观察时不只可以分辨不一样的目标,并且能够识别不一样目标的边界、差别以及他们之间的(空间)关系。性能
CNNs是否能够帮助咱们完成如此复杂的任务?也就是说,给定一张复杂的图像,咱们是否能够利用CNNs识别图像中的不一样目标以及他们的边界呢?Ross Girshick和他的同事近几年的研究代表,答案是固然能够!测试
本博文涵盖目标检测和分割中所用主要技术背后的知识,以及这些技术的演化过程,特别是R-CNN(Regional CNN)(CNNs最初应用于检测和分割问题的方法)及其派生Fast R-CNN和Faster R-CNN,最后咱们会讲述Facebook Research最新提出的Mask R-CNN,对这类目标检测问题扩展到像素级图像分割。本博文中引用的论文以下:
- R-CNN: [1311.2524] Rich feature hierarchies for accurate object detection and semantic segmentation
- Fast R-CNN: [1504.08083] Fast R-CNN
- Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
- Mask R-CNN: [1703.06870] Mask R-CNN
受Toronto大学Hinton实验室研究成果的启发,UC Berkeley大学Jitendra Malik教授的团队提出当今看来不可避免的问题:
Krizhevsky等的研究成果如何才能扩展到目标检测?
目标检测任务从图像中找到不一样的物体并对其进行分类(如图5所示)。Ross Girshick (a name we’ll see again)、Jeff Donahue和Trevor Darrel团队发现目标检测问题能够借助于Krizhevsky的成果并在PASCAL VOC数据集(ImageNet挑战中的目标检测数据集)中进行测试,文中提到:
这篇论文首次代表了在PASCAL VOC数据集上的目标检测任务中,CNNs可以得到比传统特征(如HOG特征等)好不少的性能。
接下来咱们一块儿理解一下Regions CNNs(R-CNN)工做的架构。
理解R-CNN
R-CNN的目标是从图像中正确识别出主要的物体(采用bounding box进行标注):
如何找出这些bounding box呢?R-CNN采用咱们直觉上认为的方式:给出一堆图像可能的box,而后判断这些box是否和物体相关。
R-CNN采用Selective Search的方法给出region proposals。从高层理解,Selective Search经过不一样尺寸的窗口在图像中进行滑动(如图6所示),对于每一个尺寸方法采用纹理、颜色或亮度对邻近的像素进行聚合,从而识别物体。
得到region proposals集合以后,R-CNN将这些区域变换为标准的方形尺寸,并采用AlexNet的修改版本判断其是不是有效region(如图7所示)。
在CNN的最后一层,R-CNN增长了一个简单的分类器Support Vector Machine(SVM),用于判断区域是不是物体,以及物体的类别。
精化Bounding Box
如今已经找到Box中的物体,接下来是否能够tighten bounding box(进一步调整物体边界,使其更贴近物体周围),从而获取物体的真实范围呢?固然,这也是R-CNN的最后一步,R-CNN对region proposals进行简单的线性回归,从而生成tighten以后的Bounding Box作为最终结果。回归模型的输入和输出以下:
总结一下,R-CNN的步骤以下:
R-CNN效果很是好,可是效率过低了,主要的缘由:
2015年,R-CNN的做者Ross Girshick解决了上述两个问题,并提出了Fast R-CNN的算法,接下来介绍一下Fast R-CNN。
RoI(Region of Interest)Pooling
Ross Girshick发现,每张图像的proposed regions老是朴素重叠的,从而致使重复的CNN前向计算(可能达到2000次)。他的想法很是简单——为何不每张图像计算一次CNN,为2000个proposed regions找到一种计算共享的方法?
Fast R-CNN采用RoIPool(Region of Interest Pooling)解决此问题。做为方法的核心,RoIPool分享整幅图像的CNN前向计算给不一样的regions。如图8所示,特别注意每一个区域的CNN特征如何从CNN的特征图像中选择对应区域特征的。接下来对每一个区域的特征进行pool操做(通常采用max pooling)。这样的话咱们只须要一次原始图像的CNN前向计算,而非R-CNN中的2000次!
Combine All Models into One Network
Fast R-CNN第二个想法是将CNN、分类和边界线性回归的训练融合到一个单独的网络中。不像R-CNN中的特征提取(CNN)、分类(SVM)和边界tighten(回归)分别采用三个不一样的模型,Fast R-CNN采用一个单独网络实现上述三个步骤。
图9展现了具体融合的过程,Fast R-CNN采用softmax layer取代了SVM分类器做为CNN网络的类别输出层,方法增长了一个平行于softmax layer的linear regression layer做为网络的边界坐标输出层,这样全部的输出须要来自于同一个网络!整个模型的输入和输出以下:
通过上述的改进,Fast R-CNN仍然存在一个瓶颈——region proposer。目标检测方法的第一步就是生成用于测试的潜在bouding box集合或者regions of interest,Fast R-CNN中采用的Selective Search速度很是慢,这也是限制整个算法效率的主要瓶颈。
2015年中,微软的研究团队(Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun)提出一种Faster R-CNN的方法,使得region proposal很是高效。
Faster R-CNN的想法来源于region proposals的特征计算依赖于图像的特征(采用CNN一次性计算整幅图像的特征),那么为什么不重用这些相同的CNN特征进行region proposals,从而取代单独的selective search算法呢?
实际上,这就是Faster R-CNN方法的核心。图10描述了单独CNN完成region proposals和分类的过程。这样只须要训练一个CNN,region proposals的计算基本能够忽略。文中描述:
咱们发现用于检测区域的卷积特征图(相似于Fast R-CNN)一样能够用来生成region proposals(所以使得region proposals变得绝不费力)。
模型的输入和输出以下:
How the Regions are Generated
接下来讨论一下Faster R-CNN如何从CNN特征图中生成region proposals。Faster R-CNN在CNN特征的上层增长了一个全卷积网络,即Region Proposal Network.
Region Proposal Network在CNN特征图上进行滑动窗口操做,而后每一个窗口,输出k个潜在的bounding box和分数,k个boxes如何选择和表达呢?
直觉上,咱们会认为图像中的物体应该符合必定的大小和长宽比,好比行人的形状更多是长方形的box。相似地,咱们通常也不会关注那些很是窄的boxes。据此,咱们构建了k个这样的common aspect ratios,并称做anchor boxes。每一个anchor box输出bounding box和对应的位置图像的分数。
考虑这些anchor boxes,Region Proposal Network的输入和输出以下:
而后,将Region Proposal Network中输出的目标可能bounding box输入到Fast R-CNN,并生成类别和tightened bounding box。
到这里咱们已经能够利用CNN特征快速定位图像中不一样目标的bounding boxes了,那么接下来是否能够继续延伸一下,提取像素级的目标实例而不是仅仅给出bounding boxes呢?这就是经典的图像分割问题,Kaiming He和他的团队(包括Girshick)在Facebook AI实验室中采用的架构,Mask R-CNN。
相似于Fast R-CNN和Faster R-CNN,Mask R-CNN的潜在创意来源也是很直接的,鉴于Faster R-CNN在目标检测中的效果,咱们是否能够将其扩展到像素级的图像分割中呢?
Maks R-CNN在Faster R-CNN的基础上增长一个分支,用于输出一个二值掩膜(Binary Mask),判断给定像素是否属于物体。上述分支(图14中的白色部分)就是一个置于CNN特征图上层的全卷积神经网络。模型的输入和输出以下:
可是Mask R-CNN的做者作了少许调整使得整个网络输出指望的结果。
RoiAlign - Realigning RoIPool to be More Accurate
直接采用Faster R-CNN的架构执行Mask R-CNN可能致使RoIPool选择区域的特征图与原始图像区域存在少许的偏离。因为图像分割须要像素级的标记,所以这样天然会致使精度降低。
Mask R-CNN采用RoIAlign的方法对RoIPool进行调整使其更精确对齐。
假设有一幅128*128大小的图像,对应的特征图大小为25*25,若是要将原始图像左上角15*15大小的像素映射到特征图中(如图16所示),如何从特征图中选择像素呢?显然原始图像中每一个像素对应特征图中的25*128个像素,要选择原始图像中的15个像素,须要选择15*25/128=2.93个像素。
在RoIPool中,咱们会四舍五入选择3个像素,从而会致使微小的偏移。在RoIAlign中,咱们要避免这样的近似。取而代之的是采用bilinear interpolation获取精确的对应值,即选择像素2.93,从而可以避免RoIPool致使的偏移。
生成这些mask以后,Mask R-CNN结合Faster R-CNN中生成的分类和bounding box,生成精确的分割结果。
若是你想本身试验一下这些算法,这里是相关的源码库:
Faster R-CNN
Mask R-CNN