Amazon Rekognition を使ってみた

この記事は YAMAP エンジニア Advent Calendar 2019の14日目の記事です。

# はじめに
おかげさまで、 YAMAP には毎日大量の写真がアップロードされております。
その中で自分が写っている写真をシュッと検索できたらな〜と思い立ち、まずはお手軽な Amazon Rekognition で試してみました。

# 手順

Amazon Rekognition には顔コレクションというものがあり、下記の手順で自分が写っている写真を検索できます。今回はAWS CLIで実施しましたので、コマンドと結果と共に手順を記載します。

## 1. 顔コレクションを作成する。

まずは、顔の情報を保存するコレクションを作ります。

```
aws rekognition create-collection \
      --collection-id "sampleCollection"
```

正常に作成できました。

```
{
    "CollectionArn": "aws:rekognition:ap-northeast-1:270040163539:collection/sampleCollection", 
    "FaceModelVersion": "4.0", 
    "StatusCode": 200
}
```

作成されたコレクションの一覧を確認します。

```
aws rekognition list-collections 
```

問題なさそうです。

```
{
    "FaceModelVersions": [
        "4.0"
    ], 
    "CollectionIds": [
        "sampleCollection"
    ]
}
```

## 2. 写真から顔コレクションに追加する

読み込むファイルは全てS3にアップロードして実施しました。

自分が写っている写真をコレクションに追加しました。

```
aws rekognition index-faces \
      --image '{"S3Object":{"Bucket":"rekognition.yamap.com","Name":"sample.jpg"}}' \
      --collection-id "sampleCollection" \
      --max-faces 1 \
      --quality-filter "AUTO" \
      --detection-attributes "ALL" \
      --external-image-id "sample.jpg" 
```

長いので途中省略しますが、問題なく登録されました。

```

{
    "FaceRecords": [
        {
            "FaceDetail": {
                "Confidence": 100.0, 
                "Eyeglasses": {
                    "Confidence": 99.3648910522461, 
                    "Value": false
                }, 
                "Sunglasses": {
                    "Confidence": 99.69197082519531, 
                    "Value": false
                }, 
                "Gender": {
                    "Confidence": 99.35709381103516, 
                    "Value": "Male"
                }, 
                "Landmarks": [
                    {
                        "Y": 0.2901921272277832, 
                        "X": 0.5219544768333435, 
                        "Type": "eyeLeft"
                    }, 
〜中略〜
                    {
                        "Confidence": 0.030570564791560173, 
                        "Type": "SURPRISED"
                    }
                ], 
                "AgeRange": {
                    "High": 30, 
                    "Low": 18
                }, 
                "EyesOpen": {
                    "Confidence": 99.95922088623047, 
                    "Value": true
                }, 
                "BoundingBox": {
                    "Width": 0.12911078333854675, 
                    "Top": 0.20607025921344757, 
                    "Left": 0.4941314160823822, 
                    "Height": 0.1995418518781662
                }, 
                "Smile": {
                    "Confidence": 98.78253173828125, 
                    "Value": true
                }, 
                "MouthOpen": {
                    "Confidence": 99.3538818359375, 
                    "Value": true
                }, 
                "Quality": {
                    "Sharpness": 98.08562469482422, 
                    "Brightness": 78.78662109375
                }, 
                "Mustache": {
                    "Confidence": 99.59739685058594, 
                    "Value": false
                }, 
                "Beard": {
                    "Confidence": 87.28791809082031, 
                    "Value": false
                }
            }, 
            "Face": {
                "BoundingBox": {
                    "Width": 0.12911078333854675, 
                    "Top": 0.20607025921344757, 
                    "Left": 0.4941314160823822, 
                    "Height": 0.1995418518781662
                }, 
                "FaceId": "ad1e894b-2343-4a0f-8a2a-47a412ee6971", 
                "ExternalImageId": "sample.jpg", 
                "Confidence": 100.0, 
                "ImageId": "afd351f4-a1df-32e6-83e7-a0bd38fbbe89"
            }
        }
    ], 
    "UnindexedFaces": [], 
    "FaceModelVersion": "4.0"
}
```

他にも、自分が写ってない写真をたくさんコレクションに追加しました。

## 3. 自分の写真をアップして、他の写真を検索する

最後に自分が写っている別の写真を持ってきて、他に自分が写っている写真を検索しました。

```
aws rekognition search-faces-by-image \
    --image '{"S3Object":{"Bucket":"rekognition.yamap.com","Name":"me.jpg"}}' \
    --collection-id "sampleCollection"
```

結果、確かに自分が写っている写真が返ってきました。（当たり前）

```
{
    "FaceModelVersion": "4.0", 
    "Faces": [
        {
            "BoundingBox": {
                "Width": 0.12911100685596466, 
                "Top": 0.20607000589370728, 
                "Left": 0.4941309988498688, 
                "Height": 0.19954200088977814
            }, 
            "FaceId": "ad1e894b-2343-4a0f-8a2a-47a412ee6971", 
            "ExternalImageId": "sample.jpg", 
            "Confidence": 100.0, 
            "ImageId": "afd351f4-a1df-32e6-83e7-a0bd38fbbe89"
        }
    ]
}
```

# まとめ

かなりお手軽に自分が写っている写真を検索できました。
細かな精度についてはもっとたくさんの写真を投入して試す必要がありますが、使い方が簡単であることはわかりました。
もう少し掘り下げて使ってみて、また報告できたらなと思います。

ここまで書いて気づいたのですが、いろんな人の顔が写った写真を公開するのはハードルが高いので、このネタはブログ向きじゃないな〜と反省しております。

# おまけ

実際にサービスに導入するとなるとコスト面も気にしておかないといけません。
Rekognition は コマンド実行回数で課金されますので、人物の顔が写ってない写真は事前にフィルタして対象外にしたいものです。

そこで OpenCV を使って顔が写っている写真だけをピックアップして Rekognition に投入するよう作っていたのですが、いかんせん誤判定が多くて今回は成果を掲載できませんでした。。
もう少しブラッシュアップして公開できたらと思います。