Raspberry PiでPINTOさん謹製「TensorFlowLite-bin」を使ってお手軽に爆速エッジコンピューティング

![raspicam_tflite.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/3b8b6574-65bf-217c-e4ca-a180a13f2156.gif)

# PINTOさんの「TensorflowLite-bin」を使ってみる
　最速にして、最狂。ビルドジャンキーのPINTOさん。最速を目指して、日夜TensorFlowのビルドに励んで、バイナリをみんなに提供し続ける素晴らしい方です。いつも凄いなと思ってみていたものの、Qiitaの記事を読んだだけで震えてしまい、ほとんどその恩恵にあずかれていませんでした。

　そんなPINTOさんの凄さを少しでも感じるために、PINTOさんが作ってくださった成果物を簡単に試してみる方法をまとめました。この凄さを広めないのは、世の中の損失と思い使命感（？）をもって記事書きました。

　今回使用するのは、PINTOさん謹製のリポジトリ「TensorflowLite-bin」です。Raspberry Piにお手軽に「TensorFlowLite」をインストールして、軽量化された爆速したモデルを動かせる素晴らしいリポジトリです。

<a href="https://github.com/PINTO0309/TensorflowLite-bin"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/PINTO0309/TensorflowLite-bin.png" width="460px"></a>

　正直、最初はRaspberry PiでTensorFlowLiteが動くかどうかすらわかってなかったのですが、優しいフォロワーさんに教えていただきました。

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">はい。TensorFlow Lite動きます。<a href="https://twitter.com/PINTO03091?ref_src=twsrc%5Etfw">@PINTO03091</a>さんが公開しているTensorflow Lite binをインストールするのがいいと思います。<a href="https://t.co/H6D39u58ck">https://t.co/H6D39u58ck</a><br><br>経験上、物体検出やSegmentation(Deepab)がそれなりに動作します。<br>（IFがTF-Lite専用のモデルの種類があったりとややこしいですが...）</p>&mdash; nb.o (@Nextremer_nb_o) <a href="https://twitter.com/Nextremer_nb_o/status/1201832664820400128?ref_src=twsrc%5Etfw">December 3, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# Raspberry Piで「TensorFlowLite-bin」を動かす方法

## Raspberry Piセットアップ
　Raspberry Pi 4を使っていますが、3でも動くと思います。セットアップは以下記事を参照ください。

[Raspberry Pi 4のディープラーニングで画像認識する環境をゼロから1時間で構築する方法](https://karaage.hatenadiary.jp/entry/rpi4-dl-setup)

　上記記事のRaspbian初期設定までを完了させて下さい。TensorFlowのインストールは不要です（この後、TensorFlowLiteをインストールするので）。

　カメラでディープラーニングを楽しみたい場合は、Raspberrypi カメラモジュールかUSBカメラを用意して下さい（とりあえず試すだけならカメラ無しでもOKです）。

## TensorFlow Liteセットアップ
　PINTOさんのリポジトリのREADME通りです。以下実行しましょう。

```sh
$ sudo apt update
$ sudo apt install -y swig libjpeg-dev zlib1g-dev python3-dev python3-numpy unzip wget python3-pip curl git cmake make
$ wget https://github.com/PINTO0309/TensorflowLite-bin/raw/master/1.15.0/tflite_runtime-1.15.0-cp37-cp37m-linux_armv7l.whl
$ sudo pip3 install --upgrade tflite_runtime-1.15.0-cp37-cp37m-linux_armv7l.whl
```

## Open CVセットアップ
　Python3用のOpenCVをインストールします。私が自作したセットアップスクリプトを使用するのが比較的簡単です。以下コマンド実行して下さい。数分でセットアップされます。

```sh
$ git clone https://github.com/karaage0703/raspberry-pi-setup
$ cd raspberry-pi-setup
$ ./setup-opencv-raspbian-buster.sh
```

## 物体検出の動作確認
 これでセットアップは完了です。以下コマンドで動作確認をしてみましょう。~~今回は、この後Raspberry Piカメラモジュールで動かす関係上、PINTOさんのリポジトリをforkした私のリポジトリをcloneします。~~ PRがマージされたのでPINTOさんのリポジトリを使います。

```sh
$ cd && git clone https://github.com/PINTO0309/TensorflowLite-bin
$ cd ~/TensorflowLite-bin
$ python3 mobilenetv2ssd.py
```

　以下のように検出結果が表示されればOKです。

```
time:  0.11018490791320801
[[(124, 231), (315, 544), 0.97265625, 'dog'], [(114, 132), (564, 429), 0.953125, 'bicycle'], [(461, 81), (696, 172), 0.87890625, 'car']]
coordinates: (124, 231) (315, 544). class: "dog". confidence: 0.97
coordinates: (114, 132) (564, 429). class: "bicycle". confidence: 0.95
coordinates: (461, 81) (696, 172). class: "car". confidence: 0.88
```

　実行したディレクトリに、以下のような`result.jpg`という画像が生成されます。確認してみましょう。

![result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/ff41dd38-afab-537d-aeab-1126c84c79b4.jpeg)

　ワンちゃんと自転車が正しく検出されていますね。


## カメラでの物体検出
　いよいよカメラでの物体検出です。USBカメラの場合は、以下コマンドでカメラによる物体検出が動きます。

```sh
$ cd ~/TensorflowLite-bin
$ python3 mobilenetv2ssd-sync-usbcam.py
```

　複数のUSBカメラがある場合は、以下のようにオプションでデバイスのナンバーを変えてみましょう。

```sh
$ cd ~/TensorflowLite-bin
$ python3 mobilenetv2ssd-sync-usbcam.py --usbcamno=1
```

　Raspberry Piカメラモジュールで試す場合は、以下のオプションを設定してコマンド実行して下さい。

```sh
$ python3 mobilenetv2ssd-sync-usbcam.py --camera_type="raspi_cam"
```

![raspicam_tflite.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/3b8b6574-65bf-217c-e4ca-a180a13f2156.gif)
　爆速！！

# まとめ
　Raspberry PiでPINTOさん謹製「TensorFlowLite-bin」を使った爆速のエッジコンピューティングを試してみました。

　PINTOさんのおかげで、試すだけなら楽々です！是非Raspberry Pi上での異次元スピードを体感してみて下さい。本当はモデルの軽量化までチャレンジしたかったのですが、環境・難易度・かかる時間含めて挫折いたしました…チャレンジしたい猛者は是非！

　Raspberry Piでの応用例などは、ブログで公開していますので興味ある方はこちらもどうぞ！

[Raspberry Piで作ったもの・やったことまとめ](https://karaage.hatenadiary.jp/entry/2015/09/10/073000)

# 追記
　本記事の続きの記事です。

[最速のディープラーニングモデルを求めて「PINTO_model_zoo」を探検してみる](https://qiita.com/karaage0703/items/97e7b1fc3bf8395f1c1d)

# PINTOさん記事・リポジトリ
[RaspberryPi4/3のCPUで爆速DeepLearning (レアデバイスもあるよ)](https://qiita.com/PINTO/items/3a96aa60e9974bc64d5a)

[Tensorflowのトレーニング済み.pb又はcheckpointからFull Integer Quantization(整数量子化)を施した軽量モデル(.tflite)を生成し、更にRaspberryPi4へUbuntu19.10 aarch64(64bit)を導入してCPUのみで高速に推論する](https://qiita.com/PINTO/items/1312d308b553362a8ebf)


# 参考リンク
- https://stackoverflow.com/questions/29938829/python-face-detection-raspberry-pi-with-picamera
- https://teratail.com/questions/250274