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

Aperçu d'une page web Flask avec les résultats de recherche sémantique

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.

Recherche sémantique d'images en utilisant le package Python d'Ultralytics
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 testing

Classe 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.
Recherche d'images similaires
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.2680

Paramètres de VisualAISearch

Le tableau ci-dessous décrit les paramètres disponibles pour VisualAISearch :

ArgumentTypeDéfautDescription
datastr'images'Chemin d'accès au répertoire d'images utilisé pour la recherche de similarité.
ArgumentTypeDéfautDescription
devicestrNoneSpé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 :

  1. 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.

  2. 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".

    Flux de travail de récupération d'images OpenAI Clip

  3. 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.

  4. 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.

    Flux de travail de construction de vecteurs de plongement Meta FAISS

  5. 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 :

Recherche d'images similaires
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.2680

Cette 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.

Commentaires