讲解 Faster R_CNN原理:

2024-06-17 07:44
文章标签 faster cnn 讲解 原理

本文主要是介绍讲解 Faster R_CNN原理:,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Fast R-CNN改进

上图为论文中的图片

         先使用CNN网络获得整体的特征图:这里可以卷积共享,加快速度

        然后将原图中的Region Proposals(区域)映射到Feature Map中,获得一系 列RoI(感兴趣区域)

        然后不再对每个RoI分别进行分类回归,而是通过类似SPP的RoI Pooling层 将不同大小的RoI汇集成相同大小,这样就可以用全连接层了,最后做分类回归

        Fast R-CNN实现了end to end 模式(除了使用Selective Search搜索RoI)

        端到端:除了输入和输出,所有中间计算都在神经网络中完成

         图为几种网络训练耗时和测试耗时对比图 ,显然,卷积共享的确能大幅降 低时耗

        从Test time中可以看出,寻找Region Proposals是另一个秒级别的时耗

Faster R-CNN 的三个组成部分思路包括:

1)基础特征提取网络

        ResNet,IncRes V2,ResNeXt 都是显著超越 VGG 的特征网络,当然网络的改进带来的是计算量的增加。

2)RPN

        通过更准确地 RPN 方法,减少 Proposal 个数,提高准确度。

3)改进分类回归层

         分类回归层的改进,包括 通过多层来提取特征 和 判别。

*@改进1:ION*

提出了两个方面的贡献:

1)Inside Net

        所谓 Inside 是指在 ROI 区域之内,通过连接不同 Scale 下的 Feature Map,实现多尺度特征融合。

        这里采用的是 Skip-Pooling,从 conv3-4-5-context 分别提取特征,后面会讲到。

        多尺度特征 能够提升对小目标的检测精度。

2)Outside Net

        所谓 Outside 是指 ROI 区域之外,也就是目标周围的 上下文(Contextual)信息。

        通过添加了两个 RNN 层(修改后的 IRNN)实现上下文特征提取。 上下文信息 对于目标遮挡有比较好的适应。

来看结构图:

> 多尺度特征 

        在 ROI 之后,从上图可以看到,分别从 3、4、5 层提取特征,然后再和context得到的特征做一个连接(concat),这样做的依据是什么呢?作者给出了实验验证结果:

        可以看到 Conv2 是用不到的,和我们理解的一致(尺度太大),而特征提取是 通过 L2 Norm + Scale + 1x1 Conv 得到,因为不同 Feature 之间的尺度不一致,Norm 是必须的,通过 归一化 和 Scale 进行特征提取后,送到 FC全连接层进行 分类和回归,如上图所示。

> Contextual 上下文

        和前面的多尺度的思路一样,上下文也不是一个新的概念,生成上下文信息有很多种方法,来看下对比示意:

        文中用的是 多维的概念,上图(d)(4-dir),如下图所示:  

        与传统的双向 RNN 不同,文中 通过上下左右四个方向,并且通过两次 IRNN 来增加非线性,更加有效的结合全局信息,看实验效果: 

*@改进2:多尺度之 HyperNet* 

        基于 Region Proposal 的方法,通过多尺度的特征提取来提高对小目标的检测能力,来看网络框图:

分为 三个主要特征 来介绍(对应上面网络拓扑图的 *三个红色框*):

1)Hyper Feature Extraction (特征提取)

        多尺度特征提取是本文的核心点,作者的方法稍微有所不同,他是以中间的 Feature 尺度为参考,前面的层通过 Max Pooling 到对应大小,后面的层则是通过 反卷积(Deconv)进行放大。

        多尺度 Feature ConCat 的时候,作者使用了 LRN进行归一化(类似于 ION 的 L2 Norm)。        

        抛开具体方法不表,对小目标检测来讲,这种多尺度的特征提取已经算是标配,下图证明采用 1、3、5 的效果要更优(层间隔大,关联性小)。

 2)Region Proposal Generation(建议框生成)

        设计了一个轻量级的 ConvNet,与 RPN 的区别不大(为写论文强创新^_^)。

        一个 ROI Pooling层,一个 Conv 层,还有一个 FC 层。每个 Position 通过 ROI Pooling 得到一个 13*13 的 bin,通过 Conv(3*3*4)层得到一个 13*13*4 的 Cube,再通过 FC 层得到一个 256d 的向量。

        后面的 Score+ BBox_Reg 与 Faster并无区别,用于目标得分 和 Location OffSet。

        考虑到建议框的 Overlap,作者用了 Greedy NMS 去重,文中将 IOU参考设为 0.7,每个 Image 保留 1k 个 Region,并选择其中 Top-200 做

Detetcion。

        通过对比,要优于基于 Edge Box 重排序的 Deep Box,从多尺度上考虑比 Deep Proposal 效果更好。

3)Object Detection(目标检测)

        与 Fast RCNN基本一致,在原来的检测网络基础上做了两点改进:

          a)在 FC 层之前添加了一个 卷积层(3*3*63),对特征有效降维;

          b)将 DropOut 从 0.5 降到 0.25;

        另外,与 Proposal一样采用了 NMS 进行 Box抑制,但由于之前已经做了,这一步的意义不大。

训练过程

        采用了 联合训练(joint training)的方法,首先对 Proposal 和Detection 分别训练,固定一个训练另一个,然后 joint 训练,即共享前面的卷积层训练一遍,具体可以参考原文给出的训练流程(这里不再赘述)。

效率改进

        算法整体上和 Faster 运行效率相当,因为加入了多尺度的过程,理论上要比 Faster要慢,作者提出了提高效率的改进方法,将 Conv 层放在 ROI

Pooling 层之前,如下图所示:

实验效果对比 

        通过对比可以看到 mAP 比 Faster 提高了 1%,主要是多尺度的功劳,其他可以忽略,这一点需要正视。

*@改进3:多尺度之 MSCNN* 

 论文首先给出了不同的多尺度方法(参考下图讲解):

a)原图缩放,多个Scale的原图对应不同Scale的Feature;

该方法计算多次Scale,每个Scale提取一次Feature,计算量巨大。

b)一幅输入图像对应多个分类器;

不需要重复提取特征图,但对分类器要求很高,一般很难得到理想的结果。

c)原图缩放,少量Scale原图->少量特征图->多个Model模板;

相当于对 a)和 b)的 Trade-Off。

d)原图缩放,少量Scale原图->少量特征图->特征图插值->1个Model;

e)RCNN方法,Proposal直接给到CNN;

和 a)全图计算不同,只针对Patch计算。

f)RPN方法,特征图是通过CNN卷积层得到;

和 b)类似,不过采用的是同尺度的不同模板,容易导致尺度不一致问题。

g)上套路,提出我们自己的方法,多尺度特征图;

每个尺度特征图对应一个 输出模板,每个尺度cover一个目标尺寸范围。

> 拓扑图

        套路先抛到一边,原理很简单,结合拓扑图(基于VGG的网络)来看:

        上面是提供 多尺度 Proposal 的子图,黑色 Cube 是网络输出,其中 h*w 表示 filter尺寸,c是分类类别,b是Box坐标。

        通过在不同的 Conv Layer 进行输出(conv4-3,conv5-3,conv6),对应不同尺度的 det 检测器,得到4个Branch Output。 

        PS:作者提到,conv4-3 Branch比价靠近Bottom,梯度影响会比后面的 Branch要大,因此多加入了一个缓冲层。

> Loss函数

        再来看 Loss 函数,对于 训练样本 Si =(Xi,Yi),其中 Xi 表示输入图像,Yi={yi,bi}表示 类别标签+Box位置,M代表不同的Branch,训练样本S按照尺度划分到不同的Brach,每个Branch权值不同,用a来表示。

 

这篇关于讲解 Faster R_CNN原理:的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068850

相关文章

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1

基于Java医院药品交易系统详细设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W+,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码+数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人  Java精品实战案例《600套》 2023-2025年最值得选择的Java毕业设计选题大全:1000个热

数据库原理与安全复习笔记(未完待续)

1 概念 产生与发展:人工管理阶段 → \to → 文件系统阶段 → \to → 数据库系统阶段。 数据库系统特点:数据的管理者(DBMS);数据结构化;数据共享性高,冗余度低,易于扩充;数据独立性高。DBMS 对数据的控制功能:数据的安全性保护;数据的完整性检查;并发控制;数据库恢复。 数据库技术研究领域:数据库管理系统软件的研发;数据库设计;数据库理论。数据模型要素 数据结构:描述数据库

计算机组成原理——RECORD

第一章 概论 1.固件  将部分操作系统固化——即把软件永恒存于只读存储器中。 2.多级层次结构的计算机系统 3.冯*诺依曼计算机的特点 4.现代计算机的组成:CPU、I/O设备、主存储器(MM) 5.细化的计算机组成框图 6.指令操作的三个阶段:取指、分析、执行 第二章 计算机的发展 1.第一台由电子管组成的电子数字积分和计算机(ENIAC) 第三章 系统总线

GaussDB关键技术原理:高性能(二)

GaussDB关键技术原理:高性能(一)从数据库性能优化系统概述对GaussDB的高性能技术进行了解读,本篇将从查询处理综述方面继续分享GaussDB的高性能技术的精彩内容。 2 查询处理综述 内容概要:本章节介绍查询端到端处理的执行流程,首先让读者对查询在数据库内部如何执行有一个初步的认识,充分理解查询处理各阶段主要瓶颈点以及对应的解决方案,本章以GaussDB为例讲解查询执行的几个主要阶段

【计算机组成原理】部分题目汇总

计算机组成原理 部分题目汇总 一. 简答题 RISC和CICS 简要说明,比较异同 RISC(精简指令集)注重简单快速的指令执行,使用少量通用寄存器,固定长度指令,优化硬件性能,依赖软件(如编译器)来提升效率。 CISC(复杂指令集)包含多样复杂的指令,能一条指令完成多步操作,采用变长指令,减少指令数但可能增加执行时间,倾向于硬件直接支持复杂功能减轻软件负担。 两者均追求高性能,但RISC

MySQL数据库锁的实现原理

MySQL数据库的锁实现原理主要涉及到如何确保在多用户并发访问数据库时,保证数据的完整性和一致性。以下是MySQL数据库锁实现原理的详细解释: 锁的基本概念和目的 锁的概念:在数据库中,锁是用于管理对公共资源的并发控制的机制。当多个用户或事务试图同时访问或修改同一数据时,数据库系统通过加锁来确保数据的一致性和完整性。 锁的目的:解决多用户环境下保证数据库完整性和一致性的问题。在并发的情况下,会

线性回归(Linear Regression)原理详解及Python代码示例

一、线性回归原理详解         线性回归是一种基本的统计方法,用于预测因变量(目标变量)与一个或多个自变量(特征变量)之间的线性关系。线性回归模型通过拟合一条直线(在多变量情况下是一条超平面)来最小化预测值与真实值之间的误差。 1. 线性回归模型         对于单变量线性回归,模型的表达式为:         其中: y是目标变量。x是特征变量。β0是截距项(偏置)。β1

标准分幅下的图幅号转换成经纬度坐标【原理+源代码】

最近要批量的把标准分幅下的图幅号转换成经纬度坐标,所以这两天写了个程序来搞定这件事情。 先举个例子说明一下这个程序的作用。 例如:计算出图幅号I50G021040的经纬度范围,即最大经度、最小经度、最大纬度、最小纬度。 运用我编写的这个程序,可以直接算出来,这个图幅号的经纬度范围,最大经度为115.3125°,最小经度为115.25°,最大纬度为31.167°,最小纬度为31.125°。

SpingBoot原理

配置优先级 SpringBoot配置的优先级从高到低依次为命令行参数、JNDI属性、Java系统属性、操作系统环境变量、外部配置文件、内部配置文件、注解指定的配置文件和编码中直接指定的默认属性。具体如下: 命令行参数:启动应用时,通过命令行指定的参数拥有最高优先级。例如,使用--server.port=8081会直接改变应用程序的端口,无论在什么配置文件中定义过该值。JNDI属性:这些属性由当