计算机系统应用教程网站

网站首页 > 技术文章 正文

深入理解ROI Pooling

btikc 2024-09-14 00:46:29 技术文章 20 ℃ 0 评论

Original Fast R-CNN architecture. Source: https://arxiv.org/pdf/1504.08083.pdf

本文主要讨论Fast R-CNN论文中使用的ROI Pooling(上图中蓝色矩形框部分)。

什么是ROI

ROI是Region of Interest的缩写,是原始图像上的一个Proposed Region。提取ROI的方法有很多,本文不详细讨论。

Fast R-CNN是如何工作的

Feature extraction

Fast R-CNN通过卷积神经网络进行Feature提取,生成Feature Map。

VGG16 feature extraction output size

上述例子中,输入图像的大小为512 x 512 x 3(Width x Height x Channels),输出的Feature Map大小为16 x 16 x 512,卷积神经网络使用VGG16。

注意,这里我们的神经网络输入的图像的Width和Height是输出的Feature Map的Width和Height的32倍(512 / 32 = 16);为了保持一致,对应的所有ROI都需要缩小到原有大小的1/32。

Sample ROIs

下图为单幅图片上4个ROI的示例。实际的Fast R-CNN可能会生成成百上千个这样的ROI框。

Regions of Interest, Image Source: Stephanie Booth https://www.flickr.com/photos/bunny/

注意:ROI不是Bounding Box,它们看起来很相似,但是ROI还需要经过进一步的处理才能生成Bounding Box。

How to get RoIs from the feature map?

了解了ROI和Feature Map之后,我们看看如何将ROI投射到Feature Map上。

Mapping our RoIs onto the output of VGG16

如上图所示,每个ROI都有自己的坐标和大小。为方便说明问题,我们只关注其中一个ROI,其它的都是一样的。

该ROI的大小为145×200,在原始图像中左上角的坐标为192×296,为了将该ROI投射到Feature Map上,我们需要将ROI的大小和位置对应缩放到原始大小的1/32。

  • width: 200/32 = 6.25
  • height: 145/32 = ~4.53
  • x: 296/32 = 9.25
  • y: 192/32 = 6

可以看到,只有y坐标值是可以被整除的,其它数值都是浮点数。图像的像素是不存在浮点数的,因此有一个 Quantization 的操作。

Quantization of coordinates on the feature map

Quantization是将连续的取值转换为有限的多个离散值的过程。

Original RoI on the feature map

为了解决浮点数必须转化为整数的问题,常规的做法是对浮点数进行向下取整。如下图所示:

Quantized RoI

Quantization ROI相对于原始的ROI缺失了深蓝色的区域,多了绿色的区域。也就是说Quantization ROI与原始的ROI覆盖的区域已经不一致了。

ROIAlign可以解决Quantization ROI与原始的ROI覆盖的区域不同的问题,这里我们暂不关心这个差异。

ROI Pooling

ROI投射到Feature Map之后,我们就可以应用ROI Pooling了。这里初学者可能会有一个疑问:为什么要使用ROI Pooling呢?原因是,ROI Pooling Layer之后的Fully Connected Layer的输入是固定,所以需要通过ROI Pooling将所有的ROI变成固定大小。

Original Fast R-CNN architecture. Source: https://arxiv.org/pdf/1504.08083.pdf

这里我们Quantization ROI大小为4x6x512,Fully Connect Layer的输入大小为3x3x512。

Mapped RoI and pooling layer

Height方向上:4 / 3 = 1.33

Width方向上: 6 / 3 = 2

再次应用Quantization操作,对每个1×2块应用Max Pooling操作,最终生成3×3的Pooling ROI。

由于应用了Quantization向下取整,ROI中最后一行数据再次被丢弃了。(还有另外一种非等分的保留所有数据的做法,应该都是可以的)

完整的ROI Pooling过程如下:

Data pooling process

ROI Pooling最终生成的结果是这样的:

Full-size pooling output

至此,一个ROI的ROI Pooling过程完成了。使用同样的步骤对剩下的ROI应用ROI Pooling,从而生成成百上千个3x3x512的Matrix。这些生成的Matrix被送入Fully Connect Layer,继续进行后续的BBox生成和分类预测。

另一种ROI Pooling方法

上面提到的ROI Pooling过程丢弃了最后的一行数据,在网上看到另外一种处理方法,个人理解这两种逻辑都是没问题的,只是不同的处理方法而已。

这个例子中我们假设Feature Map的大小为8×8(如下图所示),ROI Pooling后的ROI大小为2×2。

假设我们有一个Region Proposal,左上和右下角坐标分别为(0,3)和(7,8),如下图所示:

这里ROI的width和Height均不能被2(ROI Pooling输出的大小)整除,上一个ROI Pooling处理方法中,直接向下取整,把余下的数据丢弃了。这里的处理方法保留所有数据。

对每个Pooling Section应用Max Pooling。

完整的ROI Pooling过程如下:

参考材料

https://towardsdatascience.com/understanding-region-of-interest-part-1-roi-pooling-e4f5dd65bb44

https://deepsense.ai/region-of-interest-pooling-explained/

本文作者:[半杯茶的小酒杯]

本文链接: http://www.banbeichadexiaojiubei.com/index.php/2020/12/10/%e6%b7%b1%e5%85%a5%e7%90%86%e8%a7%a3roi-pooling/

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表