使用 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 中的未知层类型形状的主要内容,如果未能解决你的问题,请参考以下文章
我是不是需要使用 Gstreamer 构建 OpenCV 才能在 OpenCV 中使用 Gstreamer