Skip to content

Exemple d'exploration des COV

Bienvenue dans le carnet de l'API Ultralytics Explorer ! Ce carnet sert de point de départ à l'exploration des différentes ressources disponibles pour vous aider à commencer à utiliser Ultralytics pour explorer vos ensembles de données en utilisant la puissance de la recherche sémantique. Vous pouvez utiliser des utilitaires prêts à l'emploi qui vous permettent d'examiner des types spécifiques d'étiquettes en utilisant la recherche vectorielle ou même des requêtes SQL.

Essayer yolo explorer alimenté par Explorer API

Simplement pip install ultralytics et exécuter yolo explorer dans votre terminal pour exécuter des requêtes personnalisées et des recherches sémantiques sur vos ensembles de données directement dans votre navigateur !

Note communautaire ⚠️

Depuis le ultralytics>=8.3.10La prise en charge de l'explorateur Ultralytics a été supprimée. Mais ne vous inquiétez pas ! Vous pouvez désormais accéder à des fonctionnalités similaires, voire améliorées, par l'intermédiaire de Ultralytics HUBHUB, notre plateforme intuitive sans code conçue pour rationaliser votre flux de travail. Avec Ultralytics HUB, vous pouvez continuer à explorer, visualiser et gérer vos données sans effort, le tout sans écrire une seule ligne de code. Ne manquez pas de le découvrir et de profiter de ses puissantes fonctionnalités!🚀

Mise en place

Pip installer ultralytics et dépendances et vérifier les logiciels et le matériel.

%pip install ultralytics[explorer] openai
yolo checks

Utilisez la puissance de la recherche de similarité vectorielle pour trouver les points de données similaires dans votre ensemble de données ainsi que leur distance dans l'espace d'intégration. Il suffit de créer une table d'embeddings pour la paire donnée ensemble de données-modèle. Elle n'est nécessaire qu'une seule fois et est réutilisée automatiquement.

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

Une fois que la table des embeddings est construite, vous pouvez lancer une recherche sémantique de l'une des manières suivantes :

  • Sur un indice donné / une liste d'indices dans l'ensemble de données comme - exp.get_similar(idx=[1,10], limit=10)
  • Sur toute image/liste d'images ne figurant pas dans l'ensemble de données - exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10) Dans le cas d'entrées multiples, c'est l'agrégat de leurs embeddings qui est utilisé.

Vous obtenez un cadre de données pandas contenant le nombre limite de points de données les plus similaires à l'entrée, ainsi que leur distance dans l'espace d'intégration. Vous pouvez utiliser cet ensemble de données pour effectuer d'autres filtrages

Tableau de recherche de similarité

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

Vous pouvez également tracer les échantillons similaires directement à l'aide de la fonction plot_similar util

Recherche de similitude image 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

Recherche de similitude image 2

Ask AI : Rechercher ou filtrer en langage naturel

Vous pouvez demander à l'objet Explorer le type de points de données que vous souhaitez voir, et il essaiera de renvoyer un cadre de données contenant ces points. Comme il est alimenté par des LLM, il n'y parvient pas toujours. Dans ce cas, il renverra None.

Ask ai table

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

pour tracer ces résultats, vous pouvez utiliser plot_query_result util Exemple :

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)

Exécuter des requêtes SQL sur votre ensemble de données

Il peut arriver que vous souhaitiez étudier un certain type d'entrées dans votre ensemble de données. Pour cela, Explorer vous permet d'exécuter des requêtes SQL. Il accepte l'un ou l'autre des formats :

  • Les requêtes commençant par "WHERE" sélectionnent automatiquement toutes les colonnes. On peut considérer qu'il s'agit d'une requête abrégée
  • Vous pouvez également écrire des requêtes complètes dans lesquelles vous pouvez spécifier les colonnes à sélectionner

Elle peut être utilisée pour étudier les performances du modèle et des points de données spécifiques. Par exemple, il est possible d'étudier les performances du modèle et des points de données spécifiques :

  • Supposons que votre modèle se batte sur des images comportant des humains et des chiens. Vous pouvez écrire une requête comme celle-ci pour sélectionner les points qui ont au moins 2 humains ET au moins un chien.

Vous pouvez combiner une requête SQL et une recherche sémantique pour filtrer des types de résultats spécifiques.

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)

Tableau des requêtes SQL

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

Tout comme pour la recherche par similarité, vous disposez également d'un utilitaire pour tracer directement les requêtes SQL en utilisant exp.plot_sql_query

Requêtes SQL image 1

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

Travailler avec des tableaux d'intégration (Avancé)

Explorer fonctionne sur LanceDB en interne. Vous pouvez accéder à cette table directement, en utilisant Explorer.table et d'exécuter des requêtes brutes, de mettre en place des pré et post-filtres, etc.

table = exp.table
print(table.schema)

Exécuter des requêtes brutes¶

La recherche de vecteurs permet de trouver les vecteurs les plus proches dans la base de données. Dans un système de recommandation ou un moteur de recherche, vous pouvez trouver des produits similaires à ceux que vous avez recherchés. Dans le LLM et d'autres applications d'IA, chaque point de données peut être présenté par les embeddings générés à partir de certains modèles, ce qui permet d'obtenir les caractéristiques les plus pertinentes.

Une recherche dans un espace vectoriel à haute dimension consiste à trouver les K-voisins les plus proches (KNN) du vecteur de la requête.

Métrique Dans LanceDB, une métrique est la façon de décrire la distance entre une paire de vecteurs. Actuellement, les métriques suivantes sont prises en charge :

  • L2
  • Cosinus
  • La recherche de similarités de Dot Explorer utilise L2 par défaut. Vous pouvez exécuter des requêtes sur les tables directement, ou utiliser le format Lance pour construire des utilitaires personnalisés pour gérer les ensembles de données. Plus de détails sur les opérations disponibles sur les tables LanceDB dans la documentation.

Tableau des requêtes brutes

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

Travailler avec des emboîtements

Vous pouvez accéder à l'intégration brute à partir de la table lancedb et l'analyser. Les intégrations d'images sont stockées dans la colonne vector

import numpy as np

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

Diagramme de dispersion

L'une des étapes préliminaires de l'analyse des embeddings consiste à les représenter dans l'espace 2D via la réduction de la dimensionnalité. Prenons un exemple

Exemple de nuage de points

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

Indice de similitude

Voici un exemple simple d'une opération réalisée à l'aide de la table "embeddings". Explorer est livré avec un similarity_index fonctionnement-

  • Il tente d'estimer le degré de similitude de chaque point de données avec le reste de l'ensemble de données.
  • Pour ce faire, il compte le nombre d'images intégrées qui sont plus proches que max_dist de l'image actuelle dans l'espace d'intégration généré, en considérant les top_k images similaires à la fois.

Pour un ensemble de données donné, le modèle, max_dist & top_k l'index de similarité une fois généré sera réutilisé. Si votre jeu de données a changé, ou si vous avez simplement besoin de régénérer l'index de similarité, vous pouvez passer le paramètre force=True. Comme pour la recherche vectorielle et la recherche SQL, il existe un util pour tracer directement les données. Regardons

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)

Indice de similitude

à l'intrigue d'abord

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

Examinons maintenant le résultat de l'opération

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

sim_idx

Créons une requête pour voir quels sont les points de données dont le nombre de similitudes est supérieur à 30 et traçons les images qui leur sont similaires.

import numpy as np

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

Vous devriez voir quelque chose comme ceci

similarité-index-image

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


📅C réé il y a 3 mois ✏️ Mis à jour il y a 10 jours

Commentaires