Saltar al contenido

Ultralytics Explorador API

Introducción

Abrir en Colab La API Explorador es una API Python para explorar tus conjuntos de datos. Admite el filtrado y la búsqueda de tu conjunto de datos mediante consultas SQL, búsqueda de similitud vectorial y búsqueda semántica.



Observa: Ultralytics Visión general de la API del Explorador

Instalación

Explorer depende de bibliotecas externas para algunas de sus funciones. Éstas se instalan automáticamente al utilizarlo. Para instalar manualmente estas dependencias, utiliza el siguiente comando:

pip install ultralytics[explorer]

Utilización

from ultralytics import Explorer

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

# Create embeddings for your dataset
explorer.create_embeddings_table()

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

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

Nota

La tabla de incrustaciones para un determinado conjunto de datos y par de modelos sólo se crea una vez y se reutiliza. Utilizan LanceDB bajo el capó, que escala en disco, de modo que puedes crear y reutilizar incrustaciones para grandes conjuntos de datos como COCO sin quedarte sin memoria.

En caso de que quieras forzar la actualización de la tabla de incrustaciones, puedes pasar force=True a create_embeddings_table método.

Puedes acceder directamente al objeto de tabla LanceDB para realizar análisis avanzados. Obtén más información al respecto en la sección Trabajar con tablas incrustadas

La búsqueda por similitud es una técnica para encontrar imágenes similares a una imagen dada. Se basa en la idea de que las imágenes similares tendrán incrustaciones similares. Una vez construida la tabla de incrustaciones, puedes ejecutar la búsqueda semántica de cualquiera de las siguientes formas:

  • En un índice o lista de índices dados del conjunto de datos: exp.get_similar(idx=[1,10], limit=10)
  • En cualquier imagen o lista de imágenes que no esté en el conjunto de datos: exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10)

Si hay varias entradas, se utiliza la suma de sus incrustaciones.

Obtendrás un marco de datos pandas con la función limit número de puntos de datos más similares a los de entrada, junto con su distancia en el espacio de incrustación. Puedes utilizar este conjunto de datos para realizar otros filtrados

Búsqueda Semántica

from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.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())
from ultralytics import Explorer

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

similar = exp.get_similar(idx=1, limit=10)
print(similar.head())

# Search using multiple indices
similar = exp.get_similar(idx=[1,10], limit=10)
print(similar.head())

Trazar imágenes similares

También puedes trazar las imágenes similares utilizando la función plot_similar método. Este método toma los mismos argumentos que get_similar y traza las imágenes similares en una cuadrícula.

Trazar imágenes similares

from ultralytics import Explorer

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

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

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

plt = exp.plot_similar(idx=1, limit=10)
plt.show()

2. Ask AI (Consulta en lenguaje natural)

Esto te permite escribir cómo quieres filtrar tu conjunto de datos utilizando lenguaje natural. No tienes que ser experto en escribir consultas SQL. Nuestro generador de consultas basado en IA lo hará automáticamente. Por ejemplo, puedes decir "muéstrame 100 imágenes con exactamente una persona y 2 perros. También puede haber otros objetos" y generará internamente la consulta y te mostrará los resultados. Nota: Esto funciona utilizando LLMs bajo el capó, por lo que los resultados son probabilísticos y puede que a veces se equivoquen.

Pregunta a la IA

from ultralytics import Explorer
from ultralytics.data.explorer import plot_query_result


# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.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. Consulta SQL

Puedes ejecutar consultas SQL en tu conjunto de datos utilizando la función sql_query método. Este método toma una consulta SQL como entrada y devuelve un marco de datos pandas con los resultados.

Consulta SQL

from ultralytics import Explorer

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

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

Trazar los resultados de una consulta SQL

También puedes trazar los resultados de una consulta SQL utilizando la función plot_sql_query método. Este método toma los mismos argumentos que sql_query y traza los resultados en una cuadrícula.

Trazar los resultados de una consulta SQL

from ultralytics import Explorer

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

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

4. Trabajar con la tabla de incrustaciones

También puedes trabajar directamente con la tabla de incrustaciones. Una vez creada la tabla de incrustaciones, puedes acceder a ella utilizando la función Explorer.table

El Explorador funciona en LanceDB internamente. Puedes acceder a esta tabla directamente, utilizando Explorer.table y ejecuta consultas sin procesar, introduce filtros previos y posteriores, etc.

from ultralytics import Explorer

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

Aquí tienes algunos ejemplos de lo que puedes hacer con la mesa:

Obtener incrustaciones en bruto

Ejemplo

from ultralytics import Explorer

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

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

Consulta avanzada con filtros previos y posteriores

Ejemplo

from ultralytics import Explorer

exp = Explorer(model="yolov8n.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)

Crear índice vectorial

Cuando utilices grandes conjuntos de datos, también puedes crear un índice vectorial específico para una consulta más rápida. Esto se hace utilizando la función create_index en la tabla LanceDB.

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

Encuentra más detalles sobre los tipos de índices vectoriales disponibles y los parámetros aquí En el futuro, añadiremos soporte para crear índices vectoriales directamente desde la API del Explorador.

5. Aplicaciones incrustadas

Puedes utilizar la tabla de incrustaciones para realizar diversos análisis exploratorios. He aquí algunos ejemplos:

Índice de similitud

El Explorador viene con un similarity_index funcionamiento:

  • Intenta estimar la similitud de cada punto de datos con el resto del conjunto de datos.
  • Para ello, cuenta cuántas imágenes incrustadas están más cerca que max_dist a la imagen actual en el espacio de incrustación generado, considerando top_k imágenes similares a la vez.

Devuelve un marco de datos pandas con las siguientes columnas:

  • idx: Índice de la imagen en el conjunto de datos
  • im_file: Ruta al archivo de imagen
  • count: Número de imágenes del conjunto de datos que están más cerca que max_dist a la imagen actual
  • sim_im_files: Lista de rutas a los count imágenes similares

Consejo

Para un conjunto de datos dado, modelo, max_dist & top_k se reutilizará el índice de similitud una vez generado. En caso de que tu conjunto de datos haya cambiado, o simplemente necesites regenerar el índice de similitud, puedes pasar force=True.

Índice de similitud

from ultralytics import Explorer

exp = Explorer()
exp.create_embeddings_table()

sim_idx = exp.similarity_index()

Puedes utilizar el índice de similitud para crear condiciones personalizadas para filtrar el conjunto de datos. Por ejemplo, puedes filtrar las imágenes que no sean similares a ninguna otra imagen del conjunto de datos utilizando el siguiente código:

import numpy as np

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

Visualizar el espacio de incrustación

También puedes visualizar el espacio de incrustación utilizando la herramienta de trazado que prefieras. Aquí tienes un ejemplo sencillo utilizando matplotlib:

import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

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

Empieza a crear tus propios informes de exploración de conjuntos de datos CV utilizando la API del Explorador. Para inspirarte, consulta la página

Aplicaciones creadas con Ultralytics Explorer

Prueba nuestra Demo GUI basada en Explorer API

Próximamente

  • [ ] Fusionar etiquetas específicas de conjuntos de datos. Ejemplo - Importar todos person etiquetas de COCO y car etiquetas de Paisajes urbanos
  • [ ] Elimina las imágenes que tengan un índice de similitud superior al umbral dado
  • [ ] Persistir automáticamente nuevos conjuntos de datos después de fusionar/eliminar entradas
  • [ ] Visualizaciones avanzadas de conjuntos de datos


Creado 2024-01-07, Actualizado 2024-04-27
Autores: glenn-jocher (8), 0xSynapse (1), RizwanMunawar (2), AyushExel (2)

Comentarios