今回は、先日(2020/2/15)生成したflowersを認識するDNNモデルを使って、実際に花の画像を認識させてみたいと思います。
先日生成したものは、チェックポイントなので、FrozenGraphDefという形式(pbファイル)に変換する必要があります。
まず、GraphDefをエクスポートするために、訓練処理のプログラムを書き換えて訓練処理をすると同時にGraphDef(pbファイル)のエクスポートもするように修正します。
~/AI/models/research/inception/inception の inception_train.py の335行目に下のコードを挿入します。
graph_def = sess.graph.as_graph_def() tf.train.write_graph(graph_def,"/tmp/","flowers_graph_def.pb",as_text=False) tf.train.write_graph(graph_def,"/tmp/","flowers_graph_def_txt.pbtxt",as_text=True)
訓練処理をする際に GraphDefを /tmp/flowers_graph_def.pb に保存するようにしました。 ついでにテキスト形式のファイルも保存してみます。
すぐ終わるようにmax_stepsを1にして訓練処理を走らせます。
cd ~/AI/models/research/inception
bazel-bin/inception/flowers_train \ --train_dir="/tmp/flowers_train10/" \ --data_dir="${HOME}/AI/inception/flowers-data/" \ --pretrained_model_checkpoint_path="${HOME}/AI/inception-v3-model/inception-v3/model.ckpt-157585" \ --fine_tune=True \ --initial_learning_rate=0.001 \ --input_queue_memory_factor=1 \ --max_steps=1
訓練処理が終わりました。
/tmp にGraphDefファイルが生成されています。 テキスト形式のものもあります。
今後使うかもしれないので、~/AI/inception にコピーして取っておきました。
FrozenGraphDefを作成するためのツールを実行します。
cd ~/.local/lib/python3.6/site-packages/tensorflow_core/
python3 python/tools/freeze_graph.py \ --input_graph=/tmp/flowers_graph_def.pb \ --input_checkpoint=${HOME}/AI/inception/flowers_train/model.ckpt-499 \ --input_binary=true \ --output_graph=${HOME}/AI/inception/flowers_frozen_graph_def.pb \ --output_node_names=save_1/control_dependency
※output_node_namesに指定したsave_1/control_dependencyは
Tensorflowのinceptionという画像認識のexampleを試す(実際に花の画像を認識させる)(失敗) - IT実験のブログ
こちらのブログでビルドしたsummarize_graphというツールを使って調べました。 このツールを使って一番最後に表示されたノード名を指定しています。
FrozenGraphDefが作成されました。
~/AI/models/tutorials/image/imagenet の classify_image.py を ~/AI/inception にコピーして、名前をflowers_classify_image.py に変更しておきます。
そして、このプログラムの内容を下記のように修正します。
main関数の1行目をコメントアウトします。
def main(_): # maybe_download_and_extract() image = (FLAGS.image_file if FLAGS.image_file else os.path.join(FLAGS.model_dir, 'cropped_panda.jpg')) run_inference_on_image(image)
63行目を下のように変更します。
FLAGS.model_dir, 'imagenet_2012_challenge_label_map_proto.pbtxt') ↓↓↓↓↓↓↓↓↓↓↓↓↓↓ FLAGS.model_dir, 'flowers_label_map_proto.pbtxt')
66行目を下のように変更します。
FLAGS.model_dir, 'imagenet_synset_to_human_label_map.txt') ↓↓↓↓↓↓↓↓↓↓↓↓↓↓ FLAGS.model_dir, 'flowers_label_map.txt')
124行目を下のように変更します。
FLAGS.model_dir, 'classify_image_graph_def.pb'), 'rb') as f: ↓↓↓↓↓↓↓↓↓↓↓↓↓↓ FLAGS.model_dir, 'flowers_frozen_graph_def.pb'), 'rb') as f:
~/AI/inception に下記の2つのファイルを作成します。
flowers_label_map_proto.pbtxt
# -*- protobuffer -*- # LabelMap entry { target_class: 1 target_class_string: "n00000001" } entry { target_class: 2 target_class_string: "n00000002" } entry { target_class: 3 target_class_string: "n00000003" } entry { target_class: 4 target_class_string: "n00000004" } entry { target_class: 5 target_class_string: "n00000005" }
flowers_label_map.txt
n00000001 daisy n00000002 dandelion n00000003 roses n00000004 sunflowers n00000005 tulips
花の画像を認識するためのプログラムを実行します。
cd ~/AI/inception
python3 flowers_classify_image.py --model_dir=${HOME}/AI/inception --image_file=${HOME}/AI/imagenet/sunflower.jpg
エラーが出ました。 残念ながら、またしても失敗です。 ちょっと良くわからなくなってきました。 まだまだTensorflowについて勉強不足かもしれません。 また何か進展がありましたら、書きたいと思います。
今回はここまでです。