サマリ
- Tensorflow lite使ってみた
- 何も知らなくても使えるという代物ではないが、動かす分には割と簡単
- 性能限界と戦うようなエリアは未検証
モチベーション
前エントリでACS(Azure Custom Vision)からエクスポートしたモデルをTensorflowで動かしてみたが、その続き。
Tensorflowにはモバイルやエッジ機での動作を目的としたTensorflow liteというものが有るらしいというのは知っていたので、エクスポートしたモデルをついでにこれで動かしてみることにした。
そして、どうせなので買ってからあまり動かせていなかったRaspberi pi3b+も引っ張り出すことにした。
やったこと(と引っかかりどころ)
大きな流れとしては以下の通りだ。
1. 環境構築… Tensorflow Liteのインストール
2. モデルの準備… Tensorflow SavedModelをTensorflow Liteモデルにコンバートする。
3. 推論… tf.lite.interpriterを使って.tfliteモデルを使った推論処理を行う。
前エントリと同様、こちらも参考となるDocsと、実際に動かしてみたコードをGitHubに上げてある。以降は筆者の備忘録を兼ねたメモと引っかかったところを記載していくことにする。
www.tensorflow.org www.tensorflow.org github.com
1. 環境構築
- Tensorflow liteをinstallしていく。先にMacOS環境で動作確認してからラズパイに移植しようと思っていたので、両方のInstall方法を確認した。
手順は下記を参照のこと。 Python quickstart | TensorFlow Lite
幾つか留意点が有るので記載する。
- 筆者の手元のラズパイは購入直後に入れたままのRaspbianそのままだったが、pip3で一発だった。このあたりはとっても便利。
2. モデルの準備
- 予めLaptop側でエクスポートしたModelをコンバートして、.tfliteに変換する。
- 前エントリで作成したAzure Custom Vision(ACS)からエクスポートした「SavedModel」をtensorflow.liteのTFLiteConverterで.tfliteに変換する。
- 公式情報としては以下参照。
- 筆者が書いたコードは下記。 github.com
- ちなみにACSのモデルエクスポート機能には「TFLite」もあり、こちらでエクスポートしたモデルを使っても以降の手順は実施できる。
3. 推論
- .tfliteから計算グラフを読み込んで、推論処理を行う。
- 以下が公式情報としては参考になる。
www.tensorflow.org
- 基本的な流れとしては、tf_lite.Interpreterにモデルを読み込ませ(文字通り「翻訳」してもらう)、取得した計算グラフの形状を元にInputとOutputを確認したら、interpreter.invoke()で実行、という順番。
- Define and Runの頃のtensorflowっぽい動きのような気がする。
- 以下が公式情報としては参考になる。
www.tensorflow.org
- とはいえ上記のサンプルコードではあまりに味気ない。ちょうど前エントリで画像分類モデルを動かすコードを書いていたので、これをまんまtfliteに書き換える。
- 更には書き換えたものをMacOS上で動作確認した後、USBカメラを接続したラズパイにVNC接続して実行してみた。
この通り。ラズパイ単体で本当に動くかな、と不安だったがMac機と比較すると多少はラグが有るものの、十分に動作してくれた。
- 右上のCPU利用率が60%くらいなので、もう少し余力はありそう
- ソースコードは下記の通り。といってもACSのチュートリアルコードを元ネタに書き換えているだけだが。 Tensorflow-inferences-with-Azure-Custom-Vision/tflite_inference_from_videocapture.py at master · shinebalance/Tensorflow-inferences-with-Azure-Custom-Vision · GitHub
余談だが、正直一番時間を使ったのはラズパイ廻りで、特にめんどくさかったのはラズパイへのOpenCVのインストール。
- 以下の記事に助けられたのでリンク。 qiita.com
所感
- という訳でACSからエクスポートしたModelを推論専用ライブラリを用いてエッジ機で実装する、という所まで動かすことができた。タスクとしては一番楽勝の画像分類なので、正直物体検出を動かしてみないと推論専用ライブラリの本当の実力は見えてこないかな……とも思うのだが。
- また、推論ライブラリについては、意外とお作法はDefine and Runっぽい順番に回帰するのが面白いところ。tflite以外だとIntel OpenVinoなんかも少し触ったことが有るが、あちらも似たような手順だった気がする。
- まぁDeep Learningの推論が本質的には単なる莫大な行列計算であることを考えるとこのやり方が当然で、むしろDefine by Runのほうがモデル構築と学習の複雑さが故に出てきた考え方なのだな、と今更考えさせられる。
つづく
- とまぁ一区切りはついたのだが、実は連休で検証しきれなかったガジェットがまだあるので、推論廻りはまた何か試してみる、かもしれない。
以上