🐳锚框
2021-11-30
| 2023-8-6
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
目标检测算法通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整区域边界从而更准确地预测目标的真实边界框(ground-truth bounding box)。 不同的模型使用的区域采样方法可能不同, 这里介绍其中的一种方法:以每个像素为中心,生成多个缩放比和宽高比(aspect ratio)不同的边界框,这些边界框被称为锚框(anchor box)

生成多个锚框

假设输入图像的高度为,宽度为。以图像的每个像素为中心生成不同形状的锚框:缩放比例为,宽高比为。那么锚框的宽度和高度分别是 (当中心位置给定时,已知宽和高的锚框是确定的)
设置许多缩放比(scale)取值和许多宽高比(aspect ratio)取值 ,生成多个不同形状的锚框。当使用这些比例和长宽比的所有组合以每个像素为中心时,输入图像将总共有锚框。 尽管这些锚框可能会覆盖所有真实边界框,但计算复杂性很容易过高。 在实践中只考虑包含的组合:
也就是说,以同一像素为中心的锚框的数量是,对于整个输入图像将共生成个锚框
notion image
 
 

交并比(IoU)

某个锚框“较好地”覆盖了图像中的狗, 如果已知目标的真实边界框,那么这里的“好”该如何如何量化呢?
杰卡德系数(Jaccard)可以衡量两组之间的相似性。 给定集合 ,杰卡德系数是交集的大小除以并集的大小:
对于两个边界框,通常将它们的杰卡德系数称为交并比(intersection over union,IoU),即两个边界框相交面积与相并面积之比,交并比的取值范围在0和1之间:0表示两个边界框无重合像素,1表示两个边界框完全重合
notion image
 

在训练数据中标注锚框

在训练集中,我们将每个锚框视为一个训练样本。 为了训练目标检测模型,需要每个锚框的类别(class)偏移量(offset)标签,其中前者是与锚框相关的对象的类别,后者是真实边界框相对于锚框的偏移量。 在预测时,我们为每个图像生成多个锚框,预测所有锚框的类别和偏移量,根据预测的偏移量调整它们的位置以获得预测的边界框,最后只输出符合特定条件的预测边界框。
我们知道,目标检测训练集带有“真实边界框”的位置及其包围物体类别的标签。 要标记任何生成的锚框,可以参考分配到的最接近此锚框的真实边界框的位置和类别标签。

将真实边界框分配给锚框

给定图像,假设锚框是,真实边界框是,其中。定义一个矩阵,其中第行、第列的元素是锚框
和真实边界框的IoU。 该算法包含以下步骤:
  1. 在矩阵中找到最大的元素,并将它的行索引和列索引分别表示为。然后将真实边界框分配给锚框。这很直观,因为是所有锚框和真实边界框配对中最相近的。在第一个分配完成后,丢弃矩阵中行和列中的所有元素
  1. 在矩阵中找到剩余元素中最大的元素,并将它的行索引和列索引分别表示为。然后将真实边界框分配给锚框,丢弃矩阵中行和列中的所有元素
  1. 此时矩阵中两行和两列中的元素已被丢弃。继续,直到丢弃掉矩阵列中的所有元素。此时已经为这个锚框各自分配了一个真实边界框
  1. 只遍历剩下的个锚框。例如,给定任何锚框,在矩阵的第行中找到与的IoU最大的真实边界框,只有当此IoU大于预定义的阈值时,才将分配给
notion image
假设矩阵中的最大值为,将真实边界框分配给锚框,然后们丢弃矩阵第2行和第3列中的所有元素。在剩余元素(阴影区域)中找到最大的,将真实边界框分配给锚框,丢弃矩阵第7行和第1列中的所有元素。在剩余元素中找到最大的,将真实边界框分配给锚框,丢弃矩阵第5行和第4列中的所有元素。在剩余元素中找到最大的,然后将真实边界框分配给锚框。 之后只需要遍历剩余的锚框根据阈值确定是否为它们分配真实边界框。
 

标记类别和偏移量

设一个锚框被分配了一个真实边界框。 一方面,锚框的类别将被标记为与相同; 另一方面,锚框的偏移量将根据中心坐标的相对位置以及这两个框的相对大小进行标记。 鉴于数据集内不同的框的位置和大小不同,可以对那些相对位置和大小应用变换,使其获得分布更均匀且易于拟合的偏移量。 这里介绍一种常见的变换:给定框,中心坐标分别为,宽度分别为 ,高度分别为,可以将的偏移量标记为:
其中常量的默认值为
如果一个锚框没有被分配真实边界框,只需将锚框的类别标记为“背景”(background)。 背景类别的锚框通常被称为“负类”锚框,其余的被称为“正类”锚框。 我们使用真实边界框(labels参数)实现以下multibox_target函数,来标记锚框的类别和偏移量(anchors参数)。 此函数将背景类别的索引设置为零,然后将新类别的整数索引递增一。
 
 

eg

为加载图像中的狗和猫定义了真实边界框,其中第一个元素是类别(0代表狗,1代表猫),其余四个元素是左上角和右下角的轴坐标(范围介于0和1之间)。 构建了五个锚框,用左上角和右下角的坐标进行标记:(索引从0开始)。 然后在图像中绘制这些真实边界框和锚框。
notion image
使用上面multibox_target函数,可以根据狗和猫的真实边界框,标注这些锚框的分类和偏移量。 在这个例子中,背景、狗和猫的类索引分别为0、1和2。 下面为锚框和真实边界框样本添加一个维度
 
 
 

使用非极大值抑制预测边界框

在预测时,我们先为图像生成多个锚框,再为这些锚框一一预测类别和偏移量。 一个“预测好的边界框”则根据其中某个带有预测偏移量的锚框而生成。 下面我们实现了offset_inverse函数,该函数将锚框和偏移量预测作为输入,并应用逆偏移变换来返回预测的边界框坐标。
当有许多锚框时,可能会围绕着同一目标输出许多相似的有明显重叠的预测边界框。 为简化输出,可以使用非极大值抑制(non-maximum suppression,NMS)合并属于同一目标的类似的预测边界框。
非极大值抑制的工作原理:对于一个预测边界框,目标检测模型会计算每个类别的预测概率。 假设最大的预测概率为,则该概率所对应的类别即为预测的类别,称为预测边界框置信度(confidence)。 在同一张图像中,所有预测的非背景边界框都按置信度降序排序,以生成列表L。然后通过以下步骤操作排序列表L:
  1. 从L中选取置信度最高的预测边界框作为基准,然后将所有与的IoU超过预定阈值ϵ的非基准预测边界框从L中移除。这时,L保留了置信度最高的预测边界框,去除了与其太过相似的其他预测边界框。简而言之,那些具有非极大值置信度的边界框被抑制了
  1. 从L中选取置信度第二高的预测边界框作为又一个基准,然后将所有与 的IoU大于ϵ的非基准预测边界框从L中移除
  1. 重复上述过程,直到L中的所有预测边界框都曾被用作基准。此时,L中任意一对预测边界框的IoU都小于阈值ϵ;因此,没有一对边界框过于相似
  1. 输出列表L中的所有预测边界框
以下nms函数按降序对置信度进行排序并返回其索引
定义以下multibox_detectio函数来将非极大值抑制应用于预测边界框
 
将上述算法应用到一个带有四个锚框的具体示例中。 为简单起见,假设预测的偏移量都是零,这意味着预测的边界框即是锚框。 对于背景、狗和猫其中的每个类,我们还定义了它的预测概率
notion image
notion image
实践中,在执行非极大值抑制前,我们甚至可以将置信度较低的预测边界框移除,从而减少此算法中的计算量。 我们也可以对非极大值抑制的输出结果进行后处理。例如,只保留置信度更高的结果作为最终输出。
  • PyTorch
  • 目标检测和边界框多尺度目标检测
    目录