论文阅读+Faster RCNN

《Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks》-201X

一、解决什么问题

      1. 能不能快速的生成候选区域,不使用ss算法得到object proposal?(为啥还要用SS!!!)

      2. 能不能减少参数的数量,或者说能不能共用一些参数?

二、解决方案

整个网络可以看作由以下三部分构成:
1. 基础卷积网络;
2. 区域生成网络(RPN);

3. 全连接分类和回归精修网络;

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


        假设输入RPN网络的feature map大小为 64\times64 ,那么我们 提取的ROI的尺寸一定小于 64\times64,因为原始图像某一块的物体在feature map上也以同样的比例存在。我们只需要把这些Region从feature map上抠出来,由于每个Region的尺寸可能不一样,因为原始图像上物体大小不一样,所以 我们需要将这些抠出来的Region想办法resize到相同的尺寸,这一步方法很多(Pooling或者Interpolation,一般采用Pooling,因为反向传播时求导方便)。

       假设这些抠出来的ROI Region被我们resize到了 14\times14 或者 7\times7 ,那我们接下来将这些Region输入普通的分类网络,即第一张Faster R-CNN的结构图中最上面的部分,即可得到整个网络最终的输出classification,这里的class(车、人、狗。。)才真正对应了COCO数据集80类中的具体类别。

         同时,由于我们之前RPN确定的box\region坐标比较粗略,即大概框出了感兴趣的区域,所以这里我们再来一次精确的微调,根据每个box中的具体内容微微调整一下这个box的坐标,即输出第一张图中右上方的Bounding-box regression。






更详细网络结构如下:


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


    Faster RCNN算法由两大模块组成:

1.RPN候选框提取模块。

2.Fast R-CNN检测模块。

其中RPN是全卷积神经网络,用于提取候选框;Fast R-CNN基于RPN提取的proposal检测并识别proposal中的目标。

网络结果如下(以ZF网络为参考模型):


     其中,虚线以上是ZF网络最后一层卷积层前的结构,虚线以下是RPN网络特有的结构。首先是3*3的卷积,然后通过1*1卷积输出分为两路,其中一路输出是目标和非目标的概率,另一路输出box相关的四个参数,包括box的中心坐标x和y,box宽w和长h。

三、创新点

1.使用区域建议网络RPN,快速生成候选区域。

2.通过交替训练,使得RPN和Fast-RCNN网络共享参数。

四、需要展开的部分

4.1.RPN网络

4.1.1网络的结构:

概述:基于卷积神经网络,但是输出部分包含二类softmax和bbox回归的多任务模型。

解决什么问题(或者说在这里发挥的主要功能):提取bbox。(类似ss提取object proposal)

基本思想(具体的流程):我们在卷积神经网络的部分的最后一个卷积阶段生成的特征图上进行操作。使用一个小网络在这个特征图上进行滑动,这个滑动网络每次和特征图上的n×n(论文中n=3)的窗口进行全连接,然后映射到一个低维向量(256d forZF/512d for VGG),最后将这个低维向量送到两个全连接层,即bbox回归层(reg)和box分类层(cls)。reg层:预测proposal的anchor对应的proposal的(x,y,w,h)。cls层:判断该proposal是前景(object)还是背景(non-object)。

4.1.2网络的输入:RPN的输入是一张任意大小的图片。

4.1.3网络的输出:RPN的输出是一批打过分的矩形候选区域。

卷积后的pool层特征既可以用于类别判别,也可以用于回归BoundingBox,可以这样想,object的外围存在着一个看不见的BoundingBox, 只要人为提供了真值,那么网络就可以学会去调整参数来回归它。在实际使用中,pool层后增加了一个调整层(convolution,见 train.prototxt的rpn_conv/3x3层),将共性特征调整到特定领域特征(BoundingBox)。在特征映射的基础上紧接着的两层如下:
与BoundingBox预测相关的层

       第一层预测该像素点属于前景还是背景的概率。该层输出是18,意味着,针对上一层的每一个feature_map(256个或者512个)的每一个像素点,取出其256维的特征,将其映射到一个18(2*9)维的向量,9代表着该位置上的9个anchor,2代表前景or背景。该18维的向量代表的就是针对每一个BoundingBox(或者说是anchor),该像素是它的前景还是背景的概率,毕竟在一个BoundingBox里面是前景,到另一个BoundingBox里面就很可能是背景了。比如猫和桌子重叠了,猫的中心点在猫的小的BBox里面是前景,但是在桌子的大的BBox里面就是背景了。所以这也就是为什么不直接一个像素只维持一个二维向量预测其是前景还是背景的原因所在。而这个地方的前景背景的概率会在计算回归BoundingBox时派上用场,并不是用这个概率去预测属于某一类object的概率(该概率还是按照fast-rcnn中的提取roipooling后的特征去预测的,而这个地方的roi正是从RPN中产生),不要混淆。

第二层中每一个像素点输出的是一个36(4*9)维的特征向量,该特征向量中每四个值对应一个anchor的BoundingBox的参数,统一记作t0(文章中定义了3*3共9个固定大小的BoundingBox, 这个地方的参数是相对预定义BoundingBox而言的,是在多个(9)不同ratio不同size的BoundingBox的基础上再来产生相对的偏移和scale缩放的框。即每个像素点可能会同时属于多个BoundingBox,也有可能被class给多个objects)下面是计算BoundingBox的loss的相关层
这里写图片描述rpn-data层可以看做是将BoundingBox的真值输入后与预定义的9个不同size和ratio(128×128, 256*256, 512*512,2:1, 1:1, 1:2)的框计算相关转换参数作为输出。注意该层不需要往后传误差,只是在做一个参数转换而已。

      RPN内部有两个loss层,一个是BBox的loss,该loss通过减小ground-truth-box与预测的anchor-box之间的差异来进行参数学习,从而使RPN网络中的权重能够学习到预测box的能力。实现细节是每一个位置的anchor-box与ground-truth里面的box进行比较,选择IOU最大的一个作为该anchor-box的真值,若没有,则将之class设为背景(概率值0,否则1),这样背景的anchor-box的损失函数中每个box乘以其class的概率后就不会对bbox的损失函数造成影响。另一个loss是class-loss,该处的loss是指代的前景背景并不是实际的框中物体类别,它的存在可以使得在最后生成roi时能快速过滤掉预测值是背景的box。也可实现bbox的预测函数不受影响,使得anchor-box能(专注于)正确的学习前景框的预测,正如前所述。所以,综合来讲,整个RPN的作用就是替代了以前的selective-search方法,因为网络内的运算都是可GPU加速的,所以一下子提升了ROI生成的速度。可以将RPN理解为一个预测前景背景,并将前景框定的一个网络,并进行单独的训练,实际上论文里面就有一个分阶段训练的训练策略,实际上就是这个原因。

5) 最后经过非极大值抑制,RPN层产生的输出是一系列的ROI-data,它通过ROI的相对映射关系,将conv5-3中的特征已经存入ROI-data中,以供后面的分类网使用。

另外两个loss层的说明:
也许你注意到了,最后还有两个loss层,这里的class-loss指代的不再是前景背景loss,而是真正的类别loss了,这个应该就很好理解了。而bbox-loss则是因为rpn提取的只是前景背景的预测,往往很粗糙,这里其实是通过ROI-pooling后加上两层全连接实现更精细的box修正(这里其实是我猜的)。
ROI-Pooing的作用是为了将不同大小的Roi映射(重采样)成统一的大小输入到全连接层去。


4.2 anchor机制(锚的机制)

4.2.1 什么是anchor?

          anchor是一组窗口。其中有一个基准窗口,这个窗口的大小是固定的。然后按照一定的倍数和长宽的比例将这个窗口进行放大和变形,得到了一组窗口。(所以这个基准窗口是不会算到anchor中,对吗?)

       所以anchor=对基础窗口按一定规则进行处理生成的窗口们。

例子:Fast RCNN中的基准窗口大小为16×16.

规则是:(1)倍数是三种分别是8、16、32,记做(8,16,32)。

                 (2)比例是三种,分别是0.5、1、2,记做(0.5,1,2)。


     因此,在对60*40的map进行滑窗时,以中心像素为基点构造9种anchor映射到原来的1000*600图像中,映射比例为16倍。那么总共可以得到60*40*9大约2万个anchor。

4.2.2anchor的作用是什么?



4.2.3achor的使用流程是什么?

我们根据下图梳理一下:

       


       利用anchor是从图中第二列这个位置开始进行处理,这个时候,原始图片已经经过一系列卷积层和池化层以及relu,得到了这里的 feature:51x39x256(256是层数)

       在这个特征参数的基础上,通过一个3x3的滑动窗口,在这个51x39的区域上进行滑动,stride=1,padding=2,这样一来,滑动得到的就是51x39个3x3的窗口。

      对于每个3x3的窗口,作者计算这个滑动窗口的中心点在原始图片中对应的中心点。然后作者假定,这个3x3窗口,是从原始图片上通过SPP池化得到的,而这个池化的区域的面积以及比例,就是一个个的anchor。换句话说,对于每个3x3窗口,作者假定它来自9种不同原始区域的池化,这些区域在原始图片中的中心点都完全一样。这个中心点,就是刚才提到的,3x3窗口中心点根据映射规则在原始图片中映射到的中心点。如此一来,在每个窗口位置,我们都可以根据9个不同长宽比例、不同面积的anchor,逆向推导出它所对应的原始图片中的一个区域,这个区域的尺寸以及坐标,都是已知的。而这个区域,就是我们想要的 proposal。所以我们通过滑动窗口和anchor,成功得到了 51x39x9 个原始图片的proposal。接下来,每个proposal我们只输出6个参数:每个 proposal 和 ground truth 进行比较得到的前景概率和背景概率(2个参数)(对应图上的 cls_score);由于每个 proposal 和 ground truth 位置及尺寸上的差异,从 proposal 通过平移放缩得到 ground truth 需要的4个平移放缩参数(对应图上的 bbox_pred)。

所以根据我们刚才的计算,我们一共得到了多少个anchor box呢?51 x 39 x 9 = 17900,约等于 20 k

4.2.4anchor的具体设计是什么?(anchor的细节的东西)



4.2.5使用anchor时存在哪些注意事项?

4.2.6使用anchor带来的局限是什么?

解决什么问题:

4.3Faster RCNN的训练过程


五、方法的优点

1.r使用Selective Search得到egion proposal,CPU耗时为2秒,EdgeBox是一种在准确率和效率之间做tradeoff的方式,耗时0.2秒,依然用了很长时间。「Region Proposal Network」计算region proposals,在测试阶段,耗时只有10ms

六、方法的问题

七、其他的技术细节

7.1 Faster RCNN使用哪几个尺度的图像?

在整个faster RCNN算法中,有三种尺度。
原图尺度:原始输入的大小。不受任何限制,不影响性能。
归一化尺度:输入特征提取网络的大小,在测试时设置,源码中opts.test_scale=600。anchor在这个尺度上设定。这个参数和anchor的相对大小决定了想要检测的目标范围。

网络输入尺度:输入特征检测网络的大小,在训练时设置,源码中为224*224。

7.2如何保证一个M×N的矩阵经过卷积网络之后变成(M/16)×(N/16)?



参考文献:http://www.360doc.com/content/17/0809/10/10408243_677742029.shtml

7.3在RPN网络中如何判断anchor中的对象是前景还是背景?

是通过softmax函数来判断的,主要的流程是:



7.4怎么使用RPN进行bbox回归?



7.5Propsal层是怎样得到精确的proposal的?




7.6ROI池化层在Faster RCNN中的作用是什么?





7.7Faster RcNN是如何实现分类的?




参考文献:http://www.360doc.com/content/17/0809/10/10408243_677742029.shtml

7.8多次对bbox的位置进行线性回归(2次),每次的方法是一样的吗?

7.9Region Proposal有什么作用?

1、COCO数据集上总共只有80类物体,如果不进行Region Proposal,即网络最后的classification是对所有anchor框定的Region进行识别分类,会严重拖累网络的分类性能,难以收敛。原因在于,存在过多的不包含任何有用的类别(80类之外的,例如各种各样的天空、草地、水泥墙、玻璃反射等等)的Region输入分类网络,而这些无用的Region占了所有Region的很大比例。换句话说,这些Region数量庞大,却并不能为softmax分类器带来有用的性能提升(因为无论怎么预测,其类别都是背景,对于主体的80类没有贡献)。

2、大量无用的Region都需要单独进入分类网络,而分类网络由几层卷积层和最后一层全连接层组成,参数众多,十分耗费计算时间,Faster R-CNN本来就不能做到实时,这下更慢了。



作者:YJHMITWEB
链接:https://www.zhihu.com/question/42205480/answer/294417402
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值