Link to this sectionVOC 探索示例#
中文 | 한국어 | 日本語 | Русский | Deutsch | Français | Español | Português | Türkçe | Tiếng Việt | العربية
欢迎阅读 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 checksLink 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,以及它们在嵌入空间中的距离。你可以使用此数据集进行进一步筛选。

# 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。

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)
# 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)
table = exp.sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10")
print(table)就像相似度搜索一样,你也可以获得一个工具,通过 exp.plot_sql_query 直接绘制 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 表操作的更多详情,请参见 文档

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散点图#
分析嵌入的初步步骤之一是通过降维将它们绘制在二维空间中。让我们尝试一个示例

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_dist 和 top_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