Amazon Rekognitionを使って「ベストショット分類」機能をつくる!(第2回)

記事タイトルとURLをコピーする

 こんにちは。最近日経Linuxの人工知能特集でRekognitionの記事を執筆しました。こけし部 部長の坂本(@t_sakam)です。
 
 記事では、実際にRekognitionをどのように利用するかまでは触れられなかったので、Rekognitionの「顔分析」機能を利用して「ベストショット分類」機能を簡単につくってみよう、ということで前回、ブログをスタートしました。そして、「ベストショット」として判定する条件を決めるところまでをおこないました。  
 第2回の今回はいよいよ実際にRekognition、Lambda、S3を使って「ベストショット分類」機能をつくります。
 

第1回

Amazon Rekognitionを使って「ベストショット分類」機能をつくる!(第1回)
 

日経Linux 9月号表紙

目次
  1. 処理の流れ
  2. Serverless Frameworkで簡単作成
  3. デプロイ
  4. 確認
  5. まとめ

1. 処理の流れ

 「rekognition-image-upload」というS3のバケットに画像をアップロードされたのをトリガーにしてLambdaファンクションが実行され、Rekognitionで「顔分析」をおこないます。
 その結果を元に、Lambdaファンクション内で処理が動き、「ベストショットである」と判定された場合のみ、「rekognition-bestshot」バケットにその画像がコピーされるという流れです。

2. Serverless Frameworkで簡単作成

 それでは、今回も「Serverless Framework」を使って、簡単につくりたいと思います。作業環境はEC2(Amazon Linux)で言語はPythonです。
※「Serverless Framework」についてやインストール方法などは以下の記事をご確認ください。
 
サーバーレスシステム構築のベストプラクティス! Serverless Frameworkをもっと試してみよう! API GatewayとDynamoDB編  
 

ディレクトリ作成

 まず、「bestshot」というディレクトリを作成して、移動します。

mkdir bestshot
cd bestshot/

テンプレート作成

 以下のコマンドで、Python用のテンプレートを作成します。

serverless create --template aws-python

 以下の3ファイルが作成されました。このあと、「serverless.yml」ファイルと「handler.py」ファイルを編集します。

.gitignore
handler.py
serverless.yml

 

「serverless.yml」ファイルを編集

 まずは、Serverless Frameworkの設定ファイル、「serverless.yml」ファイルを編集します。

service: rekognition-bestshot

provider:
  name: aws
  runtime: python2.7

  stage: dev
  region: us-west-2
  profile: rekognition

  iamRoleStatements:
    - Effect: "Allow"
      Resource: "arn:aws:s3:::*"
      Action:
        - "s3:*"
    - Effect: "Allow"
      Resource: "*"
      Action:
        - "rekognition:*"

functions:
  bestshot:
    handler: handler.handler

    events:
      - s3:
          bucket: rekognition-image-upload
          event: s3:ObjectCreated:*

resources:
  Resources:
    NewResource:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: rekognition-bestshot

 
 以下でいくつかピックアップして補足します。
 

iamRoleStatements

 「iamRoleStatements」でS3とRekognitionが操作できるように権限を設定します。

  iamRoleStatements:
    - Effect: "Allow"
      Resource: "arn:aws:s3:::*"
      Action:
        - "s3:*"
    - Effect: "Allow"
      Resource: "*"
      Action:
        - "rekognition:*"
events

 「events」では、Lambdaファンクションを起動させるトリガーを設定します。今回は「rekognition-image-upload」バケットにオブジェクトがつくられた場合、というトリガーを設定しています。「rekognition-image-upload」バケットも事前にS3に作成しておく必要はなく、ここで設定しておくとデプロイ時に作成されます。

    events:
      - s3:
          bucket: rekognition-image-upload
          event: s3:ObjectCreated:*
NewResource

 こちらでアップロードされた画像が「ベストショット」だった場合の画像のコピー先である「rekognition-bestshot」バケットを設定します。ここで設定しておけば、このバケットもデプロイ時に作成されます。

    NewResource:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: rekognition-bestshot

 

「handler.py」ファイルを編集

 「handler.py」ファイルに実際の処理を書きます。第1回で決めた「目が開いているかどうか」を90%以上とし、「笑っているかどうか」を70%以上として判定しています。条件に一致していた場合は、S3の「rekognition-bestshot」バケットにアップロードされた画像をコピーしています。

from __future__ import print_function

import urllib
import json
import boto3
from boto3.session import Session

print('Loading function')

def handler(event, context):

    bucket = urllib.unquote_plus(event['Records'][0]['s3']['bucket']['name'].encode('utf8'))
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key'].encode('utf8'))

    rekognition = boto3.client(
        'rekognition',
    )

    response = rekognition.detect_faces(
        Image = {
            'S3Object': {
                'Bucket': bucket,
                'Name': key,
            }
        },
        Attributes = [
            'ALL',
        ]
    )

    face_details = response['FaceDetails']

    for item in face_details:
        smile = item['Smile']
        eyes_open = item['EyesOpen']

    if (int(eyes_open['Confidence']) >= 90 and eyes_open['Value'] == True) and (int(smile['Confidence']) >= 70 and smile['Value'] == True):

        print('True')

        s3 = boto3.resource('s3')
        copy_source = {
            'Bucket': bucket,
            'Key': key
        }
        result = s3.meta.client.copy(copy_source, 'rekognition-bestshot', key)

    else:
        print('False')

 

3. デプロイ

 準備ができたので、あとはデプロイします。これだけで「ベストショット分類」機能は完成です。

serverless deploy

 

4. 確認

 デプロイできたら、2つのバケットとも空であることを確認してから、S3の「rekognition-image-upload」バケットに画像をアップロードしてみます。
 

空の「rekognition-image-upload」バケット

空の「rekognition-bestshot」バケット

5つの画像ファイルを「rekognition-image-upload」バケットにアップロード

「rekognition-bestshot」バケットに「venus_5.png」だけコピーされている

venus_5.png

 

5. まとめ

 今回はRekognition、Lambda、S3を使って「ベストショット分類」機能をつくってみました。Rekognitionを使えばたったこれだけの手順でつくることができてしまうので本当に簡単ですね!
 Rekognitionの「顔分析」機能には「幸せそう」かどうかや「悲しそう」などの感情を分析する機能もあるので、そういった感情によって判断する、という分類方法もあるかもしれません。
 このように簡単に使えますので、みなさんもぜひRekognitionを試してみてください!
 
 いや〜、Amazon Rekognitionって本当にいいものですね!