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ファイルにクエリを投げますよ!