当前位置: 代码迷 >> 综合 >> 深度篇—— CNN 卷积神经网络(三) 关于 ROI pooling 和 ROI Align?与 插值
  详细解决方案

深度篇—— CNN 卷积神经网络(三) 关于 ROI pooling 和 ROI Align?与 插值

热度:42   发布时间:2023-12-15 08:31:56.0

返回主目录

返回 CNN 卷积神经网络目录

上一章:深度篇—— CNN 卷积神经网络(二) 细说 池化(pooling) 与 反池化(unpooling)

下一章:深度篇—— CNN 卷积神经网络(四) 使用 tf cnn 进行 mnist 手写数字 代码演示项目

 

本小节,细说 关于 ROI 与 插值

 

三. 关于 ROI

 

1. ROI pooling (Region Of Interesting pooling, ROI pooling) 感兴趣区域池化

(1). 目标检测  typical architecture (典型架构) 通常可以分为两个阶段:

   ①. region proposal (区域提案)

        给定一张输入 image 找出 objects 可能存在的所有位置。这一阶段的输出应该是一系列 object 可能的 bounding boxes。这些通常称为 region proposal 或 region of interest (ROI)

   ②. final classification (最终分类)

         确定上一阶段的每个 region proposal 是否属于目标一类或者背景。

 

(2). 这 architecture 存在的一些问题:

   ①. 产生大量的 region proposal 会导致性能问题,很难达到实时目标检测。

   ②. 在处理速度方面是 suboptimal (次优)

   ③. 无法做到 end-to-end training。

(3). 于是提出了 ROI pooling。ROI pooling 层实现 training 和 testing 的显著加速,并提高检测 accuracy。该层有两个输入:

   ①. 从具体多个卷积核池化的深度网络中获得的固定大小的 feature map

   ②. 一个表示所有 ROI 的  的矩阵,其中  表示 ROI 的数目。 则表示 第一列为图像的 index,其余四列分别为 左上角 和 右下角 的坐标。

 

(4). ROI pooling 的具体操作

   ①. 根据输入 image,将 ROI 映射到 feature map 对应位置

   ②. 将映射后的 感兴趣区域 划分为不同大小(也可以有相同大小) 的 sections (部分), sections 数量与输出的维度相同。

   ③. 对每个 sections 进行 max pooling 操作。

         这样就可以从不同大小的方框得到固定大小相应的 feature map。值得一提的是,输出的 feature map 的大小不取决于 ROI 和卷积 feature map 的大小。ROI pooling 最大的好处就在于极大地提高了处理速度。 

 

(5). ROI pooling 总结:

   ①. 用于目标检测任务

   ②. 允许对 CNN 中的 feature map 进行重新使用

   ③. 可以显著加速 training 和 testing 的速度

   ④. 允许 end-to-end 的形式训练检测系统。

 

(6). ROI pooling example

   将一个  的 feature map 通过 ROI pooling 后,输出一个大小为  的 feature map。

   ①. 输入  大小的 feature map

   ②. 将 region proposal 投影到 feature map 之上的位置(左上角、右下角坐标) :(0, 3), (7, 8)

   ③. 将其划分为  个 sections (因为输出大小为 ,划分的大小,根据输出的要求而定)

   ④. 对每个 section 做 max pooling。

        

 

2. ROI Align (Region Of Interesting Align, ROI Align) 

(1). 在 ROI pooling 中,是将不同 size 的 ROI 区域映射到固定大小的 feature map 上,它导致两次量化带来的误差:

   ①. region proposal 的 xywh 通常是小数,但是为了方便操作会把它 整数化。

   ②. 将整数化后的边界区域分割成  个单元,对每一个单元的边界进行整数化。

 

(2). 两次整数化的过程如下:

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

 

(3). 为了解决这个问题,引入了 ROI Align。

     ROI Align 的思路很简单:

       取消量化操作,保留了小数,使用双线性插值的方法(下面会说到) 获得浮点数上的像素点上饿图像数值,从而将整个特征聚集过程转化为一个连续的操作。在具体算法操作上,ROI Align 并不是简单地补充出候选区域边界上的坐标点,然后将这些坐标点进行池化,而是重新设计了一套流程:

   ①. 遍历每一个候选区域,保持浮点数边界不做量化

   ②. 将候选区域分割成 \large k \times k 个单元,每个单元的边界也不做量化

   ③. 在每个单元中计算四个固定的采样点坐标位置(在论文中,作者发现设为 4 个采样点会获得最佳性能,甚至直接设为 1 在性能上也相差无几),用双线性插值的方法计算出这四个位置的值,然后进行最大池化操作。

 

(4). ROI Align example

      下图中虚线部分表示 feature map, 实线表示 ROI,这里将 ROI 切分成 \large 2 \times 2 的单元格。如果采样点数是 4,那首先将每个单元格子均分成四个小方格(如 红线所示),每个小方格中心就是采样点。这些采样点的坐标通常是浮点数,所以要对采样点像素进行双线性插值(如 四个箭头所示),就可以得到该像素点的值了。然后对每个单元格内的四个采样点进行 max pooling,就可以得到最终的 ROI Align 的结果。

        事实上,ROI Align 在遍历取样点的数量上没有 ROI pooling 那么多,但却可以获得更好的性能。这主要归功于解决了 misalignment (未对准) 的问题。

 

四. 插值

 

1. 线性插值

已知数据 \large (x_{0}, y_{0}) 和 \large (x_{1}, y_{1}),要计算 \large [x_{0}, x_{1}] 区域某一位置 \large x 在直线上的 \large y 值。

计算方法很简单,通过斜率相等就可以构建 \large y 和 \large x 之间的关系:

           \large \frac{y - y_{0}}{x - x_{0}} = \frac{y - y_{1}}{x - x_{1}}

           \large y = \frac{x - x_{0}}{x_{1} - x_{0}} \cdot y_{1} + \frac{x_{1} - x}{x_{0} - x} \cdot y_{0}

仔细看就是用 \large x 和 \large x_{0}\large x_{1} 的距离作为一个权重(除以 \large x_{1} - x_{0} 是归一化的作用),用于 \large y_{0} 和 \large y_{1} 的加权。这个思想很重要,因为知道了这个思想,理解双线性插值就非常简单了。

 

2. 双线性插值

双线性插值本质上流是在两个方向上做线性插值。

假设想得到 \large P(x, y) 点的插值,可以先在 \large x 方向上,对 \large Q_{11} 和 \large Q_{21} 之间做线性插值得到 \large R_{1},同理可得到 \large R_{2}。然后在 \large y 方向上对 \large R_{1} 和 \large R_{2} 进行线性插值就可以得到最终的 \large P。其实,知道这个就已经理解了双线性插值的意思了。

用公式表达如下:

                \large f(R_{1}) \approx \frac{x_{2} - x}{x_{2} - x_{1}} \cdot f(Q_{11}) + \frac{x - x_{1}}{x_{2} - x_{1}} \cdot f(Q_{21})

                \large f(R_{2}) \approx \frac{x_{2} - x}{x_{2} - x_{1}} \cdot f(Q_{12}) + \frac{x - x_{1}}{x_{2} - x_{1}} \cdot f(Q_{22})

然后在 \large y 方向进行线性插值,得:

                 \large f(P) \approx \frac{y_{2} - y}{y_{2} - y_{1}} \cdot f(R_{1}) + \frac{y - y_{1}}{y_{2} - y_{1}} \cdot f(R_{2})

整理后,可得 \large P(x, y) 的关系结果。

 

 

                

 

返回主目录

返回 CNN 卷积神经网络目录

上一章:深度篇—— CNN 卷积神经网络(二) 细说 池化(pooling) 与 反池化(unpooling)

下一章:深度篇—— CNN 卷积神经网络(四) 使用 tf cnn 进行 mnist 手写数字 代码演示项目

  相关解决方案