Amazon Rekognition で顔認識をしてみる (AWS CLIでお手軽に)

# はじめに
AWS Rekognition で顔認識システムを作るにあたって、どんな感じに動くのか触ってみました。本格的なシステムを構築する前のお試しでやった手順を残しておきます。

# 環境
- macOS Catalina
- aws-cli 2.1.13
    - インストールとセットアップは[こちら](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)や他のページを参照ください。また、IAMの設定は適宜行ってください。

# 手順

## 1. 顔写真を準備する

<a href="https://www.pakutaso.com" title="フリー写真素材ぱくたそ" >フリー写真素材ぱくたそ </a> さんから、写真をいくつかいただきました。

**事前に登録しておく画像 | face_man.jpg**
<img width=200 alt=face_man.jpg src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96666/a1e57c17-1c03-fd88-f408-308b8536d18f.jpeg">

**比較画像1 (登録画像と同一人物) | face_cmp_man.jpg**
<img width=200 alt=face_cmp_man.jpg src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96666/20a5281c-3ac7-cbd9-9623-b38e539fa9cf.jpeg">


**比較画像2 (登録画像と別人物) | face_cmp_woman.jpg**
<img width=200 alt=face_cmp_woman.jpg src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96666/606c366a-d557-c479-09fc-9c6e63178cce.jpeg>

上記画像をRekognition で利用するためにAmazon S3 にアップロードしておきます。S3 を使わずにもできるようですが、aws-cli はS3 経由の方法しかサポートしていないようなので、今回はS3 を利用します。

上記を1つのディレクトリに格納して下記を実行します。バケット名は `rekog-test` としています。

```bash
aws s3 mb s3://rekog-test
aws s3 sync . s3://rekog-test
```


## 2. 画像の collection を作成する
[Creating a collection - Amazon Rekognition](https://docs.aws.amazon.com/rekognition/latest/dg/create-collection-procedure.html) を参考に予め画像を登録しておくcollection を AWS Rekognnition に作成しておきます。ここでは、コレクション名は `test_collection` としました。

```bash
aws rekognition create-collection \
    --collection-id "test_collection"
```

## 3. collection に画像を登録する
[Adding faces to a collection - Amazon Rekognition](https://docs.aws.amazon.com/rekognition/latest/dg/add-faces-to-collection-procedure.html) を参考に、コレクションに画像とメタデータを登録します。

```bash
aws rekognition index-faces \
      --image '{"S3Object":{"Bucket":"rekog-test","Name":"face_man.jpg"}}' \ # 1.で作ったバケット及びファイル名を指定
      --collection-id "test_collection" \  # 2.で作ったコレクション名を指定
      --max-faces 1 \
      --quality-filter "AUTO" \
      --detection-attributes "ALL" \
      --external-image-id "face_man.jpg"  #　任意のidを指定可能。ここではファイル名とした
```

## 4. 比較画像で検索してみる
[Searching for a face using an image - Amazon Rekognition](https://docs.aws.amazon.com/rekognition/latest/dg/search-face-with-image-procedure.html) を参考に S3 にアップロードした画像で検索をかけてみます。

まずは、登録画像と同一人物での検索を行います。

```bash
aws rekognition search-faces-by-image \
    --image '{"S3Object":{"Bucket":"rekog-test","Name":"face_cmp_man.jpg"}}' \ # 1.で作ったバケット及びファイル名を指定
    --collection-id "test_collection" # 2.で作ったコレクションを指定
```

すると下記のような応答が返ってきます。99%の類似度で、事前に登録した画像の情報が返ってきました。

```json
{
    "SearchedFaceBoundingBox": {
        "Width": 0.14660289883613586,
        "Height": 0.2828647196292877,
        "Left": 0.5331953167915344,
        "Top": 0.1216459572315216
    },
    "SearchedFaceConfidence": 99.99463653564453,
    "FaceMatches": [
        {
            "Similarity": 99.90309143066406,
            "Face": {
                "FaceId": "628aaeac-4890-4794-a4fe-63c7ccc3e575",
                "BoundingBox": {
                    "Width": 0.18994799256324768,
                    "Height": 0.3481149971485138,
                    "Left": 0.40426400303840637,
                    "Top": 0.18603500723838806
                },
                "ImageId": "9d979734-6481-321c-957a-7b71f51f154d",
                "ExternalImageId": "face_man.jpg",
                "Confidence": 99.9990005493164
            }
        }
    ],
    "FaceModelVersion": "5.0"
}
```

次は別人物の写真を使って検索をしてみましょう。

```bash
aws rekognition search-faces-by-image \
    --image '{"S3Object":{"Bucket":"rekog-test","Name":"face_cmp_woman.jpg"}}' \ # 1.で作ったバケット及びファイル名を指定
    --collection-id "test_collection" # 2.で作ったコレクションを指定
```

すると、下記の通り検索結果はなしとなります。

```bash
{
    "SearchedFaceBoundingBox": {
        "Width": 0.15162670612335205,
        "Height": 0.2835661768913269,
        "Left": 0.39322713017463684,
        "Top": 0.18060290813446045
    },
    "SearchedFaceConfidence": 99.99597930908203,
    "FaceMatches": [],
    "FaceModelVersion": "5.0"
}
```

# おわりに
今後はLamdaやAPI Gateway も利用しつつ顔認識システムを構築していきたいと思います。

# 参考ページ
- [Amazon Rekognitionで顔認証してみた - Qiita](https://qiita.com/OMOIKANESAN/items/c5d1dfe5c00105739dcf)
- [pythonとawsRekognitionを使って一瞬で顔認識システムを構築する！ - Qiita](https://qiita.com/sanjofumihiro/items/36aa48b749558fa094f4)