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/
本文暂时没有评论,来添加一个吧(●'◡'●)