目标检测是深度学习的一个重要应用,就是在图片中要将里面的物体识别出来,并标出物体的位置,一般需要经过两个步骤:
1、分类,识别物体是什么
2、定位,找出物体在哪里
除了对单个物体进行检测,还要能支持对多个物体进行检测,如下图所示:
但是由于物体的尺寸变化范围很大、摆放角度多变、姿态不定,而且物体有很多种类别,可以在图片中出现多种物体、出现在任意位置。因此,目标检测是一个比较复杂的问题。
RCNN原理
RCNN算法提出在图像中创建多个边界框,检查这些边框中是否含有目标物体。RCNN使用选择性搜索来从一张图片中提取这些边框。
首先,让我们明确什么是选择性搜索,以及它是如何辨别不同区域的。组成目标物体通常有四个要素:变化尺度、颜色、结构(材质)、所占面积。选择性搜索会确定物体在图片中的这些特征,然后基于这些特征突出不同区域。
用RCNN检测目标物体的步骤如下:
- 我们首先取一个预训练卷积神经网络。
- 根据需要检测的目标类别数量,训练网络的最后一层。
- 得到每张图片的感兴趣区域(Region of Interest),对这些区域重新改造,以让其符合CNN的输入尺寸要求。
- 得到这些区域后,我们训练支持向量机(SVM)来辨别目标物体和背景。对每个类别,我们都要训练一个二元SVM。
- 最后,我们训练一个线性回归模型,为每个辨识到的物体生成更精确的边界框。
下面我们就用具体的案例解释一下。
- 首先,将以下图片作为输入:
之后,我们会用上文中的选择性搜索得到感兴趣区域:
将这些区域输入到CNN中,并经过卷积网络
CNN为每个区域提取特征,利用SVM将这些区域分成不同类别:
最后,用边界框回归预测每个区域的边界框位置:
但是R-CNN虽然不再像传统方法那样穷举,但R-CNN流程的第一步中对原始图片通过Selective Search提取的候选框region proposal多达2000个左右,而这2000个候选框每个框都需要进行CNN提特征+SVM分类,计算量很大,导致R-CNN检测速度很慢,一张图都需要47s。
Fast RCNN
Fast R-CNN主要解决R-CNN的以下问题:
1、训练、测试时速度慢
R-CNN的一张图像内候选框之间存在大量重叠,提取特征操作冗余。而Fast R-CNN将整张图像归一化后直接送入深度网络,紧接着送入从这幅图像上提取出的候选区域。这些候选区域的前几层特征不需要再重复计算。
2、训练所需空间大
R-CNN中独立的分类器和回归器需要大量特征作为训练样本。Fast R-CNN把类别判断和位置精调统一用深度网络实现,不再需要额外存储。
在每张照片上只运行一次CNN,然后找到一种方法在2000个区域中进行计算。在Fast RCNN中,我们将图片输入到CNN中,会相应地生成传统特征映射。利用这些映射,就能提取出感兴趣区域。之后,我们使用一个Rol池化层将所有提出的区域重新修正到合适的尺寸,以输入到完全连接的网络中。
简单地说,这一过程含有以下步骤:
- 输入图片。
- 输入到卷积网络中,它生成感兴趣区域。
- 利用Rol池化层对这些区域重新调整,将其输入到完全连接网络中。
- 在网络的顶层用softmax层输出类别。同样使用一个线性回归层,输出相对应的边界框。
所以,和RCNN所需要的三个模型不同,Fast RCNN只用了一个模型就同时实现了区域的特征提取、分类、边界框生成。
同样,我们还用上面的图像作为案例,进行更直观的讲解。
首先,输入图像:
图像被传递到卷积网络中,返回感兴趣区域:
之后,在区域上应用Rol池化层,保证每个区域的尺寸相同:
最后,这些区域被传递到一个完全连接的网络中进行分类,并用softmax和线性回归层同时返回边界框:
Faster RCNN
Faster RCNN是Fast RCNN的优化版本,二者主要的不同在于感兴趣区域的生成方法,Fast RCNN使用的是选择性搜索,而Faster RCNN用的是Region Proposal网络(RPN)。RPN将图像特征映射作为输入,生成一系列object proposals,每个都带有相应的分数。
下面是Faster RCNN工作的大致过程:
- 输入图像到卷积网络中,生成该图像的特征映射。
- 在特征映射上应用Region Proposal Network,返回object proposals和相应分数。
- 应用Rol池化层,将所有proposals修正到同样尺寸。
- 最后,将proposals传递到完全连接层,生成目标物体的边界框
Faster R-CNN可以简单地看成是“区域生成网络+Fast R-CNN”的模型,用区域生成网络(Region Proposal Network,简称RPN)来代替Fast R-CNN中的Selective Search(选择性搜索)方法。
如下图
那么Region Proposal Network具体是如何工作的呢?首先,将CNN中得来的特征映射输入到Faster RCNN中,然后将其传递到Region Proposal Network中。RPN会在这些特征映射上使用一个滑动窗口,每个窗口会生成具有不同形状和尺寸的k个anchor box:
RPN的工作步骤如下:
- 在feature map(特征图)上滑动窗口
- 建一个神经网络用于物体分类+框位置的回归
- 滑动窗口的位置提供了物体的大体位置信息
- 框的回归提供了框更精确的位置
Anchor boxes是固定尺寸的边界框,它们有不同的形状和大小。对每个anchor,RPN都会预测两点:
- 首先是anchor就是目标物体的概率(不考虑类别)
- 第二个就是anchor经过调整能更合适目标物体的边界框回归量
现在我们有了不同形状、尺寸的边界框,将它们传递到Rol池化层中。经过RPN的处理,proposals可能没有所述的类别。我们可以对每个proposal进行切割,让它们都含有目标物体。这就是Rol池化层的作用。它为每个anchor提取固定尺寸的特征映射:
之后,这些特征映射会传递到完全连接层,对目标进行分类并预测边界框。