R-CNN 模型算法流程梳理
目录
一、R-CNN整体流程
二、需要注意的地方
论文连接:[1311.2524] Rich feature hierarchies for accurate object detection and semantic segmentation
如果你之前了解过RNN,很容易混淆认为R-CNN也具有RNN的时序循环功能,这种理解是错误的:
- RCNN 里的 “R” 是 Region(区域),它其实是一种 目标检测结构,和循环无关;
- 它属于 区域提议 + CNN分类器 的思路,而不是时间序列建模。
RCNN(Regions with Convolutional Neural Networks)是 Ross Girshick 等人在 2014 年提出的目标检测方法,它是深度学习在目标检测领域的早期重要成果之一。RCNN 将传统目标检测方法与卷积神经网络(CNN)结合起来,实现了更高的检测精度。
它把 图像分类器(CNN) 与 目标检测(Region Proposal + 分类 + 回归) 结合在一起,流程清晰但处理效率不高。
一、R-CNN整体流程
下面是完整的 RCNN 整体流程梳理:
+----------------+| 输入图像 |+--------+-------+|v+---------------------------+| 候选区域提取 (Selective Search) |+---------------------------+|v+------------------------------+| 每个候选区域裁剪并缩放成固定大小 |+------------------------------+|v+---------------------------+| CNN(如 AlexNet)特征提取 |+---------------------------+|v+---------+ +----------------+| SVM 分类 | <---> | 边界框回归(BBox) |+---------+ +----------------+|v+----------------+| 检测结果输出 |+----------------+
此处需要注意R-CNN利用CNN完成特征提取后,SVM分类,和边界框BBOX偏移量的计算是相互独立的。
🔵 RCNN 的主要流程
1️⃣ 候选框生成(Region Proposal)
使用选择性搜索(Selective Search)从整张图像中生成大约 2000 个候选框(region proposals)。
- 输入:整张图像
- 输出:若干个可能包含目标的候选框(bounding boxes)
特点:
- 这一步是纯传统算法,和深度学习无关
- 每个候选框区域尺寸不同
2️⃣ 候选框裁剪与特征提取
对每个候选框区域裁剪、缩放到固定尺寸(如 224×224),然后输入到 CNN 中提取特征。
- CNN 使用 ImageNet 上预训练的分类网络(如 AlexNet)
- 特征来自全连接层前(如 fc7 层输出)
- 每个候选框 → 得到一个固定长度的特征向量(例如 4096 维)
结果形式:
特征向量列表: [f_1, f_2, ..., f_N],每个 f_i ∈ ℝ^4096
3️⃣ 分类
使用提取到的 CNN 特征向量,训练一个类别分类器(通常是 SVM)
- 对每个类别都训练一个二分类 SVM(one-vs-rest)
- 判断一个框是不是某个类(狗、猫、飞机...)
4️⃣ 边界框回归(BBOX Regression)
训练一个线性回归器(bbox regressor)对框的位置做微调
- 输入:特征向量
- 输出:位置偏移(t_x, t_y, t_w, t_h),对原始框做微调
- 每类一个回归器
边界框回归通常使用四个值(t_x, t_y, t_w, t_h)表示相对的调整:
在预测阶段,网络预测出 (t_x, t_y, t_w, t_h),再反算出 refined BBOX
解码公式(decode):
p_x = t_x * d_w + d_x
p_y = t_y * d_h + d_y
p_w = exp(t_w) * d_w
p_h = exp(t_h) * d_h
✅ 结果形式:
每个 region → 分类分数 + 位置偏移量
模型训练时的准备工作:
内容 | 说明 |
候选框准备 | 使用 Selective Search 生成候选框(约2000个) |
标注匹配 | 将候选框与 ground truth 计算 IOU,设定正负样本阈值(如 IOU>0.5为正) |
CNN 特征提取 | 将正负样本图像送入 CNN,提取特征 |
训练分类器(SVM) | 用 CNN 特征 + 标签训练若干个二分类 SVM |
训练BBOX回归器 | 用 CNN 特征 + 偏移量训练 bbox 回归器 |
二、需要注意的地方
1. RCNN 的流程中,特征向量(fc7)是怎么同时用于分类(SVM)和边界框回归(BBOX regression)的?
RCNN 本身(2014 年)没有端到端的多任务学习,它的处理是分开的,流程是这样的:
CNN 提取特征
输入:候选框(裁剪+resize)
输出:fc7 特征向量(4096 维)
SVM 分类
-
对所有候选框,使用提取的 fc7 特征向量,分别送到不同的 SVM(每个类别一个 SVM + 一个背景类别)。
-
这个步骤不在神经网络中,是离线训练的。
回归器
-
同样使用 fc7 特征向量,单独训练一个线性回归器(或者每个类别一个回归器),回归框的偏移量 (Δx, Δy, Δw, Δh)。
也就是说,SVM 分类和 BBOX 回归是完全分开的,它们只共享 CNN 的 fc7 特征向量,而不是神经网络内部“多任务”输出。
所以在 RCNN:
-
网络本身只负责提取 fc7 特征。
-
SVM 分类和 BBOX 回归是独立的模型,单独训练,单独使用。
🔴 RCNN 中容易被忽略的细节
1️⃣ CNN 不是端到端训练
-
RCNN 的 CNN(例如 AlexNet)是用 ImageNet 分类数据集预训练的。
-
在 RCNN 里,CNN 只做特征提取,不会在目标检测任务上更新权重。
-
这意味着 RCNN 检测任务中的 CNN 权重是冻结的(不会 end-to-end 训练)。
2️⃣ SVM 和 BBOX 回归器是分开的
-
SVM 分类器和边界框回归器在 RCNN 中是离线训练的,和 CNN 特征提取完全分开。
-
这导致 RCNN 训练步骤很繁琐,要单独训练三部分:CNN(预训练),SVM(每类一个),BBOX 回归器(每类一个)。
3️⃣ 训练样本采样的不平衡问题
-
RCNN 用到 Selective Search 生成 2000+ 候选框,但大多数都是背景(负样本)。
-
训练 SVM 和回归器时,需要采样一部分负样本和正样本来避免类别极不平衡。
4️⃣ ROI(Region of Interest)裁剪和变形
-
RCNN 把候选框直接裁剪成固定大小(如 227x227)。
-
这会导致几何变形(原始候选框长宽比和 227x227 不一样)。
-
变形会影响后续检测精度。
5️⃣ 不同类别 SVM 的处理
-
RCNN 为每个类别都单独训练一个二分类 SVM。
-
最终推断时,多个 SVM 各自给分数,通常取分最高的类别。
-
这个和后来端到端网络中常见的 softmax 多分类不同。
6️⃣ 速度极慢
-
因为每个候选框都要跑一次 CNN,导致非常低效(在 GPU 上也是每张图要几秒)。
-
这是后来 SPPNet、Fast RCNN、Faster RCNN 诞生的主要动因。
另外:
✅候选框质量对结果影响巨大
-
Selective Search 是基于分割的启发式算法,质量有限。
-
如果候选框漏掉了物体(召回率不够),再好的 CNN 也没用。
✅ 训练和推理步骤分裂
-
RCNN 在训练时用的是裁剪过的图像(Warping),和真实推断时可能有 domain gap。
-
也就是推断时依赖 CNN 提取的全局图像特征,训练时是局部 warp 后的框,可能会有些微 mismatch。
✅ 多阶段训练带来的复杂性
-
RCNN 训练时流程比较长:
1️⃣ CNN 预训练(ImageNet)
2️⃣ SVM 训练
3️⃣ BBOX 回归训练 -
每步都有很多超参数,容易出错。
🟢 小结:RCNN 的易错点/易忽略点
项目 | 细节或坑 |
---|---|
CNN 训练 | 只在 ImageNet 上预训练,不在检测数据上 finetune。 |
分类 vs 回归 | SVM(离线) vs 回归器(离线),CNN 只提特征。 |
ROI 裁剪 | 固定尺寸裁剪(如 227x227),导致几何变形。 |
多阶段训练 | 不同阶段需单独训练,容易数据集不匹配或忘记某一步。 |
速度问题 | 每个候选框都跑 CNN,推理速度非常慢。 |
负样本比例 | 需要好好处理负样本采样,否则 SVM 训练偏移(负样本占大多数)。 |
SVM 结果处理 | 推断时是多 SVM 二分类结果合并(不是 softmax)。 |
🔵 总结
RCNN 是目标检测从 region proposal + CNN 特征提取起步的里程碑,但它的多阶段训练、慢速推断和非端到端的结构在后续被 Fast RCNN / Faster RCNN 所改进。
补充:
BBOX回归器:
在 RCNN 里,回归器只在“正样本”候选框上做训练。
所谓“正样本”= 与 GT 框的 IoU ≥ 0.5 的候选框。
流程:
1️⃣ 先对所有候选框(从 Selective Search 来的)和真值框(GT)算 IoU。
2️⃣ 每个候选框,找与它 IoU 最大的 GT 框。
3️⃣ 如果这个最大 IoU ≥ 0.5,认为它是“正样本”。否则,认为是“负样本”。
在回归器训练时,只保留正样本,用它们的特征和回归目标(偏移量)做训练。
所以,回归器的 Loss 只对正样本计算:
(负样本直接跳过,不参与计算 Loss)
BBOX 回归器结构示意
+-----------------+| fc7 特征向量 | (4096,)+-----------------+||v+------------------------+| 线性回归层(仿全连接) || W: (4096, 4) || b: (4,) |+------------------------+|v+-----------------+| 4 维 BBOX 偏移量 | (tₓ, tᵧ, t_w, t_h)+-----------------+
训练阶段
输入:
-
4096 维的 fc7 特征向量(由 CNN 提取出来)
目标: -
4 维的 GT 偏移量 (Δx*, Δy*, Δw*, Δh*)
优化: -
最小化 L2 回归损失(只对正样本)
推理阶段(测试)
在测试时:
将 proposal(候选框)经过 CNN 提取 fc7 特征
用回归器预测 4 维偏移量
把原候选框 (x, y, w, h) 和预测的 (tₓ, tᵧ, t_w, t_h) 反算出最终的 refined BBOX
关键点
-
这个回归器其实是一个非常简单的“全连接层”结构(线性层),没有隐藏层或激活函数。
-
只不过在 RCNN 中它是单独训练(不是网络 end-to-end 联合优化)。
相关文章:

R-CNN 模型算法流程梳理
目录 一、R-CNN整体流程 二、需要注意的地方 论文连接:[1311.2524] Rich feature hierarchies for accurate object detection and semantic segmentation 如果你之前了解过RNN,很容易混淆认为R-CNN也具有RNN的时序循环功能,这种理解是错误…...
细说C语言将格式化输出到FILE *stream流的函数fprintf、_fprintf_I、fwprintf、_fwprintf_I
目录 1、将格式化数据输出到FILE *stream流基本型 (1)语法 (2)参数 (3)示例 2、将格式化数据输出到FILE *stream流并启用并启用在格式字符串中使用参数的顺序的规范 (1)语法 …...

本地日记本,用于记录日常。
文章目录 想法程序说明展望 想法 本人想要复盘以前的事情,所以就想着写一个小程序,记录一下一天发生了什么事情。以后如果忘记了可以随时查看。写日记的想法来自我看的一本书,里面有一段话说的意思是,经验从来都不是随着年龄增长…...

[蓝桥杯]格子刷油漆
格子刷油漆 题目描述 X 国的一段古城墙的顶端可以看成 2N2N 个格子组成的矩形(如下图所示),现需要把这些格子刷上保护漆。 你可以从任意一个格子刷起,刷完一格,可以移动到和它相邻的格子(对角相邻也算数&…...
Monorepo架构: 项目管理工具介绍、需求分析与技术选型
概述 如何实现 monorepo,以及在项目中如何管理多个包,在进行具体项目开发前,有必要强调一个重要思维 — 全局观 即看待技术方案时,要从需求角度出发,综合考量该方案能否长远满足项目或团队需求 为什么要有全局观呢&a…...

ubuntu下libguestfs-tools
在ubuntu下,使用libguestfs-tools工具挂载其他磁盘和分区。 首先安装libguestfs-tools将vmx虚拟磁盘共享:sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other执行如下命令查看分区名称:virt-filesystems -a /mnt/hgfs/D/vmware/FGT_VM64-v7…...

Authentication failed(切换了新的远程仓库tld)
启用 Git Credential Manager git config --global credential.helper manager 强制弹出凭据输入窗口 git config --global credential.helper.modalprompt true 指定 TFS 服务器使用基础认证(Basic Auth) git config --global credential.https://…...

【Web应用】若依框架:基础篇14 源码阅读-后端代码分析-课程管理模块前后端代码分析
文章目录 一、课程管理模块前端代码截图二、前端代码及分析index.vuecourse.js 三、前端执行流程1. 组件初始化2. 查询操作3. 列表操作4. 对话框操作5. API 请求6. 执行流程总结关键点 四、课程管理模块后端代码截图五、后端代码块CourseControllerICourseServiceCourseMapperC…...
在 Linux 上安装 `pgvector`(这是一个 PostgreSQL 的向量类型扩展,常用于处理嵌入向量,便于进行向量相似度搜索)
1. 安装 PostgreSQL 确保你已经安装好 PostgreSQL 数据库。 例如在 Ubuntu 上: sudo apt update sudo apt install postgresql postgresql-contrib2. 安装依赖 pgvector 扩展用的是 make、gcc 等开发工具,因此你需要先安装 PostgreSQL 的开发包和编译…...
09.MySQL内外连接
09.MySQL内外连接 文章目录 MySQL内外连接 内连接 外连接 左外连接 右外连接 简单案例 MySQL内外连接 在数据库操作中,表的连接是一个非常重要的概念。简单来说,连接就是将两个或多个表中的数据按照某种规则结合起来,从而获取我们所需要的…...
Python爬虫实战:研究Scrapy-Splash库相关技术
1 引言 1.1 研究背景与意义 网络爬虫作为一种自动获取互联网信息的技术,在数据挖掘、信息检索、舆情分析等领域有着广泛的应用。然而,随着 Web 技术的不断发展,越来越多的网站采用 JavaScript 动态渲染技术,如 React、Vue 等框架构建的单页应用 (SPA)。这些网站的内容通常…...

智能升级:中国新能源汽车充电桩规模化建设与充电桩智慧管理方案
近年来,中国新能源汽车产业快速发展,市场规模持续扩大,但充电基础设施的建设与管理仍面临布局不均、利用率低、智能化水平不足等问题。为推动新能源汽车普及,国家正加速充电桩的规模化建设,并通过智慧化管理提升运营效…...
AlphaFold3服务器安装与使用(非docker)(1)
1. 服务器显卡驱动准备 这部分我会详细记录一下我踩过的坑及怎样拯救的,原谅啰嗦啦 ^_^ 1.1 服务器旧配置 1.1.1 nvidia-smi [xxxxxxlocalhost ~]# nvidia-smi Thu May 29 20:54:00 2025 -------------------------------------------------------------…...

接口自动化测试之pytest接口关联框架封装
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一般情况下,我们是通过一个yaml文件进行关联实现 在根目录下新建一个文件yaml,通过上述conftest.py文件实现全局变量的更新: 1.首先需要建…...

M1安装并使用Matlab2024a进行java相机标定
安装 Matlab下载地址:https://www.macxin.com/archives/23771.html注意⚠️:如若需要java调用Matlab函数,则需要java版本为21 使用 安装完成之后运行此节目可以看到: 构建jar 命令行输入deploytool,会有一个弹窗&a…...

02-Redis常见命令
02-Redis常见命令 Redis数据结构介绍 Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样: 贴心小建议:命令不要死记,学会查询就好啦 Redis为了方便学习,将操作不同数据类型的命…...
【论文阅读笔记】Text-to-SQL Empowered by Large Language Models: A Benchmark Evaluation
文章目录 Text-to-SQL Empowered by Large Language Models: A Benchmark Evaluation一、论文基本信息1. 文章标题2. 所属刊物/会议3. 发表年份4. 作者列表5. 发表单位 二、摘要三、解决问题四、创新点五、自己的见解和感想六、研究背景七、研究方法(模型、实验数据…...
使用ArcPy进行栅格数据分析
设置工作环境 在开始编写脚本之前,需要设置好工作环境。这包括指定工作空间(workspace)和输出路径。工作空间是包含所有输入数据的文件夹或地理数据库,而输出路径则是处理结果将要保存的位置。 import arcpy from arcpy import …...

华为OD机试真题——告警抑制(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...

Java转Go日记(五十七):gin 中间件
1. 全局中间件 所有请求都经过此中间件 package mainimport ("fmt""time""github.com/gin-gonic/gin" )// 定义中间 func MiddleWare() gin.HandlerFunc {return func(c *gin.Context) {t : time.Now()fmt.Println("中间件开始执行了&quo…...
《树数据结构解析:核心概念、类型特性、应用场景及选择策略》
在数据结构中,树是一种分层的非线性数据结构,由节点和边组成,具有唯一根节点、子树分层结构和无环特性。其核心价值在于高效处理层次化数据或动态集合,广泛应用于算法、数据库、文件系统等领域。 一、树的核心概念 根节点&#…...
在本地查看服务器上的TensorBoard
建立本地服务器与远程服务器的通信,将TensorBoard的映射端口与本地端口连接起来,本地终端运行: ssh -L 本地端口:127.0.0.1:TensorBoard端口 用户名服务器的IP地址 -p 服务器登录端口 e.g. ssh -L 10010:127.0.0.1:39353 sx110.92.137.56 -…...
硬件开发全解:从入门教程到实战案例与丰富项目资源
硬件开发全解:从入门教程到实战案例与丰富项目资源 一、硬件开发基础 1.1 硬件开发概述 硬件开发,简单来说,就是从构思到实现一个电子设备的全过程。这一过程涉及到电子电路设计、嵌入式系统编程、传感器和执行器的集成等多个关键领域。在电子…...

嵌入式学习笔记 - freeRTOS的两种临界禁止
一 禁止中断 通过函数taskENTER_CRITICAL() ,taskEXIT_CRITICAL()实现 更改就绪列表时,通常是通过禁止中断的方式,进入临界段,因为systick中断中有可以更改就绪列表的权利, 就绪列表(如 pxReadyTasksLis…...

202403-02-相似度计算 csp认证
其实这个问题就是求两篇文章的词汇的交集和并集,首先一说到并集,我就想到了set集合数据结构,set中的元素必须唯一。 STL之set的基本使用–博客参考 所以将两个文章的词汇全部加入set中,并求出set的大小,即为并集的大小…...

【Oracle】游标
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 游标基础概述1.1 游标的概念与作用1.2 游标的生命周期1.3 游标的分类 2. 显式游标2.1 显式游标的基本语法2.1.1 声明游标2.1.2 带参数的游标 2.2 游标的基本操作2.2.1 完整的游标操作示例 2.3 游标属性2.3.1…...
MySQL 中 char 与 varchar 的区别
在 MySQL 的字段类型中,char和varchar是用来处理字符串。本文来学习二者区别 一、本质区别:空间分配的 “固执” 与 “灵活” 1. char:空间占满 固定长度特性: 定义时指定长度(如char(10)),无…...
DeepSeek 赋能智能零售,解锁动态定价新范式
目录 一、引言二、智能零售动态定价策略概述2.1 动态定价的概念与原理2.2 动态定价在智能零售中的重要性2.3 传统动态定价策略的局限性 三、DeepSeek 技术解析3.1 DeepSeek 的技术原理与架构3.2 DeepSeek 的优势与特点 四、DeepSeek 在智能零售动态定价中的应用机制4.1 数据收集…...
在Flutter中定义全局对象(如$http)而不需要import
在Flutter中定义全局对象(如$http)而不需要import 在Flutter中,有几种方法可以定义全局可访问的对象(如$http)而不需要在每个文件中import: 方法1:使用GetX的依赖注入(推荐&#x…...

<4>, Qt窗口
目录 一,菜单栏 二,工具栏 三,状态栏 四,浮动窗口 五,对话框 一,菜单栏 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);// 创建菜单栏…...