一、说明
数据太多了。数据湖和数据仓库;广阔的像素牧场和充满文字的海洋。找到正确的数据就像大海捞针一样!如果你喜欢开源机器学习库 FiftyOne,矢量搜索引擎通过将复杂数据(图像的原始像素值、文本文档中的字符)转换为称为嵌入矢量的实体来解决此问题。
矢量搜索引擎通过将复杂数据(图像的原始像素值、文本文档中的字符)转换为称为嵌入矢量的实体来解决此问题。然后对这些数值向量编制索引 ,以便您可以有效地搜索原始数据。毫不奇怪,像Qdrant,Pinecone,LanceDB和Milvus这样的矢量搜索引擎已经成为几乎所有新AI应用程序的重要组成部分。
如果您正在处理图像或视频数据,并且希望将矢量搜索合并到工作流程中,则可能会产生相当多的开销:
- 您如何实现跨模式检索,例如搜索带有文本的图像?
- 如何整合置信度阈值或类标签等传统搜索筛选器?
- 在图像中搜索物体(人、猫、狗、汽车、自行车等)怎么样?
这些只是您将遇到的众多挑战中的一小部分。等。停。别急。有更好的方法...
FiftyOne是用于 矢量搜索的计算机视觉接口。FiftyOne开源工具包现在具有与Qdrant,Pinecone,LanceDB和Milvus的本机集成,因此您可以使用首选的矢量搜索引擎在一行代码中有效地搜索视觉数据。
想要一键找到与数据集中第二个样本最相似的 25 张图像?想要通过点击查找至少包含一个人和一辆自行车的交通图片?您可以!
二、FiftyOne它是如何工作的?
- 加载数据集。
为了便于说明,我们将加载 MS COCO 验证拆分的子集。
ba
import fiftyone as fo
import fiftyone.brain as fob
import fiftyone.zoo as foz
from fiftyone import ViewField as F
dataset = foz.load_zoo_dataset(
"coco-2017",
split='validation',
max_samples = 1000
)
session = fo.launch_app(dataset)
- 生成相似度指数。
为了搜索我们的媒体,我们需要索引 数据。在 FiftyOne 中,我们可以通过函数执行此操作。指定要用于生成嵌入向量的模型,以及要在后端使用的向量搜索引擎。您还可以为相似性索引指定一个名称,如果要针对多个索引运行向量搜索,这将非常有用。compute_similarity()
ba
## setup lancedb
pip install lancedb
## generate a similarity index
## with default model embeddings
## using LanceDB backend
fob.compute_similarity(
dataset,
brain_key="lancedb_index",
backend="lancedb",
)
## setup milvus
## download and start docker container +
pip install pymilvus
## generate a similarity index
## with CLIP model embeddings
## using Milvus backend
fob.compute_similarity(
dataset,
brain_key="milvus_clip_index",
backend="milvus",
metric="dotproduct"
)
- 搜索索引。
现在,您可以使用该方法使用一行代码对整个数据集运行图像搜索。要找到与数据集中第二张图像最相似的 25 张图像,我们可以传入样本的 ID、我们想要返回的结果数以及我们要搜索的索引的名称:sort_by_similarity()
ba
## get ID of first sample
query = dataset.skip(1).first().id
## find 25 most similar images with LanceDB backend
sim_view = dataset.sort_by_similarity(
query,
k=25,
brain_key="lancedb_index"
)
## display results
session = fo.launch_app(sim_view)
您也可以完全通过 FiftyOne 应用程序中的 UI 执行此操作:
三、语义搜索变得简单
处理多模式数据的麻烦已经一去不复返了。如果你想使用自然语言在语义上搜索你的图像,你可以使用完全相同的语法!使用 CLIP 等多模式模型创建索引嵌入,然后传入文本查询而不是示例 ID:
ba
## semantic query
query = "kites flying in the sky"
## find 30 most similar images with Milvus backend
kites_view = dataset.sort_by_similarity(
query,
k=30,
brain_key="milvus_clip_index"
)
## display results
session = fo.launch_app(kites_view)
这在非结构化数据探索中特别有用,并且比现有标签允许的更深入地挖掘数据。
这也可以完全在 FiftyOne 应用程序中执行:
四、传递预过滤器
对数据的特定子集运行矢量搜索通常涉及编写复杂的预过滤器:在矢量搜索之前传递到矢量搜索引擎以应用于数据集的过滤器。
FiftyOne的矢量搜索集成为您处理这些细节!
如果要查找看起来像"交通"的图像,但只希望将此搜索应用于包含人和 自行车的图像,可以通过调用筛选视图来实现此目的:sort_by_similarity()
ba
## create filtered view
view = dataset.match_labels(F("label").is_in(["person", "bicycle"]))
## search against this view
traffic_view = view.sort_by_similarity(
"traffic",
k=25,
brain_key="milvus_clip_index"
)
session = fo.launch_app(traffic_view)
五、把你的东西整理好
上述所有功能也可以与对象检测补丁一起开箱即用!
生成相似性索引时,您需要做的就是传入参数 - 命名可以找到"对象"的标签字段 - 并将为所有图像中的每个对象生成嵌入向量。矢量数据库为这些修补程序嵌入编制索引,以便您可以按与引用对象或自然语言查询的相似性对这些检测进行排序:patches_field``compute_similarity()
ba
## setup qdrant
# pull and start docker container +
pip install qdrant-client
## create a similarity index for ground truth patches
## with CLIP model, indexed with Qdrant vector database
fob.compute_similarity(
dataset,
patches_field="ground_truth",
model="clip-vit-base32-torch",
brain_key="qdrant_gt_index",
backend="qdrant"
)
## Search for the object that looks most like a tennis racket
tennis_view = dataset.to_patches("ground_truth").sort_by_similarity(
"tennis racket",
k = 25,
brain_key= "qdrant_gt_index"
)
session = fo.launch_app(tennis_view)
六、结论
无论您有多少图像或视频,您都需要使用矢量搜索。FiftyOne的原生矢量搜索集成将使您的生活更轻松。使用 FiftyOne,相似性搜索与应用更传统的筛选和查询操作一样简单。将矢量搜索查询与元数据查询混合搭配,以满足您的喜好。
有关 FiftyOne 中矢量搜索的一般信息,请查看 FiftyOne App 中的按相似性排序,以及有关相似性的 FiftyOne Brain 用户指南。
如果你喜欢开源机器学习库 FiftyOne,请在 GitHub 上给这个项目⭐一个(3,900 颗星,而且还在增加!)来表示您的支持。