(yolov5face) book@wyc_emb:~/rk3566/ai_tools/FaceRecognition-master$ python3 detect.py Namespace(weights='weights/last.pt', source='C:/Users/lieweiai/Desktop/26321934-1-192.mp4', output='../inference/output', img_size=640, conf_thres=0.3, iou_thres=0.5, fourcc='mp4v', device='', view_img=False, save_txt=False, classes=None, agnostic_nms=False, augment=False) Using CPU Traceback (most recent call last): File "/home/book/rk3566/ai_tools/FaceRecognition-master/detect.py", line 163, in <module> print(detect()) File "/home/book/rk3566/ai_tools/FaceRecognition-master/detect.py", line 25, in detect model = torch.load(weights, map_location=device)['model'].float() # load to FP32 File "/home/book/anaconda3/envs/yolov5face/lib/python3.9/site-packages/torch/serialization.py", line 1494, 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-08 13:21:10 浏览: 4
<think>好的,我现在需要帮用户解决他们在运行YOLOv5Face的detect.py时遇到的错误。用户提供的错误信息显示在加载模型权重时出现了_pickle.UnpicklingError,提到了关于weights_only参数的问题,以及需要信任来源的建议。
首先,我需要回忆一下PyTorch中torch.load函数的行为变化。根据错误信息,PyTorch 2.6之后默认将weights_only设为True,这意味着在加载模型时,只允许加载包含张量和简单类型的文件,而不允许执行任意代码。如果用户的模型文件是在旧版本的PyTorch中保存的,或者使用了自定义的类或函数,可能会导致这个问题。
接下来,用户使用的是YOLOv5Face的detect.py脚本,错误发生在加载权重文件的这一步。用户可能尝试加载的权重文件是使用旧版PyTorch保存的,或者权重文件本身包含了不被允许的全局变量,如numpy的_reconstruct函数。这种情况下,当使用weights_only=True时,加载会失败,因为PyTorch的安全机制阻止了潜在的不安全代码执行。
我需要考虑可能的解决方案。根据错误提示,有两种方法:一是将weights_only设为False,但需要用户信任权重文件的来源;二是修改加载方式,使用更安全的上下文管理器来允许特定的全局变量。不过,第二种方法可能比较复杂,尤其是对于普通用户来说,可能不太容易操作。
另外,用户可能使用的PyTorch版本较新(>=2.6),而原来的代码可能没有考虑到这个变化。因此,修改detect.py中的模型加载代码,显式设置weights_only=False可能是一个直接的解决办法。但需要提醒用户,这样做存在安全风险,必须确保权重文件来自可信来源。
此外,用户可能没有正确安装YOLOv5Face的依赖库,或者使用的权重文件格式不正确。例如,YOLOv5Face可能需要特定的权重格式,如.pt文件,而用户提供的文件可能不兼容。需要检查用户使用的权重路径是否正确,文件是否存在,以及是否适用于当前版本的代码。
另一个可能性是用户的环境配置问题,例如CUDA版本与PyTorch不兼容,或者缺少必要的依赖库。不过,根据错误信息显示用户正在使用CPU(Using CPU),可能未正确配置GPU环境,但这可能与当前错误无关,但可能需要后续检查。
综合以上分析,首先建议用户修改模型加载的代码,添加weights_only=False参数。同时,提醒用户注意安全风险,并检查权重文件的来源。如果用户使用的是YOLOv5Face的官方权重,可以认为是可信的,因此修改参数是可行的。此外,建议用户降级PyTorch版本到2.6以下,但这可能不是最佳选择,因为升级库版本可能带来其他好处。
另外,用户可能需要检查他们的detect.py脚本是否与YOLOv5Face的最新版本兼容,或者是否有社区提供的修复方案。例如,YOLOv5Face的GitHub仓库中可能已经有相关的issue讨论这个问题,用户可以参考解决方案。
最后,如果用户仍然无法解决问题,可能需要更详细的调试,例如打印出权重文件的路径是否正确,文件是否损坏,或者尝试加载其他权重文件来排除问题。</think>你在运行YOLov5Face时遇到的错误是由于PyTorch版本兼容性问题导致的模型加载失败。以下是逐步解决方案:
---
### **错误原因分析**
- **核心问题**:PyTorch 2.6+ 默认启用`weights_only=True`的安全检查,但你的权重文件包含非安全对象(如`numpy`的`_reconstruct`方法)
- **直接触发点**:代码中使用`torch.load()`加载模型时未显式设置`weights_only=False`
---
### **解决方案一:修改加载方式(推荐)**
修改`detect.py`中模型加载代码,**显式允许加载非安全对象**:
1. 定位到`detect.py`中的模型加载代码(约第25行):
```python
model = torch.load(weights, map_location=device)['model'].float()
```
2. 修改为以下两种形式之一:
**方式1**(直接关闭安全限制,需信任权重来源):
```python
model = torch.load(weights, map_location=device, weights_only=False)['model'].float()
```
**方式2**(精确添加允许的全局变量):
```python
from torch.serialization import add_safe_globals
add_safe_globals([np.core.multiarray._reconstruct]) # 需先导入numpy as np
with torch.serialization.safe_globals_context():
model = torch.load(weights, map_location=device)['model'].float()
```
---
### **解决方案二:降级PyTorch版本**
若不想修改代码,可回退到PyTorch < 2.6版本:
```bash
pip install torch==2.0.1 torchvision==0.15.2 --extra-index-url https://download.pytorch.org/whl/cpu
```
---
### **解决方案三:使用YOLOv5Face官方推荐方法**
YOLOv5Face项目可能已有适配更新,尝试以下步骤:
1. 更新仓库代码:
```bash
git pull origin master
```
2. 使用官方模型加载接口(如果存在):
```python
from models.experimental import attempt_load
model = attempt_load(weights, map_location=device) # 更安全的加载方式
```
---
### **附加检查项**
| 检查点 | 操作指南 |
|----------------------|-----------------------------------|
| **权重文件完整性** | 检查`weights/last.pt`是否完整下载 |
| **路径有效性** | 确认路径`C:/Users/.../26321934-1-192.mp4`在Linux下存在(注意Windows路径在Linux中需改为`/mnt/c/Users/...`) |
| **CUDA可用性** | 若需GPU加速,安装CUDA版PyTorch |
---
### **完整修复示例**
以**解决方案一(方式1)**为例:
```python
# detect.py修改后的关键代码段
def detect():
# ...
device = select_device(opt.device)
# 修改此行加载代码
model = torch.load(opt.weights, map_location=device, weights_only=False)['model'].float().fuse().eval()
# ...
```
---
### **关键注意事项**
1. **安全警告**:`weights_only=False`会允许任意代码执行,**务必确保权重文件来源可信**
2. **环境一致性**:建议使用项目要求的Python和PyTorch版本(查看项目`requirements.txt`)
3. **视频路径问题**:Linux系统无法直接访问Windows路径`C:/Users/...`,需挂载磁盘或移动文件到Linux目录
通过上述任一方案应能解决你的加载错误。建议优先尝试**解决方案一(方式1)**,这是对现有代码最小的改动。
阅读全文
相关推荐















