📺 B站视频讲解(Bilibili):https://www.bilibili.com/video/BV1k1C9BYEAB/
📘 《Yocto项目实战教程》京东购买链接:Yocto项目实战教程
Ultralytics YOLO 模型实战运行逻辑:从代码到框架的完整讲解
本文是对《Ultralytics 核心基础理论》的延续,更侧重“实战代码 + 框架运行逻辑”的完整讲解。从一个初学者视角出发,带你看懂:YOLO 模型是怎样通过 Ultralytics 框架进入系统的、model.predict() 内部究竟做了什么、不同格式模型如何驱动不同推理后端、Trainer 和 Predictor 如何协作、以及工程部署中 ONNX/TensorRT 的完整流程。
文章结构清晰、概念准确、流程图与表格并用,配合真实代码示例,适合工程师、学生与想要深入理解 YOLO 官方框架的开发者使用。
目录
- 为什么要学习 Ultralytics YOLO 的运行逻辑?
- 第一部分:最小可运行 YOLO 推理代码
- 第二部分:YOLO() 构造函数内部到底做了什么?
- 第三部分:模型加载全流程(PT / ONNX / TensorRT)
- 第四部分:Predictor 预测器的完整推理流水线
- 第五部分:Trainer 训练器的训练流水线
- 第六部分:不同任务类型如何自动切换(detect/seg/pose/obb/classify)
- 第七部分:三大实战场景(推理 / 微调 / 工程部署)
- 第八部分:YOLO 推理、训练、导出的三大核心架构图
- 结语:从“模型使用者”到“框架理解者”

1. 为什么要学习 Ultralytics YOLO 的运行逻辑?
Ultralytics 是 YOLO 的官方 Python 框架,它不仅仅是“能跑模型”,它更是一套完整的训练/推理/导出系统。你在日常开发中,可能只写:
from ultralytics import YOLO
model = YOLO("yolo11n.pt")
model("image.jpg")
但背后包含:
- 模型加载
- 自动选择推理后端(PyTorch / ONNXRuntime / TensorRT)
- 数据预处理
- 推理(forward)
- 解码、NMS
- 结果包装
- 可视化
理解这一整套流程会带来极大帮助:
- 能更快定位推理问题
- 能更好理解 TensorRT、ONNX 的作用
- 能在部署中选择最优路径
- 能深入 Trainer/Predictor ,改代码或扩展模型
深度理解框架,就是从“会用 AI”进阶到“懂原理工程师”的关键步骤。
2. 第一部分:最小可运行 YOLO 推理代码(起点)
一个最小 YOLO 推理脚本如下:
from ultralytics import YOLO
# 1. 加载模型
model = YOLO("yolo11n.pt")
# 2. 对图片推理
results = model("bus.jpg")
# 3. 遍历结果
for r in results:
print(r.boxes) # 检测框
print(r.probs) # 类别置信度
这个简单的例子就是本篇文章所有内容的出发点。
你必须首先明白:
- YOLO(…) 是模型的“入口”
- model(…) 是推理的“入口”
接下来,我们就按这两个入口,把整个 Ultralytics 框架完全拆开讲清楚。
3. 第二部分:YOLO() 构造函数内部到底做了什么?
你在代码中写:
model = YOLO("yolo11n.pt")
其实会触发 ultralytics/engine/model.py 中的 __init__(),核心任务是:
识别输入模型格式 → 选择合适的加载方式 → 将模型变成可推理对象。
Ultralytics 支持非常多的模型输入方式:
| 输入内容 | 类型 | 框架行为 |
|---|---|---|
yolo11n.pt | PyTorch 权重 | 使用 _load() → PyTorch backend |
yolo11n.yaml | 模型结构 YAML | 使用 _new() 从结构构建模型 |
xxx.onnx | ONNX 模型 | 使用 AutoBackend → ONNXRuntime |
xxx.engine | TensorRT 引擎 | 使用 AutoBackend → TensorRT |
| HUB 模型 ID | 云模型 | 自动从 HUB 下载权重 |
| 已初始化 Model 对象 | 内部模型 | 直接接管其属性 |
换句话说:
YOLO() 不是“加载模型”,而是“判断模型 + 选择后端 + 创建推理系统”。
3.1 YOLO() 内部逻辑流程图
YOLO(model)
│
├─ 如果是 Model 对象 → 直接接管
│
├─ 如果是 HUB 模型 → 下载 pt
│
├─ 如果是 Triton URL → 标记为远程推理
│
├─ 如果是 YAML → _new() 构建新模型
│
└─ 其他情况 (.pt/.onnx/.engine) → _load() → AutoBackend
在实际工程中,最常用的就是:
.pt(PyTorch).onnx(推理).engine(TensorRT 推理)
这三种格式对应三种部署方式,也是你后续做工程时必须理解的核心。
4. 第三部分:模型加载全流程(PT / ONNX / TensorRT)
接下来我们讲清楚,当 YOLO() 被调用时,三种主流模型格式如何进入 Ultralytics。
4.1 加载 .pt(PyTorch 权重)的流程
YOLO("yolo11n.pt")
│
├─ 识别为 PyTorch 权重
├─ 提取模型结构与权重
├─ 重建网络结构(nn/modules)
├─ 将权重映射到层结构中
└─ model = 一个可前向推理的 PyTorch 模型
PyTorch 模型的特点:
- 可训练
- 可 fine-tune
- 支持分布式训练
缺点:推理慢,不适合部署。
4.2 加载 .onnx(ONNX 格式)的流程
YOLO("yolo11n.onnx")
│
├─ AutoBackend 判断为 ONNX
├─ 调用 ONNXRuntime session
├─ 准备输入输出节点
└─ model = ONNXRuntime 推理器
ONNX 是一个通用格式:
- 可以在 Jetson、Windows、Linux、Android 运行
- 推理速度比 PyTorch 快
- 是 TensorRT 的中间格式
4.3 加载 .engine(TensorRT 引擎)的流程
YOLO("yolo11n.engine")
│
├─ AutoBackend 判断为 TensorRT
├─ 调用 TensorRT runtime 加载引擎
├─ 分配 GPU 内存(显存 workspace)
├─ 创建上下文(context)
├─ 为输入输出绑定 buffer
└─ model = TensorRT 推理器(最快)
TensorRT 的特点:
- NVIDIA GPU 上最强推理速度
- 支持 FP16 / INT8 加速
- 部署必选
在 Jetson/Xavier/Orin 上必须使用 TensorRT 进行最终部署。
5. 第四部分:Predictor 预测器的完整推理流水线
当你调用:
results = model("image.jpg")
时,会触发 Ultralytics 的推理系统。
整个推理过程由 Predictor(engine/predictor.py) 驱动。
下面我们讲清楚完整流程。
5.1 推理完整流程图
model(source)
│
├─ YOLO.__call__ → YOLO.predict
│
├─ Predictor = DetectionPredictor()
│
├─ 创建数据源(DataLoader)
│ ├─ 文件/文件夹
│ ├─ 视频
│ ├─ 摄像头
│ ├─ PIL.Image / ndarray
│
├─ 预处理
│ ├─ resize / letterbox
│ ├─ BGR → RGB
│ ├─ /255
│ ├─ to GPU
│
├─ 前向推理
│ ├─ PyTorch forward
│ ├─ ORT inference
│ └─ TensorRT context.execute
│
├─ 后处理
│ ├─ 解码框
│ ├─ NMS
│ └─ 构建 Results
│
└─ 返回 list[Results]
Predictor 的核心理念:
“我负责图像输入、预处理和结果包装,至于推理由 AutoBackend 决定。”
5.2 Preprocess:图像预处理逻辑
主要逻辑:
- resize (640×640 或用户指定)
- 等比例缩放 + 填充(letterbox)
- 通道交换(BGR→RGB)
- 转为 float32
- 除以 255
- torch.tensor 、to(device)
5.3 Forward:前向推理逻辑
与模型类型相关:
| 模型格式 | 前向操作 |
|---|---|
PyTorch .pt | model(x) |
ONNX .onnx | ort_session.run |
TensorRT .engine | context.execute_v2 |
Predictor 不关心怎么算,只把输入给 AutoBackend。
5.4 Postprocess:后处理逻辑
- 对输出进行 reshape
- decode (Anchor-Free head)
- DFL 精细定位
- NMS(YOLOv10 有 NMS-Free)
- 生成 Results 对象
Results 包含:
- boxes
- masks
- probs
- keypoints
- segments
你可以在 Python 里直接:
r.plot()
展示带框图像。
6. 第五部分:Trainer 训练器的训练流水线
训练通常写:
model.train(data="coco128.yaml", epochs=50)
这会触发 DetectionTrainer。
6.1 训练流水线流程图
YOLO.train
│
├─ 根据任务类型选择 Trainer 类
│
├─ 创建 Trainer 对象
│ ├─ 加载 data.yaml
│ ├─ 构建模型(若 .yaml)
│ ├─ 数据增强(Mosaic 等)
│ ├─ 数据加载器(train + val)
│ └─ 初始化优化器 / EMA
│
├─ epoch 循环
│ ├─ 前向(forward)
│ ├─ 计算 loss
│ ├─ 反向传播(backward)
│ ├─ 更新权重(optimizer.step)
│ ├─ 学习率调度(LR scheduler)
│ └─ 验证指标
│
├─ 保存 best.pt 和 last.pt
│
└─ 返回 metrics
Trainer 的本质:
将数据集 + 模型 + 优化器组合成一条“自动化训练流水线”。
7. 第六部分:不同任务类型如何自动切换
Ultralytics 支持:
- 检测(detect)
- 分割(segment)
- 姿态(pose)
- 旋转框 OBB(obb)
- 分类(classify)
秘诀是 task_map:
task_map = {
"detect": {"trainer": DetectionTrainer, "predictor": DetectionPredictor},
"segment": {"trainer": SegmentationTrainer, ...},
"pose": {...},
"obb": {...},
"classify": {...},
}
当你加载 yolo11n-seg.pt 时:
- YAML/pt 内部包含 task 信息
- Ultralytics 自动选择 SegmentationPredictor
所以你无需关心任务分类,只需:
model = YOLO("yolo11n-seg.pt")
model("img.jpg")
即可切换成分割模型。
8. 第七部分:三大典型实战场景
下面总结初学者最常用的三种模式。
8.1 场景 1:直接推理(最快上手)
from ultralytics import YOLO
model = YOLO("yolo11n.pt")
model("test.jpg", save=True)
用途:
- 测试模型
- 快速演示
- 可视化结果
8.2 场景 2:微调训练(finetune)
model = YOLO("yolo11n.pt")
model.train(data="mydata.yaml", epochs=100)
训练结束后:
- best.pt(最佳模型)
- last.pt(最终模型)
推理时:
YOLO("runs/detect/train/weights/best.pt")
8.3 场景 3:工程部署(ONNX/TensorRT)
导出
model.export(format="onnx")
model.export(format="engine", half=True)
使用
model = YOLO("best.engine")
model("test.jpg")
工程部署常用 TensorRT,以获得:
- 最高速度
- 最低延迟
- 最小显存占用
9. 第八部分:三大核心架构图
以下文本版架构图适合直接插入你的 PPT/书籍中。
9.1 YOLO 推理体系结构总览
YOLO.__call__
│
└→ YOLO.predict
│
└→ Predictor
│
├→ preprocess
├→ AutoBackend.forward
├→ postprocess
└→ Results
9.2 模型加载自动分发结构
YOLO(model_path)
│
├─ .pt → PyTorch
├─ .onnx → ONNXRuntime
├─ .engine → TensorRT
├─ .yaml → 构建模型结构
└─ HUB ID → 下载后当作 pt 处理
9.3 训练流程整体架构
Trainer
│
├─ Build model
├─ Build dataloaders
├─ Loss
├─ Optimizer
├─ Backprop
├─ Update params
└─ Validate metrics
10. 结语:从“模型使用者”到“框架理解者”
通过本篇文章,你现在能够:
- 读懂 YOLO() 如何加载不同格式模型
- 理解 Predictor 如何驱动完整推理
- 理解 Trainer 如何执行训练
- 熟练切换任务类型(detect/seg/pose/obb)
- 掌握模型导出 → ONNX → TensorRT 的完整流程
- 构建自己的 YOLO 工程部署体系
Ultralytics 的设计理念非常统一:
一个入口(YOLO),一个架构(Engine + NN),多后端(PT/ONNX/TRT)。
📺 B站视频讲解(Bilibili):https://www.bilibili.com/video/BV1k1C9BYEAB/
📘 《Yocto项目实战教程》京东购买链接:Yocto项目实战教程

2795

被折叠的 条评论
为什么被折叠?



