catch-img

200枚のプロフィール写真から奇跡の1枚をAmazon Rekognitionに選んでもらいました

こんにちは。ラーニングサービス部 TT1チーム兼プロトタイプビルダーの山下です。
先日、プロフィール写真を撮影しまして、200枚少しの中から選ぶというタスクがありました。
せっかくなのでRekognitionさんに選んでもらいました。

Amazon Rekognitionとは

Amazon Rekognitionは、画像と動画を構築済みのモデルで分析する機械学習サービスです。
上のイメージ例では、私の2枚の写真を比較して、同一人物の可能性が93.3%という結果になりました。
このように写真の大きさやメガネの有無、髪型や背景などが違っていても分析してくれます。
他には、写真に何が写っているかを自動判定したり、わいせつな違反画像を自動検知したり、有名人の画像が勝手に使われていないか検知したり、写真の表情を解析したりすることができます。

以前、Pepperが自動撮影した写真をRekognitionによって分析して、結果をPepperに話してもらうというデモをしました。

  新宿ラーニングセンターのPepperにAmazon Rekognitionで顔の分析をしてもらいました 新宿ラーニングセンターのPepperが撮影した写真をAmazon Rekognitionで分析してその結果をしゃべるというデモをしました トレノケート公式ブログ


やったこと

今回はこの表情の分析機能を使って、200枚以上のプロフィール写真から最も幸せ度の高い写真を選んでもらいました。


アーキテクチャはシンプルです。
S3に写真画像ファイルをマネジメントコンソールから一気に全部アップロードします。
S3のオブジェクト作成イベントで、Lambdaを実行してRekognitionにDetectFacesをリクエストして結果をDynamoDBにPutItemします。
DynamoDBテーブルでは、Smile属性とHappy属性のローカルセカンダリインデックスを用意しておいて、後で検索しやすくしておきました。
今回は最もHappy属性の数値が高い写真をプロフィール写真にしました。

ソースコードはこちらです。

import json
import boto3
from decimal import Decimal
from urllib.parse import unquote_plus
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch_all
patch_all()


def add_face_details(payload, face_details):
    print(payload)
    attributes = [
        'Smile',
        'Eyeglasses',
        'Sunglasses',
        'Gender',
        'Beard',
        'Mustache',
        'EyesOpen',
        'MouthOpen'
    ]
    for attribute in attributes:
        if attribute in face_details:
            payload[attribute] = Decimal(face_details[attribute]['Confidence'])
    return payload


def add_face_emotions(payload, emotions):
    for emotion in emotions:
        payload[emotion['Type']] = Decimal(emotion['Confidence'])
    return payload


def lambda_handler(event, context):
    rekognition = boto3.client('rekognition')
    table = boto3.resource('dynamodb').Table('ProfilePhotos')
    for record in event['Records']:
        bucket = record['s3']['bucket']['name']
        key = unquote_plus(record['s3']['object']['key'])
        face_response = rekognition.detect_faces(
            Image={
                'S3Object': {
                    'Bucket': bucket,
                    'Name': key
                }
            },
            Attributes=[
                'ALL',
            ]
        )
        payload = {
            'Prefix': key.split('/')[0],
            'ObjectKey': key
        }
        payload = add_face_details(
            payload,
            face_response['FaceDetails'][0]
        )
        if 'Emotions' in face_response['FaceDetails'][0]:
            payload = add_face_emotions(
                payload,
                face_response['FaceDetails'][0]['Emotions']
            )

        table.put_item(
            Item=payload
        )



結果発表

こちらがRekognitionさんが最もHappy属性が高い(99.601)とした写真です。
確かに幸せそうです。

こちらのプロフィールで使用しています。

  アマゾン ウェブ サービス(AWS)認定トレーニング | IT研修のトレノケート 【オンライン研修も対応・AWS認定トレーニングならトレノケートへ】トレノケートはAWS認定トレーニングパートナー(ATP)として、AWS入門からAWS認定資格対応の研修まで多数開催しています。「AWS Authorized Instructor Champion」に認定された講師や複数の資格を所有した講師が、皆様のAWS知識修得をサポートいたします。 https://www.trainocate.co.jp/reference/aws/index.html

このように、手作業で1枚づつ確認するような気の遠くなる作業をしなくても、一瞬で結果を求められるのって幸せですね。
そして、人の好みが入らない評価で選ぶことができることで、公平性もあるのかもしれません。

ちなみに、最もHappy属性が低い(0.101)とされた写真です。



​​​​​​​

トレノケートのAWS認定トレーニング

トレノケートのAWS認定トレーニングでは、AWS社の厳格なテクニカルスキル及びティーチングスキルチェックに合格した認定トレーナーがコースを担当します。
「AWS Authorized Instructor Champion」に認定された講師や、複数の資格を所有した講師が、
皆様のAWS知識習得をサポートいたします。

AWS認定トレーニングを見る​​​​​​​

山下 光洋(やました みつひろ)

山下 光洋(やました みつひろ)

トレノケート株式会社 講師。AWS Authorized Instructor Champion / AWS認定インストラクター(AAI) / AWS 認定ソリューションアーキテクト - プロフェッショナル /AWS認定DevOpsエンジニア - プロフェッショナル / AWS 認定デベロッパー - アソシエイト / AWS 認定 SysOps アドミニストレーター - アソシエイト / AWS 認定クラウドプラクティショナー / kintone認定 カスタマイズスペシャリスト他。AWS認定インストラクターとしてAWS認定コースを実施。毎年1,500名以上に受講いただいている。AWS 認定インストラクターアワード2018, 2019を日本で唯一受賞。著書『AWSではじめるLinux入門ガイド』(マイナビ出版社)。共著書『AWS認定試験対策 AWS クラウドプラクティショナー』(SBクリエイティブ社)。前職では2016年にAWS Summitにパネラーとして参加。その前はLotus Technical Award 2009 for Best Architectとして表彰されている。また、各コミュニティの運営にも個人的に関わり、勉強会にてスピーカーや参加をしている。

© Trainocate Japan, Ltd. 2008-2020