视频封面

视频元信息

  • 课程:吴恩达深度学习专项课程 —— 卷积神经网络(CNN)第三周
  • 本讲主题:YOLO(You Only Look Once)目标检测算法的训练集构造、预测流程与输出后处理

本节是 YOLO 算法的收尾讲解,承接前面的「滑动窗口 → 卷积实现 → 边界框预测 → 交并比 IoU → 非极大值抑制 NMS → Anchor Boxes」的知识链。本节重点回答三个问题:训练集怎么造?网络怎么预测?预测结果怎么后处理?


内容摘要(TL;DR)

本节讲解 YOLO 算法的完整流程:把图像划分为网格,每个网格单元配合多个 Anchor Box 生成目标向量 y;输出张量维度为 网格 × 网格 × (Anchor 数 × 8)。训练时逐网格构造标签,无目标处 Pc=0 且其余为 don't care;预测后再用非极大值抑制(NMS)按类别独立去重,得到最终检测框。


一、输出张量的维度构成 [00:29]

要点

  • 输出 y 的形状为 3×3×2×8(3×3 网格、2 个 Anchor Box、每个 Anchor 8 维)。
  • 每个 Anchor Box 的 8 维向量由 Pc + 4 个边界框参数 + 3 个类别概率 组成。
  • 等价地可写成 3×3×16(把 2×8 展平)。

详细说明

对于 3×3 的网格划分和每个网格 2 个 Anchor Box 的设定,网络的输出 y 可以有两种等价的表示方式:

  • 写成 3×3×2×8:保留 Anchor Box 这一维度的显式结构。
  • 写成 3×3×16:把 2×8 展平成 16 维,便于整体理解。

其中每个 Anchor 对应的 8 维向量的含义是:

分量 含义
Pc 该 Anchor 内是否存在目标(0/1)
bx, by 目标中心点相对网格单元的偏移
bw, bh 目标宽高(通常相对整幅图归一化)
c1, c2, c3 类别概率(行人 / 汽车 / 摩托车)

易错点: 8 = 5 + 类别数。这里的 5 是 Pc + bx + by + bw + bh,不是 5 个边界框参数。若类别数为 3,则 5 + 3 = 8。若类别数变为 20(如 VOC 数据集),则每个 Anchor 应为 5 + 20 = 25 维。

理解:把 Anchor Box 维度显式保留(2×8)更贴近实现,因为 TensorFlow / PyTorch 中张量通常是 (batch, grid_h, grid_w, num_anchors × (5 + num_classes))。


二、训练集构造:逐网格生成目标向量 y [01:03]

要点

  • 遍历 9 个网格单元,为每个单元生成对应的目标向量 y。
  • 无目标的网格:两个 Anchor 的 Pc 均为 0,其余分量为 don't care。
  • 有目标的网格:把目标分配给 IoU 更高的那个 Anchor Box,另一个 Anchor 的 Pc 设为 0。

详细说明

情形 1:网格内无目标(如左上角网格)

左上角网格里没有行人、汽车或摩托车,因此:

  • 第一个 Anchor Box 的 Pc = 0
  • 第二个 Anchor Box 的 Pc = 0
  • 其余所有分量都是 don't care(不关心),因为网络已经被告知这里没有目标,边界框和类别输出是什么都无所谓。

情形 2:网格内有目标(如包含汽车的网格)

假设训练集中汽车的边界框略宽于高,而两个 Anchor Box 的形状分别是:

  • Anchor Box 1:偏高的形状
  • Anchor Box 2:偏宽的形状

汽车边界框与 Anchor Box 2 的 IoU 略高,因此汽车被分配给 Anchor Box 2(向量下半部分):

  • Anchor Box 1 对应部分:Pc = 0,其余为 don't care
  • Anchor Box 2 对应部分:Pc = 1,并用 bx, by, bw, bh 精确描述红色边界框位置,类别中「汽车」对应分量为 1

易错点: 一个网格单元内若只有一个目标,它只会占据一个 Anchor 的位置,另一个 Anchor 的 Pc 必须置 0,而不是复制同一目标。只有当网格内同时出现两个目标(且形状分别匹配两个 Anchor)时,两个 Anchor 才会都被激活。

思考:这里「don't care」在实现时通常用损失函数屏蔽(mask)来处理,即 Pc=0 的 Anchor 不参与边界框和类别损失的梯度回传。

网格数与 Anchor 数的实际取值

  • 演示用 3×3 网格仅为简化,实践中常用 19×19。
  • 若使用更多 Anchor Box(如 5 个),输出维度变为 19×19×40(因为 5×8 = 40)。

考点: 输出维度公式 = 网格高 × 网格宽 × Anchor 数 × (5 + 类别数)。例:19×19×5×8 = 19×19×40。


三、训练网络 [03:25]

要点

  • 输入图像尺寸示例为 100×100×3。
  • 网络输出即为前述的输出体积(如 3×3×16 或 3×3×2×8)。
  • 训练目标就是让网络在对应网格、对应 Anchor 位置输出正确的 y 向量。

详细说明

训练一个卷积网络:输入一张图像(例如 100×100×3),网络最终输出前面构造好的输出体积。损失函数会针对每个网格单元、每个 Anchor 计算预测 y 与真实 y 的差异,其中 Pc=0 的 don't care 分量被屏蔽。

理解:YOLO 本质上是把「目标检测」转化成了一个回归 + 分类的稠密预测问题——一次性对整张图的所有网格、所有 Anchor 输出预测,这正是「You Only Look Once」名称的由来。


四、网络如何进行预测 [03:44]

要点

  • 给定输入图像,网络输出 3×3×2×8 的体积,每个网格单元对应一个向量。
  • 无目标网格:网络应输出 Pc≈0,其余分量是噪声,可忽略。
  • 有目标网格:对应 Anchor 的 Pc≈1,并输出较精确的边界框和类别。

详细说明

左上角无目标网格: 希望网络输出 Pc = 0(两个 Anchor 都是 0)。网络无法输出「问号」,它会输出一些数值,但既然 Pc 已经告诉你这里没有目标,后面的边界框数值就基本是噪声,直接忽略。

左下角含汽车网格: 希望第一个 Anchor 的 Pc = 0(输出一堆噪声),第二个 Anchor 的 Pc = 1,并输出一组能较准确描述汽车位置的边界框参数。

关键理解: 判断一个网格是否有目标,只看 Pc。Pc 低就丢弃该 Anchor 的所有输出,不必纠结它的边界框数值是否合理。


五、非极大值抑制(NMS)后处理 [04:56]

要点

  • 使用 2 个 Anchor 时,9 个网格共产生 18 个预测边界框。
  • 边界框可以超出所属网格单元的宽高范围(这是正常的,不是 bug)。
  • 第一步:丢弃低概率(低 Pc)预测。
  • 第二步:按类别独立运行 NMS(行人、汽车、摩托车各跑一次)。
  • 输出:整幅图中所有被检测到的汽车和行人。

详细说明

步骤 1:得到所有预测框 每个网格单元产生 2 个预测框,9 个网格共 18 个。很多框的 Pc 很低。

易错点: 边界框可能超出它所属网格单元的边界,这是完全正常的——网格单元只是「负责检测」该目标的锚点归属,并不限制边界框的物理范围。

步骤 2:剔除低概率预测 把 Pc 很低的框直接丢弃,只保留网络认为「确实存在目标」的框。

步骤 3:按类别分别运行 NMS 假设要检测 3 类(行人、汽车、摩托车):

  • 对「行人」类别的所有预测框运行一次 NMS
  • 对「汽车」类别的所有预测框运行一次 NMS
  • 对「摩托车」类别的所有预测框运行一次 NMS

考点: NMS 必须按类别独立进行。如果对所有类别混在一起跑 NMS,可能把「行人」和「汽车」重叠的框互相抑制掉,导致漏检。这是 YOLO 实现中最常见的错误之一。

理解:按类别独立 NMS 的原因在于——不同类别的目标在物理上可以重叠(例如人站在车前面),它们的框重叠不代表是同一个目标的重复检测。

最终输出: 经过上述步骤后,得到图中所有汽车和行人的检测结果。


六、本节小结与课程定位 [06:25]

要点

  • YOLO 是最有效的目标检测算法之一。
  • 它融合了计算机视觉目标检测文献中的许多最佳思想。
  • 本周编程作业会让大家亲手实现 YOLO 的多个组件。

详细说明

YOLO 之所以强大,是因为它把目标检测的多个关键技巧整合进一个统一框架:

  • 网格划分 + 卷积实现(避免滑动窗口的重复计算)
  • 边界框回归(bx, by, bw, bh)
  • Anchor Boxes(处理同网格多目标和不同形状)
  • IoU 作为评价与分配依据
  • 非极大值抑制(去重)

学习建议: 本节是理论收尾,真正的理解要靠编程作业。建议重点实现:① 目标向量 y 的构造;② IoU 计算;③ 按类别 NMS。这三块是 YOLO 的核心工程难点。


关键标签 / 关键词

YOLO #目标检测 #AnchorBox #非极大值抑制 #NMS #IoU #边界框 #卷积神经网络 #吴恩达深度学习 #CNN #Pc #don'tcare #输出张量维度 #按类别NMS


生成时间:2026-10-11 00:45:07 生成平台:VideoNote www.xygy.top