CUDA的旋转R ROI Align的OPENCL实现1(原理理解)

在CUDA上实现的 旋转RIO Pooling 函数ROIAlignRotatedForward需要移植到我所使用的SOC上,我使用的SOC支持OPENVX编程整个学习的过程是为了在OPENVX上实现旋转R ROI Align。
其中 ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。在Halcon、OpenCV、Matlab等机器视觉软件上常用到各种算子(Operator)和函数来求得感兴趣区域ROI,并进行图像的下一步处理。

ROI Pooling池化介绍

Pooling 池化层:进行下采样,对特征图稀疏处理,减少数据运算量。通过卷积层获得了图像的特征之后,理论上可以直接使用这些特征训练分类器(如softmax),但这样做将面临巨大的计算量挑战,且容易产生过拟合现象。为了进一步降低网络训练参数及模型的过拟合程度,需要对卷积层进行池化/采样(Pooling)处理。

关于RoI Pooling最重要的事情是:
1.用于对象检测任务
2.允许我们重新使用卷积网络中的特征映射
3.可以显着加快训练(train)和测试时间
4.允许以端到端的方式训练物体检测系统

池化/采样的方式通常有以下两种:
1)Max-Pooling: 选择Pooling窗口中的最大值作为采样值;

在这里插入图片描述

2)Mean-Pooling: 将Pooling窗口中的所有值相加取平均,以平均值作为采样值。

在这里插入图片描述

ROI Align介绍

ROI Align 是何凯明在2017年的论文Mask-RCNN中提出的,该方法很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)问题我认为就是由于像素对应位置不能被整分,导致多几次处理后对应位置和实际图像位置有差别导致。

ROI-pooling的区域不匹配(mis-alignment)问题简介:

roi-pooling的输入是proposal的坐标,这些坐标由RPN计算得到,因为经过一次回归,所以跟原图上的proposal对应映射到feature map上是一个浮点数的坐标。可想而知,整个feature就是一叠矩阵,矩阵的下标不都是整数吗。所以映射过来的浮点数坐标要被向下取整,缩小为整数区域。如下图所示:可以明显的看到量化后的差异。*实际就是图像取分割以整数取容易出现不能整分导致坐标对应选项和实际内容无法完全对应
在这里插入图片描述
这个链接有个动图能比较好的能说明问题,本文就不做深入介绍了

ROI Align优化方法:

ROI Align从ROI Pooling局限性的源头上进行了改进,也就是取消了量化操作,对于量化中产生的坐标为浮点数的像素,利用双线性插值计算其像素值RoiPooling和RoiAlign实现原理,在以后的项目中可以根据实际情况进行方案的选择;对于检测图片中大目标物体时,两种方案的差别不大,而如果是图片中有较多小目标物体需要检测,则优先选择RoiAlign,更精准些。
值得注意的是,ROI Align并不需要对两步量化中产生的浮点数坐标的像素值都进行计算,而是设计了一套优雅的流程。论文中ROI Align的实现方法如上图所示,。其中,虚线框表示feature map,实线框表示一个ROI,Pooling输出大小为2*2,每个子区域中有四个采样点。ROI Align基于双线性插值的方法,利用feature map上距离采样点最近的四个像素得到其像素值。整个过程中没有对ROI,均分ROI产生的子区域(bins)和采样点进行量化。每个bin中采样点的数目和位置存在一定的规则,即若采样点数为1,则该点位于bin的中心位置;若采样点数为4,则采样点的位置为均分该bin为4个小矩形后各自的中心点。通常这些采样点的坐标为浮点数,所以需要用到插值的方法获得其像素值。利用该方法对图1处理后的结果如下所示。
我理解为实际就是采用取的采样点是根据周围点和他的距离对采样点的影响的线性变换关系,计算出采样点的值。

ROI 算法说明:

双线性插值

双线性插值介绍链接

线性插值:

在这里插入图片描述
双线性插值:

在这里插入图片描述

ROIAlign 经典图说明

**大家可以在很多的算法介绍中看到这个图,容易搞不清楚。对应我前面的Bilinear的介绍图来看就比较好理解。**下图蓝色点对应双线性插值图中的黑点。底图的黑色方格每个正方形格的4个角对应的点其实就是图像像素的值。那么蓝色点的值是根据4个角的像素值和与其的距离关系得到。

在这里插入图片描述

旋转的RROIAlign 理解

旋转RROIAlign 实际上是在原有的ROIAlign上增加了一个旋转。
旋转框检测方法该链接有比较好的介绍方便理解
在这里插入图片描述

RRoI Align本质和RoI Align是一样的,区别在于双线性插值时采样点是经过偏移(与前文中的坐标偏移一致)。偏移计算为:
在这里插入图片描述
其中center w 和 center_h 分别表示中心点的x、y坐标(红点),xx和yy表示采样点所在特征图的x、y坐标。

在这里插入图片描述

ROI bin (均分ROI产生的子区域)

ROI Align的实现方法如上图所示,。其中,虚线框表示feature map,实线框表示一个ROI,Pooling输出大小为2*2,每个子区域中有四个采样点。ROI Align基于双线性插值的方法,利用feature map上距离采样点最近的四个像素得到其像素值。整个过程中没有对ROI,均分ROI产生的子区域(bins)和采样点进行量化。每个bin中采样点的数目和位置存在一定的规则,即若采样点数为1(sample_num=1),则该点位于bin的中心位置;若采样点数为4**(sample_num=2)**,则采样点的位置为均分该bin为4个小矩形后各自的中心点。通常这些采样点的坐标为浮点数,所以需要用到插值的方法获得其像素值。(其实BIN就是上图整个大的黑框内部框出的就是一个BIN)

如果要得到一个m x m的roi align的结果, 同时sample ratio(程序中为sample_num)为2的话(也就是mask rcnn paper里使用的值), 需要在每个bin中采样n x n个点, 因此共采样n x n x m x m个点, .

怎么理解sample_num=1和sample_num=2的差异呢,我认为上面的图为采样点为4的状态。如果采样点为1那么我认为状态应该如下图采样点少了4倍:
RoiAlign-计算实例的链接有很好的说明

在这里插入图片描述

需要注意的是bin和sample_num这个概念到后续章节读代码的时候会有用。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值