Ultralytics YOLO27: Trag dich auf die Warteliste ein.
Get Started

Beispiel zur VOC-Erkundung#

Hinweis der Community ⚠️

Seit ultralytics>=8.3.12 ist Ultralytics Explorer nicht mehr verfügbar. Um Explorer zu verwenden, installiere pip install ultralytics==8.3.11. Ähnliche und erweiterte Funktionen zur Erkundung von Datensätzen findest du auf der Ultralytics Platform.

In diesem Beispiel wird die Explorer API anhand des VOC-Datensatzes vorgestellt: Es wird eine Embedding-Tabelle erstellt, es werden semantische Suchen und SQL-Abfragen ausgeführt und Fragen in natürlicher Sprache gestellt. Dieselben Schritte bilden die Grundlage für die yolo explorer GUI.

Einrichtung#

Installiere die festgelegte Version ultralytics mit den Explorer-Zusatzpaketen und überprüfe anschließend die Software und Hardware.

pip install "ultralytics[explorer]==8.3.11" openai
yolo checks

Verwende die Vektorähnlichkeitssuche, um ähnliche Datenpunkte in deinem Datensatz und ihren Abstand im Einbettungsraum zu finden. Erstelle zunächst eine Einbettungstabelle für das jeweilige Datensatz-Modell-Paar. Sie wird nur einmal erstellt und automatisch wiederverwendet.

from ultralytics import Explorer

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

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

  • Anhand eines bestimmten Index oder einer Liste von Indizes im Datensatz, zum Beispiel exp.get_similar(idx=[1, 10], limit=10)
  • Anhand eines beliebigen Bildes oder einer Liste von Bildern, die nicht im Datensatz enthalten sind, zum Beispiel exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10). Bei mehreren Eingaben wird ein Aggregat ihrer Embeddings verwendet.

Du erhältst einen pandas DataFrame mit den limit ähnlichsten Datenpunkten zur Eingabe sowie deren Abstand im Einbettungsraum. Diesen Datensatz kannst du anschließend weiter filtern.

Ergebnisse der Ähnlichkeitssuche mit Ultralytics Explorer

# Datensatz anhand des Index durchsuchen
similar = exp.get_similar(idx=1, limit=10)
similar.head()

Du kannst ähnliche Beispiele auch direkt mit dem Hilfsprogramm plot_similar darstellen:

Bei der Vektorsuche gefundene ähnliche Bilder

exp.plot_similar(idx=6500, limit=20)
exp.plot_similar(idx=[100, 101], limit=10)  # Du kannst auch eine Liste von Indizes oder Bildern übergeben

exp.plot_similar(img="https://ultralytics.com/images/bus.jpg", limit=10, labels=False)  # Du kannst auch externe Bilder übergeben

Visualisierung der Ähnlichkeitssuche mit Embeddings

Ask AI: Suchen oder Filtern mit natürlicher Sprache#

Du kannst dem Explorer-Objekt beschreiben, welche Datenpunkte du sehen möchtest. Es versucht dann, einen DataFrame mit den passenden Ergebnissen zurückzugeben. Da die Funktion von LLMs unterstützt wird, sind die Ergebnisse nicht immer korrekt. In diesem Fall gibt sie None zurück.

Ergebnisse einer Abfrage in natürlicher Sprache mit Ultralytics Explorer Ask AI

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 Hilfsprogramm plot_query_result verwenden:

Ask-AI-Abfrageergebnis mit passenden 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 kannst du mit Explorer SQL-Abfragen ausführen. Unterstützt werden die folgenden Formate:

  • Bei Abfragen, die mit „WHERE“ beginnen, werden automatisch alle Spalten ausgewählt. Das ist eine verkürzte Schreibweise für eine Abfrage.
  • Du kannst auch vollständige Abfragen schreiben und dabei festlegen, welche Spalten ausgewählt werden sollen.

Damit kannst du die Modellleistung und bestimmte Datenpunkte untersuchen. Zum Beispiel:

  • Wenn dein Modell bei Bildern mit Menschen und Hunden Schwierigkeiten hat, kannst du eine Abfrage wie die folgende formulieren, um die Datenpunkte auszuwählen, die mindestens 2 Menschen UND mindestens einen Hund enthalten.

Du kannst SQL-Abfragen und semantische Suche kombinieren, um die Ergebnisse auf bestimmte Typen einzugrenzen.

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)

Tabelle mit den Ergebnissen einer Explorer-SQL-Abfrage

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

Wie bei der Ähnlichkeitssuche kannst du die Ergebnisse von SQL-Abfragen direkt mit exp.plot_sql_query darstellen:

Visualisierung der zu einer SQL-Abfrage passenden Bilder

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

Mit Embedding-Tabellen arbeiten (Fortgeschritten)#

Explorer verwendet intern LanceDB-Tabellen. Du kannst mit dem Objekt Explorer.table direkt auf diese Tabelle zugreifen und unveränderte Abfragen ausführen, Vor- und Nachfilter nach unten weiterreichen usw.

table = exp.table
print(table.schema)

Unverarbeitete Abfragen ausführen#

Bei der Vektorsuche werden die nächstgelegenen Vektoren in der Datenbank gefunden. In einem Empfehlungssystem oder einer Suchmaschine lassen sich damit Produkte finden, die dem gesuchten Produkt ähneln. In LLM- und anderen KI-Anwendungen kann jeder Datenpunkt durch Einbettungen dargestellt werden, die ein Modell erzeugt. Die Vektorsuche gibt dann die relevantesten Einbettungen zurück.

Eine Suche in einem hochdimensionalen Vektorraum ermittelt die k nächsten Nachbarn (KNN) des Abfragevektors.

In LanceDB beschreibt eine Metrik den Abstand zwischen zwei Vektoren. Derzeit werden folgende Metriken unterstützt:

  • L2
  • Kosinus
  • Skalarprodukt

Die Ähnlichkeitssuche im Explorer verwendet standardmäßig L2. Du kannst Abfragen direkt auf Tabellen ausführen oder das lance-Format verwenden, um eigene Hilfsprogramme zur Verwaltung von Datensätzen zu erstellen. Weitere Informationen zu den verfügbaren Tabellenoperationen in LanceDB findest du in der LanceDB-Dokumentation.

Tabelle mit den Ergebnissen der unformatierten Vektorsuche im Explorer

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

Mit Embeddings arbeiten#

Du kannst direkt auf die Einbettungen in 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#

Ein üblicher erster Schritt bei der Analyse von Einbettungen ist, sie mithilfe einer Dimensionsreduktion in einem zwei- oder dreidimensionalen Raum darzustellen. Das folgende Beispiel verwendet PCA, um sie in den dreidimensionalen Raum zu projizieren:

Streudiagramm zur Visualisierung der Explorer-Embeddings

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA  # pip install scikit-learn

# Dimensionen mit PCA für die 3D-Visualisierung auf 3 Komponenten reduzieren
pca = PCA(n_components=3)
reduced_data = pca.fit_transform(embeddings)

# # Erstelle mit Matplotlibs Axes3D ein dreidimensionales Streudiagramm
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection="3d")

# Streudiagramm
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. Explorer enthält einen Vorgang similarity_index:

  • Sie versucht zu schätzen, wie ähnlich die einzelnen Datenpunkte dem restlichen Datensatz sind.
  • Dazu zählt sie, wie viele Bildeinbettungen im erzeugten Einbettungsraum näher als max_dist am aktuellen Bild liegen. Dabei berücksichtigt sie jeweils top_k ähnliche Bilder.

Für einen bestimmten Datensatz, ein Modell, max_dist und top_k wird der einmal erstellte Ähnlichkeitsindex wiederverwendet. Wenn sich dein Datensatz geändert hat oder du den Ähnlichkeitsindex neu erstellen musst, übergib force=True. Wie bei der Vektor- und SQL-Suche gibt es auch hier ein Hilfsprogramm, mit dem du das Ergebnis direkt darstellen kannst.

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

Sieh dir zuerst die Darstellung an:

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

Untersuche anschließend die Ausgabe des Vorgangs:

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

sim_idx

Frage als Nächstes die Datenpunkte mit mehr als 30 ähnlichen Einträgen ab und stelle Bilder dar, die ihnen ähneln:

import numpy as np

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

Das Ergebnis sollte ungefähr so aussehen:

Visualisierung des Ähnlichkeitsindex zur Datensatzanalyse

exp.plot_similar(idx=[7146, 14035])  # # Durchschnittliche Embeddings von 2 Bildern verwenden

Häufig gestellte Fragen#

  • Explorer wurde in Version 8.3.12 aus dem Paket ultralytics entfernt. Um die Beispiele auf dieser Seite auszuführen, installiere mit pip install "ultralytics[explorer]==8.3.11" die letzte Version, die Explorer enthält. Eine gleichwertige und erweiterte Datensatzexploration ist in Ultralytics Platform integriert.

  • Nachdem du mit create_embeddings_table() einmal eine Embedding-Tabelle erstellt hast, kannst du visuell ähnliche Bilder anhand ihres Index oder eines externen Bildes finden, den Datensatz mit SQL-Klauseln WHERE filtern, Fragen in natürlicher Sprache mit ask_ai() stellen und einen Ähnlichkeitsindex berechnen, um nahezu identische Bilder zu erkennen.

  • Explorer speichert Embeddings dauerhaft in einer LanceDB-Tabelle auf der Festplatte. Daher wird sie für jede Kombination aus Datensatz und Modell einmal erstellt und in späteren Sitzungen wiederverwendet. Über exp.table kannst du direkt darauf zugreifen, um rohe Vektorabfragen und Vor- und Nachfilterungen auszuführen sowie Daten nach pandas oder Arrow zu exportieren.

Kommentare