3.2.2 Fast R-CNN
Fast R-CNN是在R-CNN的基础上发展而来的,总结R-CNN的缺点:
- 训练过于复杂。训练需要很多步骤,从卷积网络到SVM再到Bounding box回归,整个Pipeline过于复杂。
- SVM分类器的缺点。训练需要大量时间和空间 我们需要为每个类别都训练一个二分类的SVM,而且由于SVM的特征来自于卷积网络的全连接层,这两个模型不好集成,因此需要把卷积网络的特征写到磁盘上,这要占用大量磁盘空间和IO时间。
- R-CNN的预测时间长。预测的速度慢,对于每个候选区域,我们都要用卷积网络提取特征(基本相对于一次forward计算),即使有一个GPU,预测一个图片平均都需要47s的时间。
针对以上问题,进行了一定程度的优化,于是有了Fast R-CNN。Fast R-CNN主要是改进了R-CNN的一个缺点(其需要对每个ROI做CNN,这样做了大量重复性的工作,导致R-CNN速度很慢)。

Fast R-CNN的改进方法是:
- S1:根据输入图片和CNN计算得到一些特征图;
- S2:然后对于每个ROI,从这些特征图中得到对应的区域;
- S3:使用这些区域pooling计算得到固定大小的特征;
- S4:把这些特征输入全连接层;
- S5:全连接层分出两个分支,一个用于softmax进行分类,另一个分支直接输出4个数值,表示Bounding Box的位置。
- ROI Pooling
主要解决的问题是,在不同大小的ROI尺寸上,得到相同大小的特征图(7, 7),这样就可以检查不同大小的目标对象。进行目标分类和bounding box回归。
- 预训练
- 使用图片分类的数据来进行预训练;
- 完成预训练后再fine-tuning;
- 把最后一层pooling层换成RoI层,把1000类的softmax换成
的类别和背景分类器。
- 另外预测4个Bounding Box的输出。
这里的分类和回归是两个目标函数,分别对应RoI区域的类别和Bounding Box框4个参数值。
- 多任务损失
Fast R-CNN的损失函数为:
其中
-
表示候选区域的真实类别
-
表示真实bounding box的4个参数值
-
表示模型预测的分类概率
-
表示模型预测的bounding box的4个参数值
-
表示如果真实分类是背景,那么它的值就是零,也就不要考虑Bounding box预测的损失了
- 这里的
和
分别表示分类和回归损失,具体形式为
分类损失交叉熵喽!这是最常见的了。
- 改进效果
下图是效果比对,和R-CNN比对。

3.2.3 Faster R-CNN
Fast R-CNN主要优化了识别和回归效果。Faster R-CNN在此基础上改进了Selective Search。
- Faster R-CNN的架构
用RPN来替换selective search预选框。
- 首先用一些卷积池化层得到一些feature map
- 然后使用一个单独的RPN(Region Proposal Network)来生成候选区域和Bounding Box回归
- 最后通过RoI Pooling得到的特征训练卷积网络来判断物体的类别(包括不是目标的背景类别)


- RPN
RPN模块的输入输出:
- 输入:是一张图片
- 输出:是一些矩形区域,每个区域都有一个类别得分。
RPN会把输出中一些得分比较高的区域交给Fast R-CNN来判断是属于哪一类。
RPN的算法流程:
- S1:使用
来得到一些列特征图
- S2:使用全连接层将这些特征图降维到d(256)
- S3:这个d(256)维的向量被输入到两个网络中:一个网络用来做区域的proposal;另一个区域用来判断这个候选区域是否是我们关注的目标物体。
anchor:
- 提出anchor的目的是为了解决一个CNN卷积输出的特征图中(
)有多个物体存在的情况下如何处理的问题?
- 这里提出了9个候选框(都是经验得到的),有两个参数scale和area ratio。这9个候选框由三个scale(64、128, 256)和area ratio(1:1, 1:2, 2:1)来组合而得到。这些滑动窗口的中心和原始候选框的中心是重合的。



可以看到最后学习出来的区域与原来的区域不同,所以这里给出的anchor只是给出了一个目标轮廓的大概,在做bbox回归的时候,会对anchor的尺寸进行纠正。
- 损失函数
训练RPN的数据获取,通过IoU来得到。IoU的正样本的阈值为0.7,IoU的负样本的阈值为0.3。当然这个阈值也是可以根据经验和任务属性进行修改的。
RPN损失函数:
上式中是这个anchor被预测的分类,
是真实的分类,
是交叉熵,如下:
是bbox位置的预测值和真实值的距离。
集合为{
},
集合为{
}。{
}和{
}分别表示bbox的
和真实bbox的
。
上式中分别是anchor的中心点
坐标和宽度高度。
网友评论