使用cv2.dnn_superres调用EDSR_x4超分辨图片时upsample报错
解决OpenCV DNN超分辨率Winograd断言错误问题
问题重现
使用预训练EDSR_x4模型进行图片超分辨率放大时触发以下错误:
error: OpenCV(4.7.0) /Users/runner/work/opencv-python/opencv-python/opencv/modules/dnn/src/layers/fast_convolution/winograd_3x3s1_f63.cpp:147: error: (-215:Assertion failed) _FX_WINO_IBLOCK == 3 && _FX_WINO_KBLOCK == 4 in function '_fx_winograd_accum_f32'
代码半年前可正常运行,当前环境为macOS 13.1 M1芯片、Python 3.9.12,已更新opencv-python和opencv-contrib-python至最新版本,图片路径无误可正常加载。
解决方案
1. 降级OpenCV版本到4.6.x
OpenCV 4.7.x在Apple Silicon平台的Winograd卷积实现存在兼容性bug,降级到之前的稳定版本可解决问题:
pip uninstall opencv-python opencv-contrib-python pip install opencv-python==4.6.0.66 opencv-contrib-python==4.6.0.66
2. 强制使用CPU后端绕开Winograd优化
在加载模型后添加代码,禁用可能引发问题的硬件加速后端:
import cv2 import os # load EDSR model sr = cv2.dnn_superres.DnnSuperResImpl_create() path = "EDSR_x4.pb" sr.readModel(path) sr.setModel("edsr",4) # 添加以下两行代码,强制使用CPU后端 sr.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV) sr.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU) # set path img = cv2.imread(r'test.jpg') # upscale result = sr.upsample(img) cv2.imwrite("test1.jpg",result)
3. 验证模型文件完整性
重新获取官方EDSR_x4预训练模型,确保文件未损坏或不完整。
内容的提问来源于stack exchange,提问作者April
相关产品推荐
相关产品推荐

