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

2024-01-31 15:28

本文主要是介绍【PyTorch实战演练】Fast R-CNN中的RoI(Region of Interest)池化详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 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-CNNArgs:input (Tensor[N, C, H, W]): The input tensor, i.e. a batch with ``N`` elements. Each elementcontains ``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 shouldcontain 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 iin the batch.output_size (int or Tuple[int, int]): the size of the output after the croppingis performed, as (height, width)spatial_scale (float): a scaling factor that maps the box coordinates tothe input coordinates. For example, if your boxes are defined on the scaleof a 224x224 image and your input is a 112x112 feature map (resulting from a 0.5x scaling ofthe original image), you'll want to set this to 0.5. Default: 1.0Returns: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])

这篇关于【PyTorch实战演练】Fast R-CNN中的RoI(Region of Interest)池化详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/664233

相关文章

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

详解MySQL中DISTINCT去重的核心注意事项

《详解MySQL中DISTINCT去重的核心注意事项》为了实现查询不重复的数据,MySQL提供了DISTINCT关键字,它的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据... 目录DISTINCT 六大注意事项1. 作用范围:所有 SELECT 字段2. NULL 值的特殊处

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安