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

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

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])


相关文章
|
6月前
|
机器学习/深度学习 PyTorch TensorFlow
TensorFlow与PyTorch深度对比分析:从基础原理到实战选择的完整指南
蒋星熠Jaxonic,深度学习探索者。本文深度对比TensorFlow与PyTorch架构、性能、生态及应用场景,剖析技术选型关键,助力开发者在二进制星河中驾驭AI未来。
855 13
|
8月前
|
PyTorch 算法框架/工具 异构计算
PyTorch 2.0性能优化实战:4种常见代码错误严重拖慢模型
我们将深入探讨图中断(graph breaks)和多图问题对性能的负面影响,并分析PyTorch模型开发中应当避免的常见错误模式。
499 9
|
6月前
|
机器学习/深度学习 存储 算法
淘宝图片搜索接口开发实战:从 CNN 特征提取到商品匹配(附避坑手册 + 可复用代码)
本文详解淘宝图片搜索接口开发全流程,涵盖CNN特征提取、商品匹配、参数配置及400/429等高频报错解决方案,附合规避坑指南与可复用代码,助你高效实现图像搜商品功能。
|
10月前
|
机器学习/深度学习 存储 PyTorch
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
本文通过使用 Kaggle 数据集训练情感分析模型的实例,详细演示了如何将 PyTorch 与 MLFlow 进行深度集成,实现完整的实验跟踪、模型记录和结果可复现性管理。文章将系统性地介绍训练代码的核心组件,展示指标和工件的记录方法,并提供 MLFlow UI 的详细界面截图。
451 2
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
|
机器学习/深度学习 PyTorch 算法框架/工具
CNN中的注意力机制综合指南:从理论到Pytorch代码实现
注意力机制已成为深度学习模型的关键组件,尤其在卷积神经网络(CNN)中发挥了重要作用。通过使模型关注输入数据中最相关的部分,注意力机制显著提升了CNN在图像分类、目标检测和语义分割等任务中的表现。本文将详细介绍CNN中的注意力机制,包括其基本概念、不同类型(如通道注意力、空间注意力和混合注意力)以及实际实现方法。此外,还将探讨注意力机制在多个计算机视觉任务中的应用效果及其面临的挑战。无论是图像分类还是医学图像分析,注意力机制都能显著提升模型性能,并在不断发展的深度学习领域中扮演重要角色。
935 10
|
11月前
|
机器学习/深度学习 搜索推荐 PyTorch
基于昇腾用PyTorch实现CTR模型DIN(Deep interest Netwok)网络
本文详细讲解了如何在昇腾平台上使用PyTorch训练推荐系统中的经典模型DIN(Deep Interest Network)。主要内容包括:DIN网络的创新点与架构剖析、Activation Unit和Attention模块的实现、Amazon-book数据集的介绍与预处理、模型训练过程定义及性能评估。通过实战演示,利用Amazon-book数据集训练DIN模型,最终评估其点击率预测性能。文中还提供了代码示例,帮助读者更好地理解每个步骤的实现细节。
|
机器学习/深度学习 人工智能 PyTorch
【深度学习】使用PyTorch构建神经网络:深度学习实战指南
PyTorch是一个开源的Python机器学习库,特别专注于深度学习领域。它由Facebook的AI研究团队开发并维护,因其灵活的架构、动态计算图以及在科研和工业界的广泛支持而受到青睐。PyTorch提供了强大的GPU加速能力,使得在处理大规模数据集和复杂模型时效率极高。
527 59
|
机器学习/深度学习 PyTorch TensorFlow
【PyTorch】PyTorch深度学习框架实战(一):实现你的第一个DNN网络
【PyTorch】PyTorch深度学习框架实战(一):实现你的第一个DNN网络
739 2
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
【7月更文挑战第31天】在数据驱动时代,Python凭借其简洁性与强大的库支持,成为数据分析与机器学习的首选语言。**数据分析基础**从Pandas和NumPy开始,Pandas简化了数据处理和清洗,NumPy支持高效的数学运算。例如,加载并清洗CSV数据、计算总销售额等。
289 2

热门文章

最新文章

推荐镜像

更多