跳转至内容

VOC 探索示例

欢迎使用 Ultralytics Explorer API notebook!本notebook是探索各种可用资源的起点,可帮助您开始使用 Ultralytics 来探索您的数据集,并利用语义搜索的强大功能。您可以开箱即用地使用各种实用程序,这些实用程序允许您使用向量搜索甚至 SQL 查询来检查特定类型的标签。

尝试 yolo explorer 由 Explorer API 提供支持

简单地 pip install ultralytics 并运行 yolo explorer 在您的终端中运行,以便在浏览器中对数据集执行自定义查询和语义搜索!

社区提示 ⚠️

截至 ultralytics>=8.3.10,Ultralytics explorer 支持已弃用。但是不用担心!您现在可以通过以下方式访问类似甚至增强的功能 Ultralytics HUB,我们直观的无代码平台旨在简化您的工作流程。借助 Ultralytics HUB,您可以继续轻松地探索、可视化和管理您的数据,而无需编写任何代码。请务必查看并利用其强大的功能!🚀

设置

Pip 安装 ultralytics依赖项 并检查软件和硬件。

!uv pip install ultralytics[explorer] openai
yolo checks

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

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 util

相似性搜索图像 1

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

相似性搜索图像 2

Ask AI:使用自然语言搜索或过滤

您可以根据想要查看的数据点类型提示 Explorer 对象,它会尝试返回一个包含这些数据的数据帧。由于它由 LLM 提供支持,因此并不总是正确的。 在这种情况下,它将返回 None。

Ask ai table

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

要绘制这些结果,您可以使用 plot_query_result util 示例:

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

Ask ai image 1

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

在您的数据集上运行 SQL 查询

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

  • 以“WHERE”开头的查询将自动选择所有列。这可以被认为是一种简写查询
  • 您还可以编写完整的查询,在其中指定要选择的列

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

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

您可以结合使用 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)

SQL 查询表

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

就像相似性搜索一样,您还可以使用一个实用程序来直接绘制 sql 查询,使用 exp.plot_sql_query

SQL 查询图像 1

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

处理嵌入表(高级)

Explorer 适用于 LanceDB 在内部建立表格。您可以使用以下方式直接访问此表: Explorer.table 对象并运行原始查询,下推预过滤器和后过滤器等。

table = exp.table
print(table.schema)

运行原始查询¶

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

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

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

  • L2
  • 余弦
  • Dot Explorer 的相似性搜索默认使用 L2。您可以直接在表上运行查询,或者使用 lance 格式构建自定义实用程序来管理数据集。有关可用 LanceDB 表操作的更多详细信息,请参阅文档

Raw-queries-table

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

处理嵌入

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

import numpy as np

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

散点图

分析嵌入的初步步骤之一是通过降维在二维空间中绘制嵌入图。让我们举例说明

散点图示例

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()

相似度指数

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

  • 它尝试评估每个数据点与数据集中其余数据点的相似程度。
  • 它通过计算在生成的嵌入空间中,有多少图像嵌入比 max_dist 更接近当前图像来实现这一点,同时考虑 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


📅创建于 10 个月前 ✏️已更新 17 天前
glenn-jocherRizwanMunawarmiles-deans-ultralyticsonuralpszrpderrengerpicsalex

评论