こんにちは。サーバーワークス こけし部 部長でCS課の坂本(@t_sakam)です。
今回もAWSの画像認識サービス、「Amazon Rekognition」を試してみました。
前回 は、マネジメントコンソールにデモ機能がある3つの機能を試しました。「物体やシーンの検知(DetectLabels)」、「顔の分析(DetectFaces)」、「顔の比較(CompareFaces)」の3つです。今回は、デモ機能が用意されていない、Rekognitionの「顔認識」機能を試します。
※Amazon Rekognitionの概要については、前回 の記事をご確認ください。
前回:Amazon Rekognition! AWSの画像認識サービスを試してみよう! - AIは「こけし」を判別できたのか? -
- 「顔認識」機能とは?
- 「コレクション」の作成(CreateCollection)
- 「顔」の登録(IndexFaces)
- 他の画像を登録
- まとめ
「顔認識」機能とは?
登録してある「顔」の中から指定した画像に写っている人物と同一人物である可能性が高い「顔」を検出する機能が「顔認識」機能です。
「顔の比較(CompareFaces)」機能は2枚の画像を比べるものですが、こちらの機能は登録してある大量の「顔」の中から同じ人物である可能性が高いものをピックアップするという使い方をします。
※記事が長くなってしまうので、今回は「顔の登録」までをおこないたいと思います。
「コレクション」の作成(CreateCollection)
最初に、Rekognitionの「顔認識」機能用のデータベースである「コレクション」を作成して、そこに「顔」を登録していきます。今回は、2体の「こけし」の画像を「コレクション」に登録していき、「こけし」ごとにあとから検索できるようにしたいと思います。
「顔認識」機能はマネジメントコンソールにデモ機能がないので、試してみたい場合は、実際にCLIやSDKを使ってAPI経由で試す必要があります。今回は「AWS SDK for Python (Boto3) 」を使いました。
「Kokeshi」コレクションを作成
import boto3
import json
client = boto3.client('rekognition')
response = client.create_collection(
CollectionId = 'Kokeshi'
)
response = json.dumps(response)
print(response)
「顔」の登録(IndexFaces)
次は「Kokeshi」コレクションに「顔」を登録していきます。
まずは、登録したい「顔」が写っている画像をS3に置きます。そのS3バケットと画像名を指定して登録をおこないます。登録されるデータは、顔の画像そのものではなく、顔のメタデータが登録されます。登録される顔のメタデータは、「DetectFaces」を実行したときの結果と同じものです。
「kokeshi_collection」バケットの「kokexa_family.jpg」という画像にある顔を登録
import boto3
import json
client = boto3.client('rekognition')
response = client.index_faces(
CollectionId = 'Kokeshi',
Image = {
'S3Object': {
'Bucket': 'kokeshi-collection',
'Name': 'kokexa_family.jpg',
}
},
ExternalImageId = 'kokexa_family',
DetectionAttributes = [
'ALL',
]
)
response = json.dumps(response)
print(response)
「顔」の登録(IndexFaces)実行結果
{
"FaceRecords": [{
"FaceDetail": {
"Confidence": 98.97781372070312,
"Eyeglasses": {
"Confidence": 99.59476470947266,
"Value": false
},
"Sunglasses": {
"Confidence": 99.72399139404297,
"Value": false
},
"Gender": {
"Confidence": 100.0,
"Value": "Female"
},
"Landmarks": [{
"Y": 0.39215341210365295,
"X": 0.6331996917724609,
"Type": "eyeLeft"
}, {
"Y": 0.39480334520339966,
"X": 0.6737061142921448,
"Type": "eyeRight"
}, {
"Y": 0.40330564975738525,
"X": 0.6511619091033936,
"Type": "nose"
}, {
〜 省略 〜
"Pose": {
"Yaw": -3.2509918212890625,
"Roll": 3.4003474712371826,
"Pitch": 21.21741485595703
},
"Emotions": [{
"Confidence": 30.680641174316406,
"Type": "HAPPY"
}, {
"Confidence": 23.1196231842041,
"Type": "SAD"
}, {
"Confidence": 5.070191383361816,
"Type": "DISGUSTED"
}],
"AgeRange": {
"High": 9,
"Low": 4
},
"EyesOpen": {
"Confidence": 96.4187240600586,
"Value": false
},
"BoundingBox": {
"Width": 0.09444444626569748,
"Top": 0.35333332419395447,
"Left": 0.6066666841506958,
"Height": 0.09444444626569748
},
"Smile": {
"Confidence": 54.736942291259766,
"Value": true
},
"MouthOpen": {
"Confidence": 80.90862274169922,
"Value": false
},
"Quality": {
"Sharpness": 99.884521484375,
"Brightness": 42.75898361206055
},
"Mustache": {
"Confidence": 99.87113952636719,
"Value": false
},
"Beard": {
"Confidence": 99.99736785888672,
"Value": false
}
},
"Face": {
"BoundingBox": {
"Width": 0.09444444626569748,
"Top": 0.35333332419395447,
"Left": 0.6066666841506958,
"Height": 0.09444444626569748
},
"FaceId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"ExternalImageId": "kokexa_family",
"Confidence": 98.97781372070312,
"ImageId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
}, {
"FaceDetail": {
"Confidence": 87.53431701660156,
"Eyeglasses": {
"Confidence": 99.83164978027344,
"Value": false
},
"Sunglasses": {
"Confidence": 99.71207427978516,
"Value": false
},
"Gender": {
"Confidence": 96.867919921875,
"Value": "Female"
},
"Landmarks": [{
"Y": 0.27386653423309326,
"X": 0.39306342601776123,
"Type": "eyeLeft"
}, {
"Y": 0.27222371101379395,
"X": 0.42904752492904663,
"Type": "eyeRight"
}, {
"Y": 0.28104713559150696,
"X": 0.417605996131897,
"Type": "nose"
}, {
〜 省略 〜
"Pose": {
"Yaw": 13.060585021972656,
"Roll": -9.853927612304688,
"Pitch": 1.8181413412094116
},
"Emotions": [{
"Confidence": 75.6640396118164,
"Type": "ANGRY"
}, {
"Confidence": 11.541812896728516,
"Type": "HAPPY"
}, {
"Confidence": 9.51336669921875,
"Type": "SAD"
}],
"AgeRange": {
"High": 5,
"Low": 2
},
"EyesOpen": {
"Confidence": 96.30854034423828,
"Value": true
},
"BoundingBox": {
"Width": 0.09444444626569748,
"Top": 0.23222222924232483,
"Left": 0.3633333444595337,
"Height": 0.09444444626569748
},
"Smile": {
"Confidence": 69.32655334472656,
"Value": true
},
"MouthOpen": {
"Confidence": 91.91553497314453,
"Value": true
},
"Quality": {
"Sharpness": 99.884521484375,
"Brightness": 59.85165786743164
},
"Mustache": {
"Confidence": 96.76629638671875,
"Value": false
},
"Beard": {
"Confidence": 99.96202850341797,
"Value": false
}
},
"Face": {
"BoundingBox": {
"Width": 0.09444444626569748,
"Top": 0.23222222924232483,
"Left": 0.3633333444595337,
"Height": 0.09444444626569748
},
"FaceId": "YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY",
"ExternalImageId": "kokexa_family",
"Confidence": 87.53431701660156,
"ImageId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
}],
"ResponseMetadata": {
〜 省略 〜
「kokexa_family.jpg」という画像から2つの「顔」が検出されたので、2つの「顔」が登録され、「FaceId」が発行されています。
先日追加された年齢予測(AgeRange)もメタデータの一つとして登録されているのがわかります。画像の左の「こけし」が2歳〜5歳で、右が4歳〜9歳という結果でした。
他の画像を登録
このような形で、合わせて6ファイルの画像を「コレクション」に登録しておきます。
- big_echo.jpg
- boeing.jpg
- datadog.jpg
- echo_dot.jpg
- ferris_wheel.jpg
- kokexa_family.jpg
まとめ
今回は、Rekognitionの「顔認識」機能を使って、「コレクション」というデータベースに「顔」の登録をおこないました。次回は、登録した「顔」の検索をおこないたいと思います。
いや〜、Amazon Rekognitionって本当にいいものですね!