Traceback (most recent call last): File "/home/book/rk3566/ai_tools/yolov5-face-master/detect_face.py", line 224, in <module> model = load_model(opt.weights, device) File "/home/book/rk3566/ai_tools/yolov5-face-master/detect_face.py", line 30, in load_model model = attempt_load(weights, map_location=device) # load FP32 model File "/home/book/rk3566/ai_tools/yolov5-face-master/models/experimental.py", line 118, in attempt_load model.append(torch.load(w, map_location=map_location)['model'].float().fuse().eval()) # load FP32 model File "/home/book/anaconda3/envs/yolov5face/lib/python3.9/site-packages/torch/serialization.py", line 1470, in load raise pickle.UnpicklingError(_get_wo_message(str(e))) from None _pickle.UnpicklingError: Weights only load failed. This file can still be loaded, to do so you have two options, do those steps only if you trust the source of the checkpoint. (1) In PyTorch 2.6, we changed the default value of the `weights_only` argument in `torch.load` from `False` to `True`. Re-running `torch.load` with `weights_only` set to `False` will likely succeed, but it can result in arbitrary code execution. Do it only if you got the file from a trusted source. (2) Alternatively, to load with `weights_only=True` please check the recommended steps in the following error message. WeightsUnpickler error: Unsupported global: GLOBAL numpy.core.multiarray._reconstruct was not an allowed global by default. Please use `torch.serialization.add_safe_globals([_reconstruct])` or the `torch.serialization.safe_globals([_reconstruct])` context manager to allowlist this global if you trust this class/function. Check the documentation of torch.load to learn more about types accepted by default with weights_only https://pytorch.org/docs/stable/generated/torch.load.html. 报了新错误
时间: 2025-07-09 15:38:21 浏览: 3
<think>好的,用户现在遇到了一个新的错误,是关于PyTorch在加载模型权重时的UnpicklingError。首先,我需要仔细看一下错误信息,理解问题出在哪里。
根据用户提供的Traceback,错误发生在加载模型的时候,具体是在尝试使用torch.load加载权重文件时出现的。错误信息提到“Weights only load failed”,并且建议两种解决方法:要么在torch.load中设置weights_only=False,但要注意安全风险;要么将特定的全局变量添加到安全列表中。用户还提到了numpy.core.multiarray._reconstruct未被允许,导致加载失败。
首先,我需要回忆一下PyTorch的版本变化。在PyTorch 2.6之后,torch.load的默认参数weights_only从False改成了True,这意味着默认情况下只允许加载受信任的权重文件,以防止潜在的恶意代码执行。当用户使用较新版本的PyTorch加载旧版本保存的模型时,可能会遇到这个问题,特别是如果模型权重包含了需要反序列化的对象,而这些对象不在PyTorch的安全列表中。
接下来,我需要考虑用户可能的环境配置。用户之前可能使用的是PyTorch 2.6或更高版本,而他们下载的yolov5s-face.pt模型文件可能是用旧版本的PyTorch保存的,或者包含了需要额外权限的序列化对象,比如numpy的某些函数。
现在需要确定解决方案。根据错误提示,有两种方法:一种是设置weights_only=False,但需要用户确认模型来源可信;另一种是使用add_safe_globals将numpy的_reconstruct函数添加到安全列表中。不过,修改模型加载的代码可能对用户来说比较复杂,特别是如果他们不熟悉PyTorch内部的话。因此,最简单的解决方案是建议用户在使用torch.load时设置weights_only=False,或者降级PyTorch到2.6之前的版本。
但用户可能已经按照之前的指导调整了命令行参数,现在遇到的是模型加载的问题。这时候需要确保用户是否信任模型文件的来源,如果信任,可以指导他们修改detect_face.py中的load_model函数,在加载时添加weights_only=False参数。不过用户可能需要找到代码中调用torch.load的位置,通常是models/experimental.py中的attempt_load函数,修改那里的参数。
另外,考虑到用户可能不太熟悉代码修改,可能需要给出具体的代码修改示例,比如在加载模型的地方添加相应的参数。同时,也需要提醒用户注意安全风险,确保模型文件来源可靠。
此外,检查PyTorch版本也是一个关键点。如果用户使用的是PyTorch 2.6或更高版本,而模型是用旧版本保存的,可能需要调整。如果用户不想修改代码,降级PyTorch到2.5或更早版本可能解决问题,但需要指导他们如何操作。
总结下来,用户的错误是由于PyTorch版本升级导致的默认安全设置变化,解决方案包括调整加载参数、添加安全全局变量或降级PyTorch。需要根据用户的技术水平选择最合适的建议,并详细说明步骤,同时强调安全注意事项。</think>---
### **错误原因分析**
该错误由 **PyTorch 2.6+ 版本安全限制升级** 引发。关键信息如下:
1. **安全策略变更**:PyTorch 2.6 开始,`torch.load()` 默认启用 `weights_only=True`,禁止加载包含非受信序列化对象(如某些 numpy 函数)的模型文件
2. **模型文件依赖**:`yolov5s-face.pt` 可能包含旧版 PyTorch 生成的依赖项(如 `numpy.core.multiarray._reconstruct`)
---
### **解决方案**
#### 方法一:强制信任模型(推荐)
在 `detect_face.py` 中找到模型加载代码,**添加 `weights_only=False`**:
```python
# 原代码(models/experimental.py 中)
model.append(torch.load(w, map_location=map_location)['model'].float().fuse().eval())
# 修改为
model.append(torch.load(w, map_location=map_location, weights_only=False)['model'].float().fuse().eval())
```
#### 方法二:降级 PyTorch 版本
```bash
pip install torch==2.0.0 # 降级到 PyTorch 2.5 或更低版本
```
#### 方法三:添加安全全局(开发者适用)
在加载模型前声明信任 `numpy` 函数:
```python
import torch.serialization
from numpy.core.multiarray import _reconstruct
with torch.serialization.safe_globals([_reconstruct]):
model = torch.load(weights_path, weights_only=True)
```
---
### **注意事项**
1. **安全警告**:`weights_only=False` 会允许任意代码执行,**仅对可信模型使用**
2. **环境验证**:运行 `pip list | grep torch` 确认当前 PyTorch 版本
3. **模型来源**:确保 `yolov5s-face.pt` 来自官方仓库或可信渠道
---
### **操作示例**
假设选择**方法一**,具体修改步骤:
1. 打开文件 `models/experimental.py`
2. 定位到约第 118 行(原 `torch.load(w, ...)` 处)
3. 添加 `weights_only=False` 参数
4. 保存并重新运行检测命令
---
### **补充说明**
如果仍无法解决,建议:
1. 重新下载官方最新版 YOLOv5-face 模型
2. 检查 CUDA/cuDNN 与 PyTorch 版本兼容性
3. 提交 issue 到 [YOLOv5-face 官方仓库](https://github.com/deepcam-cn/yolov5-face)
阅读全文
相关推荐










