使用 Milvus 與 FiftyOne 進行視覺搜尋
FiftyOne是一個開放源碼工具,用來建立高品質的資料集與電腦視覺模型。本指南可協助您將 Milvus 的相似性搜尋功能整合至 FiftyOne,讓您能在自己的資料集上進行視覺搜尋。
FiftyOne 提供 API 來建立 Milvus 資料集、上傳向量以及執行相似性查詢,您可以使用 Python程式語言或在 App 中透過點選方式來進行。本頁面的示範將著重於程式整合。
先決條件
在開始之前,請確認您有以下條件:
- 運行中的Milvus 伺服器。
- 已安裝
pymilvus
和fiftyone
的 Python 環境。 - 要搜尋的圖片資料集。
安裝需求
在這個範例中,我們要使用pymilvus
和fiftyone
。您可以執行下列指令來安裝它們:
python3 -m pip install pymilvus fiftyone torch torchvision
基本配方
使用 Milvus 在您的 FiftyOne 資料集上建立相似性索引,並以此查詢資料的基本工作流程如下:
- 將資料集載入FiftyOne
- 為您資料集中的樣本或斑塊計算向量內嵌,或選擇一個模型來使用產生內嵌。
- 使用
compute_similarity()
方法為資料集中的樣本或物件修補區產生一個 Milvus 相似度指數,方法是設定參數backend="milvus"
並指定您所選擇的brain_key
。 - 使用此 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", ...)
另外,您也可以透過設定以下的環境變數,永久設定 FiftyOne 使用 Milvus 後端:
export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus
或設定你的brain config的default_similarity_backend
參數,位於~/.fiftyone/brain_config.json
:
{
"default_similarity_backend": "milvus"
}
驗證
如果您使用自訂的 Milvus 伺服器,您可以用多種方式提供您的認證。
環境變數(推薦)
建議的方式是將您的 Milvus 認證資料儲存在下列的環境變數中,當連線到 Milvus 時,FiftyOne 會自動存取這些變數。
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
:
{
"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(無):要使用或建立的 Milvus 集合名稱。如果沒有提供,將會建立一個新的集合
metric("dotproduct"): 建立新索引時要使用的嵌入距離公制。支援的值是 (
"dotproduct"
,"euclidean"
)consistency_level("Session"): 要使用的一致性等級。支援的值為 (
"Strong"
,"Session"
,"Bounded"
,"Eventually"
)
有關這些參數的詳細資訊,請參閱Milvus 認證說明文件和Milvus 一致性等級說明文件。
您可以透過上一節所述的任何策略指定這些參數。下面是一個包含所有可用參數的brain config的範例:
{
"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 提供了多種方法,您可以用來管理大腦運行。
例如,您可以呼叫 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 資料集中刪除腦部運行的記錄;它不會刪除任何相關的 Milvus 資料集,您可以如下操作:
# Delete the Milvus collection
milvus_index = dataset.load_brain_results(brain_key)
milvus_index.cleanup()
有關使用 Milvus 後端在 FiftyOne 資料集上的常見向量搜尋工作流程,請參閱這裡的範例。