论文解读-Faster R-CNN

时间:2024-03-16 20:08:35

摘要

    摘要里面印象深刻的就是那句“The RPN is trained end-to-end to generate high-quality region proposals,which are used by Fast-RCNN for detection”,从这句话可知Faster-RCNN目标检测的过程实际上是分成了两步走策略,由RPN生成候选区域,再交给Fast-RCNN对候选区域进行目标检测,这相当于把分类和定位作了拆分。这是它与Yolo系列论文的一大不同之处,Yolo是直接一步将目标的位置、置信度和分类信息给回归出来了,快就快在此。

介绍

    RPN是一种全卷积网络(FCN),能进行端到端的训练,尤其是在生成检测区域这样的任务中。

相关工作

Object Proposals

    OP方法大致可以分为两类,一类叫grouping method,一类叫window scoring method。前者是指先将图片打碎,然后再聚合的一种方法,比如selective search。后者是生成大量窗口并对他们进行评分,然后过滤掉分数低的窗口的一种方法,比如objectness。另外还有一些介乎两者之间的方法,比如multibox。

Deep Networks for Object Proposals

    R-CNN端到端地训练CNNs对候选区域进行分类(目标类或者背景),R-CNN主要是起到一个分类器的作用,并不能预测物体的边框(除非使用边框回归),它的准确率取决于OP模块的性能。有若干文章提出使用深度网络来对边框进行预测。

Faster R-CNN

    我们的目标检测系统称之为Faster R-CNN,它包含两大模块。第一个模块是一个全卷积网络(Region Proposal Network)用于提供候选区域,第二个模块是Fast R-CNN检测器,它会使用到提供的候选区域。

论文解读-Faster R-CNN

RPN(Region Proposal Networks)

        RPN接收任意大小的图像作为输入,并输出一组带有评分的矩形候选框,这个过程使用一个全卷积网络来建模。

论文解读-Faster R-CNN

        为了生成候选区域,我们使用一个小的网络在最后一个共享卷积层生成的特征图上进行滑动。这个小的网络把特征图上n x n的窗口作为输入,每个滑动窗口将映射到低维的特征向量(对ZF来说是256维,VGG是512维,接ReLU)。这个低维特征向量将输入给并行的两路全连接层--边框回归层(reg)和分类层(cls)。怎么去理解边框回归这件事,我强烈建议阅读这篇博客:https://blog.csdn.net/zijin0802034/article/details/77685438

"""

1、 以ZF网络为例,卷积层输出的特征图是13 x 13 x 256; 
2、作者在文章中指出,滑动窗口的大小是3 x 3的,要得到一个256-d的向量,需要256个3 x 3 x 256的卷积核进行卷积运算。作者这里画的示意图仅仅是针对一个滑动窗口,在实际实现中会有很多个滑动窗口,所以得到的并不是一维的256-d向量,实际上还是一个3维的矩阵数据结构;
3、然后就是k=9,所以分类层(cls layer)就是18个输出值了,那么在256-d和cls layer之间使用一个1 x 1 x 256 x 18的卷积核,就可以得到cls layer,这个1 x 1 x 256 x 18的卷积核就是大家平常理解的全连接。所以说全连接只是卷积操作的一种特殊情况(当卷积核的大小是1 x 1的时候);
4、reg layer也是一样了,reg layer的输出是36个,所以对应的卷积核是1 x 1 x 256 x 36,这样就可以得到reg layer的输出了;
5、然后cls layer 和reg layer后面都会接到自己的损失函数上,给出损失函数的值,同时会根据求导的结果,给出反向传播的数据。

"""

Anchors

        在每一个滑动窗口所在的位置,同时预测多个候选区域,最大可能的候选区域数量用k来表示,这k个候选区域就好像是k个参考盒子(box),这样的盒子把它称之为锚点,位于n x n的滑动窗口的中心处。注意这里的锚点并不是一个点,而一个盒子。默认情况下,依据不同的大小(scale)和比例(aspect ratio)在每个滑动窗口所在的位置上可以预测出的锚点的数量k等于9。因此,回归层(reg layer)会有4*k个输出,用来表示k个锚点的坐标。分类层(cls layer)会有2*k个输出值,用来评估每个锚点为前景和背景的概率。对于大小为W x H的特征图,总共会有W*H*k个锚点。

Translation-Invariant Anchors

Multi-Scale Anchors as Regression References

损失函数

    为训练RPNs,我们对每个Anchor分配一个二分类标签(有目标或没有目标),在开始训练之前,先定义好正负样本的标定规则:

1)、 如果锚点对应的reference box与ground truth的IoU值最大,标记为正样本;

2) 、如果锚点对应的reference box与ground truth的IoU>0.7,标记为正样本。事实上,采用第2个规则基本上可以找到足够的正样本,但我们仍然采用第一种原则。因为第二点有IoU阈值(如0.7)这个限制,有可能你根本就找不到一个Anchor能够与这个ground truth的IoU达到这个阈值.

3)、如果锚点和所有的ground truth的IoU都小于0.3,那么标记为负样本; 

4)、剩下的既不是正也不是负,不用于最终的训练。

    训练RPN的损失(loss)由分类损失(classification loss)和回归损失(regression loss)按一定比重组成。对一幅图像的损失函数定义如下:

论文解读-Faster R-CNN

其中,i是一个mini-batch中锚点的索引,论文解读-Faster R-CNN是锚点i为前景的概率。如果锚点是正样本,那么其真实的标注论文解读-Faster R-CNN等于1,否则等于0。

论文解读-Faster R-CNN是一个向量,表示参数化后的预测框的4个坐标,论文解读-Faster R-CNN是正样本锚点的ground truth。

论文解读-Faster R-CNN是在两个分类(object or not)上的log loss:

               论文解读-Faster R-CNN

论文解读-Faster R-CNN回归损失用下式表示:

论文解读-Faster R-CNN

R为鲁棒损失函数:

论文解读-Faster R-CNN

对于边框回归,我们采用参数化坐标的形式,注意不是直接用的坐标。

论文解读-Faster R-CNN

x,y,w,h分别表示边框的中心坐标以及边框的宽和高。变量x,xa和x*分别对应预测框,锚点和ground truth box(其它类同)。边框回归实际上是由锚点到附近的ground truth box的回归。

训练RPNs

    RPN能通过反向传播以及SGD进行端到端的训练。我们依照"image-centric"采样策略对网络进行训练。每个mini-batch来自于一幅单独的图像,它包含很多正负样本锚点。虽然可以优化针对所有锚点的损失函数,但是这样会偏向于负样本,因为它们是占绝大多数的。我们从一幅图像中随机地选择256个锚点作为一个mini-batch来计算损失函数。这样一来,正负样本锚点的比例会接近于1:1。如果正样本锚点的数量不到128,用负样本锚点来补。

    4步交替训练。论文中训练Faster R-CNN的方法称之为4步交替训练法(4-step Alternating Training)。第一步,训练RPN,RPN用ImageNet上预训练的参数进行初始化,然后针对区域建议任务进行fine-tune,要知道RPN就是用来提供区域建议的。第二步,用第一步提供的区域建议训练一个单独的Fast R-CNN检测网络。这个Fast R-CNN检测网络同样是使用ImageNet上预训练的参数进行初始化。到目前为止,RPN和Fast R-CNN还是各训各的,并没有共享卷积参数。下面进入第三步,使用第二步中Fast R-CNN检测网络训练好的参数又来初始化RPN,但是固定共享卷积层,只fine-tune RPN中的特殊层。现在开始,RPN和Fast R-CNN共享卷积层参数了。最后,也就是第4步,依旧固定共享卷积层,fine-tune Fast-RCNN中的特殊层。经过这4步,RPN和Fast R-CNN这两个网络既共享了卷积层又形成了一个统一的网络。