fast r-cnn论文综述

fast r-cnn论文综述(2015)
摘要:本文提出了基于候选区的针对目标检测的Fast R-CNN,比spp-net训练vgg16快3倍,测试时快10倍。

1、 引言
目标检测更复杂,因为要解决两个问题:
1) 对大量的候选框进行分类。
2) 回归这些候选框到更精确的位置。
本文提出一种更合理的训练方法,训练得更深、更快。

1.1 R-CNN和SPPnet
R-CNN有三个缺点
1) 训练是多阶段的。第一阶段:用log loss微调(现在大数据集ILSVRC上微调,再在要训练的小数据集上VOC上训练)用于对原图region(由选择搜索所得)提取特征的卷积层。第二阶段:将很多支持向量机(svms,分多少类就有多少支持向量机)与第一阶段中的卷积层相结合,用svm作为目标检测器取代通过第一阶段微调所得的softmax分类器。第三阶段:训练bb回归器。
2) 训练耗时耗空间:为了训练SVM和bb回归器,每个用卷积层从原图region中提取的特征都要保存到硬盘。光保存voc的这些特征就得几百gb。
3) 测试的时候每张图片(单gpu、vgg16)大概花47s。

注:
svm:大概可以把svm看做就是一种分类器,如果要分很多类,就有很多个svm,svm的参数是学习到的。
SPPnet的缺点:
1) 跟r-cnn一样,训练时多阶段的,先cnn提特征,微调cnn,训练svms,最后训练bb回归器。
2) 特征也要保存到硬盘里。
3) 与r-cnn不同的是,sppnet的微调不能微调空间金字塔池化之前的卷积层(因为直接把region映射到了卷积层的输出上,而r-cnn是原图region直接输入cnn,通过一个softmax分类器进行微调权重),不能根据具体的数据集进行微调卷积层的权重这就限制了网络的精度。

1.2 本文贡献
提出了fast -rcnn,弥补了r-cnn和sppnet的不足,fast r-cnn的优点。
1) 更高的检测准确度。
2) 使用的是多类别计算损失,训练时单步的。
3) 可通过训练更新所有网络的层。
4) 不用专门把中间提取的特征存到硬盘。(3)、4)都是废话!既然都是单步了肯定可以每次迭代更新所有的层了,肯定就不用专门把中间提取到的特征存到硬盘了。)

2.fast r-cnn的网络架构和训练方法
还是要用选择搜索提取regins。输入cnn网络的是一整张图片,cnn最后一层提取到fm,每个目标region映射到fm上,然后用roi池化对每个fm的region都提取一个固定长度的特征向量,将每个特征向量输入到全连接层,全连接层后面跟两个子输出层:分类和检测框回归(四个值)。
fast r-cnn论文综述
2.1 roi池化层
就是sppnet中的空间金字塔池化只有一个金字塔层(pyramid level)。
即:输入时hw像素的fm上的region,首先把这个region变成HW的网格窗口,那么每个网格的大小就是(h/H,w/W),找到每个网格中的最大值(max pooling),这个网格就等效成这个值。
2.2 从预训练的网络中初始化
用3个在imagenet上预训练的网络初始化做实验,每个预训练网络都有5~13个卷积层。当用一个预训练的网络来初始化Fast r-cnn时共有三点变化:
1) 预训练的网络的最后一个最大池化层用roi池化取代,来生成固定大小的特征向量供全连接层用。
2) 最后一个全连接层和softmax(用于分类)层,用两个子网络取代,一个网络是是全连接层和softmax层,用于分K+1类,另外一个是每个特定类别的bb回归器。
3) 网络的输入时两组数据,图片和一系列图片中的roi。

2.3 为检测作微调

用反向传播训练所有网络权重是Fast R-CNN的重要能力。首先,让我们阐明为什么SPPnet无法更新低于空间金字塔池化层的权重?

SPP-Net中fine-tuning的样本是来自所有图像的所有RoI打散后均匀采样的,即RoI-centric sampling,这就导致SGD的每个batch的样本来自不同的图像,需要同时计算和存储这些图像的Feature Map,过程变得expensive. Fast R-CNN采用分层采样思想,先采样出N张图像(image-centric sampling),在这N张图像中再采样出R个RoI,具体到实际中,N=2,R=128,同一图像的RoI共享计算和内存,也就是只用计算和存储2张图像,消耗就大大减少了。
这样做可能会出现一个问题,那就是很多roi都来自同一张图片可能会导致收敛很慢,但实际中这个问题不存在。

除了上述的层级采样,fast r-cnn在微调是同时优化softmax分类器和bb回归器,这样更合理。
多任务损失
损失计算是同时把分类损失和定位损失考虑在内,分类损失用的就是交叉熵计算如下:
fast r-cnn论文综述
定位损失用的是smooth L1损失(即不带平方的损失,不带平方会比带平方的(L2)对于异常值不那么敏感,如果用L2 smooth损失,需要对学习率进行谨慎选择,以防梯度爆炸。):
fast r-cnn论文综述
这个损失函数的曲线图如下
fast r-cnn论文综述

小批采样:每批2张图,这每张图采样64个region。

通过Roi池化层进行后向传播

SGD超参数:如何初始化权重,如何设置学习率,迭代次数,动量0.9,动量衰减0.0005。

2.4尺度不变性
实现尺度不变性两方案
1) 蛮力学习,即直接把图片resize到固定大小
2) 用图像金字塔。

3.1 fast r-cnn检测
输入一张图片(或一系列图片,即图片金字塔)和regions(2000个)。
如果用的是图像金字塔,就要把region映射到大概是224*224大小的那个fm上。
每一个roi,通过前向传播,最后都会得到一个后验概率分布p和一系列bb回归的偏移值。
给每个roi针对每个分类判断都要分配一个检测置信度Pr,这一点跟spp中一样。
最后还要用非极大值抑制。

3.1 为了更快检测,使用修剪的svd。

4.主要结果
更准、更快

4.1实验建立
用了三个预训练模型,根据CaffeNe(S), VGG_CNN_M_1024(M) , VGG16(L)。
4.2 voc2010和2012上的结果
4.3 voc2007上的结果
sppnet用图像金字塔,但fast r-cnn没用,仅通过微调卷积层的权重就超过了sppnet的精度。
4.4 训练和测试时间
fast r-cnn论文综述
被修剪的SVD.可以减少30%计算量,而mAP值下降了30%。

微调哪些层有用?
对于很深的网络(有很多卷积层),穿过roi池化层来微调卷积层很有用,但是比较通用的卷积层(如第一层),微调没啥效果。

5设计验证
5.1 多任务训练有用吗(即不是分段训练,而是端到端的训练)?
fast r-cnn论文综述
多任务训练避免了人为地安排一系列训练任务,比较每一组中的前两列,可以发现多任务训练比分段训练有0.8~1.1的提升。

5.2尺度不变性:用蛮力还是技巧(即用单尺度训练还是图像金字塔)?
实验结果:图像金子塔对精度提升很小,但却大大增加了计算量。
fast r-cnn论文综述
5.3 有必要更多的训练数据吗?
还是需要的。

5.4 SVMs比softmax更好吗?
fast r-cnn论文综述
这里softmax比线性核的svm稍微好点。

5.5 预选区越多越好吗?
不是,越多反倒有害(下图蓝实线)。

fast r-cnn论文综述

6 结论
稀疏的预选区对于提高检测精度更有帮助,而过去这一点(由于模型架构、训练方法等原因)很难实验验证。