VOC Explorationsbeispiel

Ultralytics YOLO Banner

中文 | 한국어 | 日本語 | Русский | Deutsch | Français | Español | Português | Türkçe | Tiếng Việt | العربية


Ultralytics CI Ultralytics Downloads Ultralytics Discord Ultralytics Forums Ultralytics Reddit
Run Ultralytics on Gradient Open Ultralytics In Colab Open Ultralytics In Kaggle Open Ultralytics In Binder

Willkommen im Ultralytics Explorer API-Notebook. Dieses Notebook stellt die Ressourcen vor, die zur Untersuchung von Datensätzen mittels semantischer Suche, Vektorsuche und SQL-Abfragen zur Verfügung stehen.

Probiere yolo explorer aus (unterstützt durch die Explorer API)

Installiere ultralytics und führe yolo explorer in deinem Terminal aus, um benutzerdefinierte Abfragen und semantische Suchen in deinem Browser durchzuführen.

Hinweis der Community ⚠️

Ab ultralytics>=8.3.12 wurde der Ultralytics Explorer entfernt. Um Explorer zu nutzen, installiere pip install ultralytics==8.3.11. Ähnliche (und erweiterte) Funktionen zur Datensatzexploration findest du in der Ultralytics Platform.

Setup

Installiere ultralytics und die erforderlichen Abhängigkeiten und überprüfe anschließend Software und Hardware.

!uv pip install ultralytics[explorer] openai
yolo checks

Ähnlichkeitssuche

Nutze die Leistung der Vektor-Ähnlichkeitssuche, um ähnliche Datenpunkte in deinem Datensatz zusammen mit ihrer Distanz im Einbettungsraum zu finden. Erstelle einfach eine Einbettungstabelle für das jeweilige Datensatz-Modell-Paar. Dies ist nur einmal erforderlich und wird automatisch wiederverwendet.

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

Sobald die Einbettungstabelle erstellt ist, kannst du die semantische Suche auf eine der folgenden Arten ausführen:

  • Für einen bestimmten Index oder eine Liste von Indizes im Datensatz, z. B. exp.get_similar(idx=[1, 10], limit=10)
  • Für jedes Bild oder jede Liste von Bildern, die nicht im Datensatz enthalten sind - exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10). Bei mehreren Eingaben wird das Aggregat ihrer Einbettungen verwendet.

Du erhältst einen pandas DataFrame mit der begrenzten Anzahl der ähnlichsten Datenpunkte zur Eingabe, zusammen mit ihrer Distanz im Einbettungsraum. Du kannst diesen Datensatz für weitere Filterungen verwenden.

Ultralytics Explorer Ergebnisse der Ähnlichkeitssuche

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

Du kannst die ähnlichen Proben auch direkt mit dem Dienstprogramm plot_similar darstellen

Ähnliche durch Vektorsuche gefundene Bilder

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

Visualisierung der Ähnlichkeitssuche mit Einbettungen

KI fragen: Suchen oder Filtern mit natürlicher Sprache

Du kannst das Explorer-Objekt mit der Art von Datenpunkten abfragen, die du sehen möchtest, und es wird versuchen, einen DataFrame mit diesen Ergebnissen zurückzugeben. Da es auf LLMs basiert, ist das Ergebnis nicht immer korrekt. In diesem Fall gibt es None zurück.

Ultralytics Explorer Ergebnisse der Abfrage mit natürlicher Sprache

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

Um diese Ergebnisse darzustellen, kannst du das Dienstprogramm plot_query_result verwenden. Beispiel:

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

KI-Abfrageergebnis mit übereinstimmenden Bildern

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

SQL-Abfragen für deinen Datensatz ausführen

Manchmal möchtest du bestimmte Einträge in deinem Datensatz untersuchen. Dafür ermöglicht dir der Explorer, SQL-Abfragen auszuführen. Er akzeptiert eines der folgenden Formate:

  • Abfragen, die mit "WHERE" beginnen, wählen automatisch alle Spalten aus. Dies kann als Kurzform-Abfrage betrachtet werden.
  • Du kannst auch vollständige Abfragen schreiben, bei denen du angeben kannst, welche Spalten ausgewählt werden sollen.

Dies kann verwendet werden, um die Modellleistung und spezifische Datenpunkte zu untersuchen. Zum Beispiel:

  • Nehmen wir an, dein Modell hat Schwierigkeiten mit Bildern, auf denen Menschen und Hunde zu sehen sind. Du kannst eine Abfrage wie diese schreiben, um die Punkte auszuwählen, die mindestens 2 Menschen UND mindestens einen Hund enthalten.

Du kannst SQL-Abfragen und semantische Suche kombinieren, um die Ergebnisse nach einem bestimmten Typ zu filtern

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)

Explorer SQL-Abfrageergebnistabelle

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

Genau wie bei der Ähnlichkeitssuche erhältst du auch ein Dienstprogramm, um die SQL-Abfragen direkt mit exp.plot_sql_query darzustellen

Visualisierung der SQL-Abfrage mit übereinstimmenden Bildern

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

Arbeiten mit der Einbettungstabelle (Fortgeschritten)

Explorer arbeitet intern mit LanceDB-Tabellen. Du kannst über das Explorer.table-Objekt direkt auf diese Tabelle zugreifen und Rohabfragen ausführen, Pre- und Post-Filter anwenden usw.

table = exp.table
print(table.schema)

Rohe Abfragen ausführen

Die Vektorsuche findet die nächsten Vektoren aus der Datenbank. In einem Empfehlungssystem oder einer Suchmaschine kannst du ähnliche Produkte zu dem von dir gesuchten finden. Bei LLM und anderen KI-Anwendungen kann jeder Datenpunkt durch die von einigen Modellen generierten Einbettungen dargestellt werden, wodurch die relevantesten Merkmale zurückgegeben werden.

Eine Suche im hochdimensionalen Vektorraum dient dazu, die K-Nächsten-Nachbarn (KNN) des Abfragevektors zu finden.

Metrik In LanceDB ist eine Metrik die Art und Weise, den Abstand zwischen einem Vektorpaar zu beschreiben. Derzeit werden die folgenden Metriken unterstützt:

  • L2
  • Cosinus
  • Punkt Die Ähnlichkeitssuche des Explorers verwendet standardmäßig L2. Du kannst Abfragen direkt auf Tabellen ausführen oder das Lance-Format verwenden, um benutzerdefinierte Dienstprogramme zur Verwaltung von Datensätzen zu erstellen. Weitere Details zu den verfügbaren LanceDB-Tabellenoperationen findest du in der Dokumentation

Explorer Tabelle mit Rohergebnis-SQL-Abfragen

dummy_img_embedding = [i for i in range(256)]
table.search(dummy_img_embedding).limit(5).to_pandas()

Interkonversion zu gängigen Datenformaten

df = table.to_pandas()
pa_table = table.to_arrow()

Arbeiten mit Einbettungen

Du kannst auf die rohe Einbettung aus der lancedb-Tabelle zugreifen und sie analysieren. Die Bildeinbettungen werden in der Spalte vector gespeichert

import numpy as np

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

Streudiagramm

Einer der ersten Schritte bei der Analyse von Einbettungen besteht darin, sie durch Dimensionsreduktion im 2D-Raum darzustellen. Lass uns ein Beispiel versuchen

Explorer Einbettungen Streudiagramm-Visualisierung

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

Ähnlichkeitsindex

Hier ist ein einfaches Beispiel für einen Vorgang, der durch die Einbettungstabelle unterstützt wird. Der Explorer verfügt über eine similarity_index-Operation-

  • Sie versucht abzuschätzen, wie ähnlich jeder Datenpunkt dem Rest des Datensatzes ist.
  • Dies geschieht, indem gezählt wird, wie viele Bildeinbettungen näher als max_dist am aktuellen Bild im generierten Einbettungsraum liegen, wobei jeweils die top_k ähnlichen Bilder berücksichtigt werden.

Für einen gegebenen Datensatz, ein Modell, max_dist & top_k wird der einmal generierte Ähnlichkeitsindex wiederverwendet. Falls sich dein Datensatz geändert hat oder du den Ähnlichkeitsindex einfach neu generieren musst, kannst du force=True übergeben. Ähnlich wie bei der Vektor- und SQL-Suche gibt es auch hier ein Dienstprogramm, um es direkt darzustellen.

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)

Analyse des Datensatz-Ähnlichkeitsindex

Schauen wir uns zuerst das Diagramm an

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

Schauen wir uns nun die Ausgabe des Vorgangs an

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

sim_idx

Lass uns eine Abfrage erstellen, um zu sehen, welche Datenpunkte eine Ähnlichkeitszahl von mehr als 30 haben, und Bilder darstellen, die ihnen ähnlich sind.

import numpy as np

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

Du solltest etwas wie das hier sehen

Ähnlichkeitsindex-Visualisierung für die Datensatzanalyse

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

Kommentare