论文阅读+Fast-RCNN

《Fast R-CNN:Fast Region-based Convolutional Networks for object detection》—2015

源码:https://github.com/rbgirshick/fast-rcnn

 

这篇论文依据的是RCNN方法,在使用RCNN的过程中遇到了一些问题,所以有了这篇文章。

以前看到《基于XX方法的什么》不是很明白在讲什么,现在知道了。这种表述的意思是,我们最近一段时间使用XXX方法在解决自己想要解决的问题。但是这个问题的应用场景是论文中没有研究的,或者说我在某些方面更加关注,或者我对于论文的这种标准不能满足我的要求,我可能希望更快,更准确,消耗的内存更小,希望可以移植等。所以,就考虑能不能在这个方法的基础上进行修改,增加或者删除一些东西,满足我的要求,并把最后成型的物体叫做《基于XX的什么》。通常“什么”是指出了改进方法的作用/功能等。

改进的原因:使用的RCNN方法遇到麻烦了。

有哪些麻烦呢?

1.解决的问题是什么?

问题一:测试时速度慢

RCNN一张图像内候选框之间大量重叠,提取特征操作冗余。 本文将整张图像归一化后直接送入深度网络。在邻接时,才加入候选框信息,在末尾的少数几层处理每个候选框。

问题二:训练时速度慢 原因同上。 在训练时,本文先将一张图像送入网络,紧接着送入从这幅图像上提取出的候选区域。这些候选区域的前几层特征不需要再重复计算。

问题三:训练所需空间大 RCNN中独立的分类器和回归器需要大量特征作为训练样本。 本文把类别判断和位置精调统一用深度网络实现,不再需要额外存储。

----------------------------------------------------------------------------------------------------------------------

1.训练是多个阶段的。先提取proposal ,然后使用CNN提取特征,之后使用SVM分类器,最后做bbox的回归。

2.训练十分消耗空间和时间。在训练SVM的以及bbox回归过程中,需要将之前提取出来的特征写入磁盘中,这些特征需要花费的空间很大,消耗的时间也长。

3.物体检测非常慢,测试的时候,特征需要从每个图片中的每个proposal上提取,使用VGG-16网络,大概每张图片消耗47s.

针对每个问题,作者提出了一些解决办法(小的技术点),然后综合在一起,就形成了我们看到的Fast RCNN

2.解决的思路是什么?/怎么解决问题?

Fast R-CNN网络输入是一张图片和一系列的proposal bboxes.


简要流程图如下:

训练的过程如下:

1.把任意大小的图片使用ss生成2K个object proposal(这里称为RoI)。

2.把该图片输入到CNN网络,网络使用若干卷积层和最大池化层处理整个图像以产生一个特征图。

3.根据原始图像中bbox到特征图的映射关系,对于每一个object proposal bbox(ss得到的ROI的bbox),在网络的最后一个卷积层上找到每个bbox对应的特征框(有的称为object proposal对应的特征图)。并且再最后一个卷积层之后,添加一个ROI池化层。使用ROI池化层将每个特征框池化到固定大小的特征框(特征图),这个特征框(特征图)的大小是H×W【VGG-16网络是7×7】,大小固定,但是特征框变小了。

4.把每个大小固定为H×W【VGG-16网络是7×7】的特征框作为输入,被送到两个全连接层中,从而得到了固定大小的ROI特征向量。

5.接着第3步的全连接层的后面有两个地位相同的分支。第3步的特征向量经过各自的全连接层【由SVD分解实现】,分别得到两个输出向量:一个分支是用来做分类任务。一个分支是用来做回归任务。

  分类任务的分支:它对目标关于K个对象类(这里K=21)产生softmax概率估计,即输出每个ROI的概率分布。使用softmax函数;

  回归任务的分支:它能够输出K个对象类中每一个类的四个实数值。这四个值指的是属于相应的类的情况下,每一个种类的bbox的位置偏差。使用smooth的L1-loss范式。 

6.利用窗口得分分别对每一类物体进行非极大值抑制剔除重叠建议框,最终得到每个类别中回归修正后的得分最高的窗口。

参考文献:https://blog.csdn.net/WoPawn/article/details/52463853

       这里写图片描述

3.技术的创新点

3.1.ROI pooling?

ROIs Pooling顾名思义,是Pooling层的一种,而且是针对RoIs的Pooling,他的特点是输入特征图尺寸不固定,但是输出特征图尺寸固定;

什么是ROI呢?
ROI是Region of Interest的简写,指的是在“特征图上的框”;
1)在Fast RCNN中, RoI是指Selective Search完成后得到的“候选框”在特征图上的映射,如下图所示;
2)在Faster RCNN中,候选框是经过RPN产生的,然后再把各个“候选框”映射到特征图上,得到RoIs。

这里写图片描述

解释一下上图的含义:
1.原始图片。
2.原始图片的红色的框-就是ss得到的object proposal。
3.特征图:就是CNN卷积和池化操作后的结果=conv5层的特征图。
5.特征图上的红色框:就是原图上的红色的框根据映射关系,然后在特征图上的对应的框。
其他部分:有需要就补充。

图1 Fast RCNN整体结构

往往经过rpn后输出的不止一个矩形框,所以这里我们是对多个ROI进行Pooling。

ROI Pooling的输入

输入有两部分组成:
1. 特征图:指的是图1中所示的特征图,在Fast RCNN中,它位于RoI Pooling之前,在Faster RCNN中,它是与RPN共享那个特征图,通常我们常常称之为“share_conv”;
2. rois:在Fast RCNN中,指的是Selective Search的输出;在Faster RCNN中指的是RPN的输出,一堆矩形候选框框,形状为1x5x1x1(4个坐标+索引index),其中值得注意的是:坐标的参考系不是针对feature map这张图的,而是针对原图的(神经网络最开始的输入)

ROI Pooling的输出

输出是batch个vector,其中batch的值等于RoI的个数,vector的大小为channel * w * h;RoI Pooling的过程就是将一个个大小不同的box矩形框,都映射成大小固定(w * h)的矩形框;

ROI Pooling的过程

这里写图片描述
如图所示,我们先把roi中的坐标映射到feature map上,映射规则比较简单,就是把各个坐标除以“输入图片与feature map的大小的比值”,得到了feature map上的box坐标后,我们使用Pooling得到输出;由于输入的图片大小不一,所以这里我们使用的类似Spp Pooling,在Pooling的过程中需要计算Pooling后的结果对应到feature map上所占的范围,然后在那个范围中进行取max或者取average。

-----------------------------------------------------------------------------------------------------------------------------------------------------

ROI_pooling层的作用

  • 将原图中的RoI定位到feature map中对应的patch;
  • 将这个feature map  patch下采样为大小固定的feature,方便传入后面的全连接层。

RoI Pooling层的测试(forward)



RoI Pooling层的训练(backward)

3.2.Regression操作

       输出为4*K维数组t,表示当属于K类时,应该平移缩放的参数,这是针对每个ROI区域坐标的偏移优化,tk=(tkx,tky,tkw,tkh)0kK是多类检测的类别序号。

该函数在 (−1,1) 之间为二次函数,而其他区域为线性函数,据说这种形式可以增强模型对异常数据的鲁棒性,函数曲线如下。
这里写图片描述

注意
这里的回归操作和R-CNN里一样,也是只对特定的候选框(即和Ground Truth的IoU大于特定thresh)进行。

4.有哪些需要展开讲的知识点?

4.1分类操作是怎么实现的?

    Fast R-CNN使用神经网络来进行分类操作:输出K+1维数组p,表示属于K类和背景的概率,这是针对每个ROI区域的分类概率预测,p=(p0,p1,,pK)

分类代价由真实分类u对应的概率决定,损失函数定义如下:

Lcls=log(pu)


5.这种方法的优点有哪些?

  • Fast R-CNN将整张整张图片归一化之后直接送入深度网络,邻接时才加入候选框信息,只有末尾的少数几层才处理每个候选框;相比之下,R-CNN框架中,一张图像内候选框之间大量重叠,需要重复地提取特征,耗时间。

  • Fast R-CNN把类别判断和位置精修统一到一个深度网络中,不需要额外存储;相比之下,RCNN中独立的分类器和回归器需要大量特征作为训练样本,耗空间。

  •  做图片分类时,一般都是先将图片crop和resize到固定尺寸,然后输入网络,提取特征,最后进行分类。 
    对于检测来说,这个方法不太适合,因为原始图像如果缩小到224这种分辨率,那么感兴趣对象可能都会变的太小无法辨认。 
    而Fast R-CNN的数据输入并不对图片大小进行限制,实现这一点的关键所在,就是ROI Pooling层,它可以在任意大小的图片feature map上针对输入的每一个ROI区域提取出固定维度的特征表示,保证后续对每个区域的后续分类能够正常进行。

相比于RCNN,它的优点:

1.有更高的检测质量

2.把多个任务的损失函数写到一起,实现单级的训练过程。

3.在训练时可以更新所有的层。

4.不需要在磁盘中存储特征。

6.这种方法存在哪些问题?


7.技术细节

1.Fast RCNN中使用的损失函数是什么?

       在训练的时候,分类与回归是一起训练的,总的loss是分类的loss加上回归的loss。计算公式如下:

                                             

2.整个测试过程为什么可以只进行一次CNN特征提取操作?

先看R-CNN网络,它首先采用selective search算法提取约2k个建议框,并对所有建议框都进行了CNN特征提取操作,会出现重叠区域多次重复提取特征,这些操作非常耗时、耗空间。事实上我们并不需要对每个建议框都进行CNN特征提取操作,只需要对原始的整张图片进行1次CNN特征提取操作即可,因为selective search算法提取的建议框属于整张图片,因此对整张图片提取出特征图后,再找出相应建议框在特征图中对应的区域,这样就可以避免冗余的特征提取操作,节省大量时间。

1.先用Selective Search等proposal提取算法得到一批候选框坐标,然后输入网络对每个候选框包含的对象进行预测。

以上,神经网络仍然仅仅是图片分类的工具,只不过不是整图分类,而是ROI区域的分类。

参考文献:https://blog.csdn.net/WoPawn/article/details/52463853

3.为什么要将每个建议框对应的特征框池化到H×W 的size?如何实现?

      像AlexNet CNN等网络在提取特征过程中对图像的大小并无要求,只是在提取完特征进行全连接操作的时候才需要固定特征尺寸,利用这一点,Fast R-CNN可输入任意size图片,并在全连接操作前加入RoI池化层,将建议框对应特征图中的特征框池化到H×W 的size,以便满足后续操作对size的要求;

具体如何实现呢?
首先假设建议框对应特征图中的特征框大小为h×w,将其划分H×W个子窗口,每个子窗口大小为h/H×w/W,然后对每个子窗口采用max pooling下采样操作,每个子窗口只取一个最大值,则特征框最终池化为H×W的size【特征框各深度同理】,这将各个大小不一的特征框转化为大小统一的数据输入下一层。

4.为什么要采用SVD分解实现Fast R-CNN网络中最后的全连接层?具体如何实现?

      图像分类任务中,用于卷积层计算的时间比用于全连接层计算的时间多,而在目标检测任务中,selective search算法提取的建议框比较多【 约2k】,几乎有一半的前向计算时间被花费于全连接层,就Fast R-CNN而言,RoI池化层后的全连接层需要进行约2k次【 每个建议框都要计算】,因此在Fast R-CNN中可以采用SVD分解加速全连接层计算;

具体如何实现呢?
① 物体分类和窗口回归都是通过全连接层实现的,假设全连接层输入数据为x,输出数据为y,全连接层参数为W,尺寸为u×v,那么该层全连接计算为:

y=Wx

计算复杂度为u×v;

② 若将W进行SVD分解,并用前t个特征值近似代替,即:

在实现时,相当于把一个全连接层拆分为两个全连接层,第一个全连接层不含偏置,第二个全连接层含偏置;实验表明,SVD分解全连接层能使mAP只下降0.3%的情况下提升30%的速度,同时该方法也不必再执行额外的微调操作。

这里写图片描述

5.文中仅采用selective search算法提取约2k个候选区域,那候选区域越多越好吗?

文中利用selective search算法提取1k~10k中10种数目【1k,2k…】的候选区域进行训练测试,发现随着候选区域个数的增加,mAP成先增加后缓慢下滑的趋势,这表明更多的候选区域会有损精度;与此同时,作者也做了召回率【 所谓召回率即候选区域为真的窗口与Ground Truth的比值【IoU大于阈值即为真】】分析实验,发现随着候选区域个数的增加,召回率并没有和mAP成很好的相关性,而是一直不断增加,也就是说更高的召回率并不意味着更高的mAP;

文中也以selective search算法提取的2k个候选区域为基础,每次增加1000 × {2, 4, 6, 8, 10, 32, 45}个密集box【滑动窗口方法】进行训练测试,发现mAP比只有selective search方法的2k候选区域下降幅度更大,最终达到53%。

6.如何处理尺度不变性问题?即如何使24×24和1080×720的车辆同时在一个训练好的网络中都能正确识别?

    文中提及两种方式处理:brute-force(单一尺度)和image pyramids(多尺度)。单一尺度直接在训练和测试阶段将image定死为某种scale,直接输入网络训练就好,然后期望网络自己能够学习到scale-invariance的表达;多尺度在训练阶段随机从图像金字塔【 缩放图片的scale得到,相当于扩充数据集】中采样训练,测试阶段将图像缩放为金字塔中最为相似的尺寸进行测试;

     可以看出,多尺度应该比单一尺度效果好。作者在5.2节对单一尺度和多尺度分别进行了实验,不管哪种方式下都定义图像短边像素为s,单一尺度下s=600【维持长宽比进行缩放】,长边限制为1000像素;多尺度s={480,576,688,864,1200}【维持长宽比进行缩放】,长边限制为2000像素,生成图像金字塔进行训练测试;实验结果表明AlexNet【S for small】、VGG_CNN_M_1024【M for medium】下单一尺度比多尺度mAP差1.2%~1.5%,但测试时间上却快不少,VGG-16【L for large】下仅单一尺度就达到了66.9%的mAP【由于GPU显存限制多尺度无法实现】,该实验证明了深度神经网络善于直接学习尺度不变形,对目标的scale不敏感。

7.为什么不沿用R-CNN中的形式继续采用SVM进行分类?

     为什么R-CNN中采用SVM分类而不直接用CNN网络输出端进行分类已经在R-CNN博客中说明,针对Fast R-CNN,文中分别进行实验并对比了采用SVM和采用softmax的mAP结果,不管AlexNet【 S for small】、VGG_CNN_M_1024【 M for medium】、VGG-16【 L for large】中任意网络,采用softmax的mAP都比采用SVM的mAP高0.1%~0.8%,这是由于softmax在分类过程中引入了类间竞争,分类效果更好;

    Fast R-CNN去掉了SVM这一步,所有的特征都暂存在显存中,就不需要额外的磁盘空间。  

8.Fast R-CNN如何采样进行SGD训练,和R-CNN、SPPnet中SGD采样方式有什么区别和优势?

        R-CNN和SPPnet中采用RoI-centric sampling:从所有图片的所有候选区域中均匀取样,这样每个SGD的mini-batch中包含了不同图像的样本,不同图像之间不能共享卷积计算和内存,运算开销大;
Fast R-CNN中采用image-centric sampling: mini-batch采用层次采样,即先对图像采样【 N个】,再在采样到的图像中对候选区域采样【 每个图像中采样R/N个,一个mini-batch共计R个候选区域样本】,同一图像的候选区域卷积共享计算和内存,降低了运算开销;
        image-centric sampling方式采样的候选区域来自于同一图像,相互之间存在相关性,可能会减慢训练收敛的速度,但是作者在实际实验中并没有出现这样的担忧,反而使用N=2,R=128的RoI-centric sampling方式比R-CNN收敛更快。

9.这里解释一下为什么SPPnet不能更新spatial pyramid pooling层前面的卷积层,而只能更新后面的全连接层?

博主没有看过SPPnet的论文,有网友解释说卷积特征是线下计算的,从而无法在微调阶段反向传播误差;另一种解释是,反向传播需要计算每一个RoI感受野的卷积层梯度,通常所有RoI会覆盖整个图像,如果用RoI-centric sampling方式会由于计算too much整幅图像梯度而变得又慢又耗内存。

10.训练数据越多效果越好吗?

实验训练集测试集mAP
实验1VOC 2007训练集VOC 2007测试集66.9%
实验1VOC 2007+VOC 2012训练集VOC 2007测试集70.0%
实验2VOC 2012训练集VOC 2010测试集66.1%
实验2VOC 2007+VOC 2012训练集+VOC2007测试集VOC 2010测试集68.8%
实验3VOC 2012训练集VOC 2012测试集65.7%
实验3VOC 2007+VOC 2012训练集+VOC2007测试集VOC 2012测试集68.4%

文中分别在VOC 2007、VOC 2010、VOC 2012测试集上测试,发现训练数据越多,效果确实更好。这里微调时采用100k次迭代,每40k次迭代学习率都缩小10倍。

11.哪些层参数需要被微调?

SPPnet论文中采用ZFnet【 AlexNet的改进版】这样的小网络,其在微调阶段仅对全连接层进行微调,就足以保证较高的精度,作者文中采用VGG-16【 L for large】网路,若仅仅只对全连接层进行微调,mAP会从66.9%降低到61.4%, 所以文中也需要对RoI池化层之前的卷积层进行微调;

那么问题来了?向前微调多少层呢?所有的卷积层都需要微调吗?
作者经过实验发现仅需要对conv3_1及以后卷积层即9-13号卷积层】进行微调,才使得mAP、训练速度、训练时GPU占用显存三个量得以权衡;
作者说明所有AlexNet【S for small】、VGG_CNN_M_1024【M for medium】的实验结果都是从conv2往后微调,所有VGG-16【L for large】的实验结果都是从conv3_1往后微调。

12.Fast R-CNN如何进行多任务训练?多任务训练有效果吗?

       Fast R-CNN网络分类损失和回归损失如下图所示【 仅针对一个RoI即一类物体说明】,黄色框表示训练数据,绿色框表示输入目标:

这里写图片描述

-cls_score层用于分类,输出K+1维数组p,表示属于K类物体和背景的概率;
-bbox_predict层用于调整候选区域位置,输出4*K维数组,也就是说对于每个类别都会训练一个单独的回归器
-loss_cls层评估分类代价,由真实分类u对应的概率决定:

Lcls(p,u)=logpu

-loss_bbox评估回归损失代价,比较真实分类u对应的预测平移缩放参数tu=(tux,tuy,tuwtuh) 

和真实平移缩放参数 v=(vx,vy,vw,vh)  的差距:

     smooth L1损失函数曲线如下图所示,相比于L2损失函数,其对离群点、异常值不敏感,可控制梯度的量级使训练时不容易跑飞;

这里写图片描述

约定u=0为背景分类,那么[u1]  ,函数表示背景候选区域即负样本不参与回归损失,不需要对候选区域进行回归操作; 

λ 控制分类损失和回归损失的平衡,文中所有实验 λ=1

那多任务训练有效果吗?
首先不看多任务训练效果,至少比起R-CNN其训练方便、简洁。多任务训练考虑各任务间共享卷积层的相互影响,是有潜在可能提高检测效果的;
文中通过实验发现AlexNet【S for small】、VGG_CNN_M_1024【M for medium】、VGG-16【L for large】三种网络采用多任务训练比不采用mAP提高了0.8%~1.1%【测试时不采用Bounding-box regression】。

13. RoI池化层如何进行反向求导训练?

疑问?有见过一些资料说:池化层是不用求导的?这和这个问题矛盾,求解释!!!



其中判决函数δ(i,j)表示输入i节点是否被输出j节点选为最大值输出。不被选中【δ(i,j)=false】有两种可能:xi不在yi范围内,或者xi不是最大值。若选中【δ(i,j)=true 】则由链式规则可知损失函数L相对xi的梯度等于损失函数L相对yi的梯度×(yixi的梯度->恒等于1),故可得上述所示公式;

对于RoI max pooling层,设xi为输入层的节点,yri为第r个候选区域的第j个输出节点,一个输入节点可能和多个输出节点相关连,如下图所示,输入节点7和两个候选区域输出节点相关连;

这里写图片描述

该输入节点7的反向传播如下图所示。对于不同候选区域,节点7都存在梯度,所以反向传播中损失函数L对输入层节点xi

的梯度为损失函数L对各个有可能的候选区域r【 xi 被候选区域r的第j个输出节点选为最大值 】输出 yri

梯度的累加,具体如下公式所示:

这里写图片描述

                                                           

判决函数[i=i(r,j)]表示i节点是否被候选区域r的第j个输出节点选为最大值输出,若是,则由链式规则可知损失函数L相对xi的梯度等于损失函数L相对yrj的梯度×(yrjxi的梯度->恒等于1),上图已然解释该输入节点可能会和不同的yrj有关系,故损失函数L相对xi的梯度为求和形式。

更多细节,请看 https://blog.csdn.net/u011534057/article/details/51241831

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值