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

目次
- 処理の流れ
- Serverless Frameworkで簡単作成
- デプロイ
- 確認
- まとめ
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って本当にいいものですね!