Amazon Rekognition 人工知能で画像分析 Part 2。人物を見分ける

前回の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. (Source)

コレクションの作成

それでは実際に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上で動くシステムから、外部のクラウドサービスに問い合わせることも必要なく、自前で同じ機能を作る必要もないので、とても便利でアプリケーションの幅も広がると思います。

APN Consulting Partner
スーパーソフトウエアはAWSパートナーネットワーク(APN)のコンサルティングパートナーです。