Ultralytics YOLO27 :

Comment créer un moteur de 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 utilisant OpenAI CLIP et Flask. En combinant les représentations vectorielles visuelles et linguistiques de CLIP avec une recherche rapide par similarité cosinus reposant sur NumPy, tu peux créer une interface web qui récupère les images pertinentes à partir de requêtes en langage naturel, sans étiquettes ni catégories.



Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP and the Ultralytics Package 🎉

Page web Flask présentant une vue d’ensemble des résultats de recherche sémantique

Le package Python Ultralytics encapsule l’ensemble de ce pipeline derrière deux classes, ce qui te permet de lancer une application de recherche fonctionnelle ou d’exécuter des requêtes par programmation en quelques lignes. Ce guide explique pourquoi la recherche sémantique est utile, comment elle fonctionne, comment exécuter l’application web, comment effectuer des recherches par programmation et comment configurer les paramètres.

Pourquoi utiliser la recherche sémantique d’images ?#

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

  • 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 libre, ce qui économise du temps et des ressources.
  • Compréhension proche de celle d’un humain : Contrairement à une recherche par mots-clés, CLIP comprend le contexte sémantique et récupère des images à partir de requêtes abstraites, émotionnelles ou relationnelles comme « un enfant heureux dans la nature » ou « la silhouette d’une ville futuriste la nuit ».
  • Aucune étiquette ni métadonnée : Cette approche nécessite uniquement des images brutes. CLIP génère les représentations vectorielles sans annotation manuelle.
  • Recherche légère et exacte : Une seule multiplication matricielle normalisée dans NumPy classe chaque image selon sa similarité cosinus, fournissant des résultats exacts avec une réponse en temps réel sur des milliers de représentations vectorielles, sans dépendance de recherche supplémentaire à installer ou à gérer.
  • Applications interdomaines : 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 artistique, la même pile s’adapte avec un minimum d’ajustements.

Comment fonctionne 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 un Transformer) pour le langage afin de projeter les deux dans le même espace de représentations vectorielles multimodal. Cela permet de comparer directement le texte et les images à l’aide de la similarité cosinus.
  • NumPy stocke les représentations vectorielles des images dans un tableau unique et les classe par rapport à une représentation vectorielle de requête au moyen d’une seule multiplication matricielle, en renvoyant les vecteurs les plus proches selon la similarité cosinus, sans dépendance d’indexation supplémentaire.
  • Flask fournit une interface web simple permettant de soumettre des requêtes en langage naturel et d’afficher les images correspondant sémantiquement aux éléments de l’index.

Flux de récupération d’images OpenAI CLIP

Comme les images et le texte se retrouvent dans le même espace vectoriel, la récupération est zero-shot : tu n’as besoin ni d’étiquettes ni de catégories, seulement de données d’image et d’un bon prompt.

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 sert 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 d’images. Sinon, les images risquent de ne pas apparaître sur la page web en raison des limitations du service de fichiers de Flask.

from ultralytics import solutions

app = solutions.SearchApp(
    data="images",  # replace with a path to build the search engine with your own images
    device="cpu",  # configure the device for processing, e.g., "cpu" or "cuda"
)

app.run(debug=False)  # You can also use `debug=True` argument for testing

Rechercher des images par programmation#

La classe VisualAISearch effectue toutes les opérations du backend sans la 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é à l’aide de la similarité cosinus.

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

from ultralytics import solutions

searcher = solutions.VisualAISearch(
    data="images",  # replace with a path to build the search engine with your own images
    device="cpu",  # configure the device for processing, e.g., "cpu" or "cuda"
)

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

# Ranked Results:
#     - 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 vers le répertoire d’images à indexer et à rechercher.
devicestr'cpu'Appareil utilisé pour l’inférence CLIP (par exemple cpu, cuda, 0).
Gérer 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 la plateforme Ultralytics 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 seulement, sous forme d’application web Flask ou de backend de recherche 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 workflows de vision par ordinateur.

FAQ#

  • CLIP (préentraînement contrastif langage-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 partagé de représentations vectorielles, afin que tu puisses les comparer directement à l’aide de la similarité vectorielle.

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

  • Une fois que CLIP a transformé tes images en représentations vectorielles, le package Ultralytics les normalise selon la norme L2 et les stocke dans un tableau NumPy unique. Une requête est classée au moyen d’une seule multiplication matricielle qui calcule la similarité cosinus entre la représentation vectorielle de la requête et celle de chaque image, puis trie 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.

  • Bien que CLIP soit développé par OpenAI, le package Python Ultralytics encapsule la génération des représentations vectorielles, l’indexation et la recherche par similarité cosinus dans un pipeline complet de recherche sémantique d’images, accessible en quelques lignes de code qui fonctionnent immédiatement :

    from ultralytics import solutions
    
    searcher = solutions.VisualAISearch(
        data="images",  # replace with a path to build the search engine with your own images
        device="cpu",  # configure the device for processing, e.g., "cpu" or "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 basée sur CLIP.
    • La création et la gestion de l’index de représentations vectorielles.
    • La recherche sémantique efficace avec la similarité cosinus.
    • Le chargement d’images depuis un répertoire et la visualisation.
  • Oui. La configuration actuelle utilise Flask avec un frontend HTML basique, 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 simple consiste à extraire des images individuelles de tes vidéos (par exemple, une image par seconde), à les traiter comme des images autonomes, puis à les transmettre au système. Le moteur de recherche peut ainsi indexer sémantiquement les moments visuels de tes vidéos.

Commentaires