すべてのプロダクト
Search
ドキュメントセンター

Intelligent Media Management:顔検索

最終更新日:Mar 18, 2025

画像メタデータをデータセットにインデックス登録した後、顔検索を使用して、特定の顔に最も類似した画像を指定した数だけ検索できます。 顔検索は、顧客識別などの顔ベースのビジネスシナリオで使用できます。

シナリオ

インテリジェント安全監視

顔検索は、顔認識と組み合わせて使用することで、工場、学校、モール、レストランなどの環境で群衆をインテリジェントに監視できます。 この機能により、群衆行動の自動統計収集、分析、追跡が可能になり、潜在的なリスクを特定し、それに応じてアラートを発行できます。 その結果、公共スペースの安全性と管理が向上すると同時に、手動監視に関連するコストが削減されます。

生産安全

顔検索は、ソフトウェアとハードウェアの両方を統合した職場監視ソリューションで使用される重要な技術です。 これらのソリューションは、工場や作業場に設置されたカメラでキャプチャされた顔画像を分析して、不正侵入を検出し、職場の安全リスクを軽減します。

顔ベースのアクセス制御

顔認識技術は、バッフルゲートに実装して、ビジネス構造やアパート複合施設へのアクセスを制御できます。 管理者は、承認された個人の顔情報を信頼性の高いデータベースに安全に保存して、顔ベースのアクセス制御を有効にすることができます。これにより、不正侵入を防ぎ、利便性を向上させることができます。

顔ベースの出勤追跡

顔検索を利用して、モバイルクロックインシステム、迅速なクロックインシステム、統合クロックインおよびアクセス制御システムなど、顔ベースの出勤追跡ソリューションを確立できます。 顔ベースの出勤追跡システムは、キャプチャされた顔画像を 1 秒以内に事前に保存された画像のライブラリとすばやく比較して、出席者の身元を確認します。 この技術は、出勤詐欺を防ぎ、従業員管理を強化するのに役立ちます。

前提条件

  • 比較する画像のメタデータが対応するデータセットにインデックス登録されています。 CreateBinding を呼び出してバケットをデータセットにバインドすることでメタデータを自動的にインデックス登録するか、IndexFileMeta または BatchIndexFileMeta オペレーションを呼び出してメタデータを手動でインデックス登録できます。CreateDataset

  • 次の要件を満たす、同じ人物の顔画像が少なくとも 2 つデータセットに含まれています。

    • 画像の顔領域は 75 × 75 ピクセルより大きくする必要があります。

    • HeadPose パラメーターの 3 つの要素それぞれの絶対値は 30 未満である必要があります。

    • FaceQuality パラメーターの値は 0.8 より大きい必要があります。

  • Simple Message Queue(SMQ)キューが作成されます。 詳細については、「Python 用 SMQ SDK を使用してキューのメッセージを管理する」をご参照ください。

    説明

    この例では、タスク通知は SMQ SDK for Python を使用して送信されます。 詳細については、「非同期タスク処理」をご参照ください。

ステップ 1:OSS にファイルをアップロードする

[オブジェクトストレージサービス(OSS)コンソール] のバケットに、比較する顔を含む画像をアップロードします。

image

ステップ 2:データセットに画像を追加する

image

image

  • BatchIndexFileMeta オペレーションを呼び出して、複数の画像からデータセットに顔情報を一度に書き込むこともできます。 顔情報の書き込みは非同期プロセスです。 Notification パラメーターを指定して、タスク情報を取得できます。

    サンプルコード

    # -*- coding: utf-8 -*-
    # このファイルは自動生成されています。編集しないでください。
    import os
    import sys
    
    from typing import List
    
    from alibabacloud_imm20200930.client import Client as imm20200930Client
    from alibabacloud_tea_openapi import models as open_api_models
    from alibabacloud_imm20200930 import models as imm_20200930_models
    from alibabacloud_tea_util import models as util_models
    from alibabacloud_tea_util.client import Client as UtilClient
    
    
    class Sample:
        def __init__(self):
            pass
    
        @staticmethod
        def create_client() -> imm20200930Client:
            """
            AccessKey ID と AccessKey シークレットを使用してクライアントを初期化します。
            @return: Client
            @throws Exception
            """
            # プロジェクトコードが漏洩した場合、AccessKeyペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。次の行は参照用にのみ提供されています。
            # セキュリティ上の理由から、Security Token Service(STS)によって提供される一時的なアクセス認証情報を使用することをお勧めします。詳細については、https://www.alibabacloud.com/help/ja/sdk/developer-reference/v2-manage-php-access-credentials を参照してください。
            config = open_api_models.Config(
                # 必須。ALIBABA_CLOUD_ACCESS_KEY_ID 環境変数が設定されていることを確認してください。
                access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
                # 必須。ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
                access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
            )
            # IMM エンドポイントを指定します。サポートされているリージョンの IMM エンドポイントのリストについては、https://api.alibabacloud.com/product/imm を参照してください。
            config.endpoint = f'imm.cn-hangzhou.aliyuncs.com'
            return imm20200930Client(config)
    
        @staticmethod
        def main(
            args: List[str],
        ) -> None:
            client = Sample.create_client()
            notification_mns = imm_20200930_models.MNS(
                topic_name='test-mns-topic'
            )
            notification = imm_20200930_models.Notification(
                mns=notification_mns
            )
            input_file_0 = imm_20200930_models.InputFile(
                uri='''[
        {
            "URI": "oss://test-bucket/test-object-1.jpg"
        },
        {
            "URI": "oss://test-bucket/test-object-2.jpg"
        },
        {
            "URI": "oss://test-bucket/test-object-3.jpg"
        }
    ]'''
            )
            batch_index_file_meta_request = imm_20200930_models.BatchIndexFileMetaRequest(
                project_name='test-project',
                dataset_name='test-dataset',
                files=[
                    input_file_0
                ],
                notification=notification
            )
            runtime = util_models.RuntimeOptions()
            try:
                # 必要に応じて、API 操作のレスポンスを出力します。
                client.batch_index_file_meta_with_options(batch_index_file_meta_request, runtime)
            except Exception as error:
                # 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトで例外を無視しないでください。この例では、エラーメッセージが出力されます。
                # エラーメッセージを表示します。
                print(error.message)
                # トラブルシューティング用の URL を表示します。
                print(error.data.get("Recommend"))
                UtilClient.assert_as_string(error.message)
    
        @staticmethod
        async def main_async(
            args: List[str],
        ) -> None:
            client = Sample.create_client()
            notification_mns = imm_20200930_models.MNS(
                topic_name='test-mns-topic'
            )
            notification = imm_20200930_models.Notification(
                mns=notification_mns
            )
            input_file_0 = imm_20200930_models.InputFile(
                uri='''[
        {
            "URI": "oss://test-bucket/1.jpg"
        },
        {
            "URI": "oss://test-bucket/2.jpg"
        },
        {
            "URI": "oss://test-bucket/3.jpg"
        },
        {
            "URI": "oss://test-bucket/4.jpg"
        },
        {
            "URI": "oss://test-bucket/5.jpg"
        },
        {
            "URI": "oss://test-bucket/6.jpg"
        }
    ]'''
            )
            batch_index_file_meta_request = imm_20200930_models.BatchIndexFileMetaRequest(
                project_name='test-project',
                dataset_name='test-dataset',
                files=[
                    input_file_0
                ],
                notification=notification
            )
            runtime = util_models.RuntimeOptions()
            try:
                # 必要に応じて、API 操作のレスポンスを出力します。
                await client.batch_index_file_meta_with_options_async(batch_index_file_meta_request, runtime)
            except Exception as error:
                # 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトで例外を無視しないでください。この例では、エラーメッセージが出力されます。
                # エラーメッセージを表示します。
                print(error.message)
                # トラブルシューティング用の URL を表示します。
                print(error.data.get("Recommend"))
                UtilClient.assert_as_string(error.message)
    
    
    if __name__ == '__main__':
        Sample.main(sys.argv[1:])
    

    サンプルレスポンス

    {
      'EventId':'049-1udsgM0nr0leAdDBAOxe4kDLYM5',
      'RequestId': 'D4C150A6-D8EF-502B-9F30-645346388E13'
     }

    サンプル SMQ メッセージ

    {
        "TopicOwner": "14133977656xxxxx",
        "Message": "{\"id\":\"077-1x2s0rqA6ZOENW6gjAiN5Dl796T\",\"source\":\"acs.imm\",\"type\":\"imm:FileMeta:Index\",\"subject\":\"acs:imm:cn-hangzhou:14133977656xxxxx:test-project/imm:FileMeta:Index\",\"time\":\"1729564297965\",\"content\":\"{\\\"ProjectName\\\":\\\"test-project\\\",\\\"DatasetName\\\":\\\"test-dataset\\\",\\\"RequestId\\\":\\\"7FE8A307-1649-6B0D-1AB8-0600C9D4877B\\\",\\\"StartTime\\\":\\\"2024-10-22T10:31:37.787209251+08:00\\\",\\\"EndTime\\\":\\\"2024-10-22T10:31:37.965992728+08:00\\\",\\\"Success\\\":true,\\\"Message\\\":\\\"\\\",\\\"Files\\\":[{\\\"URI\\\":\\\"[\\\\n    {\\\\n        \\\\\\\"URI\\\\\\\": \\\\\\\"oss://test-bucket/test-object-1.jpg\\\\\\\"\\\\n    },\\\\n    {\\\\n        \\\\\\\"URI\\\\\\\": \\\\\\\"oss://test-bucket/test-object-2.jpg\\\\\\\"\\\\n    },\\\\n    {\\\\n        \\\\\\\"URI\\\\\\\": \\\\\\\"oss://test-bucket/test-object-3.jpg\\\\\\\"\\\\n    }\\\\n],\\\"UserData\\\":\\\"\\\"}\"}",
        "Subscriber": "14133977656xxxxx",
        "PublishTime": "1729564298068",
        "SubscriptionName": "test-mns-subscription",
        "MessageMD5": "9921327B25E01FB38151781B81042BA7",
        "TopicName": "tf-test-mns-queue",
        "MessageId": "129D772E14277FA6182D6E67D354D069"
    }

ステップ 3:顔検索タスクを作成する

CreateFacesSearchingTask オペレーションを呼び出して、指定された画像の最大の顔に最も類似した顔を含む画像を指定された数だけ検索します。 次の例は、test-dataset データセットを検索して、oss://test-bucket/test-object.jpg 画像の顔に最も類似した顔を含む画像を検索する方法を示しています。

サンプルリクエスト

説明
  • TopicName パラメーターは SMQ トピックを指定します。 この例では、トピック tf-test-mns-topic が使用されています。

  • MaxResults パラメーターは、返される類似画像の数を指定します。 このパラメーターはオプションです。 パラメーターの値の範囲は 0 ~ 100 です。 デフォルト値は 5 です。

{
  "ProjectName": "test-project",
  "DatasetName": "test-dataset",
  "Sources": [{"URI": "oss://test-bucket/test-object.jpg"}],
  "Notification": {"MNS": {"TopicName": "tf-test-mns-topic"}},
  "MaxResult": 100
}

サンプルレスポンス

{
    "TaskId": "CreateFacesSearchingTask-dedf1bd9-7edc-4d16-97f2-bbb2a4fc****",
    "RequestId": "BB9C38A3-BB7A-53B7-A168-6DBC1CF6****",
    "EventId": "0DA-1TAZO4ClNnKbn4Ungls8SOk****"
}
説明

レスポンスが上記のサンプルレスポンスと類似している場合、顔検索タスクが作成されます。

サンプルコード

# -*- coding: utf-8 -*-
# このファイルは自動生成されています。編集しないでください。
import os
import sys

from typing import List

from alibabacloud_imm20200930.client import Client as imm20200930Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_imm20200930 import models as imm_20200930_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient


class Sample:
    def __init__(self):
        pass

    @staticmethod
    def create_client(
        access_key_id: str,
        access_key_secret: str,
    ) -> imm20200930Client:
        """
        AccessKey ID と AccessKey シークレットを使用してクライアントを初期化します。
        @param access_key_id:
        @param access_key_secret:
        @return: Client
        @throws Exception
        """
        config = open_api_models.Config(
            access_key_id=access_key_id,
            access_key_secret=access_key_secret
        )
        # IMM エンドポイントを指定します。
        config.endpoint = f'imm.cn-hangzhou.aliyuncs.com'
        return imm20200930Client(config)

    @staticmethod
    def main(
        args: List[str],
    ) -> None:
        # Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションに対する権限を持っています。これらの認証情報を使用してオペレーションを実行することは、リスクの高いオペレーションです。RAM ユーザーを使用して API オペレーションを呼び出したり、日常的な O&M を実行することをお勧めします。
        # セキュリティ上の理由から、AccessKey ペアをプロジェクトコードに埋め込まないことをお勧めします。
        # この例では、環境変数から AccessKey ペアを取得して、API アクセスの ID 検証を実装しています。環境変数の設定方法については、https://www.alibabacloud.com/help/ja/imm/developer-reference/configure-environment-variables を参照してください。
        imm_access_key_id = os.getenv("AccessKeyId")
        imm_access_key_secret = os.getenv("AccessKeySecret")
        # クライアントを初期化します。
        client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
        notification_mns = imm_20200930_models.MNS(
            topic_name='tf-test-mns-topic'
        )
        notification = imm_20200930_models.Notification(
            mns=notification_mns
        )
        sources_0 = imm_20200930_models.CreateFacesSearchingTaskRequestSources(
            uri='''oss://test-bucket/test-object.jpg
'''
        )
        create_faces_searching_task_request = imm_20200930_models.CreateFacesSearchingTaskRequest(
            project_name='test-project',
            dataset_name='test-dataset',
            sources=[
                sources_0
            ],
            notification=notification,
            max_result=100
        )
        runtime = util_models.RuntimeOptions()
        try:
            # 必要に応じて、API 操作のレスポンスを出力するコードを記述します。
            client.create_faces_searching_task_with_options(create_faces_searching_task_request, runtime)
        except Exception as error:
            # 必要に応じて、エラーメッセージを出力します。
            UtilClient.assert_as_string(error.message)

    @staticmethod
    async def main_async(
        args: List[str],
    ) -> None:
        # Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションに対する権限を持っています。これらの認証情報を使用してオペレーションを実行することは、リスクの高いオペレーションです。RAM ユーザーを使用して API オペレーションを呼び出したり、日常的な O&M を実行することをお勧めします。
        # セキュリティ上の理由から、AccessKey ペアをプロジェクトコードに埋め込まないことをお勧めします。
        # この例では、環境変数から AccessKey ペアを取得して、API アクセスの ID 検証を実装しています。環境変数の設定方法については、https://www.alibabacloud.com/help/ja/imm/developer-reference/configure-environment-variables を参照してください。
        imm_access_key_id = os.getenv("AccessKeyId")
        imm_access_key_secret = os.getenv("AccessKeySecret")
        # クライアントを初期化します。
        client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
        notification_mns = imm_20200930_models.MNS(
            topic_name='tf-test-mns-topic'
        )
        notification = imm_20200930_models.Notification(
            mns=notification_mns
        )
        sources_0 = imm_20200930_models.CreateFacesSearchingTaskRequestSources(
            uri='''oss://test-bucket/test-object.jpg
'''
        )
        create_faces_searching_task_request = imm_20200930_models.CreateFacesSearchingTaskRequest(
            project_name='test-project',
            dataset_name='test-dataset',
            sources=[
                sources_0
            ],
            notification=notification,
            max_result=100
        )
        runtime = util_models.RuntimeOptions()
        try:
            # 必要に応じて、API 操作のレスポンスを出力するコードを記述します。
            await client.create_faces_searching_task_with_options_async(create_faces_searching_task_request, runtime)
        except Exception as error:
            # 必要に応じて、エラーメッセージを出力します。
            UtilClient.assert_as_string(error.message)


if __name__ == '__main__':
    Sample.main(sys.argv[1:])

ステップ 4:顔検索結果をクエリする

顔検索タスクが作成された後、SMQ を使用してタスク情報をクエリできます。 次の例は、SMQ SDK for Python を使用してタスク情報をクエリする方法を示しています。 詳細については、「Python 用 SMQ SDK を使用してキューのメッセージを管理する」をご参照ください。

  1. サンプルプロジェクトディレクトリで次のコマンドを実行します。

    python recvdelmessage.py tf-test-mns-queue

  2. 出力を JSON 形式でフォーマットします。 次の抜粋は、メッセージの content 要素のみを示しています。

    {
        "ProjectName": "test-project",
        "DatasetName": "test-dataset",
        "RequestId": "BB9C38A3-BB7A-53B7-A168-6DBC1CF6****",
        "StartTime": "2023-01-04T05:08:28.582Z",
        "EndTime": "2023-01-04T05:08:28.785Z",
        "UserData": "",
        "TaskType": "FacesSearching",
        "TaskId": "CreateFacesSearchingTask-dedf1bd9-7edc-4d16-97f2-bbb2a4fc****",
        "Status": "Succeeded",
        "Code": "",  // 空の値は、リクエストが成功したことを示します。
        "Message": "Success",
        "SimilarFaces": [
            {
                "URI": "oss://test-bucket/test-object.jpg",
                "Boundary": {
                    "Width": 109,
                    "Height": 150,
                    "Left": 69,
                    "Top": 49
                },
                // 類似した顔のリスト。
                "SimilarFaces": [
                    {
                        "URI": "oss://test-bucket/test-object-1.jpg",
                        "FigureId": "4cacbb71-52fd-4d3f-9d14-0840fecee0bf",
                        "Similarity": 0.73321015
                    },
                    {
                        "URI": "oss://test-bucket/test-object-2.jpg",
                        "FigureId": "7a4cd08d-bcd0-4bc4-93f4-1291075819cf",
                        "Similarity": 0.77035695
                    },
                    {
                        "URI": "oss://test-bucket/test-object-3.jpg",
                        "FigureId": "da920124-410a-4493-9fd3-1a3b366dca86",
                        "Similarity": 0.9836307
                    }
                ]
            }
        ]
    }
    
    説明

    メッセージの内容によると、test-dataset データセットには、指定された画像の顔に類似した顔が含まれている画像が 3 つあります。

    • oss://test-bucket/test-object-1.jpg。類似度は 0.73321015 です。

    • oss://test-bucket/test-object-2.jpg。類似度は 0.77035695 です。

    • oss://test-bucket/test-object-3.jpg。類似度は 0.9836307 です。