在学习用于目标检测的卷积神经网络时,最难掌握的概念之一是锚框(anchor)的概念。它也是可以调整以提高数据集性能的最重要参数之一。事实上,如果锚框(anchor)没有正确调整,神经网络甚至永远不会知道某些极大、极小或不规则物体的存在,也永远没有机会检测到它们。幸运的是,你可以采取一些简单的步骤来确保不会落入这个陷阱。
什么是锚框(anchor box)?
当使用 YOLO 或 SDD 等神经网络来预测图片中的多个目标时,该网络实际上会进行数以千计的预测,并且只显示它确定为目标的那些。多个预测以以下格式输出:
预测 1:(X、Y、高度、宽度)、类别
……
预测 ~80,000:(X,Y,高度,宽度),类别
其中 (X, Y, Height, Width) 称为“边界框(bounding box)”,或围绕目标的框。该框和目标类由人工注释者手动标记。
在一个极其简化的示例中,假设我们有一个模型,它有两个预测并接收以下图像。
我们需要告诉我们的网络它的每个预测是否正确,以便它能够学习。但是我们告诉神经网络它的预测应该是什么?预测的类应该是:
- 预测1:梨
- 预测2:苹果
或者应该是:
- 预测1:苹果
- 预测2:梨
如果网络预测:
- 预测1:苹果
- 预测2:苹果
我们需要网络的两个预测器来判断他们的工作是预测梨还是苹果。要做到这一点,有几个工具。预测器可以专门研究特定大小的对象、具有特定纵横比(高与宽)的对象或图像不同部分的对象。
大多数网络使用所有三个标准。在我们的梨/苹果图像示例中,我们可以将预测 1 用于图像左侧的目标,将预测 2 用于图像右侧的目标。然后我们就会得到网络应该预测什么的答案:
- 预测1:梨
- 预测2:苹果
实践中的anchor box
基于anchor-based的目标检测模型通常执行以下操作:
1. 为每个预测器创建数千个“锚框”或“先验框”,代表它专门预测的目标的理想位置、形状和大小。
2. 对于每个anchor box,计算哪个目标的bounding box有最高重叠除以非重叠。这称为 IOU (Intersection Over Union)。
3. 如果最高IOU大于50%,告诉anchor box它应该检测给出最高IOU的目标。
4. 否则如果IOU大于40%,告诉神经网络真正的检测是不明确的,不要从那个例子中学习。
5. 如果最高IOU小于40%,那么anchor box应该预测没有目标。
这在实践中效果很好,成千上万的预测器在决定它们的目标类型是否出现在图像中方面做得非常好。
将RetinaNet 中的锚框可视化如下图所示,这里只展示了其中的 1%:
使用默认锚框配置可能会创建过于专业化的预测器,并且图像中出现的目标可能无法使用任何锚框实现 50% 的 IOU。在这种情况下,神经网络永远不会知道这些目标存在,也永远不会学习预测它们。我们可以将锚框调整得更小,比如这个 1% 的样本:
在 RetinaNet 配置中,最小的锚框尺寸是 32x32。这意味着许多比这更小的物体将不会被检测到。下面是来自 WiderFace 数据集的一个例子,我们将边界框与它们各自的锚框匹配,但有些却漏了:
在这种情况下,只有四个ground truth边界框与锚框重叠。神经网络永远不会学习预测其他人脸。我们可以通过更改默认的锚框配置来解决这个问题。减少最小的锚框大小,所有的人脸至少与我们的一个锚框对齐,我们的神经网络可以学习检测它们!
改进锚框配置
作为一般规则,在深入训练模型之前,你应该了解以下有关数据集的问题:
- 你希望能够检测到的最小尺寸的box是多少?
- 你希望能够检测到的最大尺寸的box是多少?
box可以做成什么形状?例如,汽车探测器可能有短而宽的锚框,只要汽车或摄像头不可能侧向转动。
可以通过实际计算数据集中最极端的尺寸和纵横比来粗略估计这些。YOLO v3 是另一个目标检测器,它使用 K 均值来估计理想的边界框。另一种选择是学习锚框配置。
一旦你想通了这些问题,你就可以开始设计你的锚框了。
如果边界框和锚框的中心不同,得到的 IOU会很小。即使有小的锚框,如果锚框之间的步幅很宽,也可能会错过一些gound truth框。改善这种情况的一种方法是将 IOU 阈值从 50% 降低到 40%。
David Pacassi Torrico 最近的一篇文章比较了当前人脸检测的 API 实现,强调了正确指定锚框的重要性。
可以看到除了小脸外,算法都做得很好。下面是一些 API 根本无法检测到任何人脸的图片,但我们的新模型检测到了很多:
这篇仅仅是了解anchor的文章,后续还会发一些关于深入理解anchor的文章,请继续关注公众号CV技术指南。