【转】Faster RCNN

原地址:https://blog.csdn.net/u011718701/article/details/53758927

博主课题需要研究Faster RCNN,先后看了RCNN、Fast RCNN和Faster RCNN三篇paper,然而有点懵逼= =所以准备再捋一遍总结一下~

关于Faster R-CNN的一切——笔记1:R-CNN

关于Faster R-CNN的一切——笔记2:Fast R-CNN

三、Faster R-CNN【Faster R-CNN--Towards Real-Time Object Detection with Region Proposal Networks.2015NIPS

理解了R-CNN和Fast R-CNN之后,我们终于可以昂首阔步进入Faster R-CNN的解读啦~\(≧▽≦)/~啦啦啦

SPPnet和Fast R-CNN都加速了R-CNN的检测过程,然而瓶颈问题:region proposal computation却没有考虑。因此,Faster R-CNN的核心改进就是设计了一个Region Proposal Network(RPN),在每个图像位置输出一个预测的object bounding box和objectness score,这个网络与原来的Fast R-CNN共享conv feature map,所以几乎不增加计算量。

1.什么结构

网络输入是一张image 

经过RPN生成一系列rectangular object proposals

image和它的object proposals一起送入Fast R-CNN网络,输出最终的检测结果

显然,最重要的就是这个Region Proposal Network(RPN)怎么设计,下面分析。

  • RPN的整体结构

(1)首先生成conv feature map 

        

         明确一点,RPN与原来的Fast R-CNN网络共享从image生成conv feature map的过程。

         例如对于VGG16,结构如下:

【image→conv3-64conv3-64→pool2→conv3-128conv3-128→pool2→conv3-256conv3-256conv3-256→pool2→

conv3-512conv3-512conv3-512→pool2→conv3-512conv3-512conv3-512→pool2→FC4096→FC4096→FC1000】

         那么从image到最后一个conv3-512层这13个卷积层和4个pooling层是RPN和Fast R-CNN共享的,对于VGG16,最后一个conv3-512层输出的是512通道的W*H大小的(W和H=原图像宽高/16,因为有4个pooling层,每次大小减半)conv feature map,接下来的RPN操作就是基于这个conv feature map

(2)在conv feature map的每个sliding window位置上生成特征向量

         用一个n*n(本文是3*3)大小的滑动窗口(可以理解为卷积核)以1为步长在conv feature map上滑动。在每个sliding位置上,卷积核与它覆盖的conv featue map对应元素相乘并相加输出对应值,也就是卷积了。注意:conv feature map是3维的,对于VGG16而言是第三维是512通道,则每个通道独立的与卷积核作用,所以最后卷积核在每个滑动窗口位置都会生成一个1*512维的向量。然后,这个1*512维的向量被送入两个并列的FC层,一个分类的FC层输出分类结果,一个回归的FC层输出box regressor也就是物体位置坐标。

         上面所说的sliding window模式,在所有的空间位置上的FC层的参数是共享的,所以这样的结构很自然的可以被应用为一个n*n的卷积层和两个并列的1*1的卷积层【1*1的卷积层其实就是每个卷积核通道数与输入通道数相同,卷积核的个数就是你想要的输出维数。例如对于VGG16,每个卷积核是512通道。】。但是注意这样的n*n“卷积层”和我们平常理解的不太一样,我来解释一下:

         我们平时理解的卷积层操作如下图所示。例如这是一个有2个filter的卷积层(因此输出是2通道的),每个filter是3通道的(与输入通道数相同)。输出volume中第1个通道里第一个位置的结果10是由filter w0的三个通道分别与输入volume的第一个receptive field的三个通道分别相乘然后相加的结果:10=1+4+4+1bias。

         但是本文里面想表达的其实是如下图的意思:

         

         所以如果要是想和普通的卷积层一样的话,应该如下图这么设置,简单地说第i个filter只有第i个通道是n*n个系数,其他通道都全为0,每个filter的n*n个系数文章中没有说一样不一样诶,可能需要实际跑一边代码看看了~。这样就可以应用普通的卷积层来完成RPN想要的sliding window模式。

(3)每个sliding window位置的特征向量送入两个并列的FC层做预测

         有了特征向量,显然可以分类了,那么分几类?文章说我们要在这个sliding window位置根据它的特征向量同时预测出k个region proposals,那么回归的FC层输出就是4k维的了,因为每个proposal有4个坐标嘛~分类的FC层输出2k个分数来估计每个proposal是物体的概率和不是物体的概率。但是这k个proposal不是凭空整出来的,而是要相对一个参照,叫做archors,这也是RPN网络很核心的一个概念,下面详细说明:

  • 平移不变的Anchors

         在每个sliding window·的中心,定义3种尺度和3种aspect ratio共9种anchors。对于一个大小是W*H的conv feature map,一共有W*H*9个anchors。注意,anchors是圈出原image中的某块区域,所以按照Fast R-CNN RoI pooling层要完成的第一个任务【即把region proposal投影到conv feature map上,参考博主的Fast R-CNN笔记啦啦啦~】,我们需要把sliding window【这是在conv feature map上的啊注意了】的中心坐标投影到原image上,然后就能找到原image上这些anchors应该对应的区域。这一点文章中并没有明确说出,但是可以推断出来。因为首先文章中使用的anchors最小也是128*128像素的,而feature map大小在40*60,所以anchors不可能是在feature map上;然后,从archors的意义上我们来想,它是你的网络将要预测的region proposal的参照物对吧,region proposal是在原image上的对吧,所以anchors必然是在原image上的。但是sliding window是在conv feature map上的,所以我们一定会需要conv feature map往原image位置的映射,这就和Fast R-CNN要把原image上的region proposal投影到conv feature map是一个道理,只不过过程反过来了,我说清楚了吧~#这是吐槽。。。我看paper的时候就这一点十分不解,还是看了SPPnet的文章才明白这个投影是什么鬼的,强烈谴责Faster R-CNN的作者╭(╯^╰)╮#

附上原paper的图总结一下RPN网络的结构:

(4)根据分类的score对region proposals进行非极大值抑制

先去掉所有IoU小于0.7的那些proposal,然后剩下的运行NMS(和以前一样了啦不再详细说)。然后用前N个region proposal送入Fast R-CNN进行物体检测。

2.怎么训练

显然,我们需要训练RPN和Fast R-CNN两个网络。首先以预训练的VGG16为例比较两个网络的结构:

所以为了共享conv feature map,两个网络的交替训练流程应该是:

用预训练模型初始化网络参数,然后fine-tune训练RPN

用同一个预训练模型初始化网络参数,然后fine-tune训练Fast R-CNN,使用RPN网络输出的region proposals

用Fast R-CNN初始化RPN(肯定是共有部分啦),固定共有的conv层(参数不再变化),只fine-tuned RPN独有的层

固定共有的conv层,fine-tune Fast R-CNN的FC层

Fast R-CNN不说了,就是和原Fast R-CNN的训练一毛一样只不过产生region proposals的方法由selective search变成RPN网络啦~

  • 预训练

        

         用ImageNet网络来初始化RPN和Fast R-CNN啦~比较了ZFnet和VGG16net两个。

  • RPN网络的fine-tune

         #刚刚经历了电梯惊魂的博主回来继续写了......生命苦短,要好好珍惜,好好学习T T#

         (1)首先是loss function怎么定义

         先明确一下有两个任务:一是分类任务,即判断这个anchor是不是物体;二是回归任务,即给出bounding box的预测坐标。所以说这种multi task的东东,肯定有两个loss项啦:

        

         i是一个mini-batch(在本文就是一张image和它里面的所有anchor)里的anchor的index;pi是算法输出的anchor i是物体的概率;pi*是anchor i的ground-thuth label;ti是一个四元素的向量,是算法预测的bounding box的参数化坐标;ti*是与一个正anchor相关的ground-truth box。

  

         分类loss是两类上的log loss(是物体和不是物体),回归loss和Fast R-CNN中的定义一样。

         关于ti和ti*,都是参数化的坐标,也就是都相对于anchor而定义,如下图,所以你可以理解为:在原image上有很多ground-truth box,现在人为的规定了很多anchor box,你的算法要做的事情其实就是把anchor box回归到离它最近的ground-truth box那里去~

     

         (2)anchor的标签怎么定义

         有两种情况anchor的标签是正:一种是与某个ground-truth box有最大的IoU的那些;另一种是与任何ground-truth的IoU都大于0.7的那些。

         有一种情况anchor的标签是负:与所有的gound-truth box的IoU都小于0.3。

         (3)其他训练细节

         Mini-batch怎么采样:先随机采样一张图片,然后以1:1的比例从这张图随机采样256个anchors,如果正样本的数目少于128的话,只好用负样本填充mini-batch啦。也就是说1个mini-batch就是1张image和它的256个正负anchors。

         新的卷积层用均值为0,标准差为0.01的高斯分布初始化,共享的那些层就用预训练的模型初始化啦。

         前60k个mini-batch用学习率0.001,后20k个mini-batch用学习率0.0001。momentum是0.9,weight decay是0.0005.在PASCAL数据集喔~

   

3.怎么测试

测试就简单啦~对于一张测试image,先运行RPN生成2000个region proposal,然后把这些region proposal投影到conv feature map上进行后续的Fast R-CNN网络的操作就行啦。由于共享了conv feature map,一张图只用计算一次,大的缩短时间。

来一个三个网络的运行时间对比:

        R-CNN : 47s/img

        Fast R-CNN:3s/img

        Faster R-CNN:0.2s/img

--The End of Faster R-CNN--

猜你喜欢

转载自blog.csdn.net/Zlase/article/details/81119662
今日推荐