Rekognitionの「顔認識」機能で「こけし」の画像を自動分類! - 検索編 -

記事タイトルとURLをコピーする

https://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200711/20200711163215.jpg

 こんにちは。サーバーワークス こけし部 部長でCS課の坂本(@t_sakam)です。
 最近、こけし部の部員がはじめてみずから「こけし」を購入してくれました。部長以外は、「こけし」を好きな人がいるのかどうか不明、という部活だったのですが、他の部活のように対象を好きな人が集まる、という普通の部活に近づいてきました。これからもめげずに「こけし」の普及に努めたいと思います。
 
 さて、今回は前回の続きです。前回は、「Amazon Rekognition」の「顔認識」機能をつかって、「コレクション」というRekognition用のデータベースに「顔」の登録をおこないました。
 

前回の「顔」の登録(IndexFaces)のイメージ図

https://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200711/20200711163212.jpg

前回:Amazon Rekognitionの「顔認識」機能で「こけし」の画像を自動分類! - 登録編 -
 
 今回は、2体の「こけし」の画像を検索元の画像に設定し、同一である可能性が高い「こけし」が前回登録した「顔」のデータの中にあるか、検索してみたいと思います。
 以下の「older_sistar.jpg」、「younger_sistar.jpg」が検索元画像です。この2つの画像をS3の「kokeshi」バケットに入れておきます。
 

検索元の画像

https://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200711/20200711163318.jpg

 ちなみに、左の姉の画像(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」の左の「こけし」の顔であることがわかります。
 

検索結果のイメージ図

https://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200711/20200711163218.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」の右の「こけし」の顔であることがわかります。
 

検索結果のイメージ図

https://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200711/20200711163215.jpg

 これで、姉の「こけし」と妹の「こけし」の2体の画像をそれぞれ検索元の画像として指定するだけで、登録してある「顔」のデータを自動で分類することができました。
  

まとめ

 今回は、前回に続き、Rekognitionの「顔認識」機能を試してみました。
 「顔認識」機能はマネジメントコンソールにデモ機能がないので、イメージしにくい機能かと思いますが、いかがでしたでしょうか? 想像どおりの機能でしたでしょうか?
 Rekognition用のDB、「コレクション」にどんどん「顔」を登録しておけば、「顔」が写っている画像を指定するだけで、探したい「顔」を検索できるのでアイデア次第でいろいろ便利につかえそうです。
 
 いや〜、Amazon Rekognitionって本当にいいものですね!
 

お知らせ

 「日経クラウドファースト」の3月号が2月20日(月)に発売されました。サーバーワークスは、「Amazon AI」の記事の執筆しています。
 わたしは、「Rekognitionの概要」と「Rekognitionの検証1」の執筆を担当しました。
 
 特に「Rekognitionの検証1」の「サーバーワークスの社員の画像での『顔の比較』機能の検証」では、大変興味深い結果がでています。ぜひこちらの記事も合わせて御覧ください!

https://cdn-ak.f.st-hatena.com/images/fotolife/s/serverworks/20200711/20200711163445.jpg