PyTorch YOLOv5 Flask部署报错DetectMultiBackend无input_details属性
问题根因与修复方案
错误1:AttributeError: 'DetectMultiBackend' object has no attribute 'input_details'
根因
- 训练与部署端YOLOv5版本不匹配:训练
best.pt权重使用的YOLOv5代码版本,与EC2实例上torch.hub.load加载的本地YOLOv5源码版本存在代差。6.0版本后YOLOv5的DetectMultiBackend类新增了input_details属性做输入格式校验,如果部署端用6.0之前版本的代码加载高版本训练的权重,就会触发属性不存在错误。 - 环境依赖冲突:EC2的Python环境中同时安装了PyPI源发布的
ultralytics/yolov5包和本地拉取的YOLOv5源码,导入时优先级混乱,加载了不匹配的后端类逻辑。 force_reload=True参数强制刷新缓存时,会重置本地加载的类定义,容易触发版本校验错位。
修复方案
- 对齐版本:将训练
best.pt时使用的完全同版本YOLOv5源码完整上传到EC2实例,替换当前加载路径下的YOLOv5目录,禁止跨大版本加载权重。 - 清理冲突依赖与缓存:执行以下命令清理环境中不匹配的包和Torch Hub历史缓存,再重新安装对应版本依赖:
pip uninstall -y ultralytics yolov5 rm -rf ~/.cache/torch/hub/* cd <你的本地YOLOv5源码根目录> pip install -r requirements.txt
- 调整模型加载代码:去掉易触发缓存异常的
force_reload=True参数,显式指定正确的源码路径和运行设备,示例:
# 注意路径指向对齐版本的YOLOv5源码根目录,不要指向Flask项目根目录 model = torch.hub.load('./yolov5', 'custom', path='best.pt', source='local', device='cpu') # 有GPU就改成device=0
- 加载后执行
print(model.__class__)校验后端类型,确认是PyTorch对应的DetectMultiBackend实现,没有自动切换到TFLite、OpenCV等不兼容后端。
错误2:PermissionError: [Errno 13] Permission denied: '5555_result.json'
根因
- Flask服务的运行用户对JSON文件的写入目录无操作权限:如果Flask用systemd、Nginx反向代理托管,默认运行用户通常是
www-data、nginx等低权限用户;如果之前用sudo执行过项目脚本,会导致项目目录属主变为root,普通运行用户无写入权限。 - 代码中使用相对路径写文件,Flask运行时的工作目录与预期不符,指向了无权限的系统路径;或目标路径下已存在属主为root的只读同名文件,触发写入拦截。
修复方案
- 确认Flask进程的运行用户:执行
ps aux | grep flask查看进程对应的属主,给项目目录授予对应用户的权限,示例(项目路径为/opt/yolo_flask,运行用户为www-data):
sudo chown -R www-data:www-data /opt/yolo_flask sudo chmod -R 755 /opt/yolo_flask
生产环境禁止给目录设置777全权限,避免安全风险。
- 写文件时改用绝对路径,提前创建固定的结果存储目录,避免相对路径指向异常,代码示例:
import os # 提前定义固定的结果存储绝对路径 RESULT_SAVE_DIR = "/opt/yolo_flask/results" # 目录不存在时自动创建,exist_ok=True避免重复创建报错 os.makedirs(RESULT_SAVE_DIR, exist_ok=True) result_file_path = os.path.join(RESULT_SAVE_DIR, "5555_result.json") # 后续将结果写入result_file_path即可
- 检查目标路径下是否存在残留的只读同名文件,若存在直接删除或修改文件权限后再运行服务。
内容的提问来源于stack exchange,提问作者Amit Yadav
相关产品推荐
相关产品推荐

