Amazon Rekognitionで類似顔画像検索を行う #reinvent

はじめに

先日は以下のブログ記事を書きました。

ここではDetectLabels、DetectFaces、CompareFacesの、3つのAPIを使いました。

今日はSearchFacesByImageというAPIを使って、類似顔画像検索を行います。

やってみた

準備

まずは類似顔画像検索で使うための複数の画像ファイルをS3バケットに格納しておきます。以下ではカレントディレクトリにある全てのファイルをS3にアップロードしています。

$ LIST=$(ls); for FILE in $LIST
do
  aws s3 cp $FILE s3://test-bucket/
done

CreateCollectionでCollectionを作成する

Rekognitionでは、画像ファイルの情報をCollectionという情報データベースに格納します。今回使用するためのCollectionをCreateCollection API(create-collection)で作成します。

$ aws --region us-east-1 rekognition create-collection \
      --collection-id "smokeymonkey"

以下のアウトプットが戻ります。

{
    "CollectionArn": "aws:rekognition:us-east-1:123456789012:collection/smokeymonkey",
    "StatusCode": 200
}

ちなみにCollectionのリストはlist-collectionsで取得できます。

$ aws --region us-east-1 rekognition list-collections

{
    "CollectionIds": [
        "smokeymonkey"
    ]
}

IndexFacesで画像ファイルの情報を抽出する

IndexFaces API(index-faces)を使って、画像ファイルから顔を抽出し、情報をCollectionに格納します。IndexFacesはあくまで情報だけを抽出しますので、画像ファイルのバイト自体はCollectionには保存されません。以下のコマンドでは「test-bucket」というS3バケットにある全てのファイルに対してindex-facesを実行しています。なお、IndexFacesでは元の画像ファイル自体についての情報が無いため、--external-image-idで画像ファイルのファイル名を追加で登録しています。

$ LIST=$(aws s3 ls s3://test-bucket/ | awk '{print $4}'); for OBJECT in $LIST
  do
    echo $OBJECT
      aws --region us-east-1 rekognition index-faces \
          --image '{"S3Object":{"Bucket":"test-bucket","Name":"'$OBJECT'"}}' \
          --collection-id "smokeymonkey" \
          --external-image-id $OBJECT
  done

Collectionを使って類似顔画像検索をする

さて、本題です。SearchFacesByImage API(search-faces-by-image)を使って、指定した画像に含まれている顔に類似した顔が存在する画像ファイルを検索します。

$ aws --region us-east-1 rekognition search-faces-by-image \
      --image '{"S3Object":{"Bucket":"test-bucket","Name":"handsome.jpg"}}'\
      --collection-id "smokeymonkey" \
      --max-faces 10 

すると、以下のようなアウトプットがズラズラと出力されます。

{
    "SearchedFaceBoundingBox": {
        "Width": 0.22475960850715637,
        "Top": 0.1955128163099289,
        "Left": 0.44110578298568726,
        "Height": 0.2996794879436493
    },
    "SearchedFaceConfidence": 99.99998474121094,
    "FaceMatches": [
        {
            "Face": {
                "BoundingBox": {
                    "Width": 0.2247599959373474,
                    "Top": 0.19551299512386322,
                    "Left": 0.44110599160194397,
                    "Height": 0.2996790111064911
                },
                "FaceId": "d8636651-7003-5ff6-a592-84de7cd24474",
                "ExternalImageId": "handsome.jpg",
                "Confidence": 100.0,
                "ImageId": "16cf69a7-aefe-571f-80d0-d5729e6f4bbb"
            },
            "Similarity": 100.0
        },

で、検索結果が以下。

search

他人が写っている写真も大量にS3バケットに入れておいたのですが、Similarityが80%になったのは全て僕本人でした。

さいごに

Google画像検索のような感じで、顔の類似検索が可能になります。精度も良く、複数人で写っている画像や顔が小さいもの、コラ画像までしっかりと引っ張ってきました。素晴らしいですね。