TensorFlowのInception-v3で画像を分類してみた(C++ API編)

tensorflow
TensorFlowのチュートリアルの画像認識(C++ API編)に従って、Inception-v3による画像の分類にチャレンジしてみました。

スポンサーリンク

準備

早速、TensorFlowのチュートリアルの画像認識(C++ API編)を実行したくなるところですが、Bazelのインストール等の準備が必要です。

なお、Bazelのインストールには、JDK8が必要となりますので、インストールしていなければ、先にJDK8をインストールします。

$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
$ sudo apt-get install pkg-config zip g++ zlib1g-dev unzip

次に、GitHub(https://github.com/bazelbuild/bazel/releases)からBazel installer(ダウンロード時点は、bazel-0.2.0-installer-linux-x86_64.sh)をダウンロードし、インストールします。

$ chmod +x bazel-0.2.0-installer-linux-x86_64.sh 
$ ./bazel-0.2.0-installer-linux-x86_64.sh --user

Bazelのパスを追加するため、~/.bashrcに下記を追加します。

export PATH="$PATH:$HOME/bin"

次に、configureを実行しますが、GitHubからTensorFlowをcloneしていなければ、下記(Python API編と同じ)を実行します。

$ cd ~
$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow

configureを実行して、GPUサポートを有効化(し、CUDA・cuDNNのパスを確認)します。

$ cd ~/tensoflow
$ ./configure

チュートリアルの画像認識

準備が終わったところで、TensorFlowのチュートリアルの画像認識(C++ API編)(https://www.tensorflow.org/versions/r0.7/tutorials/image_recognition/index.html)を実行します。

まず、Inception-v3モデル等をダウンロードし、展開します。

$ cd ~/tensoflow
$ wget https://storage.googleapis.com/download.tensorflow.org/models/inception_dec_2015.zip -O tensorflow/examples/label_image/data/inception_dec_2015.zip
$ unzip tensorflow/examples/label_image/data/inception_dec_2015.zip -d tensorflow/examples/label_image/data/

Inception-v3モデルファイルとラベルファイルが展開されます。なお、Python API編で展開されたモデルファイルとcmpで比較してみましたが、ファイルは同一でした。

次に、label_imageをビルドします。

$ bazel build -c opt --config=cuda tensorflow/examples/label_image/...

ビルドに、15分位かかります。

チュートリアル通りに実行すると、グレース・ホッパー提督の画像認識が始まります。

$ bazel-bin/tensorflow/examples/label_image/label_image

グレース・ホッパー提督の分類結果は、チュートリアルでは、

I tensorflow/examples/label_image/main.cc:200] military uniform (866): 0.647296
I tensorflow/examples/label_image/main.cc:200] suit (794): 0.0477196
I tensorflow/examples/label_image/main.cc:200] academic gown (896): 0.0232411
I tensorflow/examples/label_image/main.cc:200] bow tie (817): 0.0157356
I tensorflow/examples/label_image/main.cc:200] bolo tie (940): 0.0145024

となっていますが、少し異なるスコアが出力されました。

I tensorflow/examples/label_image/main.cc:207] military uniform (866): 0.647299
I tensorflow/examples/label_image/main.cc:207] suit (794): 0.0477195
I tensorflow/examples/label_image/main.cc:207] academic gown (896): 0.0232407
I tensorflow/examples/label_image/main.cc:207] bow tie (817): 0.0157355
I tensorflow/examples/label_image/main.cc:207] bolo tie (940): 0.0145023

また、ラベルファイル(imagenet_comp_graph_label_strings.txt)をGoogle翻訳で翻訳して、~/tensorflow/tensorflow/examples/label_image/data/のラベルファイルと入れ替えました。

再度、グレース・ホッパー提督を画像認識させると、

I tensorflow/examples/label_image/main.cc:207] 軍服 (866): 0.647299
I tensorflow/examples/label_image/main.cc:207] スーツ (794): 0.0477195
I tensorflow/examples/label_image/main.cc:207] アカデミックガウン (896): 0.0232407
I tensorflow/examples/label_image/main.cc:207] ちょうネクタイ (817): 0.0157355
I tensorflow/examples/label_image/main.cc:207] ループタイ (940): 0.0145023

となりました。

チュートリアル以外の画像認識

指定した画像を認識させる場合、以下のコマンドを実行します。

$ bazel-bin/tensorflow/examples/label_image/label_image --image=[path/to/image]

Python APIのパンダ画像を画像認識させると、

bazel-bin/tensorflow/examples/label_image/label_image --image=tensorflow/models/image/imagenet/cropped_panda.jpg
...
I tensorflow/examples/label_image/main.cc:207] ジャイアントパンダ (169): 0.89233
I tensorflow/examples/label_image/main.cc:207] インドリ (75): 0.00858706
I tensorflow/examples/label_image/main.cc:207] レッサーパンダ (7): 0.00264235
I tensorflow/examples/label_image/main.cc:207] カスタードアップル (325): 0.00140671
I tensorflow/examples/label_image/main.cc:207] クリプタンサス (878): 0.00107063

となりました。

TensorFlowのInception-v3で画像を分類してみた(Python API編)」と同じのacoustic guitarの画像を画像認識させると、

167282325

acoustic guitar

bazel-bin/tensorflow/examples/label_image/label_image --image=tensorflow/models/image/imagenet/167282325_1c717adec6_z.jpg
...
I tensorflow/examples/label_image/main.cc:207] アコースティックギター (345): 0.491271
I tensorflow/examples/label_image/main.cc:207] 選ぶ (575): 0.459648
I tensorflow/examples/label_image/main.cc:207] エレキギター (346): 0.0193792
I tensorflow/examples/label_image/main.cc:207] バンジョー (341): 0.00783134
I tensorflow/examples/label_image/main.cc:207] チェロ (342): 0.000975679

となりました。2番目の「選ぶ」は「pick」の翻訳です。

Google翻訳、まだまだ!

acoustic guitarの画像は、クリエイティブ・コモンズ・ライセンスに従い利用しています。
“https://www.flickr.com/photos/gi/167282325”