Amazon Rekognition による「顔からの同一人物判定」をブラウザから試す

## はじめに

AWS は様々な AI サービスを提供しています

そして、それらのサービスはブラウザから簡単に試せるようになっています

https://aws.amazon.com/jp/free/machine-learning/

| サービス    | 機能                     | お試し記事     | Elixir 実装例 |
|:------------|:-------------------------|:----------------| :-----|
| Transcribe  |音声の文字起こし（音声認識）| [参照](https://qiita.com/RyoWakabayashi/private/396e2047d377e258950f)  | [参照](https://qiita.com/RyoWakabayashi/items/1fc64587c9fa352935c6) |
| Polly       |文書の読み上げ（音声合成）  | [参照](https://qiita.com/RyoWakabayashi/private/2aad1952f63b4e76b652) | [参照](https://qiita.com/RyoWakabayashi/items/93adae047ccb4fee8d78) |
| Lex         |チャットボット             | [参照](https://qiita.com/RyoWakabayashi/private/6c7e7a248e192f3a8afc) | Coming Soon... |
| Translate   |翻訳                      | [参照](https://qiita.com/RyoWakabayashi/private/688418e52cde44871c1e) | [参照](https://qiita.com/RyoWakabayashi/items/5f262ba0d1e11219edec) |
| Rekognition |画像認識<br/>顔認識        | [参照](https://qiita.com/RyoWakabayashi/private/d8c7f57a71e83d9140d5)<br/>[参照](https://qiita.com/RyoWakabayashi/private/10f93c3417041b005c31)  | [参照](https://qiita.com/RyoWakabayashi/items/2219e84642ff2d05481c) |
| Textract    |画像からの表データ読込     | [参照](https://qiita.com/RyoWakabayashi/private/b7bd7079d20326d9e4be) | [参照](https://qiita.com/RyoWakabayashi/items/7c26d0dda7d566adc694) |
| Bedrock     |生成AIによるチャット、画像生成| [参照](https://qiita.com/RyoWakabayashi/private/5680a4bac246a1a0c532) | [参照](https://qiita.com/RyoWakabayashi/private/bb85dd2286420205e2da) |

本記事では AWS の AI 画像処理サービス Amazon Rekognition の顔検出、顔識別をブラウザから試してみます

なお、物体検出、テキスト検出機能については以下の記事にまとめています

https://qiita.com/RyoWakabayashi/private/d8c7f57a71e83d9140d5

## Amazon Rekognition とは

Amazon Rekognition　は AI モデルによって画像から物体や人物の顔を検出し、それが何であるか識別するサービスです

https://aws.amazon.com/jp/rekognition/

### Amazon Rekognition の使い途（ユースケース）

Amazon Rekognition は画像に何が写っているかだけでなく、それがどこにあるのかを返してくれます

Amazon Rekognition は以下のような用途に使用可能です

- 監視カメラ映像からの不審人物検出
- ドライブレコーダー映像からの車両検出
- 写真からのテキスト抽出
- 動画から特定人物が写った箇所だけを抽出

### Amazon Rekognition の料金

https://aws.amazon.com/jp/rekognition/pricing/

AWS の料金は基本的に従量課金制です

また、リージョン（サービス提供するサーバーが存在する地域）によって料金が異なります

Amazon Rekognition を東京リージョンで使う場合、静止画からの顔登録なら `$0.0013 / 枚`　、 顔ベクトルの保存は `$0.000013 / 顔数` の料金になります

`150 ¥/$` の場合、 `¥0.195 / 枚` = `¥１９５ / 千枚` 、 `¥0.00195 / 顔数` となります

例えば 1 万枚の写真に写る顔 3 万個を登録した場合、 ¥1,950 + ¥58.5 = ¥2008.5 請求されます

ただし、 AWS のサービスの多くには無料利用枠が存在します

> 無料利用枠
> AWS の無料利用枠の一環として、Amazon Rekognition Image を無料で開始していただけます。無料利用枠は 12 か月ご利用になれます。
> 画像分析: 無料利用枠期間中は、グループ 1 およびグループ 2 の API で、それぞれ 1 か月に 5,000 枚の画像を無料で分析することができます。 Image Properties は無料利用枠ではありません。
> 顔メタデータのストレージ:無料利用枠の期間中は、1 か月あたり 1,000 個の顔ベクトルオブジェクトと 1,000 個のユーザーベクトルオブジェクトを無料で保存できます。

グループ 1 は顔識別等に使う API で、グループ 2 がそれ以外です

無料利用期間中の場合、顔登録なら 5,000 枚、顔ベクトルの保存なら 1,000 個まで無料利用可能なため、本記事で実行する程度の処理であれば無料範囲内に収まります

## アカウント作成

Amazon Rekognition を使うためには、 AWS のアカウント作成が必要です

以下の公式手順に従って、アカウントを作成してください

:::note warn
クレジットカードと電話番号が必要になります

予めご用意ください
:::

https://aws.amazon.com/jp/register-flow/

## ブラウザからの顔識別実行

### Amazon Rekognition への移動

AWS のマネジメントコンソールにログインすると、以下のような画面が表示されます

https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1#

![スクリーンショット 2023-11-26 9.59.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/ccb18a17-4e2e-e5e6-098f-e779c8f69eef.png)

この画面から最近使ったサービスなどにアクセスできるようになっています

上メニューにある検索ボックスに `rek` と入力してみましょう

![スクリーンショット 2023-11-26 20.34.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/a49b7f51-870f-ae15-5e81-4bdff9311dd9.png)

サービスの候補として Amazon Rekognition が表示されます

Amazon Rekognition をクリックして、サービスページに移動しましょう

以下のような画面が表示されます

https://ap-northeast-1.console.aws.amazon.com/rekognition/home?region=ap-northeast-1#/

![スクリーンショット 2023-11-26 20.35.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/5fb6f2c7-aa16-f9fb-9c3a-ad014233eff6.png)

### 顔の分析

左メニューから「デモ」の「顔の分析」をクリックします

![スクリーンショット 2023-11-27 1.10.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/eece780e-bc09-e511-8e18-7a04b7571b0d.png)

左側の画像に対して右側に検出した顔、顔の属性情報が表示されます

- looks like a face = 顔らしい 99.9 %
- appears to be female = 女性のようだ 99.9 %
- age range 26 - 34 years old = 年齢は 26 歳から 34 歳の範囲
- smiling = 微笑んでいる 62.5 %
- appears to be happy = 幸せそうだ 92.1 %
- wearing glasses　= メガネをかけている 100 %
- wearing sunglasses = サングラスをかけている 100 %
- eyes are open = 目は開いている 98.7 %
- mouth is open = 口は開いている 94.8 %
- does not have a mustache = 口髭はない 99.9 %
- does not have a beard = 顎髭はない 89.5 %
- face is occluded = 顔が隠れている 99.9 %

左側の画像を見ると、四角形で顔の位置が特定されているとともに、両目、鼻の先端、口の両端に点があり、各位置が検出されていることがわかります

右下「レスポンス」をクリックすると、以下のようなテキストが表示されます

```json
{
    "FaceDetails": [
        {
            "BoundingBox": {
                "Width": 0.20728477835655212,
                "Height": 0.4028930068016052,
                "Left": 0.1565658152103424,
                "Top": 0.1370398998260498
            },
            "AgeRange": {
                "Low": 26,
                "High": 34
            },
            "Smile": {
                "Value": true,
                "Confidence": 62.520973205566406
            },
            "Eyeglasses": {
                "Value": true,
                "Confidence": 100
            },
            "Sunglasses": {
                "Value": true,
                "Confidence": 100
            },
            "Gender": {
                "Value": "Female",
                "Confidence": 99.9395751953125
            },
            ...
            "MouthOpen": {
                "Value": true,
                "Confidence": 94.88209533691406
            },
            "Emotions": [
                {
                    "Type": "HAPPY",
                    "Confidence": 92.1875
                },
                {
                    "Type": "CALM",
                    "Confidence": 0.7694244384765625
                },
                {
                    "Type": "CONFUSED",
                    "Confidence": 0.0025272369384765625
                },
                {
                    "Type": "SURPRISED",
                    "Confidence": 0.0012367963790893555
                },
                {
                    "Type": "DISGUSTED",
                    "Confidence": 0.00011920928955078125
                },
                {
                    "Type": "ANGRY",
                    "Confidence": 0.00005364418029785156
                },
                {
                    "Type": "FEAR",
                    "Confidence": 0
                },
                {
                    "Type": "SAD",
                    "Confidence": 0
                }
            ],
            "Landmarks": [
                {
                    "Type": "eyeLeft",
                    "X": 0.23198966681957245,
                    "Y": 0.28643640875816345
                },
                ...
                {
                    "Type": "upperJawlineRight",
                    "X": 0.34859994053840637,
                    "Y": 0.28515905141830444
                }
            ],
            "Pose": {
                "Roll": -0.9150252342224121,
                "Yaw": 17.985286712646484,
                "Pitch": 8.063772201538086
            },
            "Quality": {
                "Brightness": 70.32808685302734,
                "Sharpness": 97.45164489746094
            },
            "Confidence": 99.99929809570312,
            "FaceOccluded": {
                "Value": true,
                "Confidence": 99.9787368774414
            },
            "EyeDirection": {
                "Yaw": 27.70252227783203,
                "Pitch": -10.813572883605957,
                "Confidence": 0
            }
        }
    ]
}
```

画面上に表示されている各種情報が JSON という形式で表示されています

プログラムから Rekognition を使う場合、この JSON を読み込んで使うことになります

画面に出ていない情報として、 `Pose` や `EyeDirection` があり、これによって顔の向きと視線の向きが分かります
また、 `Quality` には `Brightness` = 明るさ、　`Sharpness` = 輪郭の鮮明さが取得されており、顔がどれくらいちゃんと写っているかを判定することが可能です

「アップロード またはドラッグアンドドロップ」のところから、自前の画像をアップロードしてみましょう

![スクリーンショット 2023-11-27 1.24.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/d6ef6a28-b0d4-317d-86cb-a62bc9bbad84.png)

私の顔写真でも正しく認識されました

### 顔の比較

左メニューから「デモ」の「顔の比較」をクリックします

![スクリーンショット 2023-11-27 1.26.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/b6010cbc-a338-6114-1b8b-f3d72cd57fde.png)

左側の二つの画像から、同一人物の顔を探しています
「結果」欄の一番上に同一人物について Similarity (類似度) 99.9 % と表示しており、確かに正しく判定できています

自前画像でもやってみましょう

![スクリーンショット 2023-11-27 1.40.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/fbc007b0-dba7-57b1-7161-7a52036b5e65.png)

驚くべきことに、プリクラで盛り盛りにした顔やイラスト化した顔、マスクで隠れた顔であっても、正しく私の顔を識別できています
しかも類似度 99.6 % 以上です

Rekognition の顔識別精度はかなりの高さと言えるでしょう

### 顔のライブネスチェック

「顔のライブネスチェック」では、カメラに写っている顔が、本当に生きている人物なのか、写真等でないかのチェックを実行できます

左メニューから「デモ」の「顔のライブネスチェック」をクリックします

![スクリーンショット 2023-11-27 1.45.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/c49285d8-6650-8153-a55e-9f75570216da.png)

「チェックの開始」をクリックします

ブラウザからカメラの使用許可を求められます

![スクリーンショット 2023-11-27 1.46.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/fe39bcf1-9c0f-481a-fcf5-fca0e1b3b0b6.png)

「許可する」をクリックします

あとは指示に従って後ろに下がったり近付いたりすると、「顔のライブネスチェック」が実行され、結果が右側に表示されました

![liveness.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/f37a5f49-e566-d9d8-e96e-665565fd3a2e.gif)

深夜2時の寝巻き姿ではありますが、 81.64 という高いスコアが表示されました

逆にスマホで表示した写真を使った場合、スコアは 0.01　でかなり低い数値になっています

![スクリーンショット 2023-11-27 1.53.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/84a0f4e7-1856-cd39-1e08-35c8bed1f672.png)

この機能を使うことで、顔認証時に写真等を使った「なりすまし」を防止できます

## まとめ

Rekognition の顔認識、顔識別を使うことで、高度な顔認証が実装可能です

ライブネスチェックのようなことも実装可能なので、実際の顔認証システムに組み込むことも検討できそうです