12

我已经阅读了几个YOLO教程,但我发现如果要将图像划分成的每个单元格的锚框是预先确定的,我发现有些难以理解。在我浏览的其中一个指南中,图像被分成13x13 个单元格,并且它表示每个单元格预测5 个锚框(比它大,这是我的第一个问题,因为它还说它会首先检测小块中存在什么物体预测框之前的单元格)。

小细胞如何预测比它更大的对象的锚框。也有人说,每个单元在预测其锚框之前进行分类,如果只有一小部分对象落在单元内,那么小单元如何在不查询相邻单元的情况下对其中的正确对象进行分类

E.g.假设13 个单元格中的一个只包含一个穿着 T 恤的男子的白色口袋部分,该单元格如何正确分类一个人存在而不与相邻单元格相关联?在尝试定位单个对象时使用普通的 CNN,我知道边界框预测与整个图像相关,所以至少我可以说网络在决定框应该在哪里之前知道图像上各处发生了什么。

PS:我目前对 YOLO 工作原理的看法是,基本上每个单元格都被分配了预先确定的锚框,在每一端都有一个分类器,然后选择每个类别得分最高的框,但我确信它不会在某个地方加起来.

更新:在这个问题上犯了一个错误,它应该是关于如何决定常规边界框而不是锚/先前框。所以我将@craq的答案标记为正确,因为这就是根据 YOLO v2 论文决定锚框的方式

4

1 回答 1

16

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

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

拥有代表数据集的锚点很有用,因为 YOLO 学习如何对锚点框进行小幅调整,以便为您的对象创建准确的边界框。YOLO 可以比大调整更好/更容易地学习小调整。

  1. 分配问题更棘手。据我了解,训练过程的一部分是让 YOLO 学习哪些锚点用于哪个对象。因此,“分配”不像匈牙利算法那样具有确定性。正因为如此,一般情况下,多个anchors会检测到每个物体,之后你需要做non-max-suppression才能选择“最好的”一个(即最高置信度)。

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

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

以下几页帮助我理解了 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

于 2019-08-15T22:04:06.527 回答