Ir al contenido

Ejemplo de exploración de VOC

Bienvenido al cuaderno de la API Ultralytics Explorer. 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 (impulsado por la API Explorer)

Instalar ultralytics y ejecutar yolo explorer en su terminal para ejecutar consultas personalizadas y búsqueda semántica en su navegador.

Nota de la comunidad ⚠️

A partir de ultralytics>=8.3.10, el soporte de Ultralytics Explorer está obsoleto. Características de exploración de conjuntos de datos similares (y ampliadas) están disponibles en Ultralytics Platform.

Configuración

Instalar ultralytics y los requisitos dependencias, luego verifique el software y el hardware.

!uv pip install ultralytics[explorer] openai
yolo checks

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="yolo26n.pt")
exp.create_embeddings_table()

Una vez construida la tabla de embeddings, puede ejecutar la búsqueda semántica de cualquiera de las siguientes maneras:

  • En un índice dado/lista de índices en el conjunto de datos, p. ej., 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.

Obtendrá un DataFrame de Pandas con el número limitado de puntos de datos más similares a la entrada, junto con su distancia en el espacio de embeddings. Puede usar este conjunto de datos para realizar un filtrado adicional.

Resultados de la búsqueda por similitud de Ultralytics

# 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

Imágenes similares encontradas mediante búsqueda vectorial

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

Visualización de búsquedas por similitud con incrustaciones

Preguntar a la IA: Buscar o filtrar con lenguaje natural

Puede solicitar al objeto Explorer el tipo de puntos de datos que desea ver, e intentará devolver un DataFrame con esos resultados. Dado que está impulsado por LLMs, no siempre acierta. En ese caso, devolverá None.

Ultralytics Pregunta a la IA resultados de consultas en lenguaje natural

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

Para graficar estos resultados, puede usar el plot_query_result utilidad. Ejemplo:

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

Resultado de la consulta a la IA mostrando imágenes coincidentes

# 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 su conjunto de datos

En ocasiones, es posible que desee investigar ciertas entradas en 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 una consulta abreviada.
  • También puede escribir consultas completas donde 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)

Tabla de resultados de la consulta SQL del Explorador

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

Visualización de imágenes coincidentes con consulta SQL

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.

Explorador de resultados de consultas SQL sin procesar

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

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

Visualización de diagramas de dispersión de incrustaciones de Explorer

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)

Análisis del índice de similitud de conjuntos de datos

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

Visualización del índice de similitud para el análisis de conjuntos de datos

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


📅 Creado hace 1 año ✏️ Actualizado hace 18 días
glenn-jocherRizwanMunawarpderrengermiles-deans-ultralyticsonuralpszrpicsalex

Comentarios