Bootstrap

论文阅读 || 目标检测系列 —— Fast R-CNN(超详细)

论文地址:Fast R-CNN

目录

1. 已有CNN目标检测算法的对比

1.1 RCNN的缺点

1.2 SPPNet的缺点

1.3 Fast RCNN的贡献

2. Fast RCNN的介绍

2.1 Fast RCNN的训练流程

2.2 fune turing的介绍

2.2.2  RoI pooling的介绍

2.2.3  损失函数 

2.2.4  小批量采样

2.2.5  SGD超参数

2.3 尺度不变性

3 Fast RCNN的检测

3.1 在目标检测上使用Truncated SVD

4 主要成果

4.1 实验配置

4.2 VOC 2010 和2012 的结果

4.3 VOC 2007 的结果

4.4 训练和测试的时间

4.5 微调哪些层

5. 设计评估

5.1 多任务训练是否有效

5.2 尺度不变性:暴力 or 精细?

5.3 需要更多的训练数据吗

5.4 SVM vs Softmax

5.5 更多的候选区域更好吗


1. 已有CNN目标检测算法的对比

1.1 RCNN的缺点

  • 训练分为多个阶段:search selective + CNN + SVM + bbox回归
  • 训练需要大量时间和空间
        因为是分阶段的,CNN将候选区域的特征提取出来后,都写入磁盘。之后取出用于训练SVM和bbox回归器。
        该过程会耗费大量的硬盘空间,而且读写过程造成时间的损耗。(如果是VGG16,这个过程在单GPU上需要2.5天、百GB的存储空间)
  • 检测时耗时很长
        检测时,要从图片中的每个候选框中提取特征,耗费大量时间。(如果是VGG16,每个图片在GPU上耗时47s左右)

1.2 SPPNet的缺点

SPPNet对RCNN进行了改进:引入了SPP layer(好处:接受不同尺度的输入、CNN提取特征效率提高)。
改进RCNN的同时,继承了RCNN的缺点也引入了新的缺点

  • 训练需要分为多个阶段(继承的缺点)
  • 训练阶段,需要将特征存入硬盘(继承的缺点)
  • 在fune-tuning时,不能在SPP层之前的卷积层进行反向传播(新的缺点)。因为 feature pyramid BP的计算开销过大,故只微调了全连接层,这样也 限制了深层网络的精度

针对这些问题,Fast RCNN就问世了。Fast RCNN的训练框架

1.3 Fast RCNN的贡献

  • 训练时,使用的是多任务损失的单阶段训练
  • 不需要将特征图保存到磁盘中
  • 训练时,可以对整个网络参数进行更新
  • 比RCNN 和 SPPNet 有着更快的速度、更高的目标检测精度
    • 训练时,CNN部分采用VGG16,比RCNN快9倍,比SPPNet快3倍
    • 检测时,在PASCAL VOC 2012上,实现了当时最高精度mAP为66%(RCNN为62%)。

2. Fast RCNN的介绍

2.1 Fast RCNN的训练流程

  • 1. 候选框提取:使用算法selective search获取输入图片的候选框,提取约2000个候选区域,即RoI
  • 2. CNN+【RoI pooling】+FC: 
    • 把整张图片输入到CNN中,在最后一个卷积之后使用RoI(Region of Interest) pooling(代替了原本的maxpooling),来把特征统一维度
    • 再经过两层FC,然后分别输入到用于class和用于bounding box的FC。
  • 3. Loss Function:SoftMax loss 和Smooth L1 Loss。联合训练

Fast RCNN的改动:

  • 训练机制。不在类似于RCNN,使用均匀的随机采样128个训练样本,而是分层采样:西安随机采样N张图片,然后从每张图片中采样R/N个RoIs,例如N=2,R=128,那么每次做SGD的时候,有64个样本来自同一张图片,这样正反向都会有加速。这里选取IoU>=作为正样本,IoU在区间[0.1,0.5)之间的为负样本
  • 网络结构。首先采用SPPNet中的SPP层,不同SPP层,没有使用多尺度的pooling,只有一个尺度的pooling,其次添加了多任务损失函数,用于同时计算bbox回归和分类的损失

2.2 fune turing的介绍

SPPNet无法更新 SPP layer之前的权重的原因(作者在论文中有解释,但感觉不够清晰,以下只是个人理解):

  • 结构上:由于多级池化的操作,使得SPP layer在反向传播的计算量巨大,会占用大量内存和耗费特长的时间。
  • 训练时:一般的,如果进行端到端的训练(除去候选框的获取),这样feature map是不存到磁盘的。在这里,(1) 当RoI有非常大的感受野时,正向传播需要处理整个感受野;(2) 当每个RoI来自不同的图片,需要前向计算每张图的特征。这样就存在非常大的计算量。所以选择不更新spplayer之前的权重信息。

针对上面两个问题,Fast RCNN的操作:

  • 网络结构上优化:论文用RoI pooling 代替了 SPP layer(RoI pooling是单级的SPPlayer),减少了该层的前向和反向传播的计算量。但此时的训练仍然消耗显存和时间。故有了下一步
  • 训练操作上优化:论文提出,训练期间的特征共享。在Fast RCNN的训练中,每次取2张图,每张图取64个RoI,即batch=128的SGD训练。单张图的多个RoI在向前计算和向后就算的过程中是共享feature map的,这样就加快了速度。
    • 例子:在batch=128的训练中:
      RoI来自于不同的图片,需要进行128次前向传播;RoI来自两张图片,需要两次前向传播即可,大大减少计算时间
    • 缺点:这样操作的训练数据RoI相当与没有进行充分的打乱。但在Fast RCNN的实验中效果还行,就先这样操作了

2.2.2  RoI pooling的介绍

根据卷积的运算规则,推算出原图的region对应的feature map的位置。原图中region大小不一,所对应的的feature map的尺寸也不固定。
为了接受不同尺度的feature map,所以需要RoI pooling层,将不同维度的feature map转化成相同维度。操作如下

  • 将 h*w 的feature map划分为 H*W 个格子(H*W为超参数)
  • 对每个格子的特征进行maxpooling

由于多个RoI会有重复区域,所以maxpooling时,feature map里同一个值可能对应多个pooling output后的值,所以计算反向传播时,从RoI pooling层output y到input x的梯度的计算方式:

                              

  • r:指的是第r个RoI。
  • j:指的是某一个RoI的输出特征中,与 xi 对应的元素 j
  • ,在R(r,j)这个区域中做maxpooling得到的结果就是y(r,j)
  • ,是个条件式表达,是在判断input的xi是否是maxpooling的结果,如果不是,输出的梯度就不传到这个值上面

    上图是在对公示进行了图解。在此基础上,进行了自己的理解,如下图:

 

这里的RoI pooling 是SPPNet的一个特例,是Spatial pooling,没有pyramid。这样,(1) 计算量大大减少 (2) 能够实现FC到CNN的梯度的反向传播。
并且实验发现 feature pyramid (指的是用多尺度的滤波器获取的特征)对准确率提升不大,原图的pyramid作用会更大些:

  • 训练时,每张图片随机选择一个尺度,进行缩放后输入网络
  • 测试时,对于每个候选窗口,选择单一尺度s \in S来缩放图片,使该候选窗口的大小接近224x224。然后计算出该候选窗口的特征值

2.2.3  损失函数 

损失函数分为两部分:

  • L_{cls}:经过softmax层对图像分类,维度N+1(其中N为类别数)
  • L_{loc}:边界框的regression loss

                                    

Fast RCNN的损失公式为:

    • p:代表预测类别。u:代表真实类别
    • :图片为t^_{u}种类时 预测候选框的位置。:真实候选框的位置
    • \lambda:超参数,论文中设置为1
    •   

SmoothL1的好处:

论文使用的smooth损失,是对异常值具有低灵敏度的损失(RCNN SPPnet使用的是L2,当归回的值是无边界的,L2会发生梯度爆炸)。
当 |x|<1 时,损失为L2;
当 |x|>=1 时,损失为L1,此时是为了防止训练出现梯度爆炸。

2.2.4  小批量采样

优化器:SGD。

Batch:128 = 2 (图片数量) * 64 (RoI数量)。
其中:与真实标注窗口的IoU在 [0.5, 1],此时u>=1。(占候选框总量的25%)
           与真实标注窗口的IoU在 [0.1, 0.5),此时u=0。
           与真实标注窗口的IoU在 [0, 0.1),这部分数据使用难负例挖掘算法。

数据增强:0.5概率水平翻转。

2.2.5  SGD超参数

FC的权重:高斯分布

  • Softmax分类:均值为0,方差为0.01
  • bbox回归:均值为0,方差为0.001

学习率:

  • 全局学习率:0.001。所有层的权重学习率为1倍的全局学习率,偏置为2倍的全局学习率
  • 在VOC07或者VOC12训练时,运行SGD迭代 30K个Batch,然后将学习率降低为0.0001,再进行10K次的迭代。当训练数据更大时,会进行更多的迭代。

SGD:0.9的动量、0.0005的衰减系数

2.3 尺度不变性

  • 通过暴力学习:在训练和测试阶段,每个图片都要输入固定的尺寸,网络必须从图片中直接学习到尺度不变性目标检测(卷积模块较深)。
  • 图像金字塔:测试时,将输入图片缩放来得到规范大小的候选框。

论文在训练时,每次图像采样时随机采样金字塔尺度,作为数据增强的形式。由于GPU的内存限制,只对较小的网络进行多尺度训练。

3 Fast RCNN的检测

3.1 在目标检测上使用Truncated SVD

对于图像分类,全连接的计算时间要比卷积模块时间少。
对于当时图像检测,被处理RoI的数量较大。这样计算conv5输出的feature map 次数较少,计算全连接层的次数较多,所以前向传播在全脸节层上使用了近一半的时间。

大规模的全连接层容易通过截断的奇异值分解SVD,进行压缩加速。下面简单说下:

奇异值分解最大的作用就是数据降维,对于m*n的矩阵M,进行奇异值分解:

  • U和V均为单位正交阵,即有UUT=I和VVT=I,U称为左奇异矩阵,V称为右奇异矩阵
  • Σ仅在主对角线上有值,我们称它为奇异值,其它元素均为0。

对于Σ,只取前 r个非零奇异值,就可以还原M(也就是,前 r个非零奇异值对应的奇异向量代表了矩阵M的主要特征)。表示如下:

计算量从m*n 变成了 r*(m+n)

具体实现上(在检测过程中),将一个权重为W的全连接层拆成两个:第一层的权重矩阵为(没有bias),第二层的权重矩阵为U(带上原本W的bias)
TSVD的使用,加快了30%的检测速度。此过程只使用在预测

4 主要成果

  • 效果:在数据集VOC07,2010,和2012上的 mPA是最好的
  • 速度:训练、测试过程都要比RCNN、SPPnet快
  • fuine-turing:在VGG16上的使用改善了mAP

4.1 实验配置

用了三个经过预训练的ImageNet网络模型。本节中,所有的实验都是用了单尺度训练和测试(s=600)

  • S:来自RCNN的CaffeNet(实质上是AlexNet)。
  • M:来自VGG_CNN_M_1024,与S具有相同的深度,但是更宽。
  • L:来自VGG16模型

4.2 VOC 2010 和2012 的结果

上面表格对比了,
Fast RCNN(简称FRCN)和公共排行榜中comp4(外部数据)上的主流方法。(NUS_NIN_c200和BabyLearning方法,目前没有其架构的确切信息,它们是Network-in-Network的变体)。其他所有的方法都是使用预训练的VGG16网络进行初始化

  • 精度:FRCN在VOC上达到了最高的精度,mAP为65.7%(加上额外的数据集68.4%)。
  • 速度:比基于RCNN的方法的速度,都快两个量级。

SegSeepM:
在VOC10上,获得了比FRCN更高的mAP(67.2% vs 66.1%)。
在VOC12训练时,添加了分割的标注(使用马尔科夫随机场和语义的分割来增强RCNN的精度)。FRCN可以替换SegDeepM中的RCNN,已获得更好的结果。
当使用放大的07++12训练集时,FRCN达到最高

4.3 VOC 2007 的结果

论文比较模型:Fast RCNN、RCNN、SPPnet。在VOC07数据集上:所有方法都是用了预训练的VGG16,并且使用了边界框回归。

SPPnet在训练和测试期间使用了五个尺度。RoI的使用说明,即使使用了单个尺度训练和测试,卷积微调在mAP中提供了大的改进(63.1% to 66.9%)。另外次要的,SPPnet在PASCAL中没有使用被标记为“困难”的样本进行训练;除去这些样本,Fast RCNN的 mAP为68.1%。

4.4 训练和测试的时间

快速的训练和测试是我们的第二个主要成果。另外,Fast RCNN还不需要数百GB的磁盘存储来缓存特征。
上表对比了Fast RCNN、RCNN、SPPnet 之间的训练时间、测试速率和VOC07上的mAP。

  • Fast RCNN vs RCNN、SPPnet(对于VGG16):
    • 测试时,【与RCNN】SVD快146倍,TSVD快213倍。【与SPPnet】SVD快7倍,TSVD的快10倍。
    • 训练时,【与RCNN】时间减少9倍(84 vs 9.5)。【与SPPnet】时间快2.7倍(25.5 vs 9.5)

TSVD

TSVD在检测时减少30%的计算时间,同时在mAP只会下降0.3%,而且无需在模型压缩后执行额外的微调。

上图展示了:在VGG16中的fc6使用了1024的奇异值(权重为25088x4096的矩阵),fc7中使用了245维的奇异值(4096x4096),减少运行时间、很小的降低mAP的精度。如果在压缩之后再次微调,则可以减速的同时在mAP中具有更小的下降

4.5 微调哪些层

SPPent论文中考虑的是不深的网络,只微调全连接层,可以获得了良好的精度。对于较深的网络(VGG16),卷积的微调必须吗?

对于Fast RCNN(VGG16)做了以下测试:

  • 论文结果是在VGG16微调conv3_1之后的层:训练时间9.5h,mAP为66.9%(模型S和M微调层conv2及以上的层)。
  • 微调全连接层:(消融模拟单尺度SPPnet训练),mAP从66.9%降低到61.4%。
  • 微调conv_2之后的层:训练时间慢1.3倍 (12.5 vs 9.5)精度提高0.3 (67.2 vs 66.9)
  • 微调conv_1之后的层:GPU内存不够用。

以上对比证明:通过RoI pooling 的网络训练对于深的网络是重要的(允许了反向传播到卷积模块),并不是将所以的层都微调就有最好的收益。另外,conv1是通用层,与任务无关的,所以微调该层与否,对mAP无影响的。

 

5. 设计评估

我们在PASCAL VOC07数据集上面实验,来进行Fast RCNN、RCNN、SPPnet的比较,已经评估网络设计的必要性

5.1 多任务训练是否有效

多任务训练简单,避免了流水线式训练。这样因为两个任务通过共享的参数互相影响最终结果。多任务训练能够提高Fast RCNN中的目标检测精度吗?

【实验】

  • 表中每组第一列:采用分类的损失训练网络(基线模型)。这些模型没有检测框回归
  • 表中每组第二、四列:采用多任务损失训练网络。前者测试时不使用检测框回归,后者使用
  • 表中每组第三列:多阶段训练网络。使用检测框回归

【结论

  • 对比每组第一、二列:仅分类效果而言,多任务训练比单分类任务训练提高了精度(提升了+0.8~+1.1个mAP),说明了多任务学习的积极效果。
  • 对比每组第三、四列:多任务训练比多阶段训练的效果更好

5.2 尺度不变性:暴力 or 精细?

【实现物体检测的尺度不变性】暴力学习(单尺度) 和图像金字塔(多尺度)。(将图像的尺度定义为最短边的长度)

  • 单尺度:保持横纵比缩放图像,S~=600,限制最长边<1000。这样操作是使VGG16在微调期间避免GPU现存不足。
        在PASCAL图像是384x473像素,因此单尺度设置通常以1.6倍上采样图像。在RoI pooling的平均有效步长约为10
  • 多尺度:使用了s~{480, 576, 688, 864, 1200}。但是以2000像素为上限,避免GPU现存不足

【实验结果】

  • 多尺度测试时,消耗大量的计算时间,仅带来很小的mAP。
  • 在L模型中,首先于GPU仅使用了单个尺度,但mAP为66.9%,略高于RCNN的66.0%(RCNN在每个候选区域被方所到规范大小,等同使用了多尺度)。

【结论】

  • 深度卷积网络擅长直接学习尺度不变性

5.3 需要更多的训练数据吗

当提供更多的训练数据时,好的目标检测器应得到更好的效果

  • Zhu等人发现DPM中,训练样本在几百到千个的时候,mAP就饱和了
  • 在Fast R-CNN上,在训练集VOC07 trainval增加了VOC12 trainval(约增加了3倍图像,数量16,5k),在VOC07测试集上mAP从66.9%到70.0%。训练这个数据集时,使用60k次小批量迭代(不是40k)
  • 对VOC10和2012进行类似的实验:用VOC07 trainval、test和VOC12 trainval构造了21.5k的数据集。训练这个数据集时,使用100k次SGD迭代、每40次迭代(不是30k)降低学习率10倍。对于VOC10和2012,mAP分别【从66.1%到68.8%】和【从65.7%到68.4%】

5.4 SVM vs Softmax

【实验】在Fast RCNN中实施了具有难负采样重训练的SVM训练(与RCNN中有着相同的训练算法和超参数)。

【结果】(1) 对比FRCN的两种训练结果,softmax比SVM在mAP提升了0.1~0.8
               (2) 对比三种,S/M上,RCNN的结果更好。

【结论】就速度和精度方面,最好的方式:使用RoI pooling,使训练网络是端到端的进行。

 

5.5 更多的候选区域更好吗

广义上存在两种类型目标检测器:使用候选区域的稀疏集合(eg. selective search)、使用密集集合(eg. DPM)。

分类的稀疏提议是一种级联类型,其中提议机制首先拒绝大量候选者,让分类器来评估留下小的集合。
当级联应用于DPM时会提高检测精度。作者发现这种方式也能提高Fast RCNN。

使用模型M的训练和测试需要不到2.5小时。因此,Fast R-CNN能够高效地,直接地评估目标候选区域mAP。

  • 【蓝色实线】太多的Region Proposal反而会损害Fast RCNN的准确度
  • 【红色实线】当对每个图像使用固定数量的候选区域时,AR与使用R-CNN的几种候选区域方法良好地相关。上图中AR与mAP不相关,因为每个图像的候选区域数量是变化的。AR必须小心使用,由于更多的候选区域更高的AR并不意味着mAP会增加。
  • 【三角形】密集生成框,大约45k个框/图像。当每个选择性搜索框被其最近(IoU)密集框替换时,mAP只降低1个点(到57.7%)
  • 【菱形】只使用密集框(45k/图像),得到mAP为52.9%。【圆形】SVM做得更糟:49.3%

 

 

;