作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai
简书地址:https://www.jianshu.com/p/867038d71f3c
自从 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: https://i-blog.csdnimg.cn/blog_migrate/abcbca21ebff3340f226410579e15a1d.png
- Fast R-CNN: https://arxiv.org/abs/1504.08083
- Faster R-CNN: https://arxiv.org/abs/1506.01497
- Mask R-CNN: https://arxiv.org/abs/1703.06870
2014: R-CNN - An Early Application of CNNs to Object Detection
受 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 对区域进行一个简单的线性回归,以生成更紧密的边界框坐标以获得结果。以下是回归模型的输入和输出:
- 输入:与物体对应图像的子区域。
- 输出:子区域中对象的新边界框坐标。
最后,总结一下 R-CNN 的几个步骤:
- 给图像生成一组边界框。
- 通过预先训练的 AlexNet 运行边框中的图像,最后通过 SVM 来进行分类。
- 一旦对象被分类,边界框通过运行线性回归模型输出更加紧密的边框坐标。
2015: Fast R-CNN - Speeding up and Simplifying R-CNN
R-CNN 可以很好的工作,但是基于以下几个理由,它非常慢:
‘
1. ’它需要 CNN(AlexNet)针对每个图像区域进行运行分类(每个图像大约 2000 次前向传递)。
2. 它需要分别训练三种不同的模型 —— 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
2016: Faster R-CNN - Speeding Up Region Proposal
即使取得了这些进步,Fast R-CNN 仍然存在一个瓶颈 —— 区域检测。正如我们所看到的,检测对象位置的第一步是产生一对潜在的边界框和区域进行测试。在 Fast R-CNN 中,这些边界框是采用选择性搜索创建的,这是一个相当缓慢的过程,被认为是整个流程额瓶颈。
如何生成区域
接下来,让我们来看看 Faster R-CNN 是如何从 CNN 特征图中来生成区域。Faster R-CNN 在网络上添加了一个完全卷积网络,创建了一个所谓的区域生成网络。
2017: Mask R-CNN - Extending Faster R-CNN for Pixel Level Segmentation
RoiAlign - Realigning RoIPool to be More Accurate
代码
如果你有兴趣自己尝试这些算法,这里有一些相关的库:
Faster R-CNN
- Caffe: https://github.com/rbgirshick/py-faster-rcnn
- PyTorch: https://github.com/longcw/faster_rcnn_pytorch
- MatLab: https://github.com/ShaoqingRen/faster_rcnn
Mask R-CNN
- PyTorch: https://github.com/felixgwu/mask_rcnn_pytorch
- TensorFlow: https://github.com/CharlesShang/FastMaskRCNN
作者:chen_h
微信号 & QQ:862251340
简书地址:https://www.jianshu.com/p/867038d71f3c
CoderPai 是一个专注于算法实战的平台,从基础的算法到人工智能算法都有设计。如果你对算法实战感兴趣,请快快关注我们吧。加入AI实战微信群,AI实战QQ群,ACM算法微信群,ACM算法QQ群。长按或者扫描如下二维码,关注 “CoderPai” 微信号(coderpai)