在介绍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三者关系

图2  三者关系

表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框架如下图:

图3  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框架介绍

图4  Faster R-CNN模型

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

1.PRN候选框提取模块;

2.Fast R-CNN检测模块。

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

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

①将每个特征图的位置编码成一个特征向量(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:参考

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我们给予舍弃,因为其对训练目标是没有任何作用的。

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表示类别的索引,是指相对于objectproposal尺度不变的平移,是指对数空间中相对于objectproposal的高与宽。

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,而是预测值

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

这也就是R-CNN中的:

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

函数优化目标为:

利用梯度下降法或者最小二乘法就可以得到

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

3.6.5 Faster R-CNN中的bounding box回归

其中:

※注意:计算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)训练。依照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。

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

Faster RCNN解析相关推荐

  1. Faster R-CNN源码中RPN的解析(自用)

    参考博客(一定要看前面两个) 一文看懂Faster R-CNN 详细的Faster R-CNN源码解析之RPN源码解析 关于RPN一些我的想法 rpn的中心思想就是在了anchors了,如何产生anc ...

  2. RCNN,Fast RCNN, Faster RCN解析

    文章目录 Region Proposal + CNN(R-CNN) Region Proposal 步骤 改进及缺陷 改进 缺陷 Spatial Pyramid Pooling(SPPNet) 解析 ...

  3. faster rcnn源码解析

    之前一直是使用faster rcnn对其中的代码并不是很了解,这次刚好复现mask rcnn就仔细阅读了faster rcnn,主要参考代码是pytorch-faster-rcnn ,部分参考和借用了 ...

  4. Faster RCNN 中的RPN解析

    Faster RCNN 中的RPN解析 文章目录 Faster RCNN 中的RPN解析 Anchor 分类 bounding box regression proposal 参考 RCNN和Fast ...

  5. 详细的Faster R-CNN源码解析之RPN源码解析

    在阔别了将近三个月之后,笔者又准备更新博客了.对于前两个多月的未及时更新,笔者在此向大家表示歉意,请大家原谅. 本次博客的更新是关于Faster R-CNN的源码.首先说一下笔者为什么要更新Faste ...

  6. 经典神经网络 | Faster R-CNN论文解析

    论文题目:Faster R-CNN: T owards Real-Time Object Detection with Region Proposal Networks 论文链接:https://ar ...

  7. faster rcnn接口_源码解析faster rcnn (mask rcnn)全过程

    1. 总领过程--官方faster cnnn 调用过程 import torchvision, torch # 导入官方faster rcnn 模型 model = torchvision.model ...

  8. 人工智能学习07--pytorch18--目标检测:Faster RCNN源码解析(pytorch)

    参考博客: https://blog.csdn.net/weixin_46676835/article/details/130175898 VOC2012 1.代码的使用 查看pytorch中的fas ...

  9. 目标检测--Faster R-CNN

    Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks NIPS 2015 Matlab code ...

最新文章

  1. usaco ★Longest Prefix 最长前缀
  2. html 标签 中 的Lang 有什么用
  3. Apriltag : 用于视觉系统标定图标tag36H11
  4. Fedora14 yum 安装源的地址配置到官方归档地址
  5. gitlab-ci详细说明
  6. 11、1.4.3 测试JDK安装成功
  7. 服务器抽屉式维护,一种服务器用可顺序运动的滑轨
  8. 1085 PAT单位排行 (25 分
  9. docker 镜像 导入导出
  10. html5自动提交表单提交,HTML5 Form表单--提交信息
  11. 【英语学习】【Level 07】U05 Best Destination L3 An Australian Adventure
  12. 直接拿来用!最火的Android开源项目(一) (转)
  13. linux中如何解决文件已删除但空间不释放的案例
  14. Vue2.x全家桶WebApp
  15. Confuser.crproj
  16. OpenCV图像模糊处理
  17. Ubuntu22.04安装网易云音乐实操笔记
  18. 微信公众号迁移公证、迁移申请函办理方法
  19. xps测试数据处理软件,XPS数据处理时 XPSpeaks 分峰拟合
  20. VMware Workstation中安装系统和VMware tools

热门文章

  1. boost::get_deleter相关的测试程序
  2. boost::multiprecision模块实现MPC后端对多精度复数的使用的测试程序
  3. boost::coroutine2模块实现layout的测试程序
  4. Boost:boost::bimaps::vector_of的测试程序
  5. Boost:ssl服务测试程序
  6. ITK:为每个像素添加常量
  7. ITK:从二进制图像中的对象计算距离图
  8. ITK:将图像投射为另一种类型
  9. 使用OpenCV创建视频
  10. OpenGL Viewport Array视口阵列的实例