ROI Align详解
ROI Align 解析
ROI Align 是何凯明在2017年的论文Mask-RCNN中提出的,该方法很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)问题。本文将先从实验结果入手,然后分析ROI Pooling产生局限性的具体原因和ROI Align的解决方法,最后就两种方法的反向传播公式进行简单说明。
实验对比
首先通过论文中针对ROI Align和ROI Pooling的实验结果感受下ROI Align的强大。
翻译过来就是,(c)表中基于ResNet-50-C4框架的结果中,ROI Align的分割效果明显好于ROI Pooling 和ROI Warp的效果;平均池化和最大化池化后的结果差不多,论文中多是用的平均池化的方法。(d)表中基于ResNet-50-C5框架的实验中,使用ROI Align在检测和分割领域的AP都比ROI Pooling的结果要高;池化输入的特征图比网络输入图的缩小比例越大,则ROI Align的效果越明显(缩小32倍的AP30.9大于缩小16倍的AP30.3)。
ROI Pooling的局限性
ROI Pooling是针对ROI的Pooling操作,整个过程中涉及的两次量化分别发生在对ROI坐标和对ROI划分为等大子区域上的量化。ROI可以有不同的获得方法,如在Faster R-CNN中是由RPN回归得到,故ROI的坐标一般为浮点数,此处需要量化为整数;ROI均分为等大的子区域时,若不能整除,则需要量化。如下图,665*665的矩形框经主干网络后的缩放步长为32,此框的大小也变为665/32=20.78,此时ROI Pooling将其量化为20;池化层的输出大小为7*7,等分后的子区域大小为20/7=2.86,此时将等分后的子区域大小量化为2。图中绿色栅格与其临近红色矩形框间的空白区域显示了经过两次量化后的偏差。由缩放步长可知,该特征图上1个像素的偏差在原图上就是32个像素的差别,这对小物体的检测效果影响很大。
图片1来源:https://leanote.com/api/file/getImage?fileId=5a168ad8ab644140060025d3
ROI Align的思想和实现方法
ROI Align从ROI Pooling局限性的源头上进行了改进,也就是取消了量化操作,对于量化中产生的坐标为浮点数的像素,利用双线性插值计算其像素值。值得注意的是,ROI Align并不需要对两步量化中产生的浮点数坐标的像素值都进行计算,而是设计了一套优雅的流程。
图2 Mask R-CNN中截图
论文中ROI Align的实现方法如上图所示,。其中,虚线框表示feature map,实线框表示一个ROI,Pooling输出大小为2*2,每个子区域中有四个采样点。ROI Align基于双线性插值的方法,利用feature map上距离采样点最近的四个像素得到其像素值。整个过程中没有对ROI,均分ROI产生的子区域(bins)和采样点进行量化。每个bin中采样点的数目和位置存在一定的规则,即若采样点数为1,则该点位于bin的中心位置;若采样点数为4,则采样点的位置为均分该bin为4个小矩形后各自的中心点。通常这些采样点的坐标为浮点数,所以需要用到插值的方法获得其像素值。利用该方法对图1处理后的结果如下所示。
图片3来源:https://leanote.com/api/file/getImage?fileId=5a168afaab644140060025d6
ROI Align的反向传播
通常,池化方法的反向传播公式如下。
式中,代表池化前特征图上的点,代表池化后第r个bin中的第j个点,i*(r,j)代表像素点的来源(最大化池化的时候是最大像素值所在位置的坐标)。由公式可知,只有当池化中利用到当前点的像素值(即满足i=i*(r,j))时,才会在处回传梯度。
类比于ROI Pooling,ROI Align的反向传播需要做如下修改:池化后i*(r,j)是一个浮点数坐标,在池化前的特征图中,每一个与i*(r,j)横纵坐标差值小于1的像素点(即双线性插值时特征图上的四个点),都应该接受池化后点回传的梯度,故ROI Align的反向传播公式如下。
公式中,d(.)表示像素点的距离,Δh和Δw表示与i*(r,j)横纵坐标的差值,这里作为双线性插值的系数乘在原始梯度上。
参看文献: