Faster R-CNN论文笔记

原文:http://www.92to.com/bangong/2016/10-30/12048568.html

在介绍Faster R-CNN之前,先来介绍一些前验知识,为Faster R-CNN做铺垫。

一、基于Region Proposal(候选区域)的深度学习目标检测算法

Region Proposal(候选区域),就是预先找出图中目标可能出现的位置,通过利用图像中的纹理、边缘、颜色等信息,保证在选取较少窗口(几千个甚至几百个)的情况下保持较高的召回率(IoU,Intersection-over-Union)。


图1 IoU定义

Region Proposal方法比传统的滑动窗口方法获取的质量要更高。比较常用的Region Proposal方法有:SelectiveSearch(SS,选择性搜索)、Edge Boxes(EB)。

基于Region Proposal目标检测算法的步骤如下:


其中:

CNN方法见http://blog.csdn.net/qq_17448289/article/details/52850223。

边框回归(Bouding Box Regression):是对RegionProposal进行纠正的线性回归算法,目的是为了让Region Proposal提取到的窗口与目标窗口(Ground Truth)更加吻合。


二、R-CNN、Fast R-CNN、Faster R-CNN三者关系


表1 三者比较

R-CNN(Region-based Convolutional Neural Networks)

1、SS提取RP;

2、CNN提取特征;

3、SVM分类;

4、BB盒回归。

缺点:

1、 训练步骤繁琐(微调网络+训练SVM+训练bbox);

2、 训练、测试均速度慢;

3、 训练占空间

优点:

1、 从DPM HSC的34.3%直接提升到了66%(mAP);

2、 引入RP+CNN

Fast R-CNN (Fast Region-based Convolutional Neural Networks)

1、SS提取RP;

2、CNN提取特征;

3、softmax分类;

4、多任务损失函数边框回归。

缺点:

1、 依旧用SS提取RP(耗时2-3s,特征提取耗时0.32s);

2、 无法满足实时应用,没有真正实现端到端训练测试;

3、 利用了GPU,但是区域建议方法是在CPU上实现的。

优点:

1、 由66.9%提升到70%;

2、 每张图像耗时约为3s。


Faster R-CNN (Fast Region-based Convolutional Neural Networks)

1、RPN提取RP;

2、CNN提取特征;

3、softmax分类;

4、多任务损失函数边框回归。

缺点:

1、 还是无法达到实时检测目标;

2、 获取region proposal,再对每个proposal分类计算量还是比较大。

优点:

1、 提高了检测精度和速度;

2、 真正实现端到端的目标检测框架;

3、 生成建议框仅需约10ms。


2.1 R-CNN目标检测流程介绍


具体可参考http://blog.csdn.net/shenxiaolu1984/article/details/51066975

2.2 Fast R-CNN目标检测流程介绍


注意:Fast R-CNN的RegionProposal是在feature map之后做的,这样可以不用对所有的区域进行单独的CNN Forward步骤。

Fast R-CNN框架如下图:



Fast R-CNN框架与R-CNN有两处不同:

① 最后一个卷积层后加了一个ROI pooling layer;

② 损失函数使用了multi-task loss(多任务损失)函数,将边框回归直接加到CNN网络中训练。分类Fast R-CNN直接用softmax替代R-CNN用的SVM进行分类。Fast R-CNN是端到端(end-to-end)的。

具体可参考http://blog.csdn.net/shenxiaolu1984/article/details/51036677

三、Faster R-CNN目标检测

3.1 Faster R-CNN的思想

Faster R-CNN可以简单地看做“区域生成网络RPNs + Fast R-CNN”的系统,用区域生成网络代替FastR-CNN中的Selective Search方法。Faster R-CNN这篇论文着重解决了这个系统中的三个问题:

1. 如何设计区域生成网络;

2. 如何训练区域生成网络;

3. 如何让区域生成网络和Fast RCNN网络共享特征提取网络。

在整个Faster R-CNN算法中,有三种尺度:

1. 原图尺度:原始输入的大小。不受任何限制,不影响性能。

2. 归一化尺度:输入特征提取网络的大小,在测试时设置,源码中opts.test_scale=600。anchor在这个尺度上设定。这个参数和anchor的相对大小决定了想要检测的目标范围。

3. 网络输入尺度:输入特征检测网络的大小,在训练时设置,源码中为224*224。

3.2 Faster R-CNN框架介绍


Faster-R-CNN算法由两大模块组成:

1.PRN候选框提取模块;

2.Fast R-CNN检测模块。

其中,RPN是全卷积神经网络,用于提取候选框; Fast R-CNN基于RPN提取的proposal检测并识别proposal中的目标。


Faster R-CNN统一的网络结构如下图所示,可以简单看作RPN网络+Fast R-CNN网络。


具体步骤:
  1. 首先向CNN网络【ZF或VGG-16】输入任意大小图片;
  2. 经过CNN网络前向传播至最后共享的卷积层,一方面得到供RPN网络输入的特征图,另一方面继续前向传播至特有卷积层,产生更高维特征图;
  3. 供RPN网络输入的特征图经过RPN网络得到区域建议框区域得分,并对区域得分采用非极大值抑制【阈值为0.7】,输出其Top-N【文中为300】得分的区域建议给RoI池化层;
  4. 第2步得到的高维特征图和第3步输出的区域建议框同时输入RoI池化层,提取对应区域建议框的特征
  5. 第4步得到的区域建议特征通过全连接层后,输出该区域的分类得分以及回归后的bounding-box。
RPN网络结构如上图所示:
过程:在最后一个共享的卷积层输出的卷积特征映射上 滑动小网络,这个网络 全连接到输入卷积特征映射的nxn的空间窗口上。每个滑动窗口 映射到一个低维向量上(对于ZF是256-d,对于VGG是512-d,每个特征映射的一个滑动窗口对应一个数值)。这个向量输出给两个 同级的全连接的层——bbox回归层(reg)和bbox分类层(cls)。
建模:全卷积网络
注意:上图中卷积层/全连接层表示卷积层或者全连接层,作者在论文中表示这两层实际上是全连接层,但是网络在所有滑窗位置共享全连接层,可以很自然地用n×n卷积核【论文中设计为3×3】跟随两个并行的1×1卷积核实现


3.3 RPN介绍

3.3.1背景

目前最先进的目标检测网络需要先用区域建议算法推测目标位置,像SPPnet 和 Fast R-CNN这些网络虽然已经减少了检测网络运行的时间,但是计算区域建议依然耗时较大。所以,在这样的瓶颈下,RBG和Kaiming He一帮人将Region Proposal也交给CNN来做,这才提出了RPN(Region Proposal Network)区域建议网络用来提取检测区域,它能和整个检测网络共享全图的卷积特征,使得区域建议几乎不花时间。

RCNN解决的是,“为什么不用CNN做classification呢?”

Fast R-CNN解决的是,“为什么不一起输出bounding box和label呢?”

Faster R-CNN解决的是,“为什么还要用selective search呢?”

3.3.2RPN核心思想

RPN的核心思想是使用CNN卷积神经网络直接产生Region Proposal,使用的方法本质上就是滑动窗口(只需在最后的卷积层上滑动一遍),因为anchor机制和边框回归可以得到多尺度多长宽比的Region Proposal。

RPN网络也是全卷积网络(FCN,fully-convolutional network),可以针对生成检测建议框的任务端到端地训练,能够同时预测出object的边界和分数。只是在CNN上额外增加了2个卷积层(全卷积层cls和reg)。

①将每个特征图的位置编码成一个特征向量(256d for ZF and 512d for VGG)。

②对每一个位置输出一个objectness score 和 regressed bounds for k个 region proposal,即在每个卷积映射位置输出这个位置上多种尺度(3种)和长宽比(3种)的k个(3*3=9)区域建议的物体得分和回归边界。

RPN网络的输入可以是任意大小(但还是有最小分辨率要求的,例如VGG是228*228)的图片。如果用VGG16进行特征提取,那么RPN网络的组成形式可以表示为VGG16+RPN。

VGG16:参考https://github.com/rbgirshick/py-faster-rcnn/blob/master/models/pascal_voc/VGG16/faster_rcnn_end2end/train.prototxt,可以看出VGG16中用于特征提取的部分是13个卷积层(conv1_1---->conv5.3),不包括pool5及pool5后的网络层次结构。

因为我们的最终目标是和 Fast R-CNN目标检测网络共享计算,所以假设这两个网络共享一系列卷积层。在论文的实验中,ZF有5个可共享的卷积层, VGG有13个可共享的卷积层。

RPN的具体流程如下:使用一个小网络在最后卷积得到的特征图上进行滑动扫描,这个滑动网络每次与特征图上n*n(论文中n=3)的窗口全连接(图像的有效感受野很大,ZF是171像素,VGG是228像素),然后映射到一个低维向量(256d for ZF / 512d for VGG),最后将这个低维向量送入到两个全连接层,即bbox回归层(reg)和box分类层(cls)。sliding window的处理方式保证reg-layer和cls-layer关联了conv5-3的全部特征空间。

reg层:预测 proposal 的anchor对应的proposal的(x,y,w,h)

cls层:判断该 proposal是前景(object)还是背景(non-object)。


                                                                                    图5 RPN框架

在图5中,要注意,3*3卷积核的中心点对应原图(re-scale,源代码设置re-scale为600*1000)上的位置(点),将该点作为anchor的中心点,在原图中框出多尺度、多种长宽比的anchors。所以,anchor不在conv特征图上,而在原图上。


                                         图6 9种anchor(注意:是不同位置)



                                                                           图7 Faster R-CNN卷积流程图

原图600*1000经CNN卷积后,在CNN最后一层(conv5)得出的是40*60大小的特征图,对应文中说的典型值为2400。若特征图大小为W*H,则需要W*H*K个anchor,本文中需要40*60*9≈2k个。

在RPN网络中,我们需要重点理解其中的anchors概念,Loss fucntions计算方式和RPN层训练数据生成的具体细节。

3.4 RPN的平移不变性

在计算机视觉中的一个挑战就是平移不变性:比如人脸识别任务中,小的人脸(24*24的分辨率)和大的人脸(1080*720)如何在同一个训练好权值的网络中都能正确识别。若是平移了图像中的目标,则建议框也应该平移,也应该能用同样的函数预测建议框。

传统有两种主流的解决方式:

第一、对图像或feature map层进行尺度\宽高的采样;

第二、对滤波器进行尺度\宽高的采样(或可以认为是滑动窗口).

但Faster R-CNN解决该问题的具体实现是:通过卷积核中心(用来生成推荐窗口的Anchor)进行尺度、宽高比的采样,使用3种尺度和3种比例来产生9种anchor。


3.5 窗口分类和位置精修

分类层(cls_score)输出每一个位置上,9个anchor属于前景和背景的概率。

窗口回归层(bbox_pred)输出每一个位置上,9个anchor对应窗口应该平移缩放的参数(x,y,w,h)。

对于每一个位置来说,分类层从256维特征中输出属于前景和背景的概率;窗口回归层从256维特征中输出4个平移缩放参数。

需要注意的是:并没有显式地提取任何候选窗口,完全使用网络自身完成判断和修正。


3.6 学习区域建议损失函数

3.6.1 标签分类规定

为了训练RPN,需要给每个anchor分配的类标签{目标、非目标}。对于positive label(正标签),论文中给了如下规定(满足以下条件之一即可判为正标签):


注意,一个GT包围盒可以对应多个anchor,这样一个GT包围盒就可以有多个正标签。

事实上,采用第②个规则基本上可以找到足够的正样本,但是对于一些极端情况,例如所有的Anchor对应的anchor box与groud truth的IoU不大于0.7,可以采用第一种规则生成。negative label(负标签):与所有GT包围盒的IoU都小于0.3的anchor。

对于既不是正标签也不是负标签的anchor,以及跨越图像边界的anchor我们给予舍弃,因为其对训练目标是没有任何作用的。

RPN网络中对特征图滑窗时每个滑窗位置所对应的原图区域中9种可能的大小,相当于模板,对任意图像任意滑窗位置都是这9种模板。继而根据图像大小计算滑窗中心点对应原图区域的中心点,通过中心点和size就可以得到滑窗位置和原图位置的映射关系,由此原图位置并根据与Ground Truth重复率贴上正负标签,让RPN学习该Anchors是否有物体即可。

3.6.2 多任务损失(来自Fast R-CNN)


图8 multi-task数据结构

Fast R-CNN网络有两个同级输出层(cls score和bbox_prdict层),都是全连接层,称为multi-task。

① clsscore层:用于分类,输出k+1维数组p,表示属于k类和背景的概率。对每个RoI(Region of Interesting)输出离散型概率分布


通常,p由k+1类的全连接层利用softmax计算得出。

② bbox_prdict层:用于调整候选区域位置,输出bounding box回归的位移,输出4*K维数组t,表示分别属于k类时,应该平移缩放的参数。

k表示类别的索引,

是指相对于object proposal尺度不变的平移,

是指对数空间中相对于object proposal的高与宽。

loss_cls层评估分类损失函数。由真实分类u对应的概率决定:

loss_bbox评估检测框定位的损失函数。比较真实分类对应的预测平移缩放参数

和 真实平移缩放参数为

的差别:

其中,smooth L1损失函数为:

smooth L1损失函数曲线如下图9所示,作者这样设置的目的是想让loss对于离群点更加鲁棒,相比于L2损失函数,其对离群点、异常值(outlier)不敏感,可控制梯度的量级使训练时不容易跑飞。


                                图9 smoothL1损失函数曲线

最后总损失为(两者加权和,如果分类为背景则不考虑定位损失):

规定u=0为背景类(也就是负标签),那么艾弗森括号指数函数[u≥1]表示背景候选区域即负样本不参与回归损失,不需要对候选区域进行回归操作。λ控制分类损失和回归损失的平衡。Fast R-CNN论文中,所有实验λ=1。

艾弗森括号指数函数为:

源码中bbox_loss_weights用于标记每一个bbox是否属于某一个类。

3.6.3 Faster R-CNN损失函数

遵循multi-task loss定义,最小化目标函数,FasterR-CNN中对一个图像的函数定义为:


3.6.4 R-CNN中的boundingbox回归

下面先介绍R-CNN和Fast R-CNN中所用到的边框回归方法。

1.为什么要做Bounding-box regression?

图10 示例

如图10所示,绿色的框为飞机的Ground Truth,红色的框是提取的Region Proposal。那么即便红色的框被分类器识别为飞机,但是由于红色的框定位不准(IoU<0.5),那么这张图相当于没有正确的检测出飞机。如果我们能对红色的框进行微调,使得经过微调后的窗口跟Ground Truth更接近,这样岂不是定位会更准确。确实,Bounding-box regression 就是用来微调这个窗口的。

2.回归/微调的对象是什么?

3.Bounding-box regression(边框回归)

那么经过何种变换才能从图11中的窗口P变为窗口呢?比较简单的思路就是:


注意:只有当Proposal和Ground Truth比较接近时(线性问题),我们才能将其作为训练样本训练我们的线性回归模型,否则会导致训练的回归模型不work(当Proposal跟GT离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理)。这个也是G-CNN: an Iterative Grid Based Object Detector多次迭代实现目标准确定位的关键。

线性回归就是给定输入的特征向量X,学习一组参数W,使得经过线性回归后的值跟真实值Y(Ground Truth)非常接近。即


那么Bounding-box中我们的输入以及输出分别是什么呢?

输入:


这个是什么?输入就是这四个数值吗?其实真正的输入是这个窗口对应的CNN特征,也就是R-CNN中的Pool5feature(特征向量)。(注:训练阶段输入还包括 Ground Truth,也就是下边提到的

输出:需要进行的平移变换和尺度缩放

或者说是

我们的最终输出不应该是Ground Truth吗?是的,但是有了这四个变换我们就可以直接得到Ground Truth,这里还有个问题,根据上面4个公式我们可以知道,P经过

得到的并不是真实值G,而是预测值

4.测试阶段

※注意:计算regression loss需要三组信息:

1)预测框,即RPN网络测出的proposa;

2)锚点anchor box:之前的9个anchor对应9个不同尺度和长宽比的anchorbox;

3)GroundTruth:标定的框。

3.7 训练RPNs

RPN通过反向传播(BP,back-propagation)和随机梯度下降(SGD,stochastic gradient descent)进行端到端(end-to-end)训练。依照Fast R-CNN中的“image-centric”采样策略训练这个网络。每个mini-batch由包含了许多正负样本的单个图像组成。我们可以优化所有anchor的损失函数,但是这会偏向于负样本,因为它们是主要的。

采样

每一个mini-batch包含从一张图像中随机提取的256个anchor(注意,不是所有的anchor都用来训练),前景样本和背景样本均取128个,达到正负比例为1:1。如果一个图像中的正样本数小于128,则多用一些负样本以满足有256个Proposal可以用于训练。

初始化

新增的2层参数用均值为0,标准差为0.01的高斯分布来进行初始化,其余层(都是共享的卷积层,与VGG共有的层)参数用ImageNet分类预训练模型来初始化。

参数化设置(使用caffe实现)

在PASCAL数据集上:

前60k个mini-batch进行迭代,学习率设为0.001;

后20k个mini-batch进行迭代,学习率设为0.0001;

设置动量momentum=0.9,权重衰减weightdecay=0.0005。

学习细节:

3.8 非极大值抑制法



训练时(eg:输入600*1000的图像),如果anchor box的边界超过了图像边界,那这样的anchors对训练loss也不会产生影响,我们将超过边界的anchor舍弃不用。一幅600*1000的图像经过VGG16后大约为40*60,则此时的anchor数为40*60*9,约为20k个anchor boxes,再去除与边界相交的anchor boxes后,剩下约为6k个anchor boxes,这么多数量的anchorboxes之间肯定是有很多重叠区域,因此需要使用非极大值抑制法(NMS,non-maximum suppression)将IoU>0.7的区域全部合并,最后就剩下约2k个anchor boxes(同理,在最终检测端,可以设置将概率大约某阈值P且IoU大约某阈值T的预测框采用NMS方法进行合并,注意:这里的预测框指的不是anchor boxes)。NMS不会影响最终的检测准确率,但是大幅地减少了建议框的数量。NMS之后,我们用建议区域中的top-N个来检测(即排过序后取N个)。

3.9 RPN与Fast R-CNN特征共享

Faster-R-CNN算法由两大模块组成:

1.PRN候选框提取模块;

2.Fast R-CNN检测模块。

我们已经描述了如何为生成区域建议训练网络,而没有考虑基于区域的目标检测CNN如何利用这些建议框。对于检测网络,我们采用Fast R-CNN,现在描述一种算法,学习由RPN和Fast R-CNN之间共享的卷积层。

RPN和Fast R-CNN都是独立训练的,要用不同方式修改它们的卷积层。因此需要开发一种允许两个网络间共享卷积层的技术,而不是分别学习两个网络。注意到这不是仅仅定义一个包含了RPN和Fast R-CNN的单独网络,然后用反向传播联合优化它那么简单。原因是Fast R-CNN训练依赖于固定的目标建议框,而且并不清楚当同时改变建议机制时,学习Fast R-CNN会不会收敛。

RPN在提取得到proposals后,作者选择使用Fast-R-CNN实现最终目标的检测和识别。RPN和Fast-R-CNN共用了13个VGG的卷积层,显然将这两个网络完全孤立训练不是明智的选择,作者采用交替训练(Alternating training)阶段卷积层特征共享:

第一步,我们依上述训练RPN,该网络用ImageNet预训练的模型初始化,并端到端微调用于区域建议任务;

第二步,我们利用第一步的RPN生成的建议框,由Fast R-CNN训练一个单独的检测网络,这个检测网络同样是由ImageNet预训练的模型初始化的,这时候两个网络还没有共享卷积层;

第三步,我们用检测网络初始化RPN训练,但我们固定共享的卷积层,并且只微调RPN独有的层,现在两个网络共享卷积层了;

第四步,保持共享的卷积层固定,微调Fast R-CNN的fc层。这样,两个网络共享相同的卷积层,构成一个统一的网络。

注意:第一次迭代时,用ImageNet得到的模型初始化RPN和Fast-R-CNN中卷积层的参数;从第二次迭代开始,训练RPN时,用Fast-R-CNN的共享卷积层参数初始化RPN中的共享卷积层参数,然后只Fine-tune不共享的卷积层和其他层的相应参数。训练Fast-RCNN时,保持其与RPN共享的卷积层参数不变,只Fine-tune不共享的层对应的参数。这样就可以实现两个网络卷积层特征共享训练。

















  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值