本文主要用于介绍rbg大神于2015年提出的Faster R-CNN网络,该网络架构是在其前作Fast R-CNN上的升级改进版。本笔记主要为方便初学者快速入门,以及自我回顾。
论文链接:https://arxiv.org/pdf/1506.01497.pdf
github主页:https://github.com/rbgirshick/py-faster-rcnn
rbg大神个人主页:http://www.rossgirshick.info/#girshick2014rcnn
为更好的理解该论文,建议先行阅读R-CNN,SPPNet,Fast R-CNN网络的相关论文,这里也附上本菇之前写的4篇论文笔记供大家参考~
R-CNN理解
SPPNet网络理解
Fast R-CNN理解
全卷积网络理解
基本目录如下:
- 摘要
- 核心思想
- 总结
------------------第一菇 - 摘要------------------
1.1 论文摘要
现今流行的目标检测网络都依赖于“区域建议(region proposal)”算法来提前假设潜在的目标区域。像最新的SPPNet网络,Fast R-CNN网络都已经在检测网络上节省了大量的时间,唯一效率上的瓶颈就在于第一步,候选框的提出。因此,在本论文中,我们提出了一种“区域建议网络(Region Proposal Network,RPN)”,该网络与检测网络共享卷积层参数,因此使得新增的该网络层的时间开销几乎为0。RPN的本质就是同时计算每一个位置的目标边界和目标分数的全卷积网络,该网络生成的候选区域框,将会输入到后续的Fast R-CNN架构用于目标检测。本论文还同时,将RPN网络和Fast R-CNN网络合并进一个网络中,因此能够共享卷积层的参数,且用于提取特征的网络层用了最新流行的引入“注意力”机制的网络。对于那种深度模型VGG16,我们新的架构能够达到单GPU,5fps目标检测速度,并且还保证了准确率。在2015年的ILSVRC和COCO的目标检测比赛中,第一名所用模型的架构都有我们的影子。
------------------第二菇 - 核心思想------------------
2.1 Faster R-CNN的网络架构图
Fast R-CNN的提出成功解决了目标检测的时效性问题,并且已经能接近达到实时的效果。但是,Fast R-CNN网络运行的前提就是准备好一堆候选框,之前都是采用的传统图像算法,比如Selective Search。但是随着后半部分问题的解决,前面生成候选框的时效性(主要还是想把整一套流程都放到GPU上来搞)也变的引人注目了。。。于是rbg大神们,也就索性放弃了传统图像算法,提出了一个新的RPN网络来生成候选框,再把RPN网络嵌入到Fast R-CNN中,也就是当红炸子鸡Faster R-CNN了,这里先直接上一张论文中的网络架构图,方便大家对其有一个基本的认知,
可以看到,红色框的那部分(RPN)就是相比于Fast R-CNN新加的部分,因此只要理解了RPN网络,再加上Fast R-CNN的基础,那么对Faster R-CNN的整体把握就比较清晰了~所以,接下来我们就重点看一下RPN网络的细节。
2.2 理解RPN网络
首先明确RPN网络的作用为:输入任意大小的图片,输出一系列的方形目标候选框,每一个目标候选框都带有objectness分数。该网络其实是可以作为一个单独的目标检测网络而存在的!只不过,作者将其嵌入进了Fast R-CNN架构中,并将整个新的架构命名为Faster R-CNN。
(注:这里必须强调一下,objectness想表达的意思是该候选目标框是否含有目标检测物体(并不需要明确是哪一类),因此仅仅是一个二分类问题,含有目标或者是背景)
其次,必须明确Faster R-CNN架构中的RPN网络层为了共享卷积层参数,会直接用前置卷积池化操作产生的特征图(feature map)。有了特征图以后,会在特征图上的指定地方(由Anchors决定,不理解Anchors没关系,后文会解释,在这简单理解为特征图上的一个固定点)滑动一个小的神经网络(我姑且称之为“候选生成网络”,真的很小,就是由1个nn的卷积层再跟2个11卷积层的分支,分别对应分类和回归),这个小神经网络的输入就是一个Anchor生成的候选框,然后输出每个候选框的分数和位置,如果有不清楚整体架构的,直接看论文中原图如下,应该也就能明白整体的架构逻辑了~
(注:比较容易搞混的可能是“滑动一个小的神经网络”~传统操作一般不都是滑动卷积核或池化核,其实操作的本质类似,只不过这里滑动的是一个小的神经网络,从而达到输出多个候选框的目的)
上图应该来说是比较清晰了,接下来我们就再深入一些细节,加深理解。
2.2.1 Anchors的理解
Anchors中文翻译就是“锚点”,每一个锚点,我们都会生成大小各异的多个候选框,这里明确一个参数的意义,,就表示每一个锚点生成的候选框的个数。
因此,上图的意思就是,每一个框都会有2个分数(一个是:为目标的概率;另一个是:为背景的概率),总共有个,那自然输出是。同理,就是每一个框都由4个参数来定位,总共就是个。
论文中,作者采用的参数是9个,运行调用作者demo中的generate_anchors.py,可以得到9个矩形共有3种形状(如下图,来源【1】),长宽比大约控制在,每1个ratio对应3个scale,因此最终是9个,其本质就是引入了检测中常用的多尺度方法。
作者也在文中强调,该种多尺度的实现方法是整套的核心,
The design of multi- scale anchors is a key component for sharing features without extra cost for addressing scales.
那么在论文的参数设置下,最终的候选框个数是多少呢?假设原图是的,VGG下采样16倍,每个锚点9个框,
再从网上盗一张图,加深理解,
这里再贴一张原图上的锚点示意图【3】,助于理解(因为下采样了16倍,所以每个锚点在原图上会有16个像素距离)
这么多的候选框,自然是不可能全都送到后面的网络中去的,训练程序会在合适的anchors中随机选择128个positive anchors + 128个negative anchors进行训练。因为大部分情况下都是背景居多(negative),如果positve少于128的话,那在当前批次里,就选取其他的negative补上。
2.2.2 损失函数
至此,大家对整一套RPN网络应该有比较好的理解了,我们再上一张python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构【1】,
上图的表示相比于原论文,会更加清晰易懂,因此,损失函数也有2部分组成,其中一部分是分类,另一部分是回归。整个网络的损失函数可以表示为(其实与Fast R-CNN真的很像),
其中,
表示在一个批中的anchor的下标
为该锚点是目标的概率
为1如果是positive,为0如果是negetive
就是预测的4个用于定位的坐标点
就是GT,当然也只有是positive才会计入损失
当然,实际的训练中会发现,和值相差过大,通常会引入参数来平衡,是总的Loss能均匀考虑2种Loss。
(注:推荐学有余力的同学看该博文对于回归问题的一个细节描述,看懂了以后,再来理解文中给出的公式就不难了,简单讲一句就是,回归分支真正要学的参数不是具体的坐标值,而是对于每一个Anchor的平移量和变化尺度)
至此,整一套RPN网络就已经讲清楚了,至于RoI在Fast R-CNN中已经讲的很清楚了,这里就不展开了。
2.2.3 训练过程
接下来,还有一个难点,就是如果训练整一套Faster R-CNN网络。文中作者给出了几种可能的训练方法,
1)分开单独训练,即先训练RPN网络,再用RPN生成的候选区域来训练Fast R-CNN,再用Fast R-CNN训练微调完的网络来训练RPN,迭代往复,这也是本文作者在做实验中用的训练方法。
2)放在一起训练。。。说实话,有点懵。。。主要是我也没想明白这个梯度更新的过程。。。
(以下内容来自【4】)
然而,作者在源码中的训练细节一共分了4步,
1)用ImageNet模型初始化,独立训练一个RPN网络
2)仍然用ImageNet模型初始化,但是使用上一步RPN网络产生的proposal作为输入,训练一个Fast-RCNN网络,至此,两个网络每一层的参数完全不共享;
3)使用第二步的Fast-RCNN网络参数初始化一个新的RPN网络,但是把RPN、Fast-RCNN共享的那些卷积层的learning rate设置为0,也就是不更新,仅仅更新RPN特有的那些网络层,重新训练,此时,两个网络已经共享了所有公共的卷积层;
4)仍然固定共享的那些网络层,把Fast-RCNN特有的网络层也加入进来,形成一个unified network,继续训练,fine tune Fast-RCNN特有的网络层,此时,该网络已经实现我们设想的目标,即网络内部预测proposal并实现检测的功能。
以上就是训练的细节步骤。
至此,整一套Faster R-CNN算是讲明白了,其余的实验设置和结果这边就不展开了,有兴趣的同学自己看原文就行~
------------------第三菇 - 总结------------------
3.1 总结
到这里,整篇论文的核心思想已经说清楚了。本论文主要是提出了一种新的RPN网络用于生成候选区域框,并将其嵌入到Fast R-CNN中,将其命名为Faster R-CNN,进一步提高了目标检测算法的时效性,并实验证明其可行性,为后续发展奠定了基础。
简单总结一下本文就是先罗列了一下该论文的摘要,再具体介绍了一下本文作者的思路,也简单表述了一下,自己对Faster R-CNN网络,尤其是其中的RPN网络的理解。希望大家读完本文后能进一步加深对该论文的理解。有说的不对的地方也请大家指出,多多交流,大家一起进步~😁
参考文献:
【1】https://zhuanlan.zhihu.com/p/31426458
【2】https://blog.csdn.net/shenziheng1/article/details/82907663
【3】https://www.jiqizhixin.com/articles/2018-02-23-3
【4】https://zhuanlan.zhihu.com/p/24916624