ROI Pooling和ROI Align都是为了解决目标检测RPN任务后得到的一系列proposals大小不一致的问题。
假设有一张特征图大小为8x8(原图大小sxs),一个bbox坐标(0, 3, 7, 8),我们目标是获得大小为2x2的特征图作为后续网络的输入。
此时bbox的h=5,w=7。无法对半分,因此取整分,h分为2和3,w分为3和4(如果可以对半分即对半分)。然后在每一块内容中做max polling操作,得到2x2大小的输出作为下层网络的输入。
既然已经存在ROI Polling为何发展了ROI Algin呢?这与ROI Polling的缺陷有关:
从上面可以看到ROI Polling可能经过了两次取整的操作,得到特征层中bbox坐标和将特征层平分时进行的取整操作。
假设上图,一张800x800的原图,有一个大小为665x665的bbox。第一次取整操作即我们经过特征提取网络时将图像下采样32倍时,bbox大小665/32=20.78,ROI Polling直接量化为20。第二次取整操作即我们把特征层均分时,假设均分为7份,20/7=2.86,ROI Polling量化为20。经过上面两次量化取整,候选区域就会出现明显的偏差,ROI Algin解决了这个问题。
ROI Aligin为了解决上面的问题,取消了量化取整的操作,大概思想如下:
3. 在每个单元格中取四个点(作者发现四个点效果最好),如上图中的蓝色点。
4. 针对每一个蓝点,距离它最近的4个真实像素点的值加权(双线性插值),求得这个蓝点的值
5. 在每个单元内对得到的四个蓝色点的值进行max polling操作,最终得到2x2的输出
参考文章https://www.pianshen.com/article/69221232781/#3%E3%80%81ROI%E5%B1%80%E9%99%90%E6%80%A7%E5%88%86%E6%9E%90
class: torchvision.ops.RoIAlign(output_size, spatial_scale, sampling_ratio)
参数 | 可选值 | 描述 |
---|---|---|
output_size | int or Tuple[int, int] | 输出大小 |
spatial_scale | float | 将输入坐标映射到框坐标的比例因子。默认值1.0。 |
sampling_ratio | int | 插值网格中用于计算每个合并输出bin的输出值的采样点数目。如果> 0,则恰好使用sampling_ratio x sampling_ratio网格点。如果<= 0,则使用自适应数量的网格点(计算为cell (roi_width / pooled_w),同样计算高度)。默认值1。 |