Ultralytics YOLO27:

Ultralytics Explorer API#

社区提示 ⚠️

截至 ultralytics>=8.3.12,Ultralytics Explorer 已被移除。要使用 Explorer,请安装 pip install ultralytics==8.3.11。类似(且功能更丰富)的数据集探索功能现已在 Ultralytics Platform 中提供。

简介#

Explorer API 是一个用于探索数据集的 Python API。它支持使用 SQL 查询、向量相似度搜索和语义搜索来筛选和搜索数据集。



Watch: Ultralytics Explorer API Overview

安装#

Explorer 的部分功能依赖外部库。使用 Explorer 时,这些库会自动安装。要手动安装这些依赖项,请使用以下命令:

pip install ultralytics[explorer]

使用方法#

from ultralytics import Explorer

# Create an Explorer object
explorer = Explorer(data="coco128.yaml", model="yolo11n.pt")

# Create embeddings for your dataset
explorer.create_embeddings_table()

# Search for similar images to a given image/images
df = explorer.get_similar(img="path/to/image.jpg")

# Or search for similar images to a given index/indices
df = explorer.get_similar(idx=0)
注意

对于给定的数据集和模型组合,嵌入表只会创建一次,之后可以重复使用。这些表底层使用 LanceDB,支持可扩展的磁盘存储,因此你可以为 COCO 等大型数据集创建并重复使用嵌入,而不必担心内存耗尽。

如果你想强制更新嵌入表,可以将 force=True 传递给 create_embeddings_table 方法。

你可以直接访问 LanceDB 表对象,以执行高级分析。要了解详情,请参阅使用嵌入表部分

1. 相似度搜索#

相似度搜索是一种用于查找与给定图像相似图像的技术。它基于这样的理念:相似图像具有相似的嵌入。嵌入表构建完成后,你可以通过以下任一方式执行语义搜索:

  • 在数据集中的给定索引或索引列表上:exp.get_similar(idx=[1,10], limit=10)
  • 对数据集中不存在的任意图像或图像列表执行:exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10)

如果有多个输入,则使用它们嵌入的聚合结果。

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

语义搜索
from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data="coco128.yaml", model="yolo11n.pt")
exp.create_embeddings_table()

similar = exp.get_similar(img="https://ultralytics.com/images/bus.jpg", limit=10)
print(similar.head())

# Search using multiple indices
similar = exp.get_similar(
    img=["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/bus.jpg"],
    limit=10,
)
print(similar.head())

绘制相似图像#

你还可以使用 plot_similar 方法绘制相似图像。此方法接受与 get_similar 相同的参数,并以网格形式绘制相似图像。

绘制相似图像
from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data="coco128.yaml", model="yolo11n.pt")
exp.create_embeddings_table()

plt = exp.plot_similar(img="https://ultralytics.com/images/bus.jpg", limit=10)
plt.show()

2. 询问 AI(自然语言查询)#

此功能支持你使用自然语言筛选数据集,无需编写 SQL。AI 驱动的查询生成器会将你的提示转换为查询,并返回匹配的结果。例如,你可以询问:“显示 100 张恰好包含 1 个人和 2 只狗的图像,也可以包含其他物体”,它会生成查询并显示这些结果。 注意:此功能使用 LLM,因此结果具有概率性,可能不准确。

询问 AI
from ultralytics.data.explorer import plot_query_result

from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data="coco128.yaml", model="yolo11n.pt")
exp.create_embeddings_table()

df = exp.ask_ai("show me 100 images with exactly one person and 2 dogs. There can be other objects too")
print(df.head())

# plot the results
plt = plot_query_result(df)
plt.show()

3. SQL 查询#

你可以使用 sql_query 方法对数据集运行 SQL 查询。此方法接受 SQL 查询作为输入,并返回包含结果的 pandas DataFrame。

SQL 查询
from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data="coco128.yaml", model="yolo11n.pt")
exp.create_embeddings_table()

df = exp.sql_query("WHERE labels LIKE '%person%' AND labels LIKE '%dog%'")
print(df.head())

绘制 SQL 查询结果#

你还可以使用 plot_sql_query 方法绘制 SQL 查询的结果。此方法接受与 sql_query 相同的参数,并以网格形式绘制结果。

绘制 SQL 查询结果
from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data="coco128.yaml", model="yolo11n.pt")
exp.create_embeddings_table()

# plot the SQL Query
exp.plot_sql_query("WHERE labels LIKE '%person%' AND labels LIKE '%dog%' LIMIT 10")

4. 使用嵌入表#

你还可以直接使用嵌入表。嵌入表创建后,你可以使用 Explorer.table 访问它。

提示

Explorer 在内部使用 LanceDB 表。你可以使用 Explorer.table 对象直接访问此表,并运行原始查询、下推前置和后置筛选器等。

from ultralytics import Explorer

exp = Explorer()
exp.create_embeddings_table()
table = exp.table

以下是一些你可以对该表执行的操作示例:

获取原始嵌入#

示例
from ultralytics import Explorer

exp = Explorer()
exp.create_embeddings_table()
table = exp.table

embeddings = table.to_pandas()["vector"]
print(embeddings)

使用前置和后置筛选器执行高级查询#

示例
from ultralytics import Explorer

exp = Explorer(model="yolo11n.pt")
exp.create_embeddings_table()
table = exp.table

# Dummy embedding
embedding = [i for i in range(256)]
rs = table.search(embedding).metric("cosine").where("").limit(10)

创建向量索引#

使用大型数据集时,你还可以创建专用向量索引,以加快查询速度。这可以通过对 LanceDB 表使用 create_index 方法来完成。

table.create_index(num_partitions=..., num_sub_vectors=...)

5. 嵌入应用#

你可以使用嵌入表执行各种探索性分析。以下是一些示例:

相似度索引#

Explorer 提供了一个 similarity_index 操作:

  • 它会尝试估计每个数据点与数据集中其余数据的相似程度。
  • 它会在生成的嵌入空间中,统计与当前图像的距离小于 max_dist 的图像嵌入数量,并且每次将 top_k 张相似图像纳入考虑。

它会返回一个包含以下列的 pandas DataFrame:

  • idx:图像在数据集中的索引
  • im_file:图像文件的路径
  • count:数据集中与当前图像的距离小于 max_dist 的图像数量
  • sim_im_files:与当前图像相似的 count 张图像的路径列表
提示

对于给定的数据集、模型、max_disttop_k,生成相似度索引后会重复使用该索引。如果数据集发生变化,或者你只是需要重新生成相似度索引,可以传递 force=True

相似度索引
from ultralytics import Explorer

exp = Explorer()
exp.create_embeddings_table()

sim_idx = exp.similarity_index()

你可以使用相似度索引构建自定义条件,以筛选数据集。例如,你可以使用以下代码筛选出与数据集中任何其他图像都不相似的图像:

import numpy as np

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

可视化嵌入空间#

你还可以使用自己选择的绘图工具可视化嵌入空间。例如,下面是一个使用 Matplotlib 的简单示例:

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

# 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 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 API 创建你自己的 CV 数据集探索报告。你可以参考 VOC 探索示例 获取灵感。

使用 Ultralytics Explorer 构建的应用#

试用基于 Explorer API 的 GUI 演示

常见问题#

  • Ultralytics Explorer API 专为全面的数据集探索而设计。它支持用户使用 SQL 查询、向量相似度搜索和语义搜索来筛选和搜索数据集。这个强大的 Python API 可以处理大型数据集,非常适合使用 Ultralytics 模型执行各种计算机视觉任务。

  • 要安装 Ultralytics Explorer API 及其依赖项,请使用以下命令:

    pip install ultralytics[explorer]

    这会自动安装 Explorer API 功能所需的所有外部库。有关其他设置详情,请参阅我们文档中的安装部分

  • 你可以通过创建嵌入表并查询其中的相似图像,使用 Ultralytics Explorer API 执行相似度搜索。以下是一个基本示例:

    from ultralytics import Explorer
    
    # Create an Explorer object
    explorer = Explorer(data="coco128.yaml", model="yolo11n.pt")
    explorer.create_embeddings_table()
    
    # Search for similar images to a given image
    similar_images_df = explorer.get_similar(img="path/to/image.jpg")
    print(similar_images_df.head())

    有关更多详情,请参阅相似度搜索部分

  • Ultralytics Explorer 在底层使用 LanceDB,它提供可扩展的磁盘嵌入表。这确保你可以为 COCO 等大型数据集创建并重复使用嵌入,而不必担心内存耗尽。这些表只会创建一次,之后可以重复使用,从而提高数据处理效率。

  • 询问 AI 功能支持用户使用自然语言查询筛选数据集。此功能利用 LLM 在后台将这些查询转换为 SQL 查询。以下是一个示例:

    from ultralytics import Explorer
    
    # Create an Explorer object
    explorer = Explorer(data="coco128.yaml", model="yolo11n.pt")
    explorer.create_embeddings_table()
    
    # Query with natural language
    query_result = explorer.ask_ai("show me 100 images with exactly one person and 2 dogs. There can be other objects too")
    print(query_result.head())

    如需更多示例,请参阅询问 AI 部分

评论