ROI pooling 和 ROI Align详解

2023-11-02

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

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个像素点的差别,这一差别不容小觑。

图 1
在这里插入图片描述

ROI Align 的主要思想和具体方法

为了解决ROI Pooling的上述缺点,作者提出了ROI Align这一改进的方法(如图2)。ROI Align的思路很简单:取消量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作,。值得注意的是,在具体的算法操作上,ROI Align并不是简单地补充出候选区域边界上的坐标点,然后将这些坐标点进行池化,而是重新设计了一套比较优雅的流程,如 图3 所示:

  • 遍历每一个候选区域,保持浮点数边界不做量化。
  • 将候选区域分割成k x k个单元,每个单元的边界也不做量化。
  • 在每个单元中计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。

这里对上述步骤的第三点作一些说明:这个固定位置是指在每一个矩形单元(bin)中按照固定规则确定的位置。比如,如果采样点数是1,那么就是这个单元的中心点。如果采样点数是4,那么就是把这个单元平均分割成四个小方块以后它们分别的中心点。显然这些采样点的坐标通常是浮点数,所以需要使用插值的方法得到它的像素值。在相关实验中,作者发现将采样点设为4会获得最佳性能,甚至直接设为1在性能上也相差无几。事实上,ROI Align 在遍历取样点的数量上没有ROIPooling那么多,但却可以获得更好的性能,这主要归功于解决了misalignment的问题。值得一提的是,我在实验时发现,ROI Align在VOC2007数据集上的提升效果并不如在COCO上明显。经过分析,造成这种区别的原因是COCO上小目标的数量更多,而小目标受misalignment问题的影响更大(比如,同样是0.5个像素点的偏差,对于较大的目标而言显得微不足道,但是对于小目标,误差的影响就要高很多)。

图 2
在这里插入图片描述
图 3
在这里插入图片描述

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) 横纵坐标的差值,这里作为双线性内插的系数乘在原始的梯度上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROI pooling 和 ROI Align详解 的相关文章

  • Phoneme的相关概念以及Triphone

    Phoneme的相关概念以及Triphone 目录 Phoneme的相关概念以及Triphone 前言 可用来训练HMM的基本单位 1 词 words 3 单音 syllables 4 音素 phonemes 5 Triphone 中文 基
  • Android App完全退出方式

    第一种方式是创建一个MyApplication类 继承Application 在AndroidManifest xml的application标签配置android name 并在其中加入一个 List
  • 信捷 XD PLC 16位整数转换为双精度浮点数

    完成16位整数转换为双精度浮点数 信捷XD PLC需要两个指令 逐步转换 一个指令搞不定 具体的 第1步 int16 gt int32 第2步 int32 gt Double 例子 比如说将D0转换成浮点数放到D100 D103
  • 阿里云服务器开放宝塔面板8888端口配置安全组教程

    默认情况下 阿里云处于安全考虑 仅开放了80和3389端口 云吞铺子以开放8888端口为例 1 登录到云服务器ECS控制台 2 在实例列表中 点击 更多 网络和安全组 安全组配置 或者在这 3 手动添加安全组规则 云吞铺子以添加宝塔面板管理
  • ubuntu16.04安装opencv3.4.5时出错及解决方法

    ubuntu16 04安装opencv3 4 5时 参考这篇文章 运行 cmake D CMAKE BUILD TYPE Release D CMAKE INSTALL PREFIX usr local 出现了错误 CMake Error

随机推荐

  • Go语言基础(一)

    Go语言具有支持高并发 语法简洁等特点 变量 Go语言中变量的定义可以直接定义 不需要基本数据类型 这些会自动帮你定义 但是你也可以写出变量的类型 放在变量的后面 还有一种是直接使用 来定义变量 var a initial var b c
  • spring cloud 通过Ribbon配置负载均衡 和Hystrix熔断器

    前言 本篇博客是基于上一篇博客的再度扩展springcloud项目配置 Ribbon是用于实现负载均衡的 Hystrix是用于超时的方法返回一个兜底数据的 Ribbon配置 1 在RestTemplate上加注解 LoadBalanced
  • C++类中嵌套enum(枚举)、union(联合)、struct(结构体)类型

    1 枚举 include
  • 一款非常萌的桌面工具---bongo cat mver0.1.6 附使用教程

    bongo cat mver是一款画风非常萌的桌面工具 由B站用户原创制作 具有人性化UI设置界面 可用于装饰视频或直播 能够根据鼠标 键盘操作做出相应的动作 超级可爱 该软件是以小猫的形式展现 共有四种模式供用户选择 包括键鼠 绘画 手柄
  • 5G+AIoT“零碳”解决方案

    碳交易 目前被认为是用市场机制调整碳排放的有效工具 通过有限的碳排放量分配 政府部门可以对碳排放配额进行总量控制 使纳入市场的控排企业受到碳排放限额的限制 排放量少于配额的企业可将多余的配额出来销售 反之超配额的企业 就需要到市场上去购买排
  • debian linux vnc,在Debian 9上,如何安装和配置VNC

    本教程描述了如何在Debian 9上安装和配置VNC服务器 我们还将向您展示如何创建SSH隧道并安全地连接到VNC服务器 先决条件 在继续本教程之前 请确保您以具有sudo特权的用户身份登录 安装桌面环境 你的Debian server可能
  • IOS9中出现的错误

    1 Bitcode 错误提示 ld Applications Cocos frameworks cocos2d x 3 8 1 prebuilt ios libcocos2d iOS a CCEAGLView ios o does not
  • vue3之后台管理系统权限

    权限概括 后台管理系统中权限是不可少的一部分 例如 页面权限 菜单权限 按钮权限 路由权限等 文章目录 权限概括 定义权限 一 用户登录和认证 二 前端路由控制 三 菜单权限 四 数据级别的权限控制 五 前端界面的反馈 六 按钮权限 实现思
  • java+selenium3

    一 环境搭建 1 JDK安装 配置环境变量 2 selenium下载 3 测试Demo public static void main String args throws InterruptedException todo System
  • 华为机试—字符串处理专题

    文章目录 leetbook 字符串 125 验证回文串 5 最长回文子串 131 分割回文串 见回溯 HJ1计算字符串最后一个单词的长度 单词以空格隔开 HJ2输出输入字符串中含有该字符的个数 HJ4字符串分隔 连续输入多行字符串所以用ge
  • 硬件基础元器件【1.电阻篇】

    文章目录 1 电阻 1 1 电阻的作用 1 2 电阻选型要点 1 3 电阻的主要使用场景 1 3 1 上 下拉电阻 上下拉电阻作用 阻值选择原则 1 3 2 MOS管栅极驱动电阻 1 3 3 电源反馈电阻 1 3 4 晶振并联电阻 1 3
  • 算法(C++):加一

    算法 C 加一 题目难度 简单 题目描述 给定一个由 整数 组成的 非空 数组所表示的非负整数 在该数的基础上加一 最高位数字存放在数组的首位 数组中每个元素只存储单个数字 你可以假设除了整数 0 之外 这个整数不会以零开头 示例1 输入
  • centos7下docker中mysql大小写敏感相关问题解决方案

    因为linux下的mysql默认区分大小写 而windows下的mysql默认不区分 所以关联的时候 有时候会出问题 所以我们要取消linux小的区分大小写 目录 一 mysql大小写解决方案 1 启动docker 2 运行mysql容器
  • zabbix监控TCP连接状态

    一 zabbix监控TCP连接状态 1 取到TCP连接状态的值 root web01 netstat antp awk NR gt 2 print 6 grep TIME WAIT wc l 可以取到TIME WAIT的个数 依次类推 可以
  • linux安装mysql-8.0.11出现错误

    linux安装mysql 8 0 11出现 2020 04 16T11 47 06 723455Z 0 Warning MY 011070 Server Disabling symbolic links using skip symboli
  • java基础经典题——猴子吃桃

    作为学java循环的经典问题 猴子第一天摘了若干个桃子 当即吃了一半 还不解馋 又多吃了一个 第二天 吃剩下的桃子的一半 还不过瘾 又多吃了一个 以后每天都吃前一天剩下的一半多一个 到第10天想再吃时 只剩下一个桃子了 问第一天共摘了多少个
  • Ubuntu系统中如何删除一个用户

    1 打开终端命令行 运用userdel命令删除指定的用户 注意要加sudo权限指令 如下图 sudo userdel ascend 2 在删除的时候一定注意是在管理员目录下的 普通的用户是没有这个权限的 3 删除指令执行完了以后怎么判断是否
  • linux桌面小程序开发日记4(pyqt5+yolov5)

    linux桌面小程序开发日记4 修改detect py文件 让yolov5连接摄像头 同时输出识别出来的内容 最后一篇博客地址 https blog csdn net Liuchengzhizhi article details 12369
  • 论穷举法破解0到6位数登录密码的可行性

    0到6位数密码含数字 字母大小写 英文符号有537412247190种可能性 千亿数量级 3998 410GB 在局域网网速 个人台式电脑情况下 java代码 httpclient 访问路由器网址一次要414ms 如果只访问头信息的话会快1
  • ROI pooling 和 ROI Align详解

    ROI Align 是在Mask RCNN这篇论文里提出的一种区域特征聚集方式 很好地解决了ROI Pooling操作中两次量化造成的区域不匹配 mis alignment 的问题 实验显示 在检测测任务中将 ROI Pooling 替换为