TensorFlowをAndroidやiOSで使えないかな?と調べてみると、TensorFlow Liteというキーワードが見つかります。
そこでTensorFlow Liteについて調べてみると、様々な疑問が浮かんでは消え、浮かんでは消えすると思います。
そこで今回は、
- AndroidやiOSでTensorFlowを利用したプログラムを動作させるにはどうするの?
- TensorFlow Liteでは機械学習の訓練をしないってホント?
- TensorFlow Mobileというのも見つかったんだけど、これは何?
このような疑問に簡単に答える記事になっていますので、この記事をきっかけにして、TensorFlow Liteについての理解を深めていただければと思います。
では、行きましょう。
TensorFlowとは
TensorFlowは、インストールするだけで機械学習で何かができる、というものではありません。
プログラミング言語からTensorFlowを利用すると、機械学習や深層学習を利用したプログラムを簡単に開発できるというライブラリです。
TensorFlowを利用して機械学習のモデルを構築して訓練し、最後に推測をするという流れになっています。
なお、TensorFlowの開発はGitHubで進められており、ソースコードも自由にダウンロードできます。
TensorFlowとは何か?については、以下の記事で説明していますので、よく分からない方は確認してみてくださいね。
TensorFlow Mobileとは
参考:https://www.tensorflow.org/mobile/mobile_intro
TensorFlow Mobileは、TensorFlowをAndroidやiOSなどで利用するためのソリューションです。
モバイル端末で使用するアプリで機械学習を利用するために、アプリにTensorFlowを効果的に統合するためのノウハウとそのためのツールが提供されています。
TensorFlow Liteとは
参考:https://www.tensorflow.org/mobile/tflite/
TensorFlow Liteは、TensorFlow Mobileの進化版です。
ざっくり書くと、機械学習の訓練は(TensorFlow Liteではなく)TensorFlowで行い、AndroidやiOSでの推測はTensorFlow Liteで行うという役割分担になっています。
TensorFlow Liteでは、AndroidやiOSでも十分な速さで動作させるために、さまざまな工夫をしていたり、(残念ながら)制限があったります。
TensorFlow MobileとTensorFlow Liteの違いについては、以下のページが参考になります。
参考:https://www.tensorflow.org/mobile/
ここでは、TensorFlowやTensorFlow Mobileと、TensorFlow Liteの代表的な違いについて紹介しましょう。
対応するモデル
TensorFlow Mobileを使えば、様々なモデルを自由に構築して、機械学習を試せます。
一方、TensorFlow Liteは、まだ開発者向けリリースであるため、以下の3つのモデルしか対応していません。
- Inception V3
- MobileNets
- On Device Smart Reply
このうち、MobileNetsを利用したAndroidアプリ(デモアプリ)は、TensorFlow Liteのサイトからダウンロードしたり、自分でビルドしたりできます。
このAndroidアプリ(デモアプリ)をAndroidにインストールする方法は、以下の記事で紹介しました。
また、このアプリをビルドする方法は、以下のサイトが参考になります。
参考:http://motojapan.hateblo.jp/entry/2017/11/18/114032
新しいファイル形式
TensorFlow Liteでは、十分な速さで動作させるために、推測で使用するモデルを保存するファイル形式が異なります。
TensorFlowやTensorFlow Mobileでは、以下の2つのファイルを利用します。
- pbファイル:TensorFlowのモデルを保存するProtocol Buffers形式のファイル
- ckptファイル:TensorFlowの訓練によって自動調整された変数を保存するファイル
この2つのファイルによって、TensorFlowで訓練したモデルと自動調整された変数が再現され、訓練した内容に基づいた推測ができるという仕組みです。
一方、TensorFlow Liteでは、この2つのファイルから作成した新しい形式のファイル(tfliteファイル)を利用して、推測します。
- tfliteファイル:TensorFlow Liteが読み込めるFlatBuffers形式のファイル
tfliteファイルを作ってみよう
さて、ちょっと大変なことにも挑戦してみよう、ということで上で挙げたtfliteファイルを作成する方法を紹介します。
具体的には、GitHubのTensorFlow modelsリポジトリにあるMobileNetのデータからtfliteファイルを作成する方法を紹介します。
※Windowsでは途中でつまずいてしまったので、Ubuntuで作業しました。
大きく5つの手順が必要です。
(1)pbファイルを作成します。
pbファイルを作成するには、GitHubのTensorFlow modelsリポジトリのデータが必要です。
この記事では、「tensorflow」ディレクトリにTensorFlow modelsリポジトリをクローンします。
(1-1)TensorFlowをインストールしたAnacondaのPython環境(tensorflow-cpu)を起動します。
Anacondaのtensorflow-cpu環境は、以下の記事と同様の手順で作成しました。
(1-2)「mkdir tensorflow」と入力し、Enterキーを押します。
(1-3)「cd ~/tensorflow」と入力し、Enterキーを押します。
(1-4)以下のコマンドを入力して、Enterキーを押し、TensorFlow modelsリポジトリをクローンします。
git clone https://github.com/tensorflow/models.git
(1-5)「~/tensorflow」ディレクトリのまま以下のコマンドを入力して、mobilenet_v1_224.pbを作成します。
python ~\tensorflow\models\research\slim\export_inference_graph.py --model_name=mobilenet_v1 --output_file=mobilenet_v1_224.pb
「~/tensorflow」ディレクトリに、labels.txtとmobilenet_v1_224.pbが作成されます。
(2)ckptファイルをダウンロードします。
ckptファイルは、TensorFlowのGitHubリポジトリに事前学習済のデータがありますので、そこからダウンロードします。
(2-1)https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/models.mdにアクセスし、「Mobilenet_1.0_224」の「tflite&pb」をクリックして、mobilenet_v1_1.0_224.tgzをダウンロードします。
(2-2)mobilenet_v1_1.0_224.tgzを、任意のディレクトリに展開します。
今回は、以下のように「~/tensorflow/lite/mobilenet_v1_1.0_224」ディレクトリに展開しました。
(3)ここまでに準備したpbファイルとckptファイルから、フリーズしたpbファイルを作成します。
(3-1)TensorFlowをインストールしたAnacondaのPython環境(tensorflow-cpu)を起動します。
Anacondaのtensorflow-cpu環境は、以下の記事と同様の手順で作成しました。
(3-2)「cd ~/tensorflow/lite」と入力し、Enterキーを押します。
(3-3)以下のコマンドを入力し、「~/tensorflow」ディレクトリにfrozen_mobilenet_v1_224.pbを作成します。
freeze_graph --input_graph=../mobilenet_v1_224.pb --input_checkpoint=mobilenet_v1_1.0_224/mobilenet_v1_1.0_224.ckpt --input_binary=true --output_graph=../frozen_mobilenet_v1_224.pb --output_node_names=MobilenetV1/Predictions/Reshape_1
(4)TensorFlow Lite Converter(toco)をビルドします。
次は、tfliteファイルに変換します、と言いたいところですが、変換に必要なTensorFlow Lite Converter(toco)をビルドします。
※あらかじめbazelをインストールしてください。
参考:https://www.kunihikokaneko.com/free/linux/ubuntu_bazel.html
(4-1)TensorFlowをインストールしたAnacondaのPython環境(tensorflow-cpu)を起動します。
Anacondaのtensorflow-cpu環境は、以下の記事と同様の手順で作成しました。
(4-2)「cd ~/tensorflow」と入力し、Enterキーを押します。
(4-3)以下のコマンドを入力して、Enterキーを押し、TensorFlow modelsリポジトリをクローンします。
git clone https://github.com/tensorflow/tensorflow.git
(4-4)「cd ~/tensorflow/tensorflow」と入力し、Enterキーを押します。
(4-5)以下のコマンドを入力して、Enterキーを押し、TensorFlow Lite Converter(toco)をビルドします。
bazel build tensorflow/contrib/lite/toco:toco
※私が試したときには、nasmに関するエラーメッセージが表示され、TensorFlow Lite Converter(toco)がビルドできなかったため、「~/tensorflow/tensorflow/tensorflow/workspace.bzl」の以下の行を修正しました。
修正前:
“https://mirror.bazel.build/www.nasm.us/pub/nasm/releasebuilds/2.12.02/nasm-2.12.02.tar.bz2”,
修正後:
“https://www.nasm.us/pub/nasm/releasebuilds/2.12.02/nasm-2.12.02.tar.bz2”,
(5)frozen_mobilenet_v1_224.pbを、tfliteファイルに変換します。
最後に、フリーズしたpbファイルからtfliteファイルを作成しましょう。
(5-1)TensorFlowをインストールしたAnacondaのPython環境(tensorflow-cpu)を起動します。
Anacondaのtensorflow-cpu環境は、以下の記事と同様の手順で作成しました。
(5-2)「cd ~/tensorflow」と入力し、Enterキーを押します。
(5-3)以下のコマンドを入力し、Enterキーを押します。
tensorflow/bazel-bin/tensorflow/contrib/lite/toco/toco --input_file=frozen_mobilenet_v1_224.pb --input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE --output_file=mobilenet_v1_1.0_224.tflite --inference_type=FLOAT --input_type=FLOAT --input_arrays=input --output_arrays=MobilenetV1/Predictions/Reshape_1 --input_shapes=1,224,224,3
どうでしょう、mobilenet_v1_1.0_224.tfliteが作成されましたか?
うまくいくことを祈っています!
まとめ
今回は、TensorFlow MobileとTensorFlow Liteの違いと、TensorFlow Liteのアプリを動かす際にモデルの情報を格納したtfliteファイルを作成する方法を紹介しました。
TensorFlow Liteは、まだまだ開発者向けリリースです。
そのため、今後、操作方法が変わる可能性があり、今回書いた操作方法もいつまで使えるかわかりません。
そもそも、この操作で全員がtfliteファイルを作成できるかどうか…ぜひ試してみてください!
そして、成功しても失敗しても結果を教えていただけると励みになります。
では!