RoI Align 和 RoI Pooling

发布时间 2023-09-13 17:09:03作者: Laplace蒜子

RoI Pooling

作用

将候选区域大小统一。

工作原理

假设要将7x5的候选区域,池化为2x2大小。

划分的时候粗劣的取整,7/2得到3和4,5/2得到2和3。

每个区域取最大值填充,每个网格的像素值。

缺点

直接取整太粗糙,会丢失部分信息。

在Faster RCNN中,输入RoI Pooling的是特征图,,候选框对应的是原图,需要将其放大到原图,然后再取候选区域。

假设原图大小为512x 256,映射到特征图的步距为32,则特征图大小大小为16 x 8。

假设原图候选区域中心点为(292 , 192),候选区域宽度为200,高度为145。

在RoI Pooling中需要先将特征图16 x 8放大到原图大小,也就是512x 256。

 

在原图获取候选位置,再将候选区域缩小到对应特征图尺寸。

则在特征图中,候选区域中心点为(9.125 , 6),宽度为6.25,高度为4.53。但是像素位置要取整,候选区域中心点为(9 , 6),宽度为6,高度为4,再粗略的向上取整或向下取整划分。

最终会丢是小数部分的精度。

 

RoI Align

作用

按照候选框,将图片中候选区域提取出来,并池化为统一大小,同时避免丢失更多的信息。

工作原理

假设要将大小为7x5的原图池化为2x2大小的特征图。

      1. 第一次均等划分,保持浮点边界,7/2=3.5,5/2=2.5。
      2. 第二次每个子网格按照同等规模继续划分,保持浮点边界,得到最小区域。
      3. 每个最小区域中,根据四个边界点,做双线性插值,得到最小区域的中心点像素(图中标记为 x )。
      4. 每个最小区域用中心点像素填充最小区域。
      5. 每个子区域做最大池化,最终的到目标大小的特征图。

步骤总结

第一次划分子网格 -> 每个子网格再划分最小区域 -> 小区域双线性插值取中心像素 -> 中心像素填充最小区域 -> 每个子网格做最大池化

Pytorch代码使用RoI Align

import torch
import torchvision
pooler = torchvision.ops.RoIAlign(output_size=2,sampling_ratio=2,spatial_scale=5)
#在Mask RCNN中输入的是特征图,框对应的是原图,因此需要将其缩放为原图大小。在实际应用中,若输入的是原图,缩放为1即可。
#spatial_scale: 原图到特征图的缩放比例,框对应的是原图,假设框对应的是224x224的原图,输入的特征图是112x112,则缩放比例为0.5。
#sampling_ratio:插值网格中采样点个数。如果大于0,则每个bin用sampling_ratio X sampling_ratio采样点,若小于0,则自适应
output = pooler(inputTensor,boxes)
#输入图像为一批图像,所以inputTensor形状为(N,C,H,W),N表示图像索引,C表示通道,H表示高度,W表示宽度
#boxes为tensor(K,5)形式,第一列K表示对应的图片索引,5表示候选框索引以及4个坐标点
#boxes或者一个Tensor列表,形式为List[ tensor(L,4) ],L表示候选框索引,4表示四个坐标点,tensor处于list中的下标对应图片索引。