因本人刚开始写博客,学识经验有限,如有不正之处望读者指正,不胜感激;也望借此平台留下学习笔记以温故而知新。这一篇文章介绍的是目标检测中的经典Two Stage方法:候选区域+深度学习分类的方法,主要包括:RCNN、SPP Net、Fast RCNN 到 Faster RCNN。

1.1  背景

在计算机视觉领域,图像处理任务主要分为四大类,即:分类、定位、检测和实例分割,具体如下:
classify:是什么?
localization:在哪里?是什么?(单个目标)
detection:在哪里?分别是什么?(多个目标)
instance:在哪里?具体是什么形状?
一张图解释:

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

1.2 R-CNN

1.2.1  为什么使用 R-CNN

图像分类任务已经被 CNN 很好的解决,针对目标检测任务,传统的方法主要是通过人工特征提取+图像分类的方式进行,这样就存在两个主要的问题:
1. 基于滑动窗口进行区域选择没有针对性,并且时间复杂度高;
2. 人工特征提取的方式缺乏鲁棒性。
针对以上问题, RBG(Ross B. Girshick)等在 2014 年就提出了采用 RegionProposal + CNN的方式代替传统的使用滑动窗口 + 人工特征提取方式进行目标检测的方法,即:RCNN(region CNN)。

1.2.2  什么是 R-CNN

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

RCNN:region + CNN,一图以蔽之,包括 4 点:输入图像,摘取候选区域,CNN特征映射,区域图像分类。更详细一点的解释就是:
(1) 输入测试图像
(2) 利用 Selective Search 算法从图像中提取 2000 个左右的候选区域
(3) 为了满足 AlexNet 对于图像大小的要求,将每个候选区域统一为 227x227 的大小输入到 CNN,并将 CNN 的 fc7 层输出作为输出特征
(4) 将每个候选区域提取到的 CNN 特征输入到 SVM 进行分类,并使用回归器精细修正候选框位置

1.2.3  流程 步骤

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

1.2.3.1  候选区域生成

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

使用了 Selective Search 方法从一张图像生成约 2000 个左右的候选区域。基本思路如下:
使用一种过分割手段,将图像分割成小区域;
对于各小区域,合并可能性最高的两个区域,并重复执行。(合并:颜色,纹理,总面积占比等)

1.2.3.2 特征提取

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

预训练
借鉴 AlexNet 或者 VGG 网络进行训练,送入一个 4096->1000 的全连接层进行分类。

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

调优训练
同样使用上述网络,但是把最后一层换成了 4096->21 的全连接网络。

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

训练数据
使用 PASCAL VOC 2007 的训练集,输入一张图片,输出 21 维的类别标号,提取检测库的图像特征。

1.2.3.3   类别判断

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

SVM 分类器
对每一类目标,使用一个线性 SVM 分类器进行判别。输入为深度网络输出的4096 维特征,输出则是是否属于此类。

1.2.3.4  位置精修

BoundingBox 回归

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

目标检测问题的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,导致重叠面积很小,所以需要一个位置精修步骤。

1.2.4  讨论

RCNN 流程总结:
1.在图像中确定约 1000-2000 个候选框 (使用选择性搜索 Selective Search)
2.每个候选框内图像块缩放至相同大小,并输入到 CNN 内进行特征提取
3.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
4.对于属于某一类别的候选框,用回归器进一步调整其位置
RCNN 的优势:
为目标检测中存在的两个关键问题提出了新的思路:
1.候选区域 + CNN 的目标检测结构。不再是滑动窗法判断潜在区域方式检测,直接从一系列较可能是物体的候选区域中提取特征进行检测。
2.迁移学习的思想。本文使用识别库进行预训练,而后用检测库调优参数。最后在检测库上评测。
RCNN 的缺点:
1.训练分为多个阶段。首先要使用 search selective 算法提取候选区域,其次训练CNN 网络,最后训练 SVM 分类、训练 bbox 精确定位。
2.训练花费大量时间。因为分阶段且将提取的特征存入硬盘,读写耗时。
3.检测耗时。因为检测的图像也要一一对候选区域进行检测并前向传播。

1.3 SPP Net

1.3.1  为什么使用 SPP Net

CNN 一般都含有卷积部分和全连接部分,其中,卷积层不需要固定尺寸的图像,而全连接层是需要固定尺寸的图像。所以在 RCNN 中要提前把输入修改为固定的大小形式,即将每个 Region Proposal 缩放成统一的 227x227 尺寸。如此一来,就导致了 RCNN 存在速度低下的问题,因为 CNN 对所有候选区域进行特征提取时进行了大量的重复计算。

基于 RCNN 问题的考虑,Kaiming He 等人就提出了在卷积层后全连接层前添加一种可以使得输入给全连接层的图像尺寸是固定的 SPP 网络。

1.3.2  什么是 SPP Net

SPP:Spatial Pyramid Pooling(空间金字塔池化),是何开明等人 2015 年发表在IEEE 上的论文-《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for VisualRecognition》。
一图以蔽之:

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

1.3.3  讨论

所以 SPP 的优势就很明显了:
精度。不再对 CNN 网络的图像输入尺寸有要求,CNN 原本只能固定输入、固定输出,CNN 加上 SSP 之后,便能任意输入、照样固定输出,完全符合全连接层固定输入的要求。这样就避免了图像因不加入 SPP 时进行缩放导致的精度问题。
速度。RCNN 要对所有的候选区域进行 CNN 卷积操作,而 SPP Net 只需要对输入图像进行一次 CNN 卷积操作即可。只对原图提取一次卷积特征。
鲁棒。SPP 操作时进行了不同层级的池化,特征全方位覆盖,更加鲁棒。
SPP 的缺点:
同 RCNN,训练分阶段进行,且将特征存入硬盘。
此外,调优训练不能对 SPP 层下面的卷积层进行后向传播。

1.4 Fast R-CNN

1.4.1  为什么使用 Fast R-CNN

R-CNN 和 SPP 存在的缺点:
1.训练分为多个阶段。首先要使用 search selective 算法提取候选区域,其次训练CNN 网络,最后训练 SVM 分类、训练 bbox 精确定位。
2.训练花费大量时间。因为分阶段且将提取的特征存入硬盘,读写耗时。
3.检测耗时。因为检测的图像也要一一对候选区域进行检测并前向传播。
4. SPP 层下面的卷积层不能进行后向传播。

1.4.2  什么是 Fast R-CNN

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

Fast RCNN 的相对于 RCNN 的主要改变:
1.训练机制,分层采样,先随机采样 N 张图像,然后从采样的图像中选出 R/N个 RoIs,例如 N=2,R=128,那么每次做 SGD 的时候,有 64 个样本来自同一张图像,这样正反向传播都会有加速。
2.网络结构作了改变,引进了 SPP,但是不同于 SPP 的是,没有用多个尺寸而只用了一个尺度进行 SPP 池化。
3.将多任务损失函数引入网络,同时计算分类和回归的损失。实际实验证明,这两个任务能够共享卷积特征,并相互促进。

关于反向传播的计算:

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

其中,r 表示第几个候选区域,j 表示输出的第几个节点,[i=i ∗ (r,j)]表示 i 节点是否被候选区域 r 的第 j 个节点选为最大值输出。
关于多任务损失函数的计算:在FC层后接入了两个分支,一个是softmax用于对每个RoI分类,另一个是bbox,用于定位,多任务损失函数定义为:

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

其中:

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

文中采用的是 L1 正则,提到 L1 对于噪点相比于 L2 更不敏感,所以 L1 正则的模型将会更加鲁棒。

1.4.3  讨论

Faster R-CNN 流程总结
1.对整张图片 CNN,得到 feature map
2.卷积特征输入到 RPN,得到候选框的特征信息
3.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
4.对于属于某一类别的候选框,用回归器进一步调整其位置

Fast RCNN 对比 RCNN 的优势:
1.整张图只需要提取一次特征。
2.引入 SPP,且只进行一次 SPP 池化。
3.多任务损失函数的引入,将分类和回归纳入到深度网络框架,是端到端的学习。

1.5 Faster R-CNN

1.5.1  为什么使用 Faster R-CNN

Fast R-CNN 存在的问题:选择性搜索方法寻找候选区域的计算瓶颈。

1.5.2  什么是 Faster R-CNN

Faster R-CNN 是何开明等人在 Fast RCNN 发表以后,继续推进的图像检测领域成果,一图以蔽之,就是:

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

网上找到一张更加详细的图片做解释,转自文末参考博客

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

本质就是在 Fast R-CNN 中引入 Region Proposal Network(区域生成网络)替代Selective Search,同时引入 anchor  box(anchor 就是位置和大小固定的 box,可以理解成事先设置好的固定的 proposal)。

这里主要介绍与Fast RCNN的不同点,即RPN,更准确的说是如何设计RPN的:
RPN 的目的不用多说,就是用来推荐候选区域的,怎么实现呢?
RPN 网络也是全卷积网络(FCN,fully-convolutional network),可以针对生成检测建议框以对任务进行端到端地训练,同时预测出物体的边界和分类得分数,从上图可以看到,该网络在 CNN 后的特征映射层后接一个 3*3 的卷积层,再接两个 1*1
的卷积层,其中一个是用来给 softmax 层进行分类,另一个用于给候选区域精确定位。
具体地:

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

在这个过程中,其实有个疑问没有说清楚,通过 CNN 得到的 feature map 怎么通过 RPN 得到与原图对应的候选区域的,换句话说,RPN 输出的候选区域和 softmax的结构怎么与原图中的区域进行对应的。要解决这个疑问就得先理解anchors的概念。
因为提出的候选区域是在原图上的区域,所以要清楚 anchors 在原图中的位置。假设 CNN 得到的 feature map 大小为 w∗h,那总的 anchors 个数为 9∗w∗h,9 为上述的 9 种 anchors。假设原图大小为 W∗H,由 W=S⋅w,H=S⋅s,S 为之前所有层的 stride
size 相乘,所以 feature map 上的点乘以 S 即为 anchors 的原点位置,得到所有框的原点位置以及大小就可以得到原图上的 anchors 区域了。
有了这个理解,再来解释上面这张图:
1.原文中使用的是 ZF model,其 Conv Layers 最后的 conv5 层 num_output=256,对应生成 256 张特征图(feature maps),所以相当于 feature map 每个点都是256-dimensions。
2.在 conv5 之后,做了 rpn_conv/3x3 卷积且 num_output=256,相当于每个点又融合了周围 3x3 的空间信息),同时 256-d 不变。
3.假设在 conv5 feature map 中每个点上有 k 个 anchor(原文如上 k=9),而每个anhcor要分foreground和background,所以每个点由256d feature转化为cls=2k scores;而每个 anchor 都有[x, y, w, h]对应 4 个偏移量,所以 reg=4k coordinates(scores 和coordinates 为 RPN 的最终输出)
4.补充一点,全部 anchors 拿去训练太多了,训练程序会在合适的 anchors 中随机选取 128 个 postive anchors+128 个 negative anchors 进行训练。

论文中还详细介绍了以下两方面内容:
1.如何训练 RPN;
2.如何让 RPN 和 Fast RCNN 共享特征提取网络。
这在开源的代码中都能体会,这里不再赘述。

1.5.3  讨论

Faster RCNN 的优点:
将候选区域也纳入到整个网络,实现网络共享的同时,真正实现端到端的学习。

1.6  总结

各大算法进阶的本质,一图以蔽之:

【目标检测】从 RCNN、SPP Net、Fast RCNN 到 Faster RCNN

总的来说, R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN 一路走来,从 RCNN解决,“为什么不用 CNN 做 classification 呢?”到 Fast R-CNN 解决,“为什么不一起输出 bounding box 和 label 呢?”再到 Faster R-CNN 解决,“为什么还要用 selective
search 呢?”。将基于深度学习的目标检测的流程变得越来越精简,精度越来越高,速度也越来越快,特别是流程框架的统一对于后面端到端的 one stage 提供了新的视角。


1.7  参考文献

https://arxiv.org/pdf/1406.4729.pdf
https://arxiv.org/pdf/1504.08083.pdf
https://arxiv.org/pdf/1506.01497.pdf
https://blog.csdn.net/liuxiaoheng1992/article/details/81843363