Intelligent Media Management (IMM) の顔クラスタリング機能を使用すると、データセット内の類似した顔をグループ化できます。この機能は、クラウドドライブの個人アルバム、自宅監視における見知らぬ人の検出、ニューリテール業界の顧客管理などのシナリオに適しています。顔クラスタリングを実行した後、クラスタ内の特定の人の顔を含むすべての画像をクエリできます。
シナリオ
クラウドドライブの個人アルバム
顔クラスタリングは、クラウドドライブ内の顔を基準に写真をグループ化し、個人ごとのアルバムを生成します。
自宅監視
顔クラスタリングは家族の顔を記録します。見知らぬ人の顔は既存の顔クラスタにグループ化できず、アラートをトリガーします。これは、危険な人物やイベントをできるだけ早く特定して処理し、家族の安全を確保するのに役立ちます。
ニューリテールの顧客管理
顔クラスタリングを使用して、顧客の写真を重複排除し、正確な顧客トラフィックを取得できます。これは、顧客の購買傾向を分析して、正確なマーケティングを行うために使用できます。
前提条件
グループ化する画像のメタデータが、対応するデータセットにインデックス化されていること。CreateBinding を呼び出してバケットをデータセットにバインドすることでメタデータを自動的にインデックス化するか、IndexFileMeta または BatchIndexFileMeta 操作を呼び出してメタデータを手動でインデックス化できます。CreateDataset
以下の要件を満たす同一人物の顔画像が、データセットに少なくとも 3 つ含まれていること:
画像の顔領域が 75 × 75 ピクセル以上であること。
HeadPose パラメーターの 3 つの要素それぞれの絶対値が 30 未満であること。
FaceQuality パラメーターの値が 0.8 以上であること。
GetFileMeta 操作を呼び出して、頭の姿勢と顔の質をクエリできます。
顔クラスタが作成された後、上記の要件を満たさない顔も同じクラスタに追加される場合があります。顔クラスタリングに関する FAQ については、「画像管理に関する FAQ」をご参照ください。
顔クラスタリングタスクの作成
CreateFigureClusteringTask 操作を呼び出して、画像内の異なる人物の顔を人物ごとにグループ化するための顔クラスタリングタスクを作成します。次の例は、test-dataset データセット内の画像で顔クラスタリングを実行する方法を示しています。
この操作はクラスタのみを生成し、画像は変更しません。
タスク情報は、タスクの開始後 7 日間保持されます。 7 日間のウィンドウが終了すると、タスク情報を取得できなくなります。タスク情報をクエリするには、次のいずれかの方法を使用できます。
IMM プロジェクトが配置されているリージョンで、Simple Message Queue (SMQ) サブスクリプションを構成して、タスク情報通知を受信します。詳細については、「非同期メッセージの例」をご参照ください。 MNS SDK については、「手順 4: メッセージの受信と削除」をご参照ください。
IMM プロジェクトが配置されているリージョンで、ApsaraMQ for RocketMQ 4.0 インスタンス、トピック、およびグループを作成して、タスク通知を受信します。詳細については、「非同期メッセージの例」をご参照ください。 ApsaraMQ for RocketMQ の使用方法については、「HTTP クライアント SDK を使用して通常のメッセージを送受信する」をご参照ください。
IMM プロジェクトが配置されているリージョンで、EventBridge を使用してタスク情報通知を受信します。詳細については、「IMM イベント」をご参照ください。
リクエストの例
{
"ProjectName": "test-project",
"DatasetName": "test-dataset"
}レスポンスの例
{
"TaskId": "CreateFigureClusteringTask-ba5784b8-f61e-485d-8ea0-****",
"RequestId": "42F4F8FD-006D-0EF0-8F2A-****",
"EventId": "140-1L5dh6eSUErqdxV1ZvJ****"
}レスポンスが上記の内容と類似している場合、顔クラスタリングタスクは作成されています。
サンプルコード
顔クラスタのクエリ
顔クラスタリングタスクを作成した後、QueryFigureClusters 操作を呼び出して、クラスタの数や各クラスタ内の画像の数など、クラスタに関する情報をクエリできます。次の例は、test-dataset データセット内の顔クラスタに関する情報をクエリする方法を示しています。
リクエストの例
{
"ProjectName": "test-project",
"DatasetName": "test-dataset"
}レスポンスの例
{
"FigureClusters": [
{
"AverageAge": 27.125,
"Cover": {
"Addresses": [],
"AudioCovers": [],
"AudioStreams": [],
"CroppingSuggestions": [],
"Figures": [
{
"Attractive": 0.9980000257492065,
"Beard": "none",
"BeardConfidence": 0.9959999918937683,
"Boundary": {
"Height": 270,
"Left": 573,
"Top": 104,
"Width": 202
},
"FaceQuality": 1.0,
"FigureId": "d7365ab8-1378-4bec-83cb-eccad8d11e0b",
"FigureType": "face",
"Glasses": "none",
"GlassesConfidence": 0.9990000128746033,
"Hat": "none",
"HatConfidence": 1.0,
"HeadPose": {
"Pitch": -0.7369999885559082,
"Roll": 2.5399999618530273,
"Yaw": 9.138999938964844
},
"Mask": "none",
"MaskConfidence": 0.7269999980926514,
"Mouth": "open",
"MouthConfidence": 0.9959999918937683,
"Sharpness": 1.0
}
],
"ImageHeight": 683,
"ImageWidth": 1024,
"Labels": [],
"OCRContents": [],
"ObjectId": "170ffdeb36cec846f4214c78a0f3a0d4b7e37d0305370216ae780f7b8c72f871",
"Subtitles": [],
"URI": "oss://bucket1/photos/2.jpg",
"VideoStreams": []
},
"CreateTime": "2022-07-12T16:41:19.336825716+08:00",
"DatasetName": "dataset1",
"FaceCount": 16,
"Gender": "female",
"ImageCount": 16,
"MaxAge": 30.0,
"MinAge": 23.0,
"ObjectId": "Cluster-7bdbcedb-bd79-42e7-a1e2-b29a48532bd6",
"ObjectType": "figure-cluster",
"OwnerId": "*****",
"ProjectName": "test-project",
"UpdateTime": "2022-09-19T17:08:59.374781532+08:00",
"VideoCount": 0
},
{
"AverageAge": 24.200000762939453,
"Cover": {
"Addresses": [],
"AudioCovers": [],
"AudioStreams": [],
"CroppingSuggestions": [],
"Figures": [
{
"Attractive": 0.9990000128746033,
"Beard": "none",
"BeardConfidence": 0.9990000128746033,
"Boundary": {
"Height": 266,
"Left": 301,
"Top": 218,
"Width": 196
},
"FaceQuality": 0.8859999775886536,
"FigureId": "f58bbdce-f3d1-4674-be6b-43d4b47c08e1",
"FigureType": "face",
"Glasses": "none",
"GlassesConfidence": 1.0,
"Hat": "none",
"HatConfidence": 1.0,
"HeadPose": {
"Pitch": 13.963000297546387,
"Roll": -12.21399974822998,
"Yaw": -6.2210001945495605
},
"Mask": "none",
"MaskConfidence": 0.7490000128746033,
"Mouth": "open",
"MouthConfidence": 0.9940000176429749,
"Sharpness": 1.0
}
],
"ImageHeight": 1024,
"ImageWidth": 683,
"Labels": [],
"OCRContents": [],
"ObjectId": "b9c80e51aa95072413e2a0a6e5262644bc3cba14a4754f54f3fa9850c4d244f1",
"Subtitles": [],
"URI": "oss://bucket1/photos/11.jpg",
"VideoStreams": []
},
"CreateTime": "2022-09-19T17:08:59.374932448+08:00",
"DatasetName": "test-dataset",
"FaceCount": 5,
"Gender": "female",
"ImageCount": 5,
"MaxAge": 26.0,
"MinAge": 22.0,
"ObjectId": "Cluster-856be781-bf5a-46d7-8494-8d7c44f5e282",
"ObjectType": "figure-cluster",
"OwnerId": "*****",
"ProjectName": "test-project",
"UpdateTime": "2022-09-19T17:08:59.374932448+08:00",
"VideoCount": 0
}
],
"NextToken": "",
"TotalCount": 2,
"RequestId": "42B3DD92-FE0D-09B7-B582-*****"
}レスポンスは、顔が含まれる画像が 2 つのクラスタにグループ化されていることを示しています。16 個の画像を含む Cluster-7bdbcedb-bd79-42e7-a1e2-b29a48532bd6 と 5 個の画像を含む Cluster-856be781-bf5a-46d7-8494-8d7c44f5e282 です。
サンプルコード
顔クラスタ内の画像のクエリ
SimpleQuery 操作を呼び出して、特定のクラスタ内の画像をクエリできます。次の例は、test-dataset データセットに属する Cluster-7bdbcedb-bd79-42e7-a1e2-b29a48532bd6 クラスタ内の画像をクエリする方法を示しています。
リクエストの例
{
"ProjectName": "test-project",
"DatasetName": "test-dataset",
"Query": "{\"Field\": \"Figures.FigureClusterId\", \"Operation\": \"eq\", \"Value\": \"Cluster-7bdbcedb-bd79-42e7-a1e2-b29a48532bd6\"}",
"MaxResults": 100
}レスポンスの例
クラスタには多くの画像が含まれています。次の内容は、1 つの画像の情報のみを示しています。
{
"Aggregations": [],
"Files": [
{
"Addresses": [],
"AudioCovers": [],
"AudioStreams": [],
"ContentMd5": "ViAbCBHAZgNU4zvs5****==",
"ContentType": "image/jpeg",
"CreateTime": "2022-07-12T15:57:47.792615815+08:00",
"CroppingSuggestions": [],
"DatasetName": "test-dataset",
"ETag": "\"56201B0811C0660354E33BECE4C****\"",
"EXIF": "****",
"Figures": [
{
"FaceQuality": 1.0,
"FigureClusterId": "Cluster-7bdbcedb-bd79-42e7-a1e2-b29a48532bd6",
"FigureConfidence": 1.0,
"FigureId": "cd9139bf-f339-4ec2-b5fd-****",
"FigureType": "face",
"Glasses": "none",
"GlassesConfidence": 0.9990000128746033,
"Hat": "none",
"HatConfidence": 1.0,
"HeadPose": {
"Pitch": -0.8999999761581421,
"Roll": 1.1660000085830688,
"Yaw": 7.932000160217285
},
"Mask": "none",
"MaskConfidence": 0.6830000281333923,
"Mouth": "close",
"MouthConfidence": 0.7879999876022339,
"Sharpness": 1.0,
...
}
],
"FileHash": "\"56201B0811C0660354E33BECE****\"",
"FileModifiedTime": "2022-07-12T15:56:41+08:00",
"Filename": "3.jpg",
"ImageHeight": 1024,
"ImageScore": {
"OverallQualityScore": 0.7490000128746033
},
"ImageWidth": 683,
"Labels": [
{
"CentricScore": 0.8349999785423279,
"LabelConfidence": 1.0,
"LabelLevel": 2,
"LabelName": "\u7167\u7247\u62cd\u6444",
"Language": "zh-Hans",
"ParentLabelName": "\u827a\u672f\u54c1"
},
...
],
"MediaType": "image",
"OCRContents": [],
"OSSCRC64": "3400224321778591044",
"OSSObjectType": "Normal",
"OSSStorageClass": "Standard",
"OSSTaggingCount": 0,
"ObjectACL": "default",
"ObjectId": "d132a61122c659f6fc1b42ecee1662aff358c7f1720027bead225****",
"ObjectType": "file",
"Orientation": 1,
"OwnerId": "****",
"ProduceTime": "2014-02-21T00:03:36+08:00",
"ProjectName": "test-project",
"Size": 187674,
"Subtitles": [],
"URI": "oss://bucket1/1.jpg",
"UpdateTime": "2022-07-12T16:41:19.336736388+08:00",
"VideoStreams": []
},
...
],
"NextToken": "",
"RequestId": "84E4D242-8D15-0312-B976-****"
}上記のレスポンスの抜粋は、クラスタ内の oss://bucket1/1.jpg 画像に関する情報を示しています。