Amazon Rekognitionによる顔認識


Amazon Rekognitionを使って、入力した画像に映っている顔を矩形で囲むという基本的な処理を試してみました。

Amazon Rekognitionとは

Amazon Rekognitionは、AWSのAIサービスの一つで、画像認識に対応したものです。
また、AWSのAIサービスは画像認識・自然言語処理など様々な領域をカバーしたもので、機械学習の深いスキルなしに機械学習をアプリケーションに組み込める、データを用意するだけでAPIから機械学習を利用できる、といった特徴があります。

実行環境

OS:Windows10
言語:Python3.7

事前準備

AWS CLI(aws configure)にて、以下の認証情報をセットしておきます。

AWS Access Key ID
AWS Secret Access Key
Default region name
Default output format

ソースコード(face_detect.py)

import boto3
import sys
from PIL import Image,ImageDraw

# 引数のチェック
if len(sys.argv) != 2:
    print('画像ファイルを引数に指定してください。')
    exit()

# Rekognitionのクライアントを作成
client = boto3.client('rekognition')

# 画像ファイルを引数としてdetect_facesを実行
with open(sys.argv[1],'rb') as image:
    response = client.detect_faces(Image={'Bytes':image.read()},Attributes=['ALL'])

# 顔が認識されない場合は処理終了
if len(response['FaceDetails'])==0:
    print('顔は認識されませんでした。')
else:
    # 入力された画像ファイルを元に、矩形セット用の画像ファイルを作成
    img = Image.open(sys.argv[1])
    imgWidth,imgHeight = img.size
    draw = ImageDraw.Draw(img)

    # 認識された顔の数分、矩形セット処理を行う
    for faceDetail in response['FaceDetails']:

        # BoundingBoxから顔の位置・サイズ情報を取得
        box = faceDetail['BoundingBox']
        left = imgWidth * box['Left']
        top = imgHeight * box['Top']
        width = imgWidth * box['Width']
        height = imgHeight * box['Height']      

        # 矩形の位置・サイズ情報をセット
        points = (
            (left,top),
            (left + width,top + height)
        )

        # 顔を矩形で囲む
        draw.rectangle(points,outline='lime')

    # 画像ファイルを保存
    img.save('detected_' + sys.argv[1])     

    # 画像ファイルを表示
    img.show()

簡単な解説

概略としては以下のような処理を行っています。

①プログラム実行時の引数からRekognitionに入力する画像ファイルを取得する。
②上記①の画像ファイルを引数としてRekognitionのdetect_facesを実行する。
③Rekognitionから返却されるJsonのFaceDetails・BoundingBoxから、認識された顔の位置・サイズ情報を取得する。
④上記③から矩形付きの画像ファイルを作成し、表示する。

実行結果

コマンド

python face_detect.py ichiro1.jpg

入力画像(ichiro1.jpg)

出力画像(detected_ichiro1.jpg)

イチロー選手はもちろんのこと、観客席の人たちも認識してくれています。

まとめ

Rekognitionに限らずですが、AWSのAIサービスはAPIから機械学習を手軽に利用できる便利なサービスです。
また、今回は矩形しか試しませんでしたが、Rekognitionから返却されるJsonには性別・年齢など様々なものがありますので、他にも色んなことを試せると思います。