YOLOv8 模型权重格式详解
本文档详细介绍 YOLOv8 支持的各种模型权重格式,包括项目中已有的格式和常见的其他格式。
目录
1. 项目中的模型文件
| 文件名 | 大小 | 格式 | 用途 |
|---|---|---|---|
| yolov8n.onnx | 13M | ONNX | 跨平台通用推理 |
| yolov8n.bin | 3.6M | OpenVINO | Intel CPU/GPU 加速 |
| yolov8n.rknn | 5.7M | RKNN | 瑞芯微 NPU 加速 |
| yolov8n.trt | 18M | TensorRT | NVIDIA GPU 加速 (x86) |
| yolov8n_arm.trt | 14M | TensorRT | NVIDIA GPU 加速 (ARM) |
2. 各格式详细说明
2.1 PyTorch (.pt)
概述:PyTorch 原生权重格式,是 YOLOv8 的源格式。
特点:
- 包含完整的模型结构和权重
- 支持训练和推理
- 可动态修改模型
- 文件较大,包含优化器状态等额外信息
适用场景:
- 模型训练和微调
- 开发调试阶段
- 需要修改模型结构
- 作为转换其他格式的源文件
优点:
- 灵活性最高
- 支持所有 PyTorch 功能
- 易于调试和修改
缺点:
- 推理速度相对较慢
- 需要完整的 PyTorch 环境
- 部署依赖较重
2.2 ONNX (.onnx)
概述:Open Neural Network Exchange,开放神经网络交换格式。
特点:
- 跨框架通用格式
- 静态计算图
- 广泛的硬件支持
- 标准化的算子定义
适用场景:
- 跨平台部署
- 作为中间格式转换到其他格式
- 使用 ONNX Runtime 推理
- 需要在多种硬件上运行
优点:
- 跨平台兼容性好
- 生态系统丰富
- 可作为转换枢纽
- 支持多种推理引擎
缺点:
- 不支持动态操作
- 某些复杂操作可能不支持
- 性能不如专用格式
项目中的使用:
python
import onnxruntime as ort
session = ort.InferenceSession("yolov8n.onnx", providers=['CPUExecutionProvider'])
2.3 TensorRT (.trt / .engine)
概述:NVIDIA 深度学习推理优化器和运行时。
特点:
- 针对 NVIDIA GPU 深度优化
- 支持 FP16/INT8 量化
- 层融合和内核自动调优
- 平台相关(不同 GPU 需重新生成)
适用场景:
- NVIDIA GPU 部署
- 需要最高推理性能
- 实时检测应用
- 边缘设备(Jetson 系列)
优点:
- NVIDIA GPU 上性能最优
- 支持多种精度优化
- 内存占用优化
缺点:
- 仅支持 NVIDIA GPU
- 不同 GPU/CUDA 版本需重新编译
- 生成过程耗时
项目中的文件:
yolov8n.trt:x86 平台(桌面/服务器 GPU)yolov8n_arm.trt:ARM 平台(Jetson 系列)
2.4 OpenVINO (.bin + .xml)
概述:Intel 开发的深度学习部署工具包。
特点:
- 针对 Intel 硬件优化
- 支持 CPU、集成 GPU、VPU、FPGA
- 自动硬件适配
- 支持异构计算
适用场景:
- Intel CPU 部署
- Intel 集成显卡加速
- Intel 神经计算棒(NCS)
- 边缘计算设备
优点:
- Intel 硬件上性能优秀
- 支持多种 Intel 加速器
- 低功耗优化
缺点:
- 主要针对 Intel 硬件
- 需要 OpenVINO 运行时
注意:OpenVINO 格式通常包含两个文件:
.bin:权重数据.xml:模型结构(项目中可能缺失)
2.5 RKNN (.rknn)
概述:瑞芯微(Rockchip)NPU 专用格式。
特点:
- 针对瑞芯微 NPU 优化
- 支持 INT8/FP16 量化
- 低功耗高效能
- 适合嵌入式部署
适用场景:
- 瑞芯微芯片(RK3588、RK3568 等)
- 嵌入式 AI 应用
- 低功耗边缘设备
- 安防监控设备
优点:
- NPU 加速,性能优秀
- 功耗低
- 适合嵌入式场景
缺点:
- 仅支持瑞芯微平台
- 需要 RKNN Toolkit
2.6 其他常见格式
CoreML (.mlmodel / .mlpackage)
- 用途:Apple 设备(iOS、macOS)
- 特点:针对 Apple Neural Engine 优化
TensorFlow SavedModel / TFLite (.pb / .tflite)
- 用途:TensorFlow 生态、移动端部署
- 特点:TFLite 适合 Android 和嵌入式
PaddlePaddle (.pdmodel)
- 用途:百度 PaddlePaddle 框架
- 特点:国产框架,适合国内部署
NCNN (.param + .bin)
- 用途:腾讯开源的移动端推理框架
- 特点:轻量级,适合移动端
3. 格式对比表
| 格式 | 文件大小 | 推理速度 | 跨平台 | 训练支持 | 主要硬件 |
|---|---|---|---|---|---|
| .pt | 大 | 中等 | ✓ | ✓ | CPU/GPU |
| .onnx | 中等 | 中等 | ✓ | ✗ | 通用 |
| .trt | 大 | 最快 | ✗ | ✗ | NVIDIA GPU |
| .bin (OpenVINO) | 小 | 快 | ✗ | ✗ | Intel |
| .rknn | 小 | 快 | ✗ | ✗ | Rockchip NPU |
| .tflite | 小 | 快 | 部分 | ✗ | 移动端/嵌入式 |
| .mlmodel | 中等 | 快 | ✗ | ✗ | Apple |
性能对比(相对值,以 .pt 为基准 1.0)
| 格式 | CPU 推理 | GPU 推理 | 内存占用 |
|---|---|---|---|
| .pt | 1.0x | 1.0x | 1.0x |
| .onnx | 1.2-1.5x | 1.1-1.3x | 0.8x |
| .trt | - | 2-4x | 0.6x |
| OpenVINO | 1.5-2x | 1.3-1.8x | 0.7x |
4. 格式转换方法
4.1 从 .pt 转换到其他格式
使用 Ultralytics 提供的 export 功能:
python
from ultralytics import YOLO
# 加载 PyTorch 模型
model = YOLO("yolov8n.pt")
# 转换为 ONNX
model.export(format="onnx", imgsz=640, simplify=True)
# 转换为 TensorRT (需要 NVIDIA GPU)
model.export(format="engine", imgsz=640, half=True) # FP16
model.export(format="engine", imgsz=640, int8=True) # INT8
# 转换为 OpenVINO
model.export(format="openvino", imgsz=640, half=True)
# 转换为 TFLite
model.export(format="tflite", imgsz=640)
# 转换为 CoreML (macOS)
model.export(format="coreml", imgsz=640)
# 转换为 PaddlePaddle
model.export(format="paddle", imgsz=640)
# 转换为 NCNN
model.export(format="ncnn", imgsz=640)
4.2 转换为 RKNN
RKNN 需要使用专门的工具包:
python
from rknn.api import RKNN
rknn = RKNN()
# 配置
rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform='rk3588')
# 加载 ONNX 模型
rknn.load_onnx(model='yolov8n.onnx')
# 构建
rknn.build(do_quantization=True, dataset='calibration_data.txt')
# 导出
rknn.export_rknn('yolov8n.rknn')
4.3 命令行转换
bash
# 使用 yolo 命令行工具
yolo export model=yolov8n.pt format=onnx imgsz=640
yolo export model=yolov8n.pt format=engine imgsz=640 half=True
yolo export model=yolov8n.pt format=openvino imgsz=640
5. 各格式调用方法
5.1 PyTorch (.pt) - Ultralytics 原生
python
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
results = model("image.jpg", conf=0.5)
# 获取检测结果
for box in results[0].boxes:
xyxy = box.xyxy[0].cpu().numpy() # [x1, y1, x2, y2]
conf = box.conf[0].item() # 置信度
cls = int(box.cls[0].item()) # 类别ID
5.2 ONNX - ONNX Runtime
python
import onnxruntime as ort
import numpy as np
import cv2
# 创建会话
session = ort.InferenceSession("yolov8n.onnx", providers=['CPUExecutionProvider'])
# GPU: providers=['CUDAExecutionProvider', 'CPUExecutionProvider']
# 预处理
image = cv2.imread("image.jpg")
input_data = preprocess(image) # letterbox + normalize + transpose
# 推理
outputs = session.run(None, {session.get_inputs()[0].name: input_data})
# 后处理
results = postprocess(outputs)
5.3 TensorRT
python
import tensorrt as trt
import pycuda.driver as cuda
import pycuda.autoinit
# 加载引擎
with open("yolov8n.trt", "rb") as f:
engine = trt.Runtime(trt.Logger()).deserialize_cuda_engine(f.read())
context = engine.create_execution_context()
# 分配内存并推理
# ... (需要更多代码处理输入输出绑定)
或使用 Ultralytics 简化调用:
python
from ultralytics import YOLO
model = YOLO("yolov8n.engine") # 自动使用 TensorRT
results = model("image.jpg")
5.4 OpenVINO
python
from openvino.runtime import Core
core = Core()
model = core.read_model("yolov8n.xml")
compiled_model = core.compile_model(model, "CPU") # 或 "GPU"
# 推理
output = compiled_model([input_data])
5.5 RKNN
python
from rknnlite.api import RKNNLite
rknn = RKNNLite()
rknn.load_rknn("yolov8n.rknn")
rknn.init_runtime(core_mask=RKNNLite.NPU_CORE_0)
# 推理
outputs = rknn.inference(inputs=[input_data])
6. 选择建议
按部署场景选择
| 场景 | 推荐格式 | 原因 |
|---|---|---|
| 开发调试 | .pt | 灵活,支持训练 |
| 通用部署 | .onnx | 跨平台兼容 |
| NVIDIA GPU 服务器 | .trt | 性能最优 |
| NVIDIA Jetson | .trt (ARM) | 边缘 GPU 加速 |
| Intel CPU/集显 | OpenVINO | Intel 优化 |
| 瑞芯微开发板 | .rknn | NPU 加速 |
| iOS/macOS | .mlmodel | Apple 优化 |
| Android | .tflite | 移动端优化 |
按优先级选择
- 追求最高性能:TensorRT (.trt) > OpenVINO > ONNX > PyTorch
- 追求兼容性:ONNX > PyTorch > 其他
- 追求灵活性:PyTorch (.pt) > ONNX > 其他
- 嵌入式部署:RKNN/TFLite/NCNN(根据硬件选择)
本项目推荐
- 训练和开发 :使用
.pt格式 - 通用测试 :使用
.onnx格式(当前test_ros1bag_perception_full.py使用) - 支持自定义权重 :使用
test_ros1bag_perception_full_pt.py(支持.pt和.onnx) - 生产部署:根据目标硬件选择对应格式
附录:常用命令速查
bash
# 查看模型信息
yolo info model=yolov8n.pt
# 导出为 ONNX
yolo export model=yolov8n.pt format=onnx
# 导出为 TensorRT FP16
yolo export model=yolov8n.pt format=engine half=True
# 验证导出的模型
yolo val model=yolov8n.onnx data=coco.yaml
# 使用导出的模型推理
yolo predict model=yolov8n.onnx source=image.jpg