FastRCNN论文详解

Fast RCNN的paper地址:https://arxiv.org/abs/1504.08083
FastRCNN是基于RCNN和SPPnet等网络的基础上上做了系列的创新型的改进得到的,比起前面的工作既提高了训练和测试的速度,也提高了一点准确度。
文章作者分析了RCNN和SPPnet各自的 缺点,然后对比指出自己的Fast RCNN带来了哪些贡献。
RCNN文章分析:RCNN个人理解
RCNN的缺点:

  1. Training is a multi-stage pipeline 。RCNN训练是一个多阶段的流程,分三个阶段,分别是为一、CNN做fine-tuning;二、利用微调之后得到的特征训练SVM;三、训练bounding box regressor。
  2. Training is expensive in space and time. 训练所需空间与时间耗费巨大,为了训练bb regressor,需要将每个图片中的每个proposal的被提取出来的特征写入磁盘;每个proposal都要单独的一次前向传播,就很费时!
  3. Object detection is slow.测试时由于也需要将同学中每个候选框单独的前向传播提取特征,所以时间较长。

SPPnet文章分析:SPPnet简介
SPPnet的缺点:
反向传播时无法(inefficient/expensive)更新空间金字塔池化层前面的卷积层。
SPP-Net中fine-tuning的样本是来自所有图像的所有RoI打散后均匀采样的,即RoI-centric sampling,这就导致SGD的每个batch的样本来自不同的图像,需要同时计算和存储这些图像的Feature Map,过程变得expensive. (RCNN和SPPnet一样也是先提取所有图像的proposal,然后提取出特征,在从所有的特征中sample 样本做训练,这样甚至可能同一个batch中的所有RoI全部来自不同的图片)

Fast R-CNN采用分层采样思想,先采样出N张图像(image-centric sampling),在这N张图像中再采样出R个RoI,具体到实际中,N=2,R=128,同一图像的RoI共享计算和内存,也就是只用计算和存储2张图像,消耗就大大减少了。

对比起来,Fast RCNN的改进:
Training is single-stage, using a multi-task loss。 Fast R-CNN uses a streamlined training process with one fine-tuning stage that jointly optimizes a softmax classifier and bounding-box regressors, rather than training a softmax classifier, SVMs,and regressors in three separate stages
训练是一个阶段的,使用了多任务损失函数来训练。 Fast R-CNN 在一个fine-tuning中同时优化softmax分类器和bounding-box regressors。
Training can update all network layers。 In Fast RCNN training, stochastic gradient descent (SGD) minibatches are sampled hierarchically, first by sampling N images and then by sampling R/N RoIs from each image.Critically, RoIs from the same image share computation and memory in the forward and backward passes. Making N small decreases mini-batch computation。
训练可以更新所有的层。Fast RCNN训练的时候每次的minibatch采样是有特定规范的,每次从N张图片中采样,每张图片采样R/N个Roi,这样总共还是R个RoI,但是不同的是只需要计算出N张图片的feature map,因为同一张图片的RoI在前向传播和反向传播中共享计算和存储资源,这样内存的消耗就大大减少,可以更新到全部的卷积层了。(作者在后面列出,并不需要真的更新到所有的卷积层,对于深层次的网络只需从第三个Conv3 -1开始更新,而较浅的从Conv2-1开始就行,Conv1提取得到的是一些公共特征,与具体任务无关,所以每必要更新)。
除此之外,Fast RCNN由损失函数计算由分类损失和定位损失两部分组成,从而能够同时优化这两部分呢;其中bb regressor的损失改为了L1范式,有更强鲁棒性;将RCNN中的SVM替换为了softmax,实验表明这样准确度更高;文章中还提到了mAP和Average Recall的关系,指出IoU的阈值会对这两个起到很大影响;使用SVD来减少了全连接层的参数数量,将单个较大的全连接层替换为两个紧邻的全连接层,中间没有非线性激活;Fast RCNN采用的一个max pooling将任意RoI中的特征采样为H×W空间大小的feature map,然后在传入全连接层,这里RoI layer可以看作SPPnet中 spatial pyramid pooling layer的一个特例,注意每个Pooling针对每个channel独立操作的。虽然Fast RCNN对输入图片的尺寸没有了限制,但是实验表明单一尺寸的图片结果要好些,这里尺寸是训练时的输入尺寸,test时任意尺寸的图片都行,直接输入;proposal是否越多越好呢,实验表明2000左右的时候mAP和AR曲线相较,也就是2000的时候最合适;实验数据是否越多越好呢,of cause,voc2007+voc2012表现最好。
在这里插入图片描述

参考上图,我表诉一下detection的步骤:首先输入的数据为整张图片和selective search得到的2000个proposal,输入整个图片经过CNN提取特征得到我们的feature map,然后对应每个proposal映射到feature map上得到的RoI,在每个RoI上进行RoI 层的Pooling,全都得到一个固定大小H×W的feature map,之后将这些feature map经过全连接传到softmax和bound ing box regressor,得到每个Roi对应每个类的概率值以及boundin box的修正位置。