4. YOLOv1详解:核心思想、网络结构、损失函数、优缺点分析

YOLOv1,说实话,是目标检测领域的一个分水岭。在它之前,大家做检测基本都走「先提候选框,再分类」的路子——R-CNN、Fast R-CNN 都是这个套路。但 YOLO 的作者想得很直接:为什么非要分两步?我一眼看过去就知道画面里有什么、在哪儿,模型为什么不行?

于是,他们把检测当成一个回归问题来解。一张图进去,直接输出边界框坐标和类别概率。嗯,这就是 YOLOv1 最核心的思维转变。

4.1 核心思想:把检测当作回归

YOLOv1 的做法,说白了就是分而治之。它把输入图片划分成 S×S 的网格。每个网格负责检测中心点落在自己内部的目标。

我刚开始看时,有个地方容易绕进去:每个网格预测 B 个边界框,但并不是每个框都要去匹配一个目标。训练时,只有那个与真实框 IoU 最大的预测框,才被选来负责学习这个目标。其他框?它们只学「没有目标」这件事。

关键理解:YOLOv1 的每个网格只预测一个类别概率,但可以预测多个边界框。这意味着,同一个网格内如果出现两个不同类别的目标中心点,模型就处理不了。这是 YOLOv1 对小目标和密集目标效果差的重要原因。

整个流程可以概括为:

  1. 输入图像缩放到 448×448
  2. 通过卷积网络提取特征
  3. 最后用全连接层输出 S×S×(B×5 + C) 的张量
  4. 对输出做非极大值抑制(NMS),得到最终检测结果

这个 S×S×(B×5 + C) 怎么理解?我习惯这样拆:

  • S×S:网格数量,里 S=7
  • B:每个网格预测的边界框数量,里 B=2
  • 5:每个框的 4 个坐标 (x, y, w, h) + 1 个置信度
  • C:类别数,PASCAL VOC 数据集是 20

所以输出张量维度是 7×7×(2×5 + 20) = 7×7×30。

YOLOv1 核心流程 输入图像 448×448 S×S 网格 S=7 卷积网络 24个卷积层 全连接层 输出 7×7×30 NMS 后处理 检测结果 输出张量 7×7×30 结构 每个网格 (共49个) 包含: • 边界框1: (x, y, w, h, 置信度) → 5个值 • 边界框2: (x, y, w, h, 置信度) → 5个值 • 类别概率: 20个值 (PASCAL VOC)

4.2 网络结构:GoogLeNet 的变体

YOLOv1 的网络设计,借鉴了 GoogLeNet 的思路,但没直接用 Inception 模块。它用了 24 个卷积层提取特征,后面接 2 个全连接层做预测。

我记得第一次复现时,最让我意外的是最后用了全连接层。这在当时很常见,但后来大家发现全连接层会丢失空间信息,所以 YOLOv2 就改成了全卷积。嗯,这就是踩坑换来的经验。

模块 结构 输出尺寸
输入 448×448 图像 448×448×3
特征提取 24 个卷积层 + 4 个最大池化层 7×7×1024
全连接 4096 个神经元 4096
输出 7×7×30 张量 1470

我的习惯:刚开始学 YOLOv1 时,建议先别看完整的网络结构表,容易晕。先记住「24个卷积 + 2个全连接」这个骨架,再慢慢往里填细节。

4.3 损失函数:多任务学习的经典设计

YOLOv1 的损失函数,是整篇最精妙的地方之一。它把坐标回归、置信度预测、分类三个任务揉在一起,用一个公式搞定。

公式长这样(别怕,我拆开讲):

Loss = λ_coord * Σ(坐标误差) 
     + Σ(含目标框的置信度误差) 
     + λ_noobj * Σ(不含目标框的置信度误差) 
     + Σ(分类误差)

这里面有几个关键设计:

  • λ_coord = 5:加大坐标误差的权重。为什么?因为坐标稍微偏一点,IoU 可能掉很多。我刚开始调参时试过 λ_coord=1,结果框的位置飘得没法看。
  • λ_noobj = 0.5:降低无目标框的置信度损失权重。因为大部分网格都是背景,如果权重一样,模型会倾向于把所有置信度都预测为 0。
  • 宽高用平方根:对 w 和 h 取平方根再算误差。这样做的目的是让小框的误差惩罚相对更大。你想想看,同样偏差 5 个像素,对小框的影响远大于大框。

我曾经踩过的坑:训练 YOLOv1 时,如果发现模型预测的框总是偏大或偏小,先检查损失函数里 w、h 有没有用平方根。我有一版代码忘了开根号,结果模型对大框和小框一视同仁,小目标几乎全丢了。

4.4 优缺点分析:开山之作的得与失

YOLOv1 的优点很明显,缺点也同样明显。我按自己的理解列一下:

维度 优点 缺点
速度 45 FPS,实时检测的标杆 —
精度 背景误检率低,全局理解好 小目标检测差,密集目标容易漏
泛化 学到目标的通用特征表示 对非训练集尺寸的目标适应差
结构 端到端,简洁优雅 全连接层参数量大,空间信息丢失

具体来说:

  • 每个网格只能预测一个类别。如果两个小目标的中心点落在同一个网格里,模型只能选一个。这是 YOLOv1 对小目标密集场景无能为力的根本原因。
  • 对目标尺寸变化敏感。训练集里没见过特别大或特别小的目标,推理时就容易翻车。
  • 定位精度不够高。尤其是跟后来的 Faster R-CNN 比,YOLOv1 的框位置没那么准。

但话说回来,YOLOv1 的意义不在于它有多完美,而在于它证明了「检测可以一步到位」。这个思路影响了后面所有的单阶段检测器——SSD、YOLOv2/v3/v4/v5,甚至包括一些 Transformer 检测器。

我的总结:YOLOv1 就像目标检测领域的「破冰船」。它不完美,但它开辟了一条新路。如果你现在做项目,肯定不会直接用 YOLOv1,但理解它的设计哲学,对你理解整个 YOLO 家族都很有帮助。