检测之旧文新读(四)-Faster R-CNN

动机:

fast RCNN由于有了ROI pooling使得候选框的特征计算不用重复计算网络。从而使得速度上面最主要的瓶颈为了候选框的提取,基于此作者设计了一个RPN网络使得提取候选框的过程几乎是零时间成本。

作者为什么可以想到:

作者基于他的观察,卷积的网络特征也可以用于进行候选框的提取。我个人觉得这个观察实际在overFeat和muiltibox中也有了相关的描述。可能作者也有一定的参考。下面是作者的原文:
Our observation is that the convolutional (conv) feature maps used by region-based detectors, like Fast R-CNN, can also be used for generating region proposals.

讲完作者的动机,思路和整体的贡献,那么我们还是老样子,从实验开始看,然后映射到整体文章的细节,包括:内容是什么,怎么做实验,为什么做这个实验,实验结果分析。

实验:

基本检测实验:

这一部分,首先作者做了以下控制变量法(ablation)的实验:首先是region proposal 方法的对比;2.RPN 是否进行share的实验;3.proposal数量对检测结果的印象;4.在测试的时候是否进行NMS;5.没有做分类对检测效果的影响;6.没有做regression 对检测效果的影响。作者在这里主要是使用ZF-net来进行实验设置的探索。你可能会问为什么在这一部分使用ZF-net来进行实验呢? 我个人认为用VGG16即效果最好的模型进行这些探索更有意义。然后在用小模型ZF-net来验证RPN在小模型上面也有效果提升。但是作者这样做我觉得可能是基于如下的考虑:节省训练时间,由于控制变量实验众多,需要大量的训练时间。所以用ZF-net小模型来开始选一些基本的参数。但是这里会遇到一个问题:(小模型实验得来的参数规律也同样适用于大模型吗?我觉得对于深度学习这种黑箱子来说,我觉得不一定,所以这也是我觉得不合理的地方
(另外,下面每个标题就是实验内容,我就不再特定列出le)

1.region proposal 方法的对比:
  • 实验目的: 验证在提出RPN这个结构提取的proposals是有效的。
  • 实验实现: 实验分为了训练和测试两个阶段。我们可以回顾fast RCNN的训练过程,其实也主要是其fine-tune的训练过程。即先使用region proposals的方法来生成候选框,然后是用ROI pooling的反向传播梯度来更新整个模型。测试阶段也是先使用region proposals的模型来先获得候选框,然后有ROI pooiing共享特征来加速计算候选框的特征然后送入到分类和回归两个全连接网络上面得到检测结果。在这个实验中region proposal的方法分别是:SS(selective search),EB(edgeBoxes) 然后就是作者提出了RPN(region proposal network)。然后对比实验结果。
  • 实验结果分析:
    检测之旧文新读(四)-Faster R-CNN_第1张图片
    这里为了更好的比较region proposal的方法,我将论文中结果表第四行替换了原来的第三行。从表中可以看出实际上如果还是按照之前的训练方法单存使用RPN替换原来的SS和EB的算法,那么其实效果基本没有提升。但是这也从另一方面证明了RPN的有效性。那么刚看到这里,这个表格你应该至少会质疑三个问题:
  1. 效果既然没有提升,作者提出RPN还有什么意义呢?
    首先,实际上EB和SS的计算复杂度很高,但是RPN的话只是卷积操作,可以很方便的而进行的并行计算,所以速度上面会有很大的提升。另外可以实现end2end的训练,具体的我放在下面一个share的实验来讲。

  2. 为什么训练阶段的proposals个数在RPN这里和测试所用的个数不一样呢?
    这个应该是作者经过了测试的时候用了不同数量的proposals进行实验,发现在RPN+ZF的情况下proposals=300的时候效果最好。不过proposals降低无疑也是一个好事,降低了计算复杂度。

  3. 关于RPN的问题:
    1)RPN网络具体是什么 ,即RPN网络如何设计?
    2)RPN网络如何训练?*

  • RPN的设计和训练:
    RPN的网络结构:
    作者为什么会想到RPN设计呢?
    RPN的网络示意图,RPN实际上是一个FCN层
    检测之旧文新读(四)-Faster R-CNN_第2张图片
    如图所示,以VGG16为例,RPN实际上是接在最后的卷积层conv层后面在额外加上了两层操作:
    1)进行nxn(文中是3x3)步进为1的卷积操作,使得图片每个nxn的区域映射到512-d,实际上就是做了nxn的卷积输出为512-d的channel操作。(注意512是参数可调,文中对于ZF是使用256-d)
    2)然后分别使用两个1x1x512的卷积进行卷积,一个输出2k个chanel,每两个channel输出来判断相应的位置,大小和比率的anchor是不是object的概率。一个输出4k来回归相应位置,大小和比率的anchor所对应的ground truth的坐标位置。
    一.anchor的概念:(重要)
    anchor是faster RCNN提出的一个重要的概念,可以看做是SPP-net的一种反过程,意思是将feature map上面的一个特定区域的特征像素映射到不同大小的原图ROI的过程。那个首先你要先了解一个叫描点的概念。这个是feature maps层和图像之间的关系纽带。可以这么理解,以vgg16为例,我们在conv5层的feature maps层上面进行nxn步进为1的卷积操作(文中使用的是3x3),映射到图像,就是以k个窗口步进为16(2^4(conv5经过4次pool,所以在卷级层步进为1,在图像层相当于16))进行滑动窗口。其中k个窗口个数中的k=scale的个数*ratio的个数,这些图像上面的所有k个窗口和他们滑动出来的窗口我们就叫做anchor,那么描点就是这些窗口的中心,每个中心都对应k个窗口,并且每个中心(描点)和feature map的一个点进行对应。
    举个例子和图例:假设图像是224x224,那么conv5层就是14x14,所以我们可以计算得到到图像空间我们的滑动窗口得到的anchor描点的个数是224/16=14,也是14x14,这样就形成了一一对应的关系了。在下图中我们可以看出anchor是在图像上面的
    检测之旧文新读(四)-Faster R-CNN_第3张图片
    图片中相同颜色代表不同的scale,不同颜色代表不同的ratio。紫色中心红色的点代表描点。坐标紫色为图片,对应于右边黑色矩形框为feature maps。s代表stride即步进。这里以conv5为例,和k=9为例。

    这里有两个实现细节:
    1)如果图片不能整除怎么办?:比如以vgg16为例,输入是226x226,但是最后的feature map也是14x14,那么所以这里会直接先进行对应的resize操作,先计算最接近14x14可以一一对应的大小尺寸,这里可以得到224x224,然后将226x226,resize到224x224.
    2)RPN对conv5两种卷积实现方式:一种是采用same卷积,为了使卷积前后的大小一样,要先进行将feature map进行padding。这样的话anchor就是从第一个feature map上面的像素点,然后图像空间也是第一个像素点作为anchor(特征空间第二个像素点为anchor对应图像空间第17(1+16)个像素点为anchor)。如果是用valid进行卷积的话,那么以卷积核大小3x3为例,那么anchor第一个值在(1,1)这个位置(第一个像素是(0,0))对应于原始图片中的位置,应该图片空间(16,16).这里你可能还会有疑问,我们的scale是偶数,不是奇数才会有中心吗?偶数怎么办呢?
    RPN的训练:
    1)数据集:
    这个的训练样本都是以anchor为单位的,每个anchor要么是正样本,要么是负样本,要么不进行训练。
    正样本:
    1)这个anchor对于ground truth box具有最大的IOU(未必大于0.7)
    2)这个anchor对于某个ground truth box 的IOU>0.7
    负样本:所有anchor对于ground truth box <0.3的anchor都为负样本
    为什么这么设计呢?特别的对于正样本来说,我个人觉得第一点主要是为了防止由于stride过大而错过了一些ground truth导致某些ground truth没有对应的标签为正的anchor样本。
    2)模型-loss的理解
    这个loss 输入是RPN网络输出的pi意思是第i个anchor是否是object的概率,然后还要输入ti意思是第i个anchor所对应输入器其ground truth的位置坐标。p和t分别指的是groud truth。其中可以看出,如果单前输入的样本为负样本,是不用计算其回归误差的。我们的目标是训练Lcls和Lreg函数中的参数w使得目标值最小。其中Lcls的参数就是前面卷级层的所有参数+nxnxinput_channelx512卷积参数+1x1x512x2k参数,然后Lcls文中没给明,一般分类就是交叉熵误差函数(需要带代码确认),然后Lreg的参数就是前面卷级层的所有参数+nxnxinput_channelx512卷积参数+1x1x512x4k参数。然后他使用Lreg为smooth L1.
    注意这里的回归和fast RCNN的回归不同:我们先来回顾下fast RCNN的回归:它训练的参数除了整体的模型外还额外增加了最后的全连接层,由于输出直接是tx,ty,tw,th四个乘上类别个数的K值,所以对于所有相同的类别的ROI区域的特征公用同一组网络参数。而对于RPN他说他的类别是2(是否是物体),所以原始的回归方式不使用,因为在RPN中实际上有回归的都是属于同一个类别有物体,所以作者这里输出的是4xk个值,即txk,tyk,twk,thk,其中k在文中为1到9也就是36个值,而特定的scale和ratio的anchor才共享回归的权值。那么t*还是和fast RCNN一样采用的是:
    (有些人可能忘记了,回归网络的直接输出是t*然后利用上面的公式反推出预测的(x,y,w,h))。最后知道loss之后,训练采用FCN一样的训练方式即SGD的反向梯度传播算法。
    3)提高RPN的途径:
    1减少strides: 一个方法是扩大输入图片,那么在扩大图片的steps是16,在原始图片上面的steps就会小于16.第二种方法是减少卷级层,比如最后一层deconv到28x28,那么就可以和原图step=8进行anchor的一一对应。
    2对于不同的数据集分布修改参数:可能要使用的scale和ratio的数值大小和个数都不一样,那么有什么具体的实验准则吗?

RPN网络层是否和fast RCNN之间的网络层进行共享(share?)

(未完,待续)

  • 实验内容:作者提出了RPN如果如上面的实验1只是单纯的代替原来的候选框提取算法的话,那么实际上面意义就不会那么大,为了进一步提升速度,作者将RPN网络学到的权值和后面的fast RCNN进行共享,来减少计算的冗余。提出了新的训练算法,然后
  • 作者为什么会想到共享权值: RPN其实上也是卷积的一个过程即FCN(Fully Convolution Network)

你可能感兴趣的:(检测之旧文新读(四)-Faster R-CNN)