一文看懂RCNN、Fast RCNN、Faster RCNN基本思想

640?wx_fmt=gif

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第1张图片

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第2张图片

进入正文

640?wx_fmt=png 全文 摘要

前面讲了计算机视觉的5大研究领域,本文针对其中的目标检测进行讲解,将着重介绍当前在目标检测领域所广泛使用的一些原理方法,包括R-CNN,fast R-CNN,faster R-CNN,SSD算法等,本文只是着重介绍相关的思想原理,关于后面的具体实现代码,会在后面的文章中分享给大家。本文内容较长,阅读全文大约30min。

640?wx_fmt=png

目标检测算法原理

01

基于“区域Region”的目标检测算法

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

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第3张图片

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

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

640?wx_fmt=png

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

02

R-CNN、fast R-CNN、faster R-CNN

  三者比较


使用方法

缺点

改进

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。

每日简单的生活,静静行走尘间,家日琐事,也会忙的焦头烂额,生活仍在平淡中循环,不起半点波浪,我来由转去。这个冬季,想你多年的温暖,厚厚的光阴,寄满了给我的挂牵。

NO.2.1

R-CNN的基本流程

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第4张图片

NO.2.2

fast R-CNN的基本流程

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第5张图片

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

Fast R-CNN框架如下图:

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第6张图片

                                                                                            

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

03

详解faster R-CNN

NO.3.1

fast R-CNN的基本思想

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

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

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

NO.3.2

fast R-CNN的框架介绍

640?wx_fmt=png

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第7张图片

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

1.PRN候选框提取模块;

2.Fast R-CNN检测模块。

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

NO.3.3

RPN介绍

3.3 RPN介绍

3.3.1 RPN的背景

       目前最先进的目标检测网络需要先用区域建议算法推测目标位置,像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 RPN介绍

3.3.2 RPN的核心思想

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

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

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

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

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

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)。

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第8张图片

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

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第9张图片

640?wx_fmt=png

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第10张图片

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

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

3.3 RPN介绍

3.3.3 RPN的平移不变性

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

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

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

3.3 RPN介绍

3.3.4 窗口分类和损失精修

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

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

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

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

3.3 RPN介绍

3.3.5 损失函数

 3.3.5.1 标签分类规定

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

640?wx_fmt=png

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

事实上,采用第②个规则基本上可以找到足够的正样本,但是对于一些极端情况,例如所有的Anchor对应的anchor box与groud truth的IoU不大于0.7,可以采用第一种规则生成。

negative label(负标签):与所有GT包围盒的IoU都小于0.3的anchor。

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

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

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第11张图片

图8  multi-task数据结构

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

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

640?wx_fmt=png

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

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

640?wx_fmt=png

k表示类别的索引,640?wx_fmt=png是指相对于objectproposal尺度不变的平移,640?wx_fmt=png是指对数空间中相对于objectproposal的高与宽。

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

640?wx_fmt=png

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

真实平移缩放参数为640?wx_fmt=png的差别:

640?wx_fmt=png

其中,smooth L1损失函数为:

640?wx_fmt=png

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

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第12张图片

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

640?wx_fmt=png

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

艾弗森括号指数函数为:

640?wx_fmt=png

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

3.3.5.3 Faster R-CNN损失函数

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

640?wx_fmt=png

其中:

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第13张图片

04

 R-CNN中的boundingbox回归

NO.4.1

为什么要做boundingbox回归

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第14张图片

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

NO.4.2

回归/微调的对象是什么

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第15张图片

NO.4.3

bounding-box regression 边框回归

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

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第16张图片

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第17张图片

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

线性回归就是给定输入的特征向量X,学习一组参数W,使得经过线性回归后的值跟真实值Y(Ground Truth)非常接近。即640?wx_fmt=png。那么Bounding-box中我们的输入以及输出分别是什么呢?

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

输出:需要进行的平移变换和尺度缩放640?wx_fmt=png,或者说是640?wx_fmt=png。我们的最终输出不应该是Ground Truth吗?是的,但是有了这四个变换我们就可以直接得到Ground Truth,这里还有个问题,根据上面4个公式我们可以知道,P经过640?wx_fmt=png,得到的并不是真实值G,而是预测值640?wx_fmt=png

的确,这四个值应该是经过 Ground Truth 和Proposal计算得到的真正需要的平移量640?wx_fmt=png和尺度缩放640?wx_fmt=png

这也就是R-CNN中的:

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第18张图片

那么目标函数可以表示为640?wx_fmt=png是输入Proposal的特征向量,640?wx_fmt=png是要学习的参数(*表示640?wx_fmt=png,也就是每一个变换对应一个目标函数),640?wx_fmt=png是得到的预测值。我们要让预测值跟真实值640?wx_fmt=png差距最小,得到损失函数为:

640?wx_fmt=png

函数优化目标为:

640?wx_fmt=png

利用梯度下降法或者最小二乘法就可以得到640?wx_fmt=png

NO.4.4

测试阶段

根据3我们学习到回归参数,对于测试图像,我们首先经过 CNN 提取特征640?wx_fmt=png,预测的变化就是640?wx_fmt=png,最后根据以下4个公式对窗口进行回归:

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第19张图片

3.6.5 Faster R-CNN中的bounding box回归

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第20张图片

其中:

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第21张图片

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

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

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

3)     GroundTruth:标定的框。

05

训练RPN

RPN通过反向传播(BP,back-propagation)和随机梯度下降(SGD,stochastic gradient descent)进行端到端(end-to-end)训练。依照FastR-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。

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第22张图片

3.8 非极大值抑制法一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第23张图片

训练时(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个)。

06

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不共享的层对应的参数。这样就可以实现两个网络卷积层特征共享训练。相应的网络模型请参考https://github.com/rbgirshick/py-faster-rcnn/tree/master/models/pascal_voc/VGG16/faster_rcnn_alt_opt

往期回顾

640?wx_fmt=png

2018/11/16

Friday

小伙伴们,这篇文章看起来可能有点晦涩难懂,但是如果坚持看完一定能够有所收获哦,虽然阅读完之后距离真正的目标检测实战还有一段距离,但是,基本的理论体系和理论框架还是应该先搭建起来的,后面会有关于目标检测的详细代码实现,有兴趣的小伙伴请持续关注!






640?wx_fmt=other

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第24张图片

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第25张图片

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第26张图片

一文看懂RCNN、Fast RCNN、Faster RCNN基本思想_第27张图片

640?wx_fmt=jpeg

640?wx_fmt=png

你可能感兴趣的:(一文看懂RCNN、Fast RCNN、Faster RCNN基本思想)