训练好的检测模型 best.pt

模型压缩 / 加速

剪枝 / 量化 / 蒸馏

导出部署格式

ONNX / TensorRT

实际设备上推理

模型剪枝:删除冗余结构,让模型变小变快

非结构化剪枝

删掉单个权重:

某些 weight 变成 0

优点:压缩率高。
缺点:普通硬件上不一定明显加速,因为矩阵结构变得稀疏,不好直接利用。

结构化剪枝

删掉整个通道、卷积核、层:

删除某些 channel
删除某些 filter

优点:真实推理更容易加速。
目标检测部署里更常关注结构化剪枝。

模型量化:用低精度数值计算

目标检测推理时,每张图会经过:

预处理
模型前向推理
后处理 NMS
输出 bbox / score / class

量化主要加速的是:

模型前向推理

例如原来 YOLO 用 FP32 推理,量化后用 FP16 或 INT8 推理:

FP32 YOLO → FP16 YOLO → INT8 YOLO

速度可能提升,模型更小,但检测精度可能下降。

两种常见量化

PTQ:Post-Training Quantization(训练后量化)

核心思想

模型训练完成后,不改变权重值本身,只是改变权重的数值表示方式——从高精度浮点数(FP32)压缩为低精度整数(INT8)或半精度浮点(FP16)。

在已经训练好的模型基础上,把模型计算过程中的连续浮点数近似成低精度的离散数值,然后用这些低精度数值继续完成目标检测推理。

原来:
FP32 权重 + FP32 激活值 → 特征提取 → 分类 + 框回归

PTQ 后:
INT8/FP16 权重 + INT8/FP16 激活值 → 特征提取 → 分类 + 框回归

为什么要量化?
指标 FP32 INT8 压缩比
每个数占用字节 4 bytes 1 byte 4x
内存占用 基准 1/4 ↓75%
推理速度 基准 2~4x 更快
硬件支持 通用 需 INT8 支持

现代 GPU / NPU 对 INT8 运算有专门加速单元(如 NVIDIA 的 Tensor Core),所以速度提升显著。

PTQ 的完整流程

你写的流程可以扩展成这样:

第一步:先正常训练模型
例如用 SSDD 训练 YOLO,得到 best.pt

第二步:固定模型参数
不再反向传播,不再更新权重

第三步:准备少量校准数据
通常从训练集或验证集中抽取几十到几百张图

第四步:让模型跑一遍校准数据
统计每一层激活值的大致范围

第五步:根据数值范围计算量化参数
例如 scale、zero-point

第六步:把 FP32 权重和激活映射到 INT8 / FP16

第七步:导出部署模型
例如 ONNX、TensorRT engine、OpenVINO IR 等

第八步:测试量化后模型精度
重点看 mAP、Precision、Recall、FPS、模型大小

QAT:Quantization-Aware Training(量化感知训练)

在训练过程中就模拟量化带来的误差,让模型提前适应 INT8 / 低精度推理环境,从而在最终导出量化模型时尽量减少精度下降。

普通训练:
模型一直在 FP32 环境下训练
最后突然变成 INT8
模型可能不适应

QAT:
训练时就模拟 INT8 的效果
模型提前适应量化误差
最后真的导出 INT8 时精度更稳

QAT 的基本流程

你给的流程可以扩展成这样:

第一步:准备一个已经训练好的 FP32 模型
例如 YOLO 的 best.pt

第二步:在模型中插入量化模拟模块
例如 Fake Quantization 模块

第三步:训练时进行伪量化
前向传播时模拟 INT8 量化误差

第四步:反向传播时继续更新 FP32 权重
通过梯度下降让模型适应量化误差

第五步:训练若干轮
通常不需要从头训练,而是在预训练模型基础上微调

第六步:导出真正的量化模型
例如 INT8 ONNX、TensorRT Engine、OpenVINO 模型等

第七步:测试量化模型效果
比较 FP32、PTQ INT8、QAT INT8 的 mAP、FPS、模型大小

在这里插入图片描述

知识蒸馏:大模型教小模型

知识蒸馏可以理解为小模型在训练阶段模仿大模型的预测行为,但这种模仿是通过损失函数和反向传播来更新小模型参数实现的。小模型的结构和推理流程通常不变,但参数会被调整,使其输出尽量接近大模型,同时保持较低的计算复杂度。

原本训练时,小模型主要根据真实标签 label 学习;知识蒸馏是在这个基础上,额外加入大模型提供的监督信息,让小模型不仅学标准答案,也学习大模型的判断分布、特征表达或检测结果。

训练目标变成:

小模型预测结果 ≈ 真实 label
小模型预测结果 ≈ 大模型预测结果

模型部署(onnx,TensorRT)

你现在训练得到的是:

best.pt

这是 PyTorch/Ultralytics 权重,适合在 Python 环境里跑。

但真实部署可能是:

服务器推理
边缘设备推理
C++ 工程
NVIDIA GPU 加速
嵌入式平台

这些地方不一定直接跑 .pt

所以要导出成部署格式。

ONNX

ONNX 可以理解成:

模型交换格式

它的作用是:

把 PyTorch 训练出来的模型,转换成其他推理框架也能读取的通用格式。

例如:

best.pt → best.onnx

ONNX 本身不是专门给目标检测设计的,它是通用模型格式。

best.pt 适合在 PyTorch 里继续训练、验证、推理,但如果你要部署到其他环境,比如:

C++ 程序
NVIDIA TensorRT
ONNX Runtime
OpenCV DNN
边缘设备
工业检测系统

直接拿 .pt 不一定方便。

所以需要一个中间格式。

这个中间格式就是 ONNX。

ONNX 官方对它的定位是开放的机器学习模型格式,它定义了通用的计算图、内置算子和标准数据类型,用于不同框架、工具、运行时之间的模型互操作。

TensorRT

TensorRT 是 NVIDIA 的高性能深度学习推理优化 SDK

TensorRT 的核心目标不是“交换模型”,而是:

让模型在 NVIDIA GPU 上跑得更快、更省显存、延迟更低。

TensorRT engine

当你把 ONNX 模型交给 TensorRT 后,TensorRT 会分析这个计算图,然后生成一个专门优化后的推理文件,通常叫:

TensorRT engine

或者:

.plan 文件
.engine 文件

你可以理解成:

ONNX:通用图纸
TensorRT engine:针对某台 NVIDIA GPU 编译好的高性能执行版本

流程是:

best.onnx
  ↓
TensorRT Builder 分析计算图
  ↓
选择合适 CUDA kernel
  ↓
做算子融合
  ↓
做精度优化 FP16 / INT8
  ↓
做显存规划
  ↓
生成 best.engine

最终推理时,不是每次都重新分析 ONNX,而是直接加载这个 engine。

所以:

ONNX 偏通用;
TensorRT engine 偏专用。

典型流程

在这里插入图片描述

ONNX 是“把模型翻译成大家都能看懂的图纸”;TensorRT 是“根据 NVIDIA GPU 把这张图纸重新编译成跑得更快的机器代码”。

典型流程是:

PyTorch 模型 best.pt
    ↓
导出成 ONNX:best.onnx
    ↓
TensorRT 读取 ONNX
    ↓
构建 TensorRT engine:best.engine
    ↓
在 NVIDIA GPU 上部署推理

所以你可以这样理解:

PyTorch:训练和研究方便
ONNX:模型迁移和交换方便
TensorRT:NVIDIA GPU 部署推理快

部署流程

如果你要部署,比如放到服务器、NVIDIA GPU、Jetson 上实时检测船只,那么 PyTorch 可能不是最高效选择。

部署流程可以是:

YOLO11n + SSDD 训练
    ↓
得到 best.pt
    ↓
导出 ONNX
    ↓
得到 best.onnx
    ↓
用 TensorRT 构建 engine
    ↓
得到 best.engine
    ↓
在 NVIDIA GPU 上做高速推理

注意:

ONNX / TensorRT 不改变 YOLO 的检测任务。
它们改变的是模型的表示方式和推理执行方式。

也就是说,模型还是做目标检测,只是从:

PyTorch 推理

变成:

TensorRT 高性能推理
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐