3. YOLO 原理精讲:从任务定义到架构演进

目标检测,说白了就是让计算机回答两个问题:“什么东西在哪?”。听起来简单,但实现起来门道不少。YOLO 系列是我个人最常用的检测框架,没有之一。它把检测当作一个回归问题,一步到位,干净利落。

3.1 目标检测任务定义

在进入 YOLO 之前,我们先明确目标检测要解决什么。一张图进来,你要输出:

  • 类别:每个目标属于哪一类(人、车、猫...)
  • 位置:用一个矩形框(Bounding Box)把目标圈出来
  • 置信度:这个框里真的有目标吗?有多确定?

我刚开始做检测时,总以为分类做好了检测就简单了。后来发现,定位才是真正的难点——框偏一点,IoU 就掉得厉害。

核心指标:IoU(交并比)

IoU = 预测框 ∩ 真实框 / 预测框 ∪ 真实框

一般 IoU > 0.5 就算检测成功,但实际项目中我通常要求 0.7 以上。

3.2 YOLO 核心思想

YOLO 的全称是 You Only Look Once。为什么叫这个?因为它把检测当作一个端到端的回归问题,只看一次就同时输出类别和位置。不像 R-CNN 系列,先提候选区域再分类,慢得要命。

3.2.1 网格划分(Grid Cell)

YOLO 把输入图像划分成 S×S 的网格。每个网格负责检测中心点落在该网格内的目标。

举个例子:一张 416×416 的图,分成 13×13 的网格,每个格子 32×32 像素。如果一个目标的中心落在某个格子里,这个格子就负责预测它。

我的经验:网格越细,小目标检测越好,但计算量也越大。YOLOv3 用了 3 种尺度(13×13、26×26、52×52),就是为了兼顾大小目标。

3.2.2 边界框预测(Bounding Box Prediction)

每个网格预测 B 个边界框。每个框包含 5 个值:

  • (x, y):框中心相对于网格的偏移(0~1)
  • (w, h):框的宽高相对于整图的比值(0~1)
  • 置信度:Pr(Object) × IoU(pred, truth)

这里有个坑:直接预测 (x, y, w, h) 不稳定。YOLO 用的是偏移量 + 先验框(Anchor Box)的方式。我踩过这个坑——早期版本直接回归坐标,训练时 loss 震荡得厉害,后来换成基于 anchor 的偏移预测,收敛快多了。

3.2.3 置信度(Confidence)

置信度不是简单的“有没有目标”,而是 “有目标的概率 × 框的准确度”。公式:

Confidence = Pr(Object) × IoU(pred, truth)

如果网格里没有目标,Pr(Object)=0,置信度就是 0。如果有目标,置信度就是 IoU 值。这样设计的好处是:高置信度意味着既检测到了目标,框得也准。

注意:测试时,我们通常设置一个置信度阈值(比如 0.5),低于这个值的框直接扔掉。然后再做 NMS(非极大值抑制)去掉重复框。

3.3 YOLO 损失函数

YOLO 的损失函数是多任务联合损失,包含三部分:

损失项 含义 权重
坐标损失 预测框与真实框的 (x, y, w, h) 误差 λcoord = 5
置信度损失 有目标/无目标的置信度误差 λnoobj = 0.5
分类损失 类别预测的交叉熵误差 1

为什么坐标损失权重这么大?因为框的位置比类别更重要。框偏了,类别再对也没用。无目标网格的置信度损失权重设小,是因为大部分网格都没有目标,防止负样本主导训练。

我记得第一次调 YOLO 时,发现 loss 降不下去,后来发现是 w, h 的平方根误差 在作怪。YOLOv1 用平方根是为了减小大框和小框的误差差异,但实际效果有限。从 v3 开始改用 CIoU / GIoU,效果好多了。

3.4 YOLOv3/v4/v5/v8 架构演进

YOLO 系列迭代很快,每个版本都有核心改进。我按自己的理解梳理一下:

3.4.1 YOLOv3:多尺度 + Darknet53

  • 骨干网络:Darknet53(53 层卷积,借鉴 ResNet 的残差结构)
  • 多尺度预测:3 个尺度(13×13、26×26、52×52),分别检测大、中、小目标
  • 激活函数:Leaky ReLU
  • 分类器:用 Logistic 替代 Softmax,支持多标签

YOLOv3 是里程碑式的版本。我至今还在用它的变体做工业项目,稳定、快、效果好。

3.4.2 YOLOv4:Bag of Freebies

YOLOv4 不是作者本人做的,但改进很实用:

  • 骨干:CSPDarknet53(跨阶段局部连接,减少计算量)
  • Neck:SPP + PANet(空间金字塔池化 + 路径聚合网络)
  • 训练技巧:Mosaic 数据增强、Label Smoothing、CIoU Loss
  • 激活函数:Mish(比 Leaky ReLU 更平滑)

我的建议:YOLOv4 的 Mosaic 增强特别适合小目标检测。把 4 张图拼成 1 张,小目标密度翻倍,模型学得更好。

3.4.3 YOLOv5:工程化典范

YOLOv5 是 Ultralytics 推出的,虽然名字有争议,但工程化做得最好:

  • 模型导出:原生支持 ONNX、TensorRT、CoreML
  • 自动锚框:训练前自动计算最佳 Anchor
  • Focus 层:下采样时减少信息丢失
  • 损失函数:CIoU + 二元交叉熵

我个人最喜欢 YOLOv5 的 代码结构,清晰、易改、好部署。很多公司直接拿它做二次开发。

3.4.4 YOLOv8:最新集大成者

YOLOv8 是 Ultralytics 的最新版本,2023 年发布:

  • 骨干:C2f 模块(比 C3 更高效)
  • Head:解耦头(分类和回归分开)
  • 损失:DFL(Distribution Focal Loss)+ CIoU
  • 训练:自动数据增强、EMA(指数移动平均)
  • 任务:支持检测、分割、姿态估计、分类

YOLOv8 的 解耦头 是个好设计。以前分类和回归共用特征,互相干扰。分开后,各自学各自的,精度提升明显。

3.5 YOLO 架构演进对比

版本 骨干网络 Neck Head 损失函数 特点
v3 Darknet53 FPN 耦合头 MSE + BCE 多尺度、稳定
v4 CSPDarknet53 SPP+PANet 耦合头 CIoU + BCE 训练技巧丰富
v5 CSPDarknet53 SPP+PANet 耦合头 CIoU + BCE 工程化、易部署
v8 C2f SPP+PANet 解耦头 DFL + CIoU 多任务、精度高

3.6 YOLO 核心流程 SVG 图

YOLO 目标检测核心流程 输入图像 S×S 网格划分 每个网格预测 B 个边界框 预测:(x, y, w, h, 置信度, 类别概率) NMS 后处理 → 最终输出 核心思想 端到端回归 只看一次 全局推理 输出格式 S × S × (B×5 + C) S=网格数 B=框数 C=类别数

总结一下:YOLO 的核心就是网格 + 回归 + 多任务损失。从 v3 到 v8,骨干越来越强,Neck 越来越丰富,Head 越来越精细,但底层的“只看一次”思想没变。理解了这个,你就能看懂任何 YOLO 变体。