有些问题,你不解决,它一直是个问题,并且严重性会越来越大。---榴弹
Faster-RCNN论文中在RoI-Head网络中,将128个RoI区域对应的feature map进行截取,而后利用RoI pooling层输出7*7大小的feature map。
常见的RoI Pooling实现主要有以下四种方式[1]:
(1)、利用cffi进行C拓展实现,然后pytorch调用。需要单独的 C 和 CUDA 源文件,需事先进行编译。
(2)、利用cupy实现在线编译,直接为 pytorch 提供 CUDA 扩展。
(3)、利用chainer实现。
(4)、在pytorch中可以利用:
torch.nn.functional.adaptive_max_pool2d(input, output_size, return_indices=False)
# 或者
torch.nn.AdaptiveMaxPool2d(output_size, return_indices=False)
# The output is of size H x W, for any input size.
Adaptive Pooling的卷积核大小kernel_size由输入input_size和输出output_size决定,这样就保证了不管输入Tensor的size是多少,输出Tensor的大小都是output_size。
其中使用了tensor.narrow()函数,在这里记录一下。
input.narrow(dimension, start, length) → Tensor
# 表示取变量input在第dimension维上,从索引start到start+length范围(不包括start+length)的值。
example:
In [2]: x = torch.Tensor([[1,2,3], [4,5,6], [7,8,9]])
In [4]: x.narrow(0,0,3)
Out[4]:
tensor([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
In [6]: x.narrow(0,1,2)
Out[6]:
tensor([[4., 5., 6.],
[7., 8., 9.]])
In [7]: x.narrow(1, 1, 2)
Out[7]:
tensor([[2., 3.],
[5., 6.],
[8., 9.]])
RoI Pooling反向传播
对于RoI Pooling的反向传播公式可以类比max pooling的反向传播公式理解。不同的是,对于每个mini-batch 的RoI
这里为什么要求和,是因为如图1所示,当不同roi的不同区域出现重叠的情况,
RoI Pooling的两次量化过程以及RoI Align是如何改进的?
(1)、在原图上生成的region proposal 映射到feature map需要除以16或者32的时候,边界出现小数,这是第一次量化。
(2)、在每个roi里划分成k×k(7×7)的bins,对每个bin中均匀选取多少个采样点,然后进行max pooling,也会出现小数,这是第二次量化。
ROI Align并不需要对两步量化中产生的浮点数坐标的像素值都进行计算,而是设计了一套优雅的流程。如图2,其中虚线代表的是一个feature map,实线代表的是一个roi(在这个例子中,一个roi是分成了2*2个bins),实心点代表的是采样点,每个bin中有4个采样点。我们通过双线性插值的方法根据采样点周围的四个点计算每一个采样点的值,然后对着四个采样点执行最大池化操作得到当前bin的像素值。
RoI Align做法:假定采样点数为4,即表示,对于每个2.97 x 2.97的bin,平分四份小矩形,每一份取其中心点位置,而中心点位置的像素,采用双线性插值法进行计算,这样就会得到四个小数坐标点的像素值。
RoI Align反向传播[5]
类比于ROI Pooling,ROI Align的反向传播需要稍作修改:因为在ROIAlign中,
卷积的反向传播[4]:
为了符合梯度计算,我们在误差矩阵周围填充了一圈0,此时我们将卷积核翻转后和反向传播的梯度误差进行卷积,就得到了前一次的梯度误差。
参考资料:
[1]、https://www.cnblogs.com/king-lps/p/9026798.html
[2]、https://github.com/SirLPS/roi_pooling
[3]、https://blog.csdn.net/xunan003/article/details/86597954
[4]、https://www.cnblogs.com/pinard/p/6494810.html
[5]、实例分割--Mask RCNN详解(ROI Align / Loss Fun)