Vai al contenuto

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 visual-linguistici di CLIP con l'efficiente ricerca del vicino più prossimo di FAISS, puoi creare un'interfaccia web completamente funzionale in cui puoi recuperare immagini pertinenti utilizzando query in linguaggio naturale.



Guarda: Come funziona la ricerca di similarità | Ricerca visiva utilizzando OpenAI CLIP, META FAISS e il pacchetto Ultralytics 🎉

Anteprima visiva della ricerca semantica di immagini

Pagina web Flask con panoramica dei risultati della ricerca semantica

Come funziona

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

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

Ricerca semantica di immagini utilizzando il pacchetto Ultralytics Python

Avviso Percorso Immagine

Se stai usando immagini personalizzate, assicurati di fornire un percorso assoluto alla directory delle immagini. In caso contrario, le immagini potrebbero non essere visualizzate sulla pagina web a causa delle limitazioni di Flask nella gestione dei 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 i.e "cpu" or "cuda"
)

app.run(debug=False)  # You can also use `debug=True` argument for testing

VisualAISearch classe

Questa classe esegue tutte le operazioni di backend:

  • Carica o costruisce un indice FAISS da immagini locali.
  • Estrae embedding di immagini e testo utilizzando CLIP.
  • Esegue una ricerca di similarità utilizzando la similarità del coseno.

Ricerca di immagini simili

Avviso Percorso Immagine

Se stai usando immagini personalizzate, assicurati di fornire un percorso assoluto alla directory delle immagini. In caso contrario, le immagini potrebbero non essere visualizzate sulla pagina web a causa delle limitazioni di Flask nella gestione dei 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 i.e "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

VisualAISearch Parametri

La tabella seguente delinea i parametri disponibili per VisualAISearch:

Argomento Tipo Predefinito Descrizione
data str 'images' Percorso della 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 oppure 0). Consente agli utenti di scegliere tra CPU, una GPU specifica o altri dispositivi di calcolo per l'esecuzione del modello.

Vantaggi della ricerca semantica di immagini con CLIP e FAISS

La creazione di un sistema di ricerca semantica di immagini personalizzato 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 in 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 "uno skyline futuristico di una città di notte".

    Workflow di recupero immagini OpenAI Clip

  3. Nessuna Necessità di Etichette o Metadati: I sistemi tradizionali di ricerca immagini richiedono dati accuratamente etichettati. Questo approccio necessita solo di immagini grezze. CLIP genera incorporamenti senza necessità di annotazioni manuali.

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

    Workflow di creazione di vettori di embedding Meta FAISS

  5. Applicazioni cross-dominio: Che tu stia costruendo un archivio fotografico personale, uno strumento di ispirazione creativa, un motore di ricerca di prodotti o persino un sistema di raccomandazione artistica, questo stack si adatta a diversi domini 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 connettere informazioni visive e linguistiche. È addestrato su un enorme set di dati di immagini abbinate a didascalie in linguaggio naturale. Questo addestramento gli consente di mappare sia le immagini che il testo in uno spazio di embedding condiviso, in modo da poterli confrontare direttamente utilizzando la similarità vettoriale.

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

Ciò che distingue CLIP è la sua capacità di generalizzare. Invece di essere addestrato solo per etichette o compiti specifici, 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 qualsiasi cosa, dalla classificazione alla ricerca semantica creativa, senza riaddestramento.

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 facile e veloce trovare le corrispondenze più vicine a una query di testo, perfetto per il recupero di immagini in tempo reale.

Perché usare il pacchetto Python di Ultralytics se CLIP e FAISS sono di OpenAI e Meta?

Mentre CLIP e FAISS sono sviluppati rispettivamente da OpenAI e Meta, il pacchetto Ultralytics Python 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 i.e "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 di immagini basato su directory e visualizzazione.

Posso personalizzare il frontend di questa app?

Sì, assolutamente. L'attuale configurazione utilizza Flask con un frontend HTML di base, ma sei libero di sostituire il tuo HTML o persino di creare qualcosa di più dinamico con React, Vue o un altro framework frontend. Flask può facilmente fungere da API backend per la tua interfaccia personalizzata.

È possibile effettuare ricerche all'interno di video invece che di immagini statiche?

Non direttamente, ma c'è una semplice soluzione alternativa. Puoi estrarre singoli frame dai tuoi video (ad esempio, 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.



📅 Creato 3 mesi fa ✏️ Aggiornato 2 mesi fa

Commenti