Ricerca semantica di immagini con OpenAI CLIP e Meta FAISS

Introduzione

Questa guida ti accompagna nella creazione di un motore di ricerca semantica di immagini utilizzando OpenAI CLIP, Meta FAISS e Flask. Combinando i potenti embedding visuale-linguistici di CLIP con l'efficiente ricerca del vicino più prossimo di FAISS, puoi creare un'interfaccia web perfettamente funzionante dove recuperare immagini pertinenti utilizzando query in linguaggio naturale.



Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP, META FAISS and Ultralytics Package 🎉

Anteprima visiva della ricerca semantica di immagini

Pagina web Flask con panoramica dei risultati di ricerca semantica

Come funziona

  • CLIP utilizza un codificatore visivo (es. ResNet o ViT) per le immagini e un codificatore di testo (basato su Transformer) per il linguaggio, al fine di proiettarli entrambi nello stesso spazio di embedding multimodale. Ciò consente un confronto diretto tra testo e immagini tramite la similarità del coseno.
  • FAISS (Facebook AI Similarity Search) crea un indice degli embedding delle immagini e abilita un recupero rapido e scalabile dei vettori più vicini a una data query.
  • Flask fornisce una semplice interfaccia web per inviare query in linguaggio naturale e visualizzare le immagini semanticamente corrispondenti dall'indice.

Questa architettura supporta la ricerca zero-shot, il che significa che non servono etichette o categorie, solo dati immagine e un buon prompt.

Ricerca semantica di immagini utilizzando il pacchetto Python di Ultralytics
Avviso sul percorso dell'immagine

Se utilizzi le tue immagini, assicurati di fornire un percorso assoluto alla directory delle immagini. In caso contrario, le immagini potrebbero non apparire sulla pagina web a causa delle limitazioni di Flask nel servire i file.

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

Questa classe esegue tutte le operazioni di backend:

  • Carica o crea un indice FAISS da immagini locali.
  • Estrae embedding di immagini e testo utilizzando CLIP.
  • Esegue la ricerca di similarità utilizzando la similarità del coseno.
Ricerca di immagini simili
Avviso sul percorso dell'immagine

Se utilizzi le tue immagini, assicurati di fornire un percorso assoluto alla directory delle immagini. In caso contrario, le immagini potrebbero non apparire sulla pagina web a causa delle limitazioni di Flask nel servire i file.

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

Parametri di VisualAISearch

La tabella seguente illustra i parametri disponibili per VisualAISearch:

ArgomentoTipoPredefinitoDescrizione
datastr'images'Percorso verso la directory delle immagini utilizzata per la ricerca di similarità.
ArgomentoTipoPredefinitoDescrizione
devicestrNoneSpecifica il dispositivo per l'inferenza (ad esempio cpu, cuda:0 o 0). Consente agli utenti di scegliere tra CPU, una specifica GPU o altri dispositivi di calcolo per l'esecuzione del modello.

Vantaggi della ricerca semantica di immagini con CLIP e FAISS

Costruire il tuo sistema di ricerca semantica di immagini con CLIP e FAISS offre diversi vantaggi interessanti:

  1. Funzionalità Zero-Shot: Non è necessario addestrare il modello sul tuo specifico dataset. L'apprendimento zero-shot di CLIP ti consente di eseguire query di ricerca su qualsiasi dataset di immagini utilizzando il linguaggio naturale a forma libera, risparmiando tempo e risorse.

  2. Comprensione simile a quella umana: A differenza dei motori di ricerca basati su parole chiave, CLIP comprende il contesto semantico. Può recuperare immagini basate su query astratte, emotive o relazionali come "un bambino felice nella natura" o "lo skyline di una città futuristica di notte".

    Flusso di lavoro di recupero immagini con OpenAI Clip

  3. Nessuna necessità di etichette o metadati: I sistemi di ricerca immagini tradizionali richiedono dati etichettati con cura. Questo approccio necessita solo di immagini grezze. CLIP genera embedding senza bisogno di alcuna annotazione manuale.

  4. Ricerca flessibile e scalabile: FAISS abilita la ricerca rapida del vicino più prossimo anche con dataset su larga scala. È ottimizzato per velocità e memoria, consentendo una risposta in tempo reale anche con migliaia (o milioni) di embedding.

    Flusso di lavoro di creazione vettori di embedding con Meta FAISS

  5. Applicazioni cross-dominio: Che tu stia costruendo un archivio fotografico personale, uno strumento di ispirazione creativa, un motore di ricerca prodotti o persino un sistema di raccomandazione artistica, questo stack si adatta a domini diversi con modifiche minime.

FAQ

In che modo CLIP comprende sia le immagini che il testo?

CLIP (Contrastive Language Image Pretraining) è un modello sviluppato da OpenAI che impara a collegare informazioni visive e linguistiche. È addestrato su un enorme dataset di immagini accoppiate a didascalie in linguaggio naturale. Questo addestramento gli permette di mappare sia le immagini che il testo in uno spazio di embedding condiviso, così puoi confrontarli direttamente utilizzando la similarità vettoriale.

Perché CLIP è considerato così potente per le attività di IA?

Ciò che rende CLIP eccezionale è la sua capacità di generalizzare. Invece di essere addestrato solo per etichette o attività specifiche, impara dal linguaggio naturale stesso. Questo gli permette di gestire query flessibili come “un uomo che guida una moto d'acqua” o “un paesaggio onirico surreale”, rendendolo utile per tutto, dalla classificazione alla ricerca semantica creativa, senza necessità di riaddestramento.

Cosa fa esattamente FAISS in questo progetto (Ricerca Semantica)?

FAISS (Facebook AI Similarity Search) è un toolkit che ti aiuta a cercare tra vettori ad alta dimensionalità in modo molto efficiente. Una volta che CLIP trasforma le tue immagini in embedding, FAISS rende veloce e facile trovare le corrispondenze più vicine a una query di testo, perfetto per il recupero di immagini in tempo reale.

Why use the Ultralytics Python package if CLIP and FAISS are from OpenAI and Meta?

Sebbene CLIP e FAISS siano sviluppati rispettivamente da OpenAI e Meta, il pacchetto Python di Ultralytics semplifica la loro integrazione in una pipeline completa di ricerca semantica di immagini in un flusso di lavoro di 2 righe che funziona semplicemente:

Ricerca di immagini simili
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

Questa implementazione di alto livello gestisce:

  • Generazione di embedding di immagini e testo basata su CLIP.
  • Creazione e gestione dell'indice FAISS.
  • Ricerca semantica efficiente con similarità del coseno.
  • Caricamento immagini basato su directory e visualizzazione.

Posso personalizzare il frontend di questa app?

Sì. L'attuale configurazione utilizza Flask con un frontend HTML di base, ma puoi sostituirlo con il tuo HTML o creare un'interfaccia utente più dinamica con React, Vue o un altro framework frontend. Flask può fungere da API di backend per la tua interfaccia personalizzata.

È possibile eseguire ricerche attraverso video anziché immagini statiche?

Non direttamente. Una semplice soluzione alternativa consiste nell'estrarre singoli fotogrammi dai tuoi video (es. uno ogni secondo), trattarli come immagini autonome e inserirli nel sistema. In questo modo, il motore di ricerca può indicizzare semanticamente i momenti visivi dei tuoi video.

Commenti