R-CNN VS FAST R-CNN
R-CNN(Region CNN)
区域建议: Selective Search
- 找出所有潜在可能包含目标的区域
- 运行速度相对较快,selective search 在 CPU 上仅需运行几秒钟可以产生 2000 个候选区域
早在 R-CNN 出现之前人们都是在使用 HOG 技术来进行简单目标识别,HOG 能够识别任务比较简单,局限性也很大,对于输入图像具有一定要求。R-CNN 早出现 2014 年,虽然今天在目标检测任务时,已经几乎没有人再去选择 R-CNN 来完成目标检测任务,但是在当下流行的模型中看到其身影,因为他给我们留下如何去做目标检测这件事的大概思路。
在 R-CNN 中,候选框提取是用 CNN 卷积,之前如果已经了解过了 fine-tuning ,那么就不难理解如何使用 CNN 来提取候选框。fine-tuning 技术适用一些小样本,也就是样本数量不多情况时。我们将一些基于 imageNet 这样大规模数据集训练出的经典网络的最后一层去掉,保留之前所有层来获取特征层,这些特征层可以看作一个一个区域。现在损失函数不仅单单考虑分类正确性还需要考虑候选框的位置的损失值。
我们可以思考一下,这里对于分类问题为什么不用 softmax 而是用 SVM 去做单分类。
![](https://img.haomeiwen.com/i8207483/993331d789e24d75.jpeg)
<img src="images/r_cnn_001.jpeg">
在 R-CNN 中的,在 RCNN 中候选框的选择使用的方法是 selective search。selective search 生产的候选框方案是根据相邻像素颜色或 pattern 进行聚类选择候选框,然后将候选框resize为固定大小(warped region)。输入给 ConvNet 进行提取特征,也就是我们去掉最后一层而保留倒数第二层 4096 作为特征输入 SVM 分类器,交给分类器 SVM 进行分类任务。Bboxreg 对 selective search 提供候选框通过回归进行一次精修。
SVM 是一个单分类 SVM 对于所有分类都需要进行一次分类任务。如果我们有 10 分类,那么对于每一个候选框就需要跑 10 次 SVM。
FAST R-CNN
每张图片要生产大概 2000 个区域,然后对每一个区域进行一次预测。在 2000 区域中存在大量重叠区域,而对这些区域进行分类势必对重叠区域进行反复计算而造成效率底下。那么也就是在 R-CNN 要进行几乎 2000 次的 forward,这也是 R-CNN 慢的问题。
<img src="images/fast_r_cnn_001.jpg" width="100%">
所以在 2015 年出现了 FAST R-CNN ,FAST R-CNN 是在 R-CNN 基础上变得更简单更快。主要优化工作是先对图片特征提取 ConvNet 是对整张图片而不是对每一个区域,然后在 ConvNet 上进行 selective Search 进行生产候选框,也就是将 selective search 生产候选框映射到特征图上而不是图片上。然后对特进行裁剪缩放做一个 FC 进行分类,通过 softmax 做分类,linear 做修正边界框的偏差。
到现在大家发现我们弃用 SVM 来做分类直接使用全连接层来做分类,这样就省略中间过程实现端到端的网络结构。
我们之前候选框进入 CNN 之前进行一次 resize 再进入 CNN,但是在 FAST R-CNN 是先做卷积然后在生产候选框,这样就带来问题,因为在卷积中做 resize 是没有求导的。所以引入 RoI Pooling 来解决问题。
RoI Pooling
![](https://img.haomeiwen.com/i8207483/7182f0b5307fb22a.png)
<img src="images/fast_r_cnn_roi_001.png" width="100%">
- 将区域顶点规整到网格交点上
- 将其粗略地分成面积相等
个子区域
-
然后对于每一个子区域进行最大池化
fast_r_cnn_roi_002.jpg
经过 RoI Pooling 前区域特征的空间尺寸可能不一致,但是处理后所有区域特征尺寸都是一样的。
我们现在简单解释一下 RoI pooling 作用,我们是将 selective research 提取出的候选框在输入 CNN 前进行一次大小调整,将这些区域 resize 为长宽等长的方形后再输入 CNN,现在我们是在 CNN 中直接做 selective research 了,所以如何对这些候选框进行调整尺寸呢?因为在卷积中进行 resize 后我们就没有办法对卷积求导了,所以这里使用了一种类似 max pooling 技术,就是通过 max pooling 在对区域进行缩放时保留该区域的最大值作为其值,下面图掩饰 RoI pooling 的整个过程。
![](https://img.haomeiwen.com/i8207483/c1bae153a4ab5275.gif)
RoI Align
那么因为我们在做 RoI pooling 时候因为选择的是将区域顶点规整到网格交点上,这样就带来处理后的区域特征会有轻微的对不齐问题。
![](https://img.haomeiwen.com/i8207483/df76ec0c7ae0372a.jpg)
为了避免因为 RoI pooling 出现对不齐问题,引入 RoI Align 来改进这个方法。这一回不做坐标规整直接划分为 4 份然后这些划分区域均匀设计 4 点,然后每一个点可能处于 4 框交界线