Amazon Rekognitionをさわってみた その2
-
こんにちは。岸本でございます。
前回のAmazon Rekognitionをさわってみた その1の続きです。
今回は、AWSのサービスと連携して、Amazon Rekognitionを使ってみました!やりたいこと
①画像をS3へアップロードする。
②S3に画像がPutされた事をトリガーにして、Lambda Functionを起動
③Lambda Functionにて、Amazon RekognitionのAPIを発行
④Amazon Rekognitionの分析結果をS3に保存S3 Bucketを準備
まずはS3を準備を準備しましょう!
今回は、画像をアップロードするBucketと
分析結果を保存するBucketを用意しました。
・jump-images(画像をアップロードする先のBucket)
・jump-results(分析結果を保存するBucket)
という2つのBucketを用意しました。
Bucketの設定は特に不要なので、デフォルトでさくっと作っちゃって下さい!Lambda Function用のIAM Roleを作成
んで、Lambda Functionで使用するIAM Roleを作りましょう!
ポリシーはインラインポリシーで下記の様に設定しました。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "PutResult", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::jump-results/*" }, { "Sid": "GetImagesMetadata", "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::jump-images/*" }, { "Sid": "DetectLabels", "Effect": "Allow", "Action": [ "rekognition:DetectLabels" ], "Resource": "*" }, { "Sid": "OutputLog", "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" } ] }
別にLambdaがS3からImageをgetする想定は無かったのですが、
RekognitionのAPIはS3のObjectのmetadataを取るらしく、
GetObjectが無いと、エラーになりました。Lambda Functionを作成
では、大事なLambda Functionを作って行きましょう。
Lambda Functionのコンソールに行って、”Create Lambda Function”をポチッと。
Select blueprint
blueprintはBlank Functionを選択
Configure triggers
トリガーの設定は下記の様に設定しましょう!
・トリガー:S3
・Bucket:【画像をアップロードするS3 Bucket】
・Event Type:Object Created(All)
・Prefix:【空白】
・Suffix:.png
・Enable Trigger:Enable
Configure function
最後に、Functionの設定です。
・Name:【任意】
・Description:【任意】
・Runtime:Python 2.7
・Environment variables:
Key -> results_bucket
Value -> 【【分析結果を保存するBucket名】
・Exiting role:【作成したIAM Role】
・TimeOut:1 min 0 sec (←念のため)
・Lambda Function Code(Edit code inline)
※下記コードを利用します。from __future__ import print_function import os import json import urllib import boto3 print('Loading function') s3 = boto3.resource('s3') rekognition = boto3.client('rekognition') def lambda_handler(event, context): images_bucket = event['Records'][0]['s3']['bucket']['name'] images_key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key'].encode('utf8')) try: reko_response = rekognition.detect_labels( Image={ 'S3Object': { 'Bucket': images_bucket, 'Name': images_key, }, }, MaxLabels=20 ) label_records = '' for label in reko_response['Labels'] : label_record = [] label_record.append(images_key) label_record.append(label["Name"]) label_record.append(label["Confidence"]) label_records = label_records + ','.join(map(str, label_record)) + '\n' results_bucket = s3.Bucket(os.environ['results_bucket']) s3_response = results_bucket.put_object( \ ACL='private', \ Body=label_records, \ Key=images_key + ".csv", \ ContentType='text/plain' \ ) return str(s3_response) except Exception as e: print(e) raise e
以上を設定して、Lambda Functionを作成して下さい。動かしてみよう!
じゃあいよいよ動かして見ましょう!
S3のコンソールから、画像をアップロードする先のBucketを選択し、Upload
今回は↓の画像を使いました!(岸本がJMAS社内で撮影)
正常にアップロードされた事を確認出来たら…
早速、分析結果がアップロードされるS3Bucketを見てみましょう!
すると…
CSVファイルが上がっている!!
中をOpenしてみると…
↓↓
↓↓
うん!画像ファイル名とともに、分析結果が見えますね!<最後に>
アップロードするだけで、別のBucketに分析結果CSVファイルがされる仕組みを作ってみました。
で、何故CSVファイルにしたのかというと…
Amazon AthenaでそのCSVに対してクエリを投げてみようぞ!
という魂胆です。
ということで、
次回はAmazon Athenaで散らばったCSVファイルにクエリを投げますよ!人気記事