Raspberry Pi4とCoral USB Acceleratorで行う機械学習

# はじめに
本記事はエッジデバイスで機械学習を行う方法として、Raspberry Pi4とCoral USB Acceleratorの導入手順についてまとめています。

**Raspberry Pi4**は現行機種の最新世代になります。CPUやメモリ性能が大幅に向上し、USB3.0にも対応しています。

![写真 2020-02-17 0 31 29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/f0ad30f1-4f30-b877-3dfc-39b17e0f32af.jpeg)

**Coral USB Accelerator**はGoogleがエッジデバイスで機械学習を行うために開発したGoogleの専用[ASIC](https://ja.wikipedia.org/wiki/ASIC)です。

![写真 2019-12-30 0 02 35.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/196aac58-6078-e4c1-bb63-42b65b0da166.jpeg)

この専用ASICはEdge TPUと言われ、エッジで推論を行うことに特化したTensorFlow Liteのフレークワークが利用できます。なお、TensorFlow Liteのフレークワーク以外はサポートしていません。また、Coral USB Acceleratorの性能を最大限に発揮するためには、USB3.0の接続が必要です。要約するとCoral USB Acceleratorの性能を引き出すのにRaspberry Pi4は最適です。

## Raspberry Pi4
公式サポートではないですがGoogleからEdge TPUを使用するために、**EdgeTPU Platforms**というコンパイル済みのRaspbery Piのイメージが用意されています。

学習済みの画像分類モデルなどが組み込まれているため、Raspberry Piで機械学習を行うのに役にたつでしょう。

EdgeTPU Platformsから、Raspberry Pi 4のイメージを利用する手順について解説します。

なお、Raspberry Pi 4の留意事項として、電源が**USB Type-C**、HDMIは**Micro HDMI**とインターフェースが変更されているのでご注意ください。

### EdgeTPU Platforms
1. [google-coral/edgetpu-platforms](https://github.com/google-coral/edgetpu-platforms)から、**Raspberry Pi 4, Buster, Edgetpu 2.11.1**のイメージをダウンロードします。
2. ダウンロードしたイメージをSDカードに書き込みます。SDカードへの書き込み方法については以前書いた[Raspberry Pi の基本](https://qiita.com/Brutus/items/1683b5b3eac929047d12)を参照。
3. SDカードへの書き込み終了後、Raspberry Piを起動し、初期セットアップを行います。

**ダウンロードしたイメージで起動した場合は、ファイルシステムをSDカードのサイズに合わせて拡張を行う必要があります。**

### ファイルシステム拡張
ファイルシステム拡張前のシステム領域（/）は以下の状態となっています。

```console
pi@raspberrypi:~ $ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root        3.3G  3.0G  100M   97% /
devtmpfs         1.8G     0  1.8G    0% /dev
tmpfs            1.9G     0  1.9G    0% /dev/shm
tmpfs            1.9G  8.6M  1.9G    1% /run
tmpfs            5.0M  4.0K  5.0M    1% /run/lock
tmpfs            1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mmcblk0p1   253M   41M  213M   16% /boot
tmpfs            386M     0  386M    0% /run/user/1000
```

以下のコマンドを実行し、`raspi-config`を起動し対話的に操作を行います。

`$ sudo raspi-config`

![スクリーンショット 2019-12-30 17.38.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/b13a0d4d-e86f-5cd0-cbc3-331b793fd8b0.png)

はじめに**「7 Advanced Options」**を選択します。

![スクリーンショット 2019-12-30 17.38.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/6c271980-2bf8-2fe6-cda2-475e3169ccc7.png)

つぎに「A1 Expand Filesystem」を選択します。

![スクリーンショット 2019-12-30 17.38.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/9eba4a29-4253-bcb1-d177-be6f2662d72a.png)

了解を押下します。

![スクリーンショット 2019-12-30 17.39.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/a7c930e2-0b1d-4224-c730-5b1e880f3aa8.png)

以下のコマンドを実行し、再起動を行います。

`$ sudo systemctl reboot`

再起動後、システム領域（/）が拡張されていることが確認できます。

```concole
pi@raspberrypi:~ $ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root         29G  3.1G   24G   12% /
devtmpfs         1.8G     0  1.8G    0% /dev
tmpfs            1.9G     0  1.9G    0% /dev/shm
tmpfs            1.9G  8.6M  1.9G    1% /run
tmpfs            5.0M  4.0K  5.0M    1% /run/lock
tmpfs            1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mmcblk0p1   253M   41M  213M   16% /boot
tmpfs            386M     0  386M    0% /run/user/1000
```
## Coral USB Accelerator
Coral USB Acceleratorを使うためには、以下の作業が必要になります。

- [x] Edge TPUランタイムのインストール
- [x] TensorFlow Liteライブラリのインストール

Edge TPUと通信するには、Edge TPUランタイムをインストールします。
また、TensorFlow LiteをPythonで使用するためにライブラリ等が必要になります。本記事では、PythonでTensorFlow Liteモデルを使用するのに簡単なtflite_runtimeライブラリをインストールします。

### 準備作業
Coral USB Acceleratorの入っている箱を開封します。

![写真 2019-12-30 17 08 16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/462722ed-a8dd-1157-ddd7-2aca709ce7a9.jpeg)

Raspberry Pi4にCoral USB Acceleratorを接続します。
USB3.0は**<font color="Blue">青色</font>**のインターフェースになります。

![写真 2020-02-16 23 52 49.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/086d1844-6c73-1ada-844d-2556fda0b7ba.jpeg)

### Edge TPU runtimeのインストール

- リポジトリの追加
`$ echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list`
`$ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -`
`$ sudo apt-get update`

- インストール
`$ sudo apt-get install libedgetpu1-std`

### TensorFlow Liteライブラリのインストール

- ライブラリのダウンロード
`$ wget https://dl.google.com/coral/python/tflite_runtime-1.14.0-cp37-cp37m-linux_armv7l.whl`

- ライブラリのインストール
`$ pip3 install tflite_runtime-1.14.0-cp37-cp37m-linux_armv7l.whl`

## TensorFlow Lite APIの実行
[Get started with the USB Accelerator](https://coral.ai/docs/accelerator/get-started/#3-run-a-model-using-the-tensorflow-lite-api)を参考に、画像分類機を実行してみましょう。

`$ python3 classify_image.py --model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels models/inat_bird_labels.txt --input images/parrot.jpg`

```console
INFO: Initialized TensorFlow Lite runtime.
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
18.6ms
4.6ms
4.6ms
4.6ms
4.6ms
-------RESULTS--------
Ara macao (Scarlet Macaw): 0.76562
```

TensorFlow Liteを使用して、Edge TPUで推論を実行しました。
ちなみにUSB2.0で実行した場合の出力結果は以下になります。USB3.0に比べて遅いのが分かります。

```console
INFO: Initialized TensorFlow Lite runtime.
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
120.5ms
11.5ms
11.5ms
11.7ms
11.6ms
-------RESULTS--------
Ara macao (Scarlet Macaw): 0.76562
```

# おわりに
これでエッジデバイスで機械学習ができます。

次はTensorFlowでモデルを作成し、モデルをTensorFlow Liteに変換します。

## 参考
- [raspi-config](https://www.raspberrypi.org/documentation/configuration/raspi-config.md)
- [Frequently asked questions](https://coral.ai/docs/edgetpu/faq/)
- [Edge TPU Devices](https://aiyprojects.withgoogle.com/edge-tpu)
- [Get started with the USB Accelerator](https://coral.ai/docs/accelerator/get-started/)
- [USB Accelerator datasheet](https://coral.ai/docs/accelerator/datasheet/)
- [Python quickstart](https://www.tensorflow.org/lite/guide/python)
- [Get started with TensorFlow Lite](https://www.tensorflow.org/lite/guide/get_started)
- [Quantization-aware training](https://github.com/tensorflow/tensorflow/tree/r1.15/tensorflow/contrib/quantize)
- [Post-training quantization](https://www.tensorflow.org/lite/performance/post_training_quantization)
- [TensorFlow Lite converter](https://www.tensorflow.org/lite/convert)
- [Edge TPU Compiler](https://coral.ai/docs/edgetpu/compiler/)
- [TensorFlow models on the Edge TPU](https://coral.ai/docs/edgetpu/models-intro/)
- [Models](https://coral.ai/models/)