Ultralytics YOLO27:

VOC-Erkundungsbeispiel#

Hinweis für die Community ⚠️

Ab ultralytics>=8.3.12 wurde Ultralytics Explorer entfernt. Um Explorer zu verwenden, installiere pip install ultralytics==8.3.11. Ähnliche (und erweiterte) Funktionen zur Datensatzerkundung sind in der Ultralytics Platform verfügbar.

Dieses Beispiel führt durch die Explorer API für den VOC-Datensatz: Erstellen einer Einbettungstabelle, Durchführen von Semantik- und SQL-Suchen sowie das Stellen von Fragen in natürlicher Sprache. Dieselben Schritte treiben die yolo explorer GUI an.

Einrichtung#

Installiere die fixierte ultralytics-Release mit den Explorer-Extras und überprüfe dann Software und Hardware.

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

Ähnlichkeitssuche#

Nutze die Leistungsfähigkeit der Vektorähnlichkeitssuche, um ähnliche Datenpunkte in deinem Datensatz zusammen mit ihrer Entfernung im Einbettungsraum zu finden. Erstelle einfach eine Embedding-Tabelle für das angegebene Datensatz-Modell-Paar. Dies ist nur einmal erforderlich und wird anschließend automatisch wiederverwendet.

from ultralytics import Explorer

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

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

  • Für einen bestimmten Index bzw. eine bestimmte Indexliste im Datensatz, z. B. exp.get_similar(idx=[1, 10], limit=10)
  • Für ein einzelnes Bild oder eine Liste von Bildern, die nicht im Datensatz enthalten sind, z. B. 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 angegebenen Anzahl der ähnlichsten Datenpunkte zur Eingabe sowie ihrer Entfernung im Einbettungsraum. Diesen Datensatz kannst du für weitere Filterungen verwenden.

Ergebnisse der Ultralytics Explorer-Ähnlichkeitssuche

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

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

Durch Vektorsuche gefundene ähnliche 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 Embeddings

KI fragen: Mit natürlicher Sprache suchen oder filtern#

Du kannst das Explorer-Objekt mit der Art von Datenpunkten auffordern, die du sehen möchtest. Es versucht dann, einen DataFrame mit diesen Ergebnissen zurückzugeben. Da es auf LLMs basiert, sind die Ergebnisse nicht immer korrekt. In diesem Fall wird None zurückgegeben.

Ergebnisse natürlicher Suchanfragen an die KI in Ultralytics Explorer

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

Zum Darstellen dieser Ergebnisse 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)

Ergebnis einer KI-Suchanfrage 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 kannst du mit Explorer SQL-Abfragen ausführen. Es werden die folgenden Formate akzeptiert:

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

Dies kann zur Untersuchung der Modellleistung und bestimmter Datenpunkte verwendet werden. 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 auf einen bestimmten Typ 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 der Explorer-SQL-Abfrage

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

Wie bei der Ähnlichkeitssuche steht dir auch ein Dienstprogramm zur Verfügung, mit dem du die SQL-Abfragen direkt mithilfe von exp.plot_sql_query darstellen kannst.

Visualisierung der von der SQL-Abfrage gefundenen Bilder

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

Arbeiten mit Embedding-Tabellen (fortgeschritten)#

Explorer verwendet intern LanceDB-Tabellen. Du kannst direkt auf diese Tabelle zugreifen, das Objekt Explorer.table verwenden, Rohabfragen ausführen, Vor- und Nachfilter an die Datenbank weiterreichen usw.

table = exp.table
print(table.schema)

Rohe Abfragen ausführen#

Die Vektorsuche findet die nächstgelegenen Vektoren in der Datenbank. In einem Empfehlungssystem oder einer Suchmaschine kannst du ähnliche Produkte wie das gesuchte finden. In LLM- und anderen KI-Anwendungen kann jeder Datenpunkt durch die von bestimmten Modellen erzeugten Embeddings dargestellt werden; zurückgegeben werden die relevantesten Merkmale.

Bei einer Suche in einem hochdimensionalen Vektorraum werden die K nächsten Nachbarn (KNN) des Abfragevektors gesucht.

Metrik In LanceDB beschreibt eine Metrik die Entfernung zwischen zwei Vektoren. Derzeit werden die folgenden Metriken unterstützt:

  • L2
  • Kosinus
  • Punkt

Die Ähnlichkeitssuche von Explorer 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 verfügbaren LanceDB-Tabellenoperationen findest du in der LanceDB-Dokumentation.

Tabelle mit den Ergebnissen der unformatierten Explorer-SQL-Abfragen

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

Konvertierung zwischen gängigen Datenformaten#

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

Mit Embeddings arbeiten#

Du kannst auf das unformatierte Embedding aus der lancedb-Tabelle zugreifen und es analysieren. Die Bild-Embeddings werden in der Spalte vector gespeichert.

import numpy as np

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

Punktdiagramm#

Ein vorbereitender Schritt bei der Analyse von Embeddings besteht darin, sie mithilfe einer Dimensionsreduktion im zweidimensionalen Raum darzustellen. Sehen wir uns ein Beispiel an.

Visualisierung des Embedding-Punktdiagramms von 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()

Ähnlichkeitsindex#

Hier ist ein einfaches Beispiel für eine durch die Embedding-Tabelle unterstützte Operation. Explorer enthält die Operation similarity_index.

  • Sie versucht zu schätzen, wie ähnlich jeder Datenpunkt dem restlichen Datensatz ist.
  • Dazu wird gezählt, wie viele Bild-Embeddings im erzeugten Einbettungsraum näher als max_dist am aktuellen Bild liegen, wobei jeweils die top_k ähnlichsten Bilder berücksichtigt werden.

Für einen bestimmten Datensatz und ein bestimmtes Modell werden max_dist und top_k verwendet; der einmal erstellte Ähnlichkeitsindex wird wiederverwendet. Wenn sich dein Datensatz geändert hat oder du den Ähnlichkeitsindex einfach neu erstellen musst, kannst du force=True übergeben. Wie bei der Vektor- und SQL-Suche steht dir auch hierfür ein Dienstprogramm zur direkten Darstellung zur Verfügung.

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 Ähnlichkeitsindex des Datensatzes

Sehen wir uns zuerst das Diagramm an.

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

Sehen wir uns nun die Ausgabe der Operation an.

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

sim_idx

Erstellen wir eine Abfrage, um zu sehen, welche Datenpunkte eine Ähnlichkeitsanzahl von mehr als 30 haben, und stellen wir Bilder dar, die diesen ähnlich sind.

import numpy as np

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

Du solltest etwas in dieser Art sehen.

Visualisierung des Ähnlichkeitsindex zur Datensatzanalyse

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

FAQ#

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

  • Nachdem du eine Einbettungstabelle einmal mit create_embeddings_table() erstellt hast, kannst du visuell ähnliche Bilder nach Index oder externem Bild finden, den Datensatz mit SQL-WHERE-Klauseln filtern, Fragen in natürlicher Sprache mit ask_ai() stellen und einen Ähnlichkeitsindex berechnen, um nahezu doppelte Bilder zu erkennen.

  • Explorer speichert Einbettungen dauerhaft in einer LanceDB-Tabelle auf der Festplatte, sodass die Einbettungstabelle einmal pro Datensatz- und Modellpaar erstellt und Sitzungsübergreifend wiederverwendet wird. Greife direkt über exp.table darauf zu, um rohe Vektorabfragen, Vor- und Nachfilter sowie den Export nach pandas oder Arrow durchzuführen.

Kommentare