Faster R-CNN详解

2023-11-08

Faster R_CNN代码实现详解参见:faster-rcnn源码详解_樱花的浪漫的博客-CSDN博客_faster rcnn源码

 Faster-rcnn详细注释版源码地址:faster_rcnn源码详细注释版+每一步均有详细批注-深度学习文档类资源-CSDN下载

1.FASTER R-CNN改进层面

        Fast R-CNN算法相对于R-CNN有了很大的改进:一方面,一张图像上的各个候选框共享特征;另一方面,类别预测和位置回归在一个前向推理阶段完成。这两点使得检测算法的速度有了显著提升。但是,候选框的生成和后面的前向推理还是两个独立的处理过程,两个过程的衔接成了制约检测流程的瓶颈。本节介绍的Faster R-CNN方法正是针对这一瓶颈进行了改进,使得整个目标检测过程构成一个端到端的完整流程。
        基于候选框的算法,比如Selective Search等,都基于CPU进行计算,无法利用GPU的高并行性进行加速,而基于神经网络的方法,则可以充分利用GPU并行计算的优势,极大地提升了算法速度。如果能够通过神经网络的方法提取候选框,就可以更进一步地提升整个算法的执行速度。Faster R-CNN就是基于这个思路,将一个全卷积网络作为候进框提取网络(Region Proposal Network,RPN),来提取各种尺度和宽高比的候连框。为了更进一步地提升效率,后续的目标检测算法和RPN网络共享卷积特征,使得整个检测过程更加流畅,整体速度得到了显著提升。
        Faster R-CNN算法由两个主要的模块组成,如图所示,第一个模块是用于提取候选框的全卷积网络(RPN),第二个模块是基于候选框的Fast R-CNN目标检测器。整个检测过程通过一个网络完成。Faster R-CNN使用了所谓的关注(attention)机制,RPN模块告诉Faster R-CNN需要关注哪里。

 2 候选框提取网络


        候选框提取网络(RPN)其实是一个全卷积网络,以任意大小的图像作为输入,输出一系列候选框以及每个候选框对应的分数值,这个分数值用于衡量候选框框中目标的概率。为了提升算法的整体速度,Faster R-CNN在设计上采用了RPN和FastR-CNN共享部分卷积特征的方式。
为了生成候选框,Faster R-CNN使用一个卷积网络在共享特征的最后一层特征图上进行滑窗操作每次滑窗,在特征图上截取nxn×d大小的特征块(其中n表示滑窗卷积网络输入窗口的宽和高,d表示共享卷积特征最后一层特征图的通道数),经过滑窗卷积网络后输出一个低维特征,并分别送入两个并列的全连接层,其中一个全连接层用于分类,判断当前滑窗对应的图像区域是否包含目标,另一个全连接层用于回归候选框的位置,判断当前候选框相对于当前滑窗所对应图像区域的位置偏移量及缩放尺度。很显然,这一计算过程可以通过先在原先的卷积层之后加入新的与滑动窗口大小相匹配的卷积层,再并联两个全连接层的网络结构来实现。滑窗卷积网络选取n=3,共享卷积网络为ZF网络时,滑窗卷积网络对应的输出为256维,共享卷积网络为VGG16时,滑窗卷积网络对应的输出为512维,并以ReLU作为卷积网络最终输出的激活函数。在共享卷积特征的最后一层特征图上,每个特征都有很大的感受野,共享卷积网络为ZF网络时,对应的感受野为171像素×171像素,共享卷积网络为VGG16时,对应的感受野为228像素×228像素。


1.锚


        在每个滑窗位置,会同时预测多个候选框。假设需要预测的候选框的个数为k,则用于回归候选框位置的全连接层(回归层)有4k个输出,分别是规范化的水平方向及垂直方向的位置偏移量和缩放尺度;用于类别判别的全连接层(分类层)有2k个输出,分别是当前预测框框中目标或未框中目标的概率。这k个待预测的候选框中,每一个框的偏移和缩放都基于一个固定的参考框。k个待预测框对应k个参考框,每个参考框相对于滑窗的感受野的位置都是固定的,即都有固定的大小和宽高比。这样的参考框,我们称之为锚(anchor)。对于任意一个滑窗位置,各个锚的中心点和滑动窗口在原图上感受野的中心点重合设定若干锚需要取到的面积尺度和宽高比,则对于每个滑窗位置,错的个数都是固定的(比如,面积设定为128、256和512 3个尺度,宽高比设定为1:1、1:2和2:1,则每个滑窗位置对应3×3=9个锚)。通常情况下,每个滑窗位置会设置3个面积尺度和3个宽高比,如图8-8所示,每个滑窗位置包含k=3×3=9个锚,如果一个特征图的宽和高分别为W和H,则总的锚个数为WxHxk。
        这种定义锚的方法有一个显著特征:检测结果相对于目标在图像中的位置具有平移不变性。道理很简单,在原始图像上,如果一个目标可以被某个滑窗位置对应的一个锚框中,把该目标平移到图像中的另一个位置后,也能够被另一个滑窗位置对应的锚框中。

        为了提升检测算法的尺度鲁棒性,有两种思路:一种是使用原始图像金字塔/特征图像金字塔,算法在金字塔的每一层进行检测;另一种是使用多尺度滑动窗口,分别在原始图像/特征图像上进行滑窗计算。基于锚的方法是第三种用于提升算法尺度鲁棒性的思路,其本质就是使用不同尺度的锚覆盖图像区域,使得不同尺度的目标有更多被框中的机会。这种方法仅仅基于原始的图像/特征图像,相比前两种方法,计算开销更少。


2.损失函数


        在训练候选框提取网络的时候,锚被分成两类,框中目标的锚被标记为正样本(positive),未框中目标的锚被标记为负样本(negative)。所谓正样本,是通过锚与真值相交的情况来定义的,具体而言,基于两种方式实现。对于每一个真值,所有锚与这个真值要么相交,要么不相交,在相交的情形中:与这个真值有最大交并比的那个错标记为正样本;与这个真值的交并比>0.7的那些锚也标记为正样本。所谓负样本,指的是与所有真值的交并比<0.3的锚。除此之外的其他情况的锚不需要标记,在模型训练的过程中不会被使用。
基于这样的定义,可以给出RPN损失函数的公式:

         这里,i是一个小批中的一个锚的索引,p_{i}是锚i是一个对象的预测概率。如果锚为正,地面真实标签p_{i}^{*}为1,如果锚为负,则为0。t_{i}是表示预测边界框的4个参数化坐标的向量,t_{i}^{*}是与正锚相关的地面真实框的向量。分类损失L_{cls}是两个类(对象与不是对象)的日志损失。对于回归损失,我们使用,其中R是[2]中定义的稳健损失函数(平滑L1)。术语意味着回归损失仅对正锚点被激活(p_{i}^{*}=1),否则将被禁用(p_{i}^{*}=0)。cls层和reg层的输出分别由{pi}和{ti}组成。 

        这两项用Ncls和Nreg归一化,并用平衡参数λ进行加权。在我们当前的实现中(如在已发布的代码中),Eqn中的cls术语。(1)由小批大小(即Ncls=256)归一化,而reg项由锚定位置的数量(即Nreg∼2,400)归一化。默认情况下,我们设置了λ=10,因此cls和reg项的权重大致相等。我们通过实验表明,结果在很大范围内对λ的值不敏感(表9)。我们还注意到,上述的标准化是不需要的,可以进行简化。

3.训练候选框提取网络


        训练候选框提取网络仍然采用随机梯度下降法(SGD),为了提升训练速度,每个训练批次的锚都来自同一图像上的随机采样。一般情况下,随机选取锚在概率上会比较偏向未框中目标,为了保证训练样本的均衡,需要人为地尽量保持框中目标的锚(正样本)与未框中目标的锚(负样本)在数量上保持1:1的比例。比如一个小批次如果包含256个锚,就要求这256个锚中,有128个为正样本,另外128个为负样本,当实际情况下确实无法选到128个正样本时,再使用负样本补齐差额。
实际训练时,一个常用的做法是基于ImageNet进行预训练。对于新增的网络层,一般使用均值为0,标准差为0.01的高斯分布进行初始化,然后对整个网络基于新的样本数据进行调优训练。

2 RPN和Fast R-CNN共享特征的方法


        在检测过程中,RPN的作用是输出候选框,Fast RCNN的作用是基于候选框进行目标检测,两个网络的训练和预测过程目前彼此独立。为了更进一步地提升算法的整体效率,可以让这两个网络共享基础的卷积特征,然后设计另一个一致网络来处理候选框提取和目标检测这两个过程。为了实现这个目标,可以采取如下3种方法。
1.交替训练法
        先训练RPN,然后基于RPN输出的候选框,以RPN的卷积层参数作为初值训练Fast R-CNN,再用Fast R-CNN的卷积层参数作为初值训练RPN。如此反复迭代,得到共享基础卷积层的RPN和Fast R-CNN。交替训练法在实际应用过程中,大致分为4个步骤:第一步,基于ImageNet的预训练模型,端到端地训练用于提取候选框的RPN;第二步,同样基于ImageNet的预训练模型,使用第一步RPN输出的候选框,训练Fast R-CNN,此时RPN和Fast R-CNN两个网络尚无共享的卷积层;第三步,使用Fast R-CNN初始化RPN,在训练RPN的时候,固定底层共享的卷积层网络参数,仅迭代调优RPN中共享卷积层以外的网络参数;第四步,训练FastR-CNN,同样固定底层共享的卷积层网络参数,仅迭代调优Fast R-CNN中共享卷积层以外的网络参数。通过上述4个步骤,就得到了一个统一的共享底层卷积特征的用于目标检测的整体网络。上述交替训练的过程可以重复多次,但实验表明,多次迭代对最终的算法性能并没有明显的提升。
2.近似联合训练法
        训练网络的时候,将RPN和Fast R-CNN合并在一起,共用底层的卷积层。每次SGD迭代,网络前向传播预测的候选框被视为固定的,用作训练Fast R-CNN的候选框。反向传播时,共享的卷积层将RPN和Fast R-CNN回传的梯度相融合,使用融合后的梯度进行网络参数更新。虽然这种方法实现起来比较容易,但只是一种近似的处理,各个候选框的坐标其实也是变量,也需要参与反向传播的求导过程。在实际实验中,通过近似联合训练法可以得到与交替训练法近似的结果,但耗费的时间只有交替训练法的25%~50%,因此也是一种经常被采用的方法。


 

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

Faster R-CNN详解 的相关文章

随机推荐

  • javax.validation.constraints注解

    文章目录 概要 常用的注解 其他注解 小结 概要 javax validation constraints是Java Validation API中的一个包 它提供了一组注解 用于在Java代码中进行数据校验和验证 该包中定义了多个注解 用
  • LR(1)分析表-语法树-四元式

    这学期的编译原理终于学完了 不愧是号称最难的科目 要用C 从头到尾实现一下小型编译器 还真不容易啊 不过总算是做完了 首先上文法 这个文法是根据上一篇博客简化的 但还是有一点问题的 暂时发现有一个地方不符合LR1的规则 函数的返回类型如果是
  • 【ACOUG】Oracle技术爱好者的乐园

    ACOUG 的含义为 All China Oracle User Group http www acoug org 该组织是为了更好的提供一个Oracle用户的交流和活动平台 组织和发起一些公益性质的活动 这个组织是Eygle和Kamus发
  • 简单文件数据库-模拟图书馆管理系统-西安电子科技大学大一程序基础设计课程设计作业

    命令行参数如下 Libsim a u xxxx 第一个参数为可执行程序名称 第二个参数为用户身份 a表示管理员 u表示读者 第三个参数为用户名 问题分析 由于无法直接在文件中插入数据 不是简单覆盖 固采用将文件数据提取为链表的方法 对链表进
  • Spring源码系列:Bean的加载

    Spring源码系列 Bean的加载 前言 一 Bean的加载 1 1 FactoryBean的使用 案例 FactoryBean的使用和定义 1 2 缓存中获取单例Bean 1 2 1 Spring解决循环依赖的原理 1 以A类的角度来观
  • 中间件Redis简介

    Redis概述 什么是redis Redis是一种支持key value等多种数据结构的高速缓存数据库 用C语言编写 可以用于缓存 事件发布和订阅 高速队列等场景 提供字符串 哈希 列表 队列 集合直接存存取 基于内存 可以持久化 为什么要
  • DeFi撑爆以太坊基础设施,近1亿美元BTC已进入以太坊生态

    编译 隔夜的粥 以太坊和DeFi在过去几个月里经历了爆炸性的增长 这已经不是什么秘密了 在过去2 3周里 它们已达到了一个全新的水平 各种应用的使用量增长如此之快 以至于给以太坊主要基础设施提供商TheGraph带来了巨大压力 导致其支持的
  • C中字符串操作

    字符串可以看作一个数组 它的每个元素是字符型的 例如字符串 Hello world n 图示如下 H e l l o w o r l d n 0 15个字符 注意每个字符串末尾都有一个字符 0 做结束符 这里的 0是ASCII码的八进制表示
  • 初识运营,明晰运营的学习路径

    关于运营的思考 问题1 运营是什么 运营到底是做什么工作的 如题 到底什么是运营 为什么我们所接触到的很多运营都不太一样 有的运营就是每天追寻互联网热点 加班加点的写文案 有的运营每天就是在不同的群里和成千上万的人唠嗑 有的运营活跃在不同的
  • html获取text输入框中的值

    1 在head中引用jquery 2 定义一个text输入框
  • 指针用作函数参数、指针型函数和函数指针

    指针用作函数参数 以前我们学过的函数参数要么是基本数据类型的变量 要么是类的对象 又或者是数组名 前几讲学到的指针同样可以用作函数参数 指针作函数形参时 我们调用此函数将实参值传递给形参后 实参和形参指针变量将指向相同的内存地址 那么在被调
  • Linux主要命令功能

    1 dmesg 主要用来显示内核信息 使用dmesg可以有效诊断机器硬件故障或者添加硬件出现的问题 另外使用dmesg可以确定你的服务器安装了那些硬件 每次系统重启 系统都会检查所有硬件并将信息记录下来 执行 bin dmesg命令可以查看
  • 第十届蓝桥杯真题-灵能传输

    题目 OJ https www lanqiao cn problems 196 learning 考点 前缀和 贪心 思路 题目意思就是希望通过灵能交换后使得不稳定度最小 假设对a i 进行灵能传输 可以发现前缀和s i 1 和s i 进行
  • Java值传递和引用传递详细说明(详细分析)

    1 形参与实参 我们先来重温一组语法 形参 方法被调用时需要传递进来的参数 如 func int a 中的a 它只有在func被调用期间a才有意义 也就是会被分配内存空间 在方法func执行完成后 a就会被销毁释放空间 也就是不存在了 实参
  • FormData同时传输多个文件和其他数据

    近日有个需求是 在web的对话框中 用户可以输入文本内容和上传附件 附件的数量不限 所有附件总和大小不超过20M 这个实现的方法不止一种 比如之前的后端同事是要求 文件和文本分开传输 文件用一个单独接口上次 上传成功后返回一个id 把这个i
  • 【论文翻译】Iterative Geometry Encoding Volume for Stereo Matching and Multi-View Stereo(CVPR 2023)

    一 论文简述 1 第一作者 Gangwei Xu 2 发表年份 2023 3 发表期刊 CVPR 4 关键词 立体匹配 MVS 几何编码体 GRU 3D卷积 5 探索动机 RAFT的全对相关体缺乏非局部几何知识 难以处理病态区域的局部模糊
  • perp系列之五:perp安装

    perp系列之五 perp安装 版本说明 版本 作者 日期 备注 0 1 ZY 2019 5 29 初稿 目录 文章目录 perp系列之五 perp安装 版本说明 目录 概要 描述 激活 升级 例子 概要 vi conf mk make m
  • Vmware虚拟机设置静态IP地址

    一 安装好虚拟后在菜单栏选择编辑 虚拟网络编辑器 打开虚拟网络编辑器对话框 选择Vmnet8 Net网络连接方式 随意设置子网IP 点击NAT设置页面 查看子网掩码和网关 后面修改静态IP会用到 二 检查宿主机VM8 网卡设置 打开网络和共
  • 欧科云链OKLink:2023年6月安全事件盘点

    一 基本信息 2023年6月REKT和RugPull事件约造成约1000万美元损失 相比上月有显著下降 但安全事件发生数量依旧不减 其中被废弃的Atlantis Loans遭受治理攻击 造成的损失超250万美元 对该协议有过授权的用户需及时
  • Faster R-CNN详解

    Faster R CNN代码实现详解参见 faster rcnn源码详解 樱花的浪漫的博客 CSDN博客 faster rcnn源码 Faster rcnn详细注释版源码地址 faster rcnn源码详细注释版 每一步均有详细批注 深度学