转:FRCNN之RPN结构详解

article/2025/10/11 14:07:19

图没了,大家可以移步原文网址,之前放在最后的。。。

https://www.jianshu.com/p/ab1ebddf58b1

一、资源提供:

论文链接 Faster R-CNN Towards Real-Time Object:
https://arxiv.org/pdf/1506.01497.pdf
tensorflow源码链接:
https://github.com/smallcorgi/Faster-RCNN_TF

二、FRCNN组成

Faster R-CNN是目标检测界的大神Ross Girshick 2015年提出的一个很经典的检测结构,它将传统的Selective Search提取目标的方法替换成网络训练来实现,使得全流程的检测、分类速度大幅提升。
图1是Faster R-CNN的基本结构,由以下4个部分构成:
1、特征提取部分:用一串卷积+pooling从原图中提取出feature map;
2、RPN部分:这部分是Faster R-CNN全新提出的结构,作用是通过网络训练的方式从feature map中获取目标的大致位置;
3、Proposal Layer部分:利用RPN获得的大致位置,继续训练,获得更精确的位置;
4、ROI Pooling部分:利用前面获取到的精确位置,从feature map中抠出要用于分类的目标,并pooling成固定长度的数据;

FRCNN结构示例
​​​​

分布详解:

(1)特征提取部分:特征提取部分就是图1中输入图片和feature map间的那一串卷积+pooling,这部分和普通的CNN网络中特征提取结构没有区别,可以用VGG、ResNet、Inception等各种常见的结构实现(只使用全连接层之前的部分),这部分不再详述。

(2)RPN部分:目标识别有两个过程:首先你要知道目标在哪里,要从图片中找出要识别的前景,然后才是拿前景去分类。在Faster R-CNN提出之前常用的提取前景(本文称为提取proposal)的方法是Selective Search,简称SS法,通过比较相邻区域的相似度来把相似的区域合并到一起,反复这个过程,最终就得到目标区域,这种方法相当耗时以至于提取proposal的过程比分类的过程还要慢,完全达不到实时的目的;到了Faster R-CNN时,作者就想出把提取proposal的过程也通过网络训练来完成,部分网络还可以和分类过程共用,新的方法称为Reginal Proposal Network(RPN),速度大大提升。
图2粉色框内就是RPN,它做两件事:1、把feature map分割成多个小区域,识别出哪些小区域是前景,哪些是背景,简称RPN Classification,对应粉色框中上半分支;2、获取前景区域的大致坐标,简称RPN bounding box regression,对应下半分支;

RPN与proposal layer结构
 

 

    第一步:RPN Classification

RPN Classification的过程就是个二分类的过程。先要在feature map上均匀的划分出KxHxW个区域(称为anchor,K=9,H是feature map的高度,W是宽度),通过比较这些anchor和ground truth间的重叠情况来决定哪些anchor是前景,哪些是背景,也就是给每一个anchor都打上前景或背景的label。有了labels,你就可以对RPN进行训练使它对任意输入都具备识别前景、背景的能力。
在图2上半分支可以看到rpn_cls_score_reshape模块输出的结构是[1,9*H,W,2],就是9xHxW个anchor二分类为前景、背景的概率;anchor_target_layer模块输出的是每一个anchor标注的label,拿它和二分类概率一比较就能得出分类的loss。
一个feature map有9xHxW个anchor,就是说每个点对应有9个anchor,这9个anchor有1:1、1:2、2:1三种长宽比,每种长宽比都有三种尺寸(见图3)。一般来说原始输入图片都要缩放到固定的尺寸才能作为网络的输入,这个尺寸在作者源码里限制成800x600,9种anchor还原到原始图片上基本能覆盖800x600图片上各种尺寸的坐标。

feature map每个点对应个不同尺寸的anchor
 

要注意的是在实际应用时并不是把全部HxWx9个anchor都拿来做label标注,这里面有些规则来去除效果不好的anchor,具体的规则如下:
        覆盖到feature map边界线上的anchor不参与训练;
        前景和背景交界地带的anchor不参与训练。这些交界地带即不作为前景也不作为背景,以防出现错误的分类。在作者原文里把IOU>0.7作为标注成前景的门限,把IOU<0.3作为标注成背景的门限,之间的值就不参与训练,IOU是anchor与ground truth的重叠区域占两者总覆盖区域的比例,见示意图4;
        训练时一个batch的样本数是256,对应同一张图片的256个anchor,前景的个数不能超过一半,如果超出,就随机取128个做为前景,背景也有类似的筛选规则;

IOU概念

        第二步:RPN bounding box regression

        RPN bounding box regression用于得出前景的大致位置,要注意这个位置并不精确,准确位置的提取在后面的Proposal Layer bounding box regression章节会介绍。提取的过程也是个训练的过程,前面的RPN classification给所有的anchor打上label后,我们需用一个表达式来建立anchor与ground truth的关系,假设anchor中心位置坐标是[Ax, Ay],长高为Aw和Ah,对应ground truth的4个值为[Gx,Gy,Gw,Gh],他们间的关系可以用公式1来表示。[dx(A), dy(A), dw(A), dh(A)]就是anchor与ground truth之间的偏移量,由公式1可以推导出公式2,这里用对数来表示长宽的差别,是为了在差别大时能快速收敛,差别小时能较慢收敛来保证精度:

 

有了这4个偏移量,你就可以拿他们去训练图2 RPN中下面一个分支的输出。完成训练后RPN就具备识别每一个anchor到与之对应的最优proposal偏移量的能力([d'x(A), d'y(A), d'w(A), d'h(A)]),换个角度看就是得到了所有proposal的位置和尺寸。要注意的是如果一个feature map中有多个ground truth,每个anchor只会选择和它重叠度最高的ground truth来计算偏移量。

          第三步:RPN的loss计算

          RPN训练时要把RPN classification和RPN bounding box regression的loss加到一起来实现联合训练。公式3中Ncls是一个batch的大小256,Lcls(pi, pi*)是前景和背景的对数损失,pi是anchor预测为目标的概率,就是前面rpn_cls_score_reshape输出的前景部分score值,pi*是前景的label值,就是1,将一个batch所有loss求平均就是RPN classification的损失;公式3中Nreg是anchor的总数,λ是两种 loss的平衡比例,ti是图2中rpn_bbox_pred模块输出的[d'x(A), d'y(A), d'w(A), d'h(A)],t*i是训练时每一个anchor与ground truth间的偏移量,t*iti用smooth L1方法来计算loss就是RPN bounding box regression的损失:

关于Smooth L1的原理,请参考:
http://pages.cs.wisc.edu/~gfung/GeneralL1/L1_approx_bounds.pdf

 (3)Proposal Layer部分

得到proposal大致位置后下一步就是要做准确位置的回归了。在RPN的训练收敛后我们能得到anchor相对于proposal的偏移量[d'x(A), d'y(A), d'w(A), d'h(A)](要注意这里是想对于proposal的,而不是相对于ground truth的),有了偏移量再根据公式1就能算出proposal的大致位置。在这个过程中HxWx9个anchor能算出HxWx9个proposal,大多数都是聚集在ground truth周围的候选框,这么多相近的proposal完全没必要反而增加了计算量,这时就要用一些方法来精选出最接近ground truth的proposal,Ross Girshick给了三个步骤:

a.先选出前景概率最高的N个proposal;
b.做非极大值抑制(NMS)
c.NMS后再次选择前景概率最高的M个proposal;

经历这三个步骤后能够得到proposal的大致位置,但这还不够,为了得到更精确的坐标,你还要利用公式2再反推出这个大致的proposal和真实的ground truth间还有多少偏移量,对这个新的偏移量再来一次回归才是完成了精确的定位。
上面的过程比较绕,反复在偏移量、anchor、ground truth间切换,下面的示意图可以加深理解:


proposal精确位置回归时计算loss的公式和公式3中RPN bounding box regression的loss计算方法完全相同,也用smooth L1方法。

(4)ROI Pooling部分

结构篇:

ROI Pooling做了两件事:1、从feature maps中“抠出”proposals(大小、位置由RPN生成)区域;2、把“抠出”的区域pooling成固定长度的输出。
图6是pooling过程的示意图,feature map中有两个不同尺寸的proposals,但pooling后都是7x7=49个输出,这样就能为后面的全连接层提供固定长度的输入。这种pooling方式有别于传统的pooling,没有任何tensorflow自带的函数能实现这种功能,你可以自己用python写个ROI Pooling的过程,但这样就调用不了GPU的并行计算能力,所以作者的源码里用C++来实现整个ROI Pooling。

 

ROI Pooling过程

                                                                            

释疑篇:

为什么要pooling成固定长度的输出呢?这个其实来自于更早提出的SPP Net,RPN网络提取出的proposal大小是会变化的,而分类用的全连接层输入必须固定长度,所以必须有个从可变尺寸变换成固定尺寸输入的过程。在较早的R-CNN和Fast R-CNN结构中都通过对proposal进行拉升(warp)或裁减(crop)到固定尺寸来实现,拉升、裁减的副作用就是原始的输入发生变形或信息量丢失(图7),以致分类不准确。而ROI Pooling就完全规避掉了这个问题,proposal能完整的pooling成全连接的输入,而且没有变形,长度也固定。

 

早期的网络通过crop或warp来得到固定尺寸的输入

 

源码篇:

lib\roi_pooling_layer目录下文件用来实现ROI Pooling。先来看roi_pooling_op.cc,里面有4个类:

 

roi_pooling_op.cc

 

CPU和GPU版本的具体流程差异不大,只是后者通过CUDA来实现,具体的代码就不贴了,下面一张图里各个参数的名称对应着代码里前向pooling计算时参数的取名(在RoiPoolOp类的Compute()函数中),图中的proposal被分割成7x7个小方块(图中蓝色的小方块),每个蓝色的大小是bin_size_w x bin_size_h ,其中的最大值就是一个pooling的结果,一个proposal共有49个pooling输出。可以对照下图和代码来理解:

 

RoiPoolOp类中前向计算中(Compute()函数)各个参数对应的含义

(5)训练过程

前面介绍了Faster R-CNN的结构,最后看下训练方法,为了便于说明,我们把RPN中的rpn classification和rpn bounding box regression统称为RPN训练;把proposal layer中对proposal精确位置的训练和最终的准确分类训练统称为R-CNN训练。Ross Girshick在论文中介绍了3种训练方法:
Alternating training:RPN训练和R-CNN训练交替进行,共交替两次。训练时先用ImageNet预训练的结果来初始化网络,训练RPN,用得到的proposal再训练R-CNN,之后用R-CNN训练出的参数来初始网络,再训练一次RPN,最后用RPN训练出的参数来初始化网络,最后训练次R-CNN,就完成了全部的训练过程。
Approximate joint training:这里与前一种方法不同,不再是串行训练RPN和R-CNN,而是尝试把二者融入到一个网络内一起训练。这里Approximate 的意思是指把RPN bounding box regression部分反向计算得到的梯度完全舍弃,不用做更新网络参数的权重。Approximate joint training相对于Alternating traing减少了25-50%的训练时间。
Non-approximate training:该方法和Approximate joint training基本一致,只是不再舍弃RPN bounding box regression部分得到的梯度。

本文开头提供的源码使用的是第三种方法,把4个部分的loss都加到了一起来训练,它的速度要更快。

转载自:https://www.jianshu.com/p/ab1ebddf58b1

相关文献:https://www.cnblogs.com/wangyong/p/8513563.html


http://chatgpt.dhexx.cn/article/CNrkxMtJ.shtml

相关文章

MASK RCNN 之RPN

一、RPN网络 1.1 网络结构 RPN结构图 1.2 Anchor锚框生成规则 基于上一步得到的特征图[P2,P3,P4,P5,P6],介绍下MASKRCNN网络中Anchor锚框的生成&#xff0c;根据源码中介绍的规则&#xff0c;与之前的Faster-RCNN中的生成规则有一点差别。 ①遍历P2到P6这五个特征层&#x…

FasterRCNN_rpn

本文代码来自于https://github.com/bubbliiiing/faster-rcnn-pytorch,b站视频https://www.bilibili.com/video/BV1BK41157Vs?p1,本文仅作学习使用 FasterRCNN整体的网络构造 class FasterRCNN(nn.Module):def __init__(self, num_classes, mode "training",feat_…

RPN网络讲解

讲完了anchor机制&#xff0c;接下来我们讲RPN(region proposal network)区域候选网络&#xff0c;它的作用是为了得到候选框。 先看以下内容&#xff1a; faster rcnn结构及代码讲解 原理解释 Feature Map进入RPN后&#xff0c;先经过一次33的卷积&#xff0c;同样&#xff…

RPN架构及其PyTorch实现

RPN&#xff08;Region Proposal Network&#xff09; 引言RPN架构RPNAnchor 生成Proposals 的选择loss 的计算FPN for RPNRPN网络对于正负样本的选择 FPN for Fast R-CNN RPN架构及其Pytorch实现基于RPN产生~20k个候选框~20k个候选框(1)&#xff1a;RPN~20k个候选框(2)&#x…

RPN 模型简要介绍

概述 本文介绍了 Faster R-CNN 目标检测模型中提出的图像候选框提取模型—— RPN 模型&#xff0c;这是一种区域生成网络&#xff0c;结构简单嵌入方便&#xff0c;极大加快了目标检测模型的运行速度&#xff0c;使目标检测模型真正融合到同一个神经网络内&#xff0c;对之后影…

RPN网络代码解读

1. 说在前面的话 在目标检测领域Faster RCNN可以说是无人不知无人不晓,它里面有一个网络结构RPN(Region Proposal Network)用于在特征图上产生候选预测区域。但是呢,这个网络结构具体是怎么工作的呢?网上有很多种解释,但是都是云里雾里的,还是直接撸代码来得直接,这里…

Siam-RPN

Siam-RPN 1. 研究动机&#xff1a; 在Siam-FC中&#xff0c;作者提出的算法首次将孪生网络引入了目标跟踪的领域&#xff0c;实现了端到端的训练&#xff0c;它是一个兼容了速度和精度的算法&#xff0c;在3个尺度变换和5个尺度变换的条件下&#xff0c;跟踪的速率分别达到了…

RPN的深度理解(实现层面)

参考http://www.telesens.co/2018/03/11/object-detection-and-classification-using-r-cnns/ 这是我看过的讲faster rcnn最好的一篇博客了&#xff0c;花了一下午时间看得差不多了&#xff0c;不过他也有些小细节没讲&#xff0c;我这里总结补充一下 另外还有一文读懂Faster R…

Faster RCNN 中的RPN解析

Faster RCNN 中的RPN解析 文章目录 Faster RCNN 中的RPN解析Anchor分类bounding box regressionproposal 参考 RCNN和Fast RCNN中使用Selective Search方法找出所有的候选框&#xff0c;SS方法非常耗时。Faster RCNN中提出RPN(region proposal network)替代SS方法提取候选框&am…

网络模型—RPN

仅作记录&#xff0c;自用 简单来说&#xff1a;输入一张图片&#xff0c;经过骨干网络的特征提取&#xff0c;得到一个m*n的特征图&#xff0c;映射到原图上&#xff0c;将原图划分为m*n个区域&#xff08;每个区域很小&#xff09;&#xff0c;原图的每个区域的中心点由这个…

RPN网络

RPN 思路&#xff1a; 1、先通过conv层pooling层relu层&#xff0c;可以是vgg&#xff0c;得到feature maps。 2、在feature maps上提取对应的图。在第一步基础上&#xff0c;先通过rpn生成region proposals。通过softmax判断anchors&#xff08;9个框&#xff09;&#xff0…

RPN

RPN&#xff08;区域生成网络&#xff09; </h1><div class"clear"></div><div class"postBody">转&#xff1a;懒人元&#xff08;侵删&#xff09; RPN全称是Region Proposal Network&#xff0c;Region Proposal的中文意思是“…

RPN详解

RPN 思路&#xff1a; 1、先通过conv层pooling层relu层&#xff0c;可以是vgg&#xff0c;得到feature maps。 2、在feature maps上提取对应的图。在第一步基础上&#xff0c;先通过rpn生成region proposals。通过softmax判断anchors&#xff08;9个框&#xff09;&#xff0…

RPN 解析

RPN全称是Region Proposal Network,Region Proposal的中文意思是“区域选取”,也就是“提取候选框”的意思,所以RPN就是用来提取候选框的网络; 1. RPN的意义 RPN第一次出现在世人眼中是在Faster RCNN这个结构中,专门用来提取候选框,在RCNN和Fast RCNN等物体检测架构中,…

RPN(区域生成网络)

RPN全称是Region Proposal Network&#xff0c;Region Proposal的中文意思是“区域选取”&#xff0c;也就是“提取候选框”的意思&#xff0c;所以RPN就是用来提取候选框的网络。 1. RPN的意义 RPN第一次出现在世人眼中是在Faster RCNN这个结构中&#xff0c;专门用来提取候选…

RPN简介

RPN全称是Region Proposal Network&#xff0c;Region Proposal的中文意思是“区域选取”&#xff0c;也就是“提取候选框”的意思&#xff0c;所以RPN就是用来提取候选框的网络 文章目录 前言 一、RPN是什么&#xff1f; 二、计算RPN的输入特征图 三、生成Anchors 总结 前言 …

深度学习之 RPN(RegionProposal Network)- 区域候选网络

anchor boxes基本概念与作用: feature map 上的一个点可以映射回输入图片上的一个点&#xff0c;以特征图上这个点为中心&#xff0c;预先人为设定 k 个 boxes&#xff0c;这些 boxes 就称为在这个点上生成的 k 个 anchor boxes&#xff08;所有anchor boxes的中心点坐标是一样…

基于51单片机蓝牙小车

文章目录 接线电机控制模块接线&#xff08;需要额外电源&#xff09;单片机接线 实物图代码相关目录树.c文件main.cSerial.c&#xff08;不会参考我写的串口文章&#xff09;CarTurn.c&#xff08;车的相关操作&#xff09;delay.c .h文件reg51.h&#xff08;keil软件自带&…

51单片机 | 红外遥控实验

文章目录 一、红外遥控介绍1.红外线简介2.红外遥控的原理2.1 红外发射装置2.2 红外接收设备二、硬件设计三、软件设计1.红外初始化函数2.红外解码函数3.主函数四、实验现象这一节来介绍一种无线通信技术–红外遥控通信。我们开发板标配了一个一体化红外接收头和红外遥控器,我们…

基于51单片机手机电话拨号盘模拟proteus仿真

功能简介&#xff1a; 1.采用4X4矩阵键盘实现号码输入&#xff0c;并在LCD液晶上显示 2.按下enter键&#xff0c;显示calling…&#xff0c;并且蜂鸣器模拟电话拨号发声 3.按下*键&#xff0c;退格&#xff0c;按下#键&#xff0c;清楚电话号码 4.拨号过程中&#xff0c;长按#取…