6

深入理解ROI Pooling

 3 years ago
source link: http://www.banbeichadexiaojiubei.com/index.php/2020/12/10/%e6%b7%b1%e5%85%a5%e7%90%86%e8%a7%a3roi-pooling/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
2020年12月10日2020年12月10日 | by YoungTimes | No comments

深入理解ROI Pooling

0_lbtiFIOBUetVXsZt.png
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。

0_OVMjbYdDqpf3avlh.png
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框。

0_m3fiNgEsOg1yczlc.jpg
Regions of Interest, Image Source: Stephanie Boothhttps://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上。

0_Hu43KfpLLgJ3C8SP.png
Mapping our RoIs onto the output of VGG16

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

0_Ye1ZZL6zn6QXWbxw.jpg

该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是将连续的取值转换为有限的多个离散值的过程。

0_itjjLvxulVdeHboj.png
Original RoI on the feature map

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

0_8t04t1gf-7UiaQoi.png
Quantized RoI

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

0_W_0kPRvx-vkLxMNm.png

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

ROI Pooling

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

0_IoA3OWCLan-JDicO.png
Original Fast R-CNN architecture. Source: https://arxiv.org/pdf/1504.08083.pdf

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

0_hWRZgO7YQTqjquIA.png
Mapped RoI and pooling layer

Height方向上:4 / 3 = 1.33

Width方向上: 6 / 3 = 2

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

0__6sxhtyFjdjVSi2q.png

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

0_lGS0NBC7tqpIxs6O.png

完整的ROI Pooling过程如下:

0_SMrADTLV_u9SQ6EV-1024x402.gif
Data pooling process

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

0_PV3fmXrcohjrGFo_.png
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。

Screenshot-from-2020-12-10-23-06-43.png

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

Screenshot-from-2020-12-10-23-08-17.png

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

Screenshot-from-2020-12-10-23-08-52.png

对每个Pooling Section应用Max Pooling。

Screenshot-from-2020-12-10-23-09-21.png

完整的ROI Pooling过程如下:

roi_pooling-1.gif.pagespeed.ce_.5V5mycIRNu.gif

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/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK