Kerasのモデル(h5)とtensorflowのモデル(pb)の変換に苦労している件
先日、kerasのモデルが作成できたので、OpenCVに読み込ませようとしました。 OpenCVではTensofrlowのpbモデルでないと適用されないようだったので、 kerasのh5モデルから変更することにしました。
いろいろ調べたところ、以下が参考になりそうでした。 で、試しに動作させるとエラーが出て、調べてみると Tensorflow v1.0とv2.0でなくなっている関数があるようでした。
そこで、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'
- pbtext生成方法
- tf.io.write_graph | TensorFlow Core v2.1.0
- 以下で良いのか非常に怪しい。。
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のネットが読めるはずなのに。。という感じです。
悲しいことに挽回作を考えないと行けない状況になってしまいました。