YOLO中的锚框:如何确定

LiN*_*KeR 5 artificial-intelligence object-detection deep-learning yolo

我已经看过一些YOLO教程,但是我发现很难确定如果要分割图像的每个单元的锚框是预先确定的。在我经历的其中一个指南中,该图像被划分为13x13个单元格,并表示每个单元格预测5个锚框(比它大,好吧,这是我的第一个问题,因为它还说它将首先检测到小物体中存在的物体盒预测之前的单元格)。

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

E.g.例如,说这13个牢房中的一个仅包含一个穿着T恤衫的男人的白色口袋部分,该牢房如何正确分类一个男人的存在而没有与其相邻的牢房相连?使用普通的CNN尝试定位单个对象时,我知道边界框预测与整个图像有关,因此至少我可以说,网络在决定框应位于的位置之前先了解图像上各处的情况。

PS:我目前对YOLO的工作方式的看法是,基本上每个单元都在每个末端分配了一个带有分类器的预定锚框,然后再选择每个类的得分最高的框,但是我确定它不会在某个地方累加。

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

cra*_*raq 13

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

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

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

  1. 分配问题更棘手。据我了解,训练过程的一部分是让 YOLO 学习哪个锚点用于哪个对象。因此,“分配”不像匈牙利算法那样具有确定性。正因为如此,一般来说,多个锚点会检测每个对象,之后您需要进行非最大抑制以选择“最佳”(即最高置信度)。

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

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

以下几页帮助我理解了YOLO的anchors:

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