Fast RCNN论文笔记

 个人博客:http://www.chenjianqu.com/

原文链接:http://www.chenjianqu.com/show-75.html

论文:Ross Girshick.Fast R-CNN

素质三连

1.论文贡献

提出用于目标检测的Fast Region-based Convolutional Network method(Fast R-CNN)

Fast RCNN基于RCNN和SPP-net,使用VGG16作为特征提取器

运行速度比RCNN快213倍,比SPP-net快10倍,但是精度比两者都更高,达到SOTA

将特征提取器,回归器,分类器都合并在一个网络里,训练的速度提高而且更加方便

将SPP-net中的SPP替换RoI层,可以fine-turn整个网络

使用SVD分解FC计算,加快预测速度

通过实验验证了某些决策,包括:multi-task的作用,尺度不变性的方法,数据集大小的影响,SVM对比softmax,候选区域数量的影响等。

2.实验结果

    在VOC2007+VOC2012数据集上训练,在VOC2007上测试,最终得到mAP=70.0,达到SOTA。

3.存在的问题

    未实现端对端网络。

模型提出

    在这之前的目标检测算法都是多阶段的,比如RCNNSPP-net中,首先需要用SS生成候选框,然后使用CNNs抽取特征,使用SVM分类器对候选框打分,用回归器精确定位,再使用NMS才得到最终结果。

    RCNN的缺点:1.训练过程是一个multi-stage的pipeline。2.训练需要昂贵的时间和空间。3.模型检测速度太慢了。

    SPP-net在一定程度上解决了RCNN速度的问题,但是它仍然使用SVM作为分类器,因此需要多阶段训练。而且由于SPP的存在,无法对预训练的卷积层fine-turning。

    本文提出的Fast RCNN改进了RCNNSPP-net,提高了目标检测的速度和精度,Fast R-CNN有如下优势:1.比RCNNSPP-net有更高的检测精度(mAP)   2.单阶段训练,使用multi-task loss   3.训练可以更新所有的网络层   4.不需要再把抽取的特征放到硬盘上了。

    

架构和训练

    Fast RCNN架构如下:

图片1.jpg

    Fast RCNN的输入是图片和一组候选框。首先通过卷积神经网络提取特征得到特征图,然后对候选框映射到特征图上,并通过region of interest(RoI) 池化得固定长度的特征向量。特征向量被喂入FC层,最后从FC层连接两个输出分支:一个产生softmax概率用于评估该候选框属于K+1(K个分类加一个背景)的置信度,另一个分支是产生每个分类的偏置系数(也就是四个实数)。    

1.RoI池化层

    ROI池化是使用最大池化将候选区域对应的特征图(hxw)转换为固定分辨率(HxW)的特征图的方法,其中H和W是超参数。每个ROI被定义为四元组(r,c,h,w),其中(r,c)是候选框左上角的位置,(h,w)是候选框的高和宽。ROI池化是SPP的特例,是单级SPP,池化滑动窗口大小近似h/H x w/W。

2.预训练

    在ImageNet上预训练3个网络,预训练的网络用来初始化Fast R-CNN需要如下变换:1.最后一个池化层使用RoI Pooling Layer代替;2.网络的最后全连接层用两个输出分支代替:分类器和边框回归器。3.模型的输入是整张图片和对应的RoI。

3.Fine-tuning

    SPPNet不能反向传播的原因是:The root cause is that back-propagation through the SPP layer is highly inefficient when each training sample (i.e. RoI) comes from a different image, which is exactly how R-CNN and SPPnet networks are trained. The inefficiency stems from the fact that each RoI may have a very large receptive field, often spanning the entire input image. Since the forward pass must process the entire receptive field, the training inputs are large (often the entire image).

    大佬的解释[https://www.zhihu.com/question/66283535/answer/275678219]:SPP-Net中fine-tuning的样本是来自所有图像的所有RoI打散后均匀采样的,即RoI-centric sampling,这就导致SGD的每个batch的样本来自不同的图像,需要同时计算和存储这些图像的Feature Map,过程变得expensive.  Fast R-CNN采用分层采样思想,先采样出N张图像(image-centric sampling),在这N张图像中再采样出R个RoI,具体到实际中,N=2,R=128,同一图像的RoI共享计算和内存,也就是只用计算和存储2张图像,消耗就大大减少了。

    而在Fast RCNN的训练过程中,SGD的mini-batch是分层采样的。首先从数据集中采样N张图片,然后每张图片采样R/N个RoI,R训练的RoI数量。每批次RoI来源于相同的图片在前向和反向传播中共享计算和内存。N足够小的时候能减小计算量。比如N=2,R=128,要比RoI来自128张不同图片快64倍。

4.Multi-task loss

    Fast RCNN有两个输出,第一个分支输出每个ROI的离散概率分布,p=(p0,......,pk),即k个类加上一个背景。第二个分支输出bounding-box的回归偏置,tk=(tk_x,tk_y,tk_x,tk_h),每个类对应一个bounding box。训练的标签是ground-truth类别one-hot类别向量u和ground-truth bounding-box的v。这里使用多任务损失L把两个输出分支的损失合并起来:

图片2.jpg

    其中Lcls(p,u)是第一个分支的损失,使用交叉熵损失。Lloc是第二个分支的损失,u=0表示背景类别,[u>=1]表示当u>=1时lambda=1,否则lambda=0。Lloc的计算如下:

图片3.jpg

    这是一个L1损失,相对于RCNN和SPPNet的L2损失,它对边界更加不敏感。When the regression targets are unbounded, training with L2 loss can require careful tuning of learning rates in order to prevent exploding gradients。公式1中的超参数lambda控制两个损失的平衡。这里将所有的ground-truth的vi归一化,减去数据集均值,除以方差,使用lambda=1。

5.Mini-batch 采样

    在数据集中随机选择(实际上是迭代选择)N=2张图片,mini-batch的size=128,即每张图片采样64个RoI。这些RoI中有25%是与ground-truth的IoU大于0.5的,这些是正样本,另外的RoI就是背景负样本。在训练时,图像被水平翻转的概率是0.5,没有使用另外的数据增强。

6.通过RoI pooling layers反向传播

    RoI池化层的反向传播如下:

图片a.jpg

7.SGD超参数

    两个输出分支的初始化:分别使用零均值,标准差为0.01和0.001的高斯分布,偏置初始化为0。学习率为0.001。当在VOC 2007或VOC 2012上运行时,用sgd训练30k,接着学习率降低到0.0001再训练10k。当在更大的数据集训练时,sgd要跑更多的次。使用0.9的动量和0.0005的参数衰减。

8.尺度不变性

    作者探索了两种实现尺度不变的目标检测方法:(1)通过”brute force”学习,(2)使用图像金字塔。在brute force学习中,其实就是单尺度,训练和测试时每个图像被处理成预定义大小,模型从训练数据中直接学习尺度不变性。而图像金字塔,就是多尺度方法,即通过图像金字塔近似尺度不变。测试时,图像金字塔用于对候选区域近似尺度归一化。在多尺度训练时,每个采样的图片随机采样一个金字塔尺度,这和SPP一样。

Fast RCNN目标检测

    Fast RCNN的输入是图像(或图像金字塔,图像的列表)和一组候选区域R。R的大小一般设置为2000,后面的实验中也有R=45k的情况。当使用图像金字塔的时,分配每个尺度中的RoI接近224^2。测试时,对于每个RoI r,前向传播后输出类别概率分布p和一组相对于r的bounding box偏置,每个类对应一个bounding box偏置。每个r中类k的置信度为Pr(class=k|r)=pk。最后对每个类再执行NMS就得到最终的结果了。

SVD分解

    在图像分类模型中,FC层的时间花费小于CNNs层,但是在目标检测中,由于RoI的数量很多,因此FC层的计算时间花费超过整个前向传播的一半。如下图:

图片6.jpg

    FC层的计算可以通过SVD分解来加速。uxv的参数矩阵W可以分解如下:W≈USV_t。其中U是uxt的矩阵,包含W的t个左奇异向量;S是txt对角矩阵,包含W的前t个奇异值,V_t是V的转置矩阵,V是vxt矩阵,包含W的t个右奇异向量。

    SVD分解参数计算由uv减少到t(u+v),当t<min(u,v)时,计算量显著减少。SVD分解在实现上,一个单层的FC被分解为两个FC层,中间无非线性层。第一层的参数矩阵是SV_t,第二层的参数矩阵是U。

实验和结果

1.实验对比

    使用三个在ImageNet上预训练的模型。CaffeNet(基于R-CNN中的AlexNet),称为S,即small;VGG_CNN_M_2014(Return of the devil in the details: Delving deep into convolutional nets),称为M。M跟S的深度一样,但是更宽。VGG16,称为L。这里所有实验使用单尺度训练和测试。

    下面是FRCN(即Fast R-CNN)与其它先进的目标检测方法的比较,其中NUS_NIN_c2000和BabyLearning是NIN的变体,SegDeepM通过使用马尔可夫随机场加速RCNN:

图片7.jpg

    由上表可知,Fast RCNN牛逼。

2.训练和测试时间

图片8.jpg

    可以看到,基于VGG16的话 Fast RCNN的测试运行速度比RCNN快146倍和213倍。而且可以发现,使用SVD在只降低一点点mAP的情况下,大幅加快网络运行速度。

3.Fine-tune卷积层

    在SPPNet中,只微调了FC层的参数。这里验证了fine-turn卷积层的重要性,下面是结果:

图片9.jpg

    但是并不是所有的卷积层都值得微调,第一层就无所谓,微调与否都不影响mAP。对于VGG16来说,只有微调conv3_1(即第9层)后的卷积层才有用。

设计评估

    通过在VOC 2007上的实验评估设计决策。

1.multi-task训练有用吗?

    Fast RCNN使用了两个损失,即多任务训练。为了测试multi-task training是否提高了目标检测的精度,作者仅用分类损失训练了baseline networks。baseline结果如下图的每组的第一列,第二列是使用了multi-task loss。

图片10.jpg

    结果显示multi-task training 提高了mAP。

2.尺度不变:brute force还是finesse?

    实现尺度不变有两种方式:通过brute-force(single scale),图像金字塔(multi-scale)。这两种方式都预定义图像的短边为s。单尺度情况下使用s=600,而且令长边不大于1000。而Pascal图像的平均大小是384x473,因此RoI池化层的stride大概等于10。多尺度中使用的s=[480,576,688,864,1200],截断最长的长边为2000。

    下表显示结果:

图片11.jpg

    结果显示CNNs擅长直接学习尺度不变,multi-scale方法仅仅有轻微的提高,但是其计算花费要大得多,因此完全可以使用单尺度方法。

3.训练数据越多越好吗

    一个好的目标检测模型应该随着训练数据的增多而提高精度,但是Zhu et al.发现DPM很容易饱和。Fast RCNN仅使用VOC 2007训练的时候,mAP是66.9%;当使用VOC2007+VOC2012训练的时候,mAP是70.0%,如表格1的最后一行。因此数据越多越好。

4.SVM比softmax更好吗

    RCNN和SPPNet使用线性SVM,但是这里确使用softmax,对比如下:

图片12.jpg

    Table 8 shows softmax slightly outperforming SVM for all three networks, by +0.1 to +0.8 mAP points. This effect is small, but it demonstrates that “one-shot” fine-tuning is sufficient compared to previous multi-stage training approaches. We note that softmax, unlike one-vs-rest SVMs,introduces competition between classes when scoring a RoI.

5.候选区域越多越好吗

    有两种目标检测器,使用稀疏的候选区域(SS算法)和使用稠密的候选区域(DPM算法)。使用SS算法的quality mode,作者设置候选区域数量从1k到10k,每次从新训练和从新测试模型M,结果如下:

图片13.jpg

总结:Fast RCNN牛逼,RGB牛逼。

发布了74 篇原创文章 · 获赞 33 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37394634/article/details/103976603
今日推荐