详情参看原论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks(https://arxiv.org/pdf/1506.01497.pdf)
目标检测的发展从R-CNN到SPP-net、Faster R-CNN,网络的速度已经有了很大的提升,特别是Fast R-CNN,在忽略生成region proposal步骤耗时的情况下,已经可以达到接近实时的检测速度。
这就使得生成region proposal的步骤成为了目标检测进一步发展的瓶颈。
注意到卷积神经网络大量地利用GPU并行计算的优势,提升了网络的整体速度,一个直观的想法就是将region proposal算法重新适配到GPU上用于提速,然而作者团队发现仅仅实现一个GPU版本的region proposal算法而忽视其下游的目标检测网络,会错失共享计算的机会。
作者团队提出了一种利用深度卷积网络计算proposal的方法——RPN,并与后续的目标检测网络共享计算,让计算region proposal的过程几乎不需要额外的开销。并最终将RPN与Fast R-CNN整合成一个端到端的检测网络,称为Faster R-CNN。
熟悉Fast R-CNN的人可以发现,如果把Region Proposal Network遮住,这几乎就是Fast R-CNN。那么很关键的一点就是这个Region Proposal Network到底是个什么东西。
RPN本质体现的还是一个滑窗的思想,利用卷积神经网络对一系列预先设定好的框进行分类和回归,分类用于区分该框是前景目标还是背景,回归用于修正Bbox的坐标,最终生成一系列的proposal。
这之中最难理解的就是anchor了。最直观的理解就是将anchor看做一个超参数,它将特征图上的一个点对应到输入图像的一系列候选框(与anchor相关)上,最终将特征图上的这个点提取出的特征用于判断这一系列候选框中那些可以采纳为proposal,并对其坐标做相应的回归修正。
想要仔细理解细节可以看看下面这两篇博客,从两个不同的角度分析anchor。
深度解析Faster RCNN(2) —anchor
faster rcnn中anchor的生成过程理解
上面的这张图有一点容易让人困惑,图里面有一个3×3的滑窗,这在具体的代码实现中是用一个池化层代替的,也就是图中conv feature map再经过一个3×3的池化层,得到一个更小的特征图,这个更小的特征图上的一点才是我在上面里提到的“特征图上的一个点”。
大概理解了anchor后,我们现在理一理RPN到底做了什么:假定我们预定义了有k个anchor,我们的输入图像经过RPN后得到了一个W × H的特征图(已经过3x3池化),这个特征图上的每一点负责判断k个anchor,最终有W × H × k个anchor需要被判断,对于每个anchor,RPN需要输出6个数,分别代表前景概率、背景概率和修正后的候选框坐标(x, y, w, h)。最终输出为W × H × (2 + 4) × k。
特别的,cls layer和reg layer两个结构可以直接用一个卷积核大小为1 × 1步长也为1的卷积层一起实现。
为了训练RPN,作者团队参考Fast R-CNN提出了针对RPN的多任务损失函数 (Mult-task loss):
L ( { p i } , { t i } ) = 1 N c l s ∗ ∑ i L c l s ( p i , p i ∗ ) + λ 1 N r e g ∗ ∑ i p i ∗ L r e g ( t i , t i ∗ ) L(\{p_i\},\{t_i\}) = {1 \over N_{cls}} * \sum_iL_{cls}(p_i, p_i^*) + \lambda{1 \over N_{reg}} * \sum_i p_i^*L_{reg}(t_i, t_i^*) L({pi},{ti})=Ncls1∗i∑Lcls(pi,pi∗)+λNreg1∗i∑pi∗Lreg(ti,ti∗)
i 为 a n c h o r 的 下 标 , p 是 为 前 景 目 标 的 预 测 概 率 , t 是 代 表 预 测 b b o x 的 四 维 向 量 , t ∗ 代 表 b b o x 真 值 , p ∗ 在 该 a n c h o r 是 p o s i t i v e 的 时 候 为 1 , 反 之 为 0 i为anchor的下标,p是为前景目标的预测概率,t是代表预测bbox的四维向量,t^*代表bbox真值,p^*在该anchor是positive的时候为1,反之为0 i为anchor的下标,p是为前景目标的预测概率,t是代表预测bbox的四维向量,t∗代表bbox真值,p∗在该anchor是positive的时候为1,反之为0
更详细的细节还请参看原论文。
如果将RPN和Fast R-CNN分开训练,它们内部的卷积层将会按照各自的方式收敛,这不是我们期望的。作者团队提出了三种方法允许在两个网络之间共享卷积层,而不是学习两个完全不同的网络。
这里只提论文中实际使用的一种方法:交替训练
首先训练RPN,再用RPN推举出的proposal训练Fast R-CNN,再用微调过的Fast R-CNN权重初始化RPN(The network tuned by Fast R-CNN is then used to initialize RPN),这个过程可以反复多次。
Faster R-CNN针对region proposal的生成过程提出了基于深度卷积网络的方法,让region proposal的生成几乎不需要额外开销(nearly cost-free)。在提升速度的同时,提高了region proposal的质量,进而提高了目标检测的精度。