问题是什么:

如图,对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的解决过程【独家发布】相关推荐

  1. 对于在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"解 ...

  2. 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 ...

  3. mysql出现2058,连接MySQL报“Error No.2058 Plugin caching_sha2_password could not be loaded”错误的解决办法...

    点击数:312 原因: MySQL新版默认使用caching_sha2_password作为身份验证插件,而旧版是使用mysql_native_password 当连接MySQL时报错"pl ...

  4. python deepcopy报错_python 字典对象赋值之deepcopy遭遇的问题及解决过程(lxml惹的祸)...

    今天在写一段代码的时候,需要对字典进行传值操作. 一般情况下字典a = 字典b,意味着是传引用,b发送改变的情况下a也会发生改变. 我的字典如下 a={'testcase': {'attributes ...

  5. cv2.dnn读取模型报错

    cv2.dnn读取模型报错 D:\ProgramData\Miniconda3\python.exe D:/project/detect/face/yolov5-face-landmarks-open ...

  6. 【前端篇】火狐浏览器打开调试器,报“Error: Incorrect contents fetched, please reload.”

    打开火狐浏览器的调试器,报"Error: Incorrect contents fetched, please reload.",无法正常使用.解决方法: 1.打开浏览器的f12, ...

  7. Error occured processing XML 'Cannot find class [springmvc.extention.BeanArgumentResolver]'.

    <Description Resource Path Location Type Error occured processing XML 'Cannot find class [springm ...

  8. Error occured processing XML 'Cannot find class [springmvc.extention.BeanArgumentResolver]

    在搭建SMM框架时出现出现的错误,修改了一天,问题才解决 在spring-mvc 配置文件中添加注解的时候出现错误Description Resource Path Location Type Err ...

  9. 解决报错 Error in processing command line: Don‘t understand command line argument “-cl-no-subgroup-ifp“

    调用openpose进行姿势检测,发现报错(虽然报错但能继续运行,输出检测结果) OpenCV(ocl4dnn): consider to specify kernel configuration c ...

最新文章

  1. 如何制定一份永远完不成的年度计划?
  2. 青龙羊毛——广汽三菱(搬运)
  3. xor eax,eax
  4. linux 文件删除恢复
  5. Redis进阶-细说分布式锁
  6. Android Fragments 详细使用
  7. LeetCode 250. Count Univalue Subtrees
  8. 《剑指offer》链表中倒数第k个结点
  9. Web前端工作笔记007---h5 canvas_雨滴头像合成_图像合成_合成雨滴头像
  10. PNP与NPN传感器的区别
  11. 【GitChat】精选——个人开发者如何通过人工智能盈利?
  12. python 列表解析式
  13. 大数据BI工具Tableau学习【第一期】:Tableau简介和安装
  14. 【夜读】丰富自己的4个习惯,请逼自己养成
  15. 【UE】BUILD ERROR: Missing precompiled manifest for ‘****‘.
  16. 深度学习笔记-----YOLOV4框架结构大讲解
  17. C. Product of Three Numbers
  18. SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?
  19. 机器学习基本算法总结
  20. 哪个语言可以最方便快捷得实现自动拨打电话并隐藏号码?

热门文章

  1. 淘宝商品优化多少分合格?店铺品质分如何优化?
  2. Java实习生第一天及未来规划
  3. 最新简约轻型在线聊天室留言PHP源码+可当客服
  4. Axure作品欣赏:头条类资讯APP发布模块原型 (高交互)
  5. VB中面向对象及其属性方法与事件
  6. 京东架构师“强娃”对CloudFoundry的架构优化
  7. 通用计算机一体机,电脑一体机不会选?这两个牌子做的最好
  8. 让你爱不释手的5款电脑软件
  9. 杭州电子商务研究院发布LTD实例起源及其应用方向
  10. zhangchanggong001