[アップデート] Amazon Rekognition で顔写真の視線の方向(Eye Direction)を検出できるようになりました

2023.05.28

こんにちは、CX事業本部 Delivery部の若槻です。

このたびの Amazon Rekognition アップデートにより、画像上の人物の視線の方向(Eye Direction)を検出できるようになりました。

DetectFaces API や IndexFaces API のドキュメントには、Attributes として新たに EYE_DIRECTION が追加されており、ヨー (垂直軸上の回転) 角度とピッチ (水平軸上の回転) 角度を検出できるようになっているとのことです。

今まで検出できたのは顔の方向のみでしたが、目線検出によるアイトラッキングもできるようになったことで、次のようなユースケースでの活用が期待されます。

  • 視線対応ナビゲーションを通じた、身体的な移動に制限があるユーザーのアプリケーションのアクセシビリティ向上
  • ドライバーが道路から目をそらしているかどうかを検出することによる、ドライバーの安全性向上
  • ユーザーの視線の追跡による広告効果の分析
  • ユーザーや従業員のプロフィール写真の品質とコンプライアンスの検証

試してみた

Facial analysis メニュー ではサンプル画像または自分が用意した画像から顔を検出して、その顔の属性を表示するデモアプリが利用ができるので、こちらから試してみます。

サングラスを掛けている場合は信頼度高く検出できない

メニューを開いたらデフォルトで「サングラスを掛けた女性」のサンプル画像の顔検出が行われ、レスポンスが出力されています。

Request

{
    "Image": {
        "S3Object": {
            "Bucket": "rekognition-console-v4-prod-nrt",
            "Name": "assets/StaticImageAssets/SampleImages/drive.jpg"
        }
    },
    "Attributes": [
        "ALL"
    ]
}

リクエストの AttributesALL が指定されているため、顔の検出結果として全属性が出力されています。

Response

{
    "FaceDetails": [
        {
            "BoundingBox": {
                "Width": 0.20728477835655212,
                "Height": 0.4028930068016052,
                "Left": 0.1565658152103424,
                "Top": 0.1370398998260498
            },
            "AgeRange": {
                "Low": 25,
                "High": 35
            },
            "Smile": {
                "Value": false,
                "Confidence": 63.57194137573242
            },
            "Eyeglasses": {
                "Value": true,
                "Confidence": 99.99999237060547
            },
            "Sunglasses": {
                "Value": true,
                "Confidence": 99.83882904052734
            },
            "Gender": {
                "Value": "Female",
                "Confidence": 99.97936248779297
            },
            "Beard": {
                "Value": false,
                "Confidence": 94.43787384033203
            },
            "Mustache": {
                "Value": false,
                "Confidence": 98.39974975585938
            },
            "EyesOpen": {
                "Value": true,
                "Confidence": 98.76766204833984
            },
            "MouthOpen": {
                "Value": true,
                "Confidence": 88.39057159423828
            },
            "Emotions": [
                {
                    "Type": "HAPPY",
                    "Confidence": 70.06643676757812
                },
                {
                    "Type": "SURPRISED",
                    "Confidence": 8.027836799621582
                },
                {
                    "Type": "CALM",
                    "Confidence": 7.5097336769104
                },
                {
                    "Type": "ANGRY",
                    "Confidence": 7.021594047546387
                },
                {
                    "Type": "FEAR",
                    "Confidence": 6.878425121307373
                },
                {
                    "Type": "CONFUSED",
                    "Confidence": 5.264672756195068
                },
                {
                    "Type": "DISGUSTED",
                    "Confidence": 3.5239059925079346
                },
                {
                    "Type": "SAD",
                    "Confidence": 2.461644411087036
                }
            ],
            "Landmarks": [
                {
                    "Type": "eyeLeft",
                    "X": 0.23198963701725006,
                    "Y": 0.28643643856048584
                },
                {
                    "Type": "eyeRight",
                    "X": 0.3235231637954712,
                    "Y": 0.27650442719459534
                },
                {
                    "Type": "mouthLeft",
                    "X": 0.2467770278453827,
                    "Y": 0.4382726550102234
                },
                {
                    "Type": "mouthRight",
                    "X": 0.3232266306877136,
                    "Y": 0.42945173382759094
                },
                {
                    "Type": "nose",
                    "X": 0.2997436821460724,
                    "Y": 0.3558330237865448
                },
                {
                    "Type": "leftEyeBrowLeft",
                    "X": 0.18932999670505524,
                    "Y": 0.2583378255367279
                },
                {
                    "Type": "leftEyeBrowRight",
                    "X": 0.25499090552330017,
                    "Y": 0.23719875514507294
                },
                {
                    "Type": "leftEyeBrowUp",
                    "X": 0.22466374933719635,
                    "Y": 0.23337897658348083
                },
                {
                    "Type": "rightEyeBrowLeft",
                    "X": 0.3075791299343109,
                    "Y": 0.2318745106458664
                },
                {
                    "Type": "rightEyeBrowRight",
                    "X": 0.34850648045539856,
                    "Y": 0.24108198285102844
                },
                {
                    "Type": "rightEyeBrowUp",
                    "X": 0.33046776056289673,
                    "Y": 0.2224227786064148
                },
                {
                    "Type": "leftEyeLeft",
                    "X": 0.21311819553375244,
                    "Y": 0.28864786028862
                },
                {
                    "Type": "leftEyeRight",
                    "X": 0.24986368417739868,
                    "Y": 0.28610870242118835
                },
                {
                    "Type": "leftEyeUp",
                    "X": 0.23217180371284485,
                    "Y": 0.2785497009754181
                },
                {
                    "Type": "leftEyeDown",
                    "X": 0.23257800936698914,
                    "Y": 0.29334935545921326
                },
                {
                    "Type": "rightEyeLeft",
                    "X": 0.305154412984848,
                    "Y": 0.28018122911453247
                },
                {
                    "Type": "rightEyeRight",
                    "X": 0.3372015357017517,
                    "Y": 0.2750265896320343
                },
                {
                    "Type": "rightEyeUp",
                    "X": 0.32413217425346375,
                    "Y": 0.26861634850502014
                },
                {
                    "Type": "rightEyeDown",
                    "X": 0.3232560157775879,
                    "Y": 0.28335249423980713
                },
                {
                    "Type": "noseLeft",
                    "X": 0.2715092897415161,
                    "Y": 0.3788992762565613
                },
                {
                    "Type": "noseRight",
                    "X": 0.3054922819137573,
                    "Y": 0.37508466839790344
                },
                {
                    "Type": "mouthUp",
                    "X": 0.2917945683002472,
                    "Y": 0.41236862540245056
                },
                {
                    "Type": "mouthDown",
                    "X": 0.2911905348300934,
                    "Y": 0.45928117632865906
                },
                {
                    "Type": "leftPupil",
                    "X": 0.23198963701725006,
                    "Y": 0.28643643856048584
                },
                {
                    "Type": "rightPupil",
                    "X": 0.3235231637954712,
                    "Y": 0.27650442719459534
                },
                {
                    "Type": "upperJawlineLeft",
                    "X": 0.14873090386390686,
                    "Y": 0.3066073954105377
                },
                {
                    "Type": "midJawlineLeft",
                    "X": 0.17836853861808777,
                    "Y": 0.46686822175979614
                },
                {
                    "Type": "chinBottom",
                    "X": 0.2866045832633972,
                    "Y": 0.5405004620552063
                },
                {
                    "Type": "midJawlineRight",
                    "X": 0.34070897102355957,
                    "Y": 0.448843389749527
                },
                {
                    "Type": "upperJawlineRight",
                    "X": 0.3485998511314392,
                    "Y": 0.28515905141830444
                }
            ],
            "Pose": {
                "Roll": -0.9150228500366211,
                "Yaw": 17.985288619995117,
                "Pitch": 8.063776016235352
            },
            "Quality": {
                "Brightness": 70.32808685302734,
                "Sharpness": 97.45164489746094
            },
            "Confidence": 99.99929809570312,
            "FaceOccluded": {
                "Value": true,
                "Confidence": 99.9787368774414
            },
            "EyeDirection": {
                "Yaw": 27.69793701171875,
                "Pitch": -10.812150001525879,
                "Confidence": 0.00010036714957095683
            }
        }
    ]
}

EyeDirection 属性のみ抽出したものが以下となります。

    "EyeDirection": {
        "Yaw": 27.69793701171875,
        "Pitch": -10.812150001525879,
        "Confidence": 0.00010036714957095683
    }

Yaw(ヨー角度)と Pitch(ピッチ角度)が出力されていますが、Confidence(信頼度)が 非常に低い値となっています。サンプル画像のような、サングラスを掛けるなどして目線が分からない顔の場合はちゃんと低信頼度と判定されるようです。

目線が分かる画像の場合は信頼度高く検出できる

当然ですが、顔写真から目線が分かる場合は信頼度高く検出することができます。

もう一つのサンプル画像である、「3人の人物」が写った写真で試してみます。

レスポンスより EyeDirection 属性を抽出したものが以下となります。どの結果も信頼度が 99% 以上と高い値となっています。

// 中央の男性
{
    "Yaw": 9.898421287536621,
    "Pitch": -11.406840324401855,
    "Confidence": 99.96870422363281
}

// 右側の女性
{
    "Yaw": -11.436605453491211,
    "Pitch": -20.725038528442383,
    "Confidence": 99.96870422363281
}

// 左側の子供
{
    "Yaw": 32.46660614013672,
    "Pitch": -17.46123504638672,
    "Confidence": 99.751708984375
}

出力結果と元の写真を見比べる限り、目線の方向は、画面に対してではなく、顔の向きに対しての角度となっているようです。

例えば子供の顔は写真右手を向いていますが、目線は正面を向いているため、ヨー角度が 32 と正方向に大きくなっています。

なぜか AWS CLI では EYE_DIRECTION 属性が出力されない

続いて AWS CLI でも試そうとしたのですが、なぜか EYE_DIRECTION 属性が出力されないという自体に遭遇しました。

試したのは AWS CLI の index-faces コマンドです。

Bing Image Create で作成した人物の画像を検出させてみます。

取得したい属性に EYE_DIRECTION を指定してコマンドを実行しても、なぜか EYE_DIRECTION が出力されません。

$ aws rekognition index-faces \
  --collection-id "test-collection" \
  --image '{"S3Object":{"Bucket":"20230523-test-bucket","Name":"image1.jpeg"}}' \
  --detection-attributes "EYE_DIRECTION"
{
    "FaceRecords": [
        {
            "Face": {
                "FaceId": "5f0cfeeb-c185-4c0d-a474-34f5d484e230",
                "BoundingBox": {
                    "Width": 0.20229196548461914,
                    "Height": 0.2898021340370178,
                    "Left": 0.4776949882507324,
                    "Top": 0.13333888351917267
                },
                "ImageId": "6d5906be-bd64-3b57-8bbd-6091f5cb2035",
                "Confidence": 99.99880981445312
            },
            "FaceDetail": {
                "BoundingBox": {
                    "Width": 0.20229196548461914,
                    "Height": 0.2898021340370178,
                    "Left": 0.4776949882507324,
                    "Top": 0.13333888351917267
                },
                "Landmarks": [
                    {
                        "Type": "eyeLeft",
                        "X": 0.5029387474060059,
                        "Y": 0.2510673999786377
                    },
                    {
                        "Type": "eyeRight",
                        "X": 0.5720778703689575,
                        "Y": 0.25842443108558655
                    },
                    {
                        "Type": "mouthLeft",
                        "X": 0.5181084275245667,
                        "Y": 0.3508610427379608
                    },
                    {
                        "Type": "mouthRight",
                        "X": 0.5754076838493347,
                        "Y": 0.3578391969203949
                    },
                    {
                        "Type": "nose",
                        "X": 0.5053436160087585,
                        "Y": 0.30905431509017944
                    }
                ],
                "Pose": {
                    "Roll": -4.395340919494629,
                    "Yaw": -40.20028305053711,
                    "Pitch": -2.278932809829712
                },
                "Quality": {
                    "Brightness": 87.64148712158203,
                    "Sharpness": 92.22801208496094
                },
                "Confidence": 99.99880981445312
            }
        }
    ],
    "FaceModelVersion": "6.0",
    "UnindexedFaces": []
}

ALL を指定すると、EYE_DIRECTION 以外の属性が出力されます。AWS CLI の index-faces コマンドのドキュメントには EYE_DIRECTION 属性も指定可能とありましたが、出力はまだ出来るようになっていないようなので、気を付けた方が良さそうです。

おわりに

Amazon Rekognition で顔写真の視線の方向(Eye Direction)を検出できるようになったので、試してみました。

このアップデートを受けて真っ先に思い浮かんだのが以前に話題になった下記のブログ記事です。

こちらの記事ではApple標準フレームワークを利用していましたが、同じことが Amazon Rekognition の API でも実現できるのではないでしょうか。

以上