加载自定义模型时 Tensorflow keras 模型到 opencv 错误(C++)

Posted

技术标签:

【中文标题】加载自定义模型时 Tensorflow keras 模型到 opencv 错误(C++)【英文标题】:Tensorflow keras model to opencv error when loading custom model (C++) 【发布时间】:2020-07-29 16:21:47 【问题描述】:

我想把这个模型 (https://www.pyimagesearch.com/2020/05/04/covid-19-face-mask-detector-with-opencv-keras-tensorflow-and-deep-learning/) 在 C++ 代码中工作,该模型是使用 keras 和 H5 编写的,所以我搜索并发现我需要先将我的 h5 模型转换为 pb 模型,因为opencv 不支持 h5。

按照本指南 (https://www.youtube.com/watch?v=2UgqCwVfdJY) 我可以做到,现在我有一个 prototxt 文件和一个 pb 文件

所以我只需要进入我的代码并编写:

'''cv::dnn::Net mask_net = cv::dnn::readNetFromTensorflow("output_graph.pb","proto_file.prototxt");

对吗?但不起作用...我尝试了其他模型,例如 sddmobilinet2 并且效果很好,但是使用此自定义模型,它不起作用

我有这个日志:

在抛出 'cv::Exception' 实例后调用终止 什么():OpenCV(4.4.0-pre)/home/luiz/Libraries/CPP/opencv/modules/dnn/src/tensorflow/tf_graph_simplifier.cpp:1016:错误:(-215:断言失败)permIds.size( ) == net.node_size() 在函数'sortByExecutionOrder'中

中止(核心转储)

谁能帮帮我?

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,并设法通过仅使用冻结的 .pb 文件来解决它。 OpenCV 在文档中只给出了模型 + 配置函数声明:

cv::dnn::readNetFromTensorflow  (const String & model, const String & config = String())    

但是只有模型的也可以用:

cv::dnn::readNetFromTensorflow  (const String & model)  

有关如何在 TensorFlow 2 中冻结图形的一个很好的示例,请参阅:How to save Keras model as frozen graph?。

【讨论】:

cv::dnn::Net inputNet; inputNet = cv::dnn::readNet("/home/tf/Projects/TF24/as/frozen_graph_210729_42.pb");我收到以下错误:在抛出'cv :: Exception'实例后调用终止what():OpenCV(4.1.0)/home/tf/Downloads/opencv-4.1.0/modules/dnn/src/tensorflow /tf_graph_simplifier.cpp:860: 错误: (-215:Assertion failed) nodesMapIt != nodesMap.end() in function 'sortByExecutionOrder' Aborted (core dumped)

以上是关于加载自定义模型时 Tensorflow keras 模型到 opencv 错误(C++)的主要内容,如果未能解决你的问题,请参考以下文章

如何为 keras 模型使用 tensorflow 自定义损失?

如何将保存的模型转换或加载到 TensorFlow 或 Keras?

如何使用自定义损失函数加载 Keras 模型?

如何使用自定义优化器加载 keras 保存的模型

如何在具有使用@tf.keras.utils.register_keras_serializable 注册的自定义函数的 Tensorflow Serving 中提供模型?

tensorflow2.0高阶api--主要为tf.keras.models提供的模型的类接口