目标检测——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) 题目分析 对于此题目而言思路较为重要,实际可以转化为求两个数字对应的操作,输出最前面的数字即可 #include<bits/stdc.h> using namespace std; int main() {for(int i 1…...
正则表达式从放弃到入门(1):“正则表达式”是什么?
正则表达式从放弃到入门(1):“正则表达式”是什么? 本博文转载自 这是一篇”正则表达式”扫盲贴,如果你还不理解什么是正则表达式,看这篇文章就对了。 如果你已经掌握了”正则表达式”,就不用再…...
SQL解惑 - 谜题2
文章目录 一、谜题描述二、分析三、答案四、总结 一、谜题描述 创建一个记录雇员缺勤率的数据库。使用的表结构如下:Absenteeism 主键: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,那么我们令 f ( i ⊗ j ) f(i\otimes j) f(i⊗j),其中 f ( s ) f(s) f(s) 表示两个人不同集合恰好为 s s s,显然 f ( s ) f(s) f(s) 可以FWT求…...
【C++】string类的接口综合运用
目录 介绍: 一,string对象的构建 二,string类对象的容量操作 介绍: string容器我们之前已经粗略了解了基本增添、修改、删除、插入等基本功能,这里就不再做过多说明,接下来我们全面并详细…...
分布式ID生成框架Leaf升级踩坑
背景: 在项目中需要一个统一的拿单号等唯一ID的服务,就想起了之前用到的leaf,但是因为项目要求,leaf的版本不符合,需要做一些升级 项目地址:https://github.com/Meituan-Dianping/Leaf 升级点࿱…...
常用的设计模式
文章目录 常用的设计模式:一、单例模式3、懒汉式 - 懒汉式非线程安全4、饿汉式 - 线程安全5、懒汉式和饿汉式区别6、双重检查锁定7、应用场景 二、工厂模式1、简单工厂模式2、工厂模式3、抽象工厂4、总结 三、代理模式1、静态代理2、动态代理jdk自带动态代理 3、Cgl…...
git的相关实用命令
参看文章:https://blog.csdn.net/qq_21688871/article/details/130158888 http://www.mobiletrain.org/about/BBS/159885.html 1、git commit后,但发现文件有误,不想push(提交到本地库,回退到暂存区) git reset --sof…...
【使用`model.status`来获取gurobi求解过程中的模型状态】
在Gurobi中,你可以使用model.status来获取求解过程中的模型状态。可以使用了model.status来检查模型是否找到最优解。模型状态是一个Gurobi的常量,表示了求解过程中的不同状态。 以下是一些常见的模型状态: GRB.OPTIMAL: 最优解被找到。GRB…...
【UGUI】Unity教程:实现物品的拖拽功能
大家好,今天,我们将一起学习如何在Unity中实现物品的拖拽功能。这是一个非常实用的技能,无论你是在制作RPG游戏的背包系统,还是在制作策略游戏的建筑放置功能,都会用到这个技能。那么,让我们开始吧…...
【奇淫技巧】两数交换
【奇淫技巧】两数交换 临时变量法:借助中间变量加减法:不使用中间变量异或法:不使用中间变量语法糖:某些编程语言支持交换语法糖借助函数,不交换 前提:待交换的两个元素,分别用a,b表示…...
Java核心知识点整理大全26-笔记
目录 27. Storm 7.1.1. 概念 27.1.1. 集群架构 27.1.1.1. Nimbus(master-代码分发给 Supervisor) 27.1.1.2. Supervisor(slave-管理 Worker 进程的启动和终止) 27.1.1.3. Worker(具体处理组件逻辑的进程ÿ…...
“上云”还是“下云”?探云计算的下一站未来!
引言 10 月 27 日,X(原Twitter)工程技术发布帖子称,在过去的一年里,技术团队优化了 X 的云服务使用方式,着手将更多工作负载迁往本地基础设施。这一转变使 X 每月的云成本降低了 60%。所有媒体、Blob 存储均…...
Linux中top命令输出日志分析?
以下是对输出的各部分的解释: 09:54:34:系统当前时间。up 161 days, 2:08:系统已经运行了161天2小时8分钟。5 users:有5个用户登录系统。load average: 0.13, 0.08, 0.05:系统的1分钟、5分钟、15分钟的平均负载。负载…...
执行栈和执行上下文
前端面试大全JavaScript执行栈和执行上下文 🌟经典真题 🌟执行上下文 🌟栈数据结构 🌟执行上下文生命周期 🌟真题解答 🌟总结 🌟经典真题 谈谈你对 JavaScript 执行上下文栈理解 &#…...
7、单片机与W25Q128(FLASH)的通讯(SPI)实验(STM32F407)
SPI接口简介 SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。 SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
