摘要: 本文简要介绍图像检测中经常使用的深度学习方法——RCNN家族系列算法,以图像讲解形式,便于理解。算法
在生活中,常常会遇到这样的一种状况,上班要出门的时候,忽然找不到一件东西了,好比钥匙、手机或者手表等。这个时候通常在房间翻一遍各个角落来寻找不见的物品,最后忽然一拍大脑,想到在某一个地方,在整个过程当中有时候是很着急的,而且越着急越找不到,真是使人沮丧。可是,若是一个简单的计算机算法能够在几毫秒内就找到你要找的物品,你的感觉如何?是否是很惊奇!这就是对象检测算法(object detection)的力量。虽然上述举的生活例子只是一个很简单的例子,但对象检测的应用范围很广,跨越多个不一样的行业,从全天候监控到智能城市的实时车辆检测等。简而言之,物体检测是强大的深度学习算法中的一个分支。
在本文中,咱们将深刻探讨能够用于对象检测的各类算法。首先从属于RCNN系列算法开始,即RCNN、 Fast RCNN和 Faster RCNN。在以后的文章中,将介绍更多高级算法,如YOLO、SSD等。网络
下图说明了对象检测算法是如何工做。图像中的每一个对象,从人到风筝都以必定的精度进行了定位和识别。ide
下面从最简单的深度学习方法开始,一种普遍用于检测图像中的方法——卷积神经网络(CNN)。若是读者对CNN算法有点生疏,建议阅读此文。
这里仅简要总结一下CNN的内部运做方式:性能
首先将图像做为输入传递到网络,而后经过各类卷积和池化层处理,最后以对象类别的形式得到输出。
对于每一个输入图像,会获得一个相应的类别做为输出。所以可使用这种技术来检测图像中的各类对象。学习
1.首先,将图像做为输入;spa
2.而后,将图像分红不一样的区域;3d
3.而后,将每一个区域视为单独的图像;对象
4.将全部这些区域传递给CNN并将它们分类为各类类别;blog
5.一旦将每一个区域划分为相应的类后,就能够组合全部这些区域来获取具备检测到的对象的原始图像:开发
使用这种方法会面临的问题在于,图像中的对象能够具备不一样的宽高比和空间位置。例如,在某些状况下,对象可能覆盖了大部分图像,而在其余状况下,对象可能只覆盖图像的一小部分,而且对象的形状也可能不一样。
基于此,须要划分大量的区域,这会花费大量的计算时间。所以,为了解决这个问题并减小区域数量,可使用基于区域的CNN,它使用提议方法选择区域。
RCNN算法不是在大量区域上工做,而是在图像中提出了一堆方框,并检查这些方框中是否包含任何对象。RCNN 使用选择性搜索从图像中提取这些框。
下面介绍选择性搜索以及它如何识别不一样的区域。基本上四个区域造成一个对象:不一样的比例、颜色、纹理和形状。选择性搜索在图像中识别这些模式,并基于此提出各类区域。如下是选择性搜索如何工做的简要概述:
首先, 将图像做为输入:
而后,它生成初始子分段,以便得到多个区域:
以后,该技术组合类似区域以造成更大的区域(基于颜色类似性、纹理类似性、尺寸类似性和形状兼容性):
最后,这些区域产生最终的对象位置(感兴趣的区域);
下面是RCNN检测对象所遵循的步骤的简要总结:
[对上述步骤进行图解分析](http://www.robots.ox.ac.uk/~tvg/publications/talks/Fast-rcnn-slides.pdf):
首先,将图像做为输入:
而后,使用一些提议方法得到感兴趣区域(ROI)(例如,选择性搜索):
以后,对全部这些区域调整尺寸,并将每一个区域传递给卷积神经网络:
而后,CNN为每一个区域提取特征,SVM用于将这些区域划分为不一样的类别:
最后,边界框回归(Bbox reg)用于预测每一个已识别区域的边界框:
以上就是RCNN检测物体的所有流程。
从上节内容能够了解到RCNN是如何进行对象检测的,但这种技术有其自身的局限性。如下缘由使得训练RCNN模型既昂贵又缓慢:
基于选择性搜索算法为每一个图像提取2,000个候选区域;
使用CNN为每一个图像区域提取特征;
RCNN整个物体检测过程用到三种模型:
这些过程相结合使得RCNN很是慢,对每一个新图像进行预测须要大约40-50秒,这实际上使得模型在面对巨大的数据集时变得复杂且几乎不可能应用。
好消息是存在另外一种物体检测技术,它解决了RCNN中大部分问题。
RCNN的提出者Ross Girshick提出了这样的想法,即每一个图像只运行一次CNN,而后找到一种在2,000个区域内共享该计算的方法。在Fast RCNN中,将输入图像馈送到CNN,CNN生成卷积特征映射。使用这些特征图提取候选区域。而后,使用RoI池化层将全部建议的区域从新整形为固定大小,以便将其馈送到全链接网络中。
下面将其分解为简化概念的步骤:
所以,Fast RCNN算法中没有使用三个不一样的模型,而使用单个模型从区域中提取特征,将它们分红不一样的类,并同时返回所标识类的边界框。
对上述过程进行可视化讲解:
将图像做为输入:
将图像传递给卷积神经网络t,后者相应地返回感兴趣的区域:
而后,在提取的感兴趣区域上应用RoI池层,以确保全部区域具备相同的大小:
最后,这些区域被传递到一个全链接网络,对其进行分类,并同时使用softmax和线性回归层返回边界框:
上述过程说明了Fast RCNN是如何解决RCNN的两个主要问题,即将每一个图像中的1个而不是2,000个区域传递给卷积神经网络,并使用一个模型来实现提取特征、分类和生成边界框。
Fast RCNN也存在必定的问题,它仍然使用选择性搜索做为查找感兴趣区域的提议方法,这是一个缓慢且耗时的过程,每一个图像检测对象大约须要2秒钟。
所以,又开发了另外一种物体检测算法——Faster RCNN。
Faster RCNN是Fast RCNN的修改版本,两者之间的主要区别在于,Fast RCNN使用选择性搜索来生成感兴趣区域,而Faster RCNN使用“区域提议网络”,即RPN。RPN将图像特征映射做为输入,并生成一组提议对象,每一个对象提议都以对象分数做为输出。
如下步骤一般采用Faster RCNN方法:
1.将图像做为输入并将其传递给卷积神经网络,后者返回该图像的特征图;
2.在这些特征图上应用RPN,返回提议对象及其分数;
3.在这些提议对象上应用RoI池层,以将全部提案下降到相同的大小;
4.最后,将提议传递到全链接层,该层在其顶部具备softmax层和线性回归层,以对对象的边界框进行分类和输出;
这里简要解释一下RPN是如何运做的:
首先,Faster RCNN从CNN获取特征图并将它们传递到区域提议网络。RPN在这些特征图上使用滑动窗口,每一个窗口生成不一样形状和大小的k个方框( Anchor boxe):
方框是固定尺寸的边界箱,具备不一样的形状和尺寸。对于每一个方框,RPN预测两件事:
在有了不一样形状和大小的边界框后,将其传递到RoI池层。对每一个提案并对其进行裁剪,以便每一个提案都包含一个对象。这就是RoI池层所作的事情,它为每一个方框提取固定大小的特征图:
而后将这些特征图传递到全链接层,该层具备softmax和线性回归层,最终对对象进行分类并预测已识别对象的边界框。
上述讨论过的全部对象检测算法都使用区域来识别对象,且网络不会一次查看完整图像,而是按顺序关注图像的某些部分,这样会带来两个复杂性的问题:
下表是总结了本文中介绍的全部算法
算法 | 特征 | 预测时间 | 限制 |
---|---|---|---|
CNN | 将图像分红多个区域,将每一个区域分类为不一样的类别 | - | 须要不少区域来准确预测,所以计算时间长 |
RCNN | 使用选择性搜索生成区域,从每一个图像中提取大约2000个区域 | 40-50秒 | 每一个区域分别传递给CNN的计算时间也很长,且使用三种不一样的模型进行预测 |
Fast RCNN | 每一个图像只传递一次到CNN,并提取特征图。在这些地图上使用选择性搜索来生成预测。将RCNN中使用的全部三种模型组合在一块儿 | 2秒 | 选择性搜索很慢,所以计算时间仍然很长 |
Faster RCNN | 用区域提议网络替换选择性搜索方法,使算法更快 | 0.2秒 | 对象提议须要时间,而且因为不一样的系统一个接一个地工做,系统的性能取决于先前系统的表现效果 |