![78c955f1d23caa49957992ca93aa78c6.png](https://i-blog.csdnimg.cn/blog_migrate/ac2bdd1a5e8703563209efb3767c5b95.jpeg)
今天想从头到尾理解一下Faster RCNN,和朋友argue了好久,有结合下面大神这篇文章,心里来有了点轮廓,然后想在这里记录一下心得,以供分享和以后自己复习。
白裳:一文读懂Faster RCNNzhuanlan.zhihu.com![e6d4db166224bda5bc74f1441ee9470c.png](https://i-blog.csdnimg.cn/blog_migrate/d671e480d28bb773e41a42a6a70e6497.jpeg)
一些basic的点,大佬已经讲的很明白了,这里仅仅记录一下个人有困惑的地方,若你在阅读上面这篇文章的时候有困惑, 则可以来看一下我的心得
![05c37ce135637b733a0e4893df6ecb4a.png](https://i-blog.csdnimg.cn/blog_migrate/45e6b13e619b0ef1da99555c4edf8052.jpeg)
图1很清晰的显示了一个Faster RCNN的结构。其实分为两部分:RPN(region proposal network和Fast RCNN)
![e817481ac2245b3aba6cb5886204f533.png](https://i-blog.csdnimg.cn/blog_migrate/84de914f94d20b9253fb10bc53b143f8.jpeg)
图二右边的分支就是一个没有使用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](https://i-blog.csdnimg.cn/blog_migrate/9a684583c0effde47efa8186b955388b.jpeg)
IoU的阈值选取是有讲究的,会影响实验结果。
这里要谈两个threshold,一个用来识别正样本(如跟ground truth的IoU大于0.5),另一个用来标记负样本(即背景类,如IoU小于0.1),而介于两者之间的则为难例(Hard Negatives),若标为正类,则包含了过多的背景信息,反之又包含了要检测物体的特征,因而这些Proposal便被忽略掉。
2.RPN详细解析
我们直接来看上面这篇文章中提及的例子:
![fdf87d464e7a1ef795524fca66437f6b.png](https://i-blog.csdnimg.cn/blog_migrate/7263608c32921534977516258094ac62.jpeg)
Faster RCNN使用了RPN来proposal RoI(Region of Interest),而不需要像Fast RCNN一样去使用传统的region proposal algorithm(耗时极长),这就是Faster RCNN的精髓
我们来一步一步解析这个网络:
首先来看上面这条线:
- 使用3*3的filter对feature map进行卷积,目的是使提取出来的feature更鲁棒。注意:CNN提取出来的feature map在这里是对每一张image的每一个像素点来说都是256-dimension的,因为CNN最后一层使用了256个filter。
- 使用1*1的filter进行卷积,一共为18个,生成的新的图片是18-D的,为什么为18会在下面讲述
![55a429181391dca815d0ee767ea66921.png](https://i-blog.csdnimg.cn/blog_migrate/e9761ce9daedc7f09530b071a97174e5.jpeg)
- 然后进行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](https://i-blog.csdnimg.cn/blog_migrate/abe67f1c3a5e8e4f165122ad50f8ce8e.jpeg)
可以看到“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](https://i-blog.csdnimg.cn/blog_migrate/e9761ce9daedc7f09530b071a97174e5.jpeg)
这里再次看图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](https://i-blog.csdnimg.cn/blog_migrate/5be4d3def7fdc11be50a421cbd220995.jpeg)
这张图完美的解释了这点
4.贴一张RoI pooling的图
![605eea99cdf217b6ff867ff3577cff65.gif](https://i-blog.csdnimg.cn/blog_migrate/fe85d6fe2a133acb1c69dff00ad9eadc.gif)
在proposal之后,需要进行RoI pooling,让所有proposal出来的RoI变成相同大小的vector,传入下面的网络。
这些就是我的心得,若有其他关于Faster RCNN的问题,也可以直接在评论区讨论。