はじめに
前回のAmazon Rekognitionのディープラーニングを使った画像分析AIからの続きです。
今回は人物の顔をAmazon Rekognitionに学習させておいて、新しい顔の画像が入力されたときに、これは誰かということを判定させてみましょう。
特徴量とプライバシー
私たちも普段の生活で他人を見分けるときに、顔であったり、電話であれば声であったりで見分けますが、コンピュータが人物の判別を行うためには、人間の顔などを元にある計算をして得られた数字(厳密には行列)が必要になります。
それを特徴量と呼んでいて、「人物を見分ける」ということを技術的に言い換えると、対象となるデータから抽出した特徴量に対して、既存データの特徴量と比較して一致する割合を求める、ということになります。
顔の画像を入力する、インターネット経由でアップロードする、というとプライバシーが気になることもあるかもしれません。
ですがほとんどの場合、AIシステム側では入力された顔の画像そのものは破棄され、特徴量、つまりベクトル・行列の数字だけが保存されるので心配はありません。
Amazon Rekognitionでも、ドキュメントを読むと数字だけしか保存してないよ、と書かれています。
Amazon Rekognition does not save the actual faces detected. Instead, the underlying detection algorithm first detects the faces in the input image, and for each face extracts facial features into a feature vector, and stores it in the back-end database.
IndexFaces – Amazon Rekognition
コレクションの作成
それでは実際にAmazon Rekognitionを使っていきましょう。
手順としては、
* コレクションを作成する
* コレクションごとに顔を何枚か登録する
* 新しい画像の顔が誰かを判定する
以上の3ステップです。
まずはコレクションを作成します。
ここではexample1とexample2という名前で作成します。
$ aws --region us-west-2 rekognition create-collection --collection-id "example1"
aws:rekognition:us-west-2:9xxxxxxxxxxx:collection/example1 200
$ aws --region us-west-2 rekognition create-collection --collection-id "example2"
aws:rekognition:us-west-2: 9xxxxxxxxxxx:collection/example2 200
作成できているか確認。
$ aws --region us-west-2 rekognition list-collections --output json
{
"CollectionIds": [
"example1",
"example2"
]
}
顔画像の登録
次に、人物の顔画像をコレクションに登録していきます。
example1には、予めS3にアップロードしておいた6枚の画像を登録します。
登録には、rekognitionのindex-facesというAPIを使って登録していきます。
$ aws --region us-west-2 rekognition index-faces --image '{"S3Object":{"Bucket":"ssw-uswest","Name":"p1.jpg"}}' --collection-id "example1"
FACE 99.9820861816 7ed19f94-0a3e-5e1c-8688-0e591e5f13f1 cb7b1120-bb11-57af-95b5-6cd90f1c7464
BOUNDINGBOX 0.624444425106 0.135925456882 0.246666669846 0.6760186553
FACEDETAIL 99.9820861816
BOUNDINGBOX 0.624444425106 0.135925456882 0.246666669846 0.6760186553
LANDMARKS eyeLeft 0.359773367643 0.481196790934
LANDMARKS eyeRight 0.600841760635 0.513329684734
LANDMARKS nose 0.436288028955 0.636127233505
LANDMARKS mouthLeft 0.34028622508 0.658965647221
LANDMARKS mouthRight 0.576818466187 0.691983640194
POSE -19.3954772949 8.71556091309 -8.92338943481
QUALITY 64.3249664307 99.996711731
同様にして、必要枚数分登録します。
コレクションに登録されているか確認するにはlist-facesで一覧が出てきます。
$ aws --region us-west-2 rekognition list-faces --collection-id "example1" --output json
{
"Faces": [
{
"BoundingBox": {
"Width": 0.5247660279273987,
"Top": 0.20655299723148346,
"Left": 0.22398599982261658,
"Height": 0.5854700207710266
},
"FaceId": "3b486e99-23b6-54e6-90c4-ab65ab79e55d",
"Confidence": 99.90660095214844,
"ImageId": "f41b98bb-32eb-5d82-a622-d8a00b593d3f"
},
{
"BoundingBox": {
"Width": 0.676019012928009,
"Top": 0.24666699767112732,
"Left": 0.13592499494552612,
"Height": 0.6244440078735352
},
"FaceId": "7ed19f94-0a3e-5e1c-8688-0e591e5f13f1",
"Confidence": 99.98210144042969,
"ImageId": "cb7b1120-bb11-57af-95b5-6cd90f1c7464"
},
(中略)
{
"BoundingBox": {
"Width": 0.36162200570106506,
"Top": 0.2854500114917755,
"Left": 0.27382901310920715,
"Height": 0.32252100110054016
},
"FaceId": "fbf613f9-7312-5b79-82ca-e0735678119a",
"Confidence": 99.87919616699219,
"ImageId": "47dcc097-9559-5725-9dfc-2250b9e58f86"
}
]
}
example2のコレクションには別の人物を登録してきましょう。
この6枚の画像を登録します。
$ aws --region us-west-2 rekognition index-faces --image '{"S3Object":{"Bucket":"ssw-uswest","Name":"s1.jpg"}}' --collection-id "example2"
FACE 99.8654632568 960ee5e0-acc5-5bbe-ab8e-a733e43353cc 22c69ff9-5af4-5b1b-90db-fa831316f755
BOUNDINGBOX 0.587318062782 0.0889060720801 0.235620230436 0.655199050903
FACEDETAIL 99.8654632568
BOUNDINGBOX 0.587318062782 0.0889060720801 0.235620230436 0.655199050903
LANDMARKS eyeLeft 0.289740294218 0.453653484583
LANDMARKS eyeRight 0.494746804237 0.424456834793
LANDMARKS nose 0.361875385046 0.532552719116
LANDMARKS mouthLeft 0.333543479443 0.690143883228
LANDMARKS mouthRight 0.490955203772 0.670768678188
POSE 8.94451999664 -8.30638980865 -12.7882680893
QUALITY 51.3937301636 99.98487854
example2の登録内容もlist-facesで確認しておきましょう。
$ aws --region us-west-2 rekognition list-faces --collection-id "example2" --output json
{
"Faces": [
{
"BoundingBox": {
"Width": 0.7095239758491516,
"Top": 0.19555599987506866,
"Left": 0.2968670129776001,
"Height": 0.6399999856948853
},
"FaceId": "0201a843-75c3-5d69-8481-e9f0db545c5e",
"Confidence": 99.96510314941406,
"ImageId": "a1bb952e-648a-5197-904f-e891d301809f"
},
{
"BoundingBox": {
"Width": 0.6551989912986755,
"Top": 0.23562000691890717,
"Left": 0.08890610188245773,
"Height": 0.5873180031776428
},
"FaceId": "960ee5e0-acc5-5bbe-ab8e-a733e43353cc",
"Confidence": 99.8655014038086,
"ImageId": "22c69ff9-5af4-5b1b-90db-fa831316f755"
},
(中略)
{
"BoundingBox": {
"Width": 0.6888629794120789,
"Top": 0.16906200349330902,
"Left": 0.15499399602413177,
"Height": 0.5071849822998047
},
"FaceId": "efa76215-f90e-5fdd-a459-6c90ec57a9cb",
"Confidence": 99.98760223388672,
"ImageId": "8e9a3dd1-9beb-5f41-8ab9-87689d4713e3"
}
]
}
人物を見分ける
では、人物を見分けられるか試してみます。
対象となる画像は、example1の人ですが、登録済みの画像にはない新しい画像です。
登録済みの顔を元にして、example1の人であって、example2の人ではないという答えが返ってくれば正解です。
APIは、search-faces-by-imageを使います。
コレクションのなかからマッチしたかどうかを返してくれますが、しきい値が設定できるので90%以上の確率で一致しているものに限定しましょう。
まずexmaple1と一致するか問い合わせてみます。
$ aws --region us-west-2 rekognition search-faces-by-image --image '{"S3Object":{"Bucket":"ssw-uswest","Name":"p9.jpg"}}' --collection-id "example1" --face-match-threshold 90 --output json
{
"SearchedFaceBoundingBox": {
"Width": 0.5719920992851257,
"Top": 0.3454830050468445,
"Left": 0.2691727578639984,
"Height": 0.550089418888092
},
"SearchedFaceConfidence": 99.93241882324219,
"FaceMatches": [
{
"Face": {
"BoundingBox": {
"Width": 0.36162200570106506,
"Top": 0.2854500114917755,
"Left": 0.27382901310920715,
"Height": 0.32252100110054016
},
"FaceId": "fbf613f9-7312-5b79-82ca-e0735678119a",
"Confidence": 99.87919616699219,
"ImageId": "47dcc097-9559-5725-9dfc-2250b9e58f86"
},
"Similarity": 94.93853759765625
},
{
"Face": {
"BoundingBox": {
"Width": 0.8168699741363525,
"Top": 0.24555200338363647,
"Left": 0.008406889624893665,
"Height": 0.7316460013389587
},
"FaceId": "e7da8c07-bea6-5051-8b56-62c009770c50",
"Confidence": 99.80030059814453,
"ImageId": "2bd9740e-42cd-5b1d-b56c-9dab116c79d6"
},
"Similarity": 93.45394134521484
},
{
"Face": {
"BoundingBox": {
"Width": 0.4648289978504181,
"Top": 0.2597399950027466,
"Left": 0.228301003575325,
"Height": 0.4535459876060486
},
"FaceId": "f726676c-34aa-5983-b7d7-e685e67c8fb1",
"Confidence": 99.80549621582031,
"ImageId": "a17f67f7-51fe-5d5f-a2ac-f2e27b63a041"
},
"Similarity": 91.92501068115234
}
]
}
FaceMatchesに一致した顔画像とその類似度(Similarity)が配列で入っています。
example2にも問い合わせてみます。
$ aws --region us-west-2 rekognition search-faces-by-image --image '{"S3Object":{"Bucket":"ssw-uswest","Name":"p9.jpg"}}' --collection-id "example2" --face-match-threshold 90 --output json
{
"SearchedFaceBoundingBox": {
"Width": 0.5719920992851257,
"Top": 0.3454830050468445,
"Left": 0.2691727578639984,
"Height": 0.550089418888092
},
"SearchedFaceConfidence": 99.93241882324219,
"FaceMatches": []
}
こちらはマッチしません。
このため、対象画像はexample1さんで間違いないですね。
もう1人、example2さんの新しい画像。
この画像も、予め登録されている画像ではありません。
example1に一致するかどうか投げてみると、
$ aws --region us-west-2 rekognition search-faces-by-image --image '{"S3Object":{"Bucket":"ssw-uswest","Name":"s9.jpg"}}' --collection-id "example1" --face-match-threshold 90 --output json
{
"SearchedFaceBoundingBox": {
"Width": 0.588771402835846,
"Top": 0.24923793971538544,
"Left": 0.2150929570198059,
"Height": 0.579164445400238
},
"SearchedFaceConfidence": 99.95811462402344,
"FaceMatches": []
}
FaceMatchesが空で、確かにマッチしませんね。
example2に投げてみると、
$ aws --region us-west-2 rekognition search-faces-by-image --image '{"S3Object":{"Bucket":"ssw-uswest","Name":"s9.jpg"}}' --collection-id "example2" --face-match-threshold 90 --output json
{
"SearchedFaceBoundingBox": {
"Width": 0.588771402835846,
"Top": 0.24923793971538544,
"Left": 0.2150929570198059,
"Height": 0.579164445400238
},
"SearchedFaceConfidence": 99.95811462402344,
"FaceMatches": [
{
"Face": {
"BoundingBox": {
"Width": 0.5712910294532776,
"Top": 0.22864599525928497,
"Left": 0.32185399532318115,
"Height": 0.581413984298706
},
"FaceId": "225f96eb-23f5-55d0-874b-b7db6666cecd",
"Confidence": 99.96129608154297,
"ImageId": "511964a2-6171-588f-a6a0-e16fe4f6bb87"
},
"Similarity": 98.59867858886719
},
{
"Face": {
"BoundingBox": {
"Width": 0.5144079923629761,
"Top": 0.2801240086555481,
"Left": 0.21671800315380096,
"Height": 0.4802129864692688
},
"FaceId": "0be39cea-147c-5c8d-855c-5afd68b411a2",
"Confidence": 99.99629974365234,
"ImageId": "6ee5025e-d3ed-5af2-b53f-53999e24eebe"
},
"Similarity": 94.1417236328125
},
{
"Face": {
"BoundingBox": {
"Width": 0.7099019885063171,
"Top": 0.2242860049009323,
"Left": 0.2107200026512146,
"Height": 0.6080250144004822
},
"FaceId": "46760567-dbf5-50b0-a28d-f960178c1f8c",
"Confidence": 99.90149688720703,
"ImageId": "cb7f72be-0b72-5c03-a0f4-279a90143371"
},
"Similarity": 90.0370864868164
}
]
}
こちらはマッチしています。
まとめ
今回は、コレクションごとにたった6つのサンプル画像を登録しただけですが、新しい顔画像がどちらの人物なのかを簡単に見分けることが出来ました。
AWSで画像分析のサービスがあることで、AWS上で動くシステムから、外部のクラウドサービスに問い合わせることも必要なく、自前で同じ機能を作る必要もないので、とても便利でアプリケーションの幅も広がると思います。