Overslaan naar inhoud

Ultralytics Verkenner API

Inleiding

Open in Colab De Explorer API is een Python API voor het verkennen van je datasets. Het ondersteunt het filteren en doorzoeken van je dataset met SQL queries, vector similarity search en semantisch zoeken.



Kijken: Ultralytics Overzicht Explorer API

Installatie

Explorer is voor sommige functies afhankelijk van externe bibliotheken. Deze worden automatisch geïnstalleerd bij gebruik. Gebruik de volgende opdracht om deze afhankelijkheden handmatig te installeren:

pip install ultralytics[explorer]

Gebruik

from ultralytics import Explorer

# Create an Explorer object
explorer = Explorer(data='coco128.yaml', model='yolov8n.pt')

# Create embeddings for your dataset
explorer.create_embeddings_table()

# Search for similar images to a given image/images
dataframe = explorer.get_similar(img='path/to/image.jpg')

# Or search for similar images to a given index/indices
dataframe = explorer.get_similar(idx=0)

Opmerking

De embeddingstabel voor een gegeven dataset en modelpaar wordt slechts eenmaal aangemaakt en hergebruikt. Deze gebruiken LanceDB onder de motorkap, die on-disk schaalt, zodat je embeddings kunt maken en hergebruiken voor grote datasets zoals COCO zonder dat het geheugen vol raakt.

Als je het bijwerken van de embeddingstabel wilt forceren, kun je het volgende doorgeven force=True naar create_embeddings_table methode.

Je hebt direct toegang tot het LanceDB tabelobject om geavanceerde analyses uit te voeren. Leer er meer over in de sectie Werken met Embeddings Tabel

Similarity search is een techniek om afbeeldingen te vinden die lijken op een gegeven afbeelding. Het is gebaseerd op het idee dat soortgelijke afbeeldingen soortgelijke inbeddingen hebben. Zodra de inbeddingstabel is opgebouwd, kun je op een van de volgende manieren semantisch zoeken:

  • Op een gegeven index of lijst van indices in de dataset: exp.get_similar(idx=[1,10], limit=10)
  • Op elke afbeelding of lijst van afbeeldingen die niet in de dataset staat: exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10)

Bij meerdere ingangen wordt het totaal van hun inbeddingen gebruikt.

Je krijgt een pandas dataframe met de limit aantal gegevenspunten dat het meest lijkt op de invoer, samen met hun afstand in de inbeddingsruimte. Je kunt deze dataset gebruiken om verder te filteren

Semantisch zoeken

from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

similar = exp.get_similar(img='https://ultralytics.com/images/bus.jpg', limit=10)
print(similar.head())

# Search using multiple indices
similar = exp.get_similar(
                        img=['https://ultralytics.com/images/bus.jpg',
                             'https://ultralytics.com/images/bus.jpg'],
                        limit=10
                        )
print(similar.head())
from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

similar = exp.get_similar(idx=1, limit=10)
print(similar.head())

# Search using multiple indices
similar = exp.get_similar(idx=[1,10], limit=10)
print(similar.head())

Gelijksoortige afbeeldingen plotten

Je kunt de vergelijkbare afbeeldingen ook plotten met de plot_similar methode. Deze methode neemt dezelfde argumenten als get_similar en plot de gelijksoortige afbeeldingen in een raster.

Gelijksoortige afbeeldingen plotten

from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

plt = exp.plot_similar(img='https://ultralytics.com/images/bus.jpg', limit=10)
plt.show()
from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

plt = exp.plot_similar(idx=1, limit=10)
plt.show()

2. Vraag AI (query's in natuurlijke taal)

Hiermee kun je in natuurlijke taal schrijven hoe je je dataset wilt filteren. Je hoeft niet bedreven te zijn in het schrijven van SQL queries. Onze AI-gestuurde query generator doet dat automatisch onder de motorkap. Je kunt bijvoorbeeld zeggen: "toon me 100 afbeeldingen met precies één persoon en 2 honden. Er kunnen ook andere objecten zijn" en het zal intern de query genereren en je die resultaten laten zien. Opmerking: Dit werkt met LLM's onder de motorkap, dus de resultaten zijn probabilistisch en kunnen soms verkeerd zijn.

Vraag AI

from ultralytics import Explorer
from ultralytics.data.explorer import plot_query_result


# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

df = exp.ask_ai("show me 100 images with exactly one person and 2 dogs. There can be other objects too")
print(df.head())

# plot the results
plt = plot_query_result(df)
plt.show()

3. SQL opvragen

Je kunt SQL-query's uitvoeren op je dataset met de optie sql_query methode. Deze methode neemt een SQL query als invoer en retourneert een pandas dataframe met de resultaten.

SQL-query

from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

df = exp.sql_query("WHERE labels LIKE '%person%' AND labels LIKE '%dog%'")
print(df.head())

Resultaten van SQL-query's plotten

Je kunt de resultaten van een SQL-query ook plotten met de optie plot_sql_query methode. Deze methode neemt dezelfde argumenten als sql_query en zet de resultaten uit in een raster.

Resultaten van SQL-query's plotten

from ultralytics import Explorer

# create an Explorer object
exp = Explorer(data='coco128.yaml', model='yolov8n.pt')
exp.create_embeddings_table()

# plot the SQL Query
exp.plot_sql_query("WHERE labels LIKE '%person%' AND labels LIKE '%dog%' LIMIT 10")

4. Werken met inbeddingstabel

Je kunt ook direct met de embeddingstabel werken. Zodra de embeddingstabel is aangemaakt, kun je deze openen met de Explorer.table

Verkenner werkt op LanceDB tabellen intern. Je kunt deze tabel direct openen met Explorer.table object en voer ruwe queries uit, push pre- en postfilters, enzovoort.

from ultralytics import Explorer

exp = Explorer()
exp.create_embeddings_table()
table = exp.table

Hier zijn enkele voorbeelden van wat je met de tabel kunt doen:

Ruwe inbeddingen krijgen

Voorbeeld

from ultralytics import Explorer

exp = Explorer()
exp.create_embeddings_table()
table = exp.table

embeddings = table.to_pandas()["vector"]
print(embeddings)

Geavanceerde query's met voor- en nafilters

Voorbeeld

from ultralytics import Explorer

exp = Explorer(model="yolov8n.pt")
exp.create_embeddings_table()
table = exp.table

# Dummy embedding
embedding = [i for i in range(256)]
rs = table.search(embedding).metric("cosine").where("").limit(10)

Vectorindex maken

Als je grote datasets gebruikt, kun je ook een speciale vectorindex maken om sneller te kunnen zoeken. Dit wordt gedaan met de create_index methode op LanceDB tabel.

table.create_index(num_partitions=..., num_sub_vectors=...)

Meer details over het type vectorindices dat beschikbaar is en de parameters vind je hier. In de toekomst zullen we ondersteuning toevoegen voor het direct maken van vectorindices vanuit Explorer API.

5. Inbeddingstoepassingen

Je kunt de inbeddingstabel gebruiken om verschillende verkennende analyses uit te voeren. Hier zijn enkele voorbeelden:

Gelijksoortigheidsindex

Explorer wordt geleverd met een similarity_index werking:

  • Het probeert in te schatten hoe vergelijkbaar elk gegevenspunt is met de rest van de dataset.
  • Dat doet het door te tellen hoeveel beeldinbeddingen dichter bij elkaar liggen dan max_dist naar de huidige afbeelding in de gegenereerde inbeddingsruimte, rekening houdend met top_k gelijksoortige afbeeldingen per keer.

Het geeft een pandas dataframe met de volgende kolommen:

  • idx: Index van de afbeelding in de dataset
  • im_file: Pad naar het afbeeldingsbestand
  • count: Aantal afbeeldingen in de dataset die dichterbij zijn dan max_dist naar de huidige afbeelding
  • sim_im_files: Lijst met paden naar de count soortgelijke beelden

Tip

Voor een gegeven dataset, model, max_dist & top_k de similariteitsindex die eenmaal is gegenereerd zal worden hergebruikt. In het geval dat je dataset is veranderd, of je gewoon de similariteitsindex opnieuw moet genereren, kun je het volgende doorgeven force=True.

Gelijksoortigheidsindex

from ultralytics import Explorer

exp = Explorer()
exp.create_embeddings_table()

sim_idx = exp.similarity_index()

Je kunt de similariteitsindex gebruiken om aangepaste voorwaarden op te stellen om de dataset te filteren. Je kunt bijvoorbeeld afbeeldingen filteren die niet lijken op een andere afbeelding in de dataset met de volgende code:

import numpy as np

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

Inbeddingsruimte visualiseren

Je kunt de inbeddingsruimte ook visualiseren met het plotprogramma van je keuze. Hier is bijvoorbeeld een eenvoudig voorbeeld met matplotlib:

import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

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

Begin met het maken van je eigen CV dataset verkenningsrapporten met behulp van de Explorer API. Bekijk voor inspiratie de

Apps gebouwd met Ultralytics Verkenner

Probeer onze GUI Demo gebaseerd op Explorer API

Binnenkort

  • [Specifieke labels van datasets samenvoegen. Voorbeeld - Alles importeren person labels van COCO en car labels van Stadsgezichten
  • [Beelden verwijderen die een hogere gelijkenisindex hebben dan de opgegeven drempel
  • [Nieuwe datasets automatisch behouden na samenvoegen/verwijderen van items
  • [Geavanceerde dataset visualisaties


Aangemaakt 2024-01-07, Bijgewerkt 2024-04-27
Auteurs: glenn-jocher (8), 0xSynapse (1), RizwanMunawar (2), AyushExel (2)

Reacties