5.4 VOC 探索示例
欢迎来到 Ultralytics Explorer API 的示例笔记本!这个笔记本是使用 Ultralytics 进行数据集探索的起点,您可以利用语义搜索的强大功能探索数据集中的各种资源。使用开箱即用的工具,您可以通过向量搜索或 SQL 查询来检查特定类型的标签。
希望这个笔记本中的资源可以帮助您最大化 Ultralytics 的使用效果。请浏览 Explorer 文档了解详细信息,在 GitHub 上提出问题以获取支持,并加入我们的 Discord 社区进行问题讨论!
尝试使用 Explorer API 驱动的 YOLO Explorer
只需 pip install ultralytics
,然后在终端中运行 yolo explorer
,即可在浏览器中对您的数据集运行自定义查询和语义搜索!
设置
使用 pip 安装 Ultralytics 及其依赖项,并检查软件和硬件配置。
%pip install ultralytics[explorer] openai
import ultralytics
ultralytics.checks()
from ultralytics import Explorer
相似性搜索
利用向量相似性搜索的强大功能来查找数据集中相似的数据点及其在嵌入空间中的距离。只需为给定的数据集和模型对创建嵌入表。此步骤只需执行一次,创建后的嵌入表会被自动重用。
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 数据框。您可以利用这些数据集进行进一步的筛选。
similar = exp.get_similar(idx=1, limit=10)
similar.head()
您还可以直接使用 plot_similar
工具绘制相似样本。
exp.plot_similar(idx=6500, limit=20)
# 可以传递索引列表或图像
exp.plot_similar(img="https://ultralytics.com/images/bus.jpg", limit=10, labels=False)
2. 使用 AI 查询(Ask 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 工具绘制这些结果
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)
3. 在数据集上运行 SQL 查询
有时,您可能希望调查数据集中某种类型的条目。为此,Explorer 允许您执行 SQL 查询。它接受以下两种格式:
-
以 "WHERE" 开头的查询会自动选择所有列,这可以看作是简写查询。
-
您也可以编写完整查询,指定要选择的列。
这可以用于调查模型性能和特定的数据点。例如:
假设您的模型在包含人类和狗的图像上表现不佳,您可以编写如下查询来选择至少包含 2 个以上人和 1 只狗的条目。
table = exp.sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10")
table
与相似性搜索一样,您还可以使用 exp.plot_sql_query
工具直接绘制 SQL 查询结果。
exp.plot_sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10", labels=True)
4. 嵌入表操作(高级)
Explorer 在内部基于 LanceDB 表进行工作。您可以直接使用 Explorer.table
对象访问该表,并运行原始查询、执行前置和后置过滤等操作。
table = exp.table
table.schema
运行原始查询
向量搜索从数据库中查找最近的向量。在推荐系统或搜索引擎中,您可以找到与搜索项相似的产品。在 LLM 和其他 AI 应用中,每个数据点可以由某些模型生成的嵌入表示,它返回最相关的特征。
在高维向量空间中进行搜索,是查找查询向量的 K-Nearest-Neighbors(KNN)。
dummy_img_embedding = [i for i in range(256)]
table.search(dummy_img_embedding).limit(5).to_pandas()
5. 相似性指数
这是一个由嵌入表驱动的操作的简单示例。Explorer 带有一个 similarity_index
操作:
-
它尝试估计每个数据点与数据集其他部分的相似程度。
-
通过计算嵌入空间中距离当前图像小于
max_dist
的图像数量,考虑一次最多top_k
个相似图像。
对于给定的数据集、模型、max_dist
和 top_k
,一旦生成相似性指数,就会被重用。如果数据集发生了变化,或者您需要重新生成相似性指数,可以传递 force=True
。
与向量和 SQL 搜索类似,它也有一个工具可以直接绘制它。
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)
import numpy as np
sim_count = np.array(sim_idx["count"])
sim_idx["im_file"][sim_count > 30]
# 绘制相似的图像
exp.plot_similar(idx=[7146, 14035])
这个示例展示了如何使用 Ultralytics Explorer API 进行有效的数据集探索和分析。