【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

06-01 1051阅读

前言

文章性质:学习笔记 📖

学习资料:吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2

主要内容:根据学习资料撰写的学习笔记,该篇主要介绍了优化候选框的几种方法。

一、优化候选框的几种方法

在进行目标检测时,往往会产生很多候选框,其中大部分是我们需要的,也有部分是我们不需要的。

因此 有效过滤 这些不必要的框就非常重要。这节我们介绍几种常用的优化候选框的算法。

1、交并比

使用 选择性搜索(SS)或 区域候选网络(RPN)等方法,最后每类选出的候选框会比较多,在这些候选框中如何选出质量较好?

可使用 交并比 这个度量值进行过滤。交并比(Intersection Over Union, IOU)用于计算候选框和目标实际标注边界框的重合度。

【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

假设我们要计算两个矩形框 A 和 B 的 IOU ,即它们的交集与并集之比,如图 9-15 所示。且 A 、B 的重合度 IOU 的计算公式:

【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

2、非极大值抑制

通过 选择性搜索(SS)或 区域候选网络(RPN)等方法生成的大量的候选框中有很多指向同一目标,故存在大量冗余的候选框。

如何减少这些冗余框?可使用 非极大值抑制(Non-Maximum Suppression, NMS)算法。

非极大值抑制算法的思想:搜索局部极大值,抑制非极大值元素。

如图 9-16 所示,要定位一辆车,SS 或 RPN 会对每个目标生成一堆矩形框,而 NMS 会过滤掉多余的矩形框,找到最佳的矩形框。

【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

非极大值抑制的基本思路分析如下:先假设有 6 个候选框,每个候选框选定的目标属于汽车的概率如图 9-17 所示。

【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

将这些候选框选定的目标按其属于车辆的概率从小到大排列,标记为 A 、B 、C 、D 、E 、F 。

(1)从概率最大的矩形框(即面积最大的框)F 开始,分别判断 A ~ E 与 F 的重叠度是否大于某个设定的阈值。

(2)假设 B 、D 与 F 的重叠度超过阈值,就将 B 、D 丢弃,并标记 F 是我们保留下来的第一个矩形框。

(3)从剩余的 A 、C 、E 中,选择概率最大的 E ,然后判断 A 、C 与 E 的重叠度是否大于某个设定的阈值。

(4)假设 A 、C 与 E 的重叠度超过阈值,就将 A 、C 丢弃,并标记 E 是我们保留下来的第二个矩形框。

(5)重复这个过程,直到找到所有被保留下来的矩形框。

【说明】因为超过阈值,说明两个矩形框有很大部分是重叠的,那么保留面积大的矩形框即可,那些小面积的矩形框是多余的。

3、边框回归

通过 选择性搜索(SS)或 区域候选网络(RPN)等方法生成的大量候选框,虽然有一部分可以通过 非极大值抑制(NMS)等方法过滤一些多余框,但仍然会存在很多质量不高的框图,如图 9-18 所示。

【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

如图 9-18 所示,其中内部框的质量不高,定位不准,IOU<0.5 ,说明它没有正确检测出飞机,需要通过 边框回归 进行修改。

除此之外,训练时,我们也需要通过 边框回归 使预测框不断迭代,不断向真实框(又称目标框)靠近。

(1)边框回归的主要原理

如图 9-19 所示,最下面的框 A 代表生成的候选框,最上面的框 G 代表目标框。

【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

接下来我们需要基于 A 和 G 找到一种映射关系,得到一个预测框 G' ,并通过迭代使 G' 不断接近目标框 G 。

这个过程用数学符号可表示为如下形式:

锚框 A 的四维坐标为 【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) ,其中 4 个值分别表示锚框 A 的中心坐标及宽和高。

锚框 G 的四维坐标为 【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) ,其中 4 个值分别表示锚框 G 的中心坐标及宽和高。

基于 A 和 G ,找到一个对应关系 F 使 F(A) = G' ,其中 【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) ,且 G' ≈ G 。

(2)如何找到对应关系 F

如果通过变换 F 实现从矩形框 A 变为矩形框 G' 呢?比较简单的思路就是 平移 + 放缩 ,具体实现步骤如下:

① 先平移:

【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

② 后缩放:

【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

这里要学习的变换是 【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) ,当输入的锚框 A 与 G 相差较小时,可以认为这四个变换是一种线性变换,这样就可以用线性回归来建模对矩形框进行微调。线性回归是指给定输入的特征向量 X ,学习一组参数 W ,使得经过线性回归后的值与真实值 G 非常接近,即 G ≈ WX 。那么锚框中的输入以及输出分别是什么呢?

输入:【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

这些坐标实际上对应 CNN 网络的特征图,训练阶段还包括目标框的坐标值,即 【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) 。

输出:4 个变换,【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) ,【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) ,【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

输入与输出之间的关系:

【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

由此可知训练的目标就是使预测值 【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) 与真实值 【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) 的差最小化,用 L1 来表示:

【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

为了更好地收敛,我们实际使用 smooth-L1 作为其目标函数:

【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

(3)边框回归为何只能微调?

要使用线性回归,就要求锚框 A 与 G 相乘较小,否则这些变换可能会变成复杂的非线性变换。

(4)边框回归的主要应用

在 RPN 生成候选框的过程中,最后输出时也使用边框回归使预测框不断向目标框逼近。

(5)改进空间

YOLO v2 提出了一种 直接预测位置坐标 的方法。之前的坐标回归实际上回归的不是坐标点,而是需要对预测结果做一个变换才能得到坐标点,这种方法使其在充分利用目标对象的位置信息方面的效率大打折扣。

为了更好地利用目标对象的位置信息,YOLO v2 采用 目标对象的中心坐标 及 左上角 的方法,具体可参考图 9-20 。

【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

其中,【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) 和 【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) 为锚框的宽和高,【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) 、【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) 、【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) 、【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) 为预测边界框的坐标值,【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) 是 sigmoid 函数。【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) 、【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2) 是当前网格左上角到图像左上角的距离,需要将网格 大小归一化 ,即令一个网格的 宽 = 1 ,高 = 1 。

4、SPP-Net

候选区域通过处理最后由全连接层进行分类或回归,而全连接层一般是固定大小的输入。为此,我们需要把候选区域的输出结果设置为固定大小,有两种固定方法:

1. 第一种方法是直接对候选区域进行缩放,不过这种方法容易导致对象变形,进而影响识别效果;

3. 第二种方法是使用 空间金字塔池化网络(Spatial Pyramid Pooling Net, SPP-Net)方法或在此基础上延伸的 RoI 池化 方法。

空间金字塔池化网络 SPP-Net 对每个候选框使用了不同大小的金字塔映射,如 4×4 ,2×2 ,1×1 等。

空间金字塔池化网络 SPP-Net 由何恺明、孙健等人提出,其主要创新点就是 空间金字塔池化(Spatial Pyramid Pooling, SPP)。

空间金字塔池化网络 SPP-Net 成功解决了 R-CNN 中每个候选区域都要过一次 CNN 的问题,提升了效率,并避免了为适应 CNN 的输入尺寸而缩放图像导致目标形状失真的问题。

SPP-Net 是自适应的池化方法,分别对 输入特征图 进行 多个尺度 的池化,得到特征,进行向量化后拼接起来,如图 9-21 所示。

  • 输入特征图:可以由不定尺寸的输入图像输入 CNN 得到,也可以由候选区域框定后输入 CNN 得到。
  • 多个尺度:实际上就是改变池化的大小和步幅。 

    【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

    与普通池化的固定大小不同( 普通池化的大小和步幅相等,即每一步都不重叠 ),SPP-Net 固定的是池化后的尺寸 ,而大小则是根据尺寸计算得到的自适应数值来确定。这样可以保证不论输入是什么尺寸,输出的尺寸都是一致的,从而得到定长的特征向量。

    图 9-22 是使用 SPP-Net 把一个 4×4 RoI 用 2×2 ,1×1 的大小池化到固定长度的示意图。 

    【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

    SPP-Net 对特征图中的候选框进行了多尺寸( 如 5×5 ,2×2 ,1×1 等 )池化,然后展平、拼接成固定长度的向量。

    RoI 对特征图中的候选框只需要下采样到一个尺寸,然后对各网格采用最大池化方法,得到固定长度的向量。

    Fast R-CNN 及 Faster R-CNN 都采用了 RoI 池化方法。以 VGG-16 的主干网络为例,RoI 将候选框下采样到 7×7 的尺寸。

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]