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


始めに

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

参考サイト

Google Coral USB accelerator

edge TPU環境のインストール

edge TPUのモデル

Raspberry piで日本語音声合成(Open JTalk)を試してみる。

Raspberry Piでプログラムを自動起動する5種類の方法を比較・解説

目次

準備するもの

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

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

作成

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でインストールが可能なようになり、手軽に環境構築ができるようになりました。
セットアップはこのページに従って行います。まずレポジトリの追加を行います。

 $ 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

また、テストのための画像を1枚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ピンに接続します。

動作テストをします。

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

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

自動起動化とシャットダウン

カメラとして単体で成立させるには、プログラムの自動起動が必要となります。この記事から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

3行目実行時に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均のプラスチックケースに不細工な穴をあけて作っておりました。その辺識者おりましたら、教えを請いたいです。