fasterrcnn论文_Faster RCNN之RPN理解

78c955f1d23caa49957992ca93aa78c6.png

今天想从头到尾理解一下Faster RCNN,和朋友argue了好久,有结合下面大神这篇文章,心里来有了点轮廓,然后想在这里记录一下心得,以供分享和以后自己复习。

白裳:一文读懂Faster RCNN​zhuanlan.zhihu.com
e6d4db166224bda5bc74f1441ee9470c.png

一些basic的点,大佬已经讲的很明白了,这里仅仅记录一下个人有困惑的地方,若你在阅读上面这篇文章的时候有困惑, 则可以来看一下我的心得

05c37ce135637b733a0e4893df6ecb4a.png
图1

图1很清晰的显示了一个Faster RCNN的结构。其实分为两部分:RPN(region proposal network和Fast RCNN)

e817481ac2245b3aba6cb5886204f533.png
图2

图二右边的分支就是一个没有使用region proposal algorithm的Fast RCNN。可以看出来,RPN其实是建立在feature maps上面的。

1.这里引用一个关于Faster RCNN的简短介绍

第一步是在一个滑动窗口上生成不同大小和长宽比例的anchor box,取定IoU的阈值来标定这些anchor box的正负。于是,传入RPN网络的样本数据被整理为anchor box(坐标)和每个anchor box是否有物体(二分类标签)。RPN网络将每个样本映射为一个概率值和四个坐标值,概率值反应这个anchor box有物体的概率,四个坐标值用于回归定义物体的位置。最后将二分类和坐标回归的损失统一起来,作为RPN网络的目标训练。
由RPN得到Region Proposal在根据概率值筛选后经过类似的标记过程,被传入R-CNN子网络,进行多分类和坐标回归,同样用多任务损失将二者的损失联合。

anchor box在后文讲述

IoU的描述为:

3f6a3023269a9db91dfb03f75a400de9.png
IoU

IoU的阈值选取是有讲究的,会影响实验结果。

这里要谈两个threshold,一个用来识别正样本(如跟ground truth的IoU大于0.5),另一个用来标记负样本(即背景类,如IoU小于0.1),而介于两者之间的则为难例(Hard Negatives),若标为正类,则包含了过多的背景信息,反之又包含了要检测物体的特征,因而这些Proposal便被忽略掉。

2.RPN详细解析

我们直接来看上面这篇文章中提及的例子:

fdf87d464e7a1ef795524fca66437f6b.png
图3 RPN结构

Faster RCNN使用了RPN来proposal RoI(Region of Interest),而不需要像Fast RCNN一样去使用传统的region proposal algorithm(耗时极长),这就是Faster RCNN的精髓

我们来一步一步解析这个网络:

首先来看上面这条线:

  • 使用3*3的filterfeature map进行卷积,目的是使提取出来的feature更鲁棒。注意:CNN提取出来的feature map在这里是对每一张image的每一个像素点来说都是256-dimension的,因为CNN最后一层使用了256个filter。
  • 使用1*1的filter进行卷积,一共为18个,生成的新的图片是18-D的,为什么为18会在下面讲述

55a429181391dca815d0ee767ea66921.png
图4
  • 然后进行reshape,拿一张图片举个例子,图片的shape是(W,H,D=18),然后我们会把他reshape以进行softmax(进行softmax的matrix的一边需要等于num of class,在这里是一个二分类,即是否含有物体,所以是2)。所以我们会把(W,H,D)reshape成(2,9*W*H)。这里很重要!!!!
  • 然后我们进行softmax,得出对这9*W*H每一个的两个score,一个是有物体,一个是没有物体
  • 然后我们现在来解释一下为什么会用18个1*1的filter:

这里我们就要引入anchors这个概念了

这里直接套用大佬的介绍:

提到RPN网络,就不能不说anchors。所谓anchors,实际上就是一组由rpn/generate_anchors.py生成的矩形。直接运行作者demo中的generate_anchors.py可以得到以下输出:
[[ -84. -40. 99. 55.]
[-176. -88. 191. 103.]
[-360. -184. 375. 199.]
[ -56. -56. 71. 71.]
[-120. -120. 135. 135.]
[-248. -248. 263. 263.]
[ -36. -80. 51. 95.]
[ -80. -168. 95. 183.]
[-168. -344. 183. 359.]]
其中每行的4个值
表矩形左上和右下角点坐标。9个矩形共有3种形状,长宽比为大约为
三种,如图6。实际上通过anchors就引入了检测中常用到的多尺度方法。

a136f030624f0d4ce1f021b550bd2ad0.png
图5 anchors的9个矩形

可以看到“9”终于出现了!

那么这9个anchors是做什么的呢?借用Faster RCNN论文中的原图,遍历Conv layers计算获得的feature maps,为每一个点都配备这9种anchors作为初始的检测框。这样做获得检测框很不准确,不用担心,后面还有2次bounding box regression可以修正检测框位置。

然后之前的18的原因就是为每一个anchors box都arrange两个scores。

我的理解是这样子,先生成所有的anchor box 对每一个像素点,都要生成9个box,一共有9*W*H.然后在进行18个filter的1*1卷积,reshape成(2,9*W*H),如此便一目了然。

55a429181391dca815d0ee767ea66921.png
图4

这里再次看图4,k为为每一个像素点生成的anchor box的数目,默认为9,然后对于每一个像素点来说,都有2k个score被生成出来,同时每个anchor都有(x, y, w, h)对应4个偏移量,所以会有4k个coordinate生成出来(详见引用文章的2.4 bounding box regression原理)。

对于RPN的backprop,详细见参考文章的5.1。

3. 另一个我当时困惑的问题,是怎么来train一个完整的Faster RCNN

1b11c081da4afe2ad7f580b9ab1f914e.png
图6 train

这张图完美的解释了这点

4.贴一张RoI pooling的图

605eea99cdf217b6ff867ff3577cff65.gif

在proposal之后,需要进行RoI pooling,让所有proposal出来的RoI变成相同大小的vector,传入下面的网络。

这些就是我的心得,若有其他关于Faster RCNN的问题,也可以直接在评论区讨论。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值