使用 OpenCV 3.4 加载 CNN tensorflow 模型时出错

     2023-02-22     35

关键词:

【中文标题】使用 OpenCV 3.4 加载 CNN tensorflow 模型时出错【英文标题】:Error while loading CNN tensorflow model with OpenCV 3.4 【发布时间】:2019-03-12 14:08:54 【问题描述】:

我目前正在尝试使用 OpenCV 加载类似 tensorflow 的 U-net 模型。该模型是使用 Tensorflow 1.12.0 使用 Python 3.6.8 创建、训练和冻结的,我正在尝试使用 C++ 中的 OpenCV (3.4.2) 加载它(现在我正在测试在 Python 中使用 OpenCV 加载模型类似于我将在 C++ 中执行的操作)。

我正在使用 U-net 的这个 (https://github.com/jakeret/tf_unet) 实现。我的训练模型图如下所示:

Full model graph

在我拥有一个训练有素的模型后,我使用以下代码将其冻结:

import tensorflow as tf
import numpy as np
from tensorflow.python.tools import freeze_graph

# Freeze the graph
save_path=".../Unet/unet_trained/run_016/" #directory to model files
input_graph_path = save_path+'graph.pbtxt'#complete path to the input graph
checkpoint_path = save_path+'model_epoch99.ckpt' #complete path to the model's checkpoint file
input_saver_def_path = ""
input_binary = False
output_node_names = "output_map/output" #output node's name
restore_op_name = "save/restore_all"
filename_tensor_name = "save/Const:0"
output_frozen_graph_name = save_path+'frozen_model_.pb' # the name of .pb file you would like to give
clear_devices = False

freeze_graph.freeze_graph(input_graph_path, input_saver_def_path,
                      input_binary, checkpoint_path, output_node_names,
                      restore_op_name, filename_tensor_name,
                      output_frozen_graph_name, clear_devices, "")

下一步我要在终端上运行以下命令:

python3 strip_unused.py --input_graph frozen_model_run16.pb 
    --output_graph strip_model_run16.pb --input_node_names x
    --output_node_names output_map/output --input_binary True --output_binary True

python3 optimize_for_inference.py --input strip_model_run16.pb 
    --output optimized_model_run16.pb --frozen_graph True --input_names x
    --output_names output_map/output

(可选)最后,为了在 tensorboard 中可视化图形,我运行:

python3 import_pb_to_tensorboa.py --model_dir optimized_model_run16.pb
    --log_dir unet_trained/frozenmodel/

优化后的模型图如下:

Optimized model graph

Preprocessing block

DownConvolution block

UpConvolution block

在这一切之后,我尝试通过以下方式使用 OpenCV 加载此模型:

import cv2
tensorflowNet = cv2.dnn.readNetFromTensorflow("/path/to/model/frozenmodel/
    optimized_model_run16.pb")

但是我得到了这个错误

cv2.error: OpenCV(3.4.2) /io/opencv/modules/dnn/src/tensorflow/tf_importer.cpp:520: error: (-2:Unspecified error) More than one input is Const op in function 'getConstBlob'

我找不到解决方案或解释来解决它。

提前感谢您的帮助!

编辑:

如果我以这种方式加载模型(添加 .pbtxt 文件)

tensorflowNet = cv2.dnn.readNetFromTensorflow("/home/dev/optimized_model_run16.pb", "/home/dev/graph.pbtxt")

我得到一个不同的错误:

cv2.error: OpenCV(3.4.2) /io/opencv/modules/dnn/src/tensorflow/tf_importer.cpp:613: error: (-215:Assertion failed) const_layers.insert(std::make_pair(name, li)).second in function 'addConstNodes'

【问题讨论】:

预处理块有问题。在 optimize_for_inference.py 之后它必须是线性的 有什么问题?你能详细一点吗? @Nuzny 我猜你正在传递一个layer,而你应该传递一个tensor 我只是尝试在没有预处理块的情况下在 OpenCV 中加载模型(我使用 numpy 创建批处理数组并将其提供给第一个卷积块)并且错误仍然存​​在@SusmitAgrawal 【参考方案1】:

问题与在 deconv2d 块 See picture 中使用 tf.shape 和 tf.stack 有关(可能是由于 strided_slice 操作)。 我可以使用这个模型对 tensorflow 进行训练和推理

但是,为了成功在 OpenCV 中加载它,我不得不删除这些操作,因为它们尚不受支持 See picture。如图所示,我手动创建了 deconv_output_size 张量(之前由 tf.stack 创建)。这样,张量是恒定的,不会像以前那样在张量流图中动态创建。

我还通过在 tensorflow 之外使用 numpy 执行相同的操作来摆脱预处理块。

我希望这对某人有所帮助。

干杯!

【讨论】:

OpenCV 3.4 / c++ CascadeClassifier 使用旧的 xml 文件

】OpenCV3.4/c++CascadeClassifier使用旧的xml文件【英文标题】:OpenCV3.4/c++CascadeClassifieruseoldxmlfile【发布时间】:2018-06-2204:39:05【问题描述】:我有OpenCV3.4,我正在使用c++在Linux计算机上进行开发。我正在做一些人脸识别的工作,并想使... 查看详情

如何使用 JSON 数据数组加载 extjs 3.4 存储

】如何使用JSON数据数组加载extjs3.4存储【英文标题】:Howtoloadextjs3.4storewithJSONdataarray【发布时间】:2014-07-2315:14:04【问题描述】:我是extjs的新手,遇到了一些问题。我有一个JSON存储,它从AJAX请求中获取我的示例数据来填充组... 查看详情

如何将基于自定义图像的数据集加载到 Pytorch 中以与 CNN 一起使用?

...何将基于自定义图像的数据集加载到Pytorch中以与CNN一起使用?【英文标题】:HowdoIloadcustomimagebaseddatasetsintoPytorchforusewithaCNN?【发布时间】:2019-01-0517:15:46【问题描述】:我已经在互联网上搜索了几个小时,以找到解决我问题的... 查看详情

Python 3.4 加载数据目录

...且遇到了问题。关于加载函数,即使我用正确的txt文件名使用这个函数,也会出现错误。results=[]withopen(\'text.txt\')asinputfile:forlineininputfile:r 查看详情

基于tensorflow+opencv实现cnn自定义图像分类

摘要:本篇文章主要通过Tensorflow+Opencv实现CNN自定义图像分类案例,它能解决我们现实论文或实践中的图像分类问题,并与机器学习的图像分类算法进行对比实验。本文分享自华为云社区《​​Tensorflow+Opencv实现CNN自定义图像分... 查看详情

ExtJS 3.4 - 设置加载

...【发布时间】:2012-04-2419:06:08【问题描述】:我现在正在使用ExtJS3,我真的很怀念ExtJS4中的setLoading函数。仔细查看文档,没有找到。如何在ExtJS3.4中设置/删除任何组件的加载状态?【问题讨论】:你应该直接问你的问题,而不... 查看详情

ExtJS 3.4 中未加载数据

...】:2016-06-2808:57:45【问题描述】:我是extjs的新手,正在使用ExtJS3.2。因为我的数据没有加载,但如果评论数据列正在显示,任何人都可以帮助我。我的代码是xtype:\'panel\',title:"SearchResult",items:[xtype:\'grid\',store:newExt.data. 查看详情

什么是 OpenCV 的最佳卷积神经网络 (CNN) 库? (带有简单的实现和示例)

】什么是OpenCV的最佳卷积神经网络(CNN)库?(带有简单的实现和示例)【英文标题】:Whatisthebestconvolutionalneuralnetworks(CNN)libraryforOpenCV?(withsimpleimplementationandexample)【发布时间】:2016-12-0705:25:35【问题描述】:OpenCV的最佳卷积神经... 查看详情

使用带有 CNN 的 LibSVM 文件的 Deeplearning4j 困难

】使用带有CNN的LibSVM文件的Deeplearning4j困难【英文标题】:Deeplearning4jdifficultyusingLibSVMfileswithCNNs【发布时间】:2018-07-0317:35:39【问题描述】:我正在使用LibSVM记录读取器将稀疏数据加载到神经网络中。这在使用MLP模型时效果很好... 查看详情

基于tensorflow+opencv实现cnn自定义图像分类(代码片段)

摘要:本篇文章主要通过Tensorflow+Opencv实现CNN自定义图像分类案例,它能解决我们现实论文或实践中的图像分类问题,并与机器学习的图像分类算法进行对比实验。本文分享自华为云社区《Tensorflow+Opencv实现CNN自... 查看详情

opencv+cnn大神符识别(代码片段)

数据集Mnist数据集:http://yann.lecun.com/exdb/mnist/ 训练1importnumpyasnp2fromkeras.datasetsimportmnist3fromkeras.modelsimportSequential4fromkeras.layersimportDense,Activation,Conv2D,MaxPooling2D,Flatten, 查看详情

使用 OpenCV 为 OpenGL 加载纹理

】使用OpenCV为OpenGL加载纹理【英文标题】:LoadingtextureforOpenGLwithOpenCV【发布时间】:2012-02-0308:57:14【问题描述】:我已经看到许多用于为OpenGL加载纹理的代码示例,其中许多示例有点难以理解或需要包含大量代码的新函数。我在... 查看详情

Extjs 3.4 ComboBox:首次加载组合框时如何预选一条记录?

...oaded?【发布时间】:2013-09-1914:31:35【问题描述】:我正在使用Extjs3.4。我需要像这样设置一个预先输入的组合框:组合框使用JsonStore,当组合框首次加载到页面上时,我需要预选一个值。稍后,用户可以将 查看详情

mac使用brew安装低版本的软件,如opencv

由于Mac中使用homebrew安装的库都是最新的,有时需要老版本的软件,就很难办。在工作中想用opencv3.3,但是使用brew安装的都是3.4,后来查到个方法,就是指定需要安装的opencv.rb文件使用brewinfoopencv可以看到:(最新的是3.4,我安... 查看详情

在触发单击 Extjs 3.4 时重新加载 ComboBox 存储

...述】:我是js和ExtJS3.4的初学者,我正在尝试在Ext.window中使用Ext.form.ComboBox来显示js对象(层)的列表。问题是当我第一次创建窗口并单击combobox触发器时,我得到了正确的图层列表,但是 查看详情

深度学习r-cnn网络基础

...型训练3.3模型预测3.4模型总结4总结1Overfeat模型Overfeat方法使用滑动窗 查看详情

Python OpenCV RTrees 无法正确加载

...rly【发布时间】:2019-04-1009:21:55【问题描述】:我有一个使用OpenCV3.3.1版的训练有素的RTrees模型,我已保存该模型,需要稍后加载以进行预测。我正在尝试使用OpenCV的RTrees创建一个随机森林分类器。但是,我无法成功加载使用save... 查看详情

ubuntuqt5opencv3.4项目配置(代码片段)

#-------------------------------------------------##ProjectcreatedbyQtCreator2019-03-25T14:14:38##-------------------------------------------------QT+=coreguiQT+=networkgreaterThan(QT_MAJOR_VERSION,4) 查看详情