Kerasのモデル(h5)とtensorflowのモデル(pb)の変換に苦労している件

先日、kerasのモデルが作成できたので、OpenCVに読み込ませようとしました。 OpenCVではTensofrlowのpbモデルでないと適用されないようだったので、 kerasのh5モデルから変更することにしました。

いろいろ調べたところ、以下が参考になりそうでした。 で、試しに動作させるとエラーが出て、調べてみると Tensorflow v1.0とv2.0でなくなっている関数があるようでした。

GitHub - Tony607/keras-tf-pb: How to convert trained Keras model to a single TensorFlow .pb file and make prediction

そこで、Tensorflow2.0ではどのように変換するのかと調べてみたら、 以下のサイトが見つかりました。どうも2.0では簡単に変換可能なこどかわかりました。

python - Tensorflow 2.0 Convert keras model to .pb file - Stack Overflow

import tensorflow as tf
pre_model = tf.keras.models.load_model("final_model.h5")
pre_model.save("saved_model")

ところがです、OpenCVで読ませてみるとFailedが発生することがわかりました。。 原因不明ですが、Tensorflowのバージョンによるものに思え、ネットで調べても情報がでてこないことがかわりました。

net = cv2.dnn.readNetFromTensorflow('saved_model/saved_model.pb', 'saved_model/model.pbtext')
# --> FAILED: ReadProtoFromBinaryFile(param_file, param). Failed to parse GraphDef file: saved_model/saved_model.pb in function 'ReadTFNetParamsFromBinaryFileOrDie'
v = tf.Variable(0, name='my_variable')
sess = tf.compat.v1.Session()
tf.io.write_graph(sess.graph, './saved_model', 'model.pbtxt')

あとがき

というわけで、詰んでしまいましたので、終わりました。

tensorflowNet = cv2.dnn.readNetFromTensorflow('frozen_inference_graph.pb', 'graph.pbtxt')OpenCVでTensorflowのネットが読めるはずなのに。。という感じです。 悲しいことに挽回作を考えないと行けない状況になってしまいました。