ラズパイ4でCoral USB Acceleratorを使ってみる。

# ラズパイ4でCoral USB Acceleratorを使ってみる。

以下の記事では、秋月とマルツで販売中と書かれていましたが、僕は千石電子で購入してきました。
どんなものかは、この記事を読んでください。
[Raspberry Piで使える「Google Coral Edge TPU USB Accelerator」が店頭販売中](https://akiba-pc.watch.impress.co.jp/docs/news/news/1204639.html)

## 構成
### ハードウェア
* Raspberry Pi 4 8G
* [SSD](https://www.buffalo.jp/product/detail/ssd-psm250u3-mb.html)
* [カメラ](https://www.iodata.jp/product/pc/raspberrypi/ud-rpcamera/index.htm)
* [冷却FAN](https://www.amazon.co.jp/gp/product/B07WK6VHWT/)

![107510833_986999821733753_115309040864084857_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/e7e540fd-c497-878f-9dac-c9282533c7d6.jpeg)

### OS
[Raspberry Pi OS 64bit](https://www.raspberrypi.org/forums/viewtopic.php?f=117&t=275370)

TESTバージョンなので、もちろんまだ安定していません。
2020/07/11で30ほどオープンのステータスになっています。
[issues](https://github.com/raspberrypi/Raspberry-Pi-OS-64bit/issues)


## Coral USB Acceleratorのセットアップ

* 参考ページ
    * [Get started with the USB Accelerator](https://coral.ai/docs/accelerator/get-started/)

### Debian用パッケージリポジトリをシステムに追加

```
$ echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
deb https://packages.cloud.google.com/apt coral-edgetpu-stable main
$ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   653  100   653    0     0   4296      0 --:--:-- --:--:-- --:--:--  4296
OK
$ sudo apt-get update
ヒット:1 http://archive.raspberrypi.org/debian buster InRelease
ヒット:2 http://deb.debian.org/debian buster InRelease
取得:3 http://deb.debian.org/debian-security buster/updates InRelease [65.4 kB]
ヒット:4 http://deb.debian.org/debian buster-updates InRelease
取得:5 https://packages.cloud.google.com/apt coral-edgetpu-stable InRelease [6,332 B]
取得:6 https://packages.cloud.google.com/apt coral-edgetpu-stable/main armhf Packages [1,170 B]
取得:7 https://packages.cloud.google.com/apt coral-edgetpu-stable/main arm64 Packages [1,170 B]
74.0 kB を 2秒 で取得しました (35.4 kB/s)
パッケージリストを読み込んでいます... 完了
```

### Edge TPU Runtimeをインストール

```
$ sudo apt-get install libedgetpu1-std
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  libedgetpu1-std
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
252 kB のアーカイブを取得する必要があります。
この操作後に追加で 880 kB のディスク容量が消費されます。
取得:1 https://packages.cloud.google.com/apt coral-edgetpu-stable/main arm64 libedgetpu1-std arm64 14.1 [252 kB]
252 kB を 0秒 で取得しました (680 kB/s)
以前に未選択のパッケージ libedgetpu1-std:arm64 を選択しています。
(データベースを読み込んでいます ... 現在 93370 個のファイルとディレクトリがインストールされています。)
.../libedgetpu1-std_14.1_arm64.deb を展開する準備をしています ...
libedgetpu1-std:arm64 (14.1) を展開しています...
libedgetpu1-std:arm64 (14.1) を設定しています ...
libc-bin (2.28-10) のトリガを処理しています ...
```

### ラズパイとCoreal USB Acceleratorを接続
すでに接続指定場合は、抜いて、再度接続する。

このあとオプションで最大クロック周波数で動作させるためのパッケージのインストールの記述があったが今回はインストールせずに次へ。

### TensorFlow Liteライブラリのインストール
[TensorFlow Lite Python quickstart](https://www.tensorflow.org/lite/guide/python)から自分のマシンにインストールされているPythonのバージョンに合わせたものをインストールする。

```
$ python3 -V
Python 3.7.3
```

で、64bit OSなので、

```
$ pip3 install https://dl.google.com/coral/python/tflite_runtime-2.1.0.post1-cp37-cp37m-linux_aarch64.whl
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting tflite-runtime==2.1.0.post1 from https://dl.google.com/coral/python/tflite_runtime-2.1.0.post1-cp37-cp37m-linux_aarch64.whl
  Downloading https://dl.google.com/coral/python/tflite_runtime-2.1.0.post1-cp37-cp37m-linux_aarch64.whl (1.9MB)
    100% |????????????????????????????????| 1.9MB 276kB/s
Requirement already satisfied: numpy>=1.12.1 in /usr/lib/python3/dist-packages (from tflite-runtime==2.1.0.post1) (1.16.2)
Installing collected packages: tflite-runtime
Successfully installed tflite-runtime-2.1.0.post1
```

### TensorFlow Lite APIのサンプルを実行してみる。
#### サンプルをGitHubからダウンロード

```
$ mkdir coral && cd coral
$ git clone https://github.com/google-coral/tflite.git
Cloning into 'tflite'...
remote: Enumerating objects: 65, done.
remote: Counting objects: 100% (65/65), done.
remote: Compressing objects: 100% (34/34), done.
remote: Total 193 (delta 23), reused 59 (delta 19), pack-reused 128
Receiving objects: 100% (193/193), 675.91 KiB | 757.00 KiB/s, done.
Resolving deltas: 100% (69/69), done.```
```

#### bird classifier model、labels file、および鳥の写真をダウンロード

```
$ cd tflite/python/examples/classification
$ bash install_requirements.sh
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: numpy in /usr/lib/python3/dist-packages (1.16.2)
Requirement already satisfied: Pillow in /usr/lib/python3/dist-packages (5.4.1)
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   189  100   189    0     0    334      0 --:--:-- --:--:-- --:--:--   334
100 3972k  100 3972k    0     0  1938k      0  0:00:02  0:00:02 --:--:-- 5765k
100   181  100   181    0     0    354      0 --:--:-- --:--:-- --:--:--   354
100 3448k  100 3448k    0     0  2577k      0  0:00:01  0:00:01 --:--:-- 9686k
100   158  100   158    0     0    558      0 --:--:-- --:--:-- --:--:--   558
100 40895  100 40895    0     0  44596      0 --:--:-- --:--:-- --:--:-- 7987k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   148  100   148    0     0    425      0 --:--:-- --:--:-- --:--:--   425
100  582k  100  582k    0     0   434k      0  0:00:01  0:00:01 --:--:--  753k
```

#### 鳥の写真を使用してイメージ分類を実行


```
$ 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
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
17.6ms
4.5ms
4.4ms
4.4ms
4.4ms
-------RESULTS--------
Ara macao (Scarlet Macaw): 0.77734
```
この写真の鳥が、0.77734%の確率でコンゴウインコと推測されました。
サンプルのページより確率が少し上がっているのはどうしてなんだろう。(^^;;

![parrot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/fde4eb72-b2b9-6fe9-175c-def9112323dd.jpeg)

少し鳥の画像をもってきて読み込ませてみようっと。

[PAKUTASO](https://www.pakutaso.com/animal/bird/)から鳥のフリー画像をダウンロードして試してみた。
ここにアップしている画像はリサイズして小さくしています。

### あひる
![0001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/5af76bc6-4a37-f8da-0aef-1d2973d5f9c0.jpeg)

```
$ python3 classify_image.py --model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels models/inat_bird_labels.txt --input images/0001.jpg
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
19.5ms
4.5ms
4.4ms
4.4ms
4.4ms
-------RESULTS--------
Anas platyrhynchos domesticus (Domestic Duck): 0.95703
```
アヒル

### だちょう
![0002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/f78dc914-dfd8-ac8c-efeb-962c89fef985.jpeg)

```
$ python3 classify_image.py --model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels models/inat_bird_labels.txt --input images/0002.jpg
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
17.6ms
4.4ms
4.4ms
4.4ms
4.4ms
-------RESULTS--------
Struthio camelus (Common Ostrich): 0.87500
```
ダチョウ

### ふくろう
![0003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/8d598ec2-6ba7-3074-8065-d029fb628ce7.jpeg)

```
$ python3 classify_image.py --model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels models/inat_bird_labels.txt --input images/0003.jpg
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
17.6ms
4.4ms
4.4ms
4.4ms
4.4ms
-------RESULTS--------
Strix nebulosa (Great Gray Owl): 0.74609
```
カラフトフクロウ

### ふらみんご
![0004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/1768bc5d-1106-6e9f-81e5-c6c16dade751.jpeg)

```
$ python3 classify_image.py --model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels models/inat_bird_labels.txt --input images/0004.jpg
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
17.6ms
4.4ms
4.4ms
4.4ms
4.4ms
-------RESULTS--------
Phoenicopterus roseus (Greater Flamingo): 0.72656
```
オオフラミンゴ

### はしびろこう
![0005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/787bd077-0cae-41f4-b0a6-fccce7a0d7b4.jpeg)

```
$ python3 classify_image.py --model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels models/inat_bird_labels.txt --input images/0005.jpg
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
17.6ms
4.5ms
4.4ms
4.4ms
4.4ms
-------RESULTS--------
Ardea herodias (Great Blue Heron): 0.28906
```
オオアオサギ

### はと
![0006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/99100a69-42df-264b-da00-5cf05073fc8c.jpeg)

```
$ python3 classify_image.py --model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels models/inat_bird_labels.txt --input images/0006.jpg
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
17.7ms
4.4ms
4.4ms
4.4ms
4.3ms
-------RESULTS--------
Columba livia (Rock Pigeon): 0.66797
```
イワバト

### かも
![0007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/c15e6e9f-5421-4c65-da77-8e4110e8c38c.jpeg)

```
$ python3 classify_image.py --model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels models/inat_bird_labels.txt --input images/0007.jpg
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
18.3ms
4.5ms
4.5ms
4.5ms
4.5ms
-------RESULTS--------
Tadorna tadorna (Common Shelduck): 0.21094
```
ツクシガモ

### かもめ
![0008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/a46d94a7-f022-b310-a59b-1139e417e441.jpeg)

```
$ python3 classify_image.py --model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels models/inat_bird_labels.txt --input images/0008.jpg
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
17.8ms
4.4ms
4.3ms
4.4ms
4.4ms
-------RESULTS--------
Larus fuscus (Lesser Black-backed Gull): 0.39062
```
ニシセグロカモメ

### からす
![0009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/60ff4b5b-ba56-a2b4-0c22-5617501a9237.jpeg)

```
$ python3 classify_image.py --model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels models/inat_bird_labels.txt --input images/0009.jpg
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
17.7ms
4.4ms
4.4ms
4.5ms
4.4ms
-------RESULTS--------
Corvus brachyrhynchos (American Crow): 0.17578
```
アメリカガラス

### めじろ
![0010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/2ba5cb46-2b76-b758-ca69-dbb58692f732.jpeg)

```
$ python3 classify_image.py --model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels models/inat_bird_labels.txt --input images/0010.jpg
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
17.9ms
4.5ms
4.4ms
4.4ms
4.4ms
-------RESULTS--------
Zosterops japonicus (Japanese White-eye): 0.96094
```
メジロ

### にわとり
![0011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/78aed089-844f-7b28-bd88-1913848bad27.jpeg)

```
$ python3 classify_image.py --model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels models/inat_bird_labels.txt --input images/0011.jpg
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
17.5ms
4.4ms
4.3ms
4.4ms
4.3ms
-------RESULTS--------
Circus cyaneus (Northern Harrier): 0.45312
```
ハイイロチュウヒ

### ぺんぎん
![0012.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/05823c51-e010-593b-719e-271a51728730.jpeg)

```
$ python3 classify_image.py --model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels models/inat_bird_labels.txt --input images/0012.jpg
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
20.4ms
4.5ms
4.4ms
4.4ms
4.4ms
-------RESULTS--------
Megadyptes antipodes (Yellow-eyed Penguin): 0.29297
```
キンメペンギン

12種類の画像をテストして大きく外れたのはハシビロコウとニワトリですかね。