Fast R-CNN(论文部分翻译+一些总结)

论文是《Fast R-CNN》

Fast R-CNN与R-CNN相比,提升了训练和测试时的速度,并且也提升了检测的精度。它训练的是VGG16网络(在R-CNN那篇论文中,作者也用过这个16层的深度网络来实现R-CNN,以此来观察在不同网络架构上R-CNN的检测性能的不同)。这篇论文中提出了一种单阶段训练算法,该算法可以共同学习分类候选目标和优化其空间定位。在运行时,对一张图片进行目标检测只需0.3s(包括处理候选目标的时间)。


R-CNN的不足之处

1.训练分为多个阶段。R-CNN首先使用log损失函数在候选目标(候选区域)上对卷积网络进行微调。然后要为每个特征训练一个SVM,这些SVM和目标检测器类似,替换了通过微调学到的softmax分类器。最后,在训练的第三个阶段,要学习边界框回归,精确定位。
2.训练过程在空间和时间上的花费都是巨大的。对SVM和边界框回归训练来说,每张图像的每个候选目标都要提取特征,并且都要写入硬盘。这些特征需要数百个千兆字节的存储空间。
3.目标检测的速度太慢。在测试时,要从每个测试图像中的每个候选目标中提取特征。如果用VGG16网络,每个图象的目标检测要花费47s(在一个GPU上)。

R-CNN速度很慢是因为它对每个候选目标都要进行卷积操作,并且没有共享计算。


本文的主要贡献

1.与R-CNN和SPPnet相比具有更高的检测质量
2.训练只有一个阶段,使用了多任务损失函数。
3.训练可以更新网络中的所有层
4.在提取特征时不必用到硬盘存储


Fast R-CNN的架构

在这里插入图片描述
上图说明了Fast R-CNN的架构。Fast R-CNN的输入是一整个图像和一组候选目标。网络首先使用几个卷积(conv)和最大池化层处理整个图像,以生成conv feature map。将候选目标映射到conv feature map上所对应的矩形窗口称为RoI(regions of interest)。对于RoI,在经过RoI池化层的处理后变成固定大小的feature map,然后通过全连接层(FC)从这些feature map中提取特征向量。每个特征向量都被馈送到一系列全连接层(fc)中,这些层最终分支为两个同级输出层:一个输出层在K个目标类加上一个“背景”类上产生softmax概率估计,而另一层为K个目标类中的每个类输出4个真实值,这4个值表示该目标类经过精确定位后的边界框的位置。这个架构使用一个多任务损失函数进行端到端的训练。


Fast R-CNN的具体设计

1.RoI池化层

RoI池化层的作用是将RoI对应的feature map经过最大池化后转换成一个较小的feature map,这个较小的feature map具有固定的空间范围HxW(例如7x7),H和W是层超参数,独立于任何特定的RoI。本篇论文将RoI定义为conv feature map中的矩形窗口,conv feature map是一整个图像经过卷积和池化操作后生成的,RoI就是候选目标在conv feature map中的映射,这个映射的矩形窗口对应了一部分feature map。每个RoI由一个四元组(r,c,h,w)定义,该四元组指定其左上角(r,c)以及其高度和宽度(h,w)。
RoI池化层的工作方式是,将h × w 的RoI窗口划分为H × W个子窗口,每个子窗口的大小约为h/H ×w/W,然后在每个子窗口上进行最大池化操作,即将每个子窗口中的最大值作为输出,最后得到一个H × W的feature map。

2.从预训练的网络初始化Fast R-CNN

论文使用三个经过预训练的ImageNet网络进行实验,每个网络具有五个最大池化层以及五到十三个卷积层。当预训练的网络初始化Fast R-CNN网络时,它将经历以下三个转换:
1.用RoI池化层替代最后一个最大池化层。RoI池化层输出的特征图大小为H × W(在VGG16中,H=W=7),与网络的第一个全连接层兼容。
2.用两个同级输出层(K + 1类上的全连接层和softmax,以及特定类的边界框回归)替代网络最后一个全连接层和softmax。
3.网络被修改为可以接受两种数据的输入:一系列图像以及在这些图像上的一系列候选目标。

3.分层采样(为了提高训练效率)

在SPPnet和R-CNN中,当每个训练样本(比如RoI)来自于不同的图像时,向后传播会变得非常的低效。这是因为每个RoI可能会有很大的接受野,而这个接受野经常会把一整个图像都包括其中。因为向前传播必须处理这一整个接受野,因此训练的输入是非常大的(经常是一整个图像)。
论文提出了一种更有效率的训练方法——利用特征共享来进行训练。在Fast R-CNN中,SGD(stochastic gradient descent) mini-batches 被分层采样,首先对N个图像进行采样,然后对每个图象的中的R/N个RoI进行采样。**最重要的是,来自同一图像的RoI在向前和向后传播过程中共享计算和内存。**这种方法可能会造成一个问题——由于来自同一图像的RoI是互相关联的,因此可能会导致训练收敛缓慢。但在实际的训练过程中,当N=2,R=128时,SGD迭代比R-CNN更少。

4.微调阶段(也是为了提高训练效率)

除分层采样外,Fast R-CNN使用带有一个微调阶段的简化训练过程来共同优化softmax分类器和边界框回归器,而不是在三个单独的阶段中训练softmax分类器,SVM和回归器。下面描述了此过程的组成部分。

多任务损失函数(Multi-task loss)
Fast R-CNN网络具有两个同级输出层,第一个输出每个RoI在K + 1个类别上的离散概率分布,p=(p0,…,pk)。p是通过在全连接层的K + 1个输出上的softmax计算的。第二个输出边界框回归偏移 t k t^{k} = ( t x ( k ) t^{(k)}_{x} , t y ( k ) t^{(k)}_{y} , t w ( k ) t^{(k)}_{w} , t h ( k ) t^{(k)}_{h} ),用k来对每个目标类(总共有K个)进行索引。其中 t k t^{k} 指的是相对于一个候选目标的比例不变平移和对数空间高度/宽度偏移。
用u和v来对训练的RoI进行标记,其中u是ground-truth class,v是ground-truth bounding-box regression target。在每个被标记的RoI上使用多任务损失函数L来共同训练分类和边界框回归:
在这里插入图片描述
上式中的λ控制着两个任务损失函数之间的平衡。两个任务损失函数分别如下:
在这里插入图片描述
在这里插入图片描述
其中
在这里插入图片描述

Mini-batch 采样
在微调过程中,每个SGD mini-batch均由N = 2张图像构成,这些图像是随机选择的。 用大小为R = 128的mini-batches,从每个图像中采样64个RoI。 具体的采样过程是,首先从一部分候选目标中提取25%的RoI,这些候选目标与ground- truth bounding box的IoU重叠度至少为0.5, 这些RoI中主要是由前景目标类(u>=1)标记的实例。其余的RoI则是从另外的候选目标中采样的,这些候选目标有最大的IoU,并且ground truth介于[0.1,0.5)之间,这些是背景示例,并标记为u =0。

通过RoI池化层进行反向传播
xi是RoI池化层的第i个激活输入,而yrj是第r个RoI的第j个激活输出。一个xi可能与多个不同的输出yrj相连。
在这里插入图片描述
其中
在这里插入图片描述

SGD超参数
用于softmax分类和边界框回归的全连接层是从零均值高斯分布初始化而来的,所依据的高斯分布的标准差分别为0.01和0.001。偏差被初始化为0。所有层将权重的每层学习率设为1,将偏差的每层学习率设为2,并且全局学习率设为0.001。在对VOC07或VOC12进行训练时,先运行SGD进行30K的mini-batch迭代,然后将学习率降低至0.0001,再进行10k的迭代训练。 如果在更大的数据集上进行训练,需要运行SGD进行更多的迭代。

5.尺度不变性

论文探索了实现尺度不变目标检测的两种方法:
1.通过“brute force”学习。在这个方法中,在训练和测试期间,每个图像均以预定义的像素大小进行处理。 网络必须直接从训练数据中学习尺度不变目标检测。
2.通过使用图像金字塔(image pyramids)。这是一种多尺度方法,这种方法通过图像金字塔为网络提供近似的尺度不变性。在测试时,图像金字塔用于近似缩放每个候选目标的比例。 在多尺度训练中,每次对图像进行采样时都会随机抽取金字塔尺度,这是数据增强的一种形式。 由于GPU内存的限制,论文仅针对较小的网络进行了多尺度训练。


Fast R-CNN测试过程

网络将图像(或编码为图像列表的图像金字塔)和要评分的R个候选目标作为输入。 在测试时,R通常约为2000。 对于每个测试RoI r,向前传播输出了后验概率分布p和相对于r的一组预测的边界框偏移量(K个类中的每一个都有自己的精确的边界框预测)。用估计的概率Pr为每个目标类别k分配r的检测置信度。 然后,使用R-CNN的算法和设置为每个类别独立地执行NMS(非极大性抑制)。


使用truncated SVD加快检测速度

对于所有图像的分类来说,在全连接层上进行计算的时间要少于卷积层。但是,为了检测RoI的数量,要处理的RoI数量很大,将近一半的向前传播的时间用于计算全连接的层。通过使用truncated SVD来压缩大型全连接层,可以很容易地使它获得加速。
在这项技术中,用一个u×v的权重矩阵W来对一个层进行参数化:
在这里插入图片描述
在上式中,U是一 个u×t的矩阵,它包含了W的前t个左奇异向量。Σt是一个t×t的对角矩阵,它包含W的前t个奇异值。V是一个v×t的矩阵,它包含了W的前t个右奇异向量。truncated SVD将参数的数量从uv个减少到t(uv)个,当t远远小于min(u,v)时,这种减少是非常明显的。为了压缩网络,将与W相关的单个全连接层替换为两个全连接层,并且它们之间没有非线性。第一层用权重矩阵Σt V T V^{T} (没有偏差),第二层用U(与W有联系的初始偏差)。当RoI的数量很多时,这个压缩思想会对全连接层有一个很好的提速。

在这里插入图片描述
上图说明在VGG16中进行truncated SVD操作的之前和之后。在进行truncated SVD操作之前,如上图左边所示,全连接层fc6和fc7占用了45%的处理时间。实验表明,在mAP仅减少0.3个百分点的情况下,truncated SVD可以减少超过30%的检测时间,并且不需要在模型压缩后再进行微调。论文指出,如果在模型压缩后再进行一次微调,可能会在mAP减少的更少的情况下获得更大的加速。


关于Fast R-CNN的几点思考

1.哪些层要进行微调?

为了证明对VGG16来说在卷积层进行微调是非常重要的,论文设计了一个实验:用Fast R-CNN进行微调,但是不管十三个卷积层,而是只考虑全连接层。实验表明,这样做将使mAP从66.9%下降至61.4%。实验充分证明了,对非常深的网络来说,经过RoI池化层的训练是非常重要的。
在这里插入图片描述
那么所有的卷积层都应该被微调吗?并不是。在较小的神经网络中,第一个卷积层的任务一般是独立的,对第一个卷积层微调并不会影响mAP。而如果从conv 2_1开始进行微调,会使训练时间增加。本文中Fast R-CNN得到的所有结果,都是在VGG16网络中从conv 3_1开始进行微调的。

2.候选区域越多越好吗?

论文使用了selective search方法,从每个图像中提取1000到10000个候选区域,实验发现,mAP随着候选区域的增加,先上升,然后有些轻微的下降。这表明当给深层的分类器更多的候选区域时,并不会有帮助,并且甚至会轻微的影响精确度。

发布了39 篇原创文章 · 获赞 1 · 访问量 1229

猜你喜欢

转载自blog.csdn.net/qq_30146937/article/details/104167135
今日推荐