2016年9月16日金曜日

TensorFlowのライブラリをC++から使って画像認識してみた

TensorFlowのライブラリをC++から使うにはどうしたらよいのか。


https://www.tensorflow.org/versions/r0.7/tutorials/image_recognition/index.html

上記のドキュメントにはC++のサンプルのビルド方法は書かれているのですが、bazelを使わない自分で作ったアプリのビルド方法はまったくGoogleno公式ドキュメントに書かれていません。

bazelを使わないで、自分のビルドシステムでmakeしたいときはどうすればいいんだろ。
なので調べてみました。



1. Tensorflowをソースからビルドする


まず、tensorflowのsoを作りたいのですが、soを作るにはTesnsorflowをソースからビルドする環境が必要です。以下のサイトをもとに頑張ってTensorflowをソースからビルドします。
https://www.tensorflow.org/versions/r0.10/get_started/os_setup.html#installing-from-sources


2. Tensorflowのsoを作る。

libtensorflow*.soをビルドしたいのですが、ビルド方法が公式ドキュメントには載ってないですよね。bazelのビルドファイルであるtensorflow/BUILDを読むと、なんとなくsoのビルド方法がわかります。

bazel build -c opt //tensorflow:libtensorflow.so
bazel build -c opt //tensorflow:libtensorflow_c.so
bazel build -c opt //tensorflow:libtensorflow_cc.so

上記のように入力するとsoが出来上がります。
bazel/binのフォルダに出来上がるようです。


3. includeファイルを集めてとってくる

これがめんどくさいのですが、以下の四つのフォルダーのヘッダーファイルを
取ってくるかビルド時にパスで指定します。
bazel-tensorflowはシンボリックリンクとかがあるので取ってくるのがめんどくさいです。

bazel-tensorflow
bazel-genfiles
~/.cache/bazel/_bazelユーザー名 /長い文字列/external/eigen_archives
~/.cache/bazel/_bazelユーザー名 /長い文字列/external/protobuf

僕はこれらのファイルをincludeディレクトリを作り、全部入れました。



4. ビルドする

試しに、Tensorflowに入っている画像認識のサンプルをビルドします。
3で作ったファイルをWindowsに持ってきて、前回の記事のbashでビルドしてみたいと思います。
tensorflow/examples/label_image/main.ccをビルドするには以下のように入力

$ g++ main.cc -std=c++11 -Iinclude/eigen_archive -I include/protobuf/src -Iinclude -L. -ltensorflow_cc -Wl,-rpath=.


びるどできたー



5. 学習データを取ってくる

いつものように以下のサイトから学習アルゴリズムと学習結果を取ってきます。

https://storage.googleapis.com/download.tensorflow.org/models/inception_dec_2015.zip



6. 実行させる

$ ./a.out

military uniform (866): 0.647298
suit (794): 0.0477196
academic gown (896): 0.0232406
bow tie (817): 0.0157355
bolo tie (940): 0.0145024


おー、結果が出た。


この写真は軍の制服らしい。
確かにスーツにも見えるね。




これでsoとヘッダーファイルさえとってこれれば、どんなビルドシステムでもコンパイルすることができます。

Windowsのbash on ubuntu on Windsowsはjavaがまだ安定して動かないため、bazelも動かないのですが、ubuntuでビルドしたsoとヘッダーファイルを取ってくれば、Windows上でTensorflowのC++開発も行うこともできます。

Pythonでディープラーニングをすることが流行っていますが、スマホや組み込みではフルスペックのPythonは動きません。
しかし、Tensorflowは演算部分がC++で書かれているので、Tensorflowでグラフを作れば、スマホや組み込みですぐにその学習結果を利用することができるます。
ディープラーニングを使ったアプリを簡単に商品化できるだけでなく、大変時間のかかる学習もGPUを使ったサーバで簡単に分散処理できます。
Tensorflowって深層学習のアプリを実際に商品化する時に発生するたくさんの問題をすべて解決してくれます。
本当によく考えられています。すごいです。




0 件のコメント:

コメントを投稿