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