Ultralytics YOLO27 :
Get Started

Comment créer une recherche sémantique d’images avec OpenAI CLIP#

Ce guide t’accompagne dans la création d’un moteur de recherche sémantique d’images avec OpenAI CLIP et Flask. En associant les représentations vectorielles visuelles et linguistiques de CLIP à une recherche rapide par similarité cosinus optimisée par NumPy, tu peux créer une interface Web qui retrouve des images pertinentes à partir de requêtes en langage naturel, sans étiquettes ni catégories.



Regarder : Fonctionnement de la recherche par similarité | Recherche visuelle avec OpenAI CLIP et le package Ultralytics 🎉

Page Web Flask présentant un aperçu des résultats de recherche sémantique

Le package Python Ultralytics regroupe tout ce pipeline derrière deux classes : tu peux ainsi lancer une application de recherche fonctionnelle ou exécuter des requêtes par programmation en quelques lignes. Ce guide explique l’intérêt de la recherche sémantique, son fonctionnement, l’exécution de l’application Web, la recherche par programmation et la configuration des paramètres.

Créer ton propre système de recherche sémantique d’images avec CLIP présente plusieurs avantages majeurs :

  • Capacités zero-shot : tu n’as pas besoin d’entraîner le modèle sur ton jeu de données. L’apprentissage zero-shot de CLIP te permet d’interroger n’importe quelle collection d’images en langage naturel et libre, ce qui te fait gagner du temps et économiser des ressources.
  • Compréhension proche de celle d’un humain : contrairement à la recherche par mots-clés, CLIP comprend le contexte sémantique et retrouve des images à partir de requêtes abstraites, émotionnelles ou relationnelles, comme « un enfant heureux dans la nature » ou « une silhouette de ville futuriste la nuit ».
  • Aucune étiquette ni métadonnée : cette approche ne nécessite que des images brutes. CLIP génère des représentations vectorielles sans annotation manuelle.
  • Recherche exacte et légère : une seule multiplication de matrices normalisées dans NumPy classe chaque image selon sa similarité cosinus. Tu obtiens ainsi des résultats exacts en temps réel sur des milliers de représentations vectorielles, sans dépendance de recherche supplémentaire à installer ou à gérer.
  • Applications dans différents domaines : que tu crées une archive photo personnelle, un outil d’inspiration créative, un moteur de recherche de produits ou un système de recommandation d’œuvres d’art, la même pile technologique s’adapte avec très peu de modifications.

Fonctionnement de la recherche sémantique d’images#

Le pipeline combine trois composants, chacun prenant en charge une étape de la transformation des images et du texte en résultats classés :

  • CLIP utilise un encodeur visuel (par exemple, ResNet ou ViT) pour les images et un encodeur de texte (basé sur Transformer) pour le langage afin de projeter les deux dans le même espace de représentations vectorielles multimodales. Cela permet de comparer directement le texte et les images par similarité cosinus.
  • NumPy stocke les représentations vectorielles des images dans un tableau unique et les compare à une représentation vectorielle de requête au moyen d’une multiplication de matrices. Il renvoie les vecteurs les plus proches selon leur similarité cosinus, sans dépendance d’indexation supplémentaire.
  • Flask fournit une interface Web simple permettant de saisir des requêtes en langage naturel et d’afficher les images de l’index correspondantes sur le plan sémantique.

Flux de travail de récupération d’images avec OpenAI Clip

Comme les images et le texte se retrouvent dans le même espace vectoriel, la recherche est zero-shot : tu n’as besoin ni d’étiquettes ni de catégories, seulement des images et d’une bonne invite.

Exécuter l’application Web de recherche sémantique#

La classe SearchApp lance l’interface Flask complète. Lors de la première exécution, elle télécharge un jeu d’images d’exemple, crée l’index des représentations vectorielles et affiche une page où tu peux saisir une requête et consulter les résultats classés.

Avertissement concernant le chemin des images

Si tu utilises tes propres images, veille à fournir un chemin absolu vers le répertoire des images. Sinon, les images risquent de ne pas s’afficher sur la page Web en raison des limitations de Flask pour la diffusion de fichiers.

from ultralytics import solutions

app = solutions.SearchApp(
    data="images",  # remplace par un chemin pour créer le moteur de recherche avec tes propres images
    device="cpu",  # configure l’appareil utilisé pour le traitement, par exemple « cpu » ou « cuda »
)

app.run(debug=False)  # Tu peux également utiliser l’argument `debug=True` pour les tests

Rechercher des images par programmation#

La classe VisualAISearch effectue toutes les opérations côté serveur sans couche Web :

  • Charge ou crée un index de représentations vectorielles à partir d’images locales.
  • Extrait les représentations vectorielles des images et du texte à l’aide de CLIP.
  • Effectue une recherche par similarité cosinus.

Appelle le moteur de recherche avec une requête en langage naturel pour obtenir une liste de noms de fichiers d’images correspondantes, classés par similarité :

from ultralytics import solutions

searcher = solutions.VisualAISearch(
    data="images",  # remplace par un chemin pour créer le moteur de recherche avec tes propres images
    device="cpu",  # configure l’appareil utilisé pour le traitement, par exemple « cpu » ou « cuda »
)

results = searcher("a dog sitting on a bench")

# Résultats classés :
# - 000000546829.jpg | Similarity: 0.3269
# - 000000549220.jpg | Similarity: 0.2899
# - 000000517069.jpg | Similarity: 0.2761
# - 000000029393.jpg | Similarity: 0.2742
# - 000000534270.jpg | Similarity: 0.2680

Configurer les paramètres de VisualAISearch#

Le tableau ci-dessous présente les paramètres disponibles pour VisualAISearch :

ArgumentTypeValeur par défautDescription
datastr'images'Chemin d’accès au répertoire d’images à indexer et à parcourir.
devicestr'cpu'Appareil utilisé pour l’inférence CLIP (par exemple, cpu, cuda, 0).
Gère tes données dans le cloud

Pour rechercher des collections d’images à l’échelle de la production sans gérer de fichiers locaux, tu peux organiser et versionner tes images sur l’Ultralytics Platform avant de les indexer avec CLIP.

Conclusion#

Avec CLIP et le package Python Ultralytics, tu peux mettre en place un moteur de recherche sémantique d’images zero-shot en quelques lignes, sous la forme d’une application Web Flask ou d’un backend de recherche accessible par programmation. À partir de là, indique ton propre répertoire d’images à data pour l’indexer, puis découvre d’autres solutions Ultralytics pour enrichir tes flux de travail en vision par ordinateur.

FAQ#

  • CLIP (préentraînement contrastif du langage et de l’image) est un modèle développé par OpenAI qui apprend à relier les informations visuelles et linguistiques. Il est entraîné sur un vaste jeu de données d’images associées à des légendes en langage naturel. Cet entraînement lui permet de représenter les images et le texte dans un espace vectoriel commun, afin que tu puisses les comparer directement à l’aide de la similarité vectorielle.

  • CLIP se distingue par sa capacité à généraliser. Au lieu d’être entraîné uniquement pour des étiquettes ou des tâches spécifiques, il apprend à partir du langage naturel lui-même. Il peut ainsi traiter des requêtes flexibles comme « un homme sur un jet-ski » ou « un paysage onirique surréaliste », ce qui le rend utile pour toutes sortes de tâches, de la classification à la recherche sémantique créative, sans réentraînement.

  • Une fois que CLIP a converti tes images en représentations vectorielles, le package Ultralytics les normalise selon la norme L2 et les stocke dans un tableau NumPy unique. Une multiplication de matrices classe les résultats en calculant la similarité cosinus entre la représentation vectorielle de la requête et celle de chaque image, puis en triant les scores. Cette recherche par force brute est exacte et rapide pour les collections d’images courantes, sans dépendance supplémentaire à une base de données vectorielle à installer ou à gérer.

  • Même si CLIP est développé par OpenAI, le package Python Ultralytics regroupe la génération des représentations vectorielles, l’indexation et la recherche par similarité cosinus en un pipeline complet de recherche sémantique d’images, qui fonctionne avec seulement quelques lignes de code :

    from ultralytics import solutions
    
    searcher = solutions.VisualAISearch(
        data="images",  # remplace par un chemin pour créer le moteur de recherche avec tes propres images
        device="cpu",  # configure l’appareil utilisé pour le traitement, par exemple « cpu » ou « cuda »
    )
    
    results = searcher("a dog sitting on a bench")

    Cette implémentation de haut niveau prend en charge :

    • La génération de représentations vectorielles d’images et de texte avec CLIP.
    • La création et la gestion de l’index des représentations vectorielles.
    • La recherche sémantique efficace par similarité cosinus.
    • Le chargement d’images à partir d’un répertoire et leur visualisation.
  • Oui. La configuration actuelle utilise Flask avec un frontend HTML simple, mais tu peux le remplacer par ton propre HTML ou créer une interface plus dynamique avec React, Vue ou un autre framework frontend. Flask peut servir d’API backend pour ton interface personnalisée.

  • Pas directement. Une solution de contournement simple consiste à extraire des images individuelles de tes vidéos (par exemple, une par seconde), à les traiter comme des images autonomes et à les fournir au système. Le moteur de recherche peut ainsi indexer sur le plan sémantique les scènes visuelles de tes vidéos.

Commentaires