OpenCV 4.5.0 DNN加载ONNX推理报shape断言失败问题及解决
OpenCV DNN加载ONNX模型C++接口推理报错问题
问题现象
我尝试使用OpenCV DNN框架加载ONNX格式模型执行推理,在C++环境中运行如下代码时出现错误:
auto path = "path to the a RGB image..."; constexpr char TEST_DEFAULT_ONNX_FILENAME_[] = "unet_h256_w320.onnx"; int width = 320; int height = 256; std::filesystem::path _model = "path to the onnx file..." cv::Mat cpu_img = cv::imread(path); cv::resize(cpu_img, cpu_img, cv::Size(320, 256)); cv::cvtColor(cpu_img, cpu_img, CV_BGR2RGB); cpu_img.convertTo(cpu_img, CV_32F); cv::Mat blob; float scale = 1.0; blob = cv::dnn::blobFromImage(cpu_img, scale, cv::Size(width, height), cv::Scalar(), false); int backendId = 0; int targetId = 0; cv::dnn::Net net = cv::dnn::readNetFromONNX(_model.string()); net.setPreferableBackend(backendId); net.setPreferableTarget(targetId); net.setInput(blob, "input"); net.forward(net.getUnconnectedOutLayersNames();
运行后抛出如下错误:
OpenCV(4.5.0) Error: Assertion failed (start <= (int)shape.size() && end <= (int)shape.size() && start <= end) in cv::dnn::dnn4_v20200908::total, file F:\Projects\opencv-python\opencv\modules\dnn\include\opencv2/dnn/shape_utils.hpp, line 171
该问题的异常点在于:使用几乎完全一致的处理逻辑,通过OpenCV Python接口加载同一个ONNX模型执行推理时可正常运行,无任何报错,对应Python代码如下:
opencv_net = cv2.dnn.readNetFromONNX("path to the same onnx file...") x = np.random.randn(3,256,320).astype(np.float32) input_blob = cv2.dnn.blobFromImage(image=x) opencv_net.setInput(input_blob) opencv_net.forward()
解决方案
将OpenCV版本从4.5.0升级至4.5.4及以上最新版本即可修复该问题,暂未定位到版本更新日志中具体哪项变更修复了该缺陷。
内容的提问来源于stack exchange,提问作者Nir Yakobovits
相关产品推荐
相关产品推荐

