Beispiel einer VOC
Willkommen beim Ultralytics API-Notebook. Dieses Notebook stellt die Ressourcen vor, die für die Untersuchung von Datensätzen mit semantischer Suche, Vektorsuche und SQL-Abfragen zur Verfügung stehen.
Versuchen yolo explorer (unterstützt durch die Explorer-API)
Installieren ultralytics und ausführen yolo explorer in Ihrem Terminal, um benutzerdefinierte Abfragen und semantische Suchen in Ihrem Browser auszuführen.
Community-Hinweis ⚠️
Seit ultralytics>=8.3.10Die Unterstützung für Ultralytics wird eingestellt. Ähnliche (und erweiterte) Funktionen zur Datensatzuntersuchung sind verfügbar in Ultralytics HUB.
Einrichtung
Installieren ultralytics und die erforderlichen Abhängigkeiten, dann überprüfen Sie die Software und Hardware.
!uv pip install ultralytics[explorer] openai
yolo checks
Ähnlichkeitssuche
Nutzen Sie die Leistungsfähigkeit der Vektorähnlichkeitssuche, um die ähnlichen Datenpunkte in Ihrem Datensatz zusammen mit ihrer Distanz im Embedding-Raum zu finden. Erstellen Sie einfach eine Embedding-Tabelle für das jeweilige Datensatz-Modell-Paar. Dies ist nur einmal erforderlich und wird automatisch wiederverwendet.
exp = Explorer("VOC.yaml", model="yolo11n.pt")
exp.create_embeddings_table()
Sobald die Einbettungstabelle erstellt ist, können Sie die semantische Suche auf eine der folgenden Arten durchführen:
- Für einen bestimmten Index/eine bestimmte Liste von Indizes im Datensatz, z. B.
exp.get_similar(idx=[1, 10], limit=10) - Auf einem beliebigen Bild/ einer Liste von Bildern, die nicht im Datensatz enthalten sind - exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10) Im Falle von mehreren Eingaben wird die Summe ihrer Einbettungen verwendet.
Sie erhalten einen Pandas-DataFrame mit der begrenzten Anzahl der Datenpunkte, die der Eingabe am ähnlichsten sind, zusammen mit ihrem Abstand im Einbettungsraum. Sie können diesen Datensatz für weitere Filterungen verwenden.

# Search dataset by index
similar = exp.get_similar(idx=1, limit=10)
similar.head()
Sie können die ähnlichen Stichproben auch direkt mit dem folgenden Befehl plotten: plot_similar util

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

Fragen Sie die KI: Suchen oder filtern Sie mit natürlicher Sprache
Sie können das Explorer-Objekt mit den Datenpunkten, die Sie sehen möchten, auffordern, und es wird versuchen, einen DataFrame mit diesen Ergebnissen zurückzugeben. Da es von LLMs unterstützt wird, ist es nicht immer korrekt. In diesem Fall gibt es Folgendes zurück: None.

df = exp.ask_ai("show me images containing more than 10 objects with at least 2 persons")
df.head(5)
Um diese Ergebnisse grafisch darzustellen, können Sie die plot_query_result Dienstprogramm. 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)
Führen Sie SQL-Abfragen für Ihren Datensatz aus
Manchmal möchten Sie vielleicht bestimmte Einträge in Ihrem Datensatz untersuchen. Zu diesem Zweck können Sie 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.
- Sie können auch vollständige Abfragen schreiben, in denen Sie angeben können, welche Spalten ausgewählt werden sollen.
Dies kann verwendet werden, um die Modellleistung und bestimmte Datenpunkte zu untersuchen. Zum Beispiel:
- Nehmen wir an, Ihr Modell hat Probleme mit Bildern, auf denen Menschen und Hunde zu sehen sind. Sie können eine Abfrage wie diese schreiben, um die Punkte auszuwählen, die mindestens 2 Menschen UND mindestens einen Hund haben.
Sie können SQL-Abfragen und semantische Suche kombinieren, um die Ergebnisse auf einen 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)
Ähnlich wie bei der Ähnlichkeitssuche erhalten Sie auch ein Hilfsprogramm, um die SQL-Abfragen direkt zu plotten, indem Sie exp.plot_sql_query

exp.plot_sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10", labels=True)
Arbeiten mit Embedding-Tabellen (Erweitert)
Explorer funktioniert mit LanceDB Tabellen intern. Sie können direkt auf diese Tabelle zugreifen, indem Sie Explorer.table Objekte abfragen und Rohabfragen ausführen, Pre- und Post-Filter nach unten verschieben usw.
table = exp.table
print(table.schema)
Rohe Abfragen ausführen¶
Die Vektorsuche findet die ähnlichsten Vektoren aus der Datenbank. In einem Empfehlungssystem oder einer Suchmaschine können Sie ähnliche Produkte zu dem finden, das Sie gesucht haben. In LLM- und anderen KI-Anwendungen können die einzelnen Datenpunkte durch die von einigen Modellen generierten Einbettungen dargestellt werden, wobei die relevantesten Merkmale zurückgegeben werden.
Eine Suche im hochdimensionalen Vektorraum dient dazu, die K-Nearest-Neighbors (KNN) des Abfragevektors zu finden.
Metrik In LanceDB beschreibt eine Metrik die Distanz zwischen zwei Vektoren. Aktuell werden folgende Metriken unterstützt:
- L2
- Kosinus
- Die Ähnlichkeitssuche von Dot Explorer verwendet standardmäßig L2. Sie können Abfragen direkt auf Tabellen ausführen oder das Lance-Format verwenden, um benutzerdefinierte Hilfsprogramme zur Verwaltung von Datensätzen zu erstellen. Weitere Informationen zu den verfügbaren LanceDB-Tabellenoperationen finden Sie in den Dokumenten.

dummy_img_embedding = [i for i in range(256)]
table.search(dummy_img_embedding).limit(5).to_pandas()
Konvertierung in gängige Datenformate
df = table.to_pandas()
pa_table = table.to_arrow()
Arbeiten mit Einbettungen
Sie können auf die Rohdaten der Einbettung in der Lancedb-Tabelle zugreifen und sie analysieren. Die Bildeinbettungen werden in der Spalte vector
import numpy as np
embeddings = table.to_pandas()["vector"].tolist()
embeddings = np.array(embeddings)
Streudiagramm
Einer der ersten Schritte bei der Analyse von Einbettungen ist die Darstellung im 2D-Raum mittels Dimensionalitätsreduktion. Versuchen wir ein Beispiel

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 Operation, die von der Einbettungstabelle unterstützt wird. Explorer wird mitgeliefert mit einem similarity_index Operation-
- Es versucht abzuschätzen, wie ähnlich jeder Datenpunkt dem Rest des Datensatzes ist.
- Es tut dies, indem es zählt, wie viele Image-Embeddings näher als max_dist zum aktuellen Bild im generierten Embedding-Raum liegen, wobei jeweils top_k ähnliche Bilder berücksichtigt werden.
Für einen bestimmten Datensatz, ein Modell, max_dist & top_k Der einmal generierte Ähnlichkeitsindex wird wiederverwendet. Falls sich Ihr Datensatz geändert hat oder Sie den Ähnlichkeitsindex einfach neu generieren müssen, können Sie Folgendes übergeben force=True. Ähnlich wie bei der Vektor- und SQL-Suche gibt es auch hier ein Hilfsprogramm, um es direkt zu plotten. Lass uns schauen
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)

zuerst im Diagramm
exp.plot_similarity_index(max_dist=0.2, top_k=0.01)
Betrachten wir nun die Ausgabe der Operation.
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 ähnliche Bilder dar.
import numpy as np
sim_count = np.array(sim_idx["count"])
sim_idx["im_file"][sim_count > 30]
Sie sollten so etwas sehen

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