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 用单个卷积网络,一次前向传播,同时输出所有网格的预测结果。不需要候选区域,不需要多次扫描。这就是它快的根本原因。
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的理论基础,说白了就是「网格 + 回归 + 损失函数」。理解这些,后面实战部分你会轻松很多。