今回は、先日(2020/2/15)生成したflowersを認識するDNNモデルを使って、実際に花の画像を認識させてみたいと思います。
先日生成したものは、チェックポイントなので、FrozenGraphDefという形式(pbファイル)に変換する必要があります。
まず、inception v3 のGraphDefをエクスポートします。 エクスポートするためのプログラムがあるディレクトリに移動します。
cd ~/AI/models/research/slim
エクスポートするためのプログラムを実行します。
python3 export_inference_graph.py \ --alsologtostderr \ --model_name=inception_v3 \ --output_file=/tmp/inception_v3_inf_graph.pb
FrozenGraphDefを作成するためのツールをダウンロードします。
cd ~/AI
ダウンロードするためにgitというツールを使うので、インストールします。
sudo apt install git
gitがインストールされました。
gitコマンドでダウンロードします。
git clone https://github.com/tensorflow/tensorflow.git
ダウンロードされました。
cd tensorflow
FrozenGraphDefを作成するためのツールをビルドします。 ビルドするためには、bazel 2.0.0が必要らしいのでインストールします。
bazelというビルドツールをUbuntu18.04にインストールする - IT実験のブログ こちらのブログと同様にして bazel 2.0.0 をインストールします。 (2.1.0 が 2.0.0 に置き換わります)
下のコマンドでビルドします。
bazel build tensorflow/python/tools:freeze_graph
エラーが出ました。numpyがインポートできないようです。
python-pipをインストールします。
sudo apt install python-pip
pip2をupgradeします。
pip2 install --upgrade pip
numpyをインストールします。
pip2 install numpy
builtinsモジュールもビルド時に必要なので、futureパッケージをインストールします。
pip2 install future
concurrentモジュールもビルド時に必要なので、futuresパッケージをインストールします。
pip2 install futures
mockモジュールもビルド時に必要なので、インストールします。
pip2 install mock
keras_preprocessingモジュールもビルド時に必要なので、インストールします。
pip2 install keras_preprocessing
もう一度、下のコマンドでビルドします。
bazel build tensorflow/python/tools:freeze_graph
思ったより時間かかっていますが、ビルドが進んでいます。 ファンも鳴りっぱなしです。 もしかして、Tensorflow全体をビルドしているのでしょうか。
約1時間かかりましたが、エラーが出ました。 ネットで調べてみたところ、メモリ不足という情報がありました。 (後でシステムモニターで確認してみたところ、確かにメモリが100%まで使われていました)
一旦Ubuntuを電源オフして、VirtualBoxの設定でメモリを増やして起動しなおします。 /tmp/inception_v3_inf_graph.pb を何処かにコピーしておいて、起動後に/tmpに戻します。
ほとんどギリギリまでメモリを増やして試してみたら、Macが再起動したり不安定になってしまったので10240MB(10GB)としました。 (一瞬書きかけのブログが消えたかと思いましたが、無事でした。ビルドの方は1からやり直しとなってしまいました。)
Ubuntuを起動して、inception_v3_inf_graph.pb を/tmpに戻します。
端末とシステムモニター以外のアプリを終了し、ビルドしなおします。
cd ~/AI/tensorflow/
bazel build tensorflow/python/tools:freeze_graph
メモリ かつかつです。
この後、メモリ不足でまたビルドが途中で終わってしまいました。
Ubuntu18.04のスワップ領域を増やす - IT実験のブログ
こちらのブログのやり方で、/swapfile3 (4GB) を追加して再トライします。
Ubuntu再起動後、freeコマンドで確認したところ、スワップ領域が約10GBになっていることを確認できました。
下のコマンドで、もう一度ビルドします。 今度こそ、うまく行きますように。
cd ~/AI/tensorflow/
bazel build tensorflow/python/tools:freeze_graph
ビルド成功しました。
summarize_graph というツールをビルドします。
bazel build tensorflow/tools/graph_transforms:summarize_graph
すんなりビルドできました。
使ってみます。
bazel-bin/tensorflow/tools/graph_transforms/summarize_graph \ --in_graph=/tmp/inception_v3_inf_graph.pb
inception_v3_inf_graph.pb に関する情報が色々表示されました。
FrozenGraphDefを作成するためのツールを実行します。
bazel-bin/tensorflow/python/tools/freeze_graph \ --input_graph=/tmp/inception_v3_inf_graph.pb \ --input_checkpoint=${HOME}/AI/inception/flowers_train/model.ckpt-499 \ --input_binary=true \ --output_graph=${HOME}/AI/inception/flowers_train/frozen_inception_v3.pb \ --output_node_names=InceptionV3/Predictions/Reshape_1
ValueError: No variables to save
というエラーが出ました。
ここで、間違いに気付きました。 インストールしたTensorflowのバージョン(1.15.2)と、gitでダウンロードしたTensorflowのバージョン(最新)が違っていました。
今回は失敗です。 次回は、バージョンを揃えるか、インストール済みのTensorflowの中にあるfreeze_graphを使って、再トライしてみます。
疲れたので、今回はここまでにします。