感谢伯禹学习平台,本次学习将记录记录如何使用Pytorch高效实现网络,熟练掌握Pytorch的基础知识。记录不包含理论知识的细节展开。
这部分比较特殊,主要讲解了目标检测中框的设定,不涉及主流的目标检测网络。主要使梳理其中的锚框。由于刚好最近导师项目需要,梳理该部分的基础知识。主要使概念理解,不涉及代码部分,以下内容参考以下链接。
学习代码可以参考
一:锚框生成
假设输入图像高为 ,宽为。我们分别以图像的每个像素为中心生成不同形状的锚框。设大小为且宽高比为,那么锚框的宽和高将分别为和。当中心位置给定时,已知宽和高的锚框是确定的。
下面我们分别设定好一组大小和一组宽高比。如果以每个像素为中心时使用所有的大小与宽高比的组合,输入图像将一共得到个锚框。虽然这些锚框可能覆盖了所有的真实边界框,但计算复杂度容易过高。因此,我们通常只对包含或的大小与宽高比的组合感兴趣,即
也就是说,以相同像素为中心的锚框的数量为。对于整个输入图像,我们将一共生成个锚框。
这里需要注意的是,其实不同的方法使用的生成锚框的方法不同,具体实现细节可以参考论文。
二:交并比(IoU)
我们刚刚提到某个锚框较好地覆盖了图像中的狗。如果该目标的真实边界框已知,这里的“较好”该如何量化呢?一种直观的方法是衡量锚框和真实边界框之间的相似度。我们知道,Jaccard系数(Jaccard index)可以衡量两个集合的相似度。给定集合和,它们的Jaccard系数即二者交集大小除以二者并集大小:
实际上,我们可以把边界框内的像素区域看成是像素的集合。如此一来,我们可以用两个边界框的像素集合的Jaccard系数衡量这两个边界框的相似度。当衡量两个边界框的相似度时,我们通常将Jaccard系数称为交并比(Intersection over Union,IoU),即两个边界框相交面积与相并面积之比,如图所示。交并比的取值范围在0和1之间:0表示两个边界框无重合像素,1表示两个边界框相等。
三:标注训练集的锚框
在训练集中,我们将每个锚框视为一个训练样本。为了训练目标检测模型,我们需要为每个锚框标注两类标签:一是锚框所含目标的类别,简称类别;二是真实边界框相对锚框的偏移量,简称偏移量(offset)。在目标检测时,我们首先生成多个锚框,然后为每个锚框预测类别以及偏移量,接着根据预测的偏移量调整锚框位置从而得到预测边界框,最后筛选需要输出的预测边界框。
我们知道,在目标检测的训练集中,每个图像已标注了真实边界框的位置以及所含目标的类别。在生成锚框之后,我们主要依据与锚框相似的真实边界框的位置和类别信息为锚框标注。那么,该如何为锚框分配与其相似的真实边界框呢?
假设图像中锚框分别为,真实边界框分别为,且。定义矩阵,其中第行第列的元素为锚框与真实边界框的交并比。
首先,我们找出矩阵中最大元素,并将该元素的行索引与列索引分别记为。我们为锚框分配真实边界框。显然,锚框和真实边界框在所有的“锚框—真实边界框”的配对中相似度最高。接下来,将矩阵中第行和第列上的所有元素丢弃。找出矩阵中剩余的最大元素,并将该元素的行索引与列索引分别记为。我们为锚框分配真实边界框,再将矩阵中第行和第列上的所有元素丢弃。此时矩阵中已有两行两列的元素被丢弃。
依此类推,直到矩阵中所有列元素全部被丢弃。这个时候,我们已为个锚框各分配了一个真实边界框。
接下来,我们只遍历剩余的个锚框:给定其中的锚框,根据矩阵的第行找到与交并比最大的真实边界框,且只有当该交并比大于预先设定的阈值时,才为锚框分配真实边界框。
如下图所示,假设矩阵中最大值为,我们将为锚框分配真实边界框。然后,丢弃矩阵中第2行和第3列的所有元素,找出剩余阴影部分的最大元素,为锚框分配真实边界框。接着如图(中)所示,丢弃矩阵中第7行和第1列的所有元素,找出剩余阴影部分的最大元素,为锚框分配真实边界框。最后如图(右)所示,丢弃矩阵中第5行和第4列的所有元素,找出剩余阴影部分的最大元素,为锚框分配真实边界框。之后,我们只需遍历除去的剩余锚框,并根据阈值判断是否为剩余锚框分配真实边界框。
现在我们可以标注锚框的类别和偏移量了。如果一个锚框被分配了真实边界框,将锚框的类别设为的类别,并根据和的中心坐标的相对位置以及两个框的相对大小为锚框标注偏移量。由于数据集中各个框的位置和大小各异,因此这些相对位置和相对大小通常需要一些特殊变换,才能使偏移量的分布更均匀从而更容易拟合。设锚框及其被分配的真实边界框的中心坐标分别为和,和的宽分别为和,高分别为和,一个常用的技巧是将的偏移量标注为
其中常数的默认值为。如果一个锚框没有被分配真实边界框,我们只需将该锚框的类别设为背景。类别为背景的锚框通常被称为负类锚框,其余则被称为正类锚框。
三:预测锚框
在模型预测阶段,我们先为图像生成多个锚框,并为这些锚框一一预测类别和偏移量。随后,我们根据锚框及其预测偏移量得到预测边界框。当锚框数量较多时,同一个目标上可能会输出较多相似的预测边界框。为了使结果更加简洁,我们可以移除相似的预测边界框。常用的方法叫作非极大值抑制(non-maximum suppression,NMS)。
我们来描述一下非极大值抑制的工作原理。对于一个预测边界框,模型会计算各个类别的预测概率。设其中最大的预测概率为,该概率所对应的类别即的预测类别。我们也将称为预测边界框的置信度。在同一图像上,我们将预测类别非背景的预测边界框按置信度从高到低排序,得到列表。从中选取置信度最高的预测边界框作为基准,将所有与的交并比大于某阈值的非基准预测边界框从中移除。这里的阈值是预先设定的超参数。此时,保留了置信度最高的预测边界框并移除了与其相似的其他预测边界框。
接下来,从中选取置信度第二高的预测边界框作为基准,将所有与的交并比大于某阈值的非基准预测边界框从中移除。重复这一过程,直到中所有的预测边界框都曾作为基准。此时中任意一对预测边界框的交并比都小于阈值。最终,输出列表中的所有预测边界框。