返回主目录
返回 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 并不是简单地补充出候选区域边界上的坐标点,然后将这些坐标点进行池化,而是重新设计了一套流程:
①. 遍历每一个候选区域,保持浮点数边界不做量化
②. 将候选区域分割成 个单元,每个单元的边界也不做量化
③. 在每个单元中计算四个固定的采样点坐标位置(在论文中,作者发现设为 4 个采样点会获得最佳性能,甚至直接设为 1 在性能上也相差无几),用双线性插值的方法计算出这四个位置的值,然后进行最大池化操作。
(4). ROI Align example
下图中虚线部分表示 feature map, 实线表示 ROI,这里将 ROI 切分成 的单元格。如果采样点数是 4,那首先将每个单元格子均分成四个小方格(如 红线所示),每个小方格中心就是采样点。这些采样点的坐标通常是浮点数,所以要对采样点像素进行双线性插值(如 四个箭头所示),就可以得到该像素点的值了。然后对每个单元格内的四个采样点进行 max pooling,就可以得到最终的 ROI Align 的结果。
事实上,ROI Align 在遍历取样点的数量上没有 ROI pooling 那么多,但却可以获得更好的性能。这主要归功于解决了 misalignment (未对准) 的问题。
四. 插值
1. 线性插值
已知数据 和 ,要计算 区域某一位置 在直线上的 值。
计算方法很简单,通过斜率相等就可以构建 和 之间的关系:
仔细看就是用 和 、 的距离作为一个权重(除以 是归一化的作用),用于 和 的加权。这个思想很重要,因为知道了这个思想,理解双线性插值就非常简单了。
2. 双线性插值
双线性插值本质上流是在两个方向上做线性插值。
假设想得到 点的插值,可以先在 方向上,对 和 之间做线性插值得到 ,同理可得到 。然后在 方向上对 和 进行线性插值就可以得到最终的 。其实,知道这个就已经理解了双线性插值的意思了。
用公式表达如下:
然后在 方向进行线性插值,得:
整理后,可得 的关系结果。
返回主目录
返回 CNN 卷积神经网络目录
上一章:深度篇—— CNN 卷积神经网络(二) 细说 池化(pooling) 与 反池化(unpooling)
下一章:深度篇—— CNN 卷积神经网络(四) 使用 tf cnn 进行 mnist 手写数字 代码演示项目