Ultralytics YOLO27:

Come creare una ricerca semantica di immagini con OpenAI CLIP#

Questa guida ti accompagna nella creazione di un motore di ricerca semantica di immagini utilizzando OpenAI CLIP e Flask. Combinando gli embedding visivo-linguistici di CLIP con una rapida ricerca per similarità coseno basata su NumPy, puoi creare un'interfaccia web che recupera immagini pertinenti da query in linguaggio naturale, senza bisogno di etichette o categorie.



Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP and the Ultralytics Package 🎉

Pagina web Flask con panoramica dei risultati della ricerca semantica

Il pacchetto Python Ultralytics racchiude l'intera pipeline dietro due classi, così puoi avviare un'app di ricerca funzionante o eseguire query a livello programmatico con poche righe di codice. Questa guida illustra perché la ricerca semantica è utile, come funziona, come eseguire l'app web, come effettuare ricerche a livello programmatico e come configurare i parametri.

Perché usare la ricerca semantica di immagini?#

Creare il tuo sistema di ricerca semantica di immagini con CLIP offre diversi vantaggi interessanti:

  • Funzionalità zero-shot: non devi addestrare il modello sul tuo dataset. Il zero-shot learning di CLIP ti consente di interrogare qualsiasi raccolta di immagini usando il linguaggio naturale libero, risparmiando tempo e risorse.
  • Comprensione simile a quella umana: a differenza della ricerca per parole chiave, CLIP comprende il contesto semantico e recupera immagini da query astratte, emotive o relazionali come "un bambino felice nella natura" o "lo skyline di una città futuristica di notte".
  • Nessuna etichetta o metadato: questo approccio richiede solo immagini grezze. CLIP genera gli embedding senza annotazione manuale.
  • Ricerca leggera ed esatta: una singola moltiplicazione tra matrici normalizzate in NumPy ordina ogni immagine in base alla similarità coseno, fornendo risultati esatti con risposta in tempo reale su migliaia di embedding e senza alcuna dipendenza di ricerca aggiuntiva da installare o gestire.
  • Applicazioni in diversi ambiti: che tu stia creando un archivio fotografico personale, uno strumento per trovare ispirazione creativa, un motore di ricerca di prodotti o un sistema di raccomandazione artistica, lo stesso stack si adatta con modifiche minime.

Come funziona la ricerca semantica di immagini#

La pipeline combina tre componenti, ognuno dei quali gestisce una fase della trasformazione di immagini e testo in risultati ordinati:

  • CLIP usa un encoder visivo (ad es. ResNet o ViT) per le immagini e un encoder testuale (basato su Transformer) per il linguaggio, proiettando entrambi nello stesso spazio di embedding multimodale. Ciò consente il confronto diretto tra testo e immagini usando la similarità coseno.
  • NumPy memorizza gli embedding delle immagini come un unico array e li ordina rispetto a un embedding di query con una sola moltiplicazione tra matrici, restituendo i vettori più vicini in base alla similarità coseno senza dipendenze aggiuntive per l'indicizzazione.
  • Flask offre una semplice interfaccia web per inviare query in linguaggio naturale e visualizzare le immagini semanticamente corrispondenti dall'indice.

Flusso di lavoro per il recupero di immagini con OpenAI Clip

Poiché immagini e testo si trovano nello stesso spazio vettoriale, il recupero è zero-shot: non servono etichette o categorie, ma solo dati immagine e un buon prompt.

Esegui l'app web di ricerca semantica#

La classe SearchApp avvia l'intera interfaccia Flask. Alla prima esecuzione scarica un set di immagini di esempio, crea l'indice degli embedding e pubblica una pagina in cui puoi digitare una query e visualizzare i risultati ordinati.

Avviso sul percorso delle immagini

Se usi immagini personali, assicurati di fornire un percorso assoluto alla directory delle immagini. In caso contrario, le immagini potrebbero non apparire nella pagina web a causa delle limitazioni del servizio di file di Flask.

from ultralytics import solutions

app = solutions.SearchApp(
    data="images",  # replace with a path to build the 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

Cerca immagini a livello programmatico#

La classe VisualAISearch esegue tutte le operazioni di backend senza il livello web:

  • Carica o crea un indice degli embedding a partire da immagini locali.
  • Estrae gli embedding delle immagini e del testo usando CLIP.
  • Esegue la ricerca per similarità usando la similarità coseno.

Chiama il motore di ricerca con una query in linguaggio naturale per ottenere un elenco di nomi di file immagine corrispondenti, ordinati per similarità:

from ultralytics import solutions

searcher = solutions.VisualAISearch(
    data="images",  # replace with a path to build the search engine with your own images
    device="cpu",  # 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

Configura i parametri di VisualAISearch#

La tabella seguente illustra i parametri disponibili per VisualAISearch:

ArgomentoTipoPredefinitoDescrizione
datastr'images'Percorso della directory delle immagini da indicizzare e utilizzare per la ricerca.
devicestr'cpu'Dispositivo utilizzato per l'inferenza CLIP (ad es. cpu, cuda, 0).
Gestisci i tuoi dati nel cloud

Per cercare raccolte di immagini su scala di produzione senza gestire file locali, puoi organizzare e versionare le tue immagini nella Ultralytics Platform prima di indicizzarle con CLIP.

Conclusioni#

Con CLIP e il pacchetto Python Ultralytics, puoi creare un motore di ricerca semantica di immagini zero-shot con poche righe di codice, sia come app web Flask sia come backend di ricerca a livello programmatico. Da qui, indica a data la directory delle tue immagini per indicizzarla, quindi esplora le altre Ultralytics Solutions per sviluppare ulteriormente i tuoi flussi di lavoro di computer vision.

FAQ#

  • CLIP (pre-addestramento contrastivo linguistico-visivo) è un modello sviluppato da OpenAI che impara a collegare le informazioni visive e linguistiche. Viene addestrato su un enorme dataset di immagini associate a descrizioni in linguaggio naturale. Questo addestramento gli consente di mappare immagini e testo in uno spazio di embedding condiviso, così puoi confrontarli direttamente usando la similarità vettoriale.

  • Ciò che distingue CLIP è la sua capacità di generalizzare. Invece di essere addestrato solo per etichette o attività specifiche, impara direttamente dal linguaggio naturale. Questo gli consente di gestire query flessibili come "un uomo che guida una moto d'acqua" o "un paesaggio onirico surreale", rendendolo utile per attività che vanno dalla classificazione alla ricerca semantica creativa, senza un nuovo addestramento.

  • Dopo che CLIP ha trasformato le tue immagini in embedding, il pacchetto Ultralytics li normalizza con L2 e li memorizza in un unico array NumPy. Una query viene classificata con una sola moltiplicazione tra matrici che calcola la similarità coseno tra l'embedding della query e ogni embedding immagine, quindi ordina i punteggi. Questa ricerca a forza bruta è esatta e veloce per le raccolte di immagini tipiche, senza dipendenze aggiuntive da database vettoriali da installare o gestire.

  • Sebbene CLIP sia sviluppato da OpenAI, il pacchetto Python Ultralytics racchiude la generazione degli embedding, l'indicizzazione e la ricerca per similarità coseno in una pipeline completa di ricerca semantica di immagini, accessibile con poche righe di codice immediatamente funzionanti:

    from ultralytics import solutions
    
    searcher = solutions.VisualAISearch(
        data="images",  # replace with a path to build the search engine with your own images
        device="cpu",  # configure the device for processing, e.g., "cpu" or "cuda"
    )
    
    results = searcher("a dog sitting on a bench")

    Questa implementazione di alto livello gestisce:

    • Generazione di embedding di immagini e testo basata su CLIP.
    • Creazione e gestione dell'indice degli embedding.
    • Ricerca semantica efficiente con similarità coseno.
    • Caricamento di immagini basato su directory e visualizzazione.
  • Sì. La configurazione attuale usa 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 backend per la tua interfaccia personalizzata.

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

Commenti