【TensorFlow Lite】Xubuntu環境でtflite_convertしていく

はじめに

こんにちは、がんがんです。前回の記事にてXubuntu環境でEdge TPU USB アクセラレータの実験を行いました。
gangannikki.hatenadiary.jp


次のステージとしては独自モデルをRaspberry Pi上で実行していくことです。モデル変換の技術としてtflite_convertというものを使用しています。
今回は実際に手を動かしながら勉強していこうと思います。

目的

  • tflite_convertについて学習
  • kerasモデル(.h5)をTensorflow Liteモデルに変換する(PythonUbuntu)
  • kerasモデル(.h5)をTensorflow Liteモデルに変換する(C++Raspberry Pi)

環境

1. まずはkerasモデルの実行環境を作成

まずは環境を準備します。今回はtfliteの実験を行いたいので、tensorflow-gpuは入れてないです(エラー処理がめんどかったので)。
opencvについては.cppのエラーが起きたため、pipからインストールしています。

$ conda create -n tf_test01
$ conda install tensorflow Pillow opencv
# conda install opencvだとエラーが起きたので
$ pip install opencv-python
$ source activate tf_test01

2. Kerasモデルの実行確認

モデルについては参考サイトからcloneして使います。

$ git clone https://iwatake2222/CNN_NumberDetector.git
$ cd CNN_NumberDetector/01_keras

学習するとconv_mnist.h5がアウトプットされます。テストでは4.jpgがセットされていました。

# 学習
$ python ConvMnist.py
# テスト
$ python number.detector.py

3. Kerasモデル(.h5)をTensorFlow Liteモデルに変換して使用してみる(PythonUbuntu)

tflite_convertがすでに自動で入っているため、コマンドを叩いてやるだけで簡単に変換できます。
Python APIによる変換については後ほど触れていこうかなと思います。

$ tflite_convert --output_file=conv_mnist.tflite --keras_model_file=conv_mnist.h5

実行および確認はchap2とほとんど同じです。

4. Kerasモデル(.h5)をTensorFlow Liteモデルに変換して使用してみる(C++Raspberry PI)

TF Liteモデルの使用例としてRPiでの使用が紹介されていたのでそちらについても試してみます。
TensorFLow Liteの公式も参考にしながら実験していきます。

Ubuntuサイド

参考サイトでも書かれていますが、基本的には公式サイトの通りで大丈夫です。私の場合(2019.09.30)は参考サイトのような注意事項は特に現れなかったです。

# ツールのインストール
$ sudo apt-get update
$ sudo apt-get install crossbuild-essential-armhf
# TensorFlowリポジトリのclone
$ git clone https://github.com/tensorflow/tensorflow.git
# 依存関係のダウンロード(初めての場合)
$ ./tensorflow/tensorflow/lite/tools/make/download_dependencies.sh

# コンパイル
$ ./tensorflow/tensorflow/lite/tools/make/build_rpi_lib.sh

# 出力の確認
$ ls ./tensorflow/tensorflow/lite/tools/make/gen/rpi_armv71/lib/libtensorflow-lite.a

出力されたファイルをPC上でクロスビルドします。

# cd ~/tensorflow
$ cp ./tensorflow/tensorflow/lite/tools/make/gen/rpi_armv71/lib/libtensorflow-lite.a .
# サンプルコードのコピー
$ cp ~/CNN_NumberDetector/05_TensorflowLite_CPP/main_without_opencv.cpp .

# ビルド
$ arm-linux-gnueabihf-g++ main_without_opencv.cpp -I.  -I./tensorflow -I./tensorflow/lite/tools/make/downloads -I./tensorflow/lite/tools/make/downloads/eigen -I./tensorflow/lite/tools/make/downloads/absl -I./tensorflow/lite/tools/make/downloads/gemmlowp -I./tensorlow/lite/tools/make/downloads/neon_2_sse -I./tensorflow/lite/tools/make/downloads/farmhash/src -I./tensorflow/lite/tools/make/downloads/flatbuffers/include -std=c++11 -lstdc++ -lm -lpthread -ltensorflow-lite -L. 

ラズパイに必要なファイルをコピーする

先ほどコンパイルしたファイルを含めた必要なファイルをラズパイ側にscpで送信してあげます。

$ scp ./a.out pi@aaa.bbb.ccc.ddd:/home/pi/a_cross.out
$ scp ~/CNN_NumberDetector/05_TensorflowLite_CPP/resource/conv_mnist.tflite pi@aaa.bbb.ccc.ddd:/home/pi/.
$ scp ~/tensorflow/tensorflow/lite/tools/make/gen/rpi_armv71/lib/libtensorflow-lite.a pi@aaa.bbb.ccc.ddd:/home/pi/.
$ scp ~/CNN_NumberDetector/05_TensorflowLite_CPP/main_without_opencv.cpp pi@aaa.bbb.ccc.ddd:/home/pi/.

RPiサイド

# TensorFlowリポジトリのclone
$ git clone https://github.com/tensorflow/tensorflow.git
# 依存関係のダウンロード(初めての場合)
$ ./tensorflow/tensorflow/lite/tools/make/download_dependencies.sh

# コピー
$ cp ~/libtensorflow-lite.a .

# ビルド
$ g++ main_without_opencv.cpp -I.  -I./tensorflow -I./tensorflow/lite/tools/make/downloads -I./tensorflow/lite/tools/make/downloads/eigen -I./tensorflow/lite/tools/make/downloads/absl -I./tensorflow/lite/tools/make/downloads/gemmlowp -I./tensorlow/lite/tools/make/downloads/neon_2_sse -I./tensorflow/lite/tools/make/downloads/farmhash/src -I./tensorflow/lite/tools/make/downloads/flatbuffers/include -std=c++11 -lstdc++ -lm -lpthread -ltensorflow-lite -L.

# 実行コマンド
$ ./a.out

おわりに

今回はtflite_convertについて学習を進めていきました。意外と簡単にコンバート出来ることが分かりました。次回はいよいよedgetpu_convertの学習に入っていきます。