Google AIYボイスキットにカメラを付けて画像認識をやってみる

この記事は約11分で読めます。

前回の記事にも紹介したように、Google Voice Kit上にカメラモジュールのセットアップが完了しました。今回は、ボイスキットが画像認識ができるようにプログラムを用意して、実行してみます。

スポンサーリンク

参考にしたサイト

今回の作業は、以下のリズ・マイヤーさんの記事を参考にして行いました(英語)。

Add Vision to the AIY Voice Kit
This project uses the Google Vision API to describe things, identify logos, and read text aloud. By Liz Myers.

なので、あれ?と分からなくなったら元サイトを参照してくださいませ。リズさんのプロジェクト、楽しく挑戦させていただきました。この場を借りてお礼を申し上げます。

プロジェクトの内容としては、カメラの前に対象物(人とかモノとか動物とか)を差し出して、ボイスキットのボタンを押して「What is this?(これは何?)」と聞くと、音声で「電子機器です」とか「犬です」とか答えてくれるのです(ただし英語で)。どの程度正確なのかも気になるし、音声で訪ねて映像の内容を音声で答えてくれるなんて近未来的で素敵ではありませんか。

対象となる画像を常時撮影

さて、まずはカメラに映ったものを「これは何?」といつでも聞けるようスタンバイしている状態の設定をします。具体的には、ラズパイ立ち上げと同時にカメラの映す画像が画面上に現れるよう設定します。

というわけで、決められたスケジュールでタスクのプログラムを実行するための設定を行なえるcrontabに指示を書き込みます。

crontab -e

crontabをnano等のテキストエディタで編集して、テキストの末尾に以下を加えます。

@reboot raspistill -o /home/pi/AIY-projects-python/src/examples/voice/cloud-vision/aiyimage.jpg -s -t 0 -rot 180 -w 640 -h 480 --preview 500,90,640,480

写真格納のディレクトリやファイル名は適宜、使用したいフォルダに変更してください。
カメラを180度回転させる必要がない場合はこちらをコピペします(-rot 180がないバージョン)。

@reboot raspistill -o /home/pi/AIY-projects-python/src/examples/voice/cloud-vision/aiyimage.jpg -s -t 0 -w 640 -h 480 --preview 500,90,640,480

crontabの設定をしてラズパイを再起動すると、OSがカメラの画像が表示された状態になっているはずです。ライブビデオみたいな感じですね。

VNC経由で写真が写らない場合

なお、撮影されるカメラの画像は、ラズパイに直接モニターを接続するか、VNC経由の遠隔操作にて確認できます。ただし、VNC経由だと撮影される写真が表示されない場合があります。

この場合は、VNCのメニューから
Menu > Options > Troubleshooting

と来て、Enable direct capture modeにチェックマークを入れると映ると思います。

私はこれが最初分からなくて、えっ?画像映らない?とプチ焦り状態になりました。あと、エラーが出る可能性としては、指定するフォルダ名のパスが間違っているなどが考えられます。

プロセスの切り方

さて、ラズパイを立ち上げると、基本ずっと映像が表示された状態になります。そして、何よりも優先されてトップに表示されるために、良いんだけどちょっとうるさい。とりわけ、VNC上で画像を表示させながら、ターミナルでコマンドを打つのはかなり厳しいので、私は画像表示はVNC接続、コマンド操作はSSH接続、としています。

さらに、起動時にraspistillが立ち上がっている(画像が表示されている)状態で、もう一度raspistillコマンドを使うと下記のようなエラーが出てしまい使えません。mmal: mmal_vc_component_enable: failed to enable component: ENOSPC mmal: camera component couldn't be enabled mmal: main: Failed to create camera component mmal: Failed to run camera app. Please check for firmware updates

その際には、起動時から既に走っているraspistillプロセスをいったん切る必要があります。

えっと、これ、どうやって切るの?最初迷いました。でも、方法見つけました。

具体的には、まずraspistillのプロセス番号を調べます。

pgrep raspistill

すると該当する番号が表示されました。

この該当する番号(たとえば今回は1493)のプロセスをKillすればOKです。

kill 1493

起動時に自動的にカメラが動く設定にしない場合

なお、crontabで起動時に自動でカメラが動く設定をしたくない場合は、プログラムを実行する前に毎回以下のコマンドを入れるとカメラが稼働します。

raspistill -o /home/pi/AIY-projects-python/src/examples/voice/cloud-vision/aiyimage.jpg -s -t 0 -rot 180 -w 640 -h 480 --preview 500,90,640,480

180度カメラを回転しない場合はこちら。

raspistill -o /home/pi/AIY-projects-python/src/examples/voice/cloud-vision/aiyimage.jpg -s -t 0 -w 640 -h 480 --preview 500,90,640,480

ただし、カメラが動いている限り、Ctrl+Cで終了しない限り、同じターミナルでは作業ができなくなるので、別途ターミナルを立ち上げて別の作業をする必要性が出てきます。

カメラのピントを調節する(必要な場合のみ)

さて、ラズパイのカメラモジュール。V1ではなくバージョンアップされたV2を購入したわけですが、どうやらV2のカメラモジュールは、無限遠にピントが合っていない様子。1メートル前後に合うようになっているので、画像認識で手前のオブジェクトをいろいろ見せるときにボケてしまって色々不都合が生じます(それでも認識してくれますが)。

気になる場合に限ってですが、V2のカメラは手動でピントが調節できるようです。具体的には、レンズ周辺の黒いプラスチック部分の周辺に溝のようなものがあるのですが、そこを何かにひっかけて回してピントを調節します。

この赤い矢印の先のポチポチした歯車みたいな感じのやつです。

 

私はピンセットで、ゆっくり回してみたのですが、手元が狂うと、ブスっとピンセットの先がレンズを傷つけ全てが終わってしまうので、作業は慎重に、慎重に。

こうして調整したわけですが、調整前と調整後の写真をここに載せておきます。黄色のマーカーが付いているのが調整前です。

少しはましになりましたかな。

言い訳をさせていただければ、この写真の撮影環境が本当に薄暗くて、全く悪条件での撮影なのです。もっと光が豊かな場所で撮影すれば、素敵な写真が撮れると思います。ラズパイにモバイルバッテリー(に類似するもの)を付けるともう少し可動性がアップするので、より好条件の場所で撮影できるはずですが、それはまた別の機会に紹介します。

Google Cloud Visionを有効化

さて、ハードウェアの設定はこれくらいにして、次はGoogle Cloud Vision APIの有効化です。これは、Google Cloud SpeechやGoogle Assistant APIを有効にする手順とほぼ一緒なので、そんなに苦労はしないと思います。

具体的には、Google Cloud Platformへ行き、プロジェクトを作成するか、既存のプロジェクトに認証情報を追加します。私は既に以前に作っていたVoice kitのプロジェクト上に追加する形にしました。

そして2つの作業を行います。

1.APIとサービス→ライブラリと行き、Cloud Vision APIというのを検索して、有効化します。

2.APIとサービス→認証情報の追加を行います。なお、既に同プロジェクトで認証情報の追加作業(jsonファイルの作成)を行なっている場合は、新たに行わなくても大丈夫です(プログラム実行時に、後述のグーグルの認証情報をエクスポートのファイル名は調整してください)。

認証情報は、「サービスアカウントキー」を選択します。

新しいサービスアカウント作成で、サービスアカウント名は、what-is-thatとして、役割は、Project→閲覧者としておきます(オーナーでも良いです)。

キーのタイプはJSONを選んで作成ボタンをクリック。

jsonファイルはダウンロードして、ラズパイのpiフォルダ直下に入れておきます。

Gitでファイルをクローン

githubより、リズマイヤーさんが作成した以下のファイルをクローンしてきます。

git clone https://github.com/LizMyers/AIY-projects.git

この中の02_AIY_VisionAPIのフォルダを/home/pi/AIY-projects-python/src/examples/下にコピーします。私はcloud-visionとディレクトリを名称変更してその下にファイル群を置きました。

さらにGoogle Cloud Visionをインストール。

pi@raspberrypi:~/AIY-projects-python $ AIY-projects-shell.sh
pi@raspberrypi:~/AIY-projects-python $ pip3 install google-cloud-vision

これでいちおうOKなはずです。

実際にプログラムを実行する際には、グーグルの認証情報をエクスポートしてから、

export GOOGLE_APPLICATION_CREDENTIALS="/home/pi/what-is-that.json"
pi@raspberrypi:~/AIY-projects-python/src/examples $ ./cloud-vision/cloudspeech_whatisthat.py

とプログラムを実行すればいけるはずです。上にもあるとおり、~/AIY-projects-python/src/examples に移動してプログラムを実行していますが、なぜか他の場所から実行してもうまくいかないことが多くて、examplesディレクトリの下で行なうのが上手くいきます。なんでだろう。

なお、毎回パソコンを起動するたびに、export GOOGLE…と入力するのが面倒な場合は、

nano ~/.profile

を立ち上げてテキスト末尾に

export GOOGLE_APPLICATION_CREDENTIALS="/home/pi/what-is-that.json"

を挿入します。

それでコンソール画面に戻って

source ~/.bashrc

とすると、毎回入力する手間が省けます

いざプログラムを実行

実際にプログラムを実行すると、英語の音声で、「ボタンを押して、what is that、what logo is that、what does that sayと言ってね」と言ってきます。実際音声認識してくれるフレーズは事前にプログラムに書いて指定してるので、逆にそれ以外のワードで言っても分かってくれませんボタンを押した瞬間に画像が撮影され、そこに表示された画像が何かを認識してくれます。

パターンとしては3通りありまして、

1.What is that~これは何ですか系統の質問で、これは画像に移っているオブジェクトが何かをおそのまま言ってくれます。

2.What logo is that~このロゴは何ですか系統の質問で、これは画像に写っているオブジェクトのロゴが何なのかを言ってくれます。

3.What does that day~これは何と読みますか。Can you read that?でも通じますが、これは画像に写っているテキストの文字が何かを言ってくれます。

コンソール画面に、どういう言葉を言えば認識してくれるかが書いてあるので、それを参考に話してみると良いでしょう。「what is that, what’s that, what is there, what logo is that, what logo is there, whose logo is that, what does that say, can you read that, help, thank you, thanks, well done, great, thanks, goodbye, so long, stop」等が通じる言葉です。ThanksとかGoodbyeでプログラムが終了します。

もう中学生の英語の授業状態。あ、今はもう小学生でやってるかもしれませんが。

英語の言語設定。エンコードはUTF-8にする

なお、このプログラムを実行する際には、ラズパイのロケールの設定は「英語」にしておきましょう。日本語のままでも機能はするのですが、英語認識力が著しく低下します。何度What is that!と話しかけても全然認識してくれなかったり。言語設定が英語になっているとかなり楽に認識してくれます。

また、ロケール設定の際のエンコードは「UTF-8」を選択しましょう。別のエンコードだと、日本語のテキストを認識させようとした際に、エラーが出てプログラムが止まってしまいます。それかプログラム冒頭にエンコードUTF-8を指定しておいても良いです。

まとめ

以上、ボイスキットにカメラモジュールをくっ付けて、Google Vision APIで画像認識をするプログラムをセットアップしてみました。なお、今回は英語ですべての作業を行いましたが、日本語で同等のものを作れないかプロジェクトも並行して進行中です(^^♪。

さて実際に、どの程度、カメラに映る画像を認識してくれるのか。記事が長くなってしまったので、実践編は次回の記事で紹介いたします。

コメント

  1. muto より:

    はじめまして。
    voice kit V1.1を今さらながら組立てており苦戦しております。
    すみませんが、教えて頂けませんでしょうか。
    voice kit os は今(2019.12月)やるとしたら、バージョンはいつ版が
    良いでしょうか。
    現状は2018.8.3版で、起動時にアップデートしてしまいました。
    check audioまでは行けたのですが、Google Cloud Platformで
    ファイルをダウンロードして、「assistant.json」にリネームして
    「home/pi」ディレクトリに移動したのですが、動きませんでした。
    すみませんが、ご教授願います。

    • mutoさん、コメントありがとうございます。
      さて、Voice Kit OSの件ですが、私は今月に入ってから久々に動かしてみたので、2019-11-13版を利用しています。Voice Kit OSに関してはapt-get upgradeは行わない方が良いのかなという印象です。以前、それをやって動かなくなりOSを再インストールしたことがありました(^^;。
      また、別記事でも書いたのですが、2019年6月28日以降、以前使用されていたGoogle Assistant Library for Pythonが廃止されたらしく、現在、OKグーグルと呼びかけるいわゆるホットワードでのボイスキットの利用はできなくなっている模様です。
      サンプルプログラムの中で現在でも機能しているのは、私が確認した限り、assistant_grpc_demo.py(ボタンを押してGoogle Home的に質問する)、cloudspeech_demo.py(ボタンを押して電気のオンオフのコマンドを言う)、voice_recorder.py(ボタンを押して自分の声を録音する)でした。こちらの3プログラムを試しても動きませんでしょうか。
      私も素人なのでお力になれるか分かりませんが、プログラムを実行した際に出るエラーメッセージのようなものが分かると、一助になるかもしれません。
      以上、ご参考いただければ幸いです。

      • muto より:

        クレウエタン様
        ご返信頂きまして、誠にありがとうございます。
        教えて頂いたもので、再度挑戦してみます。
        本当にありがとうございます。

  2. muto より:

    クレウエタン様
    お世話になります。
    すみません。やはり駄目でした。根本的に間違っているのかもしれません。
    Start dev terminalを起動して、assistant_grpc_demo.pyを打ち込みましたが、
    以下となっております。

    Build info: Wed Nov 13 22:15:21 UTC 2019 @ ec46764
    Dev terminal is ready! See the demos in ‘src/examples’ to get started.
    Note: the MagPi Essentials are not up-to-date. See https://goo.gl/8hEcfo
    pi@raspberrypi:~/AIY-projects-python $ src/assistant_grpc_demo.py
    bash: src/assistant_grpc_demo.py: そのようなファイルやディレクトリはありません
    pi@raspberrypi:~/AIY-projects-python $ src/cloudspeech_demo.py
    bash: src/cloudspeech_demo.py: そのようなファイルやディレクトリはありません
    pi@raspberrypi:~/AIY-projects-python $ src/voice_recorder.py
    bash: src/voice_recorder.py: そのようなファイルやディレクトリはありません
    pi@raspberrypi:~/AIY-projects-python $

    何度もたいへん申し訳ございません。いろいろネットで調べるのですが、ダンボールを組み立てる記事ばかりで、この辺に関する情報が見つめられず苦戦しております。

    すみません。

  3. muto より:

    クレウエタン様
    お世話になります。あの後、src/examples/voice/の後に
    デモを入れるのを見つけて以下やってみましたがダメでした。
    何が問題かわかりますでしょうか。すみません。

    Build info: Wed Nov 13 22:15:21 UTC 2019 @ ec46764
    Dev terminal is ready! See the demos in ‘src/examples’ to get started.
    Note: the MagPi Essentials are not up-to-date. See https://goo.gl/8hEcfo
    pi@raspberrypi:~/AIY-projects-python $ src/examples/voice/assistant_grpc_demo.py
    Traceback (most recent call last):
    File “src/examples/voice/assistant_grpc_demo.py”, line 57, in
    main()
    File “src/examples/voice/assistant_grpc_demo.py”, line 49, in main
    language_code=args.language)
    File “/home/pi/AIY-projects-python/src/aiy/assistant/grpc.py”, line 258, in __init__
    super().__init__(language_code, volume_percentage)
    File “/home/pi/AIY-projects-python/src/aiy/assistant/grpc.py”, line 94, in __init__
    credentials = auth_helpers.get_assistant_credentials()
    File “/home/pi/AIY-projects-python/src/aiy/assistant/auth_helpers.py”, line 151, in get_assistant_credentials
    return _try_to_get_credentials(credentials_file)
    File “/home/pi/AIY-projects-python/src/aiy/assistant/auth_helpers.py”, line 123, in _try_to_get_credentials
    credentials = _credentials_flow_interactive(client_secrets)
    File “/home/pi/AIY-projects-python/src/aiy/assistant/auth_helpers.py”, line 75, in _credentials_flow_interactive
    webbrowser.register(‘chromium-browser’, None, webbrowser.Chrome(‘chromium-browser’), -1)
    TypeError: register() takes from 2 to 3 positional arguments but 4 were given
    pi@raspberrypi:~/AIY-projects-python $

    • mutoさん、コメント拝見しました。
      エラーメッセージを見る限り、Credentialの取得でエラーが発生しているみたいですね。このエラーメッセージに私は出くわしたことはないのですが、考えられる可能性・チェックすべき項目としては以下を考えてみました。
      1.こちらの記事にあるような、Cloud Platform上でGoogle Assistant APIを有効化しましたか。
      2.こちらの記事にあるように、最初にassistant_grpc_demo.pyのプログラムを実行した際に、ウェブブラウザ(Google Chromium)のページが表示され、「Google Assistant API」が次の許可をリクエストしてます…というメッセージが表示されます。そこで、「許可」を選択しましたか?
      3.上のプロセスで、Google Chromium以外のブラウザが開かれていませんか?使用しているVoice KitのOSイメージによっては、Epiphanyなどの別ブラウザが開くケースがあるようです。この場合、URLをGoogle Chromeブラウザにコピーして許可をトライしてみるとうまくいくかもしれません。
      3.プログラムを実行する際に、$ src/examples/voice/assistant_grpc_demo.py としていますが、これを
      $ cd src/examples/
      $ ./voice/assistant_grpc_demo.py
      としてみる。これは関係ないと思うのですが、たまに他のディレクトリからはダメで、examplesの直下で実行すると大丈夫だったりするので。
      4.Credentialをプログラム実行前に再読み込みしてみる。具体的には、
      $ export GOOGLE_APPLICATION_CREDENTIALS=”/home/pi/assistant.json”
      $ cd src/examples/
      $ ./voice/assistant_grpc_demo.py
      としてみる。
      という感じでしょうか。思い当たるものを列挙してみましたが、いかがでしょう。参考になれば幸いです。健闘をお祈りします(^^♪。

  4. muto より:

    クレウエタン様
    ありがとうございます。
    頑張ります。

  5. muto より:

    クレウエタン様
    いろいろありがとうございました。
    とりあえず、英語ですが、話せるように
    なりました。
    後は、日本語化を頑張ります。
    うれしくて、ついコメントしてしまいました。
    本当にありがとうございました。

タイトルとURLをコピーしました