Recherche d'images sémantiques avec OpenAI CLIP et Meta FAISS
Introduction
Ce guide t'accompagne dans la création d'un moteur de recherche d'images sémantiques utilisant OpenAI CLIP, Meta FAISS, et la Flask. En combinant les puissants plongements visuels et linguistiques de CLIP avec la recherche efficace de plus proches voisins de FAISS, tu peux créer une interface web entièrement fonctionnelle te permettant de récupérer des images pertinentes à l'aide de requêtes en langage naturel.
Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP, META FAISS and Ultralytics Package 🎉
Aperçu visuel de la recherche d'images sémantiques

Comment ça fonctionne
- CLIP utilise un encodeur de vision (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 plongement multimodal. Cela permet une comparaison directe entre le texte et les images en utilisant la similarité cosinus.
- FAISS (Facebook AI Similarity Search) construit un index des plongements d'images et permet une récupération rapide et évolutive des vecteurs les plus proches pour une requête donnée.
- Flask fournit une interface web simple pour soumettre des requêtes en langage naturel et afficher les images correspondantes sémantiquement depuis l'index.
Cette architecture prend en charge la recherche zero-shot, ce qui signifie que tu n'as pas besoin d'étiquettes ou de catégories, juste de données d'images et d'une bonne instruction.
Avertissement sur le chemin d'accès aux images
Si tu utilises tes propres images, assure-toi de fournir un chemin absolu vers le répertoire des images. Sinon, les images pourraient ne pas s'afficher 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 = "path/to/img/directory" # Optional, build 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 testingVisualAISearch classe
Cette classe effectue toutes les opérations backend :
- Charge ou construit un index FAISS à 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.
Avertissement sur le chemin d'accès aux images
Si tu utilises tes propres images, assure-toi de fournir un chemin absolu vers le répertoire des images. Sinon, les images pourraient ne pas s'afficher sur la page web en raison des limitations de Flask en matière de service de fichiers.
from ultralytics import solutions
searcher = solutions.VisualAISearch(
# data = "path/to/img/directory" # Optional, build search engine with your own images
device="cuda" # 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.2680VisualAISearch Paramètres
Le tableau ci-dessous présente les paramètres disponibles pour VisualAISearch:
| Argument | Type | Par défaut | Description |
|---|---|---|---|
data | str | 'images' | Chemin vers le répertoire d'images utilisé pour la recherche de similarité. |
| Argument | Type | Par défaut | Description |
|---|---|---|---|
device | str | None | Spécifie l'appareil pour l'inférence (par ex. cpu, cuda:0 ou 0). Permet aux utilisateurs de choisir entre CPU, un GPU spécifique ou d'autres périphériques de calcul pour l'exécution du modèle. |
Avantages de la recherche d'images sémantiques avec CLIP et FAISS
Construire ton propre système de recherche d'images sémantiques avec CLIP et FAISS présente plusieurs avantages convaincants :
-
Capacités Zero-Shot : Tu n'as pas besoin d'entraîner le modèle sur ton jeu de données spécifique. L'apprentissage zero-shot de CLIP te permet d'effectuer des requêtes de recherche sur n'importe quel ensemble d'images en utilisant un langage naturel libre, ce qui permet d'économiser du temps et des ressources.
-
Compréhension humaine : Contrairement aux moteurs de recherche basés sur des mots-clés, CLIP comprend le contexte sémantique. Il peut récupérer des images basées sur des requêtes abstraites, émotionnelles ou relationnelles comme "un enfant heureux dans la nature" ou "un paysage urbain futuriste la nuit".

-
Pas besoin d'étiquettes ou de métadonnées : Les systèmes de recherche d'images traditionnels nécessitent des données soigneusement étiquetées. Cette approche ne nécessite que des images brutes. CLIP génère des plongements sans avoir besoin d'annotation manuelle.
-
Recherche flexible et évolutive : FAISS permet une recherche rapide des plus proches voisins, même avec des jeux de données à grande échelle. Il est optimisé pour la vitesse et la mémoire, permettant une réponse en temps réel même avec des milliers (ou des millions) de plongements.

-
Applications inter-domaines : Que tu construises une archive de photos personnelles, un outil d'inspiration créative, un moteur de recherche de produits ou même un système de recommandation d'art, cette pile s'adapte à divers domaines avec un minimum de réglages.
FAQ
Comment CLIP comprend-il à la fois les images et le texte ?
CLIP (Contrastive Language Image Pretraining) est un modèle développé par OpenAI qui apprend à connecter les informations visuelles et linguistiques. Il est entraîné sur un ensemble de données massif 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 de plongement partagé, afin que tu puisses les comparer directement en utilisant la similarité vectorielle.
Pourquoi CLIP est-il considéré comme si puissant pour les tâches d'IA ?
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 à partir 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 onirique surréaliste », le rendant utile pour tout, de la classification à la recherche sémantique créative, sans réentraînement.
Que fait exactement FAISS dans ce projet (Recherche sémantique) ?
FAISS (Facebook AI Similarity Search) est une boîte à outils qui t'aide à effectuer des recherches parmi des vecteurs de haute dimension très efficacement. Une fois que CLIP transforme tes images en plongements, FAISS rend la recherche des correspondances les plus proches d'une requête textuelle rapide et facile, parfaite pour la récupération d'images en temps réel.
Pourquoi utiliser le Ultralytics Python package si CLIP et FAISS proviennent d'OpenAI et de Meta ?
Bien que CLIP et FAISS soient développés respectivement par OpenAI et Meta, le Ultralytics Python package simplifie leur intégration dans un pipeline complet de recherche d'images sémantiques en un flux de travail de 2 lignes qui fonctionne simplement :
from ultralytics import solutions
searcher = solutions.VisualAISearch(
# data = "path/to/img/directory" # Optional, build search engine with your own images
device="cuda" # 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.2680Cette implémentation de haut niveau gère :
- La génération de plongements d'images et de texte basés sur CLIP.
- La création et la gestion de l'index FAISS.
- La recherche sémantique efficace avec la similarité cosinus.
- Le chargement d'images basé sur le répertoire et la visualisation.
Puis-je personnaliser le frontend de cette application ?
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.
Est-il possible de rechercher dans des vidéos au lieu d'images statiques ?
Pas directement. Une solution simple consiste à extraire des images individuelles de tes vidéos (par exemple, une par seconde), à les traiter comme des images autonomes et à les envoyer dans le système. De cette façon, le moteur de recherche peut indexer sémantiquement les moments visuels de tes vidéos.