Raspberry Pi 4にEdge TPUを付けて動かす

# 概要
ラズパイ4にEdge TPUを付けて、公式のサンプルを動かすまでにすることを書いてます。

最終的には、サンプルコードの物体分類が4.4msでできました。（早すぎないか...？

# 準備
用意するもの

- ラズベリーパイ4本体
- 5V3A USB Type-C 電源用ケーブル
- ストレージ用microSDカード
- Coral USB Accelerator (Edge TPU)

# OSをSDカードに焼く
### ダウンロード
https://www.raspberrypi.org/downloads/raspbian/
ここからOSのイメージをzipで落としてきます。
Raspbian Busterにはfull, desktop, liteの3種類がありますが、今回はliteを使います。

### 焼く
https://www.balena.io/etcher/
を使って用意したmicroSDに、先ほどダウンロードした`.img`ファイルを書き込んでいきます。
Validationに成功したら、SDカードは勝手にアンマウントされます。
が、もう一度マウントしてください。やることが残っています。

# 事前設定
### SSHの有効化
ヘッドレス起動（画面無し起動）をするには、SSHの有効化は必要です。
bootパーティション内に、`ssh`という名前のファイルを作成します。
拡張子は無くても、.txtなどでも大丈夫です。

`ssh`という名前のファイルがある場合、sshがboot時から有効になります。

### Wifiの設定
bootパーティション内に`wpa_supplicant.conf`という名前のファイルを作ると、boot時にしかるべき場所にコピーしてくれます。
`wpa_supplicant.conf`には主にWifiのSSIDと、パスワードの組み合わせを書いていく形になります。

https://mascii.github.io/wpa-supplicant-conf-tool/
ここに、パスワードを暗号化しつつ`wpa_supplicant.conf`を自動生成してくれるツールがあるので、これを使うといいと思います。

# 起動
ラズパイに必要な場合hdmiケーブルを接続しモニタにつなげます。
マウス、キーボード、有線LANなどの周辺機器も電源を入れる前に接続してください。
ただし、Edge TPUはまだ接続しないでください。

全て繋ぎ終えたら、ラズパイに電源ケーブルを刺します。

# SSHで接続
あなたのパソコンが`mDNS`に対応しているか確認してください。
この辺の記事とかに色々書いてあります。私は2019/12/10時点で最新のwindows10を使っているのですが、ファイアーウォールの設定などをせずともできました。

https://qiita.com/maccadoo/items/48ace84f8aca030a12f1
この記事が参考になるかも

mDNSが使える場合、`raspberrypi.local`がラズパイのIPアドレスを表すので

```bash
>ssh pi@raspberrypi.local
```

初期起動時はユーザー名`pi`、パスワードは`raspberry`です。

# 設定とか
- `passwd`コマンドでパスワードを変更しましょう。
- 好きなエディタとか入れましょう。
- `.bashrc`の`HISTSIZE`と`HISTFILESIZE`をお好みで変更しましょう。
- gitを入れましょう。

```bash
>sudo apt install git
```

`raspi-config`コマンドで色々設定できます。地域をJPにする以外はお好みで。

```bash
>sudo raspi-config
```

後は適当に更新しましょう。

```bash
>sudo apt update
>sudo apt upgrade
```

# Edge TPU関連の設定
基本的にはhttps://coral.ai/docs/accelerator/get-started#1-install-the-edge-tpu-runtime に従ってやっていくので、コマンドだけ貼っておきます。

```bash
>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
```

ここまでやったら、Coral USB Acceleratorをラズパイに接続します。（やっとだ！

# Tensorflow Lite Libraryのインストール
ここがちょっとしんどかった😢。

まず`pip`を入れるのですが、`python-pip`(python2系)と`python3-pip`(3系)があるので気を付けてください。いれるのは3系のほうです。

```bash
>sudo apt install python3-pip
# バージョンチェック
>pip3 -V
```

そして、https://www.tensorflow.org/lite/guide/python#install_just_the_tensorflow_lite_interpreter にアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212534/55b06b98-d6bf-cbb5-8b8a-d8f9651a8195.png)

このように、様々なアーキテクチャにビルド済みのtensorflow lite interpreterだけを切り離したライブラリがあるのでpipを使ってインストールします。（推論以外もしたい場合は、普通のtensorflowを入れてください）

念の為アーキテクチャの再確認をします。

```bash
>uname -a
# Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux
>python3 --verison
# Python 3.7.3
```

よって、上の画像の左下のARM32,Python3.7のwhlをダウンロードします。そして、pipでそのファイルを使ってライブラリをインストールします。

```bash
pip3 install tflite_runtime-1.14.0-cp37-cp37m-linux_armv7l.whl
```

# サンプルを動かす
https://coral.ai/docs/accelerator/get-started#2-install-the-tensorflow-lite-library に従ってコンソールを叩いていきます。

```bash
>mkdir coral && cd coral

>git clone https://github.com/google-coral/tflite.git

>cd tflite/python/examples/classification

>bash install_requirements.sh
```
最後の`bash install_requirements.sh`でエラーになった場合、必要なライブラリが入っていないことによるエラーだと思います。

私は

```bash
sudo apt-get install libjpeg-dev
sudo apt install libatlas-base-dev
```
を入れ、もう一度実行してみたところ上手くいきました。

# 実行結果

```bash
>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
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.
17.2ms
4.4ms
4.4ms
4.4ms
4.4ms
-------RESULTS--------
Ara macao (Scarlet Macaw): 0.76562
```
というわけで、なんと4.4msという驚異的な速度で物体分類ができました。

# see also
https://jyn.jp/raspbian-setup/
https://qiita.com/shuichiro/items/d9e388fad3a00dbd4028