使用 OpenCV readNetFromTensorFlow 运行 Keras DNN 模型(UNet):错误:操作解码器_stage0_upsampling/Shape 中的未知层类型形状

Posted

技术标签:

【中文标题】使用 OpenCV readNetFromTensorFlow 运行 Keras DNN 模型(UNet):错误:操作解码器_stage0_upsampling/Shape 中的未知层类型形状【英文标题】:Running Keras DNN model (UNet) using OpenCV readNetFromTensorFlow: Error: Unknown layer type Shape in op decoder_stage0_upsampling/Shape 【发布时间】:2020-09-07 04:14:43 【问题描述】:

Python 3.7 版

Keras 2.3.1 版

TensorFlow 版本 1.14.0

我想在 C++ 中使用 OpenCV 的 readNetFromTensorflow 运行我的 UNet Keras 模型。根据这个问题,我已成功地将我的 HDF5 文件转换为 .pb: How we can convert keras model .h5 file to tensorflow saved model (.pb)

但是,当我尝试运行命令时(首先在 python 中以便于测试):

net = cv.dnn.readNetFromTensorflow('tensorflow/my_model.pb')

我收到失败消息:

error: (-2) Unknown layer type Shape in op decoder_stage0_upsampling/Shape in function cv::dnn::experimental_dnn_v2::`anonymous-namespace'::TFImporter::populateNet

是否有使用 OpenCV 的解决方法?或者在这种情况下最好使用 Tensorflows C++ API。

【问题讨论】:

【参考方案1】:

我已经解决了我的问题,并将在此处添加我的解决方案,供其他希望在自己的 UNet 上使用 OpenCV 执行推理的人使用。

第 1 步: 如我上述问题所述,将 H5/HDF5 文件转换为 .pb。

第 2 步: OpenCV 必须升级到 4.2.0(不确定我的解决方案是否在 3.3.1 [我的起始 OpenCV 版本] 和 4.2.0 之间的任何其他版本中受支持)

第 3 步: 按照我的问题中的代码所述加载您的网络,这应该是成功的。完成后,加载您的图像并使用 cv2.blobFromImage() 构造一个 blob,然后设置您的输入,最后执行推理:

blob = cv.dnn.blobFromImage(image, 1 / 255.0, (256,256), swapRB=True)
net.setInput(blob)
out = net.forward()

查看您的输出: 你最终会得到一个 (1,1,x,y) 形状。使用您想要的功能重塑您的输出(在我的情况下,我只使用 np.resize())。绘制输出并查看结果!

希望这可以帮助那些不想处理 TensorFlow C++ API 并需要获得相对良好的工作 C++ 推理设置的其他人。

编辑:作为一个注释,我应该提到我尚未使用 C++ OpenCV 库对此进行测试。我计划在下周左右这样做。如果此解决方案在 C++ 中不起作用,我会在此处注明。

编辑 2:在 C++ 中测试并运行良好

【讨论】:

以上是关于使用 OpenCV readNetFromTensorFlow 运行 Keras DNN 模型(UNet):错误:操作解码器_stage0_upsampling/Shape 中的未知层类型形状的主要内容,如果未能解决你的问题,请参考以下文章

opencv 安装 vc14可以在vs10上运行吗

OpenCV学习记录

我是不是需要使用 Gstreamer 构建 OpenCV 才能在 OpenCV 中使用 Gstreamer

opencv中自带的dll和lib 为啥不能直接使用?

OpenCV-IOS 在Xcode中使用时,除了把opencv2.framework拉入项目中,还需要做啥,

使用 opencv_contrib 在 Mac OS 终端中运行 OpenCV