4. YOLO理论基础:从发展到实战

YOLO,全称 You Only Look Once。名字很直白——只看一眼,就能知道画面里有什么、在哪儿。我第一次接触这个思路时,说实话有点怀疑:一张图只看一遍,能准吗?后来在项目中跑通第一个模型,才明白它的厉害之处。

4.1 目标检测发展简史

先聊聊背景。目标检测这条路,走了十几年,大致分三个阶段:

  • 传统方法时代(2010年前后):滑动窗口 + 手工特征(HOG、SIFT)。慢,而且泛化差。我记得最早做行人检测,一张图要扫几万个窗口,跑一帧得好几秒。
  • 两阶段检测器(2014-2016):R-CNN、Fast R-CNN、Faster R-CNN。先提候选区域,再分类回归。精度高,但速度上不去。做实时流?基本没戏。
  • 单阶段检测器(2016至今):YOLO、SSD、RetinaNet。一步到位,直接回归边界框和类别。速度起飞,精度也逐渐追上两阶段。

核心转折点:YOLO把检测当作回归问题,而不是分类问题。这个思路的改变,让实时检测成为可能。

4.2 YOLO核心思想

YOLO的核心,说白了就三件事:网格划分、边界框预测、一次性推理。

4.2.1 网格划分

输入图片被分成 S×S 的网格。每个网格负责检测中心落在该网格内的目标。

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

我个人的习惯:网格大小直接影响小目标检测效果。网格越细,小目标越容易被捕获。但网格太多,计算量也上去了。YOLOv3 用了多尺度网格,算是一个很实用的折中。

4.2.2 边界框预测

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

  • (x, y):框中心相对于网格的偏移
  • (w, h):框的宽高(相对于整图)
  • confidence:置信度,表示框内是否有目标 + 框的准确度

另外,每个网格还要预测 C 个类别概率。所以输出维度是:S × S × (B × 5 + C)。

我曾经踩过的坑:训练时如果锚框(anchor box)设置不合理,模型收敛会非常慢。建议先用 k-means 对训练集的标注框做聚类,找到适合你数据集的锚框尺寸。别直接用默认值。

4.2.3 一次性推理

YOLO 用单个卷积网络,一次前向传播,同时输出所有网格的预测结果。不需要候选区域,不需要多次扫描。这就是它快的根本原因。

YOLO 推理流程 输入图像 S×S 网格划分 卷积网络 预测结果 输出张量:S × S × (B × 5 + C) S=网格数,B=每个网格预测框数,C=类别数 后处理:非极大值抑制(NMS) 去除重复框 → 保留置信度最高的框 → 输出最终检测结果

4.3 YOLO损失函数简介

损失函数是训练的核心。YOLO的损失由三部分组成:

损失项 说明 权重
坐标损失 预测框与真实框的 (x, y, w, h) 误差 λ_coord = 5
置信度损失 框内是否有目标的置信度误差 有目标:1,无目标:λ_noobj = 0.5
分类损失 类别预测的交叉熵误差 1

为什么坐标损失权重设成5?因为一张图中大部分网格没有目标,如果不加权,模型会倾向于预测「没有目标」,导致框的位置学不好。这个细节,是YOLO作者在实践中调出来的。

我的经验:如果你自己训练YOLO,可以试试调整 λ_coord 和 λ_noobj 的比例。对于小目标多的场景,适当提高坐标损失权重,有时能明显改善召回率。

4.4 YOLOv3/v4/v5/v8版本差异对比

YOLO迭代很快。从v3到v8,每个版本都有核心改进。我整理了一张对比表:

版本 发布时间 骨干网络 核心改进 适用场景
YOLOv3 2018 Darknet-53 多尺度预测、逻辑回归分类 通用检测,稳定可靠
YOLOv4 2020 CSPDarknet-53 Mish激活、PANet、数据增强 精度优先,适合GPU部署
YOLOv5 2020 CSPDarknet(改进) PyTorch原生、自动锚框、模型轻量化 工程落地,移动端友好
YOLOv8 2023 CSPDarknet(再改进) Anchor-Free、解耦头、任务对齐学习 最新,精度速度均衡

4.4.1 YOLOv3:奠定基础

v3 引入了多尺度预测(3个尺度),解决了小目标检测的痛点。还用了逻辑回归替代softmax做分类,支持多标签。到现在,很多工业项目还在用v3,因为稳定、文档多。

4.4.2 YOLOv4:集大成者

v4 不是原作者做的,但效果很好。它把当时最先进的trick都塞进去了:Mish激活函数、PANet特征金字塔、CutMix数据增强、CIoU损失。我记得第一次跑v4,发现收敛速度比v3快了不少。

4.4.3 YOLOv5:工程化标杆

v5 最大的贡献是让YOLO变得「好用」。PyTorch实现,模型导出方便,支持TensorRT、ONNX。还提供了n/s/m/l/x五个版本,从移动端到服务器都能用。我现在的项目,90%都用v5。

4.4.4 YOLOv8:最新进化

v8 由Ultralytics开发(也是v5的团队)。最大的变化是去掉了锚框(Anchor-Free),用解耦头分别预测分类和回归。训练更稳定,推理速度也更快。如果你是新项目,我建议直接上v8。

选型建议:别盲目追新。如果你的场景是嵌入式设备,v5-nano可能比v8更合适。如果追求极致精度,v8-x是更好的选择。先跑通,再优化。

嗯,这一章的内容就到这里。YOLO的理论基础,说白了就是「网格 + 回归 + 损失函数」。理解这些,后面实战部分你会轻松很多。