【深度学习】:Faster RCNN论文详解

2023-05-16

Faster RCNN详解

Faster RCNN 是在Fast RCNN的基础上,进一步改进,解决select search 算法选择候选框速度太慢的问题。

Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
submit time: 2016
arxiv link

fast R-CNN和faster R-CNN之间的区别在于我们不使用特殊区域提议方法来创建region proposal。而是训练一个region proposal network(RPN)该网络将features map 作为输入并输出region proposals。然后将这些proposal输入Fast R-CNN中的RoI池化层。以下是fast RCNN与Faster RCNN的网络结构对比图。

structure

由于frcnn的网络结构主要是两个网络组成,损失函数分为四个部分。

  1. RPN分类损失:anchor是否为gt
  2. RPN位置回归损失:anchor位置微调
  3. ROI分类损失:ROI所属类别
  4. ROI位置回归损失:继续对ROI位置微调

四个损失相加就是最后的损失,反向传播,更新参数。

Faster RCNN 关键步骤:

  • Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
  • Region Proposal NetworksRPN网络用于生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用bounding box regression修正anchors获得精确的proposals
  • Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
  • Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

Faster RCNN 网络是用于目标检测的一种比较流行的框架。它主要由以下四个部分组成:

  • 分别是conv layer 输入为原始图片,用于提取图片的feature map;
  • RPN网络,输入为features map,用于生成region proposal,该层为features map 上每个像素生成若干个anchors(9个),随后通过softmax 判断每个anchor是属于foreground(目标)或者background(背景),再利用bounding box regression修正anchors获得精确的proposal位置;
  • RoI pooling,该层输入为proposal位置信息和features map,通过proposal的位置信息在features map 上提取region features map候选区,然后通过pooling产生一个固定长度的特征,送入全连接层进行目标判别;
  • classification,利用proposal feature maps计算proposal的类别,同时再次进行一次bounding box regression,对proposal位置进行精修,随后将结果输出。

总结一套介绍网络框架的先后顺序的方法。

可以先大后小,按照先后顺序从前到后,按功能性介绍一件事情,每件事情的功能介绍的时候,说清楚输入,工作流程附带其具体功能,输出。

Faster RCNN 详细网络结构如图:

faster rcnn structure

将一副任意大小PxQ的图像,首先缩放至固定大小MxN,然后将MxN图像送入网络;而卷积层 Conv layers中包含了13个conv层+13个relu层+4个pooling层RPN网络首先经过3x3卷积,再分别生成foreground anchors与bounding box regression偏移量,然后计算出proposals;而Roi Pooling层则利用proposals以及feature maps,提取proposal feature送入后续全连接和softmax网络作classification。

conv layer

VGG

Conv layers部分共有13个conv层,13个relu层,4个pooling层。

  • 所有的conv层都是: kernel_size=3 , pad=1 ,stride=1,因此conv层不改变原图大小
  • 所有的pooling层都是: kernel_size=2 ,pad=0 , stride=2,pooling 层将原图缩小为原来的一半
  • 经过Conv layer后,一个MxN大小的矩阵将变为(M/16)x(N/16)

Region Proposal Networks(RPN)

Faster RCNN 层在fast RCNN 的基础上,对提取候选框进行优化。

RPN
RPN

RPN网络分为2条线,上面一条通过softmax分类anchors获得foreground和background(检测目标是foreground),下面一条用于计算anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合foreground anchors和bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。

anchors

anchor为由一个中心点,周围生成了9个矩形,矩形长宽比由三个尺寸1:1,1:2;2:1三种,如下图,基本覆盖了各种尺寸和形状,引入检测中常用到的多尺度方法。

anchors

 

Faster RCNN遍历Conv layers计算获得的feature maps,为feature map上每一个点都配备这9种anchors作为初始的检测框。这样做获得检测框很不准确,之后将会在RPN层,以及最后进行2次的bounding box regression修正检测框位置。

如上图,对于每一个点的k个anchor来说,从conv layer提取出得特征具有256维,对于每一个anchor,需要分foreground与background,因此共有2k个score,对于每一个anchor共有 (x1,y1,x2,y2) 四个坐标值。因此共有4k个coordinates。在训练阶段,程序将会从这些anchor中挑选出一些合适的anchor进行训练。
因此RPN最终就是在原图尺度上,对每一个像素设置9个尺度的候选anchor。然后用cnn去判断哪些Anchor是里面有目标的foreground anchor,哪些是没目标的backgroud。所以,仅仅是个二分类而已!

那么Anchor一共有多少个?原图800x600,VGG下采样16倍,feature map每个点设置9个Anchor,所以:
ceil(800/16) \times ceil(600/16) \times 9 = 50 \times 38 \times 9 = 17100

其中ceil()表示向上取整,是因为VGG输出的feature map size= 50*38。

generateAnchor

softmax判定foreground与background

RPN网络中利用anchors和softmax初步提取出foreground anchors作为候选区域。

softmax
softmax


features map 首先做一个1*1的卷积,这个卷积的作用是生成一个 W*H*(9*2) 大小的矩阵。该矩阵用于存储上面提到的foreground与background信息(2*k score)。将该特征后接softmax分类获得foreground anchors,也就相当于初步提取了检测目标候选区域box(一般认为目标在foreground anchors中)。前后两个reshape 操作目的为便于程序实现。
clc layer输出预测区域共k个,每个有的2个参数,即预测为前景的概率和背景的概率,损失用softmax loss(cross entropy loss)。监督信息是Y=0,1,表示这个区域是否为groundtruth。确定groundtruth时,我们需要确定k个区域中的各个区域是不是有效的,是前景还是背景。
K个区域分配标签规则:

  • 与某个ground truth(GT)的IoU最大的区域的分配正标签
  • 与任意GT的IoU大于0.7的区域分配正标签
  • 与所有GT的IoU都小于0.3的区域分配负标签

bounding box regression原理

对于窗口一般使用四维向量 (x, y, w, h) 表示,分别表示窗口的中心点坐标和宽高。对于图 11,红色的框A代表原始的Foreground Anchors,绿色的框G代表目标的GT,我们的目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G’,即:

bbox
bbox

 

那么经过何种变换F才能从图10中的anchor A变为G’呢? 比较简单的思路就是先做平移,然后进行缩放,边框回归与RCNN中边框回归相同。bounding box 原理参考链接
RPN中所涉及的边框回归首先经过一个1*1的卷积层,输出一个 W * H * (9 * 4) 的矩阵,用于存储box的坐标信息(4k coordinate)
 

rpnbox

RPN值得注意的地方:

  • - RPN在原图的尺度上选择anchor的大小
  • - anchor的数目是feature map上每个像素选择9个长宽比不同的矩形
  • - soft Max层用于判断anchor是否为前景(含有目标)
  • - bounding box regression 预测的输出是anchor的偏移变换
  • - proposal层,结合前景的anchor(背景anchor被忽略)与anchor偏移变换,对anchor位置进行调整,计算出proposal的精确位置。
  • - bounding box 本质上是学习一个W权重矩阵,即那个1*1的网络的参数(输出为4K regreason,对应anchor的(x,y,w,h)四个偏移),利用W参数乘以 CNN pool5层输出的features map,通过最小二乘,得到anchor的偏移。
  • - 为什么bounding box regression不直接预测坐标呢? 因为坐标间的关系不是简单的一维关系,难以优化。当anchor 与 ground truth比较接近时,他们之间的位置关系(偏移)就可以用一维关系来近似。
  • - proposal层输出的proposal坐标是在原图的尺度上的proposal坐标。

proposal layer

RPN 最后一层为proposal layer,用于前景anchors,以及anchor对应的边框回归微调参数[d_x(A), d_y(A),d_w(A) , d_h(A)] 和 im\_info=[M, N, scale_factor](传入Faster RCNN前首先reshape到固定MxN,im_info则保存了此次缩放的所有信息)来计算产生的proposal位置,此时输出的proposal坐标为原图尺度上的proposal坐标

Proposal Layer forward(caffe layer的前传函数)按照以下顺序依次处理:

  • 生成anchors:利用 [d_x(A), d_y(A),d_w(A) , d_h(A)] 对所有的anchors做bbox regression回归(这里的anchors生成和训练时完全一致)
  • - 按照输入的foreground softmax scores由大到小排序anchors提取前pre_nms_topN(e.g. 6000)个anchors,即提取修正位置后的foreground anchors。
  • 限定超出图像边界的foreground anchors为图像边界(防止后续roi pooling时proposal超出图像边界)
  • 剔除非常小(width<threshold or height<threshold)的foreground anchors
  • 进行nonmaximum suppression
  • 再次按照nms后的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)结果作为proposal = [x1, y1, x2, y2]输出。
  • 输出的proposal=[x1, y1, x2, y2],由于在第三步中将anchors映射回原图判断是否超出边界,所以这里输出的proposal是对应MxN输入图像尺度的
  • RPN网络结构主要步骤如下:
  • 生成anchors -> softmax分类器提取前景 anchors -> bbox reg回归前景 anchors -> Proposal Layer生成proposals

RoI pooling layer

RoI Pooling layer负责收集proposal,并计算出proposal feature maps,送入后续网络。Rol pooling层有2个输入:

  1. - 原始的feature maps
  2. - RPN输出的proposal boxes(大小各不相同)

RoI Pooling layer forward过程:

  • - 由于proposal是对应 M \times N 尺度的,所以首先使用spatial_scale参数将其映射回 (M/16) \times (N/16) 大小的feature map尺度;
  • - 再将每个proposal对应的feature map区域水平分为 pooled_w×pooled_hpooled_w×pooled_h的网格;
  • - 对网格的每一份都进行max pooling处理。

经过上述处理后,即使大小不同的proposal输出结果都是 pooled_w×pooled_hpooled_w×pooled_h 固定大小,实现了固定长度输出。

Classification

 

Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。
 

classfication

从PoI Pooling获取到7x7=49大小的proposal feature maps后,送入后续网络,可以看到做了如下2件事:

  • - 通过全连接和softmax对proposals进行分类
  • - 再次对proposals进行bounding box regression,获取更高精度的rect box
     

 Faster R-CNN训练

Faster R-CNN的训练,是在已经训练好的model(如VGG_CNN_M_1024,VGG,ZF)的基础上继续进行训练。实际中训练过程分为6个步骤:

  • 在已经训练好的model上,训练RPN网络
  • 利用步骤1中训练好的RPN网络
  • 第一次训练Fast RCNN网络
  • 第二训练RPN网络
  • 再次利用步骤4中训练好的RPN网络
  • 第二次训练Fast RCNN网络

可以看到训练过程类似于一种“迭代”的过程,不过只循环了2次。至于只循环了2次的原因是应为作者提到:”A similar alternating training can be run for more iterations, but we have observed negligible improvements”,即循环更多次没有提升了。
 

train

RPN训练

与检测网络类似的是,依然使用Conv Layers提取feature maps。整个网络使用的Loss如下:

L(p_i, t_i) = \frac{1}{N_{cls}}\sum _i {L_{cls}(p_i, p_i^*)} + \lambda \frac {1} {N_{reg}} \sum _i {p_i^*L_{reg}(t_i, t_i^*)}

上述公式中 i 表示anchors index, p_i 表示foreground softmax probability,p_i^* 代表对应的GT predict概率(即当第i个anchor与GT间IoU>0.7,认为是该anchor是foreground,p_i^* = 1;反之IoU<0.3时,认为是该anchor是background,p_i^* = 0;至于那些0.3<IoU<0.7的anchor则不参与训练);t代表predict bounding box,t^* 代表对应foreground anchor对应的GT box。可以看到,整个Loss分为2部分:

- cls loss,即rpn_cls_loss层计算的softmax loss,用于分类anchors为forground与background的网络训练
- reg loss,即rpn_loss_bbox层计算的soomth L1 loss,用于bounding box regression网络训练。注意在该loss中乘了 p_i^* ,相当于只关心foreground anchors的回归(其实在回归中也完全没必要去关心background)。

Smooth L1 loss 相比于L2 loss对离群点更加不敏感,更加鲁棒。当预测值与目标相差很大时,L2 loss的梯度是x-t,容易产生梯度爆炸,而L1的梯度为常数,使用L1 loss 可以防止梯度爆炸。

关于softMax loss 和 边框回归loss与fast RCNN 相同。链接

参考资料:

https://perper.site/%2F2019%2F02%2F14%2FFaster-RCNN%E8%AF%A6%E8%A7%A3%2F

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【深度学习】:Faster RCNN论文详解 的相关文章

  • 哈佛大学提出变分注意力:用VAE重建注意力机制

    注意力 attention 模型在神经网络中被广泛应用 xff0c 不过注意力机制一般是决定性的而非随机变量 来自哈佛大学的研究人员提出了将注意力建模成隐变量 xff0c 应用变分自编码器 xff08 Variational Auto En
  • 助力自动驾驶商业化 高德公布高精地图技术路线图

    在以 驶向未来 为主题的汽车专场论坛上 xff0c 高德地图首次对外界展示了基于高精地图和高精定位的一体化解决方案的实际定位效果 xff0c 并宣布了未来高德在高精地图技术上的发展路线图 助力自动驾驶商业化 高德公布高精地图技术路线图 7
  • 消息队列技术点梳理(思维导图版)

    消息队列作为服务 应用之间的通信中间件 xff0c 可以起到业务耦合 广播消息 保证最终一致性以及错峰流控 xff08 克服短板瓶颈 xff09 等作用 本文不打算详细深入讲解消息队列 xff0c 而是体系化的梳理消息队列可能涉及的技术点
  • (1)XTDrone环境配置笔记——从安装VMware开始

    本笔记主要参考文章 xff1a https www yuque com xtdrone manual cn basic config 2qN28 自己整理 xff0c 从个人笔记中移植过来 xff0c 如有问题 xff0c 欢迎讨论 目录

随机推荐

  • 编译android7.1源码环境的配置以及中途可能出现问题的总结

    在项目要求将apk文件打包到安卓系统7 1出了一大堆问题 xff0c 由于我是windows10系统 xff0c 所以在电脑上装了个virtualbox虚拟机 xff0c 并且装上了ubuntu 18 04 2 接下来就是在这个虚拟机系统上
  • Ubuntu 创建开机自启动脚本

    由于在ubuntu上面跑了很多服务 xff0c 每次开机都需要自己手动去启动服务太麻烦 下面记录一下开机自启动脚本的编写 xff0c 以便往后查阅 1 适用系统Ubuntu18 ubuntu20 2 切换到etc目录 cd etc 3 创建
  • 关于合法的出栈顺序

    可以按照下面的方法来判断的 xff1a 假如入栈顺序为1234 xff0c 给定一个出栈序列 xff0c 如2431 xff0c 它是合法的 因为对于出栈序列中的每一个数字 xff0c 在它后面的 比它小的所有数字 xff0c 一定是按递减
  • 增量测试:自顶向下测试&自底向上测试

    本博客主要内容 xff1a 自顶向下测试和自底向上测试的优缺点 xff1b 软件开发周期流程 xff1b 不同的测试方法针对不同的测试阶段 一 自顶向下测试 xff1a 优点 xff1a 1 如果主要的缺陷发生在程序的顶层将非常有利 2 一
  • 局域网 Ubuntu 16.04.4 安装 Docker 18.06.0-ce 笔记

    局域网内搭建Ubuntu环境下的Docker Engine 17 06 0 43 Docker Compose 1 14 0 43 的环境运行项目 网上查找到很多方法 xff0c 但是安装总有报错 解决报错办法 xff1a 一 下载了doc
  • oracle监听器日志过大-处理办法

    原则是lsnrctl status xff0c 找到日志文件位置 xff0c 就是给你看的那些信息中的log file xff0c 删除即可 但是监听器在运行状态下 xff0c 无法删除 办法1 xff1a 将监听器stop xff0c 然
  • 网络——IPV4地址(二)

    划分子网的IPv4地址 在IP地址中增加一个 子网号字段 xff0c 使得两级IP地址变成三级IP地址 这种做法称为子网划分 三级IP地址结构如下 xff1a IP地址 61 lt 网络号 gt lt 子网号 gt lt 主机号 gt 子网
  • 创建一个基于WebPacket的TypeScript项目【一】

    创建一个基于WebPacket的TypeScript项目 安装node js环境建立目录结构在 96 templates 96 目录新建 96 template index html 96 并写入 安装VSCode创建一个NPM项目确认 安
  • 记一次grpc arm-hisiv400-linux交叉编译

    时间紧 xff0c 先大概说明一下 xff0c 有时间了再补充详细的说明 grpc 交叉编译 需要先编译出pc版的protobuff 和 grpc xff0c 安装到指定的路径 xff0c 在做交叉编译时需要protoc 和grpc cpp
  • SDN协议与SD-WAN中使用的协议相比有何差别?

    通过建立在物理网络上方抽象的虚拟网络 xff0c 软件定义的网络可实现更灵活的网络管理和操作 代替在硬件级别编程的物理网络设备来驱动网络控制 xff0c 软件定义网络 SDN 引入了一个软件驱动的控制器来处理这些任务并使变更能够实时进行 x
  • SDN和SD-WAN的概念别再搞混了—Vecloud微云

    最近 xff0c SD WAN在融资领域是一个比较热的话题 国外几家SD WAN的头部企业不断地获得融资 xff0c 也包括被思科 VMware等巨头收购和兼并 xff0c 国内创业公司推出了各种SD WAN产品和解决方案 不得不说 xff
  • SDN和SD-WAN有本质区别—Vecloud微云

    作为软件定义网络 xff08 SDN xff09 技术中的一个细分 xff0c 软件定义广域网 xff08 SD WAN xff09 无疑是从2015年到现在企业级广域网布局中最热门的技术之一 SDN SDN旨在支持局域网 xff08 LA
  • 企业MPLS专线的价格及计费方式——微云专线

    企业MPLS专线的费用 MPLS最大技术特色为可以指定资料包传送的先后顺序 xff0c 提供优质增值服务 xff0c 如 xff1a 差别服务 Diff serv 服务级别 CoS 和服务质量 QoS 等 因为MPLS整合了第三层路由和第二
  • 网络专线MPLS配置原理

    MPLS最早的意思是让中间设备只是查找一个表 xff0c 这样就可以相对更快地工作 xff0c 随着CPU运算能力的不断提高 xff0c 包的交换方式从原始到传统 一次路由多次交换 xff0c 最后再到快速的CEF数据交换方式 xff0c
  • 什么是BGP,BGP的优点有哪些?-Vecloud

    什么是BGP 边界网关协议 BGP 是运行于 TCP 上的一种自治系统 AS 的路由协议 xff0c 是唯一能够妥善处理不相关路由域间的多路连接的协议 通俗点讲 中国电信 中国联通 中国移动和一些拥有AS自治域的大型民营IDC运营商就可以通
  • 从linux接入到windows远程桌面

    Windows 提供了一种远程桌面系统 xff0c 可使用户远程登录进行系统管理或作为终端服务器运行各种应用软件 要连接Windows远程桌面 xff0c 需在Windows客户端安装 相应的软件 xff08 tsclient xff09
  • ssh命令使用总结

    前言 为了安全起见 xff0c 公司服务器只给开放了一个ssh端口其他服务器通过跳板机登录 xff0c 这样难免会造成一些不便 xff0c 但是ssh总体还比较强大 xff0c 可以通过配置 xff0c 方便容易的进行登录 也可以通过端口转
  • **matlab subs函数**

    matlab subs函数 matlab中subs 是符号计算函数 xff0c 表示将符号表达式中的某些符号变量替换为指定的新的变量 xff0c 常用调用方式为 xff1a subs S OLD NEW 表示将符号表达式S中的符号变量OLD
  • Python爬虫库推荐,建议收藏留用

    很多人学Python xff0c 都是从爬虫开始的 xff0c 毕竟网上类似的资源很丰富 xff0c 开源项目也非常多 Python学习网络爬虫主要分3个大的版块 xff1a 抓取 xff0c 分析 xff0c 存储 当我们在浏览器中输入一
  • 【深度学习】:Faster RCNN论文详解

    Faster RCNN详解 Faster RCNN 是在Fast RCNN的基础上 xff0c 进一步改进 xff0c 解决select search 算法选择候选框速度太慢的问题 Faster R CNN Towards Real Tim