MaskRCNN源码解析4-0:ROI Pooling 与 ROI Align理论

MaskRCNN源码解析1:整体结构概述

MaskRCNN源码解析2:特征图与anchors生成

MaskRCNN源码解析3:RPN、ProposalLayer、DetectionTargetLayer

MaskRCNN源码解析4-0:ROI Pooling 与 ROI Align理论

MaskRCNN源码解析4:头网络(Networks Heads)解析

MaskRCNN源码解析5:损失部分解析

 

目录

一,参考文章 

 二,理论(参考上面链接3)

1.1 ROI Pooling 的局限性分析

1.2 ROI Align 的主要思想和具体方法

三,实例

3.1 将ROI区域映射到特征图上

3.2 划分池化区域

3.3 池化值的计算

 

一,参考文章 

1,https://zhuanlan.zhihu.com/p/61317964

2,https://zhuanlan.zhihu.com/p/85035860

3,http://blog.leanote.com/post/afanti.deng@gmail.com/b5f4f526490b

 

 二,理论(参考上面链接3)

ROI Align 是在Mask-RCNN这篇论文里提出的一种区域特征聚集方式, 很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题。实验显示,在检测测任务中将 ROI Pooling 替换为 ROI Align 可以提升检测模型的准确性。

1.1 ROI Pooling 的局限性分析

在常见的两级检测框架(比如Fast-RCNN,Faster-RCNN,RFCN)中,ROI Pooling 的作用是根据预选框的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和包围框回归操作。由于预选框的位置通常是由模型回归得到的,一般来讲是浮点数,而池化后的特征图要求尺寸固定。故ROI Pooling这一操作存在两次量化的过程。

  • 将候选框边界量化为整数点坐标值。
  • 将量化后的边界区域平均分割成 k x k 个单元(bin),对每一个单元的边界进行量化。

事实上,经过上述两次量化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。在论文里,作者把它总结为“不匹配问题(misalignment)。

下面我们用直观的例子具体分析一下上述区域不匹配问题。如 图1 所示,这是一个Faster-RCNN检测框架。输入一张800*800的图片,图片上有一个665*665的包围框(框着一只狗)。图片经过主干网络提取特征后,特征图缩放步长(stride)为32。因此,图像和包围框的边长都是输入时的1/32。800正好可以被32整除变为25。但665除以32以后得到20.78,带有小数,于是ROI Pooling 直接将它量化成20。接下来需要把框内的特征池化7*7的大小,因此将上述包围框平均分割成7*7个矩形区域。显然,每个矩形区域的边长为2.86,又含有小数。于是ROI Pooling 再次把它量化到2。经过这两次量化,候选区域已经出现了较明显的偏差(如图中绿色部分所示)。更重要的是,该层特征图上0.1个像素的偏差,缩放到原图就是3.2个像素。那么0.8的偏差,在原图上就是接近30个像素点的差别,这一差别不容小觑。

图 1 

1.2 ROI Align 的主要思想和具体方法

为了解决ROI Pooling的上述缺点,作者提出了ROI Align这一改进的方法(如图2)。ROI Align的思路很简单:取消量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作,。值得注意的是,在具体的算法操作上,ROI Align并不是简单地补充出候选区域边界上的坐标点,然后将这些坐标点进行池化,而是重新设计了一套比较优雅的流程,如 图3 所示:

  • 遍历每一个候选区域,保持浮点数边界不做量化。
  • 将候选区域分割成k x k个单元,每个单元的边界也不做量化。
  • 在每个单元中计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。

这里对上述步骤的第三点作一些说明:这个固定位置是指在每一个矩形单元(bin)中按照固定规则确定的位置。比如,如果采样点数是1,那么就是这个单元的中心点。如果采样点数是4,那么就是把这个单元平均分割成四个小方块以后它们分别的中心点。显然这些采样点的坐标通常是浮点数,所以需要使用插值的方法得到它的像素值。在相关实验中,作者发现将采样点设为4会获得最佳性能,甚至直接设为1在性能上也相差无几。事实上,ROI Align 在遍历取样点的数量上没有ROIPooling那么多,但却可以获得更好的性能,这主要归功于解决了misalignment的问题。值得一提的是,我在实验时发现,ROI Align在VOC2007数据集上的提升效果并不如在COCO上明显。经过分析,造成这种区别的原因是COCO上小目标的数量更多,而小目标受misalignment问题的影响更大(比如,同样是0.5个像素点的偏差,对于较大的目标而言显得微不足道,但是对于小目标,误差的影响就要高很多)。

图 2 

图 3

 

三,实例

假设原图尺寸大小为256×256,预测ROI的坐标为(6.4, 12.8, 153.6, 172.8),坐标值服从(x1,y1,x2,y2),特征图大小为8×8。现在要将ROI池化成3×3大小。我们来对比一下Roi pooling 和 ROI Align的区别

假设原图的到的8x8的特征图如下:

3.1 将ROI区域映射到特征图上

原图256x256到特征图8x8,缩放倍数是32.则预测ROI映射到特征图上的坐标为(0.2, 0.4, 4.8, 5.4)。

  • 对于ROI pooling而言,计算出来的坐标要取整,结果为(0,0,5,5)(四舍五入),此处进行了第一次量化;
  • 而ROI Align直接将坐标值除以32即可,结果为(0.2, 0.4, 4.8, 5.4)。

下图绿色是ROI-pooling结果,红色是ROI-Align结果:

 

3.2 划分池化区域

ROI pooling在划分池化区域的时候,由于roi的大小无法被池化尺寸整除,因此出现不同的池化范围此处进行了第二次量化)【举得这个例子刚好能被整除[打脸],不过这个不难理解,先这样吧】。ROI Align在进行池化区域划分的时候,不进行量化处理。

                                                           ROI-pooling池化 示意图



                                                           ROI-Align池化 示意图

3.3 池化值的计算

计算最大池化时,对于ROI Pooling,直接选出池化范围内的最大值即可,上图蓝色圈的像素,池化结果如下图所示:

对于ROI Align则比较复杂。

(1)因为最后要池化为3*3的大小,因此整个roi被划分成9个区域,每个区域称为cell。

(2)首先在每个cell内采样,此处采样系数为2,因此在池化范围内采样2*2=4个点。将cell划分成4部分,每一部分的中心点作为采样点(图中蓝色点)

(3)每一个蓝色点的值通过双线性插值计算

(4)取四个蓝色点中最大的值作为该cell的池化结果

下面推导一下左上角的蓝色点像素值计算过程,其他点类似:

根据坐标计算可以得到左上角蓝色点的坐标是(0.5825,0.8175),由此可知,改点最终像素值将由周围的四个点(0,0),(0,1),(1,0),(1,1)的像素值计算得来。

 知道蓝色点的坐标后可以计算出蓝色点到各个点的垂直和水平距离。

  • 可以计算得到蓝色点到(0,0)点的水平距离D1=0.5825,垂直距离D3=0.8175;
  • 可以计算得到蓝色点到(0,1)点的水平距离D4=0.5825,垂直距离D6=0.1825;
  • 可以计算得到蓝色点到(1,0)点的水平距离D2=0.4175,垂直距离D3=0.8175;
  • 可以计算得到蓝色点到(1,1)点的水平距离D5=0.4175,垂直距离D6=0.1825;

特征图每个点的像素值是已经得到的,本例中

  • P(0,0)= 0.1;
  • P(0,1)= 0.8;
  • P(1,0)= 0.3;
  • P(1,1)= 0.4;

最终P(左上蓝点)=(1-D1)*(1-D3)*P(0,0)+(1-D4)*(1-D6)*P(0,1)+(1-D2)*(1-D3)*P(1,0)+(1-D5)*(1-D6)*P(1,1)

                        =0.4175*0.1825*0.1+0.4175*0.8175*0.8+0.5825*0.1825*0.3+0.5825*0.8175*0.4

                        =0.50303375

假设其他三个蓝点求得值为P(右上蓝点)=0.31,P(左下蓝点)=0.19,P(右下蓝点)=0.61

那么P=max(P(左上蓝点),P(右上蓝点),P(左下蓝点),P(右下蓝点))=0.61

当然这只是9个池化划分中的一个点的计算过程,其他八个点类似。

这是我的个人理解,如有错误请批评指正!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值