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

OpenSearch:ベクトル化画像検索のベストプラクティス

最終更新日:Dec 28, 2024

このドキュメントでは、企業がベクトルデータを必要とせずにOpenSearch Retrieval Engine Editionを使用して画像検索サービスを迅速に確立する方法について概説します。ユーザーは画像ソースデータを直接インポートし、OpenSearch内で画像のベクトル化、ベクトル検索、その他のプロセスを簡単に完了できるため、画像による検索やテキストベースの検索など、さまざまな画像検索機能が容易になります。

ソリューションアーキテクチャ

ユーザーが画像をアップロードして画像検索エンジンを構築するには、3つの方法があります。

  • OSS+MaxCompute+OpenSearch Retrieval Engine Edition:ユーザーは最初に画像をOSSにアップロードし、対応する画像アドレス(OSSパス、例:/image/1.jpg)とともにビジネステーブルデータをMaxComputeに保存します。

  • MaxCompute+OpenSearch Retrieval Engine Edition:ユーザーはBase64エンコードされた画像とそのテーブルデータをMaxComputeに保存します。

  • API+OpenSearch Retrieval Engine Edition:ユーザーは、OpenSearch Retrieval Engine Editionによって提供されるデータプッシュインターフェースを介して、Base64エンコードされた画像とそのテーブルデータをOpenSearch Retrieval Engine Editionインスタンスにプッシュします。

このドキュメントでは、OSS+MaxCompute+OpenSearch Retrieval Engine Editionを使用した画像検索エンジンの構築に焦点を当てています。

前提条件

1. AKとSKを作成する

Alibaba Cloudコンソールに初めてログインすると、サービスの継続利用のためにアクセスキーを作成するように求められます。

  • アプリケーションの依存関係の作成と使用には、アクセスキーパラメータが必要であり、プライマリアカウントでは空にすることはできません。

  • プライマリアカウントのアクセスキーパラメータを作成したら、RAMユーザーが使用するためのRAMユーザーアクセスキーも生成できます。RAMユーザーには、適切なアクセス権限が割り当てられます。詳細については、RAMユーザーの作成と承認を参照してください。

2. オブジェクトストレージサービス(OSS)を作成する

  1. OSSサービスをアクティブにする

  2. コンソールからバケットを作成する

  3. コンソールを使用してファイルをアップロードする

このドキュメントでは、1000個の画像がOSSにアップロードされました。

画像は次の場所にあります:/test/images/

OpenSearch Retrieval Engine Editionインスタンスを購入する

OpenSearch Retrieval Engine Editionインスタンスの購入の詳細については、OpenSearch Retrieval Engine Editionインスタンスの購入を参照してください。

テーブルを構成する

新しいインスタンスの場合、製品ページのステータスは「構成保留中」であり、購入したものと同じ数と仕様のクエリノードとデータノードを持つ空のクラスターが自動的にデプロイされます。通常の検索操作を有効にするには、クラスターのテーブルの基本情報>データ同期>インデックススキーマ>インデックス再構築を構成する必要があります。

  1. テーブルの基本情報の構成には、テーブル名のカスタマイズ、シャード数の設定、データ更新リソースの数の指定が含まれます。

説明
  • 無料のデータ更新リソースのデフォルト数は2です。データ量がこれを超える場合は、n-2に基づいて追加のリソースが課金されます。ここで、nは単一テーブルのデータ更新リソースの総数です。

  1. データ同期の場合は、完全なデータソースを構成します(現在のオプションには、MaxComputeデータソースAPIプッシュデータソースオブジェクトストレージサービス(OSS)が含まれます)。ここでは、MaxComputeデータソースを例として使用します。「データソースを追加」をクリックし、データソースタイプとして「MaxCompute」を選択し、プロジェクト、accesskeyID、accesskeySecret、テーブル、パーティションキーを入力し、オプションで「自動インデックス再構築」を有効にします。

  1. データソースの構成が成功したら、インデックススキーマの設定に進みます。

4.1. MaxComputeデータソースが確立されると、データソースフィールドが自動的にマッピングされます。

  1. フィールド設定:エンドツーエンドの画像検索ソリューションは、システムを介して画像をベクトルに変換し、ベクトルを介してデータを取得します。したがって、上の図に示すように、3つのフィールドをここで構成する必要があります(名前はカスタマイズできます)。

    1. 主キーフィールド:タイプはSTRINGまたは整数にすることができ、主キーを選択する必要があります。

    2. vector_source_image:OSSの画像パスを保存します。このドキュメントでは/test/images/10031.pngで、次の詳細設定があります。Pro構成は次のとおりです。

{
  "content_type": "oss",
  "oss_endpoint": "oss-cn-hangzhou-internal.aliyuncs.com",
  "oss_bucket": "oss bucket name, in this document test-image-vector", // OSSバケット名、このドキュメントではtest-image-vector
  "crop": "true", // OSS画像をベクトルに変換する場合に値を渡します。値は"true"でなければなりません。
  "oss_use_slr": "true", // サービスリンクロール(slr)を使用してOSS関連のAPIにアクセスします。文字列型"true"でなければなりません。
  "uid": "" // Alibaba Cloudアカウントuid
}

vector:画像がベクトルに変換された後にベクトルを格納するフィールド。このフィールドはFLOAT型に設定し、複数値を選択する必要があります。

Pro構成は次のとおりです。

{
  "vector_model": "clip",
  "vector_modal": "image",
  "vector_source_field": "vector_source_image"  
}
説明

vector_modelはベクトル化モデルを指します。システムは、一般的な画像ベクトル化用のclipと、Eコマース強化画像ベクトル化用のclip_ecomの2つのモデルを提供します。vector_modalはimageとして固定されています。vector_source_fieldはベクトル化する画像フィールドで、このドキュメントではvector_source_imageです。

4.2. インデックス設定:構成する必須インデックスは、主キーインデックスとベクトルインデックスです。

4.3. ベクトルインデックスフィールドの編集:

4.4. ベクトルインデックスの詳細設定の編集:ベクトルインデックスの詳細設定では、次元を512次元に設定する必要があります。これは固定されており、変更できません。他のパラメータは通常、デフォルト設定のままにしておく必要があります。

スキーマの例:

"fields": [
    {
      "field_name": "id",
      "field_type": "INT64",
      "compress_type": "equal"
    },
    {
      "user_defined_param":
      {
        "oss_endpoint": "oss-cn-hangzhou-internal.aliyuncs.com",
        "oss_bucket": "/opensearch",
        "crop": "true",
        "content_type": "oss",
        "oss_use_slr": "true",
        "uid": "xxx"
      },
      "field_name": "source_image",
      "field_type": "STRING",
      "compress_type": "uniq"
    },
    {
      "field_name": "cate_id",
      "field_type": "INT64",
      "compress_type": "equal"
    },
    {
      "user_defined_param": {
        "vector_model": "clip",
        "vector_modal": "image",
        "vector_source_field": "vector_source_image"
      },
      "field_name": "vector",
      "field_type": "FLOAT",
      "multi_value": true
    }
  ]
  1. 構成が完了したら、「確認」をクリックして作成します。

  2. 作成の進行状況は、機能拡張>変更履歴で監視できます。完了したら、クエリテストを実行できます。

効果テスト

構文の紹介

query=image_index:'検索するテキストコンテンツ&modal=text&n=10&search_params={}'&&kvpairs=formula:proxima_score(vector)&&sort=+RANK
  • modalは検索モードを指定します。テキストベースの検索の場合はmodalをtextに、画像ベースの検索の場合はimageに設定します。

  • nは、ベクトル検索から返される上位結果の数を定義します。

テキストで検索

クエリテストページでHAクエリを実行します。

vector:'オートバイのヘルメット&modal=text&n=10&search_params={}'&&kvpairs=formula:proxima_score(vector)&&sort=+RANK

OSSで2042.png画像を検査します。

説明

検索テキストに特殊文字が含まれている場合は、Base64エンコードが必要です。たとえば、「motorcycle&helmet」は「5pGp5omY6L2mJuWktOeblA==」にエンコードする必要があります。

画像で検索

エンコードされた画像の長さが長いため、コンソールのクエリテストページでの直接検索は現在サポートされていません。代わりに、ユーザーはSDKを使用して検索を実行できます。

例:

vector:'Base64エンコードされた画像&modal=image&n=10&search_params={}'&&kvpairs=formula:proxima_score(vector)&&sort=+RANK

SDKでデータを取得する

次の依存関係を追加します。

pip install alibabacloud-ha3engine

検索のデモ:

# -*- coding: utf-8 -*-

from alibabacloud_ha3engine import models, client
from alibabacloud_tea_util import models as util_models
from Tea.exceptions import TeaException, RetryError
def search():
    Config = models.Config(
        endpoint="インスタンス詳細ページのAPIエントリにあるAPIドメイン名を参照してください",
        instance_id="",
        protocol="http",
        access_user_name="インスタンス購入時に設定したユーザー名",
        access_pass_word="インスタンス購入時に設定したパスワード"
    )

    # ユーザーリクエスト時間が長い場合は、この構成を使用してリクエスト待機時間を増やすことができます。単位ms
    # このパラメータはsearch_with_optionsメソッドで使用できます
    runtime = util_models.RuntimeOptions(
        connect_timeout=5000,
        read_timeout=10000,
        autoretry=False,
        ignore_ssl=False,
        max_idle_conns=50
    )

    # Ha3Engineクライアントを初期化します
    ha3EngineClient = client.Client(Config)

    optionsHeaders = {}

    try:
        # 例1:haクエリ文字列を直接検索に使用します。
        # =====================================================
        query_str = "config=hit:4,format:json,fetch_summary_type:pk,qrs_chain:search&&query=image_index:'検索するテキストコンテンツ&modal=text&n=10&search_params={}'&&cluster=general"
        haSearchQuery = models.SearchQuery(query=query_str)
        haSearchRequestModel = models.SearchRequestModel(optionsHeaders, haSearchQuery)
        hastrSearchResponseModel = ha3EngineClient.search(haSearchRequestModel)
        print(hastrSearchResponseModel)
    except TeaException as e:
        print(f"send request with TeaException : {e}")
    except RetryError as e:
        print(f"send request with Connection Exception  : {e}")
説明

SDKのその他の例については、開発者ガイドを参照してください。

注意事項

● ベクトル取得時間に厳しい要件がある場合は、mmap戦略の例を検討してください。

● 画像パスまたはBase64エンコードされた画像を格納するフィールドは、STRING型に設定する必要があります。 ● ベクトルインデックスは、CUSTOMIZED型として構成する必要があります。 ● このシナリオでは、HA構文とRESTFUL APIはサポートされていますが、SQLはサポートされていません。