笔记本训练的YOLOv5模型部署树莓派4B失败求解决方案
解决YOLOv5模型从Windows部署到树莓派4B的WindowsPath实例化错误
问题场景
在Windows笔记本上训练YOLOv5自定义数据集后,将训练好的crosswalk_detection_best.pt模型复制到树莓派4B,执行以下检测命令时出现报错:
python3 detect.py --weights /home/hasha/project/yolov5/runs/train/crosswalk_detection/weights/crosswalk_detection_best.pt --source /home/hasha/project/1.jpg
报错信息
detect: weights=['/home/hasha/project/yolov5/runs/train/crosswalk_detection/weights/crosswalk_detection_best.pt'], source=/home/hasha/project/1.jpg, data=data/coco128.yaml, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_csv=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs/detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False, dnn=False, vid_stride=1 YOLOv5 🚀 v7.0-335-g40f490d9 Python-3.11.2 torch-2.3.1 CPU Traceback (most recent call last): File "/home/hasha/project/yolov5/detect.py", line 313, in <module> main(opt) File "/home/hasha/project/yolov5/detect.py", line 308, in main run(**vars(opt)) File "/home/hasha/myenv/lib/python3.11/site-packages/torch/utils/_contextlib.py", line 115, in decorate_context return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/home/hasha/project/yolov5/detect.py", line 116, in run model = DetectMultiBackend(weights, device=device, dnn=dnn, data=data, fp16=half) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/hasha/project/yolov5/models/common.py", line 467, in __init__ model = attempt_load(weights if isinstance(weights, list) else w, device=device, inplace=True, fuse=fuse) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/hasha/project/yolov5/models/experimental.py", line 98, in attempt_load ckpt = torch.load(attempt_download(w), map_location="cpu") # load ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/hasha/myenv/lib/python3.11/site-packages/torch/serialization.py", line 1025, in load return _load(opened_zipfile, ^^^^^^^^^^^^^^^^^^^^^ File "/home/hasha/myenv/lib/python3.11/site-packages/torch/serialization.py", line 1446, in _load result = unpickler.load() ^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/pathlib.py", line 874, in __new__ raise NotImplementedError("cannot instantiate %r on your system" NotImplementedError: 无法在您的系统上实例化'WindowsPath'
错误原因
模型在Windows系统训练时,训练日志和配置中保存了Windows格式的WindowsPath路径对象,当在Linux系统(树莓派)加载模型时,Python无法反序列化Windows专属的路径类型,导致报错。
解决方法
方法1:导出为ONNX格式跨平台部署
在Windows的YOLOv5环境中将模型导出为ONNX格式,该格式不受系统路径影响:
- 执行导出命令:
python export.py --weights crosswalk_detection_best.pt --include onnx - 将导出的
crosswalk_detection_best.onnx复制到树莓派指定目录 - 在树莓派上用ONNX模型执行检测:
python3 detect.py --weights crosswalk_detection_best.onnx --source /home/hasha/project/1.jpg
方法2:修改模型加载代码兼容路径类型
直接修改树莓派上YOLOv5的模型加载逻辑,将WindowsPath映射为Linux的PosixPath:
- 打开
models/experimental.py文件 - 找到
attempt_load函数里的ckpt = torch.load(attempt_download(w), map_location="cpu")代码块,替换为以下内容:import pickle from pathlib import PosixPath class PathUnpickler(pickle.Unpickler): def find_class(self, module, name): if module == 'pathlib' and name == 'WindowsPath': return PosixPath return super().find_class(module, name) with open(attempt_download(w), 'rb') as f: ckpt = PathUnpickler(f).load() - 保存文件后重新执行原检测命令
方法3:在Linux/WSL环境重新训练模型
如果条件允许,直接在Linux系统或Windows的WSL子系统中训练模型,训练生成的模型会保存Linux兼容的PosixPath路径信息,复制到树莓派后可直接加载使用。
内容的提问来源于stack exchange,提问作者Hashan Senarathna
相关产品推荐
相关产品推荐

