论文地址:Fast R-CNN
目录
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的实验中效果还行,就先这样操作了
- 例子:在batch=128的训练中:
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作用会更大些:
- 训练时,每张图片随机选择一个尺度,进行缩放后输入网络
- 测试时,对于每个候选窗口,选择单一尺度
来缩放图片,使该候选窗口的大小接近224x224。然后计算出该候选窗口的特征值
2.2.3 损失函数
损失函数分为两部分:
:经过softmax层对图像分类,维度N+1(其中N为类别数)
:边界框的regression loss
Fast RCNN的损失公式为:
- p:代表预测类别。u:代表真实类别
:图片为
种类时 预测候选框的位置。
:真实候选框的位置
:超参数,论文中设置为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%