ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

Amazon Rekognitionで顔分析するSlackボットを作ってみた

こんにちは、クラウドインテグレーション事業部の菊池です。

Amazon Rekognitionには顔分析の機能があり、 AWSコンソールから画像をアップロードして試すことができます。

しかし、ちょっと試したいときに、わざわざAWSコンソールにアクセスするのも億劫です。 セッションが切れているとMFA認証などやり直しが必要になったりします。

そこで簡単に試すためのSlackボットを作成しました。

動作

ボットへのDMや、ボットを含めたチャンネルに画像を上げるとRekognitionの顔分析結果をスレッドで返信してくれます。

f:id:fvkikuchi:20181106140502p:plain

ソースコード

ソースコードGithubに上げてあります。 Serverless Frameworkを使ってTypescriptで書いています。 デプロイの方法はReadme.mdを参照ください。

github.com

構成は下図のようになります。

f:id:fvkikuchi:20181106140640p:plain

1つ目のLambda関数がSlackのEvents APIのリクエストを受け、メッセージに画像が含まれていれば2つ目のLambda関数を起動します。

2つ目のLambda関数はSlackからのリクエストとは非同期に動き、Rekognitionの顔分析機能を呼び出します。 顔分析の結果を使って画像の顔部分を切り取りS3に保存し、Slack Web APIを利用して分析結果のメッセージを送信します。 S3に画像を保存しているのはSlackへのメッセージに画像を表示するのにURLが必要なためです。

なぜLambda関数が2つあるかというと、Events APIのリクエストには3秒以内にレスポンスを返す必要があるからです。 2つ目のLambda関数を起動する処理を実装する際に、はじめArray#forEachasync functionを渡してしまい、なぜLambdaが起動しないのかとかなり悩みました。 これについてはQiitaに記事を書いていますので、よろしければご覧ください。

qiita.com

Rekognitionに渡せる画像のサイズには5MBの制限があるので、大きい場合はLambda関数内で縮小しています。 ただ縮小処理部分を割と適当に書いてしまっているので改善したい点であります。

5MB制限はRekognitionに直接イメージをあげる場合で、S3経由にする場合は15MBまで可能です。 高画質の方が分析結果もよくなると思われるので変更してもよいでしょう。

最後に

Amazon Rekognitionには他にも物体検出や顔の比較といった機能もあります。 バリバリに活用して行きたいです。