ROI直译为感兴趣的区域(region of interest),也就是你需要检测的目标(object),一般科研中主要有两种方法,RoIPooling和RoIAlign。
现有问题是使用大量的预选框去确定目标十分浪费算力,图片的处理也十分麻烦,会很慢,而却没法端到端
目录
一、ROIPooling
目的
将不同大小的区域(通常是边界框)映射到固定大小的特征图上,以便进行后续的特征提取和分类。
操作流程
1.特征提取,得到特征图
2.将ROI区域映射到特征图上
3.将映射到的区域按维度分块,分块数量自己指定
4.对每个块单独进行pooling操作
具体细节
下例想从一个16*16的特征图得到一个2*2的ROI。
把原本8*8的ROI化为2*2的块,做max pooling操作就完成了ROIPooling操作。
缺点:该方法有一个明显的缺点,当原图映射到特征图,会有一次量化的向下取整,分块时(8*8到2*2)又有一次取整,这样会导致丢失特征,这种现象被称为区域不匹配。
参考论文:Region of interest pooling explained
二、RoIAlign
针对于ROIPooling的缺点,RoIAlign得以提出。
目的
ROI Pooling的改进版,解决了映射误差和均分误差问题,提高了后续处理的准确率。ROI Align利用虚拟像素的方法,即用双线性插值的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作。
操作流程
1.遍历每一个候选区域,保持浮点数边界不做量化。
2.将候选区域分割成k×k 个单元,每个单元的边界也不做量化(这两步和ROIPooling是一样的,只是没做量化)
3.在每个单元中计算采样点的坐标,即每一个块的最中心点,用双线性插值的方法计算出采样点的值,然后进行最大池化操作。
具体细节
还是以想得到2*2的特征为例。
前置步骤和ROIPooling一样
得到2*2的块后不直接使用max pooling操作;
假设采样点数是4,将每个单元格子均分成四个小方格,以每个小方格的中心作为采样点;采样点数是8,就将每个单元格子均分成八个小方格;
对采样点像素进行双线性插值,得到该采样点的像素值(共四个);
对每个单元格内的 4 个采样点进行 max pooling(变为一个像素值),得到最终的 ROI Align 结果。
参考论文:https://arxiv.org/abs/1703.06870
关于双线性插值,首先,图像放大会产生空白的像素点,双线性插值的目的就是给空白插值,从而填补像素,在RoIAlign中就拿来算中心点的像素值
已知的是周围点的(x,y)坐标和他们的像素值以及采样点的(x,y)坐标,求的是采样点的像素值。
求法就是x,y两个平面上分别做单线性插值的和
此图来源于:图像处理-双线性插值_哔哩哔哩_bilibili