Faster RCNN论文2015.06

学习笔记,错误很多,不要被误导。

引用:时间久远,不知道哪位大佬的。


一、目标

忽略花费在寻找先验框上的时间,最新版本Fast R-CNN利用非常深的网络实现了接近实时的速率。现在,寻找先验框是最新的检测系统中测试时间的计算瓶颈。

EdgeBoxes目前提供了在选择先验框的质量和速度之间的最佳权衡,每张图像0.2秒。比选择性搜索快了一个数量及。尽管如此,区域先验框提出步骤仍然像检测网络那样消耗同样多的运行时间。

二、提出RPN网络

基于区域的检测器所使用的卷积特征映射,如Fast R-CNN,也可以用于生成区域提议。在这些卷积特征之上,我们通过添加一些额外的卷积层来构建RPN,这些卷积层同时在规则网格上的每个位置上回归区域边界和目标分数。因此RPN是一种全卷积网络(FCN),可以针对生成检测区域建议的任务进行端到端的训练。

RPN旨在有效预测具有广泛尺度和长宽比的区域提议。与使用图像金字塔(图1,a)或滤波器金字塔(图1,b)的流行方法[8],[9],[1]相比,我们引入新的“锚”盒作为多种尺度和长宽比的参考。我们的方案可以被认为是回归参考金字塔(图1,c),它避免了枚举多种比例或长宽比的图像或滤波器。这个模型在使用单尺度图像进行训练和测试时运行良好,从而有利于运行速度。

三、faster R-CNN

我们的目标检测系统,称为Faster R-CNN,由两个模块组成。第一个模块是先验框选择的深度全卷积网络,第二个模块是使用先验框的Fast R-CNN检测器。整个系统是一个单个的,统一的目标检测网络。

3.1RPN

RPN以任意大小的图像作为输入,输出一组矩形的先验框,每个框都有一个目标得分。

提出先验框的方法:

我们在最后的共享卷积层输出的卷积特征映射上滑动一个小网络。这个小网络将输入卷积特征映射的n×n空间窗口作为输入。每个滑动窗口映射到一个低维特征(ZF为256维,VGG为512维,后面是ReLU[33])。这个特征被输入到两个子全连接层——一个边界框回归层(reg)和一个边界框分类层(cls)。

请注意,因为小网络以滑动窗口方式运行,所有空间位置共享全连接层。这种架构通过一个n×n卷积层,后面是两个子1×1卷积层(分别用于reg和cls)自然地实现。

(每个滑动的3乘3小窗口,其实是卷积层,在每一个滑动的位置上输出一个1乘1乘一个256维或者512的特征图,输入是卷积之后的特征映射。然后再利用两个一乘一的卷积层把中间层转化为两个全连接层,就是向量,分别用来表示边界框回归和边界框分类)

在每个滑动窗口位置,我们同时预测多个区域提议,其中每个位置可能提议的最大数目表示为k。因此,reg层具有4k个输出,编码k个边界框的坐标,cls层输出2k个分数,估计每个先验框是目标或不是目标的概率。锚点位于所讨论的滑动窗口的中心,并与一个尺度和长宽比相关。默认情况下,我们使用3个尺度和3个长宽比,在每个滑动位置产生k=9个锚点。对于大小为W×H(通常约为2400)的卷积特征映射,总共有WHk个锚点。

在k=9个锚点的情况下有(4+2)×9维的卷积输出层。因此,对于VGG-16,我们的输出层具有2.8×10^4个参数(对于VGG-16为512×(4+2)×9)

①平移不变性

卷积网络层具有平移不变性

②多尺度训练

第一种是图像金字塔,图像在多种尺度上缩放,然后对每个尺度计算特征映射。第二种是滤波器金字塔直接在特征映射上使用多种尺度的滑动窗口。第三种就是锚点金字塔,简单的使用单尺度图像上计算的卷积特征,并且输出成多尺度的(但是这样做的目的是什么?就是为了增加尺度么,学到特征区域大小也没有变化啊)

③训练RPN

为了训练RPN,我们为每个锚点分配一个二值类别标签(是目标或不是目标)用来当作训练数据。我们给两种锚点分配一个正标签:(i)具有与实际边界框的重叠最高交并比(IoU)的锚点,或者(ii)具有与实际边界框的重叠超过0.7 IoU的锚点。注意,单个真实边界框可以为多个锚点分配正标签。通常第二个条件足以确定正样本;但我们仍然采用第一个条件,因为在一些极少数情况下,第二个条件可能找不到正样本。对于所有的真实边界框,如果一个锚点的IoU比率低于0.3,我们给非正面的锚点分配一个负标签。既不正面也不负面的锚点不会有助于训练目标函数。

我们这样定义损失函数:


其中边框回归的编码方式是:

3.2联合训练

到目前为止,我们已经描述了如何训练用于区域提议生成的网络,没有考虑将利用这些提议的基于区域的目标检测CNN。对于检测网络,我们采用Fast R-CNN[2]。接下来我们介绍一些算法,学习由RPN和Fast R-CNN组成的具有共享卷积层的统一网络(图2)。

独立训练的RPN和Fast R-CNN将以不同的方式修改卷积层。因此,我们需要开发一种允许在两个网络之间共享卷积层的技术,而不是学习两个独立的网络。我们讨论三个方法来训练具有共享特征的网络:

(一)交替训练。在这个解决方案中,我们首先训练RPN,并使用这些提议来训练Fast R-CNN。由Fast R-CNN微调的网络然后被用于初始化RPN,并且重复这个过程。这是本文所有实验中使用的解决方案。

(二)近似联合训练。在这个解决方案中,RPN和Fast R-CNN网络在训练期间合并成一个网络,如图2所示。在每次SGD迭代中,前向传递生成区域提议,在训练Fast R-CNN检测器将这看作是固定的、预计算的提议。反向传播像往常一样进行,其中对于共享层,组合来自RPN损失和Fast R-CNN损失的反向传播信号。这个解决方案很容易实现。但是这个解决方案忽略了关于提议边界框的坐标(也是网络响应)的导数,因此是近似的。在我们的实验中,我们实验发现这个求解器产生了相当的结果,与交替训练相比,训练时间减少了大约25−50%25−50%。这个求解器包含在我们发布的Python代码中。

(三)非近似的联合训练。如上所述,由RPN预测的边界框也是输入的函数。Fast R-CNN中的RoI池化层[2]接受卷积特征以及预测的边界框作为输入,所以理论上有效的反向传播求解器也应该包括关于边界框坐标的梯度。在上述近似联合训练中,这些梯度被忽略。在一个非近似的联合训练解决方案中,我们需要一个关于边界框坐标可微分的RoI池化层。这是一个重要的问题,可以通过[15]中提出的“RoI扭曲”层给出解决方案,这超出了本文的范围。

四步交替训练。在本文中,我们采用实用的四步训练算法,通过交替优化学习共享特征。在第一步中,我们按照3.1.3节的描述训练RPN。该网络使用ImageNet的预训练模型进行初始化,并针对区域提议任务进行了端到端的微调。在第二步中,我们使用由第一步RPN生成的先验框,由Fast R-CNN训练单独的检测网络。该检测网络也由ImageNet的预训练模型进行初始化。此时两个网络不共享卷积层。在第三步中,我们使用检测器网络来初始化RPN训练,但是我们修正共享的卷积层,并且只对RPN特有的层进行微调。现在这两个网络共享卷积层。最后,保持共享卷积层的固定,我们对Fast R-CNN的独有层进行微调。因此,两个网络共享相同的卷积层并形成统一的网络。类似的交替训练可以运行更多的迭代,但是我们只观察到可以忽略的改进。

四、一些问题

借用大佬的一张图。一直很不理解在roipooling这一层同时结合VGG16输出的特征图和RPN网络的输出(4k+2k)是怎么做到的。今天结合博客又理解了一下,因为fast或者faster的候选框输出的位置都是针对原图的,所以需要将RPN网络得输出映射到conv5-3特征图上,然后再用roipooling层进行resize。这就是目前的理解了。2019.6.17

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容