aws-cliのバージョンが古いとRekognitionを始めPollyなどAmazon AIをコマンドラインから利用できないためバージョンアップを行うと同時に、Lambdaからcliを使用する際に必要なモジュールをインストールします。
私は最新バージョンのaws-cli/1.11.28をインストールしました。
モジュールは
・simplejson
・argparse
をインストールしています。
こちらを参考にさせて頂きました。
AWS Lambda Python で AWS CLI を実行する方法
次にS3バケットを用意します。
Rekognitionを実行するリージョンと同じリージョンにする必要があります。
今回はus-east-1でRekognitionを利用するためUS Standardに作成しました。
バケット直下に画像をアップロードするフォルダ、振り分け用のフォルダを2つ作成します。
今回は下記フォルダを作成しました。
・pics(アップロードするフォルダ)
・face1(人物1の画像が振り分けられるフォルダ)
・pics(アップロードするフォルダ)
・face1(人物1の画像が振り分けられるフォルダ)
・other(その他が振り分けられるフォルダ)
Lambdaに割り当てるIAM roleを作成します。
権限はrekognitionとs3へのアクセスを許可する権限を付与します。
Pythonスクリプトの作成
aws rekognition compare-facesを用いて
Lambdaで実行するファイルを作成します。
先程aws-cliをインストールしたディレクトリに移動します。
1$ vim lambda_function.py2import commands3import json4import os5from cStringIO import StringIO6import re78print('Loading function')910def aws(cmd):11 return commands.getoutput(cmd)1213def lambda_handler(event, context):14 print(event)15 bucket=event[u"Records"][0][u"s3"][u"bucket"][u"arn"]16 bucket_name=bucket.split(':::')[1]17 item=event[u"Records"][0][u"s3"][u"object"][u"key"]18 path=bucket+"/"+item19 image='{"S3Object":{"Bucket":"'+bucket_name+'","Name":"'+item+'"}}'2021 result=aws("./aws rekognition compare-faces --source-image '{\"S3Object\":{\"Bucket\":\"level99\",\"Name\":\"face1/face01.jpg\"}}' --target-image '"+image+"' --similarity-threshold 0.0 --region us-east-1")22 findsimil=result.find("Similarity")23 simil=float(result[(findsimil+13):(findsimil+18)])24 print(simil)25 if simil > 80:26 print(aws("./aws s3 mv s3://"+bucket_name+"/"+item+" s3://"+bucket_name+"/face1/"))27 else:28 print(aws("./aws s3 mv s3://"+bucket_name+"/"+item+" s3://"+bucket_name+"/other/"))29 return simil3031$ zip -r lambda_function.zip *3233$ aws s3 cp /home/ec2-user/aws_cli/lambda_function.zip s3://level99/lambda_function.zip #S3に作成したスクリプトをアップロード今回は類似度が80より高い場合同一人物であると設定しました。
Lambda関数の作成
Lambda関数を作成します。
リージョンはRekognitionが使用できるus-east-1を選択し「Create a Lambda function」をクリックします。
blueprintではコードをS3より読み込むためBlank Functionを選択します。
トリガーは先程作成したS3バケットの対象フォルダにjpgファイルがアップロードされたことをトリガーにします。
Python2.7を選択し、S3にアップロードしておいたlambda_function.zipを選択します。
また、roleには準備で作成したIAM roleを選択します。
Advanced settingsはデフォルトではTimeoutが3秒のため、30秒程度に設定しました。
これでLambda functionが作成できました!
振り分けシステムのテスト
まずは作成したS3バケット/[face1]/に人物①のサンプル画像「face01.jpg」をアップロードします。
人物①
次にアップロード用のフォルダに振り分けたい画像をアップロードします。
しばらくするとそれぞれface1とotherに振り分けられました!
CloudWatchLogsから実行結果を確認することもできます。
test01.jpgの人物は98.0%の確率で人物①と同一人物と判定されていることが分かります。