Raspberry piとedge TPUでしゃべるカメラを作った

#始めに

Googleが出した[Coral USB accelerator](https://coral.ai/)は、edge TPUというgoogleが開発するディープラーニングアクセラレータTPUのエッジコンピューティング版というチップを搭載したアクセラレータです。USB接続なので、raspberry piなどに手軽に接続してディープラーニングの行列乗算を爆速にします。今回はedge TPUを体感できるデモとして以前作ってみた、しゃべるカメラについて作成方法を公開いたします。

#参考サイト

[Google Coral USB accelerator](https://coral.ai/)

[edge TPU環境のインストール](https://coral.ai/software/)

[edge TPUのモデル](https://coral.ai/models/)

[Raspberry piで日本語音声合成(Open JTalk)を試してみる。](https://qiita.com/lutecia16v/items/8d220885082e40ace252)

[Raspberry Piでプログラムを自動起動する5種類の方法を比較・解説](https://qiita.com/karaage0703/items/ed18f318a1775b28eab4)

#目次


#準備するもの

- raspberry pi 2/3 raspbianがインストールされているもの
- Google Coral USB Accelerator ( Edge TPU )
- raspberry pi 用カメラモジュール
- 外付けスピーカー
- raspberry pi 用ディスプレイモジュール　本体接続でGPIOが引き出せるもの

![IMG_20200302_103541.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/9bbdd51a-85e8-139c-65e0-277aedfdd68d.jpeg)


- GPIOボタン2個　押すとGPIOとGNDをショートするもの。シャッターとシャットダウンボタンに使用します。写真のようにボタンに線を２本取り付け、一方はGPIO、もう一方はGNDに接続します。自作しています。

![IMG_20200303_151323.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/2c077244-57d8-4884-803d-0987a3171043.jpeg)


#作成

### raspbianセットアップ
　今回はraspberry piではメジャーなraspbianを使いました。バージョンは最新のbusterを使用。基本的にDebianであれば同じレシピが使えるはずなので、以前のバージョンや、ubuntuでも動作すると思います（未確認）。
　raspbianのセットアップはnobosでもイメージファイルのセットアップどちらでも可能です。タイプはdesktopでもliteでも可能です。ネットワーク接続は、有線、無線どちらでも構いません。最終的にスタンドアロンで使用いたします。今回は、raspberry pi 3にbusterのliteをイメージファイル書き込みで作成し、有線でssh接続でセットアップしました。この場合、イメージファイル書き込み直後にbootフォルダにsshという名前の空ファイルかフォルダを作成しておくと、そのままsshで接続でき、ディスプレイ無しでのセットアップができます。
　インストール直後はupdateとupgradeを必ずしましょう。

```
 $ sudo apt update
 $ sudo apt upgrade
```

この状態からセットアップを行います。

#Edge TPUのセットアップ
　まずは今回メインのデバイスとなるEdge TPUのセットアップを行います。以前は環境ファイル一式をダウンロードしてインストールする形式でしたが、現在はaptでインストールが可能なようになり、手軽に環境構築ができるようになりました。
セットアップは[このページ](https://coral.ai/software/)に従って行います。まずレポジトリの追加を行います。

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

これでEdge TPUの環境がインストールできます。Edge TPUの実行環境、python環境、テストのためのexampleをインストールします。

```
 $ sudo apt install libedgetpu1-max
 $ sudo apt install python3-edgetpu
 $ sudo apt install edgetpu-examples
 $ cp -r /usr/share/edgetpu .
```

これでEdge TPUの環境が整いました。
ここでEdge TPUをraspberry piに接続して、再起動します。
再起動したら、テストをしてみます。

```
 $ cd ./edgetpu/examples
 $  python3 classify_image.py \
--model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \
--label models/inat_bird_labels.txt \
--image images/parrot.jpg
```

これで以下のような結果が出ればEdge TPUは動作しています。

```
---------------------------
Ara macao (Scarlet Macaw)
Score :  0.61328125
---------------------------
Platycercus elegans (Crimson Rosella)
Score :  0.15234375
```

###pythonの環境構築

　今回使用したインストールタイプがliteだったため、pipすら入っていない環境でした。よって、セットアップします。fullのバージョンでは、予め一部入っております。

```
 $ sudo apt install python3-pip python3-dev
 $ sudo pip3 install picamera RPi.gpio
 $ sudo pip3 install Pillow
```
###camaiのダウンロード
　今回作成したファイルをgithubで公開しています。一式ダウンロードします。liteで行う場合はgitが入っていないので、インストールしてから行います。

```
 $ sudo apt install git
 $ git clone https://github.com/yoshiki9636/camai
```
camaiディレクトリ中に、以下のファイルがあります。

camai.py　　　　：しゃべるカメラのpythonプログラム
test_camai.py　　：環境のテストプログラム
jsay.sh 　　　　　：Open Jtalk用スクリプト
categories_jp.txt　：Imagenetのラベルを日本語化したもの（お手製です）

camai内部で作業を行います。
今回しゃべるカメラで使用するモデルをダウンロードしておきます。

```
 $ cd camai/
 $ wget https://github.com/google-coral/edgetpu/raw/master/test_data/mobilenet_v2_1.0_224_quant_edgetpu.tflite
```
また、テストのための画像を１枚edgetpu/exampleからコピーしておきます。

```
 $ cp ../edgetpu/examples/images/cat.bmp .
```

テストを実行します。

```
 $ python3 test_camai.py
```
以下のようになれば実行成功です。

```
---------------------------
トラネコ
Score :  0.26171875
---------------------------
エジプト猫
Score :  0.234375
---------------------------
ジャガーネコ
Score :  0.1171875
elTime :  0.12408232688903809
ifTime :  121.68702697753906
```

###カメラのイネーブル
raspberry pi接続カメラのイネーブルをします。

```
 $ sudo raspi-config
```
メニューの中で
5 Interfacing Option -> P1 Camera
と選択し、Enableにして終了します。
終了時、再起動されます。

###Open Jtalkのインストール
日本語の発声にOpen Jtalkを使用します。レコメンドされるモデルと辞書もインストールします。

```
sudo apt install open-jtalk
sudo apt install hts-voice-nitech-jp-atr503-m001 open-jtalk-mecab-naist-jdic
```

camai/の中にjsay.shというスクリプトがあるので、実行権限を与えてテストを行います。

```
 $ chmod +x jsay.sh
 $ ./jsay.sh "おはよう"
```
「おはよう」とスピーカーから聞こえたら、テストOKです。

###全体の組み上げ
一度電源を落とし、Coral USB Accelerator、カメラ、ディスプレイ、スピーカー、GPIOボタン2個を接続し、立ち上げます。
GPIOボタンは、GPIO23にシャッターボタン、GPIO24にシャットダウンボタンを接続し、それぞれもう片方はどこかのGNDピンに接続します。

![IMG_20200303_153354.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/de0acf49-2d05-0c49-18a7-03a2d4fc309b.jpeg)

 動作テストをします。

```
 $ cd camai/
 $ mkdir image
 $ python3 camai.py
```

ディスプレイ画面全体がカメラの画像表示になります。
GPIOシャッターボタンを押すと、「カシャ」としゃべり、
しばらくすると「これはXXです」と写ったものをしゃべります。
試すのであれば、categories_jp.txt内でラベルとなっているものを試してください。

###自動起動化とシャットダウン
カメラとして単体で成立させるには、プログラムの自動起動が必要となります。[この記事](https://qiita.com/karaage0703/items/ed18f318a1775b28eab4)からsystemdを使った起動方法を選択しました。

まずcamai.serviceファイルを作成します。

```:camai.service
[Unit]
Description=cameraai
After=syslog.target

[Service]
Type=simple
WorkingDirectory=/home/pi/camai
ExecStart=/usr/bin/python3 /home/pi/camai/camai.py
TimeoutStopSec=5
StandardOutput=null

[Install]
WantedBy = multi-user.target
```
以下を実行します。

```
 $ sudo cp camai.service /etc/systemd/system
 $ sudo systemctl daemon-reload
 $ sudo systemctl start camai
 $ sudo systemctl enable camai
```
３行目実行時にcamai.pyを実行したときと同じ状態となっていれば、成功です。

あと、GPIO24のシャットダウン機能をオンします。camai.pyの最終行がコメントアウトされていますが、このコメントを外します。

```:camai.py(before)
#os.system("sudo shutdown -h now")
```

```:camai.py(after)
os.system("sudo shutdown -h now")
```

リブートしてもcamai.pyが立ち上がった状態となり、シャットダウンボタンでシャットダウンするようになります。

#最後に
小学生にちょっとデモする機会があったのですが、思いのほか受けが良かったのを覚えています。筆者はケースを作るのが苦手で、デモも100均のプラスチックケースに不細工な穴をあけて作っておりました。その辺識者おりましたら、教えを請いたいです。