您的位置:首页 > 其它

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

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

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

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

二、Fast R-CNN【Fast R-CNN.2015 ICCV】

首先RCNN为什么慢呢?因为它对每个region proposal都用CNN提特征,没有共享计算过程。所以SPPnets(Spatial Pyramid Pooling)想到要通过共享计算来加速R-CNN,它是对整幅图像计算一个convolutional feature map,然后从这个feature map中提取每个region proposal对应的特征向量(所以一张图只需要用CNN计算一次呀,可不就加速了么~),问题的关键怎么从这个feature
map里提取一个原图上某个位置的region proposal对应的特征向量呢?:把feature map中在这个region内的部分max-pooling成固定大小的输出,例如6*6,多选择几个输出的大小,比如6*6、8*8、10*10,然后把这些输出级联。

然而SPPnet也存在着训练多阶段的问题,所以研究Fast RCNN。

1.什么结构

[align=center]网络输入是一张整图和其对应的region proposals(也是用selective search生成好的)[/align]
[align=center]↓[/align]
[align=center]用一个Deep CNN网络处理整张图,输出一个conv feature map[/align]
[align=center]↓[/align]
[align=center]对每个region proposal,用一个region of interest层从conv feature map中提取一个固定大小的feature map[/align]
[align=center]↓[/align]
[align=center]这个feature map经过两个FC层映射为一个特征向量[/align]
[align=center]↓[/align]
[align=center]然后这个定长的特征向量被同时送入两个并列的FC层:一个FC层输出K个物体类和1个背景类的softmax probability,另一个FC输出K个物体类的refined了的bounding box坐标。[/align]
Region of interest层(RoI pooling layer)
         RoI层要做两件事:一是原image中的region proposal怎么在conv feature map上找到它的对应位置呢?二是要把这个region proposal对应的conv feature map中的特征用max-pooling转换成一个固定大小H×W的feature map。
        
         第一个问题:首先要明确,conv feature map的大小和原image是不一样的(比如VGG16,conv feature map可是14*14*512,原图227*227*3),所以肯定得有一个projection。由于原图生成conv feature map的过程是一系列卷积、下采样的操作,其中卷积主要是步长控制了输出大小。假设(x,y)是原图坐标,(xx,yy)是conv feature map坐标,S是CNN卷积操作中所有stride的乘积,给出映射公式如下:
[align=center](x,y) = (S*xx,S*yy)[/align]
[align=center]反过来由原图求conv feature map坐标:xx = x/S+1,yy = y/S+1[/align]

         第二个问题:假设输入的feature RoI【也就是一个region proposal在conv feature map上对应的region】大小是h w,希望生成固定大小的H*W的feature map。那么将feature RoI分成大小为(h/H)*(w/W)的一共H*W个子窗口,每个子窗口进行传统的max-pooling操作得到一个值【每个通道单独操作哒,所以输出通道数不变,和传统max-pooling一样一样的~】,所以就有H*W个输出啦~
Multi-task Loss
         注意到最后有两个并列的FC层,一个完成分类任务,输出K个物体类和1个背景类的softmax probability:p = (p0,p1,...,pK);一个完成回归任务,输出K个物体类的refined了的bounding box坐标:比如第k类输出tk = (tkx,tky,tkw,tkh)。所以如何定义网络的loss
function呢?【直接粘贴原文公式了,挺好懂不多说】:
[align=center][/align]


 
    
其中p表示一个region proposal在softmax输出的离散概率分布;u是这个region proposal的class标签;t是region proposal经过网络refined的bounding box;v是这热region Proposal的ground truth bounding box。回归时的loss是;

[align=center][/align]



2.怎么训练

预训练
        
         本文用了三种预训练的ImageNet网络来初始化Fast R-CNN,每个都是有5个pooling层和5到13个卷积层。需要做的网络结构变化是:

         (1)最后一个max-pooling层替换成RoI pooling层,H和W要设置成网络第一个FC层要求的输入大小(例如VGG16就是7*7)。
         (2)网络的最后一个FC层和softmax替换成上面所说的两个并列的FC层(FC+softmax和FC+bbox regressor)。
         (3)网络的输入修改成一系列image以及对应的一系列region proposals。

Fine-tuning
         随机梯度下降的mini-batch是层次化采样的:首先随机采样N=2张images,然后从每张图采样128/2=64个region proposals,因此就可以使得从同一张图片上采样的region proposals可以在前向和反向传播中共享计算。【你想,R-CNN和SPPnet的region proposal都不是来自同一张图的,那么每个region的conv feature map的计算就不能共享了!】。64个region
proposals中有25%来自与ground-truth的IoU大于等于0.5的样本(R-CNN时正样本啦,label是1-K~),其余的是IoU在[0.1,0.5]之间的样本(label是0)。小于0.1的直觉上作为hard example mining了。

         还有个问题是RoI pooling layer的反向传播怎么整?公式在此:
[align=center][/align]



         小解释一下:xi是第i个输入,yrj是第r个feature RoI的第j个输出。对每个mini-batch里的第r个region proposal,和每个pooling输出单元yrj,当i是为yrj所选的max-pooling的输出时,loss对yrj的偏导数累加,否则不加。而在反向传播时,loss对yrj的偏导数是从上一层传过来的。下面博主在纸上写一下解释下,这里有点绕:


   

         最后是新加的那些层的参数怎么初始化:最后的两个并列的FC层从均值0,标准差分别为0.01和0.001的高斯分布初始化。

   
3.怎么测试

测试就简单啦~对于一张测试image,先运行selective search生成2000个region proposal,然后把image和它的region proposal输入Fast R-CNN网络;对每个测试region proposal,网络的前向传播会输出一个类别后验概率分布p和一系列预测的bounding box相对于该region proposal位置的偏移量坐标;然后根据概率p对每一类的bounding box进行非极大值抑制。

4.存在问题

依赖于region proposal算法,所以后续考虑能不能同时具备region proposal network,这就引出了我们的大主角:Faster R-CNN,见下一篇博文分解~

--The End of Fast R-CNN--
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: