4. 模型权重文件加载与保存
任务目标
本案例完成YOLOv11权重文件的加载与格式转换闭环:使用PyTorch加载官方预训练权重,检查模型结构与权重键名,并将权重保存为PyTorch原生格式(.pt)与ONNX格式(.onnx)。通过文件生成与再加载验证保存结果正确。
环境依赖
需要 ultralytics(含YOLOv11)、torch、onnx。安装命令:pip install ultralytics onnx。若需导出ONNX,还需安装onnxruntime用于后续验证(可选)。
关键完整代码
import torch
from ultralytics import YOLO
# 1. 加载官方预训练权重(自动下载yolo11n.pt)
model = YOLO("yolo11n.pt")
print("模型类型:", type(model))
print("任务类型:", model.task)
# 2. 获取底层PyTorch模型并检查权重键名
pt_model = model.model
state_dict = pt_model.state_dict()
print("权重键数量:", len(state_dict))
# 打印前5个键名,确认结构
for i, k in enumerate(state_dict.keys()):
if i < 5:
print("键名示例:", k)
# 3. 保存为PyTorch格式(覆盖默认保存路径)
save_pt_path = "yolo11n_custom.pt"
torch.save(state_dict, save_pt_path)
print("PyTorch权重已保存至:", save_pt_path)
# 4. 保存为ONNX格式(动态batch,简化输出)
save_onnx_path = "yolo11n_custom.onnx"
model.export(format="onnx", dynamic=True, simplify=True, imgsz=640)
# export默认生成yolo11n.onnx,重命名以区分
import os
if os.path.exists("yolo11n.onnx"):
os.rename("yolo11n.onnx", save_onnx_path)
print("ONNX权重已保存至:", save_onnx_path)
# 5. 验证:重新加载保存的.pt文件并推理
loaded_model = YOLO(save_pt_path)
print("重新加载成功,任务类型:", loaded_model.task)
# 6. 验证:加载ONNX文件(使用onnxruntime或ultralytics)
onnx_model = YOLO(save_onnx_path)
print("ONNX加载成功,格式:", onnx_model.task)
运行方式
将上述代码保存为 weight_io.py,在Python 3.9+环境中直接运行:
python weight_io.py
首次运行会自动下载 yolo11n.pt(约5.4MB),需保持网络畅通。
验证方法与判定标准
- 文件生成检查:运行结束后,当前目录应存在
yolo11n_custom.pt与yolo11n_custom.onnx两个文件,且大小均大于1MB。 - 加载验证:控制台输出“重新加载成功”与“ONNX加载成功”即表示两种格式均可被YOLO API正常读取。
- 结构一致性:打印的权重键名以
model.开头(如model.0.conv.weight),键数量约为300个左右,说明预训练权重完整加载。
常见问题
- ONNX导出失败:若提示缺少
onnxsim,运行pip install onnxsim后重试;若因网络问题下载超时,可先手动下载yolo11n.pt放置于脚本同目录。 - 内存不足:导出ONNX时若显存不足,将
imgsz改为320可降低资源占用。 - 格式差异说明:
torch.save保存的是纯权重字典(不含模型结构),加载时必须配合YOLO类使用;ONNX文件则包含完整计算图,可脱离PyTorch环境部署。