Intelligent Media Management (IMM) でデータセットを作成した後、Object Storage Service (OSS) または Drive and Photo Service に格納されたファイルに対してメタデータインデックスを作成します。メタデータインデックスは、メディアファイルの重要な情報を構造化し、タイトル、作成者、キーワード、作成日時、サイズ、フォーマット、解像度などを整理します。これにより、検索、フィルター、管理を効率的に行えます。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
IMM プロジェクト内にデータセットが作成済みであること。詳細については、「データセットの作成」をご参照ください。
インデックス作成方法
IMM では、以下の 2 種類のインデックス作成方法をサポートしています。
| 方法 | 対象範囲 | API 操作 | 推奨用途 |
|---|---|---|---|
| 自動 | OSS バケット内のすべてのオブジェクト | CreateBinding | フルバケットインデックス作成と継続的な増分更新 |
| 手動 | OSS または Drive and Photo Service 内の指定ファイル | BatchIndexFileMeta / IndexFileMeta | 特定ファイルの選択的インデックス作成 |
自動インデックス作成
CreateBinding を呼び出して、データセットと OSS バケットをマッピングします。マッピングが確立されると、IMM はバケット内の既存のすべてのオブジェクトをフルスキャンし、メタデータを抽出してメタデータインデックスを作成します。その後、増分データを継続的にモニターし、新しいオブジェクトを自動的にインデックス化します。
メタデータインデックス作成には、スキャン対象のオブジェクト数に比例した料金が発生します。詳細については、「課金項目」をご参照ください。メタデータインデックス作成機能を試用する場合は、オブジェクト数が少ないバケットを使用し、予期しない課金を避けるため、ワークフローテンプレート を慎重に選択してください。
ステップ 1:バインディングの作成
以下の例では、test-dataset データセット(test-project プロジェクト内)を test-bucket バケットにマッピングします。
リクエスト
{
"ProjectName": "test-project",
"URI": "oss://test-bucket",
"DatasetName": "test-dataset"
}応答
{
"Binding": {
"Phase": "",
"ProjectName": "test-project",
"DatasetName": "test-dataset",
"State": "Ready",
"CreateTime": "2022-07-06T07:03:28.054762739+08:00",
"UpdateTime": "2022-07-06T07:03:28.054762739+08:00",
"URI": "oss://test-bucket"
},
"RequestId": "090D2AC5-8450-0AA8-A1B1-****"
}完全なサンプルコード(IMM SDK for Python)
# -*- coding: utf-8 -*-
import os
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 Secret を使用してクライアントを初期化します。
@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
)
# エンドポイントを指定します。
config.endpoint = f'imm.cn-beijing.aliyuncs.com'
return imm20200930Client(config)
@staticmethod
def main() -> None:
# Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持ちます。セキュリティリスクを防止するため、RAM ユーザーとして API 操作を実行または日常的な運用・保守(O&M)を行うことを推奨します。
# AccessKey ペア(AccessKey ID および AccessKey Secret)をプロジェクトコード内に直接記述しないことを推奨します。そうしないと、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。
# この例では、API アクセス時の本人確認を実現するために、AccessKey ペアを環境変数から読み込んでいます。環境変数の設定方法については、https://www.alibabacloud.com/help/document_detail/2361894.html をご参照ください。
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)
create_binding_request = imm_20200930_models.CreateBindingRequest(
# IMM プロジェクト名を指定します。
project_name='test-project',
# データセット名を指定します。
dataset_name='test-dataset',
# バケットの URI を指定します。
uri='oss://test-bucket'
)
runtime = util_models.RuntimeOptions()
try:
# API 操作の応答を出力します。
response = client.create_binding_with_options(create_binding_request, runtime)
print(response.body.to_map())
except Exception as error:
# 必要に応じてエラーメッセージを出力します。
UtilClient.assert_as_string(error.message)
print(error)
if __name__ == '__main__':
Sample.main()ステップ 2(任意):バインディングのステータス確認
GetBinding を呼び出して、マッピングのステータスを照会します。
リクエスト
{
"ProjectName": "test-project",
"URI": "oss://test-bucket",
"DatasetName": "test-dataset"
}応答
{
"Binding": {
"Phase": "IncrementalScanning",
"ProjectName": "test-project",
"DatasetName": "test-dataset",
"State": "Running",
"CreateTime": "2022-07-06T07:04:05.105182822+08:00",
"UpdateTime": "2022-07-06T07:04:13.302084076+08:00",
"URI": "oss://test-bucket"
},
"RequestId": "B5A9F54B-6C54-03C9-B011-****"
}主な応答フィールド:
| フィールド | 値 | 意味 |
|---|---|---|
| Phase | IncrementalScanning | IMM が既存のすべてのオブジェクトのインデックス作成を完了し、増分オブジェクトのスキャンを開始しています |
| State | Running | マッピングが確立中です |
完全なサンプルコード(IMM SDK for Python 1.27.3)
# -*- coding: utf-8 -*-
import os
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 Secret を使用してクライアントを初期化します。
@param access_key_id:
@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
)
# エンドポイントを指定します。
config.endpoint = f'imm.cn-beijing.aliyuncs.com'
return imm20200930Client(config)
@staticmethod
def main() -> None:
# Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持ちます。セキュリティリスクを防止するため、RAM ユーザーとして API 操作を実行または日常的な運用・保守(O&M)を行うことを推奨します。
# AccessKey ペア(AccessKey ID および AccessKey Secret)をプロジェクトコード内に直接記述しないことを推奨します。そうしないと、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。
# この例では、API アクセス時の本人確認を実現するために、AccessKey ペアを環境変数から読み込んでいます。環境変数の設定方法については、https://www.alibabacloud.com/help/document_detail/2361894.html をご参照ください。
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)
get_binding_request = imm_20200930_models.GetBindingRequest(
# IMM プロジェクト名を指定します。
project_name='test-project',
# データセット名を指定します。
dataset_name='test-dataset',
# バケットの URI を指定します。
uri='oss://test-bucket'
)
runtime = util_models.RuntimeOptions()
try:
# API 操作の応答を出力します。
response = client.get_binding_with_options(get_binding_request, runtime)
print(response.body.to_map())
except Exception as error:
# 必要に応じてエラーメッセージを出力します。
UtilClient.assert_as_string(error.message)
print(error)
if __name__ == '__main__':
Sample.main()手動インデックス作成
OSS または Drive and Photo Service 内の特定のファイルをインデックス化するには、BatchIndexFileMeta(複数ファイル)または IndexFileMeta(単一ファイル)を呼び出します。いずれの操作も、カスタムラベルおよび Message Service (MNS) 通知をサポートしています。
複数ファイルのインデックス作成(BatchIndexFileMeta)
以下の例では、oss://test-bucket/test-object1.jpg および oss://test-bucket/test-object2.jpg の 2 つのファイルを、test-dataset データセット(test-project プロジェクト内)に対して、カスタムラベルを付与してインデックス化します。
リクエスト
{
"ProjectName": "test-project",
"DatasetName": "test-dataset",
"Files": [
{
"URI": "oss://test-bucket/test-object1.jpg",
"CustomLabels": {
"category": "Persons"
}
},
{
"URI": "oss://test-bucket/test-object2.jpg",
"CustomLabels": {
"category": "Pets"
}
}
],
"Notification": {
"MNS": {
"TopicName": "test-topic"
}
}
}応答
{
"RequestId": "0D4CB096-EB44-02D6-A4E9-****",
"EventId": "16C-1KoeYbdckkiOObpyzc****"
}MNS 通知メッセージ
Message Service SDK の詳細については、「ステップ 4:メッセージの受信と削除」をご参照ください。
{
"ProjectName": "test-project",
"DatasetName": "test-dataset",
"RequestId": "658FFD57-B495-07C0-B24B-B64CC52993CB",
"StartTime": "2022-07-06T07:18:18.664770352+08:00",
"EndTime": "2022-07-06T07:18:20.762465221+08:00",
"Success": true,
"Message": "",
"Files": [
{
"URI": "oss://test-bucket/test-object1.jpg",
"CustomLabels": {
"category": "Persons"
},
"Error": ""
},
{
"URI": "oss://test-bucket/test-object2.jpg",
"CustomLabels": {
"category": "Pets"
},
"Error": ""
}
]
}結果の確認方法:
Success の値が
trueの場合:メタデータインデックスが正常に作成されています。特定のファイルについて Error の値が空の場合:そのファイルのインデックス作成が正常に完了しています。
完全なサンプルコード(IMM SDK for Python)
# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
import sys
import os
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 Secret を使用してクライアントを初期化します。
@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
)
# エンドポイントを指定します。
config.endpoint = f'imm.cn-beijing.aliyuncs.com'
return imm20200930Client(config)
@staticmethod
def main(
args: List[str],
) -> None:
# Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持ちます。セキュリティリスクを防止するため、RAM ユーザーとして API 操作を実行または日常的な運用・保守(O&M)を行うことを推奨します。
# AccessKey ペア(AccessKey ID および AccessKey Secret)をプロジェクトコード内に直接記述しないことを推奨します。そうしないと、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。
# この例では、API アクセス時の本人確認を実現するために、AccessKey ペアを環境変数から読み込んでいます。環境変数の設定方法については、https://www.alibabacloud.com/help/document_detail/2361894.html をご参照ください。
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='test-topic'
)
notification = imm_20200930_models.Notification(
mns=notification_mns
)
input_file_0custom_labels = {
'category': 'Persons'
}
input_file_0 = imm_20200930_models.InputFile(
uri='oss://test-bucket/test-object1.jpg',
custom_labels=input_file_0custom_labels
)
input_file_1custom_labels = {
'category': 'Pets'
}
input_file_1 = imm_20200930_models.InputFile(
uri='oss://test-bucket/test-object2.jpg',
custom_labels=input_file_1custom_labels
)
batch_index_file_meta_request = imm_20200930_models.BatchIndexFileMetaRequest(
project_name='test-project',
dataset_name='test-dataset',
files=[
input_file_0,
input_file_1
],
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:
# 必要に応じてエラーメッセージを出力します。
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 ID および AccessKey Secret)をプロジェクトコード内に直接記述しないことを推奨します。そうしないと、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。
# この例では、API アクセス時の本人確認を実現するために、AccessKey ペアを環境変数から読み込んでいます。環境変数の設定方法については、https://www.alibabacloud.com/help/document_detail/2361894.html をご参照ください。
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='test-topic'
)
notification = imm_20200930_models.Notification(
mns=notification_mns
)
input_file_0custom_labels = {
'category': 'Persons'
}
input_file_0 = imm_20200930_models.InputFile(
uri='oss://test-bucket/test-object1.jpg',
custom_labels=input_file_0custom_labels
)
input_file_1custom_labels = {
'category': 'Pets'
}
input_file_1 = imm_20200930_models.InputFile(
uri='oss://test-bucket/test-object2.jpg',
custom_labels=input_file_1custom_labels
)
batch_index_file_meta_request = imm_20200930_models.BatchIndexFileMetaRequest(
project_name='test-project',
dataset_name='test-dataset',
files=[
input_file_0,
input_file_1
],
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:
# 必要に応じてエラーメッセージを出力します。
UtilClient.assert_as_string(error.message)
if __name__ == '__main__':
Sample.main(sys.argv[1:])単一ファイルのインデックス作成(IndexFileMeta)
以下の例では、oss://test-bucket/test-object1.jpg を、test-dataset データセット(test-project プロジェクト内)に対してインデックス化します。
リクエスト
{
"ProjectName": "test-project",
"DatasetName": "test-dataset",
"File": {
"URI": "oss://test-bucket/test-object1.jpg",
"CustomLabels": {
"category": "Persons"
}
},
"Notification": {
"MNS": {
"TopicName": "test-topic"
}
}
}応答
{
"RequestId": "5AA694AD-3D10-0B6A-85B2-****",
"EventId": "17C-1Kofq1mlJxRYF7vAGF****"
}MNS 通知メッセージ
Message Service SDK の詳細については、「ステップ 4:メッセージの受信と削除」をご参照ください。
{
"ProjectName": "test-project",
"DatasetName": "test-dataset",
"RequestId": "658FFD57-B495-07C0-B24B-B64CC52993CB",
"StartTime": "2022-07-06T07:18:18.664770352+08:00",
"EndTime": "2022-07-06T07:18:20.762465221+08:00",
"Success": true,
"Message": "",
"Files": [
{
"URI": "oss://test-bucket/test-object1.jpg",
"CustomLabels": {
"category": "Persons"
},
"Error": ""
}
]
}結果を確認します:
成功 は
true: メタデータ インデックスが作成されました。特定のファイルについて Error の値が空の場合:そのファイルのインデックス作成が正常に完了しています。
完全なサンプルコード(IMM SDK for Python)
# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
import sys
import os
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 Secret を使用してクライアントを初期化します。
@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
)
# エンドポイントを指定します。
config.endpoint = f'imm.cn-beijing.aliyuncs.com'
return imm20200930Client(config)
@staticmethod
def main(
args: List[str],
) -> None:
# Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持ちます。セキュリティリスクを防止するため、RAM ユーザーとして API 操作を実行または日常的な運用・保守(O&M)を行うことを推奨します。
# AccessKey ペア(AccessKey ID および AccessKey Secret)をプロジェクトコード内に直接記述しないことを推奨します。そうしないと、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。
# この例では、API アクセス時の本人確認を実現するために、AccessKey ペアを環境変数から読み込んでいます。環境変数の設定方法については、https://www.alibabacloud.com/help/document_detail/2361894.html をご参照ください。
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='test-topic'
)
notification = imm_20200930_models.Notification(
mns=notification_mns
)
input_file_custom_labels = {
'category': 'Persons'
}
input_file = imm_20200930_models.InputFile(
uri='oss://test-bucket/test-object1.jpg',
custom_labels=input_file_custom_labels
)
index_file_meta_request = imm_20200930_models.IndexFileMetaRequest(
project_name='test-project',
dataset_name='test-dataset',
file=input_file,
notification=notification
)
runtime = util_models.RuntimeOptions()
try:
# 必要に応じて、API 操作の応答を出力するコードを記述します。
client.index_file_meta_with_options(index_file_meta_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 ID および AccessKey Secret)をプロジェクトコード内に直接記述しないことを推奨します。そうしないと、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。
# この例では、API アクセス時の本人確認を実現するために、AccessKey ペアを環境変数から読み込んでいます。環境変数の設定方法については、https://www.alibabacloud.com/help/document_detail/2361894.html をご参照ください。
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='test-topic'
)
notification = imm_20200930_models.Notification(
mns=notification_mns
)
input_file_custom_labels = {
'category': 'Persons'
}
input_file = imm_20200930_models.InputFile(
uri='oss://test-bucket/test-object1.jpg',
custom_labels=input_file_custom_labels
)
index_file_meta_request = imm_20200930_models.IndexFileMetaRequest(
project_name='test-project',
dataset_name='test-dataset',
file=input_file,
notification=notification
)
runtime = util_models.RuntimeOptions()
try:
# 必要に応じて、API 操作の応答を出力するコードを記述します。
await client.index_file_meta_with_options_async(index_file_meta_request, runtime)
except Exception as error:
# 必要に応じてエラーメッセージを出力します。
UtilClient.assert_as_string(error.message)
if __name__ == '__main__':
Sample.main(sys.argv[1:])