Faster-RCNN笔记



查看原文:http://www.wyblog.cn/2017/02/24/faster-rcnn%e7%ac%94%e8%ae%b0/

前言

本文是对Faster-RCNN进行原理性总结,对于具体细节,并未挖掘地很深入,还需要细读代码,如有纰漏,还请指正。

R-CNN,Fast-RCNN,Faster-RCNN

对于以上三者区别,用一张图能清楚地说明: 简单的来说,
  • RCNN解决的问题是:用SS算法进行region proposal,然后把每个proposal都输入进CNN里进行detection。
  • Fast-RCNN解决的问题是:用SS算法进行region proposal后,为什么不直接从feature map里找到原图卷积后映射的部分呢,这样才算fast。
  • Faster-RCNN解决的问题是:SS算法region proposal太慢了,为什么不实现一个end to end的单独网络进行region proposal。
本文重点总结Faster-RCNN框架,其框架图为: 可以看到,整个网络为一个Fast-RCNN加一个RPN。RPN从feature map里提取特征,进行region proposal,代替了SS算法,然后Fast-RCNN网络利用RPN输出的bounding box进行classify,下面,这里就分别从这几个方面一一进行总结分析。

RPN网络

为了解决“为什么还要用Selective Search”这个问题,RBG一帮人等提出了同样使用CNN的方式,通过训练一个net来进行region proposal。这种想法有两个好处,其一,既然都是net,能不能把两种net给融合到一起,实现end to end的方式进行学习,其二,不再使用传统的Selective Search算法进行region proposal,那么就能大大地提高检测速度,实现真正的real-time dection。 首先看看RPN的框架图: 以上可以看到,RPN网络的输入,就是共享网络最后卷积层的输出conv feature map,这一层的输出大小跟我们自己选择模型有关,例如文献中试验的VGG16以及ZF网络,VGG16共含有13层共享卷积网络,ZF共含有5层共享卷积网络,这里使用ZF网络作为示例。 回到RPN框架图,它包括了一个卷积层(intermediate layer)以及两个全连接层(cls layer以及reg layer),这里cls层是用来输出region是前景/背景的概率,而reg layer输出与bounding box有关的四个坐标值。这里,文献里引入了anchor的概念,通过anchor,就能从conv feature map映射回原图。 RPN网络具体流程是,在卷积层,卷积核的大小为3 * 3 * 256,但是由于intermediate layer固定了需要256维大小,所以对于每个固定点位的sliding window,有256种卷积核,所以实际上是用3 * 3 * 256 * 256的卷积核进行stride为1的卷积行为(对于VGG16模型,则卷积核大小为3 * 3 * 512 * 256)。而anchor指的就是sliding window中心那个点,文献里将这个anchor映射回原图,并取了以其为中心, aspect ratio分别为{1:1,1:2,2:1}以及scale分别为{128,256,512}这3 * 3=9种情况的bounding box。 重新整理一下,现在情况是将sliding window固定在一个位置上,则我们在intermediate layer得到了1 * 1 * 256的特征图,并且通过anchor机制,在原图上我们得到了9个形状大小不一的bounding box。对于cls layer,它的目的是给出两个概率值,所以最终对于每个 sliding window它的输出应该是2 * 9=18个值;而对于reg layer,它是为了给出对标准框进行回归的结果,有4个值,所以对于每个sliding window它的输出应该是4 * 9=36个值。那么从intermediate layer到cls layer,我们就需要一个1 * 1 * 256 * 18的卷积核进行卷积,对于intermediate layer到reg layer,就需要一个1 * 1 * 256 * 36的卷积核,而RPN的学习任务,自然就是去根据损失函数去学习这些卷积核的值了。 以上就是一个大致流程,在实际学习过程中,因为对于一张图片来说,负例框远远多于正例框,如果直接学习的话,那学习出的模型是有问题的,所以,文献里对各种anchor进行了采样,使得正负样本个数达到一致。首先去除anchor中与图片边界有交集的那些,然后采用非极大值抑制法去掉那些anchor中重合度比较高的,对于剩下的anchors,规定IoU>0.7的标记为正例,IoU<0.3的为负例,对于每个学习batch,采样256个随机的框(保证正负1:1)进行学习。

Bounding Box Regression

在RPN网络中,存在reg layer,这个层就是用来学习边框回归的。先想想为什么需要边框回归?因为在RPN网络中,我们给定的是固定大小形状的box,但是对于ground truth来说,肯定不可能恰好是这个形状,所以需要回归网络去学习如何将proposal出的box,尽可能地接近ground truth。如下图, P为proposal的框,G为ground truth,学习的目标就是从P->G',使得G'更加接近G。这里对框进行微调的参数就有4个,2个平移参数tx、ty,两个缩放参数tw、th,其表达式为: 根据这些表达式要注意到,微调的参数值并不是实际上应该平移或者缩放的数值,而是一个占原框大小的一个比率值,并且对于缩放的系数,是取了对数函数,使得放大为正,缩小为负。 那么对于这个微调系统,输入与输出是什么呢?其实在上文中已经提到过了。对于输入,自然是intermediate layer的特征向量,输出就是以上四个微调参数值了。对于线性回归,其方程可以表示为Y=ωX,所以,这里的损失函数可定义为: 可以看到,损失函数是常规的所有样本点上四个参数的二次损失之和,为了避免过拟合,可以加入正则化项,最终目标即: 这样,在训练阶段,可以通过随机梯度下降法,就能找到最优参数ω,进而在预测阶段,根据提取的intermediate layer向量,就知道该如何平移缩放得到最优bounding box了,这就是边框回归过程。

ROI pooling

经过RPN网络,我们就能得到很多ROI区域(region of interest),这些区域能够进入Fast-RCNN网络进行classify了。但是这里存在一个问题,proposal出的region形状大小不一,难道我们需要把它缩放到统一的尺寸再进行判别吗?这样经过缩放后的图片可能因为目标太小,被缩放后细节丢失地更严重了。所以,这里提出了一个ROI pooling layer,它可以在任意大小图片的feature map上,针对每一个ROI区域提出固定维度的特征表示,然后就能送进分类器进行分类识别了。具体过程可以看看未加入RPN的Fast-RCNN的流程图: 因为输入的ROI不是固定大小的,对于pooling网格大小,则需要根据输入图片的大小进行计算。假设pooling输出的尺寸大小为p_h,p_w,某个ROI区域的坐标为(x1,y1,x2,y2),那么pooling的网格大小尺寸应该为: 经过pooling后,能够使用一个全连接层,使得生成一个特征向量,然后就能够送进softmax分类器里了。

Softmax classify

softmax分类器是logistic回归模型在多分类问题上边的推广,以下这篇博文讲的很清晰:
http://ufldl.stanford.edu/wiki/index.php/Softmax%E5%9B%9E%E5%BD%92

Faster-RCNN训练步骤

用一张图清晰地表示了训练过程: 从上可以看到,整个学习过程实际上是由两个独立的网络交替进行学习的过程。
  • 第一步,先用ImageNet预训练模型初始化,并用它的参数去训练RPN的参数。
  • 第二步,利用第一步生成的region proposal,再用新的ImageNet预训练模型进行Fast R-CNN的训练,使得ImageNet的 模型被fine-tuning。注意到这一步,因为使用的是新的ImageNet模型,所以跟上一步的模型没有任何关系,所以这两个网络目前还没有共享的卷积层。
  • 第三步,利用已训练好的Fast-RCNN模型,固定共享卷积层的学习率,使得其中参数不变,然后再去fine-tuning第一步训练好的RPN模型参数,经过这一步,实际上已经实现了两个网络的融合,并且实现了共享卷积层。
  • 最后一步,便是fine-tuning Faster-RCNN中RPN网络region proposal出来之后的那些层了。

参考资料

http://arxiv.org/abs/1506.01497 https://zhuanlan.zhihu.com/p/24916624?refer=xiaoleimlnote http://blog.csdn.net/qq_17448289/article/details/52871461 http://blog.csdn.net/u011534057/article/details/51247371


查看原文:http://www.wyblog.cn/2017/02/24/faster-rcnn%e7%ac%94%e8%ae%b0/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值