Exemple d'exploration des COV
中文 | 한국어 | 日本語 | Русский | Deutsch | Français | Español | Português | Türkçe | Tiếng Việt | العربية
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 t'aider à commencer à utiliser Ultralytics pour explorer tes ensembles de données en utilisant la puissance de la recherche sémantique. Tu peux utiliser des utilitaires prêts à l'emploi qui te permettent d'examiner des types spécifiques d'étiquettes en utilisant la recherche vectorielle ou même des requêtes SQL.
Nous espérons que les ressources de ce carnet t'aideront à tirer le meilleur parti de Ultralytics. N'hésite pas à parcourir les Explorer Docs pour plus de détails, à soulever un problème sur GitHub pour obtenir de l'aide, et à rejoindre notre communauté Discord pour poser des questions et discuter !
Essaie yolo explorer
alimenté par Exlorer API
Simplement pip install ultralytics
et exécute yolo explorer
dans ton terminal pour exécuter des requêtes personnalisées et des recherches sémantiques sur tes ensembles de données directement dans ton navigateur !
Mise en place
Pip installer ultralytics
et dépendances et vérifie les logiciels et le matériel.
%pip install ultralytics[explorer] openai
import ultralytics
ultralytics.checks()
de ultralytics l'importation Explorer
Recherche de similitude¶
Utilise la puissance de la recherche de similarité vectorielle pour trouver les points de données similaires dans ton ensemble de données ainsi que leur distance dans l'espace d'intégration. Il suffit de créer une table d'intégration 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 d'intégration est construite, tu peux lancer une recherche sémantique de l'une des façons suivantes :
- Sur un index donné / une liste d'index dans le jeu 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)
En cas d'entrées multiples, c'est l'agrégat de leur intégration qui est utilisé.
Tu obtiens un cadre de données pandas avec l'attribut limit
le nombre de points de données les plus similaires à l'entrée, ainsi que leur distance dans l'espace d'intégration. Tu peux utiliser cet ensemble de données pour effectuer d'autres filtrages
similaires = exp.get_similar(idx=1, limite=10)
similaire.tête()
Tu peux aussi tracer les échantillons similaires directement à l'aide de la fonction 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 any external images
2. Ask AI : Rechercher ou filtrer avec le langage naturel¶
Tu peux demander à l'objet Explorateur le type de points de données que tu veux voir et il essaiera de renvoyer un cadre de données avec ces points. Comme il est alimenté par des LLM, il n'y parvient pas toujours. Dans ce cas, il renverra None.
df = exp.ask_ai("montre-moi des images contenant plus de 10 objets avec au moins 2 personnes")
df.head(5)
Pour tracer ces résultats, tu peux utiliser plot_query_result
util
Exemple :
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)
3. Exécute des requêtes SQL sur ton jeu de données!¶
Il peut arriver que tu veuilles enquêter sur un certain type d'entrées dans ton ensemble de données. Pour cela, Explorer te 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électionneront automatiquement toutes les colonnes. On peut considérer qu'il s'agit d'une requête abrégée
- Tu peux aussi écrire des requêtes complètes dans lesquelles tu peux spécifier les colonnes à sélectionner
Cela peut être utilisé pour étudier les performances du modèle et des points de données spécifiques. Par exemple :
- Disons que ton modèle se bat sur des images où il y a des humains et des chiens. Tu peux écrire une requête comme celle-ci pour sélectionner les points qui ont au moins 2 humains ET au moins un chien.
Tu peux combiner une requête SQL et une recherche sémantique pour filtrer les résultats d'un type spécifique.
table = exp.sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10")
table
Tout comme la recherche par similarité, tu disposes également d'un util pour tracer directement les requêtes SQL à l'aide de exp.plot_sql_query
exp.plot_sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10", étiquettes=Vrai)
table = exp.table
table.schéma
Exécute les requêtes brutes¶
La recherche de vecteurs trouve les vecteurs les plus proches dans la base de données. Dans un système de recommandation ou un moteur de recherche, tu peux trouver des produits similaires à celui que tu as recherché. 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, il renvoie 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
- Point La recherche de similarités de l'explorateur utilise L2 par défaut. Tu peux exécuter des requêtes sur les tables directement, ou utiliser le format lance pour créer des utilitaires personnalisés pour gérer les ensembles de données. Plus de détails sur les opérations de table LanceDB disponibles dans la documentation.
image fictive_embedding = [i pour i dans plage(256)]
table.recherche(dummy_img_embedding).limite(5).to_pandas()
Interconversion vers les formats de données les plus courants¶
df = table.to_pandas()
pa_table = table.to_arrow()
Travailler avec Embeddings¶
Tu peux accéder à l'intégration brute à partir de la table lancedb et l'analyser. Les incrustations d'images sont stockées dans la colonne vector
importer numpy comme np
enchâssements = table.to_pandas()["vecteur"].tolist()
encastrements = np.array(enchâssements)
Diagramme de dispersion¶
L'une des étapes préliminaires de l'analyse des embeddings consiste à les représenter dans l'espace 2D par le biais de la réduction de la dimensionnalité. Prenons un exemple
!pip installe scikit-apprendre --q
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from sklearn.decomposition import PCA
# 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()
4. Indice de similitude
Voici un exemple simple d'une opération alimentée par le tableau des incorporations. 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
à l'image actuelle dans l'espace d'intégration généré, en considérant quetop_k
des 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 ton jeu de données a changé, ou si tu as simplement besoin de régénérer l'indice de similarité, tu peux passer le paramètre force=True
.
Tout comme la recherche vectorielle et la recherche SQL, cette recherche est également accompagnée d'un util permettant de la tracer directement. Examinons d'abord le tracé
exp.plot_similarity_index(max_dist=0.2, top_k=0.01)
Regardons maintenant le résultat de l'opération.
importer numpy comme np
sim_idx = exp.indice_de_similitude(max_dist=0.2, top_k=0.01, force=Faux)
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]
Tu devrais voir quelque chose comme ceci
exp.plot_similar(idx=[7146, 14035]) # Using avg embeddings of 2 images