Ejemplo de exploración de VOC#
中文 | 한국어 | 日本語 | Русский | Deutsch | Français | Español | Português | Türkçe | Tiếng Việt | العربية
Te damos la bienvenida al cuaderno de la API de Ultralytics Explorer. Este cuaderno presenta los recursos disponibles para explorar conjuntos de datos con búsqueda semántica, búsqueda vectorial y consultas SQL.
Prueba yolo explorer (impulsado por la API de Explorer)
Instala ultralytics y ejecuta yolo explorer en tu terminal para realizar consultas personalizadas y búsquedas semánticas en tu navegador.
A partir de ultralytics>=8.3.12, Ultralytics Explorer ha sido eliminado. Para usar Explorer, instala pip install ultralytics==8.3.11. Funciones de exploración de datasets similares (y ampliadas) están disponibles en Ultralytics Platform.
Configuración#
Instala ultralytics y las dependencias necesarias; a continuación, comprueba el software y el hardware.
!uv pip install ultralytics[explorer] openai
yolo checksBúsqueda de similitud#
Utiliza el potencial de la búsqueda de similitud vectorial para encontrar puntos de datos similares en tu conjunto de datos junto con su distancia en el espacio de incrustaciones. Solo tienes que crear una tabla de incrustaciones para el par de conjunto de datos y modelo dado. Solo se necesita 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, puedes ejecutar la búsqueda semántica de cualquiera de las siguientes maneras:
- En un índice o lista de índices determinados del conjunto de datos, por ejemplo:
exp.get_similar(idx=[1, 10], limit=10) - En cualquier imagen o 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 caso de múltiples entradas, se utiliza el agregado de sus incrustaciones.
Obtendrás 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 incrustaciones. 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 utilizando la utilidad 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
Preguntar a la IA: Buscar o filtrar con lenguaje natural#
Puedes solicitar al objeto Explorer el tipo de puntos de datos que deseas ver, y este intentará devolver un DataFrame con dichos resultados. Como funciona con LLMs, 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, puedes utilizar la utilidad plot_query_result. 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)Ejecutar consultas SQL en tu conjunto de datos#
A veces es posible que quieras investigar ciertas entradas en tu conjunto de datos. Para ello, Explorer te permite ejecutar consultas SQL. Acepta cualquiera de los siguientes formatos:
- Las consultas que comienzan con "WHERE" seleccionarán automáticamente todas las columnas. Esto se puede considerar como una consulta abreviada.
- También puedes escribir consultas completas en las que puedes especificar qué columnas seleccionar.
Esto se puede utilizar para investigar el rendimiento del modelo y puntos de datos específicos. Por ejemplo:
- Supongamos que tu modelo tiene dificultades con imágenes que contienen humanos y perros. Puedes escribir una consulta como esta para seleccionar los puntos que tienen al menos 2 humanos Y al menos un perro.
Puedes combinar una consulta SQL y una búsqueda semántica para acotar 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 en la búsqueda de similitud, también obtienes una utilidad para trazar directamente las consultas SQL utilizando exp.plot_sql_query

exp.plot_sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10", labels=True)Trabajar con la tabla de incrustaciones (Avanzado)#
Explorer funciona internamente con tablas de LanceDB. Puedes acceder a esta tabla directamente utilizando el objeto Explorer.table y ejecutar consultas sin procesar, aplicar 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 has buscado. En aplicaciones de LLM y otras aplicaciones de IA, cada punto de datos se puede representar mediante las incrustaciones generadas por algunos modelos; esto devuelve las características más relevantes.
Una búsqueda en un espacio vectorial de alta dimensión consiste en 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, admite las siguientes métricas:
- L2
- Coseno
- Dot La búsqueda de similitud de Explorer utiliza L2 de manera predeterminada. Puedes ejecutar consultas directamente en las tablas o usar el formato lance para crear utilidades personalizadas con el fin de gestionar conjuntos de datos. Más detalles sobre las operaciones de tabla de 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#
Puedes acceder a la incrustación sin procesar desde la tabla de lancedb y analizarla. Las incrustaciones de las 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 para analizar las incrustaciones es trazarlas en un espacio 2D mediante la reducción de dimensionalidad. Probemos con 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#
He aquí un sencillo ejemplo de una operación impulsada por la tabla de incrustaciones. Explorer incluye una operación similarity_index:
- 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 más cerca que max_dist de la imagen actual en el espacio de incrustaciones generado, considerando las top_k imágenes similares a la vez.
Para un conjunto de datos, un modelo, max_dist y top_k dados, 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. Al igual que la búsqueda vectorial y SQL, esto también incluye una utilidad para trazarlo directamente.
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)
Echemos un vistazo al gráfico primero
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_idxCreemos una consulta para ver qué puntos de datos tienen un recuento de similitud superior a 30 y tracemos imágenes similares a ellos.
import numpy as np
sim_count = np.array(sim_idx["count"])
sim_idx["im_file"][sim_count > 30]Deberías ver algo así

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