Zum Inhalt springen

Beispiel einer VOC-Exploration

Willkommen beim Ultralytics Explorer API-Notizbuch! Dieses Notizbuch dient als Ausgangspunkt für die Erkundung der verschiedenen verfügbaren Ressourcen, die Ihnen den Einstieg in die Nutzung von Ultralytics zur Erkundung Ihrer Datensätze mit Hilfe der semantischen Suche erleichtern. Sie können Hilfsmittel verwenden, die es Ihnen ermöglichen, bestimmte Arten von Beschriftungen mithilfe der Vektorsuche oder sogar SQL-Abfragen zu untersuchen.

Versuchen Sie yolo explorer unterstützt durch Explorer API

Einfach pip install ultralytics und laufen yolo explorer in Ihrem Terminal, um benutzerdefinierte Abfragen und semantische Suchen auf Ihren Datensätzen direkt in Ihrem Browser auszuführen!

Gemeinschaftsnote ⚠️

Ab dem ultralytics>=8.3.10Die Unterstützung von Ultralytics explorer wurde abgeschafft. Aber keine Sorge! Sie können jetzt auf ähnliche und sogar erweiterte Funktionen über Ultralytics HUBunserer intuitiven No-Code-Plattform, die Ihren Arbeitsablauf optimiert. Mit Ultralytics HUB können Sie Ihre Daten mühelos erforschen, visualisieren und verwalten, ohne eine einzige Zeile Code zu schreiben. Probieren Sie es aus und nutzen Sie die Vorteile der leistungsstarken Funktionen!🚀

Einrichtung

Pip installieren ultralytics und Abhängigkeiten und überprüfen Software und Hardware.

%pip install ultralytics[explorer] openai
yolo checks

Nutzen Sie die Leistungsfähigkeit der Vektorähnlichkeitssuche, um die ähnlichen Datenpunkte in Ihrem Datensatz zusammen mit ihrem Abstand im Einbettungsraum zu finden. Erstellen Sie einfach eine Einbettungstabelle für das gegebene Datensatz-Modell-Paar. Sie wird nur einmal benötigt und automatisch wiederverwendet.

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

Sobald die Tabelle mit den Einbettungen erstellt ist, können Sie die semantische Suche auf eine der folgenden Arten durchführen:

  • Für einen bestimmten Index / eine Liste von Indizes im Datensatz wie - exp.get_similar(idx=[1,10], limit=10)
  • Bei jedem Bild/jeder 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 die Summe ihrer Einbettungen verwendet.

Sie erhalten einen Pandas-Datensatz mit der Grenzzahl der ähnlichsten Datenpunkte zur Eingabe, zusammen mit ihrem Abstand im Einbettungsraum. Sie können diesen Datensatz verwenden, um weitere Filterungen vorzunehmen

Tabelle zur Ähnlichkeitssuche

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

Sie können die ähnlichen Proben auch direkt mit der Funktion plot_similar verwenden

Ähnlichkeitssuche Bild 1

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

Ähnlichkeitssuche Bild 2

Ask AI: Suchen oder Filtern mit natürlicher Sprache

Sie können dem Explorer-Objekt die Art von Datenpunkten vorgeben, die Sie sehen möchten, und es wird versuchen, einen Datenrahmen mit diesen Punkten zurückzugeben. Da es von LLMs gesteuert wird, gelingt dies nicht immer. In diesem Fall gibt es keinen zurück.

Ask ai table

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

Für die Darstellung dieser Ergebnisse können Sie Folgendes verwenden plot_query_result Beispiel verwenden:

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

Ask ai image 1

# 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 auf Ihrem Dataset ausführen

Manchmal möchten Sie vielleicht eine bestimmte Art von Einträgen in Ihrem Datenbestand untersuchen. Zu diesem Zweck können Sie mit dem Explorer SQL-Abfragen durchführen. Er akzeptiert eines der beiden Formate:

  • Abfragen, die mit "WHERE" beginnen, wählen automatisch alle Spalten aus. Dies kann als eine Kurzabfrage betrachtet werden
  • Sie können auch vollständige Abfragen schreiben, bei denen Sie angeben können, welche Spalten ausgewählt werden sollen

Dies kann zur Untersuchung der Modellleistung und bestimmter Datenpunkte verwendet werden. Zum Beispiel:

  • Nehmen wir an, Ihr Modell kämpft 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 enthalten.

Sie können SQL-Abfrage und semantische Suche kombinieren, um bestimmte Arten von Ergebnissen herauszufiltern

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)

SQL-Abfragetabelle

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

Genau wie bei der Ähnlichkeitssuche können Sie auch die Sql-Abfragen direkt darstellen, indem Sie exp.plot_sql_query

SQL-Abfragen Bild 1

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

Arbeiten mit Einbettungen Tabelle (Fortgeschrittene)

Explorer arbeitet mit LanceDB Tabellen intern. Sie können direkt auf diese Tabelle zugreifen, indem Sie Explorer.table Objekt und führen Sie Rohabfragen aus, schieben Sie Vor- und Nachfilter ein usw.

table = exp.table
print(table.schema)

Rohabfragen durchführen¶

Die Vektorsuche findet die nächstgelegenen Vektoren in der Datenbank. In einem Empfehlungssystem oder einer Suchmaschine können Sie ähnliche Produkte finden, wie die, die Sie gesucht haben. In LLM und anderen KI-Anwendungen kann jeder Datenpunkt durch die aus einigen Modellen generierten Einbettungen dargestellt werden und liefert die relevantesten Merkmale.

Eine Suche im hochdimensionalen Vektorraum besteht darin, K-Nächste-Nachbarn (KNN) des Abfragevektors zu finden.

Metrik In LanceDB ist eine Metrik die Art und Weise, wie der Abstand zwischen einem Paar von Vektoren beschrieben wird. Derzeit werden die folgenden 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 Dienstprogramme zur Verwaltung von Datensätzen zu erstellen. Weitere Details zu den verfügbaren LanceDB-Tabellenoperationen in den Docs

Rohabfrage-Tabelle

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

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

Beispiel eines Streudiagramms

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 durch die Einbettungstabelle unterstützt wird. Der Explorer kommt mit einer similarity_index Betrieb -

  • Es wird versucht abzuschätzen, wie ähnlich jeder Datenpunkt dem Rest des Datensatzes ist.
  • Dazu wird gezählt, wie viele Bildeinbettungen im generierten Einbettungsraum näher als max_dist zum aktuellen Bild liegen, wobei jeweils top_k ähnliche Bilder berücksichtigt werden.

Für einen bestimmten Datensatz, Modell, max_dist & top_k wird der einmal erstellte Ähnlichkeitsindex wiederverwendet. Falls sich Ihr Datensatz geändert hat oder Sie den Ähnlichkeitsindex einfach neu erstellen müssen, können Sie force=True. Ähnlich wie bei der Vektor- und SQL-Suche gibt es auch hier ein Tool, mit dem die Daten direkt dargestellt werden können. Schauen wir mal

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)

Ähnlichkeitsindex

zuerst auf dem Grundstück

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

Schauen 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 Ähnlichkeitszahl von mehr als 30 haben, und zeichnen wir Bilder, die ihnen ähnlich sind.

import numpy as np

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

Sie sollten etwa Folgendes sehen

ähnlichkeitsindex-bild

exp.plot_similar(idx=[7146, 14035])  # Using avg embeddings of 2 images
📅 Erstellt vor 2 Monaten ✏️ Aktualisiert vor 2 Monaten

Kommentare