一文图解RoI Align & RoI Warp

点击上方“CVer”,选择加"星标"置顶

重磅干货,第一时间送达

本文转载自:AI约读社

1 Why do we modify RoI Pooling?

正如在本系列文章的《目标检测》系列之一:图解 Fast RCNN & RoI Pooling 中所述,RoI Pooling有一个主要问题:它在这个过程中丢失了一部分的数据。

RoI Pooling losses in quantization (dark and light blue), data gain (green)

每次ROI Pooling过程,关于对象的部分信息就会丢失,降低了整个模型的精度。

2 Setup

在开始之前,需要快速介绍一下。我们的模型采用512x512x3(宽x高x通道)的图像输入,VGG16将其映射到一个16x16x512特征映射。比例因子为32。如下图所示:

接下来,我们使用一个建议的RoI(145x200 box),并尝试将其映射到特征映射图上。因为并不是所有的对象维度都可以除以32,所以该 ROI 映射到特征图上效果如下:

  • (9.25,6) — top left corner

  • 6.25 — width

  • 4.53 — height

再次,假设ROI Pooling 尺度为 3x3,也就是最终结果形状是 3x3x512。

到目前为止,一切看起来都和RoI Pooling完全一样。

3 RoI Align

RoI Pooling和RoI Align的主要区别是量化。RoI Align没有使用量化来进行数据处理。你知道 Fast R-CNN应用了两次量化。第一次在映射过程中,第二次在pooling过程中。

而RoI Align把原始的RoI分成9个大小相等的盒子,并在每个盒子里应用双线性插值。然后定义方框:每个框的大小由映射的RoI的大小和Pooling的大小决定。我们使用3x3的池层,所以必须将映射的RoI(6.25x4.53)除以3。这给了我们一个高度为1.51,宽度为2.08的长方体(我在这里对值进行舍入以使其更容易)。

现在,我们可以将方框放入映射的RoI中:

如果您查看第一个框(左上角),您可以注意到它覆盖了六个不同的网格单元。为了提取池层的值,我们必须从中抽取一些数据。要对数据进行采样,我们必须在该框内创建四个采样点。

您可以通过将框的高度和宽度除以3来计算每个点的位置。

在我们的例子中,我们计算第一个点(左上角)的坐标如下:

X = X_box + (width/3) * 1 = 9.94
Y = Y_box + (height/3) * 1 = 6.50

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

X = X_box + (width/3) * 1 = 9.94
Y = Y_box + (height/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)。

这一次我们从以下方面进行插值:

top-left: (10.50, 6.50)
bottom-left: (10.50, 7.50)
top-right: (11.50, 6.50)
bottom-right: (11.50, 7.50)

你应该开始在这里看到一个模式,以下是其他要点:

top-left: (9.50, 6.50)
bottom-left: (9.50, 7.50)
top-right: (10.50, 6.50)
bottom-right: (10.50, 7.50)

top-left: (10.50, 6.50)
bottom-left: (10.50, 7.50)
top-right: (11.50, 6.50)
bottom-right: (11.50, 7.50)

现在我们已经计算了所有的点,并可以对它们应用最大池(如果需要,可以是Avg Pooling):

我不打算向你们展示所有的插值,因为这需要很长时间,而且你们可能已经知道怎么做了。因为,这个过程适用于每一层,因此最终结果包含512层(与要素图输入相同)

请注意,我们没有将采样点放在特征映射的所有单元格内,而是通过双线性插值从中提取数据。

如果比较RoI Align和RoI Pooling的数据丢失/数据增益,您应该看到RoAlign使用整个区域来汇集来自以下各项的数据:

Comparing RoIAlign(left) and RoIPooling(right) data sources.

绿色表示用于Pooling 的附加数据;蓝色表示合并时数据丢失。

4 RoIWarp 

RoIWarp 方法是通过 Instance-aware semantic segmentation via multi-task network cascades 中引入的,称为RoIWarp。RoIWarp的思想或多或少与RoIAlign相同,唯一不同的是RoIWarp将RoI映射量化到特征映射上。

如果你看看数据丢失/数据增加:

由于双线性插值,RoIWarp只损失了一小部分。

5 How RoIAlign and RoIWarp affects the precision

MaskRCNN讨论了两者之间的差异,第一个是在ResNet-50-C4上应用不同RoI层时平均精度的变化,步长为16:

当应用RoIWarp时,只有一个小的改进,但是应用RoI Align可以显著提高精度。

而且这种提升随着步幅的增加而增加:

其中APbb是检测边界框的平均精度。测试在ResNet-50-C5上进行,步长为32。

6 Summary

当我们想提高R-CNN模型的准确性时,理解RoI Pooling是很重要的。2014年关于Fast R-CNN的论文中提出的标准方法与2018年关于Mask R-CNN的论文中提出的新方法之间存在显著差异,这并不意味着这些方法只适用于特定的网络,我们可以很容易地在快速R-CNN中使用RoI Align,在Mask R-CNN中使用RoI Pooling,但是RoIAlign可以使平均精度更高。

References:

R. Girshick. Fast R-CNN. In ICCV, 2014 https://arxiv.org/pdf/1504.08083.pdf

J. Dai, K. He, and J. Sun. Instance-aware semantic segmentation via multi-task network cascades. In CVPR, 2016 https://arxiv.org/pdf/1512.04412.pdf

K. He, G. Gkioxari, P. Dollar and R. Girshick. Mask R-CNN In ICCV, 2018 https://arxiv.org/pdf/1703.06870.pdf

目标检测综述下载

后台回复:目标检测二十年,即可下载39页的目标检测最全综述,共计411篇参考文献。

下载2

后台回复:CVPR2020,即可下载代码开源的论文合集

后台回复:ECCV2020,即可下载代码开源的论文合集

后台回复:YOLO,即可下载YOLOv4论文和代码

重磅!CVer-论文写作与投稿交流群成立

扫码添加CVer助手,可申请加入CVer-论文写作与投稿 微信交流群,目前已满2400+人,旨在交流顶会(CVPR/ICCV/ECCV/NIPS/ICML/ICLR/AAAI等)、顶刊(IJCV/TPAMI/TIP等)、SCI、EI、中文核心等写作与投稿事宜。

同时也可申请加入CVer大群和细分方向技术群,细分方向已涵盖:目标检测、图像分割、目标跟踪、人脸检测&识别、OCR、姿态估计、超分辨率、SLAM、医疗影像、Re-ID、GAN、NAS、深度估计、自动驾驶、强化学习、车道线检测、模型剪枝&压缩、去噪、去雾、去雨、风格迁移、遥感图像、行为识别、视频理解、图像融合、图像检索、论文投稿&交流、PyTorch和TensorFlow等群。

一定要备注:研究方向+地点+学校/公司+昵称(如论文写作+上海+上交+卡卡),根据格式备注,可更快被通过且邀请进群

▲长按加微信群

▲长按关注CVer公众号

整理不易,请给CVer点赞和在看

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
warp divergence(指变形发散)是计算机图形学中的概念,用于描述在并行计算中的处理器线程之间的差异性。在图形渲染过程中,为了提高性能,常常采用并行计算的方式来对多个像素或顶点进行处理。 然而,不同处理器线程之间的运算速度、内存访问和负载的差异性会导致某些线程完成任务的时间比其他线程更快或更慢。这种差异性被称为warp divergence。 当一个warp(一组连续的线程)中的线程执行不同的代码路径时,就会发生warp divergence。这种情况下,线程无法同时进行计算,需要等待其他线程完成执行,从而影响了整个warp的性能。 常见引起warp divergence的情况包括分支语句(如if/else、switch等),当分支条件不同的时候,不同线程会进入不同的代码分支,从而产生warp divergence。此外,也会发生在访问不连续内存、常量内存的操作中,或者在执行不同的指令集等。 为了避免warp divergence对并行计算的性能造成负面影响,可以采用一些优化技术来减少warp divergence的发生。例如,可以将分支条件相同的线程放在一个warp中,这样它们可以同时执行相同的代码分支。此外,通过合并指令、重新组织数据、考虑内存访问模式等方式,也可以降低warp divergence的风险。 综上所述,warp divergence是计算机图形学中一个重要的概念,用于描述并行计算中处理器线程之间的差异性。理解和优化warp divergence对于提高并行计算性能具有重要意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值