YOLO 中的锚框:它们是如何决定的

Anchor Boxes in YOLO : How are they decided

我已经学习了几个 YOLO 教程,但我发现很难确定图像要分成的每个单元格的锚框是否是预先确定的。在我阅读的其中一篇指南中,图像被分成 13x13 个单元格,它表示每个单元格预测 5 个锚框(比它大,好的,这是我的第一个问题,因为它还说它会在预测框之前首先检测小单元中存在的对象。

小单元如何预测比它大的对象的锚框。也有人说每个单元格 class 在预测它的锚框之前先确定如果只有一小部分对象落在单元格内,小单元格如何 class 在不查询相邻单元格的情况下确定其中的正确对象

E.g. 说其中一个 13 单元格只包含一个穿着 T 恤的男人的白色口袋部分那个单元格怎么能 classify正确的是,一个人在场而​​不与邻近的细胞联系在一起?当尝试定位单个对象时使用普通的 CNN,我知道边界框预测与整个图像相关,所以至少我可以说网络在决定框应该在哪里之前了解图像上各处发生的事情。

PS: 我目前认为 YOLO 的工作原理基本上是为每个单元分配预定的锚框,两端各有一个 classifier在每个 class 得分最高的框被选中之前,但我确信它不会在某处加起来。

UPDATE: Made a mistake with this question, it should have been about how regular bounding boxes were decided rather than anchor/prior boxes. So I am marking @craq's answer as correct because that's how anchor boxes are decided according to the YOLO v2 paper

我认为这里有两个问题。首先,标题中的那个,询问锚点来自哪里。其次,如何将锚点分配给 objects。我会尽量回答这两个问题。

  1. 锚点由 a k-means procedure 确定,查看数据集中的所有边界框。如果您正在看车辆,您从侧面看到的车辆的纵横比约为 2:1(宽度 = 2*高度)。正面看大概是正方形,1:1。如果您的数据集包含人物,则纵横比可能为 1:3。前景 objects 会很大,背景 objects 会很小。 k-means 例程将找出代表您的数据集的一系列锚点。 k=5 for yolov3,但是每个YOLO版本的anchors数量不同。

拥有代表您的数据集的锚点很有用,因为 YOLO 学习如何对锚点框进行小的调整以便为您的 object 创建准确的边界框。 YOLO 可以学习小调整 better/easier 而不是大调整。

  1. 分配问题比较棘手。据我了解,部分训练过程是让 YOLO 学习哪些锚点用于哪些 object。所以 "assignment" 不像匈牙利算法那样是确定性的。因此,一般来说,多个锚点会检测每个 object,然后你需要做 non-max-suppression 才能选择 "best" 一个(即最高置信度)。

在掌握锚点之前,我需要了解几点:

  • 锚点可以是任意大小,因此它们可以超出 13x13 网格单元。他们必须是,为了检测大 objects.
  • Anchors 只进入 YOLO 的最后几层。 YOLO 的神经网络做出 13x13x5=845 个预测(假设一个 13x13 的网格和 5 个锚点)。预测被解释为锚点的偏移量,从中计算边界框。 (预测还包括 confidence/objectness 分数和 class 标签。)
  • YOLO 的损失函数将 ground truth 中的每个 object 与一个 anchor 进行比较。它选择与地面实况相比具有最高 IoU 的锚点(在任何偏移之前)。然后将预测作为偏移量添加到锚点。所有其他锚定为背景。
  • 如果分配给 objects 的 anchors 具有高 IoU,则它们的损失很小。未分配给 objects 的锚点应通过将置信度设置为接近零来预测背景。最终的损失函数是所有锚点的组合。由于 YOLO 试图最小化其整体损失函数,因此最接近地面实况的锚点接受训练以识别 object,而其他锚点接受训练以忽略它。

以下页面有助于我理解 YOLO 的锚点:

https://medium.com/@vivek.yadav/part-1-generating-anchor-boxes-for-yolo-like-network-for-vehicle-detection-using-kitti-dataset-b2fe033e5807

https://github.com/pjreddie/darknet/issues/568