Vai al contenuto

Esempio di esplorazione dei COV

Benvenuti nel notebook di Ultralytics Explorer API! Questo notebook serve come punto di partenza per esplorare le varie risorse disponibili per aiutarvi a iniziare a usare Ultralytics per esplorare i vostri set di dati utilizzando la potenza della ricerca semantica. È possibile utilizzare le utility che consentono di esaminare tipi specifici di etichette utilizzando la ricerca vettoriale o anche query SQL.

Prova yolo explorer alimentato dall'API di Explorer

Semplicemente pip install ultralytics ed eseguire yolo explorer nel vostro terminale per eseguire query personalizzate e ricerche semantiche sui vostri set di dati direttamente nel vostro browser!

Nota della Comunità ⚠️

A partire da ultralytics>=8.3.10, il supporto di Ultralytics explorer è stato deprecato. Ma non preoccupatevi! È ora possibile accedere a funzionalità simili e persino migliorate tramite Ultralytics HUBla nostra piattaforma intuitiva senza codice, progettata per semplificare il vostro flusso di lavoro. Con Ultralytics HUB, potete continuare a esplorare, visualizzare e gestire i vostri dati senza sforzo, il tutto senza scrivere una sola riga di codice. Assicuratevi di dare un'occhiata e di approfittare delle sue potenti funzioni!🚀

Impostazione

Installazione Pip ultralytics e dipendenze e controllare il software e l'hardware.

%pip install ultralytics[explorer] openai
yolo checks

Utilizza la potenza della ricerca di similarità vettoriale per trovare i punti di dati simili nel dataset e la loro distanza nello spazio di incorporazione. È sufficiente creare una tabella di incorporazioni per la coppia dataset-modello data. È necessaria una sola volta e viene riutilizzata automaticamente.

exp = Explorer("VOC.yaml", model="yolo11n.pt")
exp.create_embeddings_table()

Una volta costruita la tabella degli embeddings, è possibile eseguire la ricerca semantica in uno dei seguenti modi:

  • Su un dato indice/elenco di indici nel dataset come - exp.get_similar(idx=[1,10], limit=10)
  • Su qualsiasi immagine/elenco di immagini non presenti nel dataset - exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10) In caso di input multipli, viene utilizzato l'aggregato delle loro incorporazioni.

Si ottiene un dataframe pandas con il numero limite di punti dati più simili all'input, insieme alla loro distanza nello spazio di incorporazione. È possibile utilizzare questo set di dati per eseguire ulteriori filtraggi.

Tabella di ricerca della somiglianza

# Search dataset by index
similar = exp.get_similar(idx=1, limit=10)
similar.head()

È possibile utilizzare anche il tracciato dei campioni simili direttamente utilizzando l'opzione plot_similar util

Ricerca per similarità immagine 1

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

Ricerca per similarità immagine 2

Ask AI: cercare o filtrare con il linguaggio naturale

È possibile richiedere all'oggetto Explorer il tipo di punti di dati che si desidera visualizzare e l'oggetto cercherà di restituire un dataframe con tali punti. Poiché è alimentato da LLM, non sempre ci riesce. In questo caso, restituirà None.

Chiedi al tavolo

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

per tracciare questi risultati si può usare plot_query_result Esempio di utilizzo:

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

Chiedi ai immagine 1

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

Eseguire query SQL sul set di dati

A volte si può desiderare di indagare su un certo tipo di voci nel set di dati. A questo scopo, Explorer consente di eseguire query SQL. Accetta uno dei due formati:

  • Le query che iniziano con "WHERE" selezionano automaticamente tutte le colonne. Questa può essere considerata come una query abbreviata
  • È anche possibile scrivere query complete in cui è possibile specificare quali colonne selezionare

Questo può essere utilizzato per analizzare le prestazioni del modello e punti di dati specifici. Ad esempio:

  • Supponiamo che il vostro modello si concentri su immagini con esseri umani e cani. Si può scrivere una query come questa per selezionare i punti che hanno almeno 2 umani E almeno un cane.

È possibile combinare la query SQL e la ricerca semantica per filtrare su un tipo specifico di risultati.

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)

Tabella delle query SQL

table = exp.sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10")
print(table)

Proprio come per la ricerca per similarità, è possibile anche tracciare direttamente le query sql utilizzando exp.plot_sql_query

Query SQL immagine 1

exp.plot_sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10", labels=True)

Lavorare con le incorporazioni Tabella (Avanzato)

Explorer funziona su LanceDB internamente. È possibile accedere direttamente a questa tabella, utilizzando Explorer.table ed eseguire query grezze, applicare pre-filtri e post-filtri, ecc.

table = exp.table
print(table.schema)

Eseguire query grezze

La ricerca vettoriale trova i vettori più vicini dal database. In un sistema di raccomandazione o in un motore di ricerca, è possibile trovare prodotti simili a quello cercato. In LLM e in altre applicazioni di AI, ogni punto di dati può essere presentato dalle incorporazioni generate da alcuni modelli, che restituiscono le caratteristiche più rilevanti.

Una ricerca in uno spazio vettoriale ad alta dimensione consiste nel trovare i K-Nearest-Neighbors (KNN) del vettore di interrogazione.

Metrica In LanceDB, una metrica è il modo di descrivere la distanza tra una coppia di vettori. Attualmente supporta le seguenti metriche:

  • L2
  • Coseno
  • La ricerca per similarità di Dot Explorer utilizza L2 per impostazione predefinita. È possibile eseguire query sulle tabelle direttamente o utilizzare il formato lance per creare utility personalizzate per gestire gli insiemi di dati. Maggiori dettagli sulle operazioni disponibili sulle tabelle LanceDB nei documenti.

Tabella delle query grezze

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

Lavorare con le incorporazioni

È possibile accedere alle incorporazioni grezze dalla tabella lancedb e analizzarle. Le incorporazioni dell'immagine sono memorizzate nella colonna vector

import numpy as np

embeddings = table.to_pandas()["vector"].tolist()
embeddings = np.array(embeddings)

Grafico di dispersione

Una delle fasi preliminari dell'analisi delle incorporazioni consiste nel tracciarle nello spazio 2D attraverso la riduzione della dimensionalità. Proviamo a fare un esempio

Esempio di grafico di dispersione

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

Indice di somiglianza

Ecco un semplice esempio di un'operazione che si avvale della tabella degli embeddings. Explorer è dotato di una tabella similarity_index operazione-

  • Cerca di stimare la somiglianza di ciascun punto di dati con il resto del set di dati.
  • Lo fa contando quanti embedding di immagini si trovano più vicini di max_dist all'immagine corrente nello spazio di embedding generato, considerando top_k immagini simili alla volta.

Per un dato set di dati, il modello, max_dist & top_k l'indice di similarità una volta generato sarà riutilizzato. Nel caso in cui il set di dati sia cambiato o sia semplicemente necessario rigenerare l'indice di somiglianza, si può passare il comando force=True. Come la ricerca vettoriale e quella SQL, anche questa è dotata di un util per tracciarla direttamente. Vediamo

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)

Indice di somiglianza

prima la trama

exp.plot_similarity_index(max_dist=0.2, top_k=0.01)

Ora diamo un'occhiata all'output dell'operazione

sim_idx = exp.similarity_index(max_dist=0.2, top_k=0.01, force=False)

sim_idx

Creiamo una query per vedere quali punti di dati hanno un numero di somiglianze superiore a 30 e tracciamo le immagini simili.

import numpy as np

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

Si dovrebbe vedere qualcosa di simile a questo

similitudine-indice-immagine

exp.plot_similar(idx=[7146, 14035])  # Using avg embeddings of 2 images
📅C reato 21 giorni fa ✏️ Aggiornato 7 giorni fa

Commenti