ラズパイ4でEdgeTPUを使用する

## 概要
ようやく技適を取れたラズパイ4が購入出来るようになり、手に入れたので、動作確認がてらにUSB3.0搭載のラズパイ4でEdgeTPUを利用して速度を見たいと思います。この記事ではインストールまで。

## 他インストール記事との違い
他にも同じような記事がありますが、どれも公式手順ではインストールできなかったという報告が多くインストール方法が公式と少し異なっています。今回公式手順を改めて行ったところ(2019/12/03時点)特に問題なくインストールできましたので、メモしておきます。特に公式手順と変わらないのでそちらで問題ない人はそれが確実かと思います。

公式: https://coral.ai/docs/accelerator/get-started/

## 環境
* ラズパイ4 4GBメモリ
* OS: Raspbian Buster

## インストール


### Edge TPU runtimeをインストール
Edge TPUを既に挿している人はinstall後、udevのルールを有効化するため一度抜き差し必要です。

公式: https://coral.ai/docs/accelerator/get-started/

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

### Tensoflow Lite Libraryのインストール
こちらをインストールすることでラズパイにTensoflowをいれずに最小構成のTensorflow Liteの実行環境をインストールできます。
今回RaspbianのBusterということでデフォルトのPython環境がPython3.7環境となっています。ARM32のPython3.7のwhlを取得してきてインストールします。

参考: https://www.tensorflow.org/lite/guide/python

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

### サンプル動作
これで準備は完了です。一瞬で環境準備できました。いつものインコ画像のサンプルを動作させます。

サンプルをgitからダウンロード

```sh
mkdir coral && cd coral

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

必要なものをインストール

```sh
cd tflite/python/examples/classification

bash install_requirements.sh
```

サンプルの画像分類を動作させる

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

以下が出力されればOKです。

```
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.
11.8ms
3.0ms
2.8ms
2.9ms
2.9ms
-------RESULTS--------
Ara macao (Scarlet Macaw): 0.76562
```

### Edge TPU Python APIのインストール
上記のサンプルはTensorFlow Lite APIからの利用までだとこれでOK。より抽象化されたAPI(簡単に書ける)のEdge TPU Python APIのインストールも行う場合は以下でインストールする。

参考: https://coral.ai/docs/edgetpu/api-intro/

```sh
sudo apt-get update

sudo apt-get install python3-edgetpu
```


### その他
EdgeTPUの動作を確認するのにOpenCVを入れて画像認識系をお試しに動かそうとしたが、OpenCVのVideoCaptureがGstreamerのエラーで動作しない状態となり結構ハマったのでこちらもメモっておく。

[ラズパイ: Buster向け OpenCV4](https://qiita.com/mt08/items/4e8c36ee398fea5ed8d9)
→いつもお世話になっているdebパッケージインストールだけど、今回うまく動かなかった。(指定したバージョンが悪かったのかもしれないが...)

以下エラー内容:

```
[ WARN:0] global /home/pi/opencv-4.1.2/modules/videoio/src/cap_gstreamer.cpp (1757) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Failed to allocate required memory.
[ WARN:0] global /home/pi/opencv-4.1.2/modules/videoio/src/cap_gstreamer.cpp (886) open OpenCV | GStreamer warning: unable to start pipeline
[ WARN:0] global /home/pi/opencv-4.1.2/modules/videoio/src/cap_gstreamer.cpp (480) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created
```


以下のURL先にあるインストール方法を行うことで問題発生しなくなった。

[Install OpenCV 4 on Raspberry Pi 4 and Raspbian Buster](https://www.pyimagesearch.com/2019/09/16/install-opencv-4-on-raspberry-pi-4-and-raspbian-buster/)


## 最後に
こういった新しめの環境構築はナマモノですので、いつまで公式の方法で簡単にインストール出来るかはわかりませんが、少なくとも私はこれで動作しました。やはり自分で公式のものを試してどこで詰まるかなどは確認しておたほうが良いですね。