Ultralytics YOLO27:
Get Started

Come creare una ricerca semantica di immagini con OpenAI CLIP#

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



Guarda: Come funziona la ricerca per similarità | Ricerca visiva con OpenAI CLIP e il pacchetto Ultralytics 🎉

Pagina web di Flask con una panoramica dei risultati della ricerca semantica

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

Creare un sistema di ricerca semantica di immagini personalizzato con CLIP offre diversi vantaggi significativi:

  • Funzionalità zero-shot: non devi addestrare il modello sul tuo dataset. L'apprendimento zero-shot di CLIP ti consente di interrogare qualsiasi raccolta di immagini usando query in 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 a partire 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 originali. CLIP genera gli embedding senza alcuna annotazione manuale.
  • Ricerca esatta e leggera: una singola moltiplicazione di matrici normalizzate in NumPy ordina tutte le immagini in base alla similarità coseno, fornendo risultati esatti in tempo reale anche con migliaia di embedding, senza dipendenze di ricerca aggiuntive 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 consigli artistici, la stessa infrastruttura 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, proiettandoli entrambi nello stesso spazio di embedding multimodale. Questo consente di confrontare direttamente testo e immagini usando la similarità coseno.
  • NumPy archivia gli embedding delle immagini in un unico array e li confronta con un embedding della query tramite una sola moltiplicazione di matrici, restituendo i vettori più vicini in base alla similarità coseno senza dipendenze di indicizzazione aggiuntive.
  • Flask offre una semplice interfaccia web per inviare query in linguaggio naturale e mostrare le immagini semanticamente corrispondenti presenti nell'indice.

Flusso di lavoro per il recupero delle immagini con OpenAI Clip

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

Esegui l'app web di ricerca semantica#

La classe SearchApp avvia l'intera interfaccia Flask. Al primo avvio 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 tue, assicurati di fornire un percorso assoluto alla directory delle immagini. In caso contrario, le immagini potrebbero non apparire nella pagina web a causa dei limiti di Flask nella gestione dei file.

from ultralytics import solutions

app = solutions.SearchApp(
    data="images",  # sostituisci con un percorso per creare il motore di ricerca usando le tue immagini
    device="cpu",  # configura il dispositivo per l'elaborazione, ad es. "cpu" o "cuda"
)

app.run(debug=False)  # Puoi anche usare l'argomento `debug=True` per i test

Cerca immagini a livello di codice#

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

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

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

from ultralytics import solutions

searcher = solutions.VisualAISearch(
    data="images",  # sostituisci con un percorso per creare il motore di ricerca usando le tue immagini
    device="cpu",  # configura il dispositivo per l'elaborazione, ad es. "cpu" o "cuda"
)

results = searcher("a dog sitting on a bench")

# Risultati ordinati:
# - 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 descrive i parametri disponibili per VisualAISearch:

ArgomentoTipoPredefinitoDescrizione
datastr'images'Percorso della directory di immagini da indicizzare e in cui effettuare le ricerche.
devicestr'cpu'Dispositivo usato per l'inferenza con 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 immagini in Ultralytics Platform prima di indicizzarle con CLIP.

Conclusione#

Con CLIP e il pacchetto Python Ultralytics, puoi creare un motore di ricerca semantica di immagini zero-shot con poche righe, come app web Flask o come backend di ricerca utilizzabile a livello di codice. Da qui, imposta data sulla directory delle tue immagini per indicizzarla, quindi esplora altre soluzioni Ultralytics per ampliare i tuoi flussi di lavoro di visione artificiale.

Domande frequenti#

  • CLIP (preaddestramento contrastivo di immagini e linguaggio) è un modello sviluppato da OpenAI che impara a collegare le informazioni visive e linguistiche. Viene addestrato su un enorme dataset di immagini associate a didascalie 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 qualsiasi attività, dalla classificazione alla ricerca semantica creativa, senza bisogno di un nuovo addestramento.

  • Dopo che CLIP ha trasformato le tue immagini in embedding, il pacchetto Ultralytics li normalizza con la norma L2 e li archivia in un unico array NumPy. Una query viene ordinata tramite una moltiplicazione di matrici che calcola la similarità coseno tra l'embedding della query e ogni embedding delle immagini, 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.

  • CLIP è sviluppato da OpenAI, ma il pacchetto Python Ultralytics integra la generazione degli embedding, l'indicizzazione e la ricerca basata sulla similarità coseno in una pipeline completa per la ricerca semantica di immagini, utilizzabile con poche righe di codice:

    from ultralytics import solutions
    
    searcher = solutions.VisualAISearch(
        data="images",  # sostituisci con un percorso per creare il motore di ricerca usando le tue immagini
        device="cpu",  # configura il dispositivo per l'elaborazione, ad es. "cpu" o "cuda"
    )
    
    results = searcher("a dog sitting on a bench")

    Questa implementazione di alto livello gestisce:

    • La generazione di embedding di immagini e testo basata su CLIP.
    • La creazione e la gestione degli indici degli embedding.
    • La ricerca semantica efficiente tramite similarità coseno.
    • Il caricamento di immagini basato su directory e la 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 di backend per la tua interfaccia personalizzata.

  • Non direttamente. Una soluzione semplice consiste nell'estrarre singoli fotogrammi dai video (ad es. uno al 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