使用OpenCV readNetFromTensorFlow运行Keras DNN模型(UNet):错误:未知的图层类型op解码器中的Shape_stage0_upsampling / Shape

问题描述 投票:3回答:1

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。

python c++ keras hdf5
1个回答
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 ++中无法正常工作,我将在此处进行说明。

© www.soinside.com 2019 - 2024. All rights reserved.