AWS Rekognition APIを使って画像振り分けしてみた

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に作成しました。

01create_bucket

バケット直下に画像をアップロードするフォルダ、振り分け用のフォルダを2つ作成します。

今回は下記フォルダを作成しました。

・pics(アップロードするフォルダ)

・face1(人物1の画像が振り分けられるフォルダ)

・pics(アップロードするフォルダ)

・face1(人物1の画像が振り分けられるフォルダ)

・other(その他が振り分けられるフォルダ)

02create_folder

Lambdaに割り当てるIAM roleを作成します。

権限はrekognitionとs3へのアクセスを許可する権限を付与します。

02create_role

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」をクリックします。

03create_function

blueprintではコードをS3より読み込むためBlank Functionを選択します。

04create_function

トリガーは先程作成したS3バケットの対象フォルダにjpgファイルがアップロードされたことをトリガーにします。

05create_function

Python2.7を選択し、S3にアップロードしておいたlambda_function.zipを選択します。

また、roleには準備で作成したIAM roleを選択します。

06create_function

Advanced settingsはデフォルトではTimeoutが3秒のため、30秒程度に設定しました。

これでLambda functionが作成できました!

振り分けシステムのテスト

まずは作成したS3バケット/[face1]/に人物①のサンプル画像「face01.jpg」をアップロードします。

07test
人物①
07test

人物①

07picture

次にアップロード用のフォルダに振り分けたい画像をアップロードします。

08test
08picture01
08picture02
しばらくするとそれぞれface1とotherに振り分けられました!
09result1

しばらくするとそれぞれface1とotherに振り分けられました!

09result2

CloudWatchLogsから実行結果を確認することもできます。

test01.jpgの人物は98.0%の確率で人物①と同一人物と判定されていることが分かります。

10log
今回は以上になります!お疲れさまでした!またお会いしましょう!

この記事を書いた人

aws-recipe-user