Ejemplo de exploración de VOC
Bienvenido al cuaderno de la API Ultralytics . Este cuaderno presenta los recursos disponibles para explorar conjuntos de datos con búsqueda semántica, búsqueda vectorial y consultas SQL.
Probar yolo explorer (con tecnología de la API Explorer)
Instalar ultralytics y ejecutar yolo explorer en tu terminal para ejecutar consultas personalizadas y búsquedas semánticas en tu navegador.
Nota de la comunidad ⚠️
A partir de ultralytics>=8.3.10El soporte para Ultralytics ha quedado obsoleto. Hay disponibles funciones similares (y ampliadas) para la exploración de conjuntos de datos en Ultralytics HUB.
Configuración
Instalar ultralytics y lo requerido dependencias, comprueba el software y el hardware.
!uv pip install ultralytics[explorer] openai
yolo checks
Búsqueda de similitud
Utilice el poder de la búsqueda de similitud vectorial para encontrar los puntos de datos similares en su conjunto de datos junto con su distancia en el espacio de incrustación. Simplemente cree una tabla de incrustaciones para el par conjunto de datos-modelo dado. Solo es necesario una vez y se reutiliza automáticamente.
exp = Explorer("VOC.yaml", model="yolo11n.pt")
exp.create_embeddings_table()
Una vez creada la tabla de incrustaciones, puede ejecutar la búsqueda semántica de cualquiera de las siguientes maneras:
- En un índice/lista de índices determinados del conjunto de datos, por ejemplo,
exp.get_similar(idx=[1, 10], limit=10) - En cualquier imagen/lista de imágenes que no estén en el conjunto de datos - exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10). En el caso de múltiples entradas, se utiliza el agregado de sus embeddings.
Obtienes un DataFrame de pandas con el número límite de puntos de datos más similares a la entrada, junto con su distancia en el espacio de incrustación. Puedes utilizar este conjunto de datos para realizar un filtrado adicional.

# Search dataset by index
similar = exp.get_similar(idx=1, limit=10)
similar.head()
También puedes trazar las muestras similares directamente usando el plot_similar util

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

Pregunta a la IA: busca o filtra con lenguaje natural
Puede indicar al objeto Explorer el tipo de puntos de datos que desea ver, y este intentará devolver un DataFrame con esos resultados. Dado que funciona con LLM, no siempre acierta. En ese caso, devolverá None.

df = exp.ask_ai("show me images containing more than 10 objects with at least 2 persons")
df.head(5)
Para trazar estos resultados, puede utilizar el plot_query_result utilidad. Ejemplo:
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)
Ejecuta consultas SQL en tu conjunto de datos
A veces es posible que desee investigar determinadas entradas de su conjunto de datos. Para ello, Explorer le permite ejecutar consultas SQL. Acepta cualquiera de los siguientes formatos:
- Las consultas que comienzan con «WHERE» seleccionarán automáticamente todas las columnas. Esto puede considerarse como una consulta abreviada.
- También puede escribir consultas completas en las que puede especificar qué columnas seleccionar.
Esto se puede utilizar para investigar el rendimiento del modelo y los puntos de datos específicos. Por ejemplo:
- digamos que su modelo tiene problemas con las imágenes que tienen humanos y perros. Puede escribir una consulta como esta para seleccionar los puntos que tienen al menos 2 humanos Y al menos un perro.
Puede combinar consultas SQL y búsqueda semántica para filtrar a un tipo específico de resultados
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)
Al igual que con la búsqueda por similitud, también dispones de una utilidad para trazar directamente las consultas SQL usando exp.plot_sql_query

exp.plot_sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10", labels=True)
Tabla para trabajar con incrustaciones (Embeddings) (Avanzado)
Explorer funciona en LanceDB tablas internamente. Puedes acceder a esta tabla directamente, usando Explorer.table objeto y ejecutar consultas sin procesar, insertar filtros previos y posteriores, etc.
table = exp.table
print(table.schema)
Ejecutar consultas sin procesar¶
La búsqueda vectorial encuentra los vectores más cercanos de la base de datos. En un sistema de recomendación o motor de búsqueda, puedes encontrar productos similares al que buscaste. En LLM y otras aplicaciones de IA, cada punto de datos puede ser presentado por las incrustaciones generadas a partir de algunos modelos, devuelve las características más relevantes.
Una búsqueda en un espacio vectorial de alta dimensión, es encontrar los K-vecinos más cercanos (KNN) del vector de consulta.
Métrica En LanceDB, una Métrica es la forma de describir la distancia entre un par de vectores. Actualmente, soporta las siguientes métricas:
- L2
- Coseno
- La búsqueda de similitud de Dot Explorer utiliza L2 de forma predeterminada. Puede ejecutar consultas directamente en las tablas o utilizar el formato lance para crear utilidades personalizadas para administrar conjuntos de datos. Más detalles sobre las operaciones de tabla LanceDB disponibles en la documentación.

dummy_img_embedding = [i for i in range(256)]
table.search(dummy_img_embedding).limit(5).to_pandas()
Interconversión a formatos de datos populares
df = table.to_pandas()
pa_table = table.to_arrow()
Trabajar con incrustaciones (Embeddings)
Puede acceder a la incrustación sin procesar de la tabla lancedb y analizarla. Las incrustaciones de imágenes se almacenan en la columna vector
import numpy as np
embeddings = table.to_pandas()["vector"].tolist()
embeddings = np.array(embeddings)
Gráfico de dispersión
Uno de los pasos preliminares en el análisis de incrustaciones es trazarlas en un espacio 2D mediante la reducción de la dimensionalidad. Probemos un ejemplo

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()
Índice de similitud
Aquí tiene un ejemplo sencillo de una operación impulsada por la tabla de incrustaciones. Explorer viene con un similarity_index operación-
- Intenta estimar cuán similar es cada punto de datos con el resto del conjunto de datos.
- Lo hace contando cuántas incrustaciones de imágenes se encuentran a una distancia menor que max_dist de la imagen actual en el espacio de incrustación generado, considerando top_k imágenes similares a la vez.
Para un conjunto de datos dado, modelo, max_dist & top_k el índice de similitud una vez generado se reutilizará. En caso de que tu conjunto de datos haya cambiado, o simplemente necesites regenerar el índice de similitud, puedes pasar force=True. Similar a la búsqueda vectorial y SQL, esto también viene con una utilidad para trazarlo directamente. Echemos un vistazo
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)

primero en el gráfico
exp.plot_similarity_index(max_dist=0.2, top_k=0.01)
Ahora veamos el resultado de la operación
sim_idx = exp.similarity_index(max_dist=0.2, top_k=0.01, force=False)
sim_idx
Creemos una consulta para ver qué puntos de datos tienen un recuento de similitud de más de 30 y representemos imágenes similares a ellos.
import numpy as np
sim_count = np.array(sim_idx["count"])
sim_idx["im_file"][sim_count > 30]
Debería ver algo como esto

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