版权:本文版权归作者和博客园共有 
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
 
本文仅是本人学习A Brief History of CNNs in Image Segmentation: From R-CNN to Mask R-CNN后对原文的翻译,如有错误之处,欢迎指出
 
近些年来,尽管用CNNs做图像分类任务的结果很惊艳,但是,图像分类在复杂度和多样性方面都比真实的人类视觉理解简单得多。
分类任务中用的一个图像实例。注意到图像是框(framed)好的而且只有一个物体。
在分类中,一般一张图像只需关注一个物体,任务就是说出这个图像是什么。但环顾我们的世界,我们要执行的是一个更复杂的任务。
现实生活中的场景往往由大量不同的、重叠的对象、背景、和行为(actions)组成,我们不仅要对不同的物体分类还要识别出他们的边界、差异和相互间的关系。
图像分割,目标是对图像的不同目标分类,识别出他们的边界,图来自Mask R-CNN论文
 
本文目标
分析目标检测和分割中用到的主要技巧后包含的intuition,看看他们是怎么从一个方法进化到另一个的。我们会提到R-CNN (Regional CNN),CNNs在这个问题的原始应用,和他的后代Fast R-CNN,Faster R-CNN. 最后分析一下Mask R-CNN,是Facebook研究院最新出的一篇论文,把目标检测技巧扩展到提供像素级分割。引用了四篇论文:
 
2014: R-CNN - CNNs在目标检测的早期应用
 

目标检测算法,如R-CNN输入一张图像,确定图像中主要物体的位置和类别。

 目标检测是从一幅图像中找出不同的物体并且对物体分类的任务。受多伦多大学Hinton实验室研究的启发,UC伯克利的Jitendra Malik教授领导的一个小团队发现,可以类似图像分类任务,用 Krizhevsky et. al’s(AlexNet网络)在目标检测PASCAL VOC Challenge上做,第一次将CNNs用在了PASCAL VOC上,与简单的类似hog特征的方法相比,极大地提升了目标检测的性能。下面花点时间理解一下他们的架构Regions With CNNs (R-CNN) works。
 
Understanding R-CNN
 R-CNN的目标是输入一张图像,正确地判断主要目标在图像的什么位置(用bounding box表示)
  • Inputs: Image 输入是图像
  • Outputs: Bounding boxes + labels for each object in the image.输出是,对于图像中的每个物体给出 Bounding boxes+标签
 那么怎么找到 bounding boxes在哪呢?R-CNN按照我们的直觉这样做--在图像中给出很多boxes,判断每一个box是否真的对应一个物体。

选择性搜索Selective Search利用多尺度的窗口搜索有纹理、颜色和强度的相邻像素。 图片来源: https://www.koen.me/research/pub/uijlings-ijcv2013-draft.pdf

 
R-CNN用Selective Search方法创建这些边界框 bounding boxes,或者候选区域region proposals。在high level上,Selective Search通过不同尺寸的窗观察图像,对每个尺寸,利用纹理、颜色和强度组合起来的邻近像素一起识别物体。
 一旦创建了一些候选区域region proposals,R-CNN就把区域变成标准的方形尺寸,输入到修改过了的AlexNet 中,见上图。在CNN的最后一层,R-CNN加了一个支持向量机SVM来简单地判断是否是物体,若是,判断是个什么物体,见上图的第四步。
 
改进边界框Bounding Boxes
 
现在框中有物体了,能够减小框,适应物体的真实尺寸吗?可以通过R-CNN的最后一步来实现,就是在候选区域region proposal上用一个简单的线性回归,生成更小tighter 的bounding box坐标得到最终的结果,下面是回归模型的输入和输出:
  • Inputs: sub-regions of the image corresponding to objects.图像对应物体的子区域
  • Outputs: New bounding box coordinates for the object in the sub-region.在子区域中物体的新的边界框坐标
总体来说,R-CNN就是几个步骤:
  • 生成一组候选边界框
  • 将带有候选边界框的图像输入到预训练好的AlexNet中,最后用SVM判断图像中物体在哪个框中
  • 如果物体被分类了(这个框确实包含物体),就把框输入到线性模型中,输出这个框更窄tighter的坐标。

2015: Fast R-CNN -加速、简化R-CNN

 
Ross Girshick wrote both R-CNN and Fast R-CNN. He continues to push the boundaries of Computer Vision at Facebook Research.
 
 R-CNN很慢,有几个很简单的原因:
  • 每张图像的每个候选区域都要输入到CNN(AlexNet)中(每张图像大约2000次)
  • 需要分别训练三个不同的模型-生成图像特征的CNN,预测类别的分类器(SVM)和用于缩小边界框的回归模型。
 在2015年,Ross Girshick,R-CNN的第一作者解决了这两个问题,得到了Fast R-CNN。我们看看它的主要思想(insights)。
 
Fast R-CNN Insight 1: RoI (Region of Interest) Pooling感兴趣区域池化
 
 作者意识到对每张图像总是有许多候选区域会重叠,会导致重复地做相同的CNN计算(约2000次)。他的insight很简单-为什么不每张图像做一次CNN计算,然后找到一个方法,在2000候选区域上共享计算结果呢?
 

这就是Fast R-CNN做的一个技巧--RoIPool (Region of Interest Pooling)感兴趣区域池化。在上图中,每个区域的CNN特征是通过从CNN的特征图中选择对应的区域得到的,然后,每个区域的特征再经过池化(通常最大池化)这样相比于之前的每张图像需要进入CNN2000次,用这个方法后每张图像就只经过CNN一次。

 Fast R-CNN Insight 2: Combine All Models into One Network
 

Fast R-CNN的第二个insight就是在一个单独模型中,联合训练CNN、分类器和边界框回归器,R-CNN需要有不同的模型提取图像特征(CNN)、分类(SVM)和缩小边界框(回归器)。

 Fast R-CNN在CNN最后用soft-max层代替SVM分类器输出一个分类结果,还增加了一个线性回归,和softmax层并行,用来输出边界框坐标。用这种方法所有的输出需要从单独的网络得到。下面是这个模型的输入和输出:
  • Inputs: Images with region proposals.带有候选区域的图像
  • Outputs: Object classifications of each region along with tighter bounding boxes.每个区域的物体分类和更窄的边界框

2016: Faster R-CNN - 加速候选区域

 Fast R-CNN中仍然有个瓶颈--候选区域部分。检测目标未知的第一步是生成一些可能的边界框或者感兴趣区域用于测试,在Fast R-CNN中,这些候选是用Selective Search来做的,这个过程相当慢,是整个过程的瓶颈。

 Jian Sun, a principal researcher at Microsoft Research, led the team behind Faster R-CNN. Source: https://blogs.microsoft.com/next/2015/12/10/microsoft-researchers-win-imagenet-computer-vision-challenge/#sm.00017fqnl1bz6fqf11amuo0d9ttdp
 
在2015年年中,微软的一个团队发现了一种生成候选区域的方法--Faster R-CNN,整个过程几乎没有cost。
 R-CNN的想法就是候选区域取决于图像的特征,这在通过CNN的过程中已经计算过了(分类的第一步),那么为什么要单独运行 selective search 算法,不重新用那些相同的CNN结果来得到候选区域呢?这就是Faster R-CNN的实现。

 
 In Faster R-CNN, a single CNN is used for region proposals, and classifications. Source: https://arxiv.org/abs/1506.01497.
 
 从上图中可以看出一个单独的CNN用于得到候选区域和分类,以这种方式,只需训练一个CNN,无需额外的成本就可以得到候选形状。(作者是观察到:用基于区域的检测器的卷积特征图,如Fast R-CNN,也可以用于生成候选区域) 模型的输入和输出为:
  • Inputs: Images (Notice how region proposals are not needed).图像,不需要候选区域
  • Outputs: Classifications and bounding box coordinates of objects in the images.图像中物体的分类和边界框坐标。
区域是怎么生成的
 Faster R-CNN在CNN得到的特征顶部增加了一个全卷积网络--候选区域网络Region Proposal Network。
 

The Region Proposal Network slides a window over the features of the CNN. At each window location, the network outputs a score and a bounding box per anchor (hence 4k box coordinates where k is the number of anchors). Source: https://arxiv.org/abs/1506.01497.

 区域候选网络在CNN特征图上滑动窗口,在每个窗口,输出k个可能的边界框,还有一个衡量框的可能性的得分。

We know that the bounding boxes for people tend to be rectangular and vertical. We can use this intuition to guide our Region Proposal networks through creating an anchor of such dimensions. Image Source: http://vlm1.uta.edu/~athitsos/courses/cse6367_spring2011/assignments/assignment1/bbox0062.jpg.

 直观地,我们知道图像中的物体应该符合某个常见的长宽比和尺寸,例如,我们想要一些和人的形状相似的矩形框,同样,我们不想看到非常瘦的框。按这种方式,我们创建了K个常见的长宽比称为anchor boxes,对于每个anchor box,我们输出一个边界框和并对每个位置打分。这个候选区域网络的输入和输出为:
  • Inputs: CNN Feature Map. CNN特征图
  • Outputs: A bounding box per anchor. A score representing how likely the image in that bounding box will be an object. 每个anchor一个边界框,打分代表边界框内是物体的可能性
 之后把可能是物体的边界框输出到Fast R-CNN中得到分类和窄的边界框。

2017: Mask R-CNN - 将Faster R-CNN拓展到像素级分割

The goal of image instance segmentation is to identify, at a pixel level, what the different objets in a scene are. Source: https://arxiv.org/abs/1703.06870.

 我们能否用这种技术定位出每个物体的精确像素而不只是边界框?这个问题就是图像分割。
 

Kaiming He, a researcher at Facebook AI, is lead author of Mask R-CNN and also a coauthor of Faster R-CNN.

 和Fast R-CNN, Faster R-CNN很像, Mask R-CNN’s 潜在的直觉是直接的。
 

 In Mask R-CNN, a Fully Convolutional Network (FCN) is added on top of the CNN features of Faster R-CNN to generate a mask (segmentation output). Notice how this is in parallel to the classification and bounding box regression network of Faster R-CNN. Source: https://arxiv.org/abs/1703.06870.
 
 Mask R-CNN在Faster R-CNN中添加一个分支,用于输出二值mask,表示给定像素是否是一个物体的一部分,上图中白色部分是分支,是一个在CNN特征图顶部的全卷积网络,下面是输入和输出:
  • Inputs: CNN Feature Map. CNN特征图
  • Outputs: Matrix with 1s on all locations where the pixel belongs to the object and 0s elsewhere (this is known as a binary mask).二值矩阵,当该像素属于物体时mask值为1,否则为0
还需做个调整RoiAlign 。
RoiAlign - Realigning RoIPool to be More Accurate 调整RoIPool 
 

Instead of RoIPool, the image gets passed through RoIAlign so that the regions of the feature map selected by RoIPool correspond more precisely to the regions of the original image. This is needed because pixel level segmentation requires more fine-grained alignment than bounding boxes. Source: https://arxiv.org/abs/1703.06870.

 不修改原始 Faster R-CNN架构,作者发现用RoIPool选择的特征图和原图的区域没有完全对齐,因为图像分割任务要求像素级,不像边界框,这样自然会导致不准确。作者机智地用RoIAlign方法调整RoIPool使对齐更准确。
 

How do we accurately map a region of interest from the original image onto the feature map?

在RoIPool中我们大概选择两个像素,得到了有些不对齐的结果,然而在RoIAlign中我们避免用这样的舍入,用双线性插值得到准确的2.93。这样就可以避免RoIPool产生的不对齐。

当得到了这些masks后,Mask R-CNN用Faster R-CNN生成的分类和边界框将他们结合起来,生成精确地分割。

Mask R-CNN is able to segment as well as classify the objects in an image. Source: https://arxiv.org/abs/1703.06870.

CNNs 在图像分割中应用简史: 从R-CNN到Mask R-CNN的更多相关文章

  1. 【R语言入门】R语言中的变量与基本数据类型

    说明 在前一篇中,我们介绍了 R 语言和 R Studio 的安装,并简单的介绍了一个示例,接下来让我们由浅入深的学习 R 语言的相关知识. 本篇将主要介绍 R 语言的基本操作.变量和几种基本数据类型 ...

  2. python中换行,'\r','\n'及'、'\r\n'

    '\r'的本意是回到行首,'\n'的本意是换行. 所以回车相当于做的是'\r\n'或者'\n\r'.'\r'就是换行并回行首, '\n'就是换行并回行首,用'\r\n'表示换行并回行首. window ...

  3. R(二): http与R脚本通讯环境安装

    结合实际的工作环境,在开始R研究的时候,首先着手收集的就是能以Web方式发布R运行结果的基础框架,无耐的是,R一直以来常使用于个人电脑的客户端程序上,大家习惯性的下载R安装包,在自己的电脑上安装 -- ...

  4. 【R语言系列】R语言初识及安装

    一.R是什么 R语言是由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman两个人共同发明. 其词法和语法分别源自Schema和S语言. R定义:一个能够自由幼小的用于统计计算和绘 ...

  5. 【R笔记】给R加个编译器——notepad++

    R的日记-给R加个编译器 转载▼ R是一款强大免费且开源的统计分析软件,这是R的长处,可也是其“缺陷”的根源:不似商业软件那样user-friendly.记得初学R时,给我留下最深印象的不是其功能的强 ...

  6. THE R QGRAPH PACKAGE: USING R TO VISUALIZE COMPLEX RELATIONSHIPS AMONG VARIABLES IN A LARGE DATASET, PART ONE

    The R qgraph Package: Using R to Visualize Complex Relationships Among Variables in a Large Dataset, ...

  7. 图像分割中的loss--处理数据极度不均衡的状况

    序言: 对于小目标图像分割任务,一副图画中往往只有一两个目标,这样会加大网络训练难度,一般有三种方法解决: 1.选择合适的loss,对网络进行合理优化,关注较小的目标. 2.改变网络结构,使用atte ...

  8. (转)java中/r与/n还有/r/n的区别

    场景:在学习spring实战,以及工作中进行写文件时候,经常遇到java中的换行问题,发现有的书上的介绍和实际使用并不一致.现在才算是搞清楚! 通过文本对比,断言应该返回正确的结果!但是事与愿违,最终 ...

  9. python脚本中为什么要在目录前加一个r

    目的:为了避免转义,r后面的内容,全文输出: r是保持字符串原始值的意思,就是说不对其中的符号进行转义.因为windows下的目录字符串中通常有斜杠"\",比如,windows下的 ...

随机推荐

  1. 确认框的使用。弹出一个确认框,Ajax提交一个请求,刷新页面。

    视图: <td> @if (item.ReviewProject.DeclareState == DeclareOrReviewState.正在进行 && !item.Is ...

  2. Java中的标识符,类名和包名规则

    Java中的包.类.方法.参数和变量的名称 标识符的命名规则 1.变量必须以字母.下划线(_)或美元符号($)开头 2.余下的字符可以是下划线.美元符号或任何的字母或数字 3.不能使用JavaScri ...

  3. (水题)Codeforces - 4C - Registration system

    https://codeforces.com/problemset/problem/4/C 用来哈希的一道题目,用map也可以强行过,但是性能慢了6倍,说明是在字符串比较的时候花费了接近6倍的时间. ...

  4. html页面选择图片上传时实现图片预览功能

    实现效果如下图所示 只需要将下面的html部分的代码放入你的代码即可 (注意引入jQuery文件和html头部的css样式,使用的是ajax提交) <!-- 需引入jQuery 引入样式文件 引 ...

  5. 51nod 1416【DFS】

    思路: 暴力整个图,以这个为起点,然后看一下有没有找到一条路是会指向自己且元素个数>=4: #include <bits/stdc++.h> using namespace std; ...

  6. Codeforces710C【数学】

    n阶幻方问题::http://blog.csdn.net/fengchaokobe/article/details/7437767 学一下就好啦~ 奇幻七绝 先填上行正中央, 依次斜填切莫忘. 上格没 ...

  7. ajax 的三种使用方法

    第一种 也是最古老的一种方法之一 from 表单直接提交数据到php文件里 action为路径 <form method="post" action="./inde ...

  8. python 的 数据类型

    数据类型 1.1整型int py2中有int有范围,超出自动转为long长整型,py3中只有int 整除py2中无小数,可加一行代码实现 十进制转二进制 print(bin(10))十进制转八进制 p ...

  9. PJzhang:最基本的正则表达式实例

    猫宁!!! 参考链接: https://www.cnblogs.com/fozero/p/7868687.html http://tool.oschina.net/regex/# http://too ...

  10. C 语言实例 - 将字符串写入文件

    C 语言实例 - 将字符串写入文件 C 语言实例 C 语言实例 将字符串写入文件. 实例 #include <stdio.h> #include <stdlib.h> /* e ...