Windows系统无法实例化PosixPath?YOLOv5模型加载报错求助
问题描述
我编写了一段基于YOLOv5的目标检测Python代码,代码如下:
# 导入库 import torch import cv2 import numpy as np # 加载模型 model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt', force_reload=True) # 初始化视频捕获 cap = cv2.VideoCapture(1) # 开始检测循环 while True: # 读取视频帧 ret, frame = cap.read() # 执行检测 detect = model(frame) # 显示检测结果(包含FPS) cv2.imshow('香蕉检测器', np.squeeze(detect.render())) # 监听键盘输入,ESC键退出 t = cv2.waitKey(5) if t == 27: break cap.release() cv2.destroyAllWindows()
运行时出现如下错误:
回溯(最近的调用最后): 文件 "C:\Users\HP/.cache\torch\hub\ultralytics_yolov5_master\hubconf.py", 第50行, 在 _create 函数中 model = DetectMultiBackend(path, device=device, fuse=autoshape) # 检测模型 文件 "C:\Users\HP/.cache\torch\hub\ultralytics_yolov5_master\models\common.py", 第467行, 在 __init__ 函数中 model = attempt_load(weights if isinstance(weights, list) else w, device=device, inplace=True, fuse=fuse) 文件 "C:\Users\HP/.cache\torch\hub\ultralytics_yolov5_master\models\experimental.py", 第97行, 在 attempt_load 函数中 ckpt = torch.load(attempt_download(w), map_location="cpu") # 加载模型 文件 "C:\Users\HP\AppData\Local\Programs\Python\Python39\lib\site-packages\torch\serialization.py", 第1026行, 在 load 函数中 return _load(opened_zipfile, 文件 "C:\Users\HP\AppData\Local\Programs\Python\Python39\lib\site-packages\torch\serialization.py", 第1438行, 在 _load 函数中 result = unpickler.load() 文件 "C:\Users\HP\AppData\Local\Programs\Python\Python39\lib\pathlib.py", 第1084行, 在 __new__ 函数中 raise NotImplementedError("无法在你的系统上实例化%r" NotImplementedError: 无法在你的系统上实例化'PosixPath' 在处理上述异常期间,发生了另一个异常: 回溯(最近的调用最后): 文件 "C:\Users\HP/.cache\torch\hub\ultralytics_yolov5_master\hubconf.py", 第65行, 在 _create 函数中 model = attempt_load(path, device=device, fuse=False) # 任意模型 文件 "C:\Users\HP/.cache\torch\hub\ultralytics_yolov5_master\models\experimental.py", 第97行, 在 attempt_load 函数中 ckpt = torch.load(attempt_download(w), map_location="cpu") # 加载模型 文件 "C:\Users\HP\AppData\Local\Programs\Python\Python39\lib\site-packages\torch\serialization.py", 第1026行, 在 load 函数中 return _load(opened_zipfile, 文件 "C:\Users\HP\AppData\Local\Programs\Python\Python39\lib\site-packages\torch\serialization.py", 第1438行, 在 _load 函数中 result = unpickler.load() 文件 "C:\Users\HP\AppData\Local\Programs\Python\Python39\lib\pathlib.py", 第1084行, 在 __new__ 函数中 raise NotImplementedError("无法在你的系统上实例化%r" NotImplementedError: 无法在你的系统上实例化'PosixPath' 上述异常是以下异常的直接原因: 回溯(最近的调用最后): 文件 "c:\Users\HP\OneDrive - Universidad Politecnica Salesiana\Escritorio\Prueba\Ia.py", 第7行, 在主模块中 model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt', force_reload=True) 文件 "C:\Users\HP\AppData\Local\Programs\Python\Python39\lib\site-packages\torch\hub.py", 第566行, 在 load 函数中 model = _load_local(repo_or_dir, model, *args, **kwargs) 文件 "C:\Users\HP\AppData\Local\Programs\Python\Python39\lib\site-packages\torch\hub.py", 第595行, 在 _load_local 函数中 model = entry(*args, **kwargs) 文件 "C:\Users\HP/.cache\torch\hub\ultralytics_yolov5_master\hubconf.py", 第88行, 在 custom 函数中 return _create(path, autoshape=autoshape, verbose=_verbose, device=device) 文件 "C:\Users\HP/.cache\torch\hub\ultralytics_yolov5_master\hubconf.py", 第83行, 在 _create 函数中 raise Exception(s) from e Exception: 无法在你的系统上实例化'PosixPath'。缓存可能过期,请尝试`force_reload=True`或查看帮助文档。
请问该如何解决?
解决方案
这个错误的核心原因是你使用的best.pt模型是在Linux/macOS系统下训练保存的,模型文件中嵌入了类Unix系统特有的PosixPath路径对象,而Windows系统只支持WindowsPath,因此加载时出现兼容问题。以下是几种可行的解决方法:
临时路径兼容补丁:在代码最开头添加以下代码,强制替换
PosixPath为Windows兼容的路径类,这样就能直接加载模型:import pathlib # 临时替换PosixPath,解决跨系统加载问题 temp_posix = pathlib.PosixPath pathlib.PosixPath = pathlib.WindowsPath把这段代码放在所有导入语句的最前面,再执行后续的库导入和模型加载操作。
使用绝对路径加载模型:将
best.pt的路径改为Windows格式的绝对路径,避免相对路径可能带来的解析问题,示例如下:model = torch.hub.load('ultralytics/yolov5', 'custom', path=r'C:\Users\HP\OneDrive - Universidad Politecnica Salesiana\Escritorio\Prueba\best.pt', force_reload=True)注意路径前的
r表示原始字符串,避免转义字符影响路径解析。重新保存模型:如果你能访问训练该模型的环境,或者可以在Windows上重新训练,保存模型时使用字符串格式的路径(而非
Path对象),这样生成的模型文件就能在Windows系统上正常加载。更新YOLOv5版本:较新的YOLOv5版本已经修复了跨系统路径兼容的问题,你可以尝试重新拉取最新的YOLOv5代码,再加载模型。
内容的提问来源于stack exchange,提问作者Luis Poveda
相关产品推荐
相关产品推荐

