Ultralytics YOLO 模型实战运行逻辑:从代码到框架的完整讲解

【投稿赢 iPhone 17】「我的第一个开源项目」故事征集:用代码换C位出道! 10w+人浏览 1.7k人参与


📺 B站视频讲解(Bilibili)https://www.bilibili.com/video/BV1k1C9BYEAB/

📘 《Yocto项目实战教程》京东购买链接Yocto项目实战教程


Ultralytics YOLO 模型实战运行逻辑:从代码到框架的完整讲解

本文是对《Ultralytics 核心基础理论》的延续,更侧重“实战代码 + 框架运行逻辑”的完整讲解。从一个初学者视角出发,带你看懂:YOLO 模型是怎样通过 Ultralytics 框架进入系统的、model.predict() 内部究竟做了什么、不同格式模型如何驱动不同推理后端、Trainer 和 Predictor 如何协作、以及工程部署中 ONNX/TensorRT 的完整流程。

文章结构清晰、概念准确、流程图与表格并用,配合真实代码示例,适合工程师、学生与想要深入理解 YOLO 官方框架的开发者使用。


目录

  1. 为什么要学习 Ultralytics YOLO 的运行逻辑?
  2. 第一部分:最小可运行 YOLO 推理代码
  3. 第二部分:YOLO() 构造函数内部到底做了什么?
  4. 第三部分:模型加载全流程(PT / ONNX / TensorRT)
  5. 第四部分:Predictor 预测器的完整推理流水线
  6. 第五部分:Trainer 训练器的训练流水线
  7. 第六部分:不同任务类型如何自动切换(detect/seg/pose/obb/classify)
  8. 第七部分:三大实战场景(推理 / 微调 / 工程部署)
  9. 第八部分:YOLO 推理、训练、导出的三大核心架构图
  10. 结语:从“模型使用者”到“框架理解者”

在这里插入图片描述

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.ptPyTorch 权重使用 _load() → PyTorch backend
yolo11n.yaml模型结构 YAML使用 _new() 从结构构建模型
xxx.onnxONNX 模型使用 AutoBackend → ONNXRuntime
xxx.engineTensorRT 引擎使用 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 .ptmodel(x)
ONNX .onnxort_session.run
TensorRT .enginecontext.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项目实战教程


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值