前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >笔记分享 : 一文读懂3个概念 : RoI, RoI pooling, RoI Align

笔记分享 : 一文读懂3个概念 : RoI, RoI pooling, RoI Align

作者头像
唐国梁Tommy
发布于 2021-05-28 09:01:54
发布于 2021-05-28 09:01:54
17.6K2
举报
文章被收录于专栏:唐国梁Tommy唐国梁Tommy

哈喽,大家好,今天我们一起学习一下三个重要的概念:RoI,RoI pooling 和 RoI Align

相信学习CV(Computer Vision)的同学对此并不陌生,完全理解这三个概念有助于我们掌握深度学习目标检测与识别算法:RCNN系列(RCNN, SPPNet,fast RCNN,faster RCNN,Mask RCNN)。

接下来,我们一起开启“RoI探险之旅” :

第一部分:RoI

1. 上帝之问:RoI是个什么鬼??

英文全称是: Region of Interest (感兴趣区域),RoI是针对原始图片的提议区域(proposed region)。

【注意:后续长文中有很多专业性术语,希望各位同学提前做好心理准备。如果暂时不理解这些词,也没有关系,后续很多文章、案例、视频课程中,我都会反复提及。相信终有一天,你会完全理解这些术语。】

这里我举个栗子,比如下图中的这些矩形框(bounding box)就是RoI。可以理解为从这张图片中,模型寻找自己感兴趣的区域。

图-01

RoI pooling在fast RCNN算法中得到应用,由于该算法用一个卷积网络对原图进行feature extraction,因而共享feature map。我们看一下图示:

图-02

输入的size是: 512 x 512 x 3 (width x height x RGB),经过VGG16进行特征提取后,得到16x16x512的feature map。

这个feature map的宽和高分别是16和16,正好是输入图像512x512缩小了32倍。512 / 32 = 16,所以这里的缩小因子factor=32。记住这个值,后续所有的RoI在缩小时,都需要除以32,得到缩小后的尺寸。

【注意:不同的案例,feature map和factor的大小都不同,我们这里只是举例说明。】

2. 那如何从feature map上获取RoI呢?

将原图上的RoI映射到VGG16输出的feature map上即可,如图-03所示

每一个feature map上的RoI都有其原始RoI的坐标和尺寸,如图-04所示:

图上的红框尺寸是: 145 x 200,高=145,宽=200,左上角的坐标值=(192, 296)。

之前给各位同学提到过缩放因子factor=32,那么,这些原图上的RoI映射到feature map上,其尺寸需要缩小32倍,左上角坐标值需要缩小32倍。即:

width : 200 / 32 = 6.25 , height : 145 / 32 ~= 4.53 (宽和高)

x : 296 / 32 = 9.25 , y : 192 / 32 = 6 (左上角坐标)

我们来看一下最终的结果图,如图-05所示:

3. 在feature map上的坐标值量化(quantization of coordinates)

首先,我们需要理解“量化”的概念,量化是一个将输入从一个大的值集(如实数)限制为离散的值集(如整数)的过程。(定义有些烧脑,待会儿我们看栗子就能理解)

天之问:为啥需要量化呢?

我们再看一下feature map上的这个RoI,如图-06所示:

有没有发现一个问题?我们不能够直接在这个RoI上应用RoI pooling 操作,观察一下这个图,有些cell并没有与网格线对齐,要么多了一点,要么少了一点。解决措施就是用量化操作,说白了,就是向下取整,例如:9.25改为9,4.53改为4.

如图-07所示,量化后的RoI :

观察一下上图,深蓝色区域为丢弃的区域,左边的红色区域为新增的区域。我们再看一下量化后的RoI完整的示意图(绿色部分即为新的RoI区域),如图-08所示:

第二部分:RoI pooling

当我们将原图上的RoI映射到feature map上之后,我们可以应用pooling。其实,这里也有一个问题:为什么要用RoI pooling ?

因为在RoI pooling层之后,有固定尺寸的全连接层(Fully Connected Layer)。由于成百上千的RoI有不同的尺寸,因而需要将它们pooling到相同的尺寸,例如:3x3x512。

我们刚刚计算了量化后的RoI,尺寸=4x6x512,512是通道数量。这里的4无法被3整除,因此,需要再次量化(说白了,就是去掉小数点)。

我们分别计算一下:4 / 3 ~= 1.33 , 6 / 3 = 2 , 向下取整后,得到 1 x 2 的向量表示。如图-09所示:

观察一下上图,量化之后,左图的最后一行数据就被丢弃了。如图-10所示:

最后一行蓝色部分数据全部丢失了。

接下来,我们看一下整个操作过程的动态图演示,图-11所示:

【注意:每两个数值,选取其中最大值作为最终值】

整个RoI pooling层的输出如图-12所示:

【注意:同样的操作会作用到原始图片上的每个RoI,因此,最后会输出成百上千个3x3x512的矩阵】

每一个RoI matrix都会被输入进FC层,然后,模型会分别生成bbox和calss。

总结:RoI pooling最大的问题就是操作会导致数据丢失,影响整个模型分类和定位的准确性,解决方式就是引入了RoI Align。

第三部分:RoI Align

1. 什么是RoI Align ?

RoI Align 首先在mask RCNN中引入,后续我会详细讲解该篇论文,今天我们聚焦于RoI Align。

如图-13所示:

RoI Align 解决了 RoI pooling中的数据丢失问题,这里使得数据能够保全,没有丢失。它们之间的区别在于量化,RoI Align在data pooling中没有使用量化。

2. RoI Align 原理

① 首先将feature map上的RoI切分成9个相等尺寸的boxes,如图-14所示:

box的宽:4.53 / 3 = 1.51

box的高:6.25 / 3 = 2.08

你可以会疑惑,为什么要除以3?这是个好问题!其实,这个3主要根据你的pooling层的size有关。例如,你的pooling layer size

为3x3,那么,这里就是4.53/3 和 6.25/3。也就是说:每个box的size都取决于feature map上的RoI的大小和pooling层的大小。

如图-15所示,我们将RoI切分为9个boxes:

观察一下图中最左上角的box,它包含6个cell,如图-16所示:

下一步,我们需要从box中提取值,输入到pooling层。在这之前,需要进行数据采样。首先,需要在box中创建4个采样点,如图-17所示:

观察一下这张图,左上角中box里的4个采样点,分别是:(9.94, 6.50), (10.64, 6.50), (9.94, 7.01), (10.64, 7.01)

那么,这些点的值怎么计算出来的呢?

我们先看一下图-18,左上角起点的坐标是:(9.25, 6),即:x=9.25, y=6,每一个网格的width=2.08,height=1.51

接下来,我们分别计算网格中的四个坐标点的值,顺序是先第一列的2个点,然后再计算第二列的2个点。

第一个点的坐标计算:

X1 : 9.25 + (2.08 / 3) ~= 9.94

Y1 : 6 + ( 1.51 / 3) ~= 6.50

第二个点的坐标计算:

X2 : 9.25 + (2.08 / 3) ~= 9.94

Y2 : 6 + ( 1.51 / 3) * 2 ~= 7.01

第三个点的坐标计算:

X3 : 9.25 + (2.08 /3) * 2 ~= 10.64

Y3 : 6 + ( 1.51 / 3) ~= 6.50

第四个点的坐标计算:

X4 : 9.25 + (2.08 /3) * 2 ~= 10.64

Y4 : 6 + ( 1.51 / 3) * 2 ~= 7.01

② 计算完4个点坐标之后,我们将利用双线性差值公式计算差值,我们不需要知道这个公式怎么来的,随时网上找这个公式即可。公式如图-19所示:

根据这个公式,我们先计算第一个点的双线性差值,如图-20所示:

第一个点的双线性差值为:0.14

按照同样的方式计算出第二个点的差值,如图-21所示:

第二个点的双线性差值为:0.21

按照同样的方式计算出第三个点的差值,如图-22所示:

第三个点的双线性差值为:0.51

按照同样的方式计算出第四个点的差值,如图-23所示:

第四个点的双线性差值为:0.43

计算完一个网格中四个双线性插值后,可以利用max pooling获取四个值中的最大值当做最终值。如图-24所示:

下面的动态图演示了通过max pooling获取每个网格中的最大值,如图-25所示:

同样的计算方法会应用到所有层(512层),如图-26所示:

RoI Align 与 RoI Pooling的区别在于前者在计算过程中会用到所有数据,而后者则会丢失数据。如图-27所示:

我们对比一下这两者的性能的区别:如图-28所示:

总结来看,RoIAlign在precision上带来了更大的性能提升。

本篇学习笔记主要参考文章:

https://towardsdatascience.com/understanding-region-of-interest-part-2-roi-align-and-roi-warp-f795196fc193

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 唐国梁Tommy 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
写的真不错,看懂了,点个赞,之前一直困惑roialign怎么取浮点数坐标范围内的点的,原来是1.确定浮点数坐标的范围,2.确定被分割成几分,resnet50最后是7x7,3.分成7x7分,在每份的小格子里安装采样点(一般2x2,四个采样点由周边的四个已知点的数值,双线性采样得到),3.最后按照到maxpool取四个值里的最大值。
写的真不错,看懂了,点个赞,之前一直困惑roialign怎么取浮点数坐标范围内的点的,原来是1.确定浮点数坐标的范围,2.确定被分割成几分,resnet50最后是7x7,3.分成7x7分,在每份的小格子里安装采样点(一般2x2,四个采样点由周边的四个已知点的数值,双线性采样得到),3.最后按照到maxpool取四个值里的最大值。
回复回复1举报
写的太太太太太好了!!!!!!!!!!写的好清楚啊唐老师,为了给你评论特意注册一个账号。写的真的很好很好!!!!!!!!!!!向您学习
写的太太太太太好了!!!!!!!!!!写的好清楚啊唐老师,为了给你评论特意注册一个账号。写的真的很好很好!!!!!!!!!!!向您学习
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
2018-10-14 Redisson项目介绍Redisson项目介绍i flym
Rui Gu edited this page <relative-time datetime="2018-05-23T22:07:43Z" title="May 24, 2018, 6:07 AM GMT+8" style="box-sizing: border-box;">on May 24</relative-time> · 18 revisions
Albert陈凯
2018/10/15
1.1K0
redis学习之redis应用(四)
Redis Java客户端有很多的开源产品比如Redission、Jedis、lettuce
周杰伦本人
2022/10/25
4690
redis学习之redis应用(四)
分布式锁中的王者方案 - Redisson
上篇讲解了如何用 Redis 实现分布式锁的五种方案,但我们还是有更优的王者方案,就是用 Redisson。
悟空聊架构
2022/05/13
1.4K0
分布式锁中的王者方案 - Redisson
Redis都要老了,你还在用什么古董客户端?
前几日,Redis 创始人 Antirez 在他的个人博客上宣布将结束自己的 Redis 之旅!
xjjdog
2020/07/09
7890
Jedis与Redisson选型对比
1  概述 1.1.       主要内容 本文的主要内容为对比Redis的两个框架:Jedis与Redisson,分析各自的优势与缺点,为项目中Java缓存方案中的Redis编程模型的选择提供参考。 2.    Jedis与Redisson对比 2.1.    概况对比 Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区
王金龙
2018/08/24
3.1K0
简单聊聊Redis中的几种java客户端,以及它们的优缺点!
相对于其他的分布式中间件,Redis 支持的客户端种类非常繁多,涵盖更加全面,除了支持比较流行的 c、c++、java、C#、php、Python 等语言以外,还支持 Objective-C、Swift、Node.js 等等,以下是来自于 Redis 支持的按语言分类的客户端截图。
Java极客技术
2023/02/23
1.4K0
简单聊聊Redis中的几种java客户端,以及它们的优缺点!
一起来学redis redission
redis 的客户端有jedis、lettuce、redission;我个人比较推荐的是redission,因为它的分布式锁和缓存实在是太优秀了。Redisson采用了基于NIO的Netty框架,封装了大家常用的集合类以及原子类、锁等工具。
六个核弹
2022/12/23
2.1K0
一起来学redis redission
Redis实战篇
Redis 监听默认 6379 的端口号,可以通过 TCP 方式建立连接。 服务端约定了一种特殊的消息格式,叫做 Redis Serialization Protocol(RESP,Redis 序列化协议),发消息或者响应消息需要按这种格式编码,接收消息需要按这种格式解码。 Redis 设计这种格式的原因∶ 容易实现、解析快、可读性强。 Redis6.0新特性里面说的RESP协议升级到了3.0 版本,其实就是对于服务端和客户端可以接收的消息进行了升级扩展,比如客户端缓存的功能就是在这个版本里面实现的。
编程之心
2021/07/14
8900
Redis实战篇
redisson应用之分布式集合
Redisson的分布式Map结构的RMap Java对象实现了java.util.concurrent.ConcurrentMap接口和java.util.Map接口。同时还保持了元素的插入顺序。该对象的最大容量受Redis限制,最大元素数量是4 294 967 295个。
kl博主
2023/11/18
5910
Redis 客户端 Jedis 的那点事
Redis ,全称为 “Remote Dictionary Server ”,即:远程字典服务器。一款完全开源免费,基于 C 语言编写,遵守 BSD 协议,高性能的 ( Key/Value ) 分布式内存数据库。其基于内存运行并支持持久化的 NoSQL 数据库, 是当前最热门的 NoSQL 数据库之一,通常也被称之为“数据结构服务器”。Redis 为典型的 C/S 架构,基于 Java 语言平台,其使用 Socket、Redis 的 RESP(Redis Serialization Protocol 即 Redis 序列化协议)协议进行业务处理。作为一款备受欢迎的组件,其主要应用于如下场景中:缓存、计数器、购物车、点赞/打卡、分布式锁等等。
Luga Lee
2021/12/09
1K0
Redis 客户端 Jedis 的那点事
分布式锁中的王者方案-Redisson
上篇讲解了如何用 Redis 实现分布式锁的五种方案,但我们还是有更优的王者方案,就是用 Redisson。
悟空聊架构
2021/06/01
1.2K0
分布式锁中的王者方案-Redisson
Redis分布式锁的几种演进方案
需要一种支持分布式集群环境下的锁:查询 DB 时,只有一个线程能访问,其他线程都需要等待第一个线程释放锁资源后,才能继续执行。
Ant丶
2022/03/01
6800
Redis分布式锁的几种演进方案
Redis 客户端 Jedis 的那点事
作为分布式缓存系统之一,Redis 应用场景较为广泛,落地于不同的行业领域以及业务场景,因此,在整个架构拓扑中起着重要的作用。
Luga Lee
2021/11/22
2K0
Redis 客户端 Jedis 的那点事
分布式锁工具Redisson,太香了!!
Redisson和它俩的区别就像一个用鼠标操作图形化界面,一个用命令行操作文件。Redisson是更高层的抽象,Jedis和Lettuce是Redis命令的封装。
用户1263954
2022/10/28
1.1K0
分布式锁工具Redisson,太香了!!
【Redis破障之路】四:Jedis基本使用
在前面我们已经学习了Redis命令行客户端redis-cli的使用,接下来我们了解一下Redis基于Java编程语言的客户端。
三分恶
2021/05/24
6300
【Redis破障之路】四:Jedis基本使用
springboot第57集:Redis万字挑战,一文让你走出微服务迷雾架构周刊
Redis的内存回收机制通过内置的内存管理器来实现。当内存使用量超过了maxmemory配置的限制时,Redis会根据预先配置的内存淘汰策略来选择要删除的数据,以释放内存空间。这些策略通常基于数据的访问模式和重要性来决定,以保证在内存不足的情况下,删除的数据对系统的影响最小。
达达前端
2024/02/21
2130
springboot第57集:Redis万字挑战,一文让你走出微服务迷雾架构周刊
【进阶篇】Redis实战之Redisson使用技巧详解,干活!
相比于 Jedis、Lettuce 等基于 redis 命令封装的客户端,Redisson 提供的功能更加高端和抽象,逼格高!
Java极客技术
2023/02/23
7.5K1
【进阶篇】Redis实战之Redisson使用技巧详解,干活!
Redisson分布式锁最基础内容
Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。
ha_lydms
2023/08/10
1830
Redisson分布式锁最基础内容
Redis真的是单线程吗?
Redis,全名REmote DIctionary Server,开源的高性能的KV内存数据库,支持数据持久化。 开源的支持多种数据结构的基于键值的存储服务系统,高性能、功能丰富。
JavaEdge
2022/11/30
8580
Redis真的是单线程吗?
Redis之Java客户端【Jedis,Spring Data Redis】
在Redis官网中提供了各种语言的客户端,地址:/docs/clients/,不过我是学Java的,那这里就给大家介绍javad的客户端。
叫我阿杰好了
2022/11/07
1.2K0
Redis之Java客户端【Jedis,Spring Data Redis】
推荐阅读
相关推荐
2018-10-14 Redisson项目介绍Redisson项目介绍i flym
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档