前回は、「AWSでアカウント作成してEC2を構築するまでの手順」と題して、AWSでアカウントを作成しEC2を起動するまでの方法についてまとめてみたのですが、今回は、「AWS Rekognition」を使った顔の比較(同一人物判定)をする方法についてまとめてみたいと思います。結論からすると、AWS Rekognitionの顔比較の精度は凄いですね!正直驚きました。AWSマネジメントコンソールの使い方には慣れが必要ですが、コード量は少なくて済みますし、これなら精度の高い人物判定のサービスが作れそうです。
さて、今回AWS Rekognitionの機能を試すにあたり、以下のような条件で実施してみました。
- AWS S3でバケット作成し比較画像を予めアップロードしておく
- 環境構築の手間を省くため、AWSのサーバレス開発環境のLambdaを使用する
- 言語はPythonを使用する
当初はEC2で環境を整えてから、Rekognitionを試そうかと思ったのですが、LambdaというAWSのサーバーレス開発環境があることを知り、ひとまずそちらを使って顔比較のテストを試みることにしました。では、早速手順をまとめてみたいと思います。
目次
- AWS S3でバケットを作成し、比較画像をアップロード
- Lambdaで関数を作成し、テストイベントを設定
- AWS Rekognition APIを利用するためのコードを記述
- 実行ロールを編集する
- コードを実行して判定結果を確認
- まとめ
1. AWS S3でバケットを作成し、比較画像をアップロード
まず、AWSマネジメントコンソールにログインしたら、S3のバケットを作成します。左上の「サービス▼」メニューから「ストレージ 」の項にある「S3」を選択して、オレンジ色の「バケットを作成」ボタンを押下します。

S3のバケットとは入れ物のことで、主にスタティック(静的)なファイルなどをあげておく場所です。任意の「バケット名」を入力し「AWSリージョン」を決定します。バケット名は一意である必要があるので、ユニークな名称にしましょう。リージョンは、日本から利用するわけですから、やはり東京か大阪でしょうかね。
バケットの作成が終わったら、作成したばかりのバケットをクリックして、顔比較用の画像を数点アップロードしておきましょう。アップロードは画面内のオレンジ色の「アップロード」ボタンを押して画像を選択するだけなので、とても簡単です。
2. Lambdaで関数を作成し、テストイベントを設定
お次は「Lambda」を利用します。左上の「サービス▼」メニューから「コンピューティング 」の項にある「Lambda」を選択します。
今回やりたいのは、Rekognitionで顔の比較をするだけというシンプルな目的ですので「関数」機能を利用します。画面右上の「関数の作成」ボタンを押すと下記のような画面となります。

「一から作成」がデフォルトですので、そのままにしておき「基本的な情報」から「関数名」と「ランタイム」を決定します。関数名は任意の名称でOKです。ランタイムは「Python3.8」とします。
作成が終わったら「コードソース」という項目まで画面をスクロールしてください。「lambda_function.py」というサンプルコードがすでに入力された状態になっていますので、そのままオレンジ色の「Test」ボタンを押して実行してみます。すると下記のように「テストイベントの設定」というモーダルウィンドウが表示されます。

このような画面になったら「イベント名」のみ任意の名称を入力しておきます。他はそのままでOKです。
3. AWS Rekognition APIを利用するためのコードを記述
お次はいよいよコードの入力です。もともと保存してあった「lambda_function.py」を上書きするようなかたちで下記のコードを入力します。
from boto3 import Session
def lambda_handler(event, context):
session = Session(region_name="ap-northeast-1")
rekognition = session.client("rekognition")
response=rekognition.compare_faces(
SourceImage={'S3Object':{'Bucket':"--- 設定したバケット名 ---",'Name':"--- アップロードした画像_1 ---"}},
TargetImage={'S3Object':{'Bucket':"--- 設定したバケット名 ---",'Name':"--- アップロードした画像_2 ---"}},
SimilarityThreshold=80)
return response
「バケット名」と「アップロードした画像」には任意の文字列を入力してください。
コード参考:
https://qiita.com/naka46/items/05624e23edb6341a5e27

このような状態となったでしょうか?
4. 実行ロールを編集する
個人的にはここがハマりどころとなった点なのですが、この「実行ロール」の設定ということをしないと、LambdaからS3とRekognitionが利用できません。
コードを記述する画面内にメニューがあるのですが、そこから「設定」を選択します。

すると「実行ロール」の項目に「ロール名」という箇所があるかと思います。そこには先ほど名前をつけた関数名を含むテキストリンクがありますので、クリックして画面を遷移してください。

画面内の青い「ポリシーをアタッチします」というボタンをクリックして、次の2つのポリシーをアタッチします。
- AmazonRekognitionReadOnlyAccess
- AmazonS3ReadOnlyAccess
これらのポリシーをアタッチしないでコードを実行しても、エラーが表示されてコードが実行されません。注意しましょう。設定が終わったら先ほどの画面に戻ります。
5. コードを実行して判定結果を確認
ここまできたら、いよいよ顔判定のコードを実行できます。

コードを実行する前に、必ず「Deploy」を押して保存しておきましょう。「Deploy」の後に画面内のオレンジ色の「Test」を押してコードを実行します。

ちなみに、判定写真は説明のためのはめ込み画像で、モザイクが入っているのは肖像権の関係です。
判定結果は上記の画面のようにJSONで出力されます。また右側の判定写真は説明のためのはめ込み画像ですが、左の画像が判定基準となる画像「SourceImage」、右側が判定画像「TargetImage」ということになります。
JSONを確認すると「Similarity(類似性)」と「Confidence(信頼性)」は99.9%以上です。つまり限りなく同一人物ということなります。表情や顔の角度がかなり異なっても判定できるのが凄いですね!ちなみに、判定画像「TargetImage」には、複数の人が写っていてもきちんと判定されます。
6. まとめ
今回は、AWS Rekognitionを使った顔の比較(同一人物判定)をする方法についてまとめてみましたが、少ないコード量で高性能の顔比較が実施できるとは本当に凄いです。実際に商用サービスのために使用するとなると、もちろん費用も発生するわけですが、ここまで手軽に利用できるとは凄い時代になったものです。