AWSの「Rekognition」サービスを使用して、顔画像の分析情報を取得してみました。
Raspberry Pi等のエッジデバイスで撮影した画像に対し、エッジではなくクラウド側で処理した場合に、どの程度ラグが出るのかを確認したいと考えた次第です。
「Rekognition」サービスについて
AWSが提供しているマネージドな視覚分析(画像分析)サービスです。顔画像をアップロードする、WebAPIとしてデータをPOSTする等データの受け渡しを行うことで、年齢、性別の他、多くの情報を分析してくれます(笑顔、表情、サングラス・顎鬚の有無など)。 また今回は使用していませんが、これ以外にも、画像データから次のような分析も可能です。
- ラベル検出(物体検出)
- 画像の節度(倫理的に不適切な画像をモザイク処理する)
- 有名人の認識(似ている有名人を探す)
- 顔の比較(複数の顔画像の類似性を示す)
- イメージ内のテキスト(画像から文字を判定)← 現時点で日本語は未対応
<AWS Rekognition(顔の分析)>
処理の流れ
全体構造を図示すると、以下のようになります。
① PCのカメラで顔を撮影し、OpenCVのカスケード分類器で顔を検出。
② 顔画像をAWSIoTCoreに送信(Publish)する。顔画像はBase64にエンコード。
③ ルールエンジンを使用して画像をBase64のままDynamoDBに登録。
④ テーブルのStreamでLambdaを起動。
⑤ LambdaでBase64をデコードしてRekognition(画像分析AI)に渡す。
⑥ JSONで認識結果が返却される。Lambdaでデータを取得。
⑦⑧ MQTTでPCに分析した結果を戻す(Publish)。
⑨ OpenCVで画面に分析結果文字を合成して、画面に表示。
処理結果
実際に実装してみた結果で、画像撮影 → 画面への分析結果表示までを何度か試してみました。
※実装方法については、こちらのGitHubをご確認ください。
<分析結果の画面表示イメージ>
画像の取得から、分析した情報を画面に表示するまでのタイムラグは、2秒~3秒 程度でした。
以下のGitHubにアニメーションGIFを掲載しています。
github.com
結論
応答速度は予想以上に早かったです。 運転時の画像判断といったミリ秒単位のアクションはできませんが、それ以外の用途であれば、十分使用に耐えうるレベルということがわかりました。
実装方式の補足
このような機能を実装する場合、データの受け渡し方法がいくつかあります。
- クライアント<jpg画像を保存>→(AWS SDK)→S3→lambda→Rekognition
- クライアント<jpg画像を保存>→(Web API)→Rekognition
- クライアント(AWS WebRTC SDK)→Kenesis Video Streams→Rekognition
今回は上記のいずれでもなく、ちょっと特殊な方法を実装してみました。
クライアント<Base64 Encode> →(MQTT)→IoT Core → DynamoDB → Stream → lambda<Base64 Decode> → Rekognition
本来のベストプラクティスは「1」(動画なら3)であり、MQTTはパケットサイズ上限やデータ損失等の問題から、おそらく画像送信には向いていません。今回これを採用した理由は以下のような事情からです。