Amazon Rekognition에 의한 동일 인물 검출

지난번 에 이어 Amazon Rekogniton을 사용하여 동일한 인물을 탐지해 보았습니다.

개요



Amazon Rekognition의 compare_faces라는 API를 사용하여 동일한 사람을 검색합니다. compare_faces에 두 개의 이미지를 입력합니다만, 첫 번째가 검출하고 싶은 인물의 비친 이미지, 두 번째가 검출 대상의 이미지가 됩니다.

실행 환경



OS: Windows10
언어: Python3.7

사전 준비



AWS CLI(aws configure)에서 다음 자격 증명을 설정합니다.

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

소스 코드 (face_compare.py)



face_compare.py
import boto3
import sys
from PIL import Image,ImageDraw

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

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

# 画像ファイル2つを引数としてcompare_facesを実行
with open(sys.argv[1],'rb') as source:
    with open(sys.argv[2],'rb') as target:
        response = client.compare_faces(SourceImage={'Bytes':source.read()},TargetImage={'Bytes':target.read()})

# 同一人物が検出されない場合は処理終了
if len(response['FaceMatches'])==0:
    print('同一人物は検出されませんでした。')
else:
    # 2つ目の画像ファイルを元に、矩形セット用の画像ファイルを作成
    img = Image.open(sys.argv[2])
    imgWidth,imgHeight = img.size
    draw = ImageDraw.Draw(img)

    # 検出された顔の数分、矩形セット処理を行う
    for faceMatch in response['FaceMatches']:

        # BoundingBoxから顔の位置・サイズ情報を取得
        box = faceMatch['Face']['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[2])     

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


간단한 해설



개략으로서는 이하와 같은 처리를 실시하고 있습니다.

① 프로그램 실행시의 인수로부터 Rekognition에 입력하는 2개의 화상 파일을 취득한다.
② 상기 ①의 이미지 파일을 인수로서 Rekognition의 compare_faces를 실행한다.
③Rekognition으로부터 반환되는 Json의 FaceMatches·BoundingBox로부터 인식된 얼굴의 위치·사이즈 정보를 취득한다.
④ 상기 ③에서 직사각형 첨부의 화상 파일을 작성하여 표시한다.

실행 결과



명령


python face_compare.py ichiro1.jpg ichiro2.jpg

입력 이미지 1 (ichiro1.jpg)





입력 이미지 2 (ichiro2.jpg)





출력 이미지 (detected_ichiro2.jpg)





이치로 선수를 검출해 주었습니다.

요약



지난번의 detect_faces와 마찬가지로 API를 사용하여 쉽게 이미지 인식을 할 수 있습니다. compare_faces를 사용하면 대량의 이미지에서 찾고 싶은 사람이 비추는 것을 쉽게 추출 할 수 있다고 생각합니다. AWS 사이트에 따르면 일본에서는 신문사나 사진 서비스 회사 등에서 사용되고 있는 것 같습니다.

좋은 웹페이지 즐겨찾기