文章目录
训练好的检测模型 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 高性能推理