RCNN
这个网络也是目标检测的鼻祖了。其原理非常简单,主要通过提取多个Region Proposal(候选区域)来判断位置,作者认为以往的对每个滑动窗口进行检测算法是一种浪费资源的方式。在RCNN中,不再对所有的滑动窗口跑算法,而是只选择一些窗口,在少数窗口上运行CNN。
流程是:
- 输入图像
- 利用selective search对图像生成1K~2K的候选区域(region proposal),这个量比传统的算法要少得多。具体一点,选出region proposal的方法是运行图像分割算法,对于分割算法跑出来的块,把它作为可能的region proposal输出。
- 提取特征:将region proposal resize为统一大小,送进去掉了softmax的CNN,对每个候region proposal提取特征
- 对区域进行分类:对从CNN output出来的特征向量送进每一类的SVM分类, 如果我有十个类别,那么每个region proposal要跑10个SVM,得到类别。这里为什么要用SVM而不是softmax,有一种说法是为了解决样本不均衡的问题,另外是早期神经网络还不如现在这样发达,当时SVM还是比较领先的分类器。
- 修正:对CNN output的特征向量(这个特征向量和第4步中拿去喂给SVM的是一个向量)做回归(左上角右下角的四个坐标),修正region proposal的位置。

Fast R-CNN
前面聊的这个RCNN吧,有几点问题:
- 可以明显地感受到它的计算量是非常大的,毕竟要对每个候选区域都进行特征计算。
- 冗余计算太多了,毕竟候选区域高度重叠。
- 同时又不是端到端的训练,还麻烦。
- 内存占用:需要储存多个SVM分类器和bounding box 回归器
- 对输入图片的大小有硬性要求
这种情况下,二代目fast R-CNN出现了,它的流程是:
- 将任意size的图片输入CNN,得到特征图。在RCNN中,先生成region proposals再做卷积,相当于做了多次卷积,浪费时间。
- 对原始图片使用selective search算法得到约2k region proposals(相当于RCNN的第一步)
- 在特征图中找到每一个region proposals对应的特征框。在ROI池化层中将每个特征框池化到统一大小
- 统一大小的特征框经过全连接层得到固定大小的特征向量,分别进行softmax分类(使用softmax代替了RCNN里面的多个SVM分类器)和bbox回归
Fast R-CNN组合了classification和regression, 做成single Network,实现了端到端的训练,实际上它相对RCNN最大的改进是抛弃了多个SVM分类器和bounding box回归器的做法,一起输出bbox和label, 很大程度上提升了原始RCNN的速度。

这里出现了一个新的概念,ROI Polling,很重要,是考点,解释一下:
ROI Pooling(Region of Interest)
它的输入是特征图,输出则是大小固定的channel x H x W的vector。ROI Pooling是将一个个大小不同的region proposals,映射成大小固定的(W x H)的矩形框。它的作用是根据region proposals的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和输出回归框操作。它可以加速处理速度。这个ROI Pooling在下面的Faster RCNN也会出现,它的作用是类似的,就是将region proposals池化成同样大小的vector,便于传入后续分类网络。
ROI Pooling有两个输入,一个是图片进入CNN后的特征图,另一个是区域的边框。ROI 的输出是一个region_nums x channels x W x H的向量。
说到这里耶解释一下ROI Pooling的进阶版本ROI Align。
ROI Pooling在池化的时候需要对浮点数边界int化,这样会存在一定的偏差。在特征图比原始图片尺寸小的情况下,一点点的精度损失映射到原始图片上就存在很大的像素点差别。而ROI Align就是取消了取整的操作,使用双线性内插的方法获得坐标未浮点数的像素点上的图像数值。
Faster RCNN
在Fast RCNN的基础上,Faster RCNN在性能上又有了进步。Faster RCNN将特征抽取(feature extraction),proposal提取,bounding box regression,classification都整合在了一个网络中,使得综合性能有较大提高,在检测速度方面尤为明显。对比起它哥哥Fast-RCNN, 其实最重要的一点就是使用RPN(下面会详细解说)来代替原来使用分割算法生成候选框的方式,极大的提升了检测框生成速度。总地来说,Faster RCNN对Fast RCNN的改进点在于获得region proposals的速度要快很多。
具体来说,它的网络结构长这样:

- 提取特征:输入固定大小的图片,进过卷积层提取特征图feature maps
- 生成region proposals: 然后经过Region Proposal Networks(RPN)生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用bounding box 回归修正anchors获得精确的proposals(候选区域)。
- ROI Pooling: 该层的输入是feature maps和proposals,综合这些信息后提取proposal feature maps
- Classification: 将Roi pooling生成的proposal feature maps分别传入softmax分类和bounding box regression获得检测物体类别和检测框最终的精确位置。
具体一点的图长这样:

Region Proposal Network(RPN)
Faster-RCNN的巨大优势主要在于第二步Region Proposal Networks(RPN)的设计。传统的Selective Search方法生成检测框都很耗时。而使用RPN生成就会快很多,我们来看看RPN的原理叭
RPN的作用是用来提取候选框的,类似于前面介绍的RCNN的第一步Selective Search。它的网络结构基于神经网络,但是输出的是包含二元softmax和bbox回归的多任务模型。RPN网络的输入是前面CNN output的feature maps。我们在feature map上做一个大小为3x3的滑窗操作, 得到一个channel是256维的特征图,尺寸与input的特征图相同,维度是256*H*W。对这个256维的向量,我们分别做两次1x1卷积操作,一个得到2k score, 一个得到4k coordinates。这个2k score只区分是不是目标,输出候选区域属于前景(物体)和背景的分数,这里注意,这里的分类只区分是否包含目标,至于所包含目标的类别,是Faster-RCNN最后的分类网络干的事情。4k coordinates指的是对原图坐标的偏移。

那么这个k又是什么东西呀?这里有一个anchor的概念,也是RPN的核心之一。论文预先设定好生成9个anchors。我们前面说到对于feature map, 我们有一个3*3的滑窗操作。对于每次滑窗所划到的3x3的区域,就以该区域中心点为坐标,生成9个anchor。anchor它的本质是,将相同尺寸的输入,得到不同尺寸的输出。它们的中心相同,但是有不同的长宽比和尺度。这9个anchor, 中心坐标一样,但是大小各不相同,如下图:

而上文提到的k就是anchors的数量,所以2k个分数就是9个anchors的共18个分数,36个坐标。对于每个anchor, 计算anchor与ground-truth bounding boxes的IoU,大于0.7则判定为有目标,小于0.3则判定为背景,介于0.3-0.7,则设为0,不参与训练
这么说完可能还是有点模糊,我们来看看RPN的代价函数:
代价函数有两部分,对应着RPN的两条路线,即是否包含目标和bbox的坐标与anchor坐标的回归误差。注意回归误差这一项中,L与p相称,也就是说,如果anchor不包含目标,那么box输出位置是不算误差的,对于
self
插嘴一句,我们现在在做目标检测基本是用YOLO了,贼快,Faster RCNN虽然已经Faster了还是YOLO快!当然region proposals的概念很值得了解,YOLO的缺点是在检测小目标时难以得到精确的定位。
Faster R_CNN改进方法
Faster R-CNN从2015年被提出,后来也出现了不少改进方法,下面列举一些方向,有兴趣可以再去深入研究:
- 提取特征网络的改进:使用ResNet代替原来的VGG提取特征,效果显著
- RPN升级版本:FPN
- ROI升级:PS_RPI
- R-FCN
- Mask R-CNN
- DeepText
- 训练过程中的hard-example finetune,可参见:视觉分类任务中处理不平衡问题的loss比较 - Daniel2333的博客 - CSDN博客
- A-Fast-RCNN, 这篇文章引入了GAN, 在某些数据集上精度增加
参考文献
晓雷:RCNN- 将CNN引入目标检测的开山之作
最帅的大厨:RCNN-> SPP net -> Fast RCNN -> Faster RCNN
Fast R-CNN论文详解 - WoPawn的博客 - CSDN博客
CNN目标检测(一):Faster RCNN详解
RPN 解析 - lanran2的博客 - CSDN博客
目标检测 - Faster R-CNN 中 RPN 原理
RPN 解析 - lanran2的博客 - CSDN博客
目标检测 - Faster R-CNN 中 RPN 原理
Faster-RCNN算法精读 - hunterlew的专栏 - CSDN博客
详解 ROI Align 的基本原理和实现细节
Faster R-CNN 深入理解 && 改进方法汇总