使用 Milvus 和 FiftyOne 进行视觉搜索
FiftyOne 是一个用于构建高质量数据集和计算机视觉模型的开源工具。本指南帮助您将 Milvus 的相似性搜索功能集成到 FiftyOne 中,使您能够在自己的数据集上进行视觉搜索。
FiftyOne 提供了一个 API 来创建 Milvus Collection,上传向量并运行相似性查询,既可以在 Python 中编程方式使用,也可以通过应用程序中的点击操作使用。本页面的演示重点关注编程集成。
先决条件
开始之前,请确保您拥有以下条件:
- 一个正在运行的 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", ...)
或者,您可以通过设置以下环境变量永久配置 FiftyOne 使用 Milvus 后端:
export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus
或者通过设置位于 ~/.fiftyone/brain_config.json
的brain config的 default_similarity_backend
参数:
{
"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 配置
您也可以将凭据存储在位于 ~/.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 凭据作为关键字参数:
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 Collection 的名称。如果未提供,将创建一个新 Collection
-
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", # Supported values are (`"Strong"`, `"Session"`, `"Bounded"`, `"Eventually"`). See https://milvus.io/docs/consistency.md#Consistency-Level for more details.
)
管理 brain runs
FiftyOne 提供了多种方法来管理 brain runs。
例如,您可以调用 list_brain_runs()
来查看数据集上可用的 brain keys:
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()
检索有关 brain run 配置的信息:
info = dataset.get_brain_info(brain_key)
print(info)
使用 load_brain_results()
为 brain run 加载 SimilarityIndex
实例。
您可以使用 rename_brain_run()
重命名与现有相似性结果运行关联的 brain key:
dataset.rename_brain_run(brain_key, new_brain_key)
最后,您可以使用 delete_brain_run()
删除 brain run:
dataset.delete_brain_run(brain_key)
调用 delete_brain_run()
只会从您的 FiftyOne 数据集中删除 brain run 记录;它不会删除任何关联的 Milvus Collection,您可以按如下方式执行:
# Delete the Milvus collection
milvus_index = dataset.load_brain_results(brain_key)
milvus_index.cleanup()
有关使用 Milvus 后端在 FiftyOne 数据集上进行常见向量搜索工作流程,请参阅此处的示例。