https://github.com/tensorflow/models/tree/r1.13.0/research/slim
こちらのサイトを参考にしながら、前回ビルドしたツールを使ってみます。
slimのディレクトリに移動します。
cd ~/AI/models/research/slim
download_and_convert_flowers.py を少し修正します。
gedit ./datasets/download_and_convert_flowers.py
ダウンロードするファイルが消えないように、210行目をコメントアウトしました。
flowersのデータをダウンロードして、TFRecordフォーマットに変換します。
python3 download_and_convert_data.py \ --dataset_name=flowers \ --dataset_dir="${HOME}/AI/image_classifier/data/flowers"
フォーマットが変換されました。ダウンロードしたファイルも残っています。 ダウンロードしたファイルの中には5種類の花の画像(jpg)が大量に入っているだけです。
inception v3 のチェックポイントをダウンロードしていきます。
mkdir ${HOME}/AI/image_classifier/checkpoints wget http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz tar -xvf inception_v3_2016_08_28.tar.gz mv inception_v3.ckpt ${HOME}/AI/image_classifier/checkpoints rm inception_v3_2016_08_28.tar.gz
チェックポイントのダウンロードが完了しました。
GPUが使えない場合は、訓練用のプログラムを少し修正します。
gedit train_image_classifier.py
43行目のclone_on_cpuをTrueにしました。 これでCPUでも訓練処理を実行できます。
訓練処理を実行します。ただし、今回はお試しなので、maxステップ数を20としています。
python3 train_image_classifier.py \ --train_dir=${HOME}/AI/image_classifier/train_logs \ --dataset_name=flowers \ --dataset_split_name=train \ --dataset_dir=${HOME}/AI/image_classifier/data/flowers \ --model_name=inception_v3 \ --max_number_of_steps=20
ステップ数20なので、数分で完了しました。
チェックポイントとGraphDefが生成されています。
Tensorboardで見てみます。
tensorboard --logdir=${HOME}/AI/image_classifier/train_logs
ステップ数20なので、Lossが大きいです。ステップ数を増やして、訓練をしっかりするとLossが小さくなります。
GraphDefも生成されていたので、グラフも表示できました。
グラフを拡大して眺めることもできますが、この辺は難しくて良くわかりません。
生成したチェックポイントの評価をします。お試しなので、maxバッチ数は10としています。
python3 eval_image_classifier.py \ --alsologtostderr \ --checkpoint_path=${HOME}/AI/image_classifier/train_logs/model.ckpt-20 \ --dataset_dir=${HOME}/AI/image_classifier/data/flowers \ --dataset_name=flowers \ --dataset_split_name=validation \ --model_name=inception_v3 \ --max_num_batches=10
評価結果が表示されました。お試しなので、あてになりませんが、
eval/Accuracy[0.214]
eval/Recall_5[1]
と表示されています。
freeze_graphツールを使って、GraphDefとチェックポイントを合わせて、FrozenGraphDef形式に変換します。
cd ~/AI/tensorflow
bazel-bin/tensorflow/python/tools/freeze_graph \ --input_graph=${HOME}/AI/image_classifier/train_logs/graph.pbtxt \ --input_checkpoint=${HOME}/AI/image_classifier/train_logs/model.ckpt-20 \ --input_binary=false \ --output_graph=${HOME}/AI/image_classifier/frozen_flowers.pb \ --output_node_names=InceptionV3/Predictions/Reshape_1
python2でビルドしたせいか、エラーが出ました。
python2 にもTensorflow 1.13.1を入れます。
pip2 install tensorflow==1.13.1
もう一度freeze_graphを実行します。
bazel-bin/tensorflow/python/tools/freeze_graph \ --input_graph=${HOME}/AI/image_classifier/train_logs/graph.pbtxt \ --input_checkpoint=${HOME}/AI/image_classifier/train_logs/model.ckpt-20 \ --input_binary=false \ --output_graph=${HOME}/AI/image_classifier/frozen_flowers.pb \ --output_node_names=InceptionV3/Predictions/Reshape_1
FrozenGraphDefが生成されました。
そのFrozenGraphDefに対して、summarize_graphツールを使ってみます。
bazel-bin/tensorflow/tools/graph_transforms/summarize_graph \ --in_graph=${HOME}/AI/image_classifier/frozen_flowers.pb
frozen_flowers.pb に関する情報が表示されました。 freeze_graphツール使用時に指定したノード名も表示されています。
label_imageツールを使ってみます。
bazel-bin/tensorflow/examples/label_image/label_image \ --image=${HOME}/AI/imagenet/sunflower.jpg \ --input_layer=input \ --output_layer=InceptionV3/Predictions/Reshape_1 \ --graph=${HOME}/AI/image_classifier/frozen_flowers.pb \ --labels=${HOME}/AI/image_classifier/data/flowers/labels.txt \ --input_mean=0 \ --input_std=255
inputがどうのこうのと、なんかエラーが出ています。freeze_graphする時にinputのノードも指定してやらないといけないのでしょうか。この辺がまだ良くわかりません。 label_imageツール自体は使えているようです。
今回はここまでです。