视频封面

视频元信息

  • 系列:吴恩达深度学习专项课程 · 卷积神经网络(CNN)· 目标检测
  • 课程编号:p135 / 30 - 3.5

内容摘要(TL;DR)

本视频讲解如何让目标检测输出更精确的边界框,核心是 YOLO(You Only Look Once)算法:将图像划分为网格,对每个网格单元应用图像分类与定位算法,输出 8 维标签向量(PC、BX、BY、BH、BW、C1、C2、C3)。采用卷积实现共享计算,速度极快,可支持实时检测。视频还详细讲解了边界框坐标的编码方式。


一、滑动窗口的局限:边界框不够精确 [00:00]

上一节学到的滑动窗口的卷积实现虽然计算效率更高,但存在一个问题:

它无法输出最精确的边界框。

  • 滑动窗口只是在预设的一组位置上跑分类器,这些位置之间的间隔由步幅决定。
  • 结果就是:没有一个框能完美匹配汽车的真实位置,只能选一个"最接近"的框。
  • 真实标注(ground truth)中的完美边界框甚至不是正方形——它往往是一个略宽的矩形,具有横向的宽高比。

理解:滑动窗口的问题本质在于"离散采样"——框的位置和长宽比都被限制在有限的候选集合里,无法自由回归出任意形状的框。

核心问题:有没有办法让算法输出更精确的边界框?


二、YOLO 算法概述 [00:54]

YOLO = You Only Look Once(你只看一次)

考点:YOLO 的提出者 —— Joseph Redmon、Santosh Divvala、Ross Girshick、Ali Farhadi。这是一个常被考查的知识点。

基本思路:把图像划分成网格,对每个网格单元应用之前学过的图像分类与定位算法。

  • 示例中假设输入图像为 100×100。
  • 为便于讲解,使用 3×3 网格;实际实现中会用更细的网格,比如 19×19。

三、标签定义:8 维向量 Y [02:03]

对每个网格单元,定义一个 8 维标签向量 Y:

分量 含义
PC 该网格单元中是否有目标(0 或 1)
BX, BY 目标中心点相对网格单元的坐标
BH, BW 边界框的高度、宽度(相对网格单元)
C1, C2, C3 类别标签(行人、汽车、摩托车)

易错点:类别数不含背景类。 视频中识别 3 类目标(行人、汽车、摩托车)+ 背景类,但 C1、C2、C3 只对应这 3 个前景类,背景通过 PC=0 表示,不单独占一个类别分量。

网格单元的标注规则

  • 左上角网格:没有目标 → Y = [0, ?, ?, ?, ?, ?, ?, ?],PC=0,其余为 don't care。
  • 中间网格:虽然覆盖了两辆车的一部分,但两辆车的中心点都不在它里面 → 同样视为无目标,PC=0。
  • 左侧绿色圈出的网格:包含左车的中心点 → PC=1,写入 BX、BY、BH、BW,类别为汽车 → [1, BX, BY, BH, BW, 0, 1, 0]。
  • 右侧网格:包含右车的中心点 → 同样有完整标签。

关键规则:

考点:目标归属规则 —— YOLO 取每个目标的中心点(midpoint),将目标分配给包含该中心点的那个网格单元。即使目标跨越多个网格,也只归属到一个网格。


四、输出体积与网络训练 [04:58]

  • 3×3 网格,每个网格一个 8 维向量 → 总输出体积为 3×3×8。
  • 输出体积中每个 1×1×8 的位置,对应一个网格单元的 8 维目标向量。
  • 没有目标的网格,其向量为 don't care。

训练过程:

  • 输入:100×100×3 的图像 X。
  • 网络:常规 CNN,包含卷积层、最大池化层等,最终映射到 3×3×8 的输出体积。
  • 目标标签:Y 为 3×3×8 的体积。
  • 使用反向传播训练网络,学习从输入 X 到输出体积 Y 的映射。

理解:这本质上是一个"多任务学习"——每个网格单元同时做三件事:判断有无目标(二分类)、回归边界框坐标(回归)、分类目标类别(多分类)。


五、测试阶段的推理 [07:07]

测试时:

  1. 输入图像 X,前向传播得到输出 Y(3×3×8)。
  2. 对 3×3 的每个位置,读取输出:
    • 该位置是否有目标?(读 PC)
    • 如果有,是什么类别?(读 C1、C2、C3)
    • 该网格内目标的边界框是什么?(读 BX、BY、BH、BW)

前提假设:每个网格单元中最多只有一个目标。 如果网格单元中有多个目标,算法会出问题——这个问题后续视频会处理。


六、更细的网格:19×19 [07:49]

实际使用中,采用更细的网格,如 19×19:

  • 输出体积变为 19×19×8。
  • 网格更细 → 多个目标落入同一网格单元的概率更小。
  • 再次强调:目标按中心点归属网格,每个目标只分配给一个网格单元。

思考:网格越细,定位精度越高,但计算量也越大,且每个网格单元的训练样本可能变得不均衡(大量无目标的网格)。这是实际工程中需要权衡的点。


七、YOLO 的两大优势 [08:42]

优势一:可输出任意宽高比的精确边界框

  • 类似图像分类与定位算法,显式输出边界框坐标。
  • 不受滑动窗口步幅限制,可输出任意宽高比的框,坐标更精确。

优势二:卷积实现,计算共享,速度极快

考点:YOLO 是单次卷积实现,不是对每个网格单独跑算法。

  • 不是在三三得九的网格上跑 9 次算法,也不是在 19×19 网格上跑 361 次。
  • 而是一次卷积实现,所有网格单元的计算共享大量计算量。
  • 因此运行速度非常快,可用于实时目标检测。

八、边界框编码方式(BX, BY, BH, BW)[10:16]

以右侧汽车所在的网格单元为例,讲解坐标编码。

约定:

  • 网格单元左上角为 (0, 0)。
  • 网格单元右下角为 (1, 1)。

各参数含义:

参数 含义 取值范围
BX 中心点 x 坐标(相对网格单元) 0 到 1 之间
BY 中心点 y 坐标(相对网格单元) 0 到 1 之间
BH 边界框高度(相对网格单元高度) 可大于 1
BW 边界框宽度(相对网格单元宽度) 可大于 1

示例中:BX ≈ 0.4,BY ≈ 0.3,BW ≈ 0.9,BH ≈ 0.5。

易错点:BX、BY 必须在 0 到 1 之间。 因为按定义,中心点必然落在该网格单元内;若中心点超出边界,它就会被分配给相邻的网格单元。

但 BH、BW 可以大于 1。 当边界框超出网格单元范围时(例如一个很大的目标),其高度或宽度相对于网格单元的比例就会超过 1。

更高级的参数化方式【拓展】

考点:YOLO 论文中还有其他参数化方式,效果更好。

视频提到,YOLO 研究论文中还有更复杂的参数化方法:

  • 使用 Sigmoid 函数确保 BX、BY 落在 0 到 1 之间。
  • 使用 指数参数化(exponential parameterization) 确保 BH、BW 非负(≥ 0)。

理解:直接回归坐标容易出现数值不稳定或越界,用 Sigmoid/指数变换可以把输出约束到合法范围,这是目标检测中坐标回归的常见技巧。

不过视频中讲解的简单编码方式已经足够合理、可以正常工作。


九、关于 YOLO 论文的阅读建议 [13:30]

重要提醒:YOLO 论文是较难读的论文之一。

吴恩达老师分享了自己的亲身经历:

  • 第一次读 YOLO 论文时,非常难理解。
  • 甚至请了几位非常优秀的研究员朋友帮忙,他们理解某些细节也很吃力。
  • 所以如果读论文时感到困难,这是正常的,不必气馁。

思考:读论文遇到困难是常态,即使是资深研究者也需要借助开源代码、联系作者等方式来理解细节。这是一个很实用的心态建设。


关键标签 / 关键词

YOLO #YouOnlyLookOnce #目标检测 #边界框预测 #BoundingBox #滑动窗口 #图像分类与定位 #网格划分 #8维标签向量 #PC #BX #BY #BH #BW #卷积实现 #实时检测 #吴恩达深度学习 #CNN #JosephRedmon #Sigmoid #参数化


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