Fast RCNN论文阅读笔记

论文地址:https://arxiv.org/pdf/1504.08083.pdf
项目地址:https://github.com/rbgirshick/fast-rcnn

Fast RCNN是继2014年提出的RCNN之后,Ross Girshick在15年推出的,构思精巧,流程更为紧凑,大幅提升了目标检测的速度。
同样使用最大规模网络,训练时间从84小时减为9.5小时,基于VGG16的Fast RCNN算法在训练速度上比RCNN快了将近9倍,比SPPnet快大概3倍;测试时间从47秒减少为0.32秒,测试速度比RCNN快了213倍,比SPPnet快了10倍。在VOC2012上的mAP在66%左右。

1.背景介绍
Fast RCNN 是针对RCNN +SPPNet 的改进,改进的原因是:
1.1.RCNN
(1)训练是多级pipeline的。RCNN首先采用log代价函数在目标候选框上微调卷积网络,然后,将SVMs适用到卷积特征。SVMs取代了通过微调学习softmax分类器,充当了目标检测器的任务。在训练的第三阶段,学习检测框Bounding-box回归。
(2)训练非常耗费空间和时间。对于SVM和Bounding-Box回归训练,针对每个图像的每个目标推荐的特征被提取,并被写到硬盘中。采用非常深的网络,如VGG16,这个过程大概会花费2.5个GPU-days,仅仅针对VOC2007训练集的5k图片。这些特征要求成百上千GB的存储空间。
Alt text
(3)目标检测非常的慢。在测试时,从每张测试图像提取的每个目标推荐的特征。在GPU上用VGG16来检测一张图片需要花费47s。
由此可以看出RCNN的问题所在,首先在提取完proposal之后,整个网络对提取到的RCNN中的所有的proposal都进行了整套的提取特征这些操作,这些操作是非常耗时,耗费空间的。事实上我们并不需要对每个proposal都进行CNN操作,只需要对原始的整张图片进行CNN操作即可,因为我们所提取到的proposal属于整张图片,因此对整张图片提取出feature map之后,再找出对应proposal在feature map中对应的区域,进行对比分类即可。第二个问题所在就是在框架中2-3过程中的对提取到的区域进行变形,我们知道CNN提取特征的过程对图像的大小并无要求,只是在提取完特征,进行全连接的时候才需要固定尺寸的特征,然后使用SVM等分类器进行分类操作,当然这两个问题在SPPNET中得到了很好的解决。
1.2.SPPNet

引入原因:在RCNN中,使用完ss提取proposal之后,对每个proposal都进行了CNN提取特征+SVM分类。
解决方法:因为region proposal都是图像的一部分,我们只需要对图像提一次卷积层特征,然后将region proposal在原图的位置映射到卷积层特征图上,这样对于一张图像我们只需要提一次卷积层特征,然后将每个region proposal的卷积层特征输入到全连接层做后续操作。
更直白的讲就是SPP-NET代替卷积网络中最后一个pooling层,而且这pooling层是多scale的。
SPP_net 源于微软2014年发布的论文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》,主要实现基于空间金字塔的分类与检测,该方法可以大大提高目标检测的速度,相比RCNN有60倍的性能提升。

SPP net中Region Proposal仍然是在原始输入图像中选取的,不过是通过CNN映射到了feature map中的一片区域。
空间金字塔池化的思想是:对卷积层的feature map上Region Proposal映射的区域分别划分成1×1,2×2,4×4的窗口(window),并在每个窗口内做max pooling,这样对于一个卷积核产生的feature map,就可以由SPP得到一个(1×1+2×2+4×4)维的特征向量。论文中采用的网络结构最后一层卷积层共有256个卷积核,所以最后会得到一个固定维度的特征向量(1×1+2×2+4×4)×256维),并用此特征向量作为全连接层的输入后做分类。
相比于R-CNN,SPP net是使用原始图像作为CNN网络的输入来计算feature map(R-CNN中是每个Region Proposal都要经历一次CNN计算),这样就大大减少了计算量。另外,SPP net中Region Proposal仍然是通过选择性搜索等算法在输入图像中生成的,通过映射的方式得到feature map中对应的区域,并对Region Proposal在feature map中对应区域做空间金字塔池化。通过空间金字塔池化操作,对于任意尺寸的候选区域,经过SPP后都会得到固定长度的特征向量。
Alt text
SPP net的优点:任意尺寸输入,固定尺寸输出。
2.本文的贡献
Fast RCNN针对RCNN在训练时是multi-stage pipeline和训练的过程中很耗费时间空间的问题进行改进。它主要是将深度网络和后面的SVM分类两个阶段整合到一起,使用一个新的网络直接做分类和回归。主要做了以下改进:
(1)最后一个卷积层后加了一个ROI pooling layer。ROI pooling layer首先可以将image中的ROI定位到feature map,然后是用一个单层的SPP layer将这个feature map patch池化为固定大小的feature之后再传入全连接层。
(2).损失函数使用了多任务损失函数(multi-task loss),将边框回归直接加入到CNN网络中训练。

3.Fast RCNN结构和训练
Alt text
Fast RCNN的网络输入是整张图片和一组object proposals。网络首先用conv和max pooling处理整张图片生成整张图片的feature map。然后对于每一个object proposal,使用region of interest(RoI)polling层从feature map中抽取一个固定长度的特征向量。接下来将每一个特征向量通过两个全连接层得到最终的4096维的feature。分别送到softmax中去做分类和bbox regressor中做位置的回归。值得注意的是它把分类和回归也放在了CNN网络中来做,而不是像RCNN那样独立开来

3.1ROI Pooling Layer
RoI(region of interest)是候选框(region proposal)映射到最后一层卷积层生成的。由于候选框的大小不同,映射到最后一层卷积层的RoI区域的大小也不同,这样就会导致特征提取的维度不同。因此需要通过RoI pooling得到固定长度的特征,以便输入到后面的全连接层中。
Alt text
RoI pooling的对象是输入图像中产生的proposal在feature map上的映射区域
RoI pooling是这样的,它的输入是不同大小的feature map,那么为了得到相同大小的feature,怎么做呢?举个栗子,这两个窗口虽然不一样大,但是我都给它分成9份,然后在每个小区域做max pooling,这样都能得到9维的向量,这就是ROI pooling。
Alt text

3.2.Initializing from pre-trained networks

预训练过程对网络修改主要有三个方面:

-最后一个max pooling layer被RoI pooling layer代替。目的是将每个RoI对应的feature map resize到固定的大小(对于VGG16来说H与W都是7)使其能够传送到接下来的全连接层进行训练。
-最后一个全连接层和softmax层被改成两个自层,分别是softmax做分类和bbox regression做回归。
-网络的输入包含两个部分:图片和这些图片对应的RoIs。

3.3.Fine-tuning for detection

使用BP算法训练网络是Fast R-CNN的重要能力,前面已经说过,SPP-net不能微调spp层之前的层,主要是因为当每一个训练样本来自于不同的图片时,经过SPP层的BP算法是很低效的(感受野太大)。这正是训练RCNN和SPPNet网络的方法,低效的部分是因为每个ROI可能具有非常大的感受野,通常跨越整个输入图像。由于反向传播必须处理整个感受野,训练输入很大(通常是整个图像)。提出了一种更有效的训练方法,利用训练期间的特征共享。 Fast R-CNN提出SGD mini_batch分层取样的方法:首先随机取样N张图片,然后每张图片取样R/N个RoIs e.g. N=2 and R=128 除了分层取样,还有一个就是FRCN在一次微调中联合优化softmax分类器和bbox回归,看似一步,实际包含了多任务损失(multi-task loss)、小批量取样(mini-batch sampling)、RoI pooling层的反向传播(backpropagation through RoI pooling layers)、SGD超参数(SGD hyperparameters)。
分层采样
在Fast RCNN网络训练中,随机梯度下降(SGD)的小批量是被分层采样的,首先采样N个图像,然后从每个图像采样R/N个 RoI。
关键的是,来自同一图像的RoI在向前和向后传播中共享计算和内存。减N,就减少了小批量的计算。例如,当N=2和R=128时,得到的训练方案比从128幅不同的图采样一个RoI(即R-CNN和SPPnet的策略)快64倍。
更加精细的训练过程
在微调阶段联合优化Softmax分类器和检测框回归,而不是分别在三个独立的阶段训练softmax分类器,SVM和回归器。
Alt text
Multi-task loss
多任务一起训练自然就需要定义一个多任务的误差函数.
softmax的输出

代表了K+1类对应的概率.
对每一个类k,bbox regressor的输出是

这跟R-CNN是一样的.
多任务误差函数由两个部分组成.
第一部分是分类误差(ground truth类的log误差)

第二部分是定位误差(bbox regressor的误差)

对于u=0的,代表背景的RoI,由于背景并不存在真实位置,所以这部分的定位误差被忽略.
而对于u>=1的其他类,使用如下误差

其中

作者使用了smooth L1 loss,相比较于R-CNN和SPPnet使用的L2 loss,它对离群值的敏感性更低.(Faster R-CNN和SDD都使用了这种误差).
使用L1 loss需要使用比较小的learning rate防止梯度爆炸.而smooth L1在x的绝对值比较大的部分使用了线性化的方法.相比于普通的L1 loss,降低了其敏感性.
最后得到的多任务误差如下:

其中超参数λ控制着分类误差和定位误差之间的平衡.作者在试验中取λ=1,并对回归目标v进行归一化,使其具有0均值和单位方差.
Mini-batch sampling
fine-tuing阶段,每一个mini-batch取N=2 images,R=128,即每个image采样64个RoI.
其中的25%(16个)取与ground truth的IoU大于等于0.5的,作为正样本.
剩下的取IoU区间为[0.1,0.5)的作为负样本(背景).其中下限0.1(那些与ground truth重合度很低的负样本),将作为hard negative mining的启发样本(R-CNN中IoU小于0.3的样本).
训练的过程中每一个图片都有50%的概率进行翻转.
Back-propagation through ROS pooling
假设Xi是RoI pooling layer的第i个输入,yrj是第r个RoI的第j个输出.

L对x的偏导数是L对y的偏导数的求和,条件是y在xi取得最大值。

SGD hyper-parameters
softmax classification前的全连接层使用均值为0,标准差为0.01的高斯分布进行初始化.
bbox regressor钱的全连接层使用均值为0,标准差为0.001的高斯分布进行初始化.
bias全部初始化为0.
对于VOC07和VOC12,前30k次迭代学习率为0.001,后10k次迭代学习率为0.0001.其中weight学习率为1倍,bias为2倍.
动量设置为0.9,权重衰减设置为0.0005
Scale Invariance
使网络习得尺度(缩放)不变性有两种方法:

把输入的图像全部转化为同一种预定义的大小,期望网络从训练数据中习得scale-invariant
采用多尺度方法(图像金字塔),图片采样后随机进行尺度采样.这种方法相当于用不同缩放尺度的原始数据扩充了数据集
Alt text
由于GPU内存的限制,作者只在较小的网络上采用多尺度方法实验.
Fast RCNN detection
网络调试完毕后,预测的过程不止是前向传播然后得到结果这么简单.
网络接收一张图像(多尺度模式下接收一系列图像)和约2k个RoI(极端情况下可能多达45k)作为输入.当采用图像金字塔时,每一个RoI被缩放到最接近224*224 pixels的大小作为输入.
再看输出,每个RoI会得到K+1类后验概率分布p和每类对应的,预测的RoI对于给定RoI的偏移值(offset).
于是对每一个RoI我们得到每个类的概率估计值

最后对每一类采用NMS算法,然后输出的才是最终的预测结果.
Truncated SVD for faster detection
Truncated SVD是Fast R-CNN在提升检测任务速度的一个trick.
在传统的分类任务上,在FC层的计算耗时是小于卷积层的.而对于有一堆RoI需要处理的检测任务上,在FC层上的计算耗时(前向通路上)占了一半多(FC6+FC7)
Alt text
Truncated SVD(奇异值分解的低秩逼近/截断奇异值分解)的原理是:
一个uv的矩阵W可以被近似分解为:
$W \approx U \sum_{t} V^T$
其中U是一个u
t矩阵,包含了W的前t个左奇异向量;V是一个vt矩阵,包含了W的前t个右奇异向量;Σ是一个tt的对角矩阵,包含了W的t个奇异值.
那么参数数量就由原来的uv变为了t(u + v),如果这个t足够小(在truncated SVD中t是小于W的秩的,所以公式中是约等于符号),那么参数的总量就会减小
原理很复杂,实现起来却要简单的多.因为这只是一个低秩逼近的奇异值分解.
全连接层的任务原本可以概括成Y = WX + B
分解W,变成UΣV’,V’是转置过的V.那么原来的式子变成了:Y = UΣV’X + B.
那么就相当于把原来的一个全连接层,变为2个全连接层.
第一个不包含偏执量B: Y1 = ΣV’X
第二个包含了偏执量B: Y2 = UY1 + B
Alt text
最终FC层前向通路上的计算耗时大幅度减小.当然带来相应结果就是mAP从66.9%下降到了66.6%.
4. 主要结果
这篇文章主要的贡献
(1).在VOC 2007、2010、2012上取得state-of-the art的mAP
(2).比较于RCNN、SPPNet有更快的训练和测试
(3).VGG16卷积层的微调提升了mAP
Experimental setup
实验使用了可以在线访问的三个预训练ImageNet模型。第一个是来自RCNN的CaffeNet或者说AlexNet。选择CaffeNet作为Model S ,或者说small。第二个网络是VGG_CNN_M_2014,和S有相同的深度,但是更wider。我们称之为模型M,或者“medium”。最后一个网络是非常深的VGG16模型,由于这个模型是非常大的,我们称之为Model L。在这一部分我们是用了single-scale(单一尺寸,s=600)来训练和测试。
Alt text
Alt text
Alt text
可以看出Fsst R-CNN在VOC07,10,12上的精度都达到了state-of-the-art等级.
Training and testing time
Alt text
先回顾下Fast R-CNN进行的”提速”:
特征计算的共享
使用Softmax分类器用于分类,而不是再加上单独的SVM
使用bbox回归,并用一个multi-task loss使得定位和分类可以同时进行训练
使用truncated SVD提升全连接层计算速度
Speed-up的幅度,表中一目了然.略微提升精度的情况下,训练速度和测试速度大幅度提升
Which layers to fine-tune?
SPPnet使用了相对小的网络,只对全连接层进行fine-tune并取得了不错的精度.而作者认为这只对于比较小的网络有效.于是作者使用较大的VGG16网络进行对比试验.
Alt text
结果证明了作者的猜想,对于那些比较大的网络,RoI pooling layer之前的那些层的fine-tune也非常重要(66.9% vs 61.4%).
但这并不意味着所有的层都需要fine-tune,如果这样做非常耗时.经过实验:对于那些比较小的网络,conv1的fine-tune对mAP的提成毫无帮助;而对于VGG16这样的比较大的网络,只需要对conv3_1之后的层进行fine-tune.(虽然对conv2_1后进行finue-tune取得了67.2%的更高精度,但是耗时1.3倍,所以舍弃)
Design evaluation
作者采用VOC07,对网络设计上的一些选择做了评估.诠释了为什么用一种方案而不用另一种,或者某种方案是否真的取得了效果.
Does mutil-task training help?
多任务的训练节约了训练时间,但这同样会对训练精度造成影响,因为定位误差和测试误差放在一起互相之间可能会有影响.
Alt text
结论是mutil-task不仅节约了训练时间,还提升了精度.
Scale invariance: to brute force or finesse?
对于怎么样让网络习得尺度不变性,之前讨论过两种方法.使用单尺度数据期望网络自己习得和使用多尺度数据对网络进行训练.
作者使用了单尺度方法与5尺度方法s ∈ {480, 576, 688, 864, 1200}对比:
Alt text
结论是多尺度方法对精度有提升,但是考虑到精度与速度的权衡最终选择了单尺度方法
Do we need more training data?
A good object detector should improve when supplied with more training data.
Fast R-CNN增加了补充的数据集后,mAP继续提高.
Do SVMs outperform softmax?
Fast R-CNN用softmax取代了SVM,为了端到端训练,更快的速度.这样做对精度的影响如何?
Alt text,一种使用了较多的object proposals(如DPM).
一般来说,由于object proposals是detection的基础.较少的proposals会过滤掉很多可能的检测结果.由于它们在一开始就没有被选出来,就不可能被检测为任何objcet,所以提升objcet proposals的数量会提升mAP.如果用AR(平均召回率)来衡量,随着proposals数量的增加,网络的查全率确实提高了,意味着一些原来没有被选中并且不会被选中的proposals现在被检测出.
这样来看增加的proposals确实包含了原先在一开始就不会被选中的候选框,如果只从计算的角度看. 网络比原先增加了一些”有用的”proposals,如果网络的性能保持不变,mAP应该只升不降.作者做了对比试验,证明了事实并不是这么简单.
Alt text
先说结论:过多的proposals并不会对mAP有帮助,甚至会使其下降.

(1).(红色实线)随着proposals数量增加,AR持续增加,说明网络确实检测出了原来没有被选中的东西,查全率增加了
(2).(蓝色实线)使用selective search方法,随着proposals数量增加,mAP一开始上升,后来下降了
(3).(蓝色虚线)使用selective search并且随机增加1000 × {2, 4, 6, 8, 10, 32, 45}个dense boxes,mAP相比持续下降
(4).(蓝色三角形)使用了与selective search最近的dense box代替,结果是mAP下降.这说明了虽然增加region proposals的数量可能增加查全率,检测到原先不会被检测到的object,但随之而来的,对proposals数量的增加,也会是精度下降.蓝色实线在某个区间上达到了mAP增加的效果.是因为在这段区间上porposals增加带来的”有用的”proposals对mAP的增益大于其总量增加带来的损失
(5).(蓝色菱形)完全使用dense boxes(45k个),mAP为52.9%(很低)
(6).(蓝色圆形)使用45k个proposals,并运用在SVM上,mAP为49.3%(进一步降低)

文章还进一步在MS COCO DataSet上进行了测评,写的很简略,在此不作详细说明。
5.总结
本文提出了Fast RCNN,这是对RCNN和SPPNet的一个简洁而快速的更新。除了报告最新的state-of-the-art检测结果外,本文还提供了详细的实验,希望能给出新的见解。特别值得注意的是,稀疏目标推荐的出现来提高检测器的质量。这个问题的探讨在过去是非常费时费力的,但是在Fast RCNN中是可行的。当然,或许还有一些尚未被发现的技术能够允许密集Boxs和稀疏Proposals一样表现出很好的性能。这样的方法如果能被探索,将有助于进一步加速目标检测任务。

本文标题:Fast RCNN论文阅读笔记

文章作者:Y.G Ren

发布时间:2018年01月03日 - 09:01

最后更新:2018年01月03日 - 17:01

原始链接:https://ygren.github.io/2018/01/03/Fast-RCNN论文阅读笔记/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。