Comment créer une recherche d'images sémantique avec OpenAI CLIP#
Ce guide te guide à travers la construction d'un moteur de recherche d'images sémantique en utilisant OpenAI CLIP et Flask. En combinant les embeddings vision-langage de CLIP avec une recherche rapide par similarité cosinus propulsée par NumPy, tu peux créer une interface web qui récupère des images pertinentes à partir de requêtes en langage naturel, sans besoin d'étiquettes ni de catégories.
Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP and the Ultralytics Package 🎉

Le package Python d'Ultralytics encapsule tout ce pipeline derrière deux classes, te permettant de lancer une application de recherche fonctionnelle ou d'exécuter des requêtes par programmation en quelques lignes. Ce guide couvre pourquoi la recherche sémantique est utile, comment elle fonctionne, l'exécution de l'application web, la recherche par programmation et la configuration des paramètres.
Pourquoi utiliser la recherche d'images sémantique ?#
Construire ton propre système de recherche d'images sémantique avec CLIP offre plusieurs avantages convaincants :
- Capacités zéro-shot : Tu n'as pas besoin d'entraîner sur ton jeu de données. L'apprentissage zéro-shot de CLIP te permet d'interroger n'importe quelle collection d'images avec du langage naturel libre, ce qui économise du temps et des ressources.
- Compréhension humaine : Contrairement à la 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 "un paysage urbain futuriste de nuit".
- Pas d'étiquettes ou de métadonnées : Cette approche ne nécessite que des images brutes. CLIP génère des embeddings sans aucune annotation manuelle.
- Recherche légère et précise : Une seule multiplication matricielle normalisée dans NumPy classe chaque image par cosine similarity, donnant des résultats précis en temps réel sur des milliers d'embeddings, sans dépendance de recherche supplémentaire à installer ou à gérer.
- Applications transdisciplinaires : Que tu construises une archive de photos personnelle, un outil d'inspiration créative, un moteur de recherche de produits ou un système de recommandation artistique, la même pile technologique s'adapte avec un minimum d'ajustements.
Comment fonctionne la recherche d'images sémantique#
Le pipeline combine trois composants, chacun gérant une étape de la conversion des images et du texte en résultats classés :
- CLIP utilise un encodeur de vision (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 d'embedding multimodal. Cela permet une comparaison directe entre le texte et les images en utilisant la similarité cosinus.
- NumPy stocke les embeddings d'images sous forme d'un tableau unique et les classe par rapport à un embedding de requête avec une multiplication matricielle, renvoyant les vecteurs les plus proches par cosine similarity sans aucune dépendance d'indexation supplémentaire.
- Flask fournit une interface web simple pour soumettre des requêtes en langage naturel et afficher les images correspondantes sémantiquement à partir de l'index.

Comme les images et le texte aboutissent dans le même espace vectoriel, la récupération est zero-shot : tu n'as pas besoin d'étiquettes ou de catégories, juste 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 ensemble d'images d'exemple, construit l'index d'embeddings et sert une page où tu peux taper une requête et afficher les résultats classés.
Avertissement sur le chemin des images
Si tu utilises tes propres images, assure-toi de fournir un chemin absolu vers le répertoire d'images. Sinon, les images pourraient ne pas apparaître sur la page web en raison des limitations de Flask en matière de service de fichiers.
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 testingRechercher des images par programmation#
La classe VisualAISearch effectue toutes les opérations de backend sans la couche web :
- Charge ou construit un index d'embeddings à partir d'images locales.
- Extrait les embeddings d'images et de texte en utilisant CLIP.
- Effectue une recherche de similarité en utilisant la similarité cosinus.
Appelle le moteur de recherche avec une requête en langage naturel pour obtenir une liste des 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.2680Configurer les paramètres de VisualAISearch#
Le tableau ci-dessous présente les paramètres disponibles pour VisualAISearch :
| Argument | Type | Défaut | Description |
|---|---|---|---|
data | str | 'images' | Chemin d'accès au répertoire d'images à indexer et dans lequel effectuer des recherches. |
device | str | 'cpu' | Appareil utilisé pour l'inférence CLIP (par exemple cpu, cuda, 0). |
Pour rechercher dans 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 d'Ultralytics, tu peux mettre en place un moteur de recherche d'images sémantique zéro-shot en quelques lignes seulement, que ce soit sous forme d'application web Flask ou de backend de recherche programmatique. À partir de là, pointe data vers ton propre répertoire d'images pour l'indexer, puis explore d'autres Solutions Ultralytics pour construire par-dessus tes flux de travail de vision par ordinateur.
FAQ#
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 du langage naturel lui-même. Cela lui permet de gérer des requêtes flexibles comme "un homme faisant du jet ski" ou "un paysage de rêve surréaliste", le rendant utile pour tout, de la classification à la recherche sémantique créative, sans réentraînement.
Une fois que CLIP transforme tes images en embeddings, le package Ultralytics les normalise L2 et les stocke dans un seul tableau NumPy. Une requête est classée avec une seule multiplication matricielle qui calcule la similarité cosinus entre l'embedding de la requête et chaque embedding d'image, puis trie les scores. Cette recherche par force brute est exacte et rapide pour les collections d'images typiques, sans dépendance supplémentaire de base de données vectorielle à installer ou à gérer.
Bien que CLIP soit développé par OpenAI, le package Python d'Ultralytics regroupe la génération d'embeddings, l'indexation et la recherche par similarité cosinus en un pipeline complet de recherche d'images sémantique derrière quelques lignes de code qui fonctionnent tout simplement :
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 gère :
- La génération d'embeddings d'images et de texte basée sur CLIP.
- Création et gestion de l'index d'embeddings.
- La recherche sémantique efficace avec la similarité cosinus.
- Chargement d'images basé sur un répertoire et visualisation.
Oui. La configuration actuelle utilise Flask avec un frontend HTML basique, mais tu peux le remplacer par ton propre HTML ou construire une interface utilisateur plus dynamique avec React, Vue ou un autre framework frontend. Flask peut servir d'API backend pour ton interface personnalisée.
Pas directement. Une astuce simple consiste à extraire des images individuelles de tes vidéos (par ex., une par seconde), les traiter comme des images autonomes et les intégrer dans le système. De cette façon, le moteur de recherche peut indexer sémantiquement les moments visuels de tes vidéos.
CLIP (Contrastive Language Image Pretraining) 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 mapper à la fois les images et le texte dans un espace d'embedding partagé, te permettant de les comparer directement en utilisant la similarité vectorielle.