Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
一、前期知识
1.SPPNet
1.1 为什么要提出SPP-Net?

RCNN中,图片输入的尺寸是固定的,这是因为CNN中全连接层的参数是固定的,所以对于包含不同形状目标的图片,要进行裁剪和变形,但是,裁剪会造成信息丢失,变形会造成信息扭曲(变化),所以这两种方式都会影响最终的分类精度
以任意大小的原图作为输入,能最大程度的保留信息和提取特征,但是,卷积层输出的feature map要和全连层固定的维度对应,所以,只要解决了卷积层输出和全连接输入维度对应的问题,那么问题解决了,而SPP-Net就是用来解决这一问题
1.2 SPP-Net核心
空间金字塔池化层 :
仅对原图提取一次卷积特征
针对于不同尺寸feature map的输出,保证得到同样大小的fc层的输入

输入:一张任意大小的feature map,假设为(w, h, c)
输出:固定为21*c
如上图所示,用三种不同大小的尺度,对卷积层输出的feature map进行划分,得到不同大小的块,然后再对这些块每个都提取一个特征值,因为每个块有c个通道,所以得到的每个块对应的1c的特征向量,如图中有21个块,所以最后输出为21256(图中c=256)
结论:通过空间金字塔池化就能够完成对于不同大小候选框的输入,来得到一个固定的输出,用于后面fc层的计算
1.3 SPP-Net的网络结构

2.Fast RCNN
2.1 Fast RCNN的作用:
- 结合SPPNet改进RCNN——引入ROI Pooling(单层的SPPNet)
- 多任务网络同时解决分类和回归——不再用SVM和线性回归,用神经网络来完成分类和回归
- 共享卷积特征——节省卷积运算的时间,去掉重复的计算
2.2 Fast RCNN的网络结构:

- 首先将整副图作为输入传进CNN,通过一些卷积和最大池化层产生feature map
- 然后通过selective search 得到候选框
- Roi pooling 层将这些候选框对应于feature map上的区域,提取出固定长度的特征向量
- 接着将得到特征向量传入全连接层
- 全连接层最终形成两个分支输出层
- 一个是softmax输出层,输出关于K个目标和1个背景类别的概率
- 另一个是bounding box regression层,对于K个目标,对应输出4个表示其位置的值
2.3 ROI Pooling

- pooling层的一种,是简化版的、单层的金字塔池化
- 将proposal抠出来,然后resize到统一的大小
空间金字塔池化是以不同的尺度的窗口对feature map进行划分,得到不同的维度的块,然后再相应的进行池化,得到固定长度的特征向量
而RoI池化,相当是单层的金字塔,因为它只有一种尺度,它只用一种尺度大小的窗口对RoI对应于feature map上的区域进行划分,然后再进行池化,得到固定长度的特征向量
具体操作如下 :
- 根据输入的image,将RoI映射到feature map对应的位置
- 将映射后的区域划分为相同大小(可能不同)的sections (sections数量和输出的维度相同)
- 对每个section进行max pooling操作,得到固定长度的特征向量
举例:

如上图所示,假设固定输出为4维向量,先根据Roi从原图映射到feature map上对应的区域,即图中粗黑线区域,然后将该区域分成四个部分,在对这四个部分取最大值,则得到最终的4维输出向量
说明:
如果是输入区域长宽相同,则划分的是大小相同的4个区域,这里输入是5*7,5/2=2,7/2=3(整除),所以这里宽划分为高划分为2和3,宽划分为3和4,就得到图中所示4个区域
2.4 Fast R-CNN的训练过程

- 预训练一个用于分类的CNN
- 使用Selective Search选中2000个候选区域
- 修改预训练的CNN,将CNN的最后一个flatten层及后面的层删掉,换为Rol Pooling层
- 在Rol Pooling层后面加上几个全连接层,然后加上两个分支:
- 一个分支是SoftMax层,用于K+1个类别的分类
- 另一个分支是bounding-box regression模型,用于预测K个类别的目标相对 Selective Search的定位的偏差
相对于SPPNet主要改进点:
- 提出ROI Pooling层——单层的SPPNet,同样满足FC层固定输入的要求
- 多任务网络的使用——FC层的输出直接通过softmax做分类
2.5 Fast RCNN网络缺陷
存在瓶颈:
- region proposal依然采用Selective search,找出所有的候选框十分耗时
- 整个网络的过程不是端到端的过程
二、Faster R-CNN
1.Faster R-CNN提出的原因
在之前的目标检测算法中,无论是传统的目标检测算法,还是后面的R-CNN、SPPNet、Fast R-CNN这些深度学习目标检测算法,候选区域的筛选和提取,一直是一个非常耗时和繁琐的过程,并且也是导致整个网络结构不是一个端到端的过程的原因。
而Faster R-CNN针对这一问题提出了RPN网络,RPN网络主要就是为了代替先前的那些算法中的候选框提取筛选的步骤,同时通过RPN网络,算法的性能和准确度也得到了进一步的加强。
2.RPN网络:
2.1 Anchor机制
Anchor ——以每一个滑动窗口的中心点,按照规定的尺寸和长宽比得到的框
- 三种面积尺寸(128,256,512)
- 在每个面积尺寸下,取三种不同的长宽比(1:1, 1:2, 2:1)

2.2 RPN的作用
-
提出候选区域
-
前景背景分类+框位置的回归
- 粗分类——仅仅对候选区域是背景还是前景进行二分类,后续网络中进一步判定具体类别
- 粗定位——在RPN中对框的位置进行一步粗略的回归,后续网络中进一步对位置进行精修

RPN主要过程:
-
输入:feature map,anchor box
-
输出:anchor box的分类和位置向量,以及最终候选区域
假设前面特征提取部分得到的feature map大小为nn256,然后根据上述anchor box机制,在feature map上的每个点上生成k个anchor box,那么总共有nnk个anchor box,然后对这些anchor box进行粗分类和位置回归,feature map上的每一个点就得到了2k个分类得分向量和4k个位置回归向量,注意这里的位置回归的信息,是原图上的位置。
得到了每个anchor box分类得分,对其进行排序,然后再进行筛选,得到2000个候选区域
图中的256-d,其实是输入的通道,同时也是每个anchor box进行卷积时的通道,假设某个点上的anchor box为22,那么卷积时,实际上就拿feature map上以这个点为中心,长宽为22,厚度为256的三维向量的特征信息进行卷积
3.Faster R-CNN网络的大体结构
Faster R-CNN网络:
- 提出了Region Proposal Network(RPN)
- 实现了端到端的检测

首先 ,在卷积层采用了共享卷积的操作,然后采用了RPN网络来完成proposal提取的过程,最终候选区域的类别和框的位置,都采用神经网络来完成
也就是说,输入一张图片,通过Faster R-CNN网络,直接得出分类和定位结果,即实现了端到端的检测
4.Faster R-CNN的网络结构
- 主干网络: 13con+13relu+4pooling
- RPN: 3x3+背景前景区分+初步定位
- ROIPooling
- 分类+位置精确定位

5.Faster R-CNN的损失函数
L(\{p_i\},{\{t_i\}})=\frac{1}{N_{cls}}\sum\limits_{i}L_{cls}(p_i, p_i^*)+\lambda\frac{1}{N_{reg}}p_i^*L_{reg}(t_i,t_i^* )
- i:一个mini-batch中的一个Anchor的下标
- p_i: 预测第i个Anchor为指定目标的概率,如果anchor是positive则为1,否则为0
- p_i^*: 第i个Anchor是否真实对应一个目标
- t_i: 预测第i个Anchor对应目标的中心位置,宽度,高度的转换值(同R-CNN)
- t_i^*: 第i个Anchor对应目标的ground-truth的中心位置,宽度,高度的转换值(同R-CNN)
- L_{reg}(t_i, t_i^*)为定位损失,和Fast-RCNN类似,不同点在与对于每一种大小,宽高比的Anchor,使用一套权值.而Fast-CNN中一共只有一套权值
- L_{cls} (p_i,p_i^*)=-p_i^*log p_i-(1-p_i^*) log(1-p_i),为关于两个类别(是目标类别or不是)的log损失
- p_i^*L_{reg}: 这一项意味着只有positive anchor才有回归损失值,nagative anchor没有损失值(p_i^*=0,对应的回归损失项就没了)
- N_{cls}: 训练过程中mini-batch大小(为256)
- \lambda: 用于平衡两种损失(为10)
- N_{reg}: 训练过程中Anchor位置数量(约为2400)
6.Faster R-CNN的训练过程
1.预训练一个用于分类的CNN
2.使用CNN的特征图作为输出,端到端的fine-tune RPN(region proposal network) +CNN.当loU > 0.7为正样本, loU <0.3为负样本
- 在特征图上面使用滑动窗口
- 对每一个滑动窗口,产生多个Anchor (相当于Selective Search选中的候选区域). 一个Anchor由滑动窗口的中心位置,窗口尺寸,窗口宽高比决定.论文中使用3个尺寸和3个宽高比,所以一个滑动窗口位置对应9(3*3)个Anchor.
3.固定RPN的权值,使用当的RPN训练一个Fast R-CNN
4.固定CNN, Fast R-CNN(SPPN)的权值,训练RPN.
5.固定CNN, RPN,训练Fast R-CNN的权值
交替训练Fast R-CNN和RPN,即重复步骤4和5,直到二者的损失函数都小于某个阈值时停止
三、RCNN、SPPNet、Fast RCNN、Faster RCNN之间的关系

RCNN是在原图上做region proposal,即在低级特征上做region proposal,产生的推荐区域多,导致计算量大,同时因为输入尺寸固定,要对region proposal做crop和warp,导致特征信息丢失或者变形,而且低级特征对于图像分类辨识度不高,所以低级特征或者说变形丢失信息的低级特征的输入使得最终的分类精度低,所以它既慢又不准。因此,我们希望通过直接输入任意尺寸的图片,在具有高级特征的feature map上做region proposal,但是又存在fc层需要固定尺寸输入的问题
SppNet的提出解决了任意尺寸图片的输入和fc层需要固定尺寸输入的矛盾,Spp层处在cnn的输出和fc层的输入之间,能够对任意尺寸的feature map进行池化,得到固定为21*c(c为输入的通道数)的输出。

Fast RCNN在RCNN的基础上加入了ROI池化(ROI池化是简化版SPPNet),同时,相比起SppNet使用的是SVM对最后的fc层输出做分类,Fast RCNN直接通过网络本身的softmax对fc输出做分类

Faster RCNN在Fast RCNN 的基础上加入了RPN,Fast RCNN的region proposal是在CNN输出的feature map,即高级特征上做region proposal,但是提取region proposal方法依然是selective search,而Faster RCNN中的RRN取代了selective search来做region proposal

