为什么MASKRCNN中使用ROIAlign替代ROIPool
最近Boss让看MaskRCNN,已经开始看代码了,突然发现之前学习的理论,有些忘了,所以写下来吧,微薄之见,有参考别人的。
一般来说候选框都是由回归得到的,一般都是浮点型,但是池化又需要是尺寸固定整型,所以
R
O
I
P
o
o
l
ROIPool
ROIPool存在两次量化
1>将候选框边界量化维整数坐标值
2>将量化后的边界平均分割成 k ∗ k k*k k∗k个Bin,对一个Bin的边界进行量化。
比如:
我们首先对这张图进行一个CNN提取,得到一个特征图。然后在利用 R P N RPN RPN网络在这张图上获得若干候选框,在将这些候选框映射到特征图中得到相应的特征。但是这里就会出现一个问题,我们的候选框并不都是正好对应着特征的,一般都是浮点数,所以这里出现了一个量化, R O I P o o l ROIPool ROIPool直接将进行了向下取整。
得到一个映射的区域后,需要对其进行一个 M a x P o o l i n g MaxPooling MaxPooling这里需要将这个特征区域,均分为 m ∗ m m*m m∗m的大小,同样的,也不总是整数,总会出现在下图所示:
那么同样的, R O I P o o l ROIPool ROIPool也将其量化,得到下图。
到这里我们会发现,其实从原有特征区域到最后,是经过了两次量化的。每次只是两个小数级别的误差,对于边框回归,没有太大的影响,但是对于语义上的分割,影响就非常大了,因为 M a s k R C N N MaskRCNN MaskRCNN最后是需要进行实例分割,需要像素级别的精确。在特征上1点像素的误差,放大到原图,可能是几十点像素的误差。这就对实例分割结果很不友好了。
所以在 M A S K R C N N MASKRCNN MASKRCNN中,何凯明大佬提出了 R O I A l i g n ROIAlign ROIAlign来解决这种不对齐现象。
简单来说就是, R O I A l i g n ROIAlign ROIAlign放弃了两次量化,将离散变成连续。第一次映射、第二次分割时也不做量化取整。然后采用双线性内插法,这点在原文中有提到。如图:
如图,假设图中4个方框为从左到右,从上到下依此为 A B C D ABCD ABCD。以 A A A块为例,将 A A A再次划分为4块,各取它们的中点。如图:
中点可以通过双线性内插法来计算得出。然后就可以取出它的值,做
M
A
X
P
o
o
l
MAXPool
MAXPool。依此类推得到最终的结果。
双线性插值是非常简单的,如果不知道的可以取百度下,5分钟足够。
今天就写到这里吧,该文大多还是取别家之言,如有侵权,请联系删除。