企业级安全防护: 符合 ISO 27001 + SOC 2 Type I 标准。

Link to this sectionVOC 探索示例#

Ultralytics YOLO banner

中文 | 한국어 | 日本語 | Русский | Deutsch | Français | Español | Português | Türkçe | Tiếng Việt | العربية


Ultralytics CI Ultralytics Downloads Ultralytics Discord Ultralytics Forums Ultralytics Reddit
Run Ultralytics on Gradient Open Ultralytics In Colab Open Ultralytics In Kaggle Open Ultralytics In Binder

欢迎阅读 Ultralytics Explorer API 笔记本。本笔记本介绍了可用于通过语义搜索、向量搜索和 SQL 查询来探索数据集的资源。

尝试 yolo explorer(由 Explorer API 提供支持)

安装 ultralytics 并在终端运行 yolo explorer,即可在浏览器中运行自定义查询和语义搜索。

社区说明 ⚠️

ultralytics>=8.3.12 起,Ultralytics Explorer 已被移除。若要使用 Explorer,请通过 pip install ultralytics==8.3.11 安装。类似(且已扩展)的数据集探索功能可在 Ultralytics Platform 中使用。

Link to this section设置#

安装 ultralytics 和所需的 依赖项,然后检查软件和硬件。

!uv pip install ultralytics[explorer] openai
yolo checks

Link to this section相似度搜索#

利用向量相似度搜索的强大功能,在数据集中查找相似数据点及其在嵌入空间中的距离。只需为指定的数据集-模型对创建一个嵌入表即可。它仅需创建一次,后续会自动重复使用。

exp = Explorer("VOC.yaml", model="yolo11n.pt")
exp.create_embeddings_table()

一旦建立嵌入表,你可以通过以下任一方式运行语义搜索:

  • 针对数据集中的给定索引/索引列表,例如 exp.get_similar(idx=[1, 10], limit=10)
  • 针对数据集中不存在的任何图像/图像列表 - exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10)。如果有多个输入,将使用其嵌入的聚合值。

你将获得一个包含与输入最相似的限定数量数据点的 pandas DataFrame,以及它们在嵌入空间中的距离。你可以使用此数据集进行进一步筛选。

Ultralytics Explorer 相似度搜索结果

# Search dataset by index
similar = exp.get_similar(idx=1, limit=10)
similar.head()

你也可以直接使用 plot_similar 工具绘制相似样本

向量搜索找到的相似图像

exp.plot_similar(idx=6500, limit=20)
exp.plot_similar(idx=[100, 101], limit=10)  # Can also pass list of idxs or imgs

exp.plot_similar(img="https://ultralytics.com/images/bus.jpg", limit=10, labels=False)  # Can also pass external images

带嵌入的相似度搜索可视化

Link to this section询问 AI:使用自然语言搜索或筛选#

你可以向 Explorer 对象提示你想要查看的数据点类型,它将尝试返回一个包含这些结果的 DataFrame。由于它由 LLMs 提供支持,它并不总是准确的。在这种情况下,它将返回 None

Ultralytics Explorer 询问 AI 自然语言查询结果

df = exp.ask_ai("show me images containing more than 10 objects with at least 2 persons")
df.head(5)

要绘制这些结果,你可以使用 plot_query_result 工具。示例:

plt = plot_query_result(exp.ask_ai("show me 10 images containing exactly 2 persons"))
Image.fromarray(plt)

显示匹配图像的询问 AI 查询结果

# plot
from PIL import Image
from ultralytics.data.explorer import plot_query_result

plt = plot_query_result(exp.ask_ai("show me 10 images containing exactly 2 persons"))
Image.fromarray(plt)

Link to this section在你的数据集上运行 SQL 查询#

有时你可能想要调查数据集中的某些条目。为此,Explorer 允许你执行 SQL 查询。它接受以下任一格式:

  • 以 "WHERE" 开头的查询将自动选择所有列。这可以被视为一种简写查询。
  • 你也可以编写完整查询,在其中指定要选择的列。

这可用于调查模型性能和特定数据点。例如:

  • 假设你的模型在包含人和狗的图像上表现不佳。你可以编写如下查询来选择至少包含 2 个人 AND 至少有一只狗的数据点。

你可以结合 SQL 查询和语义搜索来筛选出特定类型的结果

table = exp.sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10")
exp.plot_sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10", labels=True)

Explorer SQL 查询结果表

table = exp.sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10")
print(table)

就像相似度搜索一样,你也可以获得一个工具,通过 exp.plot_sql_query 直接绘制 SQL 查询结果

SQL 查询匹配图像可视化

exp.plot_sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10", labels=True)

Link to this section使用嵌入表(高级)#

Explorer 在内部使用 LanceDB 表。你可以使用 Explorer.table 对象直接访问此表,运行原始查询,下推预过滤和后过滤等。

table = exp.table
print(table.schema)

Link to this section运行原始查询¶#

向量搜索从数据库中查找最近的向量。在推荐系统或搜索引擎中,你可以找到与你搜索的产品相似的产品。在 LLM 和其他 AI 应用中,每个数据点都可以由某些模型生成的嵌入来表示,它会返回最相关的特征。

在高维向量空间中搜索,就是找到查询向量的 K-近邻 (KNN)。

度量 (Metric) 在 LanceDB 中,度量是描述一对向量之间距离的方式。目前,它支持以下度量:

  • L2
  • Cosine
  • Dot Explorer 的相似度搜索默认使用 L2。你可以直接在表上运行查询,或使用 lance 格式构建自定义工具来管理数据集。有关可用 LanceDB 表操作的更多详情,请参见 文档

Explorer 原始 SQL 查询结果表

dummy_img_embedding = [i for i in range(256)]
table.search(dummy_img_embedding).limit(5).to_pandas()

Link to this section与流行数据格式的互转#

df = table.to_pandas()
pa_table = table.to_arrow()

Link to this section使用嵌入#

你可以从 lancedb 表访问原始嵌入并对其进行分析。图像嵌入存储在 vector 列中

import numpy as np

embeddings = table.to_pandas()["vector"].tolist()
embeddings = np.array(embeddings)

Link to this section散点图#

分析嵌入的初步步骤之一是通过降维将它们绘制在二维空间中。让我们尝试一个示例

Explorer 嵌入散点图可视化

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA  # pip install scikit-learn

# Reduce dimensions using PCA to 3 components for visualization in 3D
pca = PCA(n_components=3)
reduced_data = pca.fit_transform(embeddings)

# Create a 3D scatter plot using Matplotlib's Axes3D
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection="3d")

# Scatter plot
ax.scatter(reduced_data[:, 0], reduced_data[:, 1], reduced_data[:, 2], alpha=0.5)
ax.set_title("3D Scatter Plot of Reduced 256-Dimensional Data (PCA)")
ax.set_xlabel("Component 1")
ax.set_ylabel("Component 2")
ax.set_zlabel("Component 3")

plt.show()

Link to this section相似度索引#

这是由嵌入表支持的操作的一个简单示例。Explorer 附带了一个 similarity_index 操作-

  • 它试图估计每个数据点与数据集其余部分的相似程度。
  • 它通过计算在生成的嵌入空间中,有多少图像嵌入比当前图像的距离更近(在考虑每次 top_k 个相似图像的情况下)来实现这一点。

对于给定的数据集、模型、max_disttop_k,生成的相似度索引将被重复使用。如果你的数据集已更改,或者你只需要重新生成相似度索引,你可以传递 force=True。与向量和 SQL 搜索类似,它也附带一个可以直接绘制它的工具。

sim_idx = exp.similarity_index(max_dist=0.2, top_k=0.01)
exp.plot_similarity_index(max_dist=0.2, top_k=0.01)

数据集相似度索引分析

让我们先看看图表

exp.plot_similarity_index(max_dist=0.2, top_k=0.01)

现在让我们看看该操作的输出

sim_idx = exp.similarity_index(max_dist=0.2, top_k=0.01, force=False)

sim_idx

让我们创建一个查询,看看哪些数据点的相似度计数超过 30,并绘制与它们相似的图像。

import numpy as np

sim_count = np.array(sim_idx["count"])
sim_idx["im_file"][sim_count > 30]

你应该看到类似这样的内容

数据集分析的相似度索引可视化

exp.plot_similar(idx=[7146, 14035])  # Using avg embeddings of 2 images

评论