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の画像を画像認識させると、

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”