YOLO
You Only Look OnceAI/ML#目标检测#深度学习#计算机视觉
实时目标检测算法,将检测任务转化为回归问题,速度极快。
// 详细解释
YOLO (You Only Look Once)
YOLO(你只看一次) 是由 Joseph Redmon 等人于 2016 年提出的实时目标检测算法。它开创性地将目标检测转化为一个回归问题——一次性预测出所有边界框及其类别,无需传统的两阶段提案 + 分类流程,从而实现了端到端的检测。
YOLO 的核心创新
传统目标检测(如 R-CNN 系列)采用两阶段架构:
- Region Proposal:用选择性搜索或 RPN 在图片中提出若干候选区域
- Classification:对每个候选区域进行分类 + 边界框回归
这导致:
- 速度慢:两次处理,每张图片需要 2~5 秒
- 流程复杂:多个独立步骤难以端到端优化
YOLO 的思路非常直接:
把整张图片划分为 S × S 的网格,每个网格负责预测物体的中心点是否落在其中,同时回归出边界框和类别概率。
整个检测过程只需要一次前向传播——因此得名「You Only Look Once」。
YOLO 是如何工作的?
Step 1:网格划分
以 448 × 448 的输入为例,划分为 7 × 7 的网格(每个网格约 64 × 64 像素)。
code13 lines┌────┬────┬────┬────┬────┬────┬────┐ │ │ │ │ │ │ │ │ ├────┼────┼────┼────┼────┼────┼────┤ │ │ │ │ ⬤│ │ │ │ ← 物体中心点落在这个网格 ├────┼────┼────┼────┼────┼────┼────┤ │ │ │ │ │ │ │ │ ├────┼────┼────┼────┼────┼────┼────┤ │ │ │ │ │ │ ⬤│ │ ← 另一个物体 ├────┼────┼────┼────┼────┼────┼────┤ │ │ │ │ │ │ │ │ ├────┼────┼────┼────┼────┼────┼────┤ │ │ │ │ │ │ │ │ └────┴────┴────┴────┴────┴────┴────┘
每个网格预测:
- B 个边界框:(x, y, w, h) 的坐标 + 置信度
- C 个类别概率:物体是什么类别
Step 2:一次前向传播
整个网络一次前向传播输出一个 S × S × (B × 5 + C) 的张量:
- 5:每个边界框的 (x, y, w, h, confidence)
- B:每个网格预测的边界框数量(通常 B=2)
- C:类别数量(PASCAL VOC = 20,COCO = 80)
Step 3:后处理
- 过滤低置信度:丢弃置信度低于阈值的框
- NMS (Non-Maximum Suppression):对重叠的框只保留置信度最高的那一个
各版本 YOLO 的演进
| 版本 | 年份 | 关键改进 | FPS | mAP |
|---|---|---|---|---|
| YOLOv1 | 2016 | 首次提出一阶段检测框架 | 45 | 63.4 |
| YOLOv2 | 2017 | BatchNorm、Anchor Boxes、更高分辨率 | 67 | 76.8 |
| YOLOv3 | 2018 | 多尺度检测、Darknet-53、逻辑回归 | — | — |
| YOLOv4 | 2020 | 大量 Bag-of-Freebies(无代价技巧)、Mosaic 增强 | 65 | 43.5 (COCO) |
| YOLOv5 | 2020 | PyTorch 重写、模块化、易用性改进 | 140+ | ~37 (n) ~50 (x) |
| YOLOv6 | 2022 | 美团、硬件友好设计、RepVGG 模块 | — | — |
| YOLOv7 | 2022 | 结构重参数化、辅助头、E-ELAN | 161 | 51.2 |
| YOLOv8 | 2023 | Ultralytics、统一框架、无 Anchor | — | 53.9 |
| YOLOv9 | 2024 | GELAN、PGI、Progressive Learning | — | 53.0+ |
| YOLOv10 | 2025 | 清华 + ByteDance、End-to-End 检测、去 NMS | 448 | 53.3+ |
YOLOv8 的架构
YOLOv8(Ultralytics 出品)是目前最主流的版本,其架构包括:
Backbone(主干网络)
- CSPDarknet:跨阶段局部网络,减少计算量并保持精度
- 负责从输入图像中提取多尺度特征
Neck(特征融合)
- PAN-FPN:Path Aggregation Network + Feature Pyramid Network
- 融合不同层的特征,让网络既能看到细节也能看到整体
Head(检测头)
- 基于 Anchor-free 的检测头
- 分类分支 + 检测分支解耦
- 输出多尺度的检测结果(通常为 8×, 16×, 32× 下采样)
在 PyTorch 中使用 YOLO
使用 Ultralytics 库可以非常简单地调用 YOLO:
python16 linesfrom ultralytics import YOLO # 加载预训练模型(n/s/m/l/x 不同大小) model = YOLO("yolov8n.pt") # 最小最快 model = YOLO("yolov8x.pt") # 最大最准 # 推理 results = model("image.jpg") # 训练自定义数据集 results = model.train( data="coco128.yaml", epochs=100, imgsz=640, batch=16, )
为什么 YOLO 在工业界如此成功?
1. **真正的实时性**
- 在一张消费级 GPU 上可以达到 100+ FPS
- 甚至可以在嵌入式设备(Jetson、树莓派 + NPU)上实时运行
2. **精度足够高**
- 现代 YOLO 版本在 COCO 上达到 ~50 mAP
- 对于大多数工业应用(自动驾驶、工业质检、安防),精度和速度的平衡点恰到好处
3. **端到端,易部署**
- 单一模型文件,无需复杂的多步骤后处理
- 可直接导出 ONNX、TensorRT、CoreML 等格式
- 社区工具链极其完善
4. **开源生态繁荣**
- 海量预训练模型
- 丰富的教程和社区支持
- 大量基于 YOLO 的变种(用于分割、姿态估计、分类)
YOLO 的常见应用场景
| 领域 | 应用 |
|---|---|
| 自动驾驶 | 车辆、行人、交通标志检测 |
| 工业质检 | 产品缺陷检测、计数、定位 |
| 安防监控 | 异常行为识别、人流统计 |
| 农业 | 作物病害识别、成熟度评估 |
| 医疗影像 | 病灶检测(X光、CT) |
| 无人机 | 目标跟踪、避障、落点识别 |
| 零售 | 货架商品识别、无人收银 |
实践技巧
1. 根据场景选择模型大小
| 型号 | 参数 | 速度 (RTX 3090) | mAP (COCO) | 适用场景 |
|---|---|---|---|---|
| yolov8n | 3.2M | 512 FPS | 37.3 | 实时性优先、边缘设备 |
| yolov8s | 11.2M | 286 FPS | 44.9 | 平衡场景 |
| yolov8m | 25.9M | 160 FPS | 50.2 | 通用 |
| yolov8l | 43.7M | 115 FPS | 52.9 | 精度优先 |
| yolov8x | 68.2M | 96 FPS | 53.9 | 最高精度 |
2. 数据增强策略
- Mosaic:把 4 张图片组合在一起,强制模型学习多物体场景
- MixUp:图片线性混合,提高模型鲁棒性
- CutMix:剪切拼接,迫使模型关注边缘区域
- Random Perspective:随机仿射变换,模拟不同视角
3. 模型部署优化
python8 lines# 导出为 ONNX 格式 model.export(format="onnx") # 导出为 TensorRT(Nvidia GPU 最优) model.export(format="engine") # 导出为 CoreML(iOS/macOS) model.export(format="coreml")
YOLO 的未来方向
- 实时 + 语义分割统一:YOLO 已经扩展到分割(YOLOv8-seg)
- 多模态目标检测:结合文本描述的开放词汇检测
- 轻量化 + 边缘 AI:为嵌入式场景持续优化
- 视频目标检测:利用时序信息提升检测稳定性
- 视觉语言模型集成:YOLO + LLM = 视觉推理(如 Grounding DINO)