当前位置: 首页 > news >正文

目标检测——Faster R-CNN算法解读

论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
作者:Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun
链接:https://arxiv.org/abs/1506.01497
代码:https://github.com/rbgirshick/py-faster-rcnn

R-CNN系列其他文章:

  • R-CNN算法解读
  • SPPNet算法解读
  • Fast R-CNN算法解读

目录

  • 1、算法概述
  • 2、Faster R-CNN细节
    • 2.1 Region Proposal Networks
    • 2.2 RPN和Fast R-CNN共享卷积特征
  • 3、实验结果
  • 4、创新点和不足

1、算法概述

之前的工作,像SPPnet和Fast R-CNN虽然都相对于R-CNN在提取特征的时间上有所改进,但针对区域候选框的生成这一步未做改进,这是两个算法的不足之处,此论文提出了Region Proposal Network(RPN)通过共享卷积层自动生成区域候选框:通过将RPN集成到Fast R-CNN中可实现区域候选框生成、类别预测及边界框预测一步到位,用VGG-16作为主干,在GPU上推理能达到5fps。Faster R-CNN在2015年的ILSVRC和COCO竞赛中取得了第一名的成绩。

2、Faster R-CNN细节

先说区域候选框的选取规则,为了尽量完全地包含图像中的目标,区域候选框旨在有效地预测具有广泛尺度和纵横比。目前的方式如下图几种:
在这里插入图片描述
图1-a中是图像金字塔,图1-b是卷积核金字塔(通过变换卷积核大小),图1-c就是本文采用的方法,在特征图上应用多尺度/多纵横比的矩形框参考(论文中命名为“anchor”),这样可以避免枚举多个比例或宽高比的图像或卷积核。Faster R-CNN由于这样的操作,使得可以在单一尺度图像上完成候选框生成工作从而提高了运行速度。其整体网络框图如下所示:
在这里插入图片描述
Faster R-CNN由两部分组成,第一部分为由全卷积网络组成的RPN结构,第二部分为Fast R-CNN检测器。如上图所示,RPN结构可以集成到Fast R-CNN中,共享其网络前部产生的特征图。当RPN模块产生区域候选框后,告诉Fast R-CNN模块区域候选框的位置,后面就是延续Fast R-CNN的操作了,应用RoI Pooling,然后输出接分类和回归分支。

2.1 Region Proposal Networks

候选框生成网络(RPN)接受任意大小的图像作为输入并输出一组矩形框做为目标的候选框,每个候选框都有一个是否是目标的得分(objectness,用softmax,只有两类,是目标或是背景,也可以用逻辑回归直接回归一个是目标的分数)。RPN结构为全卷积网络,文中采用ZFNet和VGG16,在特征图上应用3x3大小的滑窗将特征转换为256个1x1大小的特征图(ZFNet)和512个1x1大小的特征图(VGG16),最后用1x1大小的卷积核接分类分支和回归分支。
在这里插入图片描述
Anchors
每个滑窗包含有k个anchor boxes,所以每个3x3大小的滑窗对应有2k个分类分数和4k个坐标框预测。如上图所示,文中k取9,包含3个尺度,每个尺度包含3个宽高比;对于一个WxH大小的特征图,共生成WHk个anchor。由于这种基于锚点的多尺度设计,我们可以简单地使用在单尺度图像上计算的卷积特征,多尺度锚框的设计是共享特征而不需要为寻找多尺度花费额外成本的关键组件。

样本选择
正样本:该anchor与ground-truth拥有最高的IoU,或者该anchor与任意一个ground-truth的IoU都大于0.7。这里就说明一个ground-truth可以为多个anchor分配正样本标签。
负样本:与所有ground-truth的IoU都小于0.3的anchor被视为负样本。
其他剩余的anchor被丢弃,没有参与到RPN训练中。

Loss Function
RPN的损失函数有些类似于Fast R-CNN的多任务损失,如下:
在这里插入图片描述
Lcls为二分类损失,Lreg为回归损失,采用smoothL1,其中正负样本均参与分类损失的计算,回归损失只有正样本参与计算。对于bounding-box回归,也是采用类似R-CNN的做法,学习基于anchor的偏移量,预测box,anchor box,和ground-truth box之间的关系如下面公式:
在这里插入图片描述
例如针对某个预测box,使得anchor box中心点xa与预测box中心点x的距离尽量接近anchor box中心点xa与ground-truth box中心点x*的距离,其他三个值同理,这样就等价于预测box接近ground-truth box了。

训练RPN
训练RPN网络的样本都是来自图片的anchor样本选取的正负样本,由于负样本较多,会造成正负样本不平衡问题,所以我们设置batchsize为256,正负样本比例为1:1,如果正样本少于128,就用负样本补齐。

2.2 RPN和Fast R-CNN共享卷积特征

论文采用四步交替训练的方式实现RPN与Fast R-CNN的统一:

  • 第一步:用ImageNet预训练模型微调RPN网络;
  • 第二步:用RPN网络生成的区域候选框训练Fast R-CNN,训练之前也用ImageNet预训练模型初始化参数,这两步RPN和Fast R-CNN还没有共享卷积层参数;
  • 第三步:用Fast R-CNN前部分卷积层参数初始化RPN训练,但是固定住共享层的参数,单独更新RPN独有部分的参数,这个时候就保证两个网络共享卷积层参数一致了。
  • 第四步:固定住共享卷积层参数,微调Fast R-CNN独有部分的参数。

3、实验结果

作者在VOC2007,VOC2012上测试结果如下:
在这里插入图片描述
在这里插入图片描述
和用SS方式生成区域候选框的时间对比结果如下:
在这里插入图片描述

4、创新点和不足

  • 创新点:
    1、提出RPN网络生成候选框并集成到Fast R-CNN网络中,使得推理速度进一步得到提升;
    2、提出anchor锚框的概念,使得能在一张图片上得到多尺度多宽高比的预测框学习参考;
    3、 提出交替训练方法,使得RPN与Fast R-CNN能共享卷积层参数。
  • 不足:
    1、二阶段方法,推理速度还是难以在终端上运行;

突然想到yolo系列和这个RPN不谋而合啊,yolov2可以算单尺度版的RPN,yolov3可以算FPN版的RPN,只是yolo多了个类别识别分支,anchor设置不同,且分配正负样本的方式不同而已。

相关文章:

目标检测——Faster R-CNN算法解读

论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 作者:Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun 链接:https://arxiv.org/abs/1506.01497 代码:https://github.com/rbgirsh…...

Wireshark (一)安装入门 —— 软件介绍

文章目录 Wireshark是什么?为什么要使用Wireshark?相关网络分析工具软件对比 Wireshark是什么? Wireshark是一种开源网络协议分析器,它可以捕获和分析网络中传输的数据包。 用户可以使用Wireshark来诊断网络问题、了解网络协议的…...

Web框架与Django路由层

Web框架 一 web框架 Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能&…...

什么是CAS, 什么是AQS

文章目录 什么是CAS, 什么是AQSCASAQS 什么是CAS, 什么是AQS CAS AQS AQS 全称是AbstractQueuedSynchronizer, 是juc 下一个核心的抽象类,用于构建各种同步器和锁 比如我们熟悉的 ReentrantLock、ReadWriteLock、CountDownLatch等等是基于AQS. 首先在…...

蓝桥杯每日一题2023.12.1

题目描述 蓝桥杯大赛历届真题 - C 语言 B 组 - 蓝桥云课 (lanqiao.cn) 题目分析 对于此题目而言思路较为重要&#xff0c;实际可以转化为求两个数字对应的操作&#xff0c;输出最前面的数字即可 #include<bits/stdc.h> using namespace std; int main() {for(int i 1…...

正则表达式从放弃到入门(1):“正则表达式”是什么?

正则表达式从放弃到入门&#xff08;1&#xff09;&#xff1a;“正则表达式”是什么&#xff1f; 本博文转载自 这是一篇”正则表达式”扫盲贴&#xff0c;如果你还不理解什么是正则表达式&#xff0c;看这篇文章就对了。 如果你已经掌握了”正则表达式”&#xff0c;就不用再…...

SQL解惑 - 谜题2

文章目录 一、谜题描述二、分析三、答案四、总结 一、谜题描述 创建一个记录雇员缺勤率的数据库。使用的表结构如下&#xff1a;Absenteeism 主键&#xff1a;PRIMARY KEY (emp_id, absent_date) 字段名字段类型字段中文名字段描述emp_idINTERGER雇员id-absent_dateSTRING缺勤…...

FWT+高维前缀和:Gym - 103202M

https://vj.imken.moe/contest/597216#problem/F 考虑两个人的集合分别为 i , j i,j i,j&#xff0c;那么我们令 f ( i ⊗ j ) f(i\otimes j) f(i⊗j)&#xff0c;其中 f ( s ) f(s) f(s) 表示两个人不同集合恰好为 s s s&#xff0c;显然 f ( s ) f(s) f(s) 可以FWT求…...

【C++】string类的接口综合运用

目录​​​​​​​ 介绍&#xff1a; 一&#xff0c;string对象的构建 二&#xff0c;string类对象的容量操作 介绍&#xff1a; string容器我们之前已经粗略了解了基本增添、修改、删除、插入等基本功能&#xff0c;这里就不再做过多说明&#xff0c;接下来我们全面并详细…...

分布式ID生成框架Leaf升级踩坑

背景&#xff1a; 在项目中需要一个统一的拿单号等唯一ID的服务&#xff0c;就想起了之前用到的leaf&#xff0c;但是因为项目要求&#xff0c;leaf的版本不符合&#xff0c;需要做一些升级 项目地址&#xff1a;https://github.com/Meituan-Dianping/Leaf 升级点&#xff1…...

常用的设计模式

文章目录 常用的设计模式&#xff1a;一、单例模式3、懒汉式 - 懒汉式非线程安全4、饿汉式 - 线程安全5、懒汉式和饿汉式区别6、双重检查锁定7、应用场景 二、工厂模式1、简单工厂模式2、工厂模式3、抽象工厂4、总结 三、代理模式1、静态代理2、动态代理jdk自带动态代理 3、Cgl…...

git的相关实用命令

参看文章&#xff1a;https://blog.csdn.net/qq_21688871/article/details/130158888 http://www.mobiletrain.org/about/BBS/159885.html 1、git commit后&#xff0c;但发现文件有误&#xff0c;不想push(提交到本地库&#xff0c;回退到暂存区&#xff09; git reset --sof…...

【使用`model.status`来获取gurobi求解过程中的模型状态】

在Gurobi中&#xff0c;你可以使用model.status来获取求解过程中的模型状态。可以使用了model.status来检查模型是否找到最优解。模型状态是一个Gurobi的常量&#xff0c;表示了求解过程中的不同状态。 以下是一些常见的模型状态&#xff1a; GRB.OPTIMAL: 最优解被找到。GRB…...

【UGUI】Unity教程:实现物品的拖拽功能

大家好&#xff0c;今天&#xff0c;我们将一起学习如何在Unity中实现物品的拖拽功能。这是一个非常实用的技能&#xff0c;无论你是在制作RPG游戏的背包系统&#xff0c;还是在制作策略游戏的建筑放置功能&#xff0c;都会用到这个技能。那么&#xff0c;让我们开始吧&#xf…...

【奇淫技巧】两数交换

【奇淫技巧】两数交换 临时变量法&#xff1a;借助中间变量加减法&#xff1a;不使用中间变量异或法&#xff1a;不使用中间变量语法糖&#xff1a;某些编程语言支持交换语法糖借助函数&#xff0c;不交换 前提&#xff1a;待交换的两个元素&#xff0c;分别用a,b表示&#xf…...

Java核心知识点整理大全26-笔记

目录 27. Storm 7.1.1. 概念 27.1.1. 集群架构 27.1.1.1. Nimbus&#xff08;master-代码分发给 Supervisor&#xff09; 27.1.1.2. Supervisor&#xff08;slave-管理 Worker 进程的启动和终止&#xff09; 27.1.1.3. Worker&#xff08;具体处理组件逻辑的进程&#xff…...

“上云”还是“下云”?探云计算的下一站未来!

引言 10 月 27 日&#xff0c;X&#xff08;原Twitter&#xff09;工程技术发布帖子称&#xff0c;在过去的一年里&#xff0c;技术团队优化了 X 的云服务使用方式&#xff0c;着手将更多工作负载迁往本地基础设施。这一转变使 X 每月的云成本降低了 60%。所有媒体、Blob 存储均…...

Linux中top命令输出日志分析?

以下是对输出的各部分的解释&#xff1a; 09:54:34&#xff1a;系统当前时间。up 161 days, 2:08&#xff1a;系统已经运行了161天2小时8分钟。5 users&#xff1a;有5个用户登录系统。load average: 0.13, 0.08, 0.05&#xff1a;系统的1分钟、5分钟、15分钟的平均负载。负载…...

执行栈和执行上下文

前端面试大全JavaScript执行栈和执行上下文 &#x1f31f;经典真题 &#x1f31f;执行上下文 &#x1f31f;栈数据结构 &#x1f31f;执行上下文生命周期 &#x1f31f;真题解答 &#x1f31f;总结 &#x1f31f;经典真题 谈谈你对 JavaScript 执行上下文栈理解 &#…...

7、单片机与W25Q128(FLASH)的通讯(SPI)实验(STM32F407)

SPI接口简介 SPI 是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。 SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根…...

stream流和方法引用

1.Stream流 1.1体验Stream流【理解】 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素把集合中所有以"张"开头的元素存储到一个新的集合把"张"开头的集合中的长度为3的元素存储到一个新的集合遍历上一步得到的集…...

Redis——某马点评day01——短信登录

项目介绍 导入黑马点评项目 项目架构 基于Session实现登录 基本流程 实现发送短信验证码功能 controller层中 /*** 发送手机验证码*/PostMapping("code")public Result sendCode(RequestParam("phone") String phone, HttpSession session) {// 发送短信…...

AES加密技术:原理与应用

一、引言 随着信息技术的飞速发展&#xff0c;数据安全已成为越来越受到重视的领域。加密技术作为保障数据安全的重要手段&#xff0c;在信息安全领域发挥着举足轻重的作用。AES&#xff08;Advanced Encryption Standard&#xff09;作为一种对称加密算法&#xff0c;自1990年…...

Unity中PlayerPrefs在PC上存储位置总结

编辑器下和EXE存储位置是不同的&#xff0c;这也不难理解&#xff0c;是为了避免存储位置相同导致开发和测试冲突。 编辑器下位置&#xff1a;HKEY_CURRENT_USER\Software\Unity\UnityEditor\ExampleCompanyName\ExampleProductName EXE位置&#xff1a;HKEY_CURRENT_USER\Sof…...

消融实验:深度学习的关键分析工具

消融实验&#xff1a;深度学习的关键分析工具 在深度学习和机器学习领域&#xff0c;消融实验&#xff08;Ablation Study&#xff09;是一种重要的实验方法&#xff0c;用于理解和评估模型的各个组成部分对其整体性能的贡献。通过这种方法&#xff0c;研究人员可以更深入地了…...

Redis缓存——Spring Cache入门学习

Spring Cache 介绍 Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache 提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;例如&#xff1a; EHCacheCaffeineR…...

Python标准库copy【侯小啾python领航班系列(十五)】

Python标准库copy【侯小啾python领航班系列(十五)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…...

Android--Jetpack--Lifecycle详解

富贵本无根&#xff0c;尽从勤里得 一&#xff0c;定义 Lifecycle 是一个具备宿主生命周期感知能力的组件。它持有组件&#xff08;Activity/Fragment&#xff09;生命周期状态信息&#xff0c;并且允许其观察者监听宿主生命周期状态变化。 顾名思义&#xff0c;Lifecycle的主…...

LeetCode105.从前序和中序遍历序列构造二叉树

这道题看完题想了几分钟就想到大概的思路了&#xff0c;但是在写的时候有很多细节没注意出了很多问题&#xff0c;然后写了1个多小时&#xff0c;其实这道题挺简单的。 首先&#xff0c;最基本的知识&#xff0c;先序遍历是根左右&#xff0c;中序遍历是左根右&#xff0c;那么…...

flutter-一个可以输入的数字增减器

效果 参考文章 代码 在参考文章上边&#xff0c;主要是改了一下样式&#xff0c;逻辑也比较清楚&#xff0c;对左右两边添加增减方法。 我在此基础上加了_numcontroller 输入框的监听。 加了数字输入框的控制 keyboardType: TextInputType.number, //设置键盘为数字 inputF…...