kerasで作った学習済みモデルをpbファイルに変換したので備忘録です。
やりたかったこと
やりたかったことは、
kerasで作った学習済みモデルをOpenVINOに変換
です。
複数の画像を同時かつ高速にAIで判定する必要があり、kerasで実現が難しかったので
CPUで高速に推論が可能なOpenVINOを採用することにしました。
kerasで実現しようと努力した経緯も記事にしていますので、興味がある方はぜひ。
https://nori-life-log.com/flaskでkerasの推論サーバ
kerasで作った学習済みモデルをOpenVINO形式に変換するには、まずTensorFlow形式、いわゆる.pbファイルに変換する必要があったので、いろいろ調べて実装しました。
コード
コードは以下です。
下記ブログを参考にしました。
How to run Keras model inference x2 times faster with CPU and Intel OpenVINO3 | DLology
In this quick tutorial, you will learn how to setup OpenVINO and make your Keras model inference at least x3 times faster without any added hardware.
import tensorflow as tffrom keras.models import load_model from keras import backend as K from tensorflow.python.framework import graph_io from tensorflow.python.framework import graph_util def freeze_graph(session, output, save_pb_dir='.', save_pb_name='frozen_model.pb', save_pb_as_text=False): graph = session.graph with graph.as_default(): graphdef_inf = tf.graph_util.remove_training_nodes(graph.as_graph_def()) graphdef_frozen = graph_util.convert_variables_to_constants(session, graphdef_inf, output) graph_io.write_graph(graphdef_frozen, save_pb_dir, save_pb_name, as_text=save_pb_as_text) return graphdef_frozen def main(): save_pb_dir = 'your_pb_dir' keras_model = 'your_keras_model.h5' # Clear any previous session. K.clear_session() # This line must be executed before loading Keras model. K.set_learning_phase(0) model = load_model(keras_model) session = K.get_session() freeze_graph(session, [out.op.name for out in model.outputs], save_pb_dir=save_pb_dir) if __name__ == '__main__': main()
参考にしたブログから変更したポイントは、
tensorflowのbackendではなくkerasのbackendを使っている点です。
最初は参考ブログと同様に
import tensorflow as tf
tf.keras.backend.hogehoge
と書いていたのですが、なぜかうまく動きませんでした。
他の記事を見ると、代わりに
from keras import backend as K
K.backend.hogehoge
と書いてある記事があったので、試してみるとうまく動きました。
まとめ
kerasの学習済みモデルを.pbファイルに変換した際の備忘録でした。
tensorflow.keras.backendとkeras.backendの違いが良くわからないままですが、動いたので次に進みます(笑)。
コメント