ROI Align的实现原理

详解 Mask-RCNN 中的 “RoIAlign” 作用 / 双线性插值的方法 首先设想一个场景,从一个图像中锚定了一个人的边界框 这个时候,要提取边界框中的特征,显然应该用 CNN 网络来做这个工作。CNN 处理之后会形成一个但是 ... 阅读详情
  1. ROI Pooling 的局限性分析

在常见的两级检测框架(比如Fast-RCNN,Faster-RCNN,RFCN)中,ROI Pooling 的作用是根据预选框的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和包围框回归操作。由于预选框的位置通常是由模型回归得到的,一般来讲是浮点数,而池化后的特征图要求尺寸固定。故ROI Pooling这一操作存在两次量化的过程。

  • 将候选框边界量化为整数点坐标值。

  • 将量化后的边界区域平均分割成 k x k 个单元(bin),对每一个单元的边界进行量化。

    事实上,经过上述两次量化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。在论文里,作者把它总结为“不对齐问题(misalignment)”。

下面我们用直观的例子具体分析一下上述区域不对齐问题。如 图1 所示,这是一个Faster-RCNN检测框架。输入一张800×800的图片,图片上有一个665×665的包围框(框着一只狗)。图片经过主干网络提取特征后,特征图缩放步长(stride)为32。因此,图像和包围框的边长都是输入时的1/32。800正好可以被32整除变为25。但665除以32以后得到20.78,带有小数,于是ROI Pooling 直接将它量化成20。接下来需要把框内的特征池化7×7的大小,因此将上述包围框平均分割成7×7个矩形区域。显然,每个矩形区域的边长为2.86,又含有小数。于是ROI Pooling 再次把它量化到2。经过这两次量化,候选区域已经出现了较明显的偏差(如图中绿色部分所示)。更重要的是,该层特征图上0.1个像素的偏差,缩放到原图就是3.2个像素。那么0.8的偏差,在原图上就是接近30个像素点的差别,这一差别不容小觑。

在这里插入图片描述
引起这个定位不准确的核心原因,就是这个取整操作,所以,解决的办法也很简答

保持ROI在特征层上的小数部分,这样特征图尺寸反推原图尺寸的时候就是准确的。

比如,输入尺寸512×512,目标框200×145,经过VGG16的特征提取,特征图尺寸变成16×16,目标区域特征变成6.25×4.53,左上角坐标变成:(9.25,6),如果是roi pooling 操作,这里就直接取整,那么目标框的特征直接在特征图上粗暴的对齐了,但是就是反推的时候,会造成有一定像素的偏移(小目标比较明显)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这张图,橘色部分就是粗暴的ROI Pooling 实现的结果。

2.如何实现浮点数的ROI
我们可以通过将原始RoI划分为9个相等大小的框并在其中每个框内应用双线性插值来跳过它。然后定义框:
在这里插入图片描述

每个盒子的大小取决于映射的RoI的大小和池化层的大小。我们使用的是3x3池化层,因此我们必须将映射的RoI(6.25x4.53)除以3。这使我们得到一个具有1.51高度和2.08宽度的框(我在这里舍入数值是为了使其更容易)。现在我们可以将盒子放入映射的RoI中:
在这里插入图片描述
如果查看第一个框(左上方),您会注意到它覆盖了六个不同的网格单元。为了提取池化层的值,我们必须从中抽取一些数据。要采样数据,我们必须在该框内创建四个采样点。

在这里插入图片描述

您可以通过将框的高度和宽度除以3来计算每个点的位置。
在我们的例子中,我们正在计算第一个点(左上角)坐标,如下所示:

  • X = X_box +(width / 3)* 1 = 9.94
  • Y = Y_box +(高度/ 3)* 1 = 6.50

要计算第二点(左下方),我们只需要更改Y:

  • X = X_box +(width / 3)* 1 = 9.94
  • Y = Y_box +(高度/ 3)* 2 = 7.01

现在,当我们拥有所有点时,可以将双线性插值应用于此框的采样数据。双线性插值通常用于图像处理中以对颜色进行采样,其等式如下所示:
在这里插入图片描述
在这里插入图片描述
当您从方框中选取第一个点时,就是将其与最近的相邻单元格连接(恰好位于中间),除非已被取下。在这种情况下,我们的点的坐标为(9.44,6.50)。单元格在左上方向上最靠近中间的位置是(9.50,6.50)(如果我们的点在网格上仅高出0.01,则将是(9.50,5.50)。然后我们必须选择一个左下角的点,最接近的是(9.50,7.50)。遵循相同的规则,我们选择(10.50,6.50)和(10.50,7.50)作为右上和右下点。在RoI上方,您可以看到整个计算以获得第一个点的值(0.14)。
在这里插入图片描述
这次我们从:
左上方:(10.50,6.50)
左下角:(10.50,7.50)
右上角:(11.50,6.50)
右下角:(11.50,7.50)

在这里插入图片描述

左上方:(9.50,6.50)
左下角:(9.50,7.50)
右上角:(10.50,6.50)
右下角:(10.50,7.50)
在这里插入图片描述
最后一个点:
左上方:(10.50,6.50)
左下角:(10.50,7.50)
右上角:(11.50,6.50)
右下角:(11.50,7.50)

现在我们已经计算了所有点,可以在它们上应用最大池化(如果需要,可以是平均池化):
在这里插入图片描述
我不会向您展示所有插值,因为这将花费很长时间,并且您可能已经知道如何进行插值。我将向您展示使用RoIAlign从该RoI池中收集数据的整个过程如何工作:

在这里插入图片描述

过程适用于每一层,因此最终结果包含512层(与要素地图输入相同)

在这里插入图片描述

如果比较RoIAlign和RoIPooling的数据丢失/数据增益,您应该看到RoIAlign使用整个区域来汇总来自以下方面的数据:

比较RoIAlign(左)和RoIPooling(右)数据源。

  • 绿色表示用于合并的其他数据。
  • 蓝色(两个阴影)表示合并时数据丢失。

3. RoIWarp
RoIWarp的思想与RoIAlign大致相同,唯一的区别是RoIWarp正在将RoI映射量化为特征图。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
4. ROI Align 的反向传播
常规的ROI Pooling的反向传播公式如下:
在这里插入图片描述
这里,xi代表池化前特征图上的像素点;yrj代表池化后的第r个候选区域的第j个点;i*(r,j)代表点yrj像素值的来源(最大池化的时候选出的最大像素值所在点的坐标)。由上式可以看出,只有当池化后某一个点的像素值在池化过程中采用了当前点Xi的像素值(即满足i=i*(r,j)),才在xi处回传梯度。

类比于ROIPooling,ROIAlign的反向传播需要作出稍许修改:首先,在ROIAlign中,xi*(r,j)是一个浮点数的坐标位置(前向传播时计算出来的采样点),在池化前的特征图中,每一个与 xi*(r,j) 横纵坐标均小于1的点都应该接受与此对应的点yrj回传的梯度,故ROI Align 的反向传播公式如下:
在这里插入图片描述

上式中,d(.)表示两点之间的距离,Δh和Δw表示 xi 与 xi*(r,j) 横纵坐标的差值,这里作为双线性内插的系数乘在原始的梯度上。

5.结果对比
在这里插入图片描述
更新log:
2021年10月4日20:19:14 更新部分公式显示问题,翻译文字修正。

参考博客:
Understanding Region of Interest - Part 2 (RoI Align)
youtube:4 Mask RCNN Arc.(Part3) - How RoI Pooling, RoI Warping & RoI Align Work
youtube:hekaiming @ Mask R-CNN

图解 RoIAlign 以及在 PyTorch 中的使用(含代码示例) RoIAlign其实就是“精确版”的RoI Pooling。用于将任意尺寸的特征图,都转换为具有固定尺寸的小特征图。 阅读详情

相关推荐

RoI Pooling 和 RoI Align

RoI Pooling 和 RoI Align一、基本概念 一、基本概念 RoI(Region of Interest)是通过不同区域选择方法,从原始图像(original image)得到的候选区域(proposal region)

Tian__Gao的博客 5556

ROI Align原理介绍

是PyTorch的一个操作函数,用于在给定的RoIs(感兴趣区域)上执行空间变换网络。该操作函数可以被用于目标检测和物体识别等计算机视觉任务中,通常在RoI池化之前被执行。RoI Align(Region of Interest Align)是RoI池化的一种改进,它可以更加精确地对齐RoI中的特征,避免了RoI池化过程中的信息损失。具体来说,RoI Align操作首先将RoI区域划分为若干个小的网格,然后在每个网格内执行双线性插值,最终得到固定大小的特征图。

qq_36892712的博客 4992

ROI Align技术解析:从原理到PyTorch实现

在计算机视觉的目标检测与实例分割任务中,特征对齐精度直接影响模型性能。传统ROI Pooling方法因量化操作会引入空间误差,而ROI Align通过双线性插值和连续坐标映射,实现了亚像素级特征对齐。这种改进在Mask R-CNN等模型中显著提升了分割精度,同时保持了计算效率。从技术原理看,ROI Align解决了特征图与原始图像的空间对应问题,其PyTorch实现涉及双线性插值、边界处理等关键细节。该技术已成为现代目标检测框架的基础组件,在COCO等数据集上验证了其价值,并为可变形卷积等后续创新奠定了基础

weixin_30425949的博客 354

详解 ROI Align 的基本原理和实现细节

http://blog.leanote.com/post/afanti.deng@gmail.com/b5f4f526490bhttps://www.bilibili.com/video/av21410129?from=search&seid=5175685824130718132ROI Align 是在Mask-RCNN这篇论文里提出的一种区域特征聚集方式, 很好地解决了ROI Pool...

Do not mess it up 8831

设备树实践:从零构建一个嵌入式板级的设备树描述

本文详细介绍了如何从零开始为嵌入式Linux系统构建设备树(Device Tree),以i.MX6ULL处理器为例,涵盖硬件分析、设备树语法、外设配置及调试技巧。通过实践指导,帮助开发者掌握设备树编写,实现硬件与软件的高效对接,提升嵌入式开发效率。

plum99的博客 303

CANoe LIN一致性测试之干扰测试Test moudle_LIN Disturbance Block

注意:相邻两个显隐性不同的bit不允许干扰,例如我同时选择bit6和bit7,相邻两个同显隐性的bit允许干扰,例如当我选择bit3和bit4,项,这里我选择ID:为0x2F(PID:0x6F)的frame。需按照具体测试规范实施干扰项,帧头和数据段都可以实现干扰。最近发现一个干扰测试模块,下面是一些具体使用方法。选择干扰项:PID的奇偶校验位(一致性测试干扰测试之手动测试。一个待测试frameD。

yuanyikangkang的博客 3410

ROI Align的实现原理2_代码实现

​ 书接上文,上一次分析了一下ROI Align的原理是如何实现的,一直想知道具体细节是如何实现的,这里找了相关资料进行学习. 上一篇原理介绍博客:ROI Align的实现原理_dlvector的博客-优快云博客 输入输出的官方文档 Arguments: input (Tensor[N, C, H, W]): input tensor boxes (Tensor[K, 5] or List[Tensor[L, 4]]): the box coordinates in (x1, y1, x2, y2) f

dlvector的博客 4042

在 Mac OS 上编译 WebRTC 教程

在 Mac OS 上编译 WebRTC 教程

iShare_Carlos的博客 1248

详解ROI Polling和 ROI Align 的基本原理和实现细节

尊重作者 ROI Polling来自 转载地址1 ROI Align来自 转载地址2 目录 1.为何需要ROIPolling? 2、ROI Polling原理及具体实现 3、ROI局限性分析 4.ROI Align 的主要思想和具体方法 5. ROI Align 的反向传播 1.为何需要ROIPolling? 先来看一个问题:对于传统的CNN(如AlexNet和VGG),当网络训练好后输入的图像尺寸必须是固定值,同时网络输出也是固定大小的vector or matrix。如果输入图...

weixin_44932631的博客 1969

ROS Navigation global_planner框架解析

ROS Navigation global_planner框架解析主要讲一下我看源码总结的框架,如果大家跟着这个框架看源码的话可能会看的比较快。主要讲解global_planner关键配置参数含义及关键函数Astar,Dijkstra,QuadraticCalculator::calculatePotential,PotentialCalculator::calculatePotential,GridPath::getPath,GradientPath::getPath.

Jeff_Lee_的博客 4693

海思Hi3516DV300实战:从yolov5模型训练到Sort跟踪算法的完整部署流程

本文详细介绍了在海思Hi3516DV300芯片上部署YOLOv5目标检测与Sort多目标跟踪算法的完整流程。内容涵盖从特定场景数据训练YOLOv5模型、模型格式转换(PyTorch到ONNX再到Caffe),到利用海思NNIE引擎生成WK模型并进行端侧集成与优化的全链路实战经验,旨在解决嵌入式设备上实时人流量统计等实际应用挑战。

weixin_29034963的博客 336

ROI Align 的基本原理和实现细节

详解 ROI Align 的基本原理和实现细节 ROI Align 是在Mask-RCNN这篇论文里提出的一种区域特征聚集方式, 很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题。实验显示,在检测测任务中将 ROI Pooling 替换为 ROI Align 可以提升检测模型的准确性。 ...

weixin_30618985的博客 115

PS2硬盘启动终极指南:从FMCB到OPL,告别光驱打造游戏博物馆

在计算机存储与数据读取领域,硬盘启动技术通过将操作系统或应用程序从本地硬盘直接加载,绕过了传统光驱等外部介质,实现了速度与可靠性的双重提升。其核心原理在于利用引导程序接管系统初始化流程,直接访问硬盘上的特定分区与文件镜像。这项技术的价值在于极大提升了数据读取效率、降低了物理介质损耗,并扩展了存储容量与管理的灵活性。在怀旧游戏硬件改造、嵌入式系统定制等场景中,硬盘启动技术被广泛应用,以实现老旧设备的功能焕新与性能优化。本文聚焦于索尼PS2游戏主机的硬盘启动方案,深入探讨了如何利用FMCB(Free MCBoo

weixin_34295316的博客 1777

CUDA的旋转R ROI Align的OPENCL实现1(原理理解)

在CUDA上实现的 旋转RIO Pooling 函数ROIAlignRotatedForward需要移植到我所使用的SOC上,我使用的SOC支持OPENVX编程。 对应的CUDA 程序在下面网址 CUDA实现 旋转RIO 函数链接 从CUDA代码入手旋转RoI链接 __global__ void ROIAlignRotatedForward(const int nthreads, const scalar_t *bottom_data, co

qq_42254853的博客 3995

Android Audio其他——数字音频接口(附)

数字音频接口 DAI,即 Digital Audio Interfaces,顾名思义,DAI 表示在板级或板间传输数字音频信号的方式。相比于模拟接口,数字音频接口抗干扰能力更强,硬件设计简单,DAI 在音频电路设计中得到越来越广泛的应用。

小旭的专栏 1027

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

详解ROI Align的基本原理和实现细节

ROI Align是在Mask-RNN这篇论文里提出的一种区域特征聚集方式,很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题。实验显示,在检测任务中将ROI Pooling替换为ROI Align可以提升检测模型的准确性。 1、ROI Pooling 的局限性分析 在常见的两级检测框架(比如Fast-RCNN, Faster-RCNN, RF...

gqixf的博客 2736

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: 网课:GAMES101-现代计算机图形学入门-闫令琪
下一篇: 导向滤波原理(Guided Filter)的一些剖析和实践
dlvector
博客等级 码龄10年 85粉丝 142原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值