AWS ソリューションを試してみた ! -Auto Check-In App 編-
Author : 木村 悠希
はじめに
AWS ウェブサイトの AWSソリューション というコンテンツはご存じでしょうか?
どれどれ・・・ページを覗いてみると『AWS ソリューションは、一般的な問題を解決し、より速く構築する支援となるように設計された検証済みのテクニカルリファレンス実装』とありますね。
クラウドを導入することで、様々な問題を解決するためのシステムを素早く構築することができる便利な時代になりました。一方で、その解決したい問題が特定できていたとしても「それを達成するためのシステムをどのようにクラウドで構築すればよいかわからない」という方も多いのではないでしょうか ?
ユーザーや企業の特性によって抱える課題は異なりますが、普遍的な課題というのは常に存在します。それに対して、1 つのアプローチを提供するのが、この AWS ソリューションです。各ソリューションは世界中の AWS アーキテクトおよび AWS パートナーによって構築および検証が行われており、クラウド設計における車輪の再発明の問題を未然に防止します。
今回はこの AWS ソリューションについてデモンストレーション形式で紹介していきたいと思います。数あるソリューションの中から一例として選ぶのは、先日リリースが行われた Auto Check-In App です。
Auto Check-In App とは
Auto Check-In App は、イベント受付のための顔認証システムを自動でプロビジョニングします。イベント受付時には、イベント参加者の写真を撮影すると、このソリューションは Amazon Rekognition に顔画像を送信し、そこで事前登録された参加者の顔のコレクションに照らし合せてそれらの画像を検証します。
Auto Check-In App を一言で言ってしまうと、『顔認証受付システム (Powered by AWS)』です。
もし、ある日突然上司から「社内イベントの受付で使用する IC カード認証端末がダメになった。代替措置として顔認証受付システムを今すぐ作って欲しい。」とお願いされたらどうしますか ? あなたの手元にあるのはカメラデバイスが接続された PC 端末だけだったとします。現実的な話として、このような状況はまず起こり得ないですが、仮に、の話だったとしても多くの人にとって技術的に難しいものがあるのではないでしょうか。
ですが、Auto Check-In Appであれば顔認証受付システムをお手軽に構築することが可能です !
実際の動作イメージ
デモンストレーション
今回 Auto Check-In App を動作させるにあたって必要となる前提条件と筆者の実行環境をあらかじめ明記しておきます。
前提条件
- カメラが接続されたネットワーク接続済のデバイス
- 例: インカメラ付きの MacBook Pro、USB カメラ付きの Windows PC など
- AWS アカウントを開設済みであること
- aws-cli 1.16.243
- Python 3.7
- OpenCV 4.1.0
筆者の実行環境
- Mac OS X Mojave 10.14.6
- zsh 5.7.1
- aws-cli 1.17.9
- Python 3.7.5
Step 1 : 概要の確認
まずは、全体のアーキテクチャ図を見てみましょう !
本ソリューションを構築した後の、実際のユースケースにおけるおおまかなフローとしては、以下のようになります。
- イベント当日までに参加者の画像と名前を登録する
- イベント当日、オペレーターはカメラデバイスを接続した PC 上でクライアントアプリを立ち上げ参加者の来訪を待つ
- 参加者は受付時にカメラデバイスの前に立ち、キャプチャされた顔画像をもとにして認証が行われる
また、ここで大事なポイントは、本ソリューションはバックエンドとフロントエンドの 2 部から構成されていることです。そこで、本記事ではそれぞれの構築手順を切り分けることにし、Step 2-3 でバックエンド、Step 4 でフロントエンドのセットアップのガイドを行うことにします。
Step 2 : セットアップ -バックエンド編-
アーキテクチャの概観を終えたところで、実際のデプロイを進めていきましょう!
Auto Check-In App の紹介ページから『AWS コンソールでソリューションを起動する』をクリックします。
画面右上のリージョン選択画面から、『バージニア北部 (us-east-1)』から『オレゴン (us-west-2)』へと切り替えます。
必要なテンプレートファイルは既に参照されているので、『次へ』をクリックします。
クリックすると拡大します
スタック名を入力する必要があるので、『auto-check-in-app』と入力し、『次へ』をクリックします。
クリックすると拡大します
スタックオプションの設定については、このまま『次へ』をクリックします。
クリックすると拡大します
レビューの機能と変換の項目では、IAM リソースが新たに作成されることを承認する必要があるので、チェックボックスにチェックを入れます。そして、『スタックの作成』をクリックします。
クリックすると拡大します
スタックが完全に作成されるまで少し時間がかかります。(5-10分) その後ステータスに『CREATE_COMPLETE』と表示されていればスタックが正しく作成されています。
クリックすると拡大します
バックエンドの構築はこれで完了しました。
Step 3 : セットアップ -画像の登録-
顔認証を行うためには、認証を行いたい人の画像を用いて事前登録を行わなければいけません。そのための画像を用意しましょう。画像のフォーマットは、jpg、jpeg、png のいずれかが指定されており、加えてファイル名は個人を識別するための名前にしておく必要があります。
もし、画像の適切なフォーマットがわからない場合は、Amazon Rekognitionの開発者ガイドの『顔比較用の入力イメージに関する注意事項』を参考にしてみましょう。
例:username.jpg
マネジメントコンソールから Amazon S3 バケットに画像を直接アップロードします。
クリックすると拡大します
画像のアップロードが完了しました。
クリックすると拡大します
AWS Lambda の動作確認
一度ブラウザで画面をリロードしてみると、アップロードした画像が消えていることに気付きます。一体何がおこったのでしょうか ? 画像は確かに正しくアップロードされたはずです。
クリックすると拡大します
一度落ち着いてアーキテクチャ図を見直してみましょう。画像登録のためのサービス群に限定した場合のアーキテクチャ図がこちらです。
Auto Check-In App の解説ページでは以下のように説明されています。
Amazon S3 へのアップロードによって、Amazon Rekognition の IndexFaces API を呼び出すLambda関数がトリガーされます。Amazon Rekognition が顔の特徴を特徴ベクトルに抽出し、face_id を作成します。次に、そのベクトルが顔のコレクションに保存され、face_id と対応するユーザー名が DynamoDB テーブルに保存されます。
つまり、先ほどの画像のアップロードをトリガーとして上述の処理が連鎖的に行われていたことがわかります。
それでは、Lambda が本当に呼び出されているかを確認してみましょう。マネジメントコンソールから Lambda を開き、 auto-chek-in-app-IndexFace のモニタリング項目を確認します。
正しく呼ばれていました
AWS CLI を使って、Rekognition のコレクションに顔の特徴データが保存されていることを確認します。
$ aws rekognition list-faces --collection-id auto-check-in-app-face-collection --region us-west-2
{
"Faces": [
{
"FaceId": "bf50477b-4d55-4249-a6b1-31950ddca61d",
"BoundingBox": {
"Width": 0.3261429965496063,
"Height": 0.3052630126476288,
"Left": 0.34301599860191345,
"Top": 0.33423298597335815
},
"ImageId": "c876c8c8-59b2-3f0e-a475-2d07360ae86e",
"Confidence": 100.0
}
],
"FaceModelVersion": "4.0"
}
そして、マネジメントコンソールから DynamoDB に生成されたテーブルの項目を確認してみます。
クリックすると拡大します
ありました !
画像登録の手続きは正しく行われていたようです。解説ページでは説明されていませんでしたが、Lambda によって一連の登録処理が行われた後は、S3 バケットにアップロードした画像についてもしっかり削除が行われます。(安心ですね) これでバックエンドへの仕込みは完了しました。
ここまでくれば、構築についてはほとんど終わったようなものです。
Step 4 : セットアップ -フロントエンド編-
最後に、フロントエンドの構築を進めます。
Auto Check-In appの紹介ページから『ソースコード』をクリックすることで、GitHub 上で公開されているソースファイルを閲覧することが可能です。
リポジトリからソースファイルをクローンしてきます。
$ git clone https://github.com/awslabs/auto-check-in-app.git
しばらく経つと、ユーザー作成の成功結果が json 形式で返ってくるので、内容を確認したら閉じます。
その後に、パスワードの入力を求められるので任意のパスワードを設定します。
$ cd ./auto-check-in-app/source/frontend
まずは Amazon Cognito を使用して、ユーザーアカウントの登録を行う必要があります。 第一引数に登録用の任意のメールアドレスを指定して、register-operator.sh を実行します。
$ ./register-operator.sh user@example.com
aws cognito-idp admin-create-user --user-pool-id us-west-2_s4HDlnWbT --username user@example.com --region us-west-2
しばらく経つと、ユーザー作成の成功結果が json 形式で返ってくるので、内容を確認したら閉じます。
その後に、パスワードの入力を求められるので任意のパスワードを設定します。
Password for user@example.com:********
aws cognito-idp admin-set-user-password --user-pool-id us-west-2_s4HDlnWbT --username user@example.com --password <PASSWORD> --permanent --region us-west-2
今度は空のレスポンスが返ってくるので、同じく内容を確認したら閉じます。
登録は以上で完了です。
次に、クライアントアプリを実行するための環境ファイルを設定します。default.env.json を env.json としてファイルをコピーしたら、任意のエディタでファイルを編集します。
$ cp ./default.env.json ./env.json
$ vim env.json
{
"Region": "%%REGION%%",
"ApiEndpoint" : "%%REST_API_ID%%.execute-api.%%REGION%%.amazonaws.com/prod/rekognize_face",
"CognitoUserPoolId": "%%COGNITO_USER_POOL_ID%%",
"CognitoUserPoolClientId": "%%COGNITO_USER_POOL_CLIENT_ID%%",
"FaceAreaThreshold": 1e4,
"FaceMarginRatio": 0.2,
"FaceSimilarityThreshold": 90,
"CroppedImageWidth": 540,
"CroppedImageHeight": 540,
"NameTtlSec": 10,
"UseDeepLeaningForDetector": true
}
書き換える必要があるのはファイル内の、%%Region%%、%%REST_API_ID%%、%%COGNITO_USER_POOL_ID%%、%%COGNITO_USER_POOL_CLIENT_ID%% の 4 つです。
Region は us-west-2 を(2 つあるので注意)、残りの項目についてはマネジメントコンソールから AWS CloudFormation の出力タブに表示されている値に置き換えます。
クリックすると拡大します
編集を終えたら、以上で全てのセットアップは完了です !
ここまでのセットアップがうまくいかない場合
ここまでのセットアップでつまずいてしまった方は、一度付属のデプロイガイドを参考にしてみてください。
Step 5 : クライアントアプリの実行
クライアントアプリは、カメラが接続されたネットワーク接続済の PC で起動する必要があります。今回は、簡易的に MacBook Pro のビルトインカメラを使用してみることにしました。
それでは、起動してみます。
$ python main.py
OpenCV version: 4.1.2
video_device: 0
Loading SSD model...
Loaded!
ユーザー認証が求められるので、先ほど登録したメールアドレスとパスワードを入力します。
Enter username: user@example.com
Enter Password:********
この後、連続的に認証処理が行われるので、立ち上がったクライアントアプリの枠内に上手に収まるようにカメラに自身の顔を向けて調整します。
笑顔を忘れずに 😊
...
{'result': 'INVALID', 'name': '', 'similarity': 0}
{'result': 'INVALID', 'name': '', 'similarity': 0}
{'result': 'NO_MATCH', 'name': '', 'similarity': 0}
{'result': 'OK', 'name': 'yuki', 'similarity': 99.50385284423828} <- Success!
正しく顔認証が行われました ! クライアントアプリの枠色がオレンジに変わるとともに、可愛い電子音が鳴るはずです。
認証を終えたい場合は Ctrl+C でクライアントアプリを終了することが可能です。
うまく顔認証が行われない場合
万が一、ここまでのセットアップ手順が正しく行われているにも関わらず「全然認識してくれない・・・」となってしまった方のために、顔認証を上手に成功させるためのコツを製作者の方にこっそり教えてもらいました。
- 閾値を下げてみるのはどうですか ? AWS CloudFormation のスタック作成時の RekogitionFaceSimilarityThreshold のパラメータを調整してみましょう。
- 登録時の写真と大きく異なる格好をしていませんか ? 例えば、眼鏡をかけていませんか ? 最新の画像の用意してもう一度登録を行ってみましょう。
- カメラデバイスでキャプチャが行われる際の光量・角度は適切ですか ?
Step 6 : お片づけ
最後に、クリーンアップの手順を示しておきます。
マネジメントコンソールから、画像の登録に使用した Amazon S3 バケットの中が空であることを確認します。
もしオブジェクトが存在する場合は、バケット選択画面からバケットを選択した後『空にする』をクリックして、バケット内のオブジェクトを全て削除しておきましょう。
クリックすると拡大します
CloudFormation から auto-check-in-app のスタックを削除します。
スタックを選択した後『削除』をクリックし、その後ステータスに『DELETE_COMPLETE』と表示されていればスタックは正しく削除されています。
クリックすると拡大します
以上でクリーンアップは完了です。ここまでお疲れ様でした !
おわりに
今回は AWS ソリューションの内の一つ、Auto Check-In App を紹介しました。自身の置かれたシチュエーションに応じて、適切なソリューションを採用することで、目的のシステムを素早く実現することが可能です。
AWS ソリューションに対しての筆者個人の感想としては、そのまま構築されたもので実運用を目指そうとするのではなく、あくまで『クラウドの活用法・設計について一種の着想を得る』ことを一番のねらいとするのがベストなのではないかという印象を受けました ! 今回の場合だと、一度自身で顔認証受付システムのアーキテクチャをじっくりと設計し、本ソリューションと見比べてみるのもよいかもしれませんね。
本記事が皆さんの日々のクラウド活用についての Invention に良い貢献ができれば幸いです。それでは!
筆者紹介
木村 悠希
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト
2020 年にアマゾン ウェブ サービス ジャパン合同会社に入社。
Serverless⚡が好きです。好きなプログラミング言語はPython🐍、最近気になっている言語はRust🦀。
趣味は音楽鑑賞と楽器演奏で、クラシックからヘヴィメタルまで幅広くカバーします。
AWS を無料でお試しいただけます