AWSの話題を中心に、日々の業務やプログラミングの徒然を綴るエンジニアブログです。

HANDS LAB

HANDS LAB ENGINEERS BLOG

ハンズラボエンジニアブログ

Kinesis Video StreamsとRekognitionを使ってその人の名前をラズパイに喋らせてみる

Pocket

2/7(金) 現在、開発合宿中の中嶋です。

今回、ハンズラボでは2/6-7の1泊2日で開発合宿をおこなっております。

私のチームは、「普段業務で使わないけど興味ある技術を使おう」をテーマに、
Kinesis Video StreamsとAmazon Rekognition、Amazon Pollyを使った、リアルタイム動画から人を認識させ、その人の名前をラズパイで喋らせることをやってみました。

ブログを書くまでが合宿だ!と、うちのチームでは言っていたので、ちゃんと書こうと思います。

前提

うちのチームメンバー全員、MacOS Catalinaで開発をしています

AWS構成図

ざっくりな構成図は以下のとおりです。

事前準備として、認識させたい画像をS3にアップロードし、
それをコレクションに追加します。

その後、Lambdaが読み取りやすいように、FaceIdと名前の辞書をDynamoDBに登録しておきます(ここはいま手動でやっている)

WebカメラからKinesis Video Streamsへ動画をストリーミングする

C++ プロデューサーライブラリの使用 – Amazon Kinesis Video Streams

WebカメラからKinesis Video Streamsへ映像をストリーミングするためには、上記のライブラリを使用します。
(他にはJava、Android版のプロデューサーライブラリがあるようです)

C++のプロデューサーライブラリにある、MacOS用のInstallマニュアルを順にやっていくと、ストリーミングができるようになります。

https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/install-instructions-macos.md

こちらのマニュアルでやったこととしては、

  • ./install-scriptを使用してビルドせず、Homebrewで必要なものをインストールした後、./min-install-scriptでSDKをビルドした(ここの部分)
  • AWS関連と、GST_PLUGIN_PATHLD_LIBRARY_PATHのPATHを通した
  • ここのコマンドを叩いて、ストリーミング開始(今の所 raw video 用のコマンドのみ上手くいっている。 h264 encoded は上手くいかなかった)

またハマったポイントとして、

ここの部分で、各種PATHを通しますが、GST_PLUGIN_PATHをマニュアル通りにやっていくと、後々のテスト用のコマンドでkvssinkが見つからないとエラーが起きます。
(リポジトリの方の例では、AWS access_key、secret_access_keyまで指定していますが、export していれば不要でした)

これは、gstreamerのパスの場所では、kvssinkがいなかったので、マニュアルとは別のパスを通す必要がありました。

これで、再度gst-launch-1.0を叩けば、動画がKinesis Videoへストリーミングされます。

Kinesis Video StreamsからRekognitionに映像渡して、解析データをLambdaで処理する

以下の記事を参考に(というかほぼパクリ)やってみました。

Amazon Kinesis Video Streamsの映像をAmazon Rekognition Videoで解析する #reinvent | Developers.IO

Kinesis Data Streamsまでデータが流れることは確認できたので、
それをトリガーとしたLambdaを作成します。

以下はserverless.ymlの一部抜粋です。

以下はLambda用のコードです

やっていることはシンプルで、
Kinesis Data Streamsから来たデータを受け取り、Recordごとに入っているデータをBase64でデコードしています。

コレクションに追加された顔に一致しているものがあった場合、FaceIdを取得することができるため、このFaceIdが誰であるかを、DynamoDBへ問い合わせしています。

その結果、誰がカメラに映ったのかが判別できるため、その名前をAWS IoTのTopicへPublishします。

AWS IoTのTopicの購読結果を元に、Amazon Pollyに投げて音声データを生成し、ラズパイに喋らせる

こちらは以下の記事を参考に、Topicに対してLambdaが判別した名前をPublishし、それをラズパイが購読できるようになりました。

Raspberry PiでAWS IoT Coreと接続し、GPIO制御をしてみた – Qiita

SensorTag のデータを Amazon Polly で読み上げる – Tech Blog by Akanuma Hiroaki

以下はTopicを購読して受け取った名前をPollyに投げて生成したmp3を再生するコードです。

subscribe_iot_topic()の中でclient.subscribeし、その際に受け取ったFaceIdに紐づくmp3データがあれば、そのまま再生。なければ、Pollyに渡してmp3を生成してもらってから再生をします。

ここでのハマった・悩んだポイントとして、

  • AWS IoTで証明書を発行すると、「このモノの証明書」「パブリックキー」「プライベートキー」の3つが生成されてややこしい
  • Pythonで音声を読み上げる方法であるpygameのインストール時での失敗
  • ラズパイ(thing)の方へポリシーをアタッチするフローが参考記事と若干変わっていて、アタッチ忘れをして全くsubscribeができなかった

デモっぽいやつ

ラズパイ側で購読開始した状態をお見せします。

データが来た時だけ、判別した人の名前が表示され、その名前を元に、音声が再生されます。

合宿を終えて(執筆時ではまだ終わってません)

今回の合宿では普段の業務で関わらないメンバーたちと一緒に、まったく使ったことのないサービスを使用して、なんとか形にすることができました。

1泊2日でありましたが、自分たちの触ってみたい技術を、時間の許す限り触りまくるのは刺激的な経験でしたし、自然とモブプロ形式でお互いの得意分野を教え合うのは良い動きが出来たなと感じました。

あとは純粋に普段一緒に働くメンバーの意外な一面を見れるのも、面白かったです。

今回作ったものは人を認識させるだけでしたが、物体も認識させるようにできると、今後応用ができそうだなって密かに思っております。

それでは以上となります。
湯河原のおんやど恵からお送りしました!

参考記事

Kinesis DataStreamをトリガーに起動するLambdaは、「1秒毎に起動するとは限らない」という話 | Developers.IO

Amazon Kinesis Video Streamsの映像をAmazon Rekognition Videoで解析する #reinvent | Developers.IO

Amazon Kinesis Video Streamsを使ってストリーム映像をAWS上に流してみる【MacBook Pro】– ClassmethodサーバーレスAdvent Calendar 2017 #serverless #adventcalendar #reinvent | Developers.IO

https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/install-instructions-macos.md

リファレンス: Kinesis 顔認識レコード – Amazon Rekognition

Raspberry PiでAWS IoT Coreと接続し、GPIO制御をしてみた – Qiita

SensorTag のデータを Amazon Polly で読み上げる – Tech Blog by Akanuma Hiroaki

PythonでMP3音源を再生する – Qiita

raspberry pi上のpython3にpygameを入れる際のエラーを解決 – Qiita

Pocket