【PyTorch实战演练】Fast R-CNN中的RoI(Region of Interest)池化详解

news2024/12/26 22:41:48

文章目录

      • 0. 前言
      • 1. ROI池化的提出背景
      • 2. RoI池化的结构与工作原理
      • 3. RoI池化的作用及意义
      • 4. RoI使用示例

0. 前言

按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。

本文基于Ross Girshick在2015年发表的论文Fast R-CNN 讲解在Fast R-CNN中的RoI池化的作用及原理。

1. ROI池化的提出背景

在目标检测领域,早期的方法R-CNN(Region-based Convolutional Neural Networks)虽然取得了显著的进步,但它将任务分解为多个阶段工作流(multi-stage pipelines),每个阶段都负责处理特定的子任务,并将其输出传递给下一个阶段。

这就造成了训练时也要分阶段进行,最终导致计算效率低下、无法实现端到端训练等不足。另外,R-CNN中,每个候选区域需要独立地通过全卷积网络提取特征,特征图不共享,这样导致了大量的重复计算。受此启发,Girshick等人提出了Fast R-CNN模型,该模型首次引入了RoI池化这一关键组件。
在这里插入图片描述
除了计算效率低之外,R-CNN的另一个缺点是丢失训练原图的精度,这是因为深度卷积网络之后是全连接网络,而全连接层的输入大小是必须固定的,进而也就要求了卷积层输出的特征图尺寸也要固定,但候选区域(proposal region)大小是不固定的,这就意味着需要对原图进行缩放(warp)或裁剪(crop),最终导致原图精度丢失。

RoI池化的设计初衷是为了优化R-CNN中的特征提取步骤,它解决了传统方法中由于候选框尺寸不一而导致的特征大小不匹配问题,并把训练由多阶变成单阶有效减少了计算成本。在Fast R-CNN之后,Ross Girshick等人又于2016年进一步发展了Faster R-CNN模型,在保持高效性能的同时,利用区域提议网络(RPN)生成候选框,而RoI池化则负责将这些候选框映射回特征图并进行特征统一化处理,从而实现了更为高效的检测流程。

关于RPN,之前的文章已经介绍过:RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)

2. RoI池化的结构与工作原理

RoI池化位于整个Faster R-CNN架构的特征提取部分与分类回归部分之间:
在这里插入图片描述
其结构主要包括以下2步:

  1. RoI投影:首先,来自RPN或外部提供的候选区域被映射到预训练的主干网络(如VGG)输出的共享特征图上。每个候选区域定义了一个在特征图上的矩形区域,其数据维度为(N, 5),其中N为候选区域(候选框)的数量,5为候选框的尺寸(x, y, w, h)加一个候选框id。

  2. RoI池化层:对于每个映射后的候选区域,RoI池化层采用最大池化,将其转换为一个固定的尺寸,例如7x7像素。这意味着不论原始候选框尺寸如何变化,经过RoI池化层后都会得到相同维度的特征向量。

经过RoI池化以及后续的全连接层等最后有两个输出:①分类输出:输出目标的分类向量,例如onehot向量;②回归输出:输出bounding box的尺寸(x, y, w, h)。

3. RoI池化的作用及意义

RoI池化在目标检测框架中具有核心作用:

  • 减少计算复杂度:通过一次前向传播计算出整张图像的特征图,然后在该特征图上对所有候选区域进行池化操作,避免了对每个候选框都进行单独的卷积计算,极大地提高了算法效率。

  • 标准化特征表示:无论输入的目标对象尺寸如何变化,ROI池化都能将其转化为固定长度的特征向量,这使得后续全连接层可以接受统一格式的输入,便于进行分类和边界框回归任务。

  • 增强模型泛化能力:通过池化操作,模型能够更好地应对不同尺度和长宽比的目标,增强了模型在各种复杂场景下的适应性和鲁棒性。

综上所述,RoI池化作为Fast R-CNN的核心组成部分,它的设计和应用不仅提升了目标检测系统的实时性和准确性,而且为深度学习目标检测算法的发展奠定了坚实基础。

4. RoI使用示例

这里以 torchvision.ops中的roi_pool模块说明RoI的使用示例,首先看下roi_pool的源代码定义:

在开始前需要对比说明下torchvision中的roi_poolroi_alignroi_alignroi_pool的一个改进版本,它在Mask R-CNN等更现代的目标检测和实例分割模型中被广泛采用,目前roi_align是更常用的方法。
本文作为示例仅说明roi_pool的使用方法。当然在实际使用中也很少有人会单独使用RoI模块,这个示例纯粹是为了加深对RoI的理解。

def roi_pool(
    input: Tensor,
    boxes: Union[Tensor, List[Tensor]],
    output_size: BroadcastingList2[int],
    spatial_scale: float = 1.0,
) -> Tensor:
    """
    Performs Region of Interest (RoI) Pool operator described in Fast R-CNN

    Args:
        input (Tensor[N, C, H, W]): The input tensor, i.e. a batch with ``N`` elements. Each element
            contains ``C`` feature maps of dimensions ``H x W``.
        boxes (Tensor[K, 5] or List[Tensor[L, 4]]): the box coordinates in (x1, y1, x2, y2)
            format where the regions will be taken from.
            The coordinate must satisfy ``0 <= x1 < x2`` and ``0 <= y1 < y2``.
            If a single Tensor is passed, then the first column should
            contain the index of the corresponding element in the batch, i.e. a number in ``[0, N - 1]``.
            If a list of Tensors is passed, then each Tensor will correspond to the boxes for an element i
            in the batch.
        output_size (int or Tuple[int, int]): the size of the output after the cropping
            is performed, as (height, width)
        spatial_scale (float): a scaling factor that maps the box coordinates to
            the input coordinates. For example, if your boxes are defined on the scale
            of a 224x224 image and your input is a 112x112 feature map (resulting from a 0.5x scaling of
            the original image), you'll want to set this to 0.5. Default: 1.0

    Returns:
        Tensor[K, C, output_size[0], output_size[1]]: The pooled RoIs.
    """

使用示例:

import torch
from torchvision.ops import roi_pool

# 假设我们有以下输入:
input_feature_map = torch.randn(10, 256, 32, 32, dtype=torch.float32)  # [N, C, H, W],N是批量大小,C是通道数,H和W是特征图的高度和宽度
rois = torch.tensor([[0, 1, 1, 10, 10],  # 对于每个ROI,前一个数字是batch索引,后四个是左上角和右下角坐标
                      [1, 30, 30, 100, 100]], dtype=torch.float32)  # [K, 5],K是ROI的数量,这里K=2

# 定义输出尺寸(例如7x7)
output_size = (7, 7)
# 定义空间比例因子,通常是在特征图与原始图像之间做归一化处理
spatial_scale = 1.0 / 16  # 假设特征图是原图经过16倍下采样得到的

# 应用ROI Pooling
pooled_features = roi_pool(input_feature_map, rois, output_size, spatial_scale)
print(pooled_features.shape)
# pooled_features 的形状将是 [K, C, output_size[0], output_size[1]],输出为torch.Size([2, 256, 7, 7])

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

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

相关文章

Linux第40步_移植ST公司uboot的第1步_创建配置文件_设备树_修改电源管理和sdmmc节点

ST公司uboot移植分两步走&#xff1a; 第1步&#xff1a;完成“创建配置文件&#xff0c;设备树&#xff0c;修改电源管理和sdmmc节点&#xff0c;以及shell脚本和编译”。 第2步“完成”修改网络驱动、USB OTG设备树和LCD驱动&#xff0c;以及编译和烧写测试“。 移植太复杂…

Spring 中获取 Bean 对象的三种方式

目录 1、根据名称获取Bean 2、根据Bean类型获取Bean 3、根据 Bean 名称 Bean 类型来获取 Bean&#xff08;好的解决方法&#xff09; 假设 Bean 对象是 User&#xff0c;并存储到 Spring 中&#xff0c;注册到 xml 文件中 public class User {public String sayHi(){retur…

小型洗衣机什么牌子好又便宜?家用内衣洗衣机推荐

近几年家用洗衣机标准容积的大大增加&#xff0c;从5Kg、6Kg升级到9Kg、10Kg。大容量洗衣机满足了家庭中清洗大件衣物、床上用品的需求。但由于普通大型洗衣机所洗衣物混杂&#xff0c;很多时候内衣袜子、宝宝衣物数量不多&#xff0c;却也并不适合放在一起扔进大型洗衣机中清洗…

关于maven项目构建的解释

在Idea中使用模块化构建项目 项目介绍&#xff1a; sky-take-out sky-common pom.xml sky-pojo pom.xml sky-server pom.xml pom.xml 说明 sky-server依赖sky-pojo和sky-common&#xff0c;继承sky-take-outsky-pojo继承sky-take-outsky-common继承sky-take-out 由于Idea编…

“二奢”已成为年轻人新年货

配图来自Canva可画 正应了那句流行语&#xff1a;“不是全新买不起&#xff0c;而是二奢更有性价比。” 现今&#xff0c;“买二手、用二手”不再是什么让人难以启齿的事情&#xff0c;反而被越来越多年轻人推崇&#xff0c;二奢消费已然成为一种流行的生活方式。人们积极通过…

向上调整向下调整算法

目录 AdjustUp向上调整 AdjustDown向下调整 AdjustUp向上调整 前提是&#xff1a;插入数据之后&#xff0c;除去插入的数据其他的数据还是为堆 应用&#xff1a;插入数据。 先插入一个10到数组的尾上&#xff0c;再进行向上调整算法&#xff0c;直到满足堆。 性质&#xff1…

2024年网络安全趋势简析

国际研究机构Gartner会在每年10月份左右发布下一年度的战略发展趋势预测&#xff0c;并在次年3月左右发布和网络安全相关的趋势预测。绿盟科技通过将近3年的趋势预测进行分组对比分析后发现&#xff0c;除了众人皆知的AI技术应用外&#xff0c;数据模块化、身份优先安全、行业云…

力扣 122.买卖股票的最佳时机 II

代码&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {if(prices.size()1) return 0;int res 0;int i0;while(i<prices.size()-1){int ji1;if(prices[j]>prices[i]){//在找到对应元素的下一个元素比他大的时候买入while(j1 < p…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-菜单管理实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

uniapp状态管理Vuex介绍及vuex核心概念

状态管理Vuex Vuex 是什么&#xff1f; Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 uni-app 内置了 Vuex 什么是“状态管理模式”&#xff1f; <!…

集成学习之Boosting方法系列_XGboost

文章目录 【文章系列】【前言】【算法简介】【正文】&#xff08;一&#xff09;XGBoost前身&#xff1a;梯度提升树&#xff08;二&#xff09;XGBoost的特点&#xff08;三&#xff09;XGBoost实际操作1. 前期准备&#xff08;1&#xff09;数据格式&#xff08;2&#xff09…

使用Banana Pi BPI-R4开发板实现5G上网、Wi-Fi AP、文件共享和Docker服务

转载&#xff1a;本文出处https://think8848.cnblogs.com和作者: think8848 本文目的&#xff1a;记录近一个月以来折腾BPI-R4的过程&#xff0c;为后面可能的学习提供参考资料&#xff0c;此外也把折腾中踩过的坑发出来&#xff0c;让更多研究BPI-R4的筒子们少踩坑。 一、需求…

wifi配网(esp8266和esp32)-http get和post方式

wifi配网(esp8266和esp32)-http get和post方式 通过http get和post方式来给esp芯片配网 步骤&#xff1a; 开机&#xff0c;指示灯亮起后(需要灯闪烁3下后)&#xff0c;需在3s内&#xff08;超过3s则会正常启动&#xff09;&#xff0c;按一下按键&#xff08;注&#xff1a;切…

大数据学习之Redis,十大数据类型的具体应用(一)

目录 3. 数据类型命令及落地应用 3.1 备注 3.2 Redis字符串&#xff08;String&#xff09; 单值单value 多值操作 获取指定区间范围内的值 数值增减 获取字符串长度和内容追加 分布式锁 getset(先get后set) 3.3 Redis列表&#xff08;List&#xff09; 简单说明 …

网络协议与攻击模拟_11DHCP欺骗防护

开启DHCP 监听 ip dhcp snooping 指定监听vlan ip dhcp snooping vlan 1 由于开启监听后&#xff0c;交换机上的接口就全部变成非信任端口&#xff0c; 非信任端口会拒绝DHCP报文&#xff0c;会造成正常的DHCP请求和响应都无法完成。 现在是请求不到IP地址的&#xff0c;…

2023美赛A题之Lotka-Volterra【完整思路+代码】

这是2023年的成功&#xff0c;考虑到曾经付费用户的负责&#xff0c;2024年可以发出来了。去年我辅导队伍数量&#xff1a;15&#xff0c;获奖M为主&#xff0c;个别F&#xff0c;H&#xff0c;零S。言归正传&#xff0c;这里我开始分享去年的方案。由于时间久远&#xff0c;我…

IDEA2023打开新项目默认SDK变成了17

问题描述 项目安装了2个sdk版本&#xff0c;jdk8和jdk17 自从升级IDEA版本到2023以后&#xff0c;每次打开新项目&#xff0c;sdk都被默认选择成了jdk17, 每次都得手动修改 &#xff08;File--Project Structure&#xff09;&#xff0c;超级麻烦。 没有用的解决方法 以下这…

机器学习系列-2 线性回归训练损失

机器学习系列-2 线性回归&训练损失 学习内容来自&#xff1a;谷歌ai学习 https://developers.google.cn/machine-learning/crash-course/framing/check-your-understanding?hlzh-cn 本文作为学习记录1 线性回归&#xff1a; 举例&#xff1a;蝉&#xff08;昆虫物种&…

设计模式篇---备忘录模式

文章目录 概念结构实例总结 概念 备忘录模式&#xff1a;在不破坏封装的前提下捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;像这样可以在以后将对象恢复到原先保存的状态。 就好比我们下象棋&#xff0c;下完之后发现走错了&#xff0c;想要回退…

STM32——感应开关盖垃圾桶

STM32——感应开关盖垃圾桶 1.定时器介绍 软件定时 缺点&#xff1a;不精确、占用CPU资源 void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (--k);} while (--j);} while (--i); }定时器工作原理 使用精准的时基&#xff…