R-CNN 模型算法流程梳理

news2025/6/7 13:45:46

目录

一、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 联合优化)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2401095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本地日记本,用于记录日常。

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

[蓝桥杯]格子刷油漆

格子刷油漆 题目描述 X 国的一段古城墙的顶端可以看成 2N2N 个格子组成的矩形&#xff08;如下图所示&#xff09;&#xff0c;现需要把这些格子刷上保护漆。 你可以从任意一个格子刷起&#xff0c;刷完一格&#xff0c;可以移动到和它相邻的格子&#xff08;对角相邻也算数&…

ubuntu下libguestfs-tools

在ubuntu下&#xff0c;使用libguestfs-tools工具挂载其他磁盘和分区。 首先安装libguestfs-tools将vmx虚拟磁盘共享&#xff1a;sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other执行如下命令查看分区名称&#xff1a;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 服务器使用基础认证&#xff08;Basic Auth&#xff09; git config --global credential.https://…

【Web应用】若依框架:基础篇14 源码阅读-后端代码分析-课程管理模块前后端代码分析

文章目录 一、课程管理模块前端代码截图二、前端代码及分析index.vuecourse.js 三、前端执行流程1. 组件初始化2. 查询操作3. 列表操作4. 对话框操作5. API 请求6. 执行流程总结关键点 四、课程管理模块后端代码截图五、后端代码块CourseControllerICourseServiceCourseMapperC…

智能升级:中国新能源汽车充电桩规模化建设与充电桩智慧管理方案

近年来&#xff0c;中国新能源汽车产业快速发展&#xff0c;市场规模持续扩大&#xff0c;但充电基础设施的建设与管理仍面临布局不均、利用率低、智能化水平不足等问题。为推动新能源汽车普及&#xff0c;国家正加速充电桩的规模化建设&#xff0c;并通过智慧化管理提升运营效…

接口自动化测试之pytest接口关联框架封装

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一般情况下&#xff0c;我们是通过一个yaml文件进行关联实现 在根目录下新建一个文件yaml&#xff0c;通过上述conftest.py文件实现全局变量的更新: 1.首先需要建…

M1安装并使用Matlab2024a进行java相机标定

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

02-Redis常见命令

02-Redis常见命令 Redis数据结构介绍 Redis是一个key-value的数据库&#xff0c;key一般是String类型&#xff0c;不过value的类型多种多样&#xff1a; 贴心小建议&#xff1a;命令不要死记&#xff0c;学会查询就好啦 Redis为了方便学习&#xff0c;将操作不同数据类型的命…

华为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…

嵌入式学习笔记 - freeRTOS的两种临界禁止

一 禁止中断 通过函数taskENTER_CRITICAL() &#xff0c;taskEXIT_CRITICAL()实现 更改就绪列表时&#xff0c;通常是通过禁止中断的方式&#xff0c;进入临界段&#xff0c;因为systick中断中有可以更改就绪列表的权利&#xff0c; 就绪列表&#xff08;如 pxReadyTasksLis…

202403-02-相似度计算 csp认证

其实这个问题就是求两篇文章的词汇的交集和并集&#xff0c;首先一说到并集&#xff0c;我就想到了set集合数据结构&#xff0c;set中的元素必须唯一。 STL之set的基本使用–博客参考 所以将两个文章的词汇全部加入set中&#xff0c;并求出set的大小&#xff0c;即为并集的大小…

【Oracle】游标

个人主页&#xff1a;Guiat 归属专栏&#xff1a;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…

<4>, Qt窗口

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

6.04打卡

浙大疏锦行 DAY 43 复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 损失: 0.502 | 准确率: 75.53% 训练完成 import torch import torch.nn as nn import torch.optim as optim from…

【基于SpringBoot的图书购买系统】操作Jedis对图书图书的增-删-改:从设计到实战的全栈开发指南

引言 在当今互联网应用开发中&#xff0c;缓存技术已成为提升系统性能和用户体验的关键组件。Redis作为一款高性能的键值存储数据库&#xff0c;以其丰富的数据结构、快速的读写能力和灵活的扩展性&#xff0c;被广泛应用于各类系统的缓存层设计。本文将围绕一个基于Redis的图…

Spring Boot微服务架构(十):Docker与K8S部署的区别

Spring Boot微服务在Docker与Kubernetes&#xff08;K8S&#xff09;中的部署存在显著差异&#xff0c;主要体现在技术定位、管理能力、扩展性及适用场景等方面。以下是两者的核心区别及实践对比&#xff1a; 一、技术定位与核心功能 Docker 功能&#xff1a;专注于单节点容器化…

vue3:Table组件动态的字段(列)权限、显示隐藏和左侧固定

效果展示 根据后端接口返回&#xff0c;当前登录用户详情中的页面中el-table组件的显示隐藏等功能。根据菜单id查询该菜单下能后显示的列。 后端返回的数据类型: 接收到后端返回的数据后处理数据结构. Table组件文件 <!-- 自己封装的Table组件文件 --> onMounted(()>…

pikachu靶场通关笔记13 XSS关卡09-XSS之href输出

目录 一、href 1、常见取值类型 2、使用示例 3、安全风险 二、源码分析 1、进入靶场 2、代码审计 3、渗透思路 三、渗透实战 1、注入payload1 2、注入payload2 3、注入payload3 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关&#xff09;渗透集合&#xff…