Recherche sémantique d'images avec OpenAI CLIP et Meta FAISS
Introduction
Ce guide te montre comment créer un moteur de recherche sémantique d'images à l'aide de OpenAI CLIP, Meta FAISS et Flask. En combinant les puissants plongements vision-langage de CLIP avec la recherche efficace par plus proches voisins de FAISS, tu peux créer une interface web fonctionnelle pour récupérer des images pertinentes via des 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 sémantique d'images

Comment ça fonctionne
- 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 de plongement multimodal. Cela permet une comparaison directe entre texte et 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 correspondant sémantiquement dans 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'un bon prompt.
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 d'images. Sinon, les images pourraient ne pas apparaître sur la page web en raison des limitations de service de fichiers de Flask.
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 testingClasse VisualAISearch
Cette classe effectue toutes les opérations backend :
- Charge ou construit un index FAISS à partir d'images locales.
- Extrait des plongements 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 d'images. Sinon, les images pourraient ne pas apparaître sur la page web en raison des limitations de service de fichiers de Flask.
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.2680Paramètres de VisualAISearch
Le tableau ci-dessous décrit les paramètres disponibles pour VisualAISearch :
| Argument | Type | Défaut | Description |
|---|---|---|---|
data | str | 'images' | Chemin d'accès au répertoire d'images utilisé pour la recherche de similarité. |
| Argument | Type | Défaut | Description |
|---|---|---|---|
device | str | None | Spécifie le périphérique pour l'inférence (par exemple, cpu, cuda:0 ou 0). Permet aux utilisateurs de choisir entre le CPU, un GPU spécifique ou d'autres dispositifs de calcul pour l'exécution du modèle. |
Avantages de la recherche sémantique d'images avec CLIP et FAISS
Construire ton propre système de recherche sémantique d'images avec CLIP et FAISS 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 spécifique. L'apprentissage zero-shot de CLIP te permet d'effectuer des requêtes de recherche sur n'importe quel jeu de données d'images en utilisant du langage naturel libre, ce qui économise 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 horizon 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 n'a besoin que d'images brutes. CLIP génère des plongements sans nécessiter d'annotation manuelle.
-
Recherche flexible et évolutive : FAISS permet une recherche rapide par 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 trans-domaines : Que tu construises une archive photo personnelle, un outil d'inspiration créative, un moteur de recherche de produits ou même un système de recommandation artistique, cette pile s'adapte à divers domaines avec un minimum d'ajustements.
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 des 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 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.
Que fait exactement FAISS dans ce projet (recherche sémantique) ?
FAISS (Facebook AI Similarity Search) est une boîte à outils qui t'aide à rechercher très efficacement à travers des vecteurs de haute dimension. Une fois que CLIP transforme tes images en plongements, FAISS rend rapide et facile la recherche des correspondances les plus proches à une requête textuelle, parfait pour la récupération d'images en temps réel.
Why use the Ultralytics Python package if CLIP and FAISS are from OpenAI and Meta?
Bien que CLIP et FAISS soient développés respectivement par OpenAI et Meta, le package Python d'Ultralytics simplifie leur intégration dans un pipeline complet de recherche sémantique d'images 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ée 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 les répertoires et la visualisation.
Puis-je personnaliser le frontend de cette application ?
Oui. La configuration actuelle utilise Flask avec un frontend HTML de base, 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 de backend API pour ton interface personnalisée.
Est-il possible de rechercher à travers des vidéos au lieu d'images statiques ?
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 envoyer dans le système. De cette façon, le moteur de recherche peut indexer sémantiquement les moments visuels de tes vidéos.