Coursera 笔记

Module 03 · Object Detection

Anchor Boxes锚框

Coursera ↗

在目标检测任务中,每个网格单元只能检测一个物体。那么,如果一个网格单元想要检测多个物体怎么办呢?答案就是 锚框(Anchor Boxes)。通过锚框的使用,可以解决一个网格单元检测多个物体的问题。


锚框的基本概念

锚框的核心思想是预先定义多个 不同形状的框,每个框称为 锚框。通过这种方式,一个网格单元可以关联多个 检测结果,而不仅限于单一物体。


示例:锚框的使用

假设我们有如下的图像,并且使用一个 3x3 网格 来进行目标检测。

  • 在这个示例中,图中的 行人 和 汽车 的中心点几乎相同,都落在同一个网格单元内。
  • 如果 Y 输出一个包含 行人、汽车和摩托车 的向量,它只能输出一个检测结果。因此,必须选择其中一个物体来输出。

锚框的应用

为了解决这个问题,我们可以使用 锚框:

  1. 定义锚框: 预先定义 两个不同形状的锚框(Anchor Boxes)。这样,我们可以将两个预测结果与这两个锚框相关联。
  2. 使用锚框来进行编码: 针对每个物体,选择与其形状最相似的锚框,并通过锚框来进行物体检测。
  • 行人: 由于行人的形状更接近 锚框 1,所以我们使用 锚框 1 来编码行人信息。
  • 汽车: 由于汽车的形状更接近 锚框 2,因此使用 锚框 2 来编码汽车信息。

通过这种方式,一个网格单元就可以同时检测多个物体,而不再局限于只能检测一个物体。

目标检测中的编码方式

  1. 无锚框的情况:
  • 在没有锚框之前,图像中的每个物体会被分配到一个对应物体中心的网格单元。
  • 对于 3x3 网格,输出 Y 的维度为 3x3x8,每个网格单元的输出包含:
    • PC(物体存在概率)
    • 边界框信息
    • 类别信息(C1, C2, C3)
  1. 使用锚框后的情况:
  • 每个物体仍然被分配到包含物体中心的网格单元,但现在会根据物体的形状与锚框的重叠程度(IoU)来分配给最合适的锚框。
  • 输出 Y 的维度变为 3x3x16,每个网格单元现在会输出两个锚框的预测结果,每个锚框对应一个 8维输出,包括 PC、边界框、类别信息。

示例:网格单元中的目标标签

假设我们要处理以下网格单元:

行人的检测

  • 行人的形状更接近 锚框 1,因此,输出标签会分配给 锚框 1。
  • 标签 Y 为:PC=1(行人存在),接下来是 行人的边界框信息 和 类别标签 C1=1,其他类别为 0(因为是行人)。

汽车的检测

  • 汽车的形状更接近 锚框 2,因此,输出标签会分配给 锚框 2。
  • 标签 Y 为:PC=1(汽车存在),接下来是 汽车的边界框信息 和 类别标签 C2=1,其他类别为 0(因为是汽车)。

仅有汽车的情况

  • 如果该网格单元只包含 汽车,则标签 Y 依然会分配给 锚框 2,并且 PC=1。
  • 对于 锚框 1,因为没有物体,PC=0,其余部分为“不关心”(don’t care)。


处理多个物体的情况

  • 两个物体共享同一个网格单元:
    • 如果一个网格单元中有 多个物体(例如,3个物体),该算法可能无法很好地处理这种情况。
    • 目前,算法对于这种情况的处理并不完美,通常会依赖一些默认的 决策规则 来解决冲突。
  • 两个物体的锚框相同:
    • 如果两个物体的形状与同一个锚框相似,且重叠度较高,算法也会面临选择问题。这时也会采用 默认的 tiebreaker(决策规则)。

虽然这种情况不会非常频繁发生,但在设计时需要注意。


如何选择锚框?

  • 传统方法: 可以手动选择 多个锚框形状,涵盖常见的物体形状,例如 高瘦的物体(如行人) 和 宽大的物体(如汽车)。
  • 更先进的方法: 使用 K-means 算法 来自动选择最适合的锚框形状。通过对物体形状进行聚类,选择一组 典型的锚框形状 来优化检测效果。这种方法适用于更复杂的情况,尤其是当你需要检测大量不同形状的物体时。

总结:锚框的优势与挑战

  • 优势:
    • 锚框允许 网格单元 同时处理多个物体。
    • 使得检测算法能够 专门化,特别是对于形状不同的物体(例如高瘦的行人和宽大的汽车),可以通过锚框让算法更好地适应不同形状的物体。
  • 挑战:
    • 多个物体共享同一网格单元 和 锚框形状相似的物体 仍然是算法需要进一步改进的问题。

锚框的实际应用

尽管锚框最初是为了解决多个物体出现在同一个网格单元的问题,在实际应用中,这种情况发生得并不频繁,尤其是当网格单元较大时(例如 19x19 网格)。锚框的一个更重要的优势是它能够帮助算法 更好地适应不同类型的物体,从而提升目标检测的准确性。

下一步,我们将结合 锚框 的应用,深入探讨 YOLO 算法的整体实现。🎯