ラズパイZeroでTensorFlow Liteに挑戦

M5StackのUnitV2をみて、手元のラズパイZeroでも何かできないかと思って調整してみました。

調べてみるとTensorflow Liteが動くようなので、サンプルの画像分類を試してみました。
※ラズパイZero(ARMv6)向けのWheelパッケージは用意されていませんので、自前で作成する必要があります。手順は後ろに載せています

# サンプルプログラムの実行

```bash:RaspberryPiZero
git clone https://github.com/tensorflow/examples --depth 1
cd examples/lite/examples/image_classification/raspberry_pi/
bash download.sh /tmp
python3 classify_picamera.py   --model /tmp/mobilenet_v1_1.0_224_quant.tflite   --labels /tmp/labels_mobilenet_quant_v1_224.txt
```

## 結果１（Mobilenet_V1_1.0_224_quant）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/7d9c2b87-fc01-a473-1216-0488841616b5.png)

動作はするのですが、1回の推論に10秒近くかかります。。遅い。。


使用するモデルを軽いものに変えてみます。
[ここ](https://www.tensorflow.org/lite/guide/hosted_models)の中からMobilenet_V1_1.0_128_quantに変更してみます。

```bash:RaspberryPiZero
cd /tmp/
wget https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_1.0_128_quant.tgz
tar zxvf mobilenet_v1_1.0_128_quant.tgz
```

ラベルは見つからなかったのでサンプルに含まれるものを使いまわしましょう

```bash:RaspberryPiZero
python3 classify_picamera.py   --model /tmp/mobilenet_v1_1.0_128_quant.tflite   --labels /tmp/labels_mobilenet_quant_v1_224.txt
```

## 結果２（Mobilenet_V1_1.0_128_quant）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/068f653d-2413-1987-55a6-f1fb22949ba7.png)

3.5秒ぐらいなので、まあまあ早くなりました。



# ラズパイZero向けのPython Wheelパッケージを作成する

残念ながらラズパイZero(ARMv6)向けのWheelパッケージは用意されていません。
ラズパイ2以降のARMv7用は用意されています。
https://www.tensorflow.org/lite/guide/python

ただ、自分でビルドする手順は用意されていましたので、それに沿ってやってみました。

## VSCodeでDocker in Dockerコンテナを起動

ここは好みですが、ホスト環境を汚さずビルドしたかったので、Docker内で行おうと思いました。
ただ、ビルドにDokcerを使用する仕組みだったので、Dockerの中でDockerが起動可能な「Docker in Docker」の形で行いました。

vscodeを起動し、左下の「リモートウィンドウを開きます」ボタンから始めます

「Add Development Container Configuration Files...」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/94ae117a-dda9-4bff-1d5a-1303a10d963c.png)

「Show All Definitions...」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/9fe9cb0d-07a1-0083-5596-6a490cb44184.png)

「Docker in Docker」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/87246f81-3ca0-33fc-5a6c-36a420db5823.png)

これで設定ファイルができました

「Reopen in Container」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/89a3bf23-a40f-49ba-e8d8-bb1444a70f54.png)

ここから先はコンテナ内での作業になります。

## Python Wheelパッケージの作成

公式の手順はこちらです。
https://www.tensorflow.org/lite/guide/build_cmake
https://www.tensorflow.org/lite/guide/build_cmake_pip

```bash:Docker-in-Docker
cd # 作業は/root配下で行いました
sudo apt-get update
sudo apt-get install cmake -y
git clone https://github.com/tensorflow/tensorflow.git tensorflow_src
cd tensorflow_src/
tensorflow/tools/ci_build/ci_build.sh PI-PYTHON37 tensorflow/lite/tools/pip_package/build_pip_package_with_cmake.sh rpi0 # 最後のrpi0が重要です
```


これでWheelパッケージが作成されます
出力先はこちらです

```bash:Docker-in-Docker
~/tensorflow_src $ ls -l tensorflow/lite/tools/pip_package/gen/tflite_pip/python3.7/dist/
total 2776
-rw-r--r-- 1 vscode vscode 1414958 Jun  6 05:39 tflite_runtime-2.6.0-cp37-cp37m-linux_armv6l.whl
-rw-r--r-- 1 vscode vscode 1422521 Jun  6 05:39 tflite-runtime-2.6.0.linux_armv6l.tar.gz
~/tensorflow_src $ 
```

# ラズパイZeroにTensorFlow Liteをインストールする

```bash:RaspberryPiZero
sudo apt-get update
sudo apt install libatlas-base-dev -y
pip install tflite_runtime-2.6.0-cp37-cp37m-linux_armv6l.whl
```