Raspi 3 + USB Accelerator で画像分類&物体検出

Raspberry Piと[USB Accelerator](https://coral.withgoogle.com/products/accelerator)を使って
画像分類と物体検出をしてみました。

行ったのは、公式の[スタートガイド](https://coral.withgoogle.com/docs/accelerator/get-started/)です。

# 環境
- Raspberry Pi 3 Model B+
- ubuntu mate

# Raspberry Pi のセットアップ
Edge TPU runtimeとPythonライブラリをインストールします

```
$ cd ~/
$ wget https://dl.google.com/coral/edgetpu_api/edgetpu_api_latest.tar.gz -O edgetpu_api.tar.gz --trust-server-names
$ tar xzf edgetpu_api.tar.gz
$ cd edgetpu_api
$ bash ./install.sh
```

`install.sh`を実行すると`Would you like to enable the maximum operating frequency?`と聞かれます。
最大でパフォーマンスでUSB Acceleratorを使うと、USB Acceleratorがとても熱くなり、やけどするかもしれないので、
最大パフォーマンスが必要かどうか分からないなら`N`にしろ、とのことです。
この設定は後からでも変えられるそうです。

# デモの実行
## 画像分類
### サンプルデータをダウンロード
```
cd ~/Downloads/

wget https://dl.google.com/coral/canned_models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \
https://dl.google.com/coral/canned_models/inat_bird_labels.txt \
https://coral.withgoogle.com/static/images/parrot.jpg

```
ラズパイを日本語で設定している方は`Downloads`というディレクトリがないと思います。
その場合は、適当なディレクトリでよいです。

### デモの実行
```
$ cd /usr/local/lib/python3.5/dist-packages/edgetpu/demo

$ python3 classify_image.py \
--model ~/Downloads/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \
--label ~/Downloads/inat_bird_labels.txt \
--image ~/Downloads/parrot.jpg
```
`model``label``image`のファイルパスは、ダウンロード先に合わせて変更してください。
実行に成功すると、以下のような出力がされます。

```
Ara macao (Scarlet Macaw)
Score :  0.746094
```

## 物体検出
### サンプルデータをダウンロード
```
cd ~/Downloads/

wget https://dl.google.com/coral/canned_models/mobilenet_ssd_v2_face_quant_postprocess_edgetpu.tflite \
 https://coral.withgoogle.com/static/images/face.jpg
```

## デモの実行
```
$ cd /usr/local/lib/python3.5/dist-packages/edgetpu/demo

$ python3 classify_image.py \
--model ~/Downloads/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \
--label ~/Downloads/inat_bird_labels.txt \
--image ~/Downloads/parrot.jpg
```

もし実行エラーとなって`No such file or directory: 'feh'`というメッセージが表示されたら
`sudo apt-get install feh`としてから、再実行してください。

以下のような表示がされば成功です。

```
-----------------------------------------
score =  0.996094
box =  [471.33392310142517, 38.03488787482766, 741.695974111557, 353.5309683683231]
-----------------------------------------
score =  0.996094
box =  [209.30670201778412, 114.17187392981344, 491.6300288438797, 443.6261138225572]
-----------------------------------------
score =  0.832031
box =  [7.304725393652916, 184.98179422784176, 128.21268820762634, 326.07404544882104]
-----------------------------------------
score =  0.5
box =  [858.2628228664398, 211.6830582424526, 1007.3986599445343, 385.80091726725993]
```

![detection_result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293692/18da8cd4-ff2b-2c82-4e05-ba27ef4a5432.jpeg)

## リアルタイム画像分類 & 物体検出
ラズパイ用カメラやUSBカメラから取得した画像に対して、リアルタイムで画像分類&物体検出ができるデモもあります。

### デモ用プログラムの取得
```
$ git clone https://github.com/google-coral/examples-camera.git
```

### サンプルデータをダウンロード
```
cd ~/Downloads/

# 物体分類用
wget https://dl.google.com/coral/canned_models/mobilenet_v2_1.0_224_quant_edgetpu.tflite \
 https://dl.google.com/coral/canned_models/imagenet_labels.txt

# 物体検出用
wget https://dl.google.com/coral/canned_models/mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite \
 https://dl.google.com/coral/canned_models/coco_labels.txt
```
### ラズパイカメラでの画像分類
事前にカメラが使えるよう`pip3 install picamera`と`raspi-config`でカメラを有効にしてください。

```
$ cd examples-camera/raspicam
$ python3 classify_capture.py --model ~/Downloads/mobilenet_v2_1.0_224_quant_edgetpu.tflite --labels ~/Downloads/imagenet_labels.txt
```
ウィンドウに画像が表示され、画面の上部に分類結果などが表示されれば成功です。

### USBカメラによる画像分類
実行前に、`gstream`などのインストールをする必要があります。

```
$ cd examples-camera/gstreamer
$ sh install_requirements.sh
```

実行

```
$ cd examples-camera/gstreamer
$ python3 classify_capture.py --model ~/Downloads/mobilenet_v2_1.0_224_quant_edgetpu.tflite --labels ~/Downloads/imagenet_labels.txt
```
こちらもウィンドウに画像が表示され、画面の上部に分類結果などが表示されれば成功です。

### USBカメラによる物体検出
```
$ cd examples-camera/gstreamer
$ python3 classify_capture.py --model ~/Downloads/mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite --labels ~/Downloads/coco_labels.txt
```
ウィンドウに画像が表示され、物体検出の結果であるバウンディングボックスなどが表示されれば成功です。
こちらの環境では、たまに飛ぶことがあるものの、約5fpsくらいで動作しました。

# 他のサンプルデータ
[ここのREADME](https://github.com/google-coral/examples-camera)の一番下に、サンプルデータの一覧が記載してあります。