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

Fast R-CNN是一种改进的目标检测算法,它通过引入RoI池化层和多任务损失函数等创新,有效解决了R-CNN速度慢的问题。该文详细介绍了Fast R-CNN的结构、训练、测试流程,并探讨了其存在的不足。
博主课题需要研究Faster RCNN,先后看了RCNN、Fast RCNN和Faster RCNN三篇paper,然而有点懵逼= =所以准备再捋一遍总结一下~



二、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.什么结构

网络输入是一张整图和其对应的region proposals(也是用selective search生成好的)
用一个Deep CNN网络处理整张图,输出一个conv feature map
对每个region proposal,用一个region of interest层从conv feature map中提取一个固定大小的feature map
这个feature map经过两个FC层映射为一个特征向量
然后这个定长的特征向量被同时送入两个并列的FC层:一个FC层输出K个物体类和1个背景类的softmax probability,另一个FC输出K个物体类的refined了的bounding box坐标。
  • 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的乘积,给出映射公式如下:
(x,y) = (S*xx,S*yy)
反过来由原图求conv feature map坐标:xx = x/S+1,yy = y/S+1


         第二个问题:假设输入的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呢?【直接粘贴原文公式了,挺好懂不多说】:
      
其中p表示一个region proposal在softmax输出的离散概率分布;u是这个region proposal的class标签;t是region proposal经过网络refined的bounding box;v是这热region Proposal的ground truth bounding box。回归时的loss是;


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的反向传播怎么整?公式在此:

         小解释一下: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--
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值