IT実験のブログ

IT関連のツールの使い方など

Tensorflowのinceptionという画像認識のexampleを試す(実際に花の画像を認識させる)(失敗)

今回は、先日(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

f:id:itlab7:20200216172820p:plain

gitがインストールされました。

gitコマンドでダウンロードします。

git clone https://github.com/tensorflow/tensorflow.git

f:id:itlab7:20200216173831p:plain

f:id:itlab7:20200216173854p:plain

ダウンロードされました。

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

f:id:itlab7:20200216194824p:plain

エラーが出ました。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

f:id:itlab7:20200216195929p:plain

思ったより時間かかっていますが、ビルドが進んでいます。 ファンも鳴りっぱなしです。 もしかして、Tensorflow全体をビルドしているのでしょうか。

f:id:itlab7:20200216210610p:plain

約1時間かかりましたが、エラーが出ました。 ネットで調べてみたところ、メモリ不足という情報がありました。 (後でシステムモニターで確認してみたところ、確かにメモリが100%まで使われていました)

一旦Ubuntuを電源オフして、VirtualBoxの設定でメモリを増やして起動しなおします。 /tmp/inception_v3_inf_graph.pb を何処かにコピーしておいて、起動後に/tmpに戻します。

f:id:itlab7:20200217111855p:plain

ほとんどギリギリまでメモリを増やして試してみたら、Macが再起動したり不安定になってしまったので10240MB(10GB)としました。 (一瞬書きかけのブログが消えたかと思いましたが、無事でした。ビルドの方は1からやり直しとなってしまいました。)

Ubuntuを起動して、inception_v3_inf_graph.pb を/tmpに戻します。

端末とシステムモニター以外のアプリを終了し、ビルドしなおします。

cd ~/AI/tensorflow/
bazel build tensorflow/python/tools:freeze_graph

f:id:itlab7:20200217140933p:plain

メモリ かつかつです。

f:id:itlab7:20200217141456p:plain

この後、メモリ不足でまたビルドが途中で終わってしまいました。

Ubuntu18.04のスワップ領域を増やす - IT実験のブログ

こちらのブログのやり方で、/swapfile3 (4GB) を追加して再トライします。

f:id:itlab7:20200217142542p:plain

Ubuntu再起動後、freeコマンドで確認したところ、スワップ領域が約10GBになっていることを確認できました。

下のコマンドで、もう一度ビルドします。 今度こそ、うまく行きますように。

cd ~/AI/tensorflow/
bazel build tensorflow/python/tools:freeze_graph

f:id:itlab7:20200217160657p:plain

ビルド成功しました。

summarize_graph というツールをビルドします。

bazel build tensorflow/tools/graph_transforms:summarize_graph

f:id:itlab7:20200217170841p:plain

すんなりビルドできました。

使ってみます。

bazel-bin/tensorflow/tools/graph_transforms/summarize_graph \
   --in_graph=/tmp/inception_v3_inf_graph.pb

f:id:itlab7:20200217171117p:plain

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

f:id:itlab7:20200217200603p:plain

ValueError: No variables to save

というエラーが出ました。

ここで、間違いに気付きました。 インストールしたTensorflowのバージョン(1.15.2)と、gitでダウンロードしたTensorflowのバージョン(最新)が違っていました。

今回は失敗です。 次回は、バージョンを揃えるか、インストール済みのTensorflowの中にあるfreeze_graphを使って、再トライしてみます。

疲れたので、今回はここまでにします。