こんにちは。サーバーワークス こけし部 部長でCS課の坂本(@t_sakam)です。
最近、こけし部の部員がはじめてみずから「こけし」を購入してくれました。部長以外は、「こけし」を好きな人がいるのかどうか不明、という部活だったのですが、他の部活のように対象を好きな人が集まる、という普通の部活に近づいてきました。これからもめげずに「こけし」の普及に努めたいと思います。
さて、今回は前回の続きです。前回は、「Amazon Rekognition」の「顔認識」機能をつかって、「コレクション」というRekognition用のデータベースに「顔」の登録をおこないました。
前回の「顔」の登録(IndexFaces)のイメージ図
前回:Amazon Rekognitionの「顔認識」機能で「こけし」の画像を自動分類! - 登録編 -
今回は、2体の「こけし」の画像を検索元の画像に設定し、同一である可能性が高い「こけし」が前回登録した「顔」のデータの中にあるか、検索してみたいと思います。
以下の「older_sistar.jpg」、「younger_sistar.jpg」が検索元画像です。この2つの画像をS3の「kokeshi」バケットに入れておきます。
検索元の画像
ちなみに、左の姉の画像(older_sistar.jpg)は岡崎靖男工人の鳴子系こけしで、右の妹の画像(younger_sistar.jpg)は阿保六知秀工人の津軽系こけしです。
画像で検索
姉の画像(older_sistar.jpg)で検索
まずは、「older_sistar.jpg」を検索元の画像に指定して検索してみます。
検索時のコード
import boto3
import json
client = boto3.client('rekognition')
response = client.search_faces_by_image(
CollectionId = 'Kokeshi',
Image = {
'S3Object': {
'Bucket': 'kokeshi',
'Name': 'older_sister.jpg',
}
},
MaxFaces = 100,
FaceMatchThreshold = 80
)
response = json.dumps(response)
print(response)
コードにでてくる項目の意味
項目名 | 値 | 意味 |
---|---|---|
CollectionId | Kokeshi | コレクション名 |
Bucket | kokeshi | 検索元の画像を入れたバケット名 |
Name | older_sister.jp | 検索元の画像名 |
MaxFaces | 100 | 検索結果をいくつ取得するか |
FaceMatchThreshold | 80 | Similarity(類似性) スコアが80%以上の結果を取得 |
検索結果
{
"SearchedFaceBoundingBox": {
"Width": 0.1711111068725586,
"Top": 0.23333333432674408,
"Left": 0.43888887763023376,
"Height": 0.1711111068725586
},
"SearchedFaceConfidence": 97.06231689453125,
"FaceMatches": [{
"Face": {
"BoundingBox": {
"Width": 0.0944444015622139,
"Top": 0.23222200572490692,
"Left": 0.36333298683166504,
"Height": 0.0944444015622139
},
"FaceId": "YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY",
"ExternalImageId": "kokexa_family",
"Confidence": 87.5343017578125,
"ImageId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
},
"Similarity": 95.2236557006836
}],
"ResponseMetadata": {
〜 省略 〜
「FaceId」が一つだけ返ってきていて、「Similarity(類似性スコア)」が95.2236557006836%となっているので、高い確率で同一「こけし」であると判定されました。「FaceId」をみると、前回登録した「kokexa_family.jpg」の左の「こけし」の顔であることがわかります。
検索結果のイメージ図
妹の画像(younger_sistar.jpg)で検索
検索時のコード
コードは先程の「older_sistar.jpg」を「younger_sistar.jpg」に変更して実行しただけです。
検索結果
長くなってしまうので、以下は結果の抜粋です。「...」の箇所が省いた所です。
{
"SearchedFaceBoundingBox": {
"Width": 0.36666667461395264,
"Top": 0.4611110985279083,
"Left": 0.2711111009120941,
"Height": 0.36666667461395264
},
"SearchedFaceConfidence": 95.07447814941406,
"FaceMatches": [{
"Face": {
"BoundingBox": {
...
"FaceId": "AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA",
"ExternalImageId": "ferris_wheel",
...
"Similarity": 98.95458984375
}, {
"Face": {
"BoundingBox": {
...
"FaceId": "BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB",
"ExternalImageId": "big_echo",
...
"Similarity": 98.65554809570312
}, {
"Face": {
"BoundingBox": {
...
"FaceId": "CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC",
"ExternalImageId": "boeing",
...
"Similarity": 97.69818115234375
}, {
"Face": {
"BoundingBox": {
...
"FaceId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"ExternalImageId": "kokexa_family",
...
"Similarity": 97.3946304321289
}, {
"Face": {
"BoundingBox": {
...
"FaceId": "DDDDDDDD-DDDD-DDDD-DDDD-DDDDDDDDDDDD",
"ExternalImageId": "datadog",
...
"Similarity": 97.26081085205078
}, {
"Face": {
"BoundingBox": {
...
"FaceId": "EEEEEEEE-EEEE-EEEE-EEEE-EEEEEEEEEEEE",
"ExternalImageId": "echo_dot",
...
"Similarity": 96.91545104980469
}],
"ResponseMetadata": {
〜 省略 〜
「FaceId」が6つ返ってきていて、「Similarity(類似性スコア)」はどれも96%を超えています。事前に登録しておいたこの6つの「顔」は高い確率で同一「こけし」であると判定されました。この中で登録時にオプションとして指定しておいた、「ExternalImageId」が「kokexa_family」となっている「FaceId」をみると、前回登録した「kokexa_family.jpg」の右の「こけし」の顔であることがわかります。
検索結果のイメージ図
これで、姉の「こけし」と妹の「こけし」の2体の画像をそれぞれ検索元の画像として指定するだけで、登録してある「顔」のデータを自動で分類することができました。
まとめ
今回は、前回に続き、Rekognitionの「顔認識」機能を試してみました。
「顔認識」機能はマネジメントコンソールにデモ機能がないので、イメージしにくい機能かと思いますが、いかがでしたでしょうか? 想像どおりの機能でしたでしょうか?
Rekognition用のDB、「コレクション」にどんどん「顔」を登録しておけば、「顔」が写っている画像を指定するだけで、探したい「顔」を検索できるのでアイデア次第でいろいろ便利につかえそうです。
いや〜、Amazon Rekognitionって本当にいいものですね!
お知らせ
「日経クラウドファースト」の3月号が2月20日(月)に発売されました。サーバーワークスは、「Amazon AI」の記事の執筆しています。
わたしは、「Rekognitionの概要」と「Rekognitionの検証1」の執筆を担当しました。
特に「Rekognitionの検証1」の「サーバーワークスの社員の画像での『顔の比較』機能の検証」では、大変興味深い結果がでています。ぜひこちらの記事も合わせて御覧ください!