MilvusとFiftyOneでビジョン検索を行う
FiftyOneは高品質なデータセットとコンピュータビジョンモデルを構築するためのオープンソースツールです。このガイドでは、Milvusの類似性検索機能をFiftyOneに統合し、独自のデータセットでビジョン検索を実行できるようにします。
FiftyOneは、Pythonによるプログラム、およびアプリのポイント&クリックの両方で、Milvusコレクションの作成、ベクトルのアップロード、および類似性クエリの実行を行うためのAPIを提供します。このページのデモでは、プログラムによる統合に焦点を当てています。
前提条件
開始する前に、以下が揃っていることを確認してください:
- Milvusサーバが動作していること。
pymilvus
とfiftyone
がインストールされたPython環境。- 検索する画像のデータセット
インストール要件
この例では、pymilvus
とfiftyone
を使用します。以下のコマンドを実行することでインストールできます:
python3 -m pip install pymilvus fiftyone torch torchvision
基本レシピ
Milvusを使用してFiftyOneデータセットに類似度インデックスを作成し、これを使用してデータを検索する基本的なワークフローは以下の通りです:
- データセットをFiftyOne にロードする
- データセット内のサンプルまたはパッチについてベクトル埋め込みを計算するか、埋め込みを生成するために使用するモデルを選択します。
- モデルを選択します。
compute_similarity()
メソッドを使用して、backend="milvus"
パラメータを設定し、brain_key
を指定して、データセット内のサンプルまたはオブジェクトパッチに対して Milvus 類似性インデックスを生成します。 - このMilvus類似度インデックスを使用して、次のようにデータをクエリします。
sort_by_similarity()
. - 必要であれば、インデックスを削除してください。
手順
以下の例は上記のワークフローを示すものである。
1.データセットを FiftyOne に読み込み、サンプルの埋め込みを計算する。
以下のコードでは、FiftyOne が提供するサンプル画像セットを使用して統合のデモンストレーションを行います。こちらの記事を参考に、独自の画像セットを用意することもできます。
import fiftyone as fo
import fiftyone.brain as fob
import fiftyone.zoo as foz
# Step 1: Load your data into FiftyOne
dataset = foz.load_zoo_dataset("quickstart")
# Steps 2 and 3: Compute embeddings and create a similarity index
milvus_index = fob.compute_similarity(
dataset,
brain_key="milvus_index",
backend="milvus",
)
2.視覚類似検索の実行
Milvus類似度インデックスを使用して、データセットの視覚類似度検索を行うことができます。
# Step 4: Query your data
query = dataset.first().id # query by sample ID
view = dataset.sort_by_similarity(
query,
brain_key="milvus_index",
k=10, # limit to 10 most similar samples
)
# Step 5 (optional): Cleanup
# Delete the Milvus collection
milvus_index.cleanup()
# Delete run record from FiftyOne
dataset.delete_brain_run("milvus_index")
3.インデックスの削除
Milvus類似度インデックスが不要になった場合、以下のコードで削除することができます:
# Step 5: Delete the index
milvus_index.delete()
Milvusバックエンドの使用
デフォルトでは compute_similarity()
またはsort_by_similarity()
を呼び出すと sklearn バックエンドが使用されます。
Milvusバックエンドを使用するには、オプションのバックエンドパラメータを compute_similarity()
を"milvus"
に設定するだけです:
import fiftyone.brain as fob
fob.compute_similarity(..., backend="milvus", ...)
また、以下の環境変数を設定することで、Milvusバックエンドを使用するようにFiftyOneを恒久的に設定することもできます:
export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus
またはbrain configのdefault_similarity_backend
パラメータを~/.fiftyone/brain_config.json
に設定してください:
{
"default_similarity_backend": "milvus"
}
認証
カスタム Milvus サーバを使用している場合、様々な方法で認証情報を提供することができます。
環境変数 (推奨)
Milvus認証情報を設定するための推奨方法は、以下に示す環境変数に保存することです。
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_URI=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_USER=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_PASSWORD=XXXXXX
# also available if necessary
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SECURE=true
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_TOKEN=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_DB_NAME=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_KEY_PATH=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_PEM_PATH=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CA_PEM_PATH=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_PEM_PATH=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_NAME=XXXXXX
FiftyOne Brain config
~/.fiftyone/brain_config.json
にあるbrain configに認証情報を保存することもできます:
{
"similarity_backends": {
"milvus": {
"uri": "XXXXXX",
"user": "XXXXXX",
"password": "XXXXXX",
# also available if necessary
"secure": true,
"token": "XXXXXX",
"db_name": "XXXXXX",
"client_key_path": "XXXXXX",
"client_pem_path": "XXXXXX",
"ca_pem_path": "XXXXXX",
"server_pem_path": "XXXXXX",
"server_name": "XXXXXX"
}
}
}
このファイルは作成するまで存在しないことに注意してください。
キーワード引数
のようなメソッドを呼び出すたびに、Milvusの認証情報をキーワード引数として手動で与えることができます。 compute_similarity()
のようなMilvusへの接続を必要とするメソッドを呼び出すたびに、キーワード引数としてあなたのMilvus認証情報を手動で与えることができます:
import fiftyone.brain as fob
milvus_index = fob.compute_similarity(
...
backend="milvus",
brain_key="milvus_index",
uri="XXXXXX",
user="XXXXXX",
password="XXXXXX",
# also available if necessary
secure=True,
token="XXXXXX",
db_name="XXXXXX",
client_key_path="XXXXXX",
client_pem_path="XXXXXX",
ca_pem_path="XXXXXX",
server_pem_path="XXXXXX",
server_name="XXXXXX",
)
この方法を使用する場合、後でインデックスをロードする際に、手動で認証情報を提供しなければならないことに注意してください。 load_brain_results()
:
milvus_index = dataset.load_brain_results(
"milvus_index",
uri="XXXXXX",
user="XXXXXX",
password="XXXXXX",
# also available if necessary
secure=True,
token="XXXXXX",
db_name="XXXXXX",
client_key_path="XXXXXX",
client_pem_path="XXXXXX",
ca_pem_path="XXXXXX",
server_pem_path="XXXXXX",
server_name="XXXXXX",
)
Milvus設定パラメータ
Milvusバックエンドは様々なクエリパラメータをサポートしており、類似クエリをカスタマイズすることができます。これらのパラメータには以下が含まれます:
collection_name(None): 使用または作成するMilvusコレクションの名前。何も指定しない場合、新しいコレクションが作成されます。
metric("dotproduct"): 新しいインデックスを作成する際に使用する埋め込み距離メトリック。使用可能な値は (
"dotproduct"
,"euclidean"
) です。consistency_level("Session"): 使用する一貫性レベル。使用可能な値は (
"Strong"
,"Session"
,"Bounded"
,"Eventually"
) です。
これらのパラメータの詳細については、Milvus認証のドキュメントおよびMilvus一貫性レベルのドキュメントを参照してください。
これらのパラメータは、前のセクションで説明したどの方法でも指定することができます。以下は利用可能なパラメータをすべて含むブレインコンフィグの例です:
{
"similarity_backends": {
"milvus": {
"collection_name": "your_collection",
"metric": "dotproduct",
"consistency_level": "Strong"
}
}
}
しかし、通常はこれらのパラメータを直接 compute_similarity()
に直接渡されます:
milvus_index = fob.compute_similarity(
...
backend="milvus",
brain_key="milvus_index",
collection_name="your_collection",
metric="dotproduct",
consistency_level="Strong",
)
ブレイン・ランの管理
FiftyOne には、brain の実行を管理するために使用できるさまざまなメソッドが用意されています。
例えば list_brain_runs()
を呼び出して、データセットで利用可能なブレインキーを確認できます:
import fiftyone.brain as fob
# List all brain runs
dataset.list_brain_runs()
# Only list similarity runs
dataset.list_brain_runs(type=fob.Similarity)
# Only list specific similarity runs
dataset.list_brain_runs(
type=fob.Similarity,
patches_field="ground_truth",
supports_prompts=True,
)
また get_brain_info()
を使用して、ブレーンランの構成に関する情報を取得できます:
info = dataset.get_brain_info(brain_key)
print(info)
また load_brain_results()
を使用して SimilarityIndex
インスタンスをロードする。
また rename_brain_run()
を使用して、既存の類似結果ランに関連付けられたブレインキーの名前を変更します:
dataset.rename_brain_run(brain_key, new_brain_key)
最後に delete_brain_run()
を使用してブレイン・ランを削除します:
dataset.delete_brain_run(brain_key)
を呼び出します。 delete_brain_run()
を呼び出すと、FiftyOneデータセットからbrain runのレコードが削除されるだけで、関連するMilvusコレクションは削除されません:
# Delete the Milvus collection
milvus_index = dataset.load_brain_results(brain_key)
milvus_index.cleanup()
Milvusバックエンドを使用したFiftyOneデータセットの一般的なベクトル検索ワークフローについては、こちらのExamplesを参照してください。