正文
作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai
我的博客:
请点击这里
自从
Alex Krizhevsky, Geoff Hinton, and Ilya Sutskever
成为了 ImageNet 2012 冠军之后,CNN 已经变成了图像分割的标配。实际上,从那时起,CNN 已经在 ImageNet 挑战上面战胜了人类。
虽然这些分类结果令人印象深刻,但是比真实的人类视觉理解还是要简单很多。
在分类中,通常我们会把图像中一个单一对象作为分类焦点,也就是说主要去识别焦点的物体(比如上面的狗狗)。但是,当我们环顾我们周围世界的时候,我们面对的是一个更加复杂的问题。
我们看到场景是一个非常复杂的场景,而且是多个目标进行重叠的背景,我们不仅需要分类这些不同的对象,而且需要识别他们的边界和彼此的关联。
CNN 可以帮助我们实现这样复杂的任务吗?也就是说,我们给出更复杂的图像,可以利用 CNN 来识别图像中的不同物体之间的边界吗?这个问题,在过去几年里,已经由 Ross Girshick 和他的同事向我们证明了,答案是肯定的。
这篇文章的目标
通过这篇文章,我们将介绍一些用于对象检测和分割的主要技术手段,并且了解他们是如何从上一个模型演变到下一个模型的。具体来说,我们将介绍 R-CNN(Regional CNN),一个最早利用CNN解决这个问题的模型,以及其后期的 Fast R-CNN 模型和 Faster R-CNN 模型。最后,我们将介绍 Mask R-CNN 模型,这个模型是由 Facebook Research 最近发布的一篇文章,这篇文章提供了像素级别的分割。以下是各个模型的文章:
-
R-CNN:
arxiv.org/abs/1311.25…
-
Fast R-CNN:
arxiv.org/abs/1504.08…
-
Faster R-CNN:
arxiv.org/abs/1506.01…
-
Mask R-CNN:
arxiv.org/abs/1703.06…
2014: R-CNN - An Early Application of CNNs to Object Detection
.](
upload-images.jianshu.io/upload_imag…
受 Hinton 实验室的启发,UCB 的 Jitendra Malik 的团队问了这样一个问题:
对象检测到底能如何泛化?
对象检测是找到图像中的不同对象并且进行分类的任务(如上图所示)。由 Ross Girshick,Jeff Donahue 和 Trevor Darrel 组成的团队发现这个问题可以用 Krizhevsky 的方法在
PASCAL VOC Challenge
上面进行实现,他们写道:
本文首先显示,与基于 HOG 类特征的简单系统相比,CNN 可以显著提高 PASCAL VOC 上的对象检测性能。
现在让我们来了解一下 R-CNN 的架构,以及它是如何工作的。
理解 R-CNN
R-CNN 模型的目标是根据拍摄的图像,正确识别图像中主要对象(通过边框)的位置。
-
输入:image
-
输出:物体边框 + 每个对象的标签
但是我们如何找出这些边框的位置呢?R-CNN 的做法就是按照人类的直观理解来做的 ——
我们先从图像里把一些物体给框出来,然后来确定这个物体是什么对象。
R-CNN 使用一种称为选择性搜索的技术来创建这些边界框,更多的细节你可以阅读
这篇文章
。更高层次来说,选择性搜索(如上图所示)是通过不同大小的窗口来查看图像,并且对于每个大小不同的窗口,尝试通过文理,颜色或强度将相邻像素分组在一起以识别对象。
一旦这些边框确定之后,R-CNN 就会将该区域转变到一个标准的平方尺寸,并将其传送到 AlexNet 的一个变体中,如上图所示。
在 CNN 的最后一层,R-CNN 添加了一个支持向量机(SVM),它简单的分类这是否是一个对象,也就是图中的第四步。
改进边界框
现在,我们已经获得了物体的大致边框,那么我们可以将这个边框缩小以适应物体本身真实的尺寸吗?答案是可以的,这是 R-CNN的最后一步。R-CNN 对区域进行一个简单的线性回归,以生成更紧密的边界框坐标以获得结果。以下是回归模型的输入和输出:
-
输入:
与物体对应图像的子区域。
-
输出:
子区域中对象的新边界框坐标。
最后,总结一下 R-CNN 的几个步骤:
-
给图像生成一组边界框。
-
通过预先训练的 AlexNet 运行边框中的图像,最后通过 SVM 来进行分类。
-
一旦对象被分类,边界框通过运行线性回归模型输出更加紧密的边框坐标。
2015: Fast R-CNN - Speeding up and Simplifying R-CNN
R-CNN 可以很好的工作,但是基于以下几个理由,它非常慢:
‘
-
’它需要 CNN(AlexNet)针对每个图像区域进行运行分类(每个图像大约 2000 次前向传递)。
-
它需要分别训练三种不同的模型 —— CNN生成图像特征,SVM来预测分类,最后通过线性回归来收紧边界框。这样设计使得数据管道非常难设计。
2015年,R-CNN 的第一作者 Ross Girshick 解决了这两个问题,也就诞生了第二个算法 —— Fast R-CNN。现在,让我们来看看它的主要思路:
Fast R-CNN Insight 1: RoI (Region of Interest) Pooling
对于 CNN 的前向传播,Girshick 意识到,对于每个图像,图像的许多分割区域都是重叠的,这就使得我们一次又一次地运行相同的 CNN 计算(大约 2000 次)。他的想法很简单,就是让CNN运行一次图像,然后找到一种共享计算的方法,来区分这 2000 个区域。
这正是 Fast R-CNN 被称之为 PolPool(Region of Interest Pooling)的核心技术,该技术能分享 CNN 在其次区域的前向传递。在上图中,请注意每个 CNN 特征图是从一个原来的大特征图中进行选取的。然后,区域中的特征都被进行合并(一般是采用最大池)。所以需要我们计算的是一个原始图片,而不是那个 2000 次区域。
Fast R-CNN Insight 2: Combine All Models into One Network
Fast R-CNN 的第二个改进是在单一模型中同时训练了 CNN,分类器和边界回归。早期的模型我们使用 CNN 来进行图像特征提取,SVM 来进行分类,最后用线性回归来进行边框收紧。Fast R-CNN 使用一个模型来同时达到这三个模型的效果。
上图展示的就是这个联合模型。Fast R-CNN 用 CNN 顶部的 softmax 层来替代 SVM 分类器的输出分类。它还添加了与 softmax 层平行的线性回归层用来输出边界框坐标。这样,所有我们需要模型的输出都是来自于单一的网络。整个网络模型的输入和输出如下:
-
输入:
带有区域目的的图像。
-
输出:
每个区域的对象分类以及更紧密的边界框。
2016: Faster R-CNN - Speeding Up Region Proposal
即使取得了这些进步,Fast R-CNN 仍然存在一个瓶颈 —— 区域检测。正如我们所看到的,检测对象位置的第一步是产生一对潜在的边界框和区域进行测试。在 Fast R-CNN 中,这些边界框是采用选择性搜索创建的,这是一个相当缓慢的过程,被认为是整个流程额瓶颈。
在2015年中期,一个微软研究员的团队 Shaoqing Ren,Kaiming He,Ross Girshick 和 Jian Sun,找到了一个方法来解决这个瓶颈问题,他们将这个方法命名为 Faster R-CNN。
Faster R-CNN 的一个重大改进是,在 CNN 第一步分类的时候,后续步骤重用那些相同的 CNN 结构,而不是单独运行选择性搜索算法。
的确,这正是 Faster R-CNN 团队所取得的成就。在上图中,你可以看到如何使用单个 CNN 来对区域进行处理和分类。这样,我们只需要一个 CNN 进行训练,而其他的区域都可以从这个 CNN 网络中获取,作者这样写道:
我们的观测结果是,用于区域检查(如 Fast R-CNN)的卷积特征图也可以用于区域生成,从而实现几乎无成本的区域生成。
一下是其模型的输入和输出:
-
输入:
图像(注意不需要区域提案)。
-
输出:
图像中对象的分类和边界框坐标。
如何生成区域
接下来,让我们来看看 Faster R-CNN 是如何从 CNN 特征图中来生成区域。Faster R-CNN 在网络上添加了一个完全卷积网络,创建了一个所谓的
区域生成网络
。
区域生成网络通过在 CNN 特征图上面的滑动窗口,并在每个窗口中输出 k 个潜在的边界框和分数,以便预测哪些框是最好的。那么,k 个框是代表什么呢?
直观地,我们知道图像中的对象应该符合某些常见的比例和大小。例如,我们知道我们想要的一些类似于人类形状的边框比例和大小。同样,我们知道我们看到的很多的盒子厚度都不会很薄。以这种方式,我们可以创建 k 个这样的盒子,我们称之为锚盒(anchor boxes)。对于每个这样的锚盒,我们在图像中输出一个边界框和每个位置的得分。
考虑到这些锚盒,我们来看看这个区域生成网络的输入和输出:
然后,我们将每个这样的可能对象边界框传递到 Fast R-CNN 中,以生成分类结果和收紧边界框。
2017: Mask R-CNN - Extending Faster R-CNN for Pixel Level Segmentation
到目前为止,我们已经看到我们如何使用 CNN 特征图去有效地定位图像中不同对象的边界框。
我们可以将这些技术进一步扩展,并定位每个对象的精确像素,而不是仅限于边框。这个像素级别的图像分割问题被 Kaiming He 等科学家解决,这个框架被称为 Mask R-CNN。