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

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.
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 testingClasse 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.
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.2680Parametri di VisualAISearch
La tabella seguente illustra i parametri disponibili per VisualAISearch:
| Argomento | Tipo | Predefinito | Descrizione |
|---|---|---|---|
data | str | 'images' | Percorso verso la directory delle immagini utilizzata per la ricerca di similarità. |
| Argomento | Tipo | Predefinito | Descrizione |
|---|---|---|---|
device | str | None | Specifica 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:
-
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.
-
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".

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

-
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:
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.2680Questa 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.