文章参考多篇文章,在此表示感谢,文章仅用于学习,若有侵权请联系,再次表示感谢。
https://arxiv.org/pdf/1504.08083.pdf
先验知识:what is SPP/SPP-Net
在最后一个卷积层的顶部添加了一个SPP层。 SPP层汇集功能并生成固定长度输出,然后将其输入完全连接的层(或其他分类器)。换句话说,我们在网络层次结构的更深层阶段(卷积层和完全连接层之间)执行一些信息“聚合”,以避免在开始时需要裁剪或变形。
SPP-net不仅可以从任意大小的图像/窗口生成用于测试的表示,而且还允许我们在训练期间提供具有不同大小或比例的图像。使用可变尺寸图像进行训练可以增加尺度不变性并减少过度使用。我们开发了一种简单的多尺寸训练方法。对于单个网络接受可变输入大小,我们通过共享所有参数的多个网络来近似它,而使用固定输入大小训练这些网络中的每一个。在每个epoch,我们使用给定的输入大小训练网络,并切换到下一个时期的另一个输入大小。实验表明,这种多尺寸训练与传统的单一训练融合,可以提高测试的准确性。
论文翻译
Abstract
本文提出了一种快速的基于区域的卷积网络方法(fast R-CNN)用于目标检测。Fast R-CNN建立在以前使用的深卷积网络有效地分类目标的成果上。相比于之前的成果,Fast R-CNN采用了多项创新提高训练和测试速度来提高检测精度。Fast R-CNN训练非常深的VGG16网络比R-CNN快9倍,测试时间快213倍,并在PASCAL VOC上得到更高的精度。与SPPnet相比,fast R-CNN训练VGG16网络比他快3倍,测试速度快10倍,并且更准确。Fast R-CNN的Python和C ++(使用Caffe)实现以MIT开源许可证发布在:https://github.com/rbgirshick/fast-rcnn。
1.Introduction
最近,深度卷积网络12已经显著提高了图像分类1和目标检测34的准确性。与图像分类相比,目标检测是一个更具挑战性的任务,需要更复杂的方法来解决。由于这种复杂性,当前的方法(例如,3546)采用多级流水线的方式训练模型,既慢且精度不高。
复杂性的产生是因为检测需要目标的精确定位,这就导致两个主要的难点。首先,必须处理大量候选目标位置(通常称为“提案”)。 第二,这些候选框仅提供粗略定位,其必须被精细化以实现精确定位。 这些问题的解决方案经常会影响速度,准确性或简单性。
在本文中,我们简化了最先进的基于卷积网络的目标检测器的训练过程35。我们提出一个单阶段训练算法,联合学习候选框分类和修正他们的空间位置。
所得到的方法用来训练非常深的检测网络(例如VGG16) 比R-CNN快9倍,比SPPnet快3倍。在运行时,检测网络在PASCAL VOC 2012数据集上实现最高准确度,其中mAP为66%(R-CNN为62%),每张图像处理时间为0.3秒,不包括候选框的生成(所有的时间都是使用一个超频到875MHz的Nvidia K40 GPU测试的)。
1.1.R-CNN and SPPnet
基于区域的卷积网络方法(RCNN)通过使用深度卷积网络来分类目标候选框,获得了很高的目标检测精度。然而,R-CNN具有显着的缺点:
1)训练过程是多级流水线。R-CNN首先使用目标候选框对卷积神经网络使用log损失进行微调。然后,它将卷积神经网络得到的特征送入SVM。 这些SVM作为目标检测器,替代通过微调学习的softmax分类器。 在第三个训练阶段,学习检测框回归。
2)训练在时间和空间上是的开销很大。对于SVM和检测框回归训练,从每个图像中的每个目标候选框提取特征,并写入磁盘。对于非常深的网络,如VGG16,这个过程在单个GPU上需要2.5天(VOC07 trainval上的5k个图像)。这些特征需要数百GB的存储空间。
3)目标检测速度很慢。在测试时,从每个测试图像中的每个目标候选框提取特征。用VGG16网络检测目标每个图像需要47秒(在GPU上)。
R-CNN很慢是因为它为每个目标候选框进行卷积神经网络正向传递,而不共享计算。SPPnet5通过共享计算加速R-CNN。SPPnet5计算整个输入图像的卷积特征图,然后使用从共享特征图提取的特征向量来对每个候选框进行分类。通过最大池化将候选框内的特征图转化为固定大小的输出(例如,6X6)来提取针对候选框的特征。多个输出被池化,然后连接成空间金字塔池7。SPPnet在测试时将R-CNN加速10到100倍。由于更快的候选框特征提取训练时间也减少3倍。
SPP网络也有显著的缺点。像R-CNN一样,训练过程是一个多级流水线,涉及提取特征,使用log损失对网络进行微调,训练SVM分类器,最后拟合检测框回归。特征也写入磁盘。但与R-CNN不同,在5中提出的微调算法不能更新在空间金字塔池之前的卷积层。不出所料,这种限制(固定的卷积层)限制了深层网络的精度。
1.2.Contributions
我们提出一种新的训练算法,修正R-CNN和SPPnet的缺点,同时提高其速度和准确性。因为它能比较快地进行训练和测试,我们称之为Fast R-CNN。Fast RCNN方法有以下几个优点:
1)比R-CNN和SPPnet具有更高的目标检测精度(mAP)。
2)训练是使用多任务损失的单阶段训练。
3)训练可以更新所有网络层参数。
4)不需要磁盘空间缓存特征。
Fast R-CNN使用Python和C++(Caffe8)语言编写,以MIT开源许可证发布在:https://github.com/rbgirshick/fast-rcnn。
2.FastR-CNN architecture and training
Fast R-CNN的架构如下图(图1)所示:
图1. Fast R-CNN架构。输入图像和多个感兴趣区域(RoI)被输入到全卷积网络中。每个RoI被池化到固定大小的特征图中,然后通过全连接层(FC)映射到特征向量。网络对于每个RoI具有两个输出向量:Softmax概率和每类检测框回归偏移量。该架构是使用多任务丢失端到端训练的。Fast R-CNN网络将整个图像和一组候选框作为输入。网络首先使用几个卷积层(conv)和最大池化层来处理整个图像,以产生卷积特征图。然后,对于每个候选框,RoI池化层从特征图中提取固定长度的特征向量。每个特征向量被送入一系列全连接(fc)层中,其最终分支成两个同级输出层 :一个输出K个类别加上1个背景类别的Softmax概率估计,另一个为K个类别的每一个类别输出四个实数值。每组4个值表示K个类别的一个类别的检测框位置的修正。
2.1.The RoIpooling layer
RoI池化层使用最大池化将任何有效的RoI内的特征转换成具有H×W(例如,7×7)的固定空间范围的小特征图,其中H和W是层的超参数,独立于任何特定的RoI。在本文中,RoI是卷积特征图中的一个矩形窗口。 每个RoI由指定其左上角(r,c)(r,c)及其高度和宽度(h,w)(h,w)的四元组(r,c,h,w)(r,c,h,w)定义。
RCNN的四元组是中心点和长宽
RoI最大池化通过将大小为h×w的RoI窗口分割成H×W个网格,子窗口大小约为h/H×w/W,然后对每个子窗口执行最大池化,并将输出合并到相应的输出网格单元中。同标准的最大池化一样,池化操作独立应用于每个特征图通道。RoI层只是SPPnets中使用的空间金字塔池层的特殊情况,其只有一个金字塔层。 我们使用中给出的池化子窗口计算方法。
2.2.Initializing from pre-trained networks
我们实验了三个预训练的ImageNet9网络,每个网络有五个最大池化层和五到十三个卷积层(网络详细信息,请参见实验配置)。当预训练网络初始化fast R-CNN网络时,其经历三个变换。
首先,最后的最大池化层由RoI池层代替,其将H和W设置为与网络的第一个全连接层兼容的配置(例如,对于VGG16,H=W=7)。
然后,网络的最后一格全连接层和Softmax(其被训练用于1000类ImageNet分类)被替换为前面描述的两个同级层(全连接层和K+1个类别的Softmax以及类别特定的检测框回归)。
最后,网络被修改为采用两个数据输入:图像的列表和这些图像中的RoI的列表。
2.3.Fine-tuning for detection
用反向传播训练所有网络权重是Fast R-CNN的重要能力。首先,让我们阐明为什么SPPnet无法更新低于空间金字塔池化层的权重。
根本原因是当每个训练样本(即RoI)来自不同的图像时,通过SPP层的反向传播是非常低效的,这正是训练R-CNN和SPPnet网络的方法。低效的部分是因为每个RoI可能具有非常大的感受野,通常跨越整个输入图像。由于正向传播必须处理整个感受野,训练输入很大(通常是整个图像)。
我们提出了一种更有效的训练方法,利用训练期间的特征共享。在Fast RCNN网络训练中,随机梯度下降(SGD)的小批量是被分层采样的,首先采样N个图像,然后从每个图像采样R/N个 RoI。关键的是,来自同一图像的RoI在向前和向后传播中共享计算和内存。减小N,就减少了小批量的计算。例如,当N=2和R=128时,得到的训练方案比从128幅不同的图采样一个RoI(即R-CNN和SPPnet的策略)快64倍。
这个策略的一个令人担心的问题是它可能导致训练收敛变慢,因为来自相同图像的RoI是相关的。这个问题似乎在实际情况下并不存在,当N=2和R=128时,我们使用比R-CNN更少的SGD迭代就获得了良好的结果。
除了分层采样,Fast R-CNN使用了一个精细的训练过程,在微调阶段联合优化Softmax分类器和检测框回归,而不是分别在三个独立的阶段训练softmax分类器,SVM和回归器3[^ 11]。 下面将详细描述该过程(损失,小批量采样策略,通过RoI池化层的反向传播和SGD超参数)。
多任务损失。Fast R-CNN网络具有两个同级输出层。 第一个输出在K+1个类别上的离散概率分布(每个RoI),p=(p0,…,pK)。 通常,通过全连接层的K+1个输出上的Softmax来计算p。第二个输出层输出检测框回归偏移,tk=(tkx,tky,tkw,tkh),对于由k索引的K个类别中的每一个。 我们使用中给出的tk的参数化,其中tk指定相对于候选框的尺度不变转换和对数空间高度/宽度移位。
每个训练的RoI用类真值u和检测框回归目标真值v标记。我们对每个标记的RoI使用多任务损失L以联合训练分类和检测框回归:
其中Lcls(p,u)=−logpu, 是类真值u的log损失。
对于类真值uu,第二个损失Lloc是定义在检测框回归目标真值元组u,v=(vx,vy,vw,vh)和预测元组tu=(tux,tuy,tuw,tuh)上的损失。 Iverson括号指示函数[u≥1]]当u≥1的时候为值1,否则为0。按照惯例,背景类标记为u=0。对于背景RoI,没有检测框真值的概念,因此Lloc被忽略。对于检测框回归,我们使用损失
是鲁棒的L1L1损失,对于异常值比在R-CNN和SPPnet中使用的L2损失更不敏感。当回归目标无界时,具有L2L2损失的训练可能需要仔细调整学习速率,以防止爆炸梯度。公式(3)消除了这种灵敏度。
公式(1)中的超参数λ控制两个任务损失之间的平衡。我们将回归目标真值vi归一化为具有零均值和单位方差。所有实验都使用λ=1。
我们注意到D.Erhan,C.Szegedy,A.Toshev,andD.Anguelov. Scalable objectdetectionusingdeepneuralnetworks. 使用相关损失来训练一个类别无关的目标候选网络。 与我们的方法不同的是倡导一个分离定位和分类的双网络系统。OverFeat4,R-CNN3和SPPnet5也训练分类器和检测框定位器,但是这些方法使用逐级训练,这对于Fast RCNN来说不是最好的选择。
小批量采样。在微调期间,每个SGD的小批量由N=2个图像构成,均匀地随机选择(如通常的做法,我们实际上迭代数据集的排列)。 我们使用大小为R=128的小批量,从每个图像采样64个RoI。 如在3中,我们从候选框中获取25%的RoI,这些候选框与检测框真值的IoU至少为0.5。 这些RoI只包括用前景对象类标记的样本,即u≥1。 剩余的RoI从候选框中采样,该候选框与检测框真值的最大IoU在区间[0.1,0.5)上5。 这些是背景样本,并用u=0标记。0.1的阈值下限似乎充当难负样本重训练的启发式算法11。 在训练期间,图像以概率0.5水平翻转。不使用其他数据增强。
通过RoI池化层的反向传播。反向传播通过RoI池化层。为了清楚起见,我们假设每个小批量(N=1)只有一个图像,扩展到N>1N>1是显而易见的,因为前向传播独立地处理所有图像。
令xi∈ℝ是到RoI池化层的第i个激活输入,并且令yrj是来自第r个RoI层的第j个输出。RoI池化层计算yrj=xi∗(r,j),其中
。R(r,j)是输出单元yrj最大池化的子窗口中的输入的索引集合。单个xi可以被分配给几个不同的输出yrj。
RoI池化层反向传播函数通过遵循argmax switches来计算关于每个输入变量xixi的损失函数的偏导数:
换句话说,对于每个小批量RoI r和对于每个池化输出单元yrj,如果i是yrj通过最大池化选择的argmax,则将这个偏导数∂L∂yrj∂L∂yrj积累下来。在反向传播中,偏导数∂L∂yrj∂L∂yrj已经由RoI池化层顶部的层的反向传播函数计算。
SGD超参数。用于Softmax分类和检测框回归的全连接层的权重分别使用具有方差0.01和0.001的零均值高斯分布初始化。偏置初始化为0。所有层的权重学习率为1倍的全局学习率,偏置为2倍的全局学习率,全局学习率为0.001。 当对VOC07或VOC12 trainval训练时,我们运行SGD进行30k次小批量迭代,然后将学习率降低到0.0001,再训练10k次迭代。当我们训练更大的数据集,我们运行SGD更多的迭代,如下文所述。 使用0.9的动量和0.0005的参数衰减(权重和偏置)。
2.4.Scale invariance
我们探索两种实现尺度不变对象检测的方法:(1)通过“brute force”学习
BF算法,暴风算法,是普通的模式匹配算法
(2)通过使用图像金字塔。
这些策略遵循5中的两种方法。 在“brute force”方法中,在训练和测试期间以预定义的像素大小处理每个图像。网络必须直接从训练数据学习尺度不变性目标检测。
相反,多尺度方法通过图像金字塔向网络提供近似尺度不变性。 在测试时,图像金字塔用于大致缩放-规范化每个候选框。 在多尺度训练期间,我们在每次图像采样时随机采样金字塔尺度,遵循5,作为数据增强的形式。由于GPU内存限制,我们只对较小的网络进行多尺度训练。
3.FastR-CNN detection
一旦Fast R-CNN网络被微调完毕,检测相当于运行前向传播(假设候选框是预先计算的)。网络将图像(或图像金字塔,编码为图像列表)和待计算概率的R个候选框的列表作为输入。在测试的时候,R通常在2000左右,虽然我们将考虑将它变大(约45k)的情况。当使用图像金字塔时,每个RoI被缩放,使其最接近5中的224^2个像素。
从这里估计,可能和RCNN一样利用图像处理算法ss(selective search)获取的图像候选框
对于每个测试的RoI r,正向传播输出类别后验概率分布p和相对于r的预测的检测框框偏移集合(K个类别中的每一个获得其自己的精细检测框预测)。我们使用估计的概率Pr(class=k|r)≜pk为每个对象类别k分配r的检测置信度。然后,我们使用R-CNN算法的设置和对每个类别独立执行非最大抑制。
3.1.Truncated SVD for faster detection
对于整体图像分类,与卷积层相比,计算全连接层花费的时间较小。相反,为了检测,要处理的RoI的数量很大,并且接近一半的正向传递时间用于计算全连接层(参见图2)。大的全连接层容易通过用截短的SVD压缩来加速。
SVD 奇异值分解,机器学习算法,类似PCA
在这种技术中,层的u×v权重矩阵W通过SVD被近似分解为:
在这种分解中,UU是一个u×t的矩阵,包括W的前t个左奇异向量,Σt是t×t对角矩阵,其包含W的前t个奇异值,并且V是v×t矩阵,包括W的前t个右奇异向量。截断SVD将参数计数从uv减少到t(u+v)t个,如果t远小于min(u,v),则SVD可能是重要的。 为了压缩网络,对应于W的单个全连接层由两个全连接层替代,在它们之间没有非线性。这些层中的第一层使用权重矩阵ΣtVT(没有偏置),并且第二层使用U(其中原始偏差与W相关联)。当RoI的数量大时,这种简单的压缩方法给出良好的加速。
网友评论