关于cv2.dnn.readNetFromONNX(path)就报ERROR during processing node with 3 inputs and 1 outputs的解决过程【独家发布】
问题是什么:
如图,对vgg16使用opencv的dnn模块进行推理时出现错误。
错误的详细日志为:[ERROR:0@0.804] global D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\onnx\onnx_importer.cpp (1021) cv::dnn::dnn4_v20220524::ONNXImporter::handleNode DNN/ONNX: ERROR during processing node with 3 inputs and 1 outputs: [Conv]:(onnx_node!StatefulPartitionedCall/vgg16/conv_bn_two_relu_pool1/conv_bn_one_relu/conv2d/Conv2D) from domain='ai.onnx'
Traceback (most recent call last):File "D:/DLAI/qwenAILearn/StudyDNN/trainOnnx/test2.py", line 6, in <module>net = cv2.dnn.readNetFromONNX(path) # 加载训练好的识别模型
cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\onnx\onnx_importer.cpp:1040: error: (-2:Unspecified error) in function 'cv::dnn::dnn4_v20220524::ONNXImporter::handleNode'
> Node [Conv@ai.onnx]:(onnx_node!StatefulPartitionedCall/vgg16/conv_bn_two_relu_pool1/conv_bn_one_relu/conv2d/Conv2D) parse error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\layers\convolution_layer.cpp:405: error: (-2:Unspecified error) Number of input channels should be multiple of 3 but got 0 in function 'cv::dnn::ConvolutionLayerImpl::getMemoryShapes'
>
错误的关键字是Number of input channels should be multiple of 3 but got 0 in function,通过搜索会发现大量文章,比如这一遍https://github.com/opencv/opencv/issues/20866 并没有给出解决方案
还有这一篇,给出了解决方案 DNN/ONNX: outputs registration regression, feature request for new version of Clip operator · Issue #21698 · opencv/opencv · GitHub reshape一下维度,但是这个解决方案,是解决在net.setInput时出的问题,而本问题是在cv2.dnn.readNetFromONNX(path)就出现加载不了的问题,其实质是不一样的。
其实网上搜索了很多,都没有给出解决方案。
那么为什么要会出现这个问题呢,这其实跟自已实现CNN的方法有一点关系,如下图这样来实现转换成onnx时就没有问题.
训练后转换成onnx
path = "D:\\DLAI\\qwenAILearn\\StudyDNN\\TrainExample\\weights\\"
command = """python -m tf2onnx.convert --saved-model "{}vgg16" --opset 12 --output {}vgg16.onnx """.format(path,path)
os.system(command)
使用opencv预测
然后我换了一种实现方式,对conv进行了一些封装,如下代码:
按上面的方法转换成vgg16_model.onnx,然后使用相同的推理代码去预测就会出现
onnx_importer.cpp (1021) cv::dnn::dnn4_v20220524::ONNXImporter::handleNode DNN/ONNX: ERROR during processing node with 3 inputs and 1 outputs 的错误。
因为我有相同的模型,不同推理出现不同结果的问题,所以我们可以使用Netron进行查看两个模型的不同点,如图:
从上图可以看到能够进行推理的是左边的,有一个维度是unk_80,224,224,3,而右边不行的是unk_259,unk_260,unk_261,unk_262。结合上面的提示,猜应该是输入维度的问题。
经查询资料可知,opencv dnn并不支持动态尺寸输入,参考:https://github.com/opencv/opencv/issues/19347
所以,我们的解决办法,就是想办法将onnx转换成指定的input_size,这个时候通过查询获知以下链接 Make dynamic input shape fixed - onnxruntime 给出了转换的命令,指定输入的维度
python -m onnxruntime.tools.make_dynamic_shape_fixed --input_name "input_1" --input_shape 1,224,224,3 "D:\DLAI\qwenAILearn\StudyDNN\TrainExample\weights\vgg16_model_3.onnx" "D:\DLAI\qwenAILearn\StudyDNN\TrainExample\weights\vgg16_model_3_back.onnx"
转换后的onnx内容如下。
转换后使用以下脚本来运行
会发现输出的结果是[[0. 0. 0. 1. 0.]]是不正确的,但是这个时候已经不报cv::dnn::dnn4_v20220524::ONNXImporter::handleNode DNN/ONNX: ERROR during processing node with 3 inputs and 1 outputs 错误了。修改上面的问题,只需要加上归一化即可。
如上,预测正确。
综上,当opencv在读onnx时cv2.dnn.readNetFromONNX(path)就报convolution_layer.cpp RROR during processing node with 3 inputs and 1 outputs 错误的时候,只需要使用onnxruntime.tools.make_dynamic_shape_fixed --input_name "input_1" --input_shape 1,224,224,3 改为指定尺寸输入即可解决。
关于cv2.dnn.readNetFromONNX(path)就报ERROR during processing node with 3 inputs and 1 outputs的解决过程【独家发布】相关推荐
- 对于在git上面拉代码报“error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054“解决方法
对于在git上面拉代码报"error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054"解 ...
- vue:关于vue服务启动num run serve报Error: Missing binding Node Sass could not find 问题
报错日志为: Error: Missing binding ...\node_modules\node-sass\vendor\win32-x64-83\binding.node Node Sass ...
- mysql出现2058,连接MySQL报“Error No.2058 Plugin caching_sha2_password could not be loaded”错误的解决办法...
点击数:312 原因: MySQL新版默认使用caching_sha2_password作为身份验证插件,而旧版是使用mysql_native_password 当连接MySQL时报错"pl ...
- python deepcopy报错_python 字典对象赋值之deepcopy遭遇的问题及解决过程(lxml惹的祸)...
今天在写一段代码的时候,需要对字典进行传值操作. 一般情况下字典a = 字典b,意味着是传引用,b发送改变的情况下a也会发生改变. 我的字典如下 a={'testcase': {'attributes ...
- cv2.dnn读取模型报错
cv2.dnn读取模型报错 D:\ProgramData\Miniconda3\python.exe D:/project/detect/face/yolov5-face-landmarks-open ...
- 【前端篇】火狐浏览器打开调试器,报“Error: Incorrect contents fetched, please reload.”
打开火狐浏览器的调试器,报"Error: Incorrect contents fetched, please reload.",无法正常使用.解决方法: 1.打开浏览器的f12, ...
- Error occured processing XML 'Cannot find class [springmvc.extention.BeanArgumentResolver]'.
<Description Resource Path Location Type Error occured processing XML 'Cannot find class [springm ...
- Error occured processing XML 'Cannot find class [springmvc.extention.BeanArgumentResolver]
在搭建SMM框架时出现出现的错误,修改了一天,问题才解决 在spring-mvc 配置文件中添加注解的时候出现错误Description Resource Path Location Type Err ...
- 解决报错 Error in processing command line: Don‘t understand command line argument “-cl-no-subgroup-ifp“
调用openpose进行姿势检测,发现报错(虽然报错但能继续运行,输出检测结果) OpenCV(ocl4dnn): consider to specify kernel configuration c ...
最新文章
- 如何制定一份永远完不成的年度计划?
- 青龙羊毛——广汽三菱(搬运)
- xor eax,eax
- linux 文件删除恢复
- Redis进阶-细说分布式锁
- Android Fragments 详细使用
- LeetCode 250. Count Univalue Subtrees
- 《剑指offer》链表中倒数第k个结点
- Web前端工作笔记007---h5 canvas_雨滴头像合成_图像合成_合成雨滴头像
- PNP与NPN传感器的区别
- 【GitChat】精选——个人开发者如何通过人工智能盈利?
- python 列表解析式
- 大数据BI工具Tableau学习【第一期】:Tableau简介和安装
- 【夜读】丰富自己的4个习惯,请逼自己养成
- 【UE】BUILD ERROR: Missing precompiled manifest for ‘****‘.
- 深度学习笔记-----YOLOV4框架结构大讲解
- C. Product of Three Numbers
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?
- 机器学习基本算法总结
- 哪个语言可以最方便快捷得实现自动拨打电话并隐藏号码?