YOLOv9如何加载自定义权重?--weights参数使用教程
在深度学习目标检测任务中,模型权重的加载是训练与推理流程中的关键环节。YOLOv9作为当前高性能实时检测器的代表之一,支持通过--weights参数灵活加载预训练或自定义权重文件。本文将结合YOLOv9官方版训练与推理镜像环境,系统讲解--weights参数的使用方法,重点聚焦于如何正确加载自定义权重,避免常见错误,并实现高效迁移学习。
1. 镜像环境说明
本镜像基于 YOLOv9 官方代码库构建,预装了完整的深度学习开发环境,集成了训练、推理及评估所需的所有依赖,开箱即用。
- 核心框架: pytorch==1.10.0
- CUDA版本: 12.1
- Python版本: 3.8.5
- 主要依赖: torchvision==0.11.0,torchaudio==0.10.0,cudatoolkit=11.3, numpy, opencv-python, pandas, matplotlib, tqdm, seaborn等。
- 代码位置:
/root/yolov9
该环境已配置好PyTorch与CUDA的兼容性,确保GPU加速稳定运行,用户无需额外处理依赖冲突问题。
2.--weights参数基础用法
2.1 参数作用解析
--weights是 YOLOv9 训练和推理脚本中的核心参数,用于指定模型初始化所使用的权重文件路径。其典型格式如下:
--weights 'path/to/your/weights.pt'它可以接受以下几种输入形式:
'yolov9-s.pt':相对路径(位于当前目录)'/root/yolov9/yolov9-m.pt':绝对路径'':空字符串,表示不加载任何权重(从头开始训练)
2.2 推理时加载权重
在进行图像或视频检测时,必须指定有效的权重文件以启用模型前向推理。示例如下:
python detect_dual.py \ --source './data/images/horses.jpg' \ --img 640 \ --device 0 \ --weights './yolov9-s.pt' \ --name yolov9_s_640_detect此命令会加载预下载的yolov9-s.pt模型,在单张图片上执行目标检测,结果保存至runs/detect/yolov9_s_640_detect/目录。
注意:若未提供
--weights参数或路径错误,程序将抛出FileNotFoundError或模型结构无法恢复的异常。
3. 加载自定义权重的完整流程
3.1 自定义权重来源说明
“自定义权重”通常指以下三类:
- 自己训练生成的
.pt文件(如runs/train/exp/weights/best.pt) - 第三方发布的兼容YOLOv9结构的权重
- 由其他模型转换而来的权重(需保证层命名一致)
无论来源如何,加载前都应确认:
- 权重文件包含
model键(对应主干网络) - 若用于训练,建议同时保留
optimizer,epoch,best_fitness等状态信息
3.2 准备自定义权重文件
假设你已有训练好的权重文件custom_yolov9_best.pt,请将其上传至镜像环境中,推荐路径为:
/root/yolov9/weights/custom_yolov9_best.pt创建目录并拷贝文件(可在宿主机执行scp或通过Web IDE上传):
mkdir -p /root/yolov9/weights # 将本地文件上传后复制到该目录 cp ~/upload/custom_yolov9_best.pt /root/yolov9/weights/3.3 使用自定义权重进行推理
进入代码目录并激活环境后,调用detect_dual.py脚本指定新权重:
cd /root/yolov9 conda activate yolov9 python detect_dual.py \ --source './data/images/bus.jpg' \ --img 640 \ --device 0 \ --weights './weights/custom_yolov9_best.pt' \ --name custom_detect_result输出结果将保存在runs/detect/custom_detect_result/中,包含标注框可视化图像。
3.4 使用自定义权重进行迁移训练
迁移学习是提升小样本任务性能的有效手段。你可以基于自定义权重继续训练,命令如下:
python train_dual.py \ --workers 8 \ --device 0 \ --batch 32 \ --data data.yaml \ --img 640 \ --cfg models/detect/yolov9-s.yaml \ --weights './weights/custom_yolov9_best.pt' \ --name yolov9_finetune_v2 \ --hyp hyp.scratch-high.yaml \ --epochs 50 \ --close-mosaic 40关键注意事项:
- 模型结构一致性:确保
--cfg指定的模型结构与权重文件匹配。例如,不能用yolov9-e.yaml的结构加载yolov9-t.pt的权重。 - 设备映射兼容性:PyTorch 默认保存 GPU 张量,若在 CPU 上加载需添加
map_location处理(内部自动适配一般无问题)。 - 冻结部分层可选:可通过
--freeze参数冻结主干网络(如--freeze 0 1 2冻结前三个模块),加快微调速度。
4. 常见问题与解决方案
4.1 权重文件找不到(File Not Found)
错误提示:
OSError: [Errno 2] No such file or directory: './weights/custom_yolov9_best.pt'解决方法:
- 使用
ls检查文件是否存在:ls -l /root/yolov9/weights/ - 确保路径为相对路径(相对于
/root/yolov9)或使用绝对路径/root/yolov9/weights/... - 注意大小写和扩展名
.pt是否正确
4.2 权重结构不匹配(Key Mismatch)
错误提示:
RuntimeError: Error(s) in loading state_dict for Model: Unexpected key(s) in state_dict: "model.0.conv.weight", ...原因分析:
.pt文件保存的是完整 checkpoint,但模型结构定义不同- 可能是不同版本 YOLOv9 或非官方分支训练所得
解决策略:
- 查看权重内容结构:
import torch ckpt = torch.load('./weights/custom_yolov9_best.pt') print(ckpt['model'].keys()) - 对比当前
models/detect/yolov9-s.yaml定义的层数与名称 - 如确需跨结构使用,可编写权重映射函数进行手动加载
4.3 空权重导致随机初始化训练
当设置--weights ''时,模型将从头开始训练(scratch training),适用于全新任务且无预训练可用场景。
但请注意:
- 收敛速度较慢,建议配合
hyp.scratch-high.yaml等专为从头训练设计的超参文件 - batch size 不宜过小(建议 ≥64),否则梯度不稳定
5. 最佳实践建议
5.1 统一权重管理目录
建议建立标准权重存储结构,便于管理和复用:
/root/yolov9/ ├── weights/ │ ├── pretrained/ # 官方预训练模型 │ │ └── yolov9-s.pt │ ├── custom/ # 自定义训练产出 │ │ └── best_epoch30.pt │ └── converted/ # 第三方模型转换后权重 │ └── yolov9-t_converted.pt相应地调整命令行参数:
--weights './weights/custom/best_epoch30.pt'5.2 训练中断续接权重
YOLOv9 支持断点续训。若训练过程中断,可直接使用上次保存的last.pt或best.pt继续:
python train_dual.py \ --weights 'runs/train/exp/weights/last.pt' \ --resume--resume参数会自动恢复优化器状态、epoch 数、学习率调度等信息。
5.3 多卡训练权重兼容性
在多GPU环境下训练生成的权重,默认使用DistributedDataParallel包装,其state_dict中的键名带有module.前缀。若要在单卡推理时加载,有两种方式:
方式一:导出为标准格式
使用export.py工具去除module.前缀:
python export.py --weights runs/train/exp/weights/best.pt --include onnx pt方式二:修改加载逻辑(推荐用于测试)
在代码层面处理:
from collections import OrderedDict ckpt = torch.load('best.pt') state_dict = ckpt['model'].state_dict() new_state_dict = OrderedDict() for k, v in state_dict.items(): name = k[7:] if k.startswith('module.') else k # remove 'module.' prefix new_state_dict[name] = v model.load_state_dict(new_state_dict)6. 总结
6.1 核心要点回顾
本文围绕 YOLOv9 的--weights参数,详细阐述了其在官方训练与推理镜像中的使用方式,涵盖以下几个关键方面:
- 基础语法:理解
--weights在detect_dual.py和train_dual.py中的作用机制; - 自定义权重加载:从文件准备、路径设置到实际调用的全流程操作;
- 迁移训练技巧:利用已有权重进行微调,显著提升小数据集表现;
- 常见问题排查:针对路径错误、结构不匹配等问题提供了实用解决方案;
- 工程最佳实践:提出权重分类管理、断点续训、多卡兼容等生产级建议。
6.2 实践建议清单
- 始终验证权重路径有效性:使用
ls和torch.load()提前检查; - 保持模型结构与权重一致:避免跨架构误用导致加载失败;
- 优先使用绝对或规范相对路径:减少因工作目录变化引发的问题;
- 定期备份重要权重文件:防止训练成果丢失;
- 善用
--resume实现无缝续训:提高实验迭代效率。
掌握--weights参数的正确使用方法,是高效开展 YOLOv9 目标检测项目的基础能力。合理利用自定义权重,不仅能加速模型收敛,还能有效支持领域迁移与模型迭代优化。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。