一、R-CNN(2013)
Region CNN(简称R-CNN)由Ross Girshick在2013.11提出,是利用深度学习进行目标检测的里程碑之作,奠定了这个子领域的基础.
1.1 创新点
- 将大型卷积神经网络(CNNs)应用于自下而上的候选区域以定位和分割物体。
- 当带标签的训练数据不足时,先针对辅助任务进行有监督预训练,再进行特定任务的调优,就可以产生明显的性能提升。
1.2 R-CNN检测时的主要步骤为:
- 使用Selective Search算法从待检测图像中提取2000个左右的区域候选框,这些候选框可能包含要检测的目标。
- 把所有侯选框缩放成固定大小(原文采用227×227)。
- 先用ImageNet中的包含1000个分类的数据初始化AlexNet网络,得到较好的训练参数
- 将AlexNet最后一层换成21个节点,用VOC(20个分类)数据fine-tune
- 训练样本输入fine-tune后的网络,得到固定长度的特征向量。
- 把特征向量送入SVM进行分类得到类别信息,送入全连接网络进行回归得到对应位置坐标信息。
1.3 缺点与不足
- 重复计算。R-CNN虽然不再是穷举,但通过Proposal(Selective Search)的方案依然有两千个左右的候选框,这些候选框都需要单独经过backbone网络提取特征,计算量依然很大,候选框之间会有重叠,因此有不少其实是重复计算。
- 训练测试不简洁。候选区域提取、特征提取、分类、回归都是分开操作,中间数据还需要单独保存。
- 速度慢。前面的缺点最终导致R-CNN出奇的慢,GPU上处理一张图片需要十几秒,CPU上则需要更长时间。
- 输入的图片Patch必须强制缩放成固定大小(原文采用227×227),会造成物体形变,导致检测性能下降。
二、SPP-NET(2014)
Kaiming He等人在R-CNN的基础上提出了SPPNet,该方法虽然还依赖候选框的生成,但将提取候选框特征向量的操作转移到卷积后的特征图上进行,将R-CNN中的多次卷积变为一次卷积,大大降低了计算量。
2.1 创新点
- SPPNet引入了Spatial Pyramid pooling层
- 不用想R-CNN那样对每一个候选区域(Proposal、ROI), 只需要对原始图片做卷积、池化操作。最后将ROI映射到最后的feature map
2.2 SPP-Net步骤
SPPNet 是R-CNN基础上发展而来,所以基本思路、步骤是一样的。不同之处就在上面提到的两个创新点。对任意大小的图片做卷积、池化操作得到最后的feature map。将ROI映射到feature map的区域,那么就得到每一个ROI的feature map。用空间金字塔池化得到同样大小的feature map。其他与R-CNN无异
2.3 Spatial Pyramid pooling
金字塔池化的操作示意图如下
说明:任意大小的图片经过卷积操作得到feature map(全连接层之前),对feature map以44网格,22网格,11网格进行切分,那么久分别得到16、4、1个特征,加起来就是21维特征,实际是21N维特征(N为feature map的深度)
2.3 缺点与不足
- spp 层不可导,导致分类和主干网的训练是分开的
- proposal region 和 后面的训练还是分开的
三、Fast-CNN(2015)
Ross Girshick 针对SPPNet做了进一步改进提出的FRCNN ,其主要创新是RoI Pooling 层,它将不同大小候选框的卷积特征图统一采样成固定大小的特征。ROI池化层的做法和SPP层类似,但只使用一个尺度进行网格划分和池化。该层可以直接求导,训练时直接将梯度传导到backbone网络进行优化。FRCNN针对R-CNN和SPPNet在训练时是多阶段的和训练的过程中很耗费时间空间的问题进行改进。将深度网络和后面的SVM分类两个阶段整合到一起,使用一个新的网络直接做分类和回归。使得网络在Pascal VOC上的训练时间从R-CNN的84小时缩短到9.5小时,检测时间更是从45秒缩短到0.32秒
3.1 创新点
- 引入ROI池化(与SPP一个意思),该层可以求导,那么分类任务就可以和主干网一起训练,不用像Spp-Net和R-CNN那样用svm用来分类,DCNN用到特征向量(两步是分开的)
- SVD代替全连接层, 提高速度
3.2 Fast-CNN 步骤
- Fast RCNN仍然使用selective search选取2000个建议框,但是这里不是将这么多建议框都输入卷积网络中,而是将原始图片输入卷积网络中得到特征图,再使用建议框对特征图提取特征框。这样做的好处是,原来建议框重合部分非常多,卷积重复计算严重,而这里每个位置都只计算了一次卷积,大大减少了计算量
- 由于建议框大小不一,得到的特征框需要转化为相同大小,这一步是通过ROI池化层来实现的(ROI表示region of interest即目标)
- Fast RCNN里没有SVM分类器和回归器了,分类和预测框的位置大小都是通过卷积神经网络输出的
- 为了提高计算速度,网络最后使用SVD代替全连接层
3.3 缺点与不足
proposal region 和 后面的训练还是分开的
四、Faster-CNN(2015)
SPPNet和Faster RCNN都需要独立的候选区域生成模块,这个模块计算量很大,而且不易用GPU加速。针对这个问题,Shaoqin Ren 等人在Faster RCNN基础上提出Faster R-CNN ,在主干网络中增加了RPN (Region Proposal Network)网络,通过一定规则设置不同尺度的锚点(Anchor)在RPN的卷积特征层提取候选框来代替Selective Search等传统的候选框生成方法,实现了网络的端到端训练。候选区域生成、候选区域特征提取、框回归和分类全过程一气呵成,在训练过程中模型各部分不仅学习如何完成自己的任务,还自主学习如何相互配合。这也是第一个真正意义上的深度学习目标检测算法
4.1 创新点
- 主干网络中增加了RPN (Region Proposal Network)网络,通过一定规则设置不同尺度的锚点(Anchor)在RPN的卷积特征层提取候选框来代替Selective Search等传统的候选框生成方法
- 正正的实现了网络的端到端训练
五、原始图片中的ROI如何映射到到feature map
SPP-Net和Fast-RCNN中都需要将ROI(Region of interest)区域映射到feature map区域,这样就不需要对每一个候选框都做很多层的卷积运算,特别的候选框中很多都是重叠的,导致了很多的运算都是重复运算。所以能不能只对原始图片做一个周期的卷积运算,然后直接将ROI映射到feature map呢?Kaiming He大神团队给出了答案,是可以的。那么如何映射呢?请看下面分解。
5.1 感受野(receptive field)
在卷积神经网络中,感受野的定义是 卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。下图是Kaiming He在iccv分享上的一张图片。
5.1.1 感受野大小计算
卷积核一般都是正方形的,所以我们以一个维度为例。
以上图为例,在第4层的一个feature 在第一层的感受野的大小是多少?先给出公式
-
对于Convolution/Pooling layer:
- 对于Neuron layer(ReLU/Sigmoid/…)
我们用上面公式计算一下:
r4 = 1 (自已只能感受到自已)
r3 = s3(r4-1)+k3 = 1 * (1 - 1) + 2 = 2
r2 = s2(r3-1)+k2 = 2 * (2 - 1) + 3 = 5
r1 = s1(r2-1)+k1 = 2 * (5 - 1) + 3 = 11
所以对于第4层的一个像素点,在第一层的感受的大小为11(实际为11 * 11)
上面的方法是从下往上计算的,这篇blog中还提供了一种从上往下的计算方式,作者列子写的很详细,大家也可以看下,只能给出作者提供的公式如下:
两个方式我觉得大家都应该好好理解一下,对感受野的理解甚至对神经网络的理解都会很有帮助
5.1.2 感受野坐标计算
通常,我们需要知道网络里面任意两个feature map之间的坐标映射关系(一般是中心点之间的映射),如下图,我们想得到map 3上的点p3映射回map 2所在的位置p2(橙色框的中心点)
先给出计算公式:
上面是计算任意一个layer输入输出的坐标映射关系,如果是计算任意feature map之间的关系,只需要用简单的组合就可以得到,下图是一个简单的例子:
上面的给出的公式是从feature map 计算感受野的,但是在Spp-Net 和 Fast-Rcnn中都需要将ROI映射到feature map。那我们把上面的公式反过来就可以,已知p(i)坐标(ROI四个角点)求p(i+1)坐标。
何凯明在SPP-net中采用的方法。其实就是巧妙的化简一下上面的公式 。做法如下:
5.1.2.1 SPP-net的ROI映射做法详解原博客地址
SPP-net 是把原始ROI的左上角和右下角 映射到 feature map上的两个对应点。 有了feature map上的两队角点就确定了 对应的 feature map 区域(下图中橙色)。
SPP-net 是把原始ROI的左上角和右下角 映射到 feature map上的两个对应点。 有了feature map上的两队角点就确定了 对应的 feature map 区域(下图中橙色)。
这篇文章参考了很多其他的博客,特别是一些图和公式,所参考的资料都在下面的参考文献中一一列出。很多博客写的真的很详细,所以大家对同一个问题,不妨多参考一些文章。
参考文献
基于深度学习的目标检测算法综述
目标检测最新研究、论文汇总
目标检测综述(持续更新中)
深度神经网络中感受野
Convolutional Feature Maps-Kaiming He
原始图片中的ROI如何映射到到feature map
Concepts and Tricks In CNN(长期更新)
深度神经网络中的感受野(Receptive Field)