CA MOBILE エンジニアブログ

株式会社シーエー・モバイルのエンジニアブログです

Amazon Rekognition:AIはどこまで顔を「見分け」られるのか

f:id:cam-engineer:20171220161612p:plain

「mimi」というマッチングアプリの開発リーダーをしているYと申します。

昨今、非常な盛り上がりを見せるマッチングサービス市場。数あるマッチングサービスの中で、mimiは、異性を「好みの顔」で検索できるという点でユニークです。

お相手検索画面では、顔の各パーツや、メガネやほくろなどの特徴を含めて、詳細な設定ができる仕様になっています。


f:id:cam-engineer:20171221153717p:plain


このようなサービスに携わっているため、当然ながら、顔を解析できる Amazon Rekognition というサービスはチェックせずにはいられません。

aws.amazon.com


Rekognitionは、ディープラーニングに基づくイメージ認識サービスで、 画像の分析を行い、画像内の物体 / シーン / テキスト / 顔の検出 / 有名人の認識 / および不適切なコンテンツの識別など用途別に行えます。 写っている人間の感情なんかも分析できちゃいます。 全てAPIで使用可能です。

* API一覧


Rekognitionは各言語のAWS SDKのバージョン3.X以降で使用可能です。 当社はPHPなので下記を使用します。

Class Aws\Rekognition\RekognitionClient | AWS SDK for PHP 3.x



今回は例として、CompareFaces という、 顔を比較して同一人物かどうかを判定するAPI を試してみます。 使い方はこんな感じです。

require('aws.phar');

public function main() {
    $rekognitionObject = new Aws\Rekognition\RekognitionClient([
        'credentials' => array(
            'key'   => '{Access key ID}',
            'secret'=> '{Secret access key}'
        ),
        'region'    => 'us-east-1', //北バージニア。アジアリージョン未対応
        'version'   => 'latest'
    ]);

    $result = $rekognitionObject->compareFaces([
        'SimilarityThreshold' => 80,
        'SourceImage' => [
            'Bytes' => file_get_contents([比較元画像URL]),
        ],
        'TargetImage' => [
            'Bytes' => file_get_contents([比較対象画像URL]),
        ]
    ]);

    print $result;
}

簡単ですね!
SimilarityThreshold は似ているかどうかの閾値で、任意に設定できます。
これを上回ると、解析結果のjsonのFaceMatchesフィールドに格納され、下回るとUnmatchedFaces フィールドに格納されます。



では、実際にその精度を試してみましょう。 まずは、同一人物の角度の違う2枚の写真を比較してみます。

f:id:cam-engineer:20171221151111p:plain f:id:cam-engineer:20171221151148p:plain


分析結果は、こちら。

{
    "SourceImageFace": {
        "BoundingBox": {
            "Width": 0.25256410241127,
            "Height": 0.2512820661068,
            "Left": 0.3705128133297,
            "Top": 0.26538461446762
        },
        "Confidence": 99.999824523926
    },
    "FaceMatches": [
        {
            "Similarity": 98,
            "Face": {
                "BoundingBox": {
                    "Width": 0.28333333134651,
                    "Height": 0.28461539745331,
                    "Left": 0.31538462638855,
                    "Top": 0.18974359333515
                },
                "Confidence": 99.997886657715,
                "Landmarks": [
                    {
                        "Type": "eyeLeft",
                        "X": 0.42768383026123,
                        "Y": 0.29014077782631
                    },
                    {
                        "Type": "eyeRight",
                        "X": 0.49286016821861,
                        "Y": 0.28425085544586
                    },
                    {
                        "Type": "nose",
                        "X": 0.50119709968567,
                        "Y": 0.32937732338905
                    },
                    {
                        "Type": "mouthLeft",
                        "X": 0.45904204249382,
                        "Y": 0.39162644743919
                    },
                    {
                        "Type": "mouthRight",
                        "X": 0.50256037712097,
                        "Y": 0.38697201013565
                    }
                ],
                "Pose": {
                    "Roll": -8.2033309936523,
                    "Yaw": 33.082740783691,
                    "Pitch": -10.33957862854
                },
                "Quality": {
                    "Brightness": 64.160514831543,
                    "Sharpness": 99.984878540039
                }
            }
        }
    ],
    "UnmatchedFaces": [],
    "SourceImageOrientationCorrection": "ROTATE_0",
    "TargetImageOrientationCorrection": "ROTATE_0",
    "@metadata": {
        "statusCode": 200,
        "effectiveUri": "https:\/\/rekognition.us-east-1.amazonaws.com",
        "headers": {
            "content-type": "application\/x-amz-json-1.1",
            "date": "Thu, 21 Dec 2017 06:10:30 GMT",
            "x-amzn-requestid": "a330b7fd-e615-11e7-a4e4-e179fc5bfb6c",
            "content-length": "996",
            "connection": "keep-alive"
        },
        "transferStats": {
            "http": [
                []
            ]
        }
    }
}


一致率は、 "Similarity"というフィールドの値で確認できます。

結果は・・・

"Similarity": 98,
高い一致率になりましたね。素晴らしい!



ちょっと難易度をあげてみます。
同一人物ですが、1年で約30Kg減量し、風貌が変わった人のビフォー・アフター写真です。

f:id:cam-engineer:20171220132515p:plain f:id:cam-engineer:20171220132533p:plain
結果は・・・

"Similarity": 75,
こちらは一致率75%と、 80%とは行きませんでしたが、高い一致率でした。



さらに難易度をあげましょう。次は、よく似ていますが、著名人と一般人、全く別人の写真です。どうでしょうか?

f:id:cam-engineer:20171220132546p:plain f:id:cam-engineer:20171220132557p:plain
結果は・・・

"Similarity": 67,
別人のため、一致率はだいぶ低くなりましたね。



マスク顔でも試してみましょう。

f:id:cam-engineer:20171221151821p:plain f:id:cam-engineer:20171221151832p:plain
結果は・・・

"Similarity": 86,
結果は一致率86%。高い一致率でした。



最後に、「すっぴん&メガネ」と「フルメイク&ヘアセット」ではどうなるでしょう。

f:id:cam-engineer:20171221161312p:plain f:id:cam-engineer:20171221161324p:plain
結果は・・・

"Similarity": 80,
一致率80%、こちらもほぼ本人という分析結果となりました。


Rekognitionの精度の肌感、伝わりましたでしょうか?
使った感じだと、一致率が75% 〜 80%以上だと同一人物と言っていいと思います。

だいぶ高い精度で同一人物判定してくれるので、例えば、画像検閲や顔認証などで使えるかもしれませんね。


rekognitionには、他にも色々APIが提供されています。代表的なものを上げておきます。


  • detectFaces
    顔を解析、性別/推定年齢/感情/ヒゲ/メガネなどの情報を取得できます。

  • detectText
    画像内の文字を識別できます。

  • recognizeCelebrities
    有名人を識別できます。

  • searchFacesByImage
    大量の画像から似た顔を検出できます。

  • DetectModerationLabels
    アダルトコンテンツを検出できます。



また、つい最近 AWS re:Invent 2017 [Amazon Rekognition Video] も発表されましたね。 こちらは動画が解析可能になっており、人物/物体の検出や追跡、有名人や何をしているのか、などが取得できます


このように簡単に画像や動画の解析ができます。 画像・動画系サービスに取り入れることで、検閲の効率化などはもちろん、より面白い使い方が見つかるかもしれませんね!



( サーバサイドエンジニア Y )

クリスマスまでに探そう好きな顔  mimi-lab.jp