首页 > 解决方案 > 加载自定义模型时 Tensorflow keras 模型到 opencv 错误(C++)

问题描述

我想把这个模型(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'实例后调用终止what():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'中

中止(核心转储)

谁能帮我?

标签: pythonc++tensorflowopencvkeras

解决方案


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

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

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

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

有关如何在 TensorFlow 2 中冻结图的一个很好的示例,请参阅:如何将 Keras 模型保存为冻结图?.


推荐阅读