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

# 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

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
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.

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

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

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

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

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