今回は、先日(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について勉強不足かもしれません。 また何か進展がありましたら、書きたいと思います。
今回はここまでです。