こんにちは!Tamaです!
今回は「Amazon Rekognition」のAPI検証と称して、S3にアップロードしたことをトリガーにLambdaからRekognitionを用いて画像を顔認識し対象のファルダに自動で振り分けるシステムを開発してみました。
システムの動作としては以下になります!
①S3の所定のフォルダにアップロード
②Lambda functionが起動
③予め保存しておいた人物①のサンプル画像とアップロードした画像に写っている人物を比較
④閾値より高い類似度の場合人物①のフォルダに移動、閾値以下の場合その他のフォルダに移動
準備
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の画像が振り分けられるフォルダ)
・other(その他が振り分けられるフォルダ)
Lambdaに割り当てるIAM roleを作成します。
権限はrekognitionとs3へのアクセスを許可する権限を付与します。
Pythonスクリプトの作成
aws rekognition compare-facesを用いて
Lambdaで実行するファイルを作成します。
先程aws-cliをインストールしたディレクトリに移動します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
$ vim lambda_function.py import commands import json import os from cStringIO import StringIO import re print('Loading function') def aws(cmd): return commands.getoutput(cmd) def lambda_handler(event, context): print(event) bucket=event[u"Records"][0][u"s3"][u"bucket"][u"arn"] bucket_name=bucket.split(':::')[1] item=event[u"Records"][0][u"s3"][u"object"][u"key"] path=bucket+"/"+item image='{"S3Object":{"Bucket":"'+bucket_name+'","Name":"'+item+'"}}' 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") findsimil=result.find("Similarity") simil=float(result[(findsimil+13):(findsimil+18)]) print(simil) if simil > 80: print(aws("./aws s3 mv s3://"+bucket_name+"/"+item+" s3://"+bucket_name+"/face1/")) else: print(aws("./aws s3 mv s3://"+bucket_name+"/"+item+" s3://"+bucket_name+"/other/")) return simil $ zip -r lambda_function.zip * $ 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%の確率で人物①と同一人物と判定されていることが分かります。
今回は以上になります!
お疲れさまでした!
またお会いしましょう!