YOLO Vision 2026:

Come creare una ricerca semantica per immagini con OpenAI CLIP#

Questa guida ti accompagna nella creazione di un motore di ricerca di immagini semantiche utilizzando OpenAI CLIP e Flask. Combinando gli embedding visivo-linguistici di CLIP con la rapida ricerca tramite similarità del 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 🎉

Panoramica della pagina web di Flask con i risultati della ricerca semantica

Il pacchetto Python di Ultralytics incapsula l'intero flusso di lavoro dietro due classi, consentendoti di avviare un'applicazione di ricerca funzionante o di eseguire query programmaticamente in poche righe. Questa guida copre perché la ricerca semantica è utile, come funziona, l'esecuzione dell'applicazione web, la ricerca programmatica e la configurazione dei parametri.

Perché usare la ricerca semantica di immagini?#

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

  • Capacità zero-shot: Non è necessario eseguire l'addestramento sul tuo dataset. L'apprendimento zero-shot di CLIP ti consente di interrogare qualsiasi raccolta di immagini con linguaggio naturale a forma libera, 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 embeddings senza alcuna annotazione manuale.
  • Ricerca leggera ed esatta: Una singola moltiplicazione di matrici normalizzata in NumPy classifica ogni immagine in base alla cosine similarity, fornendo risultati esatti con tempi di risposta in tempo reale su migliaia di embeddings, senza dipendenze di ricerca aggiuntive da installare o gestire.
  • Applicazioni cross-dominio: Che tu stia creando un archivio fotografico personale, uno strumento di ispirazione creativa, un motore di ricerca prodotti o un sistema di raccomandazione artistica, lo stesso stack si adatta con modifiche minime.

Come funziona la ricerca semantica di immagini#

Il processo combina tre componenti, ciascuna delle quali gestisce una fase della trasformazione di immagini e testo in risultati classificati:

  • CLIP utilizza un codificatore visivo (ad esempio, ResNet o ViT) per le immagini e un codificatore 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.
  • NumPy memorizza gli embeddings delle immagini in un unico array e li classifica rispetto a un embedding di query con una singola moltiplicazione di matrici, restituendo i vettori più vicini tramite cosine similarity senza alcuna dipendenza di indicizzazione aggiuntiva.
  • Flask fornisce una semplice interfaccia web per inviare query in linguaggio naturale e visualizzare le immagini semanticamente corrispondenti dall'indice.

Flusso di lavoro di recupero delle immagini di OpenAI Clip

Poiché sia le immagini che il testo finiscono nello stesso spazio vettoriale, il recupero è zero-shot: non hai bisogno di etichette o categorie, solo di dati immagine 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, compila l'indice degli embedding e serve una pagina in cui è possibile digitare una query e visualizzare i risultati ordinati.

Avviso sul percorso dell'immagine

Se stai usando le tue immagini, assicurati di fornire un percorso assoluto alla directory delle immagini. Altrimenti, 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="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 programmaticamente#

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

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

Chiama il motore di ricerca con una query in linguaggio naturale per ottenere un elenco di nomi di file di immagini corrispondenti classificati 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 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.
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.

Conclusione#

Con CLIP e il pacchetto Python di Ultralytics, puoi configurare un motore di ricerca di immagini semantiche zero-shot in poche righe, sia come app web Flask che come backend di ricerca programmatico. Da qui, punta data alla tua directory di immagini per indicizzarla, quindi esplora altre Ultralytics Solutions su cui costruire i tuoi flussi di lavoro di visione artificiale.

FAQ#

Come fa CLIP a comprendere 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 i compiti di AI?#

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 da sogno surreale", rendendolo utile per tutto, dalla classificazione alla ricerca semantica creativa, senza necessità di riaddestramento.

Come vengono classificate le immagini rispetto a una query di testo?#

Una volta che CLIP trasforma le tue immagini in embedding, il pacchetto Ultralytics li normalizza L2 e li memorizza in un unico array NumPy. Una query viene classificata con una moltiplicazione di matrici che calcola la similarità del coseno tra l'embedding della query e ogni embedding dell'immagine, ordinando quindi i punteggi. Questa ricerca a forza bruta è esatta e veloce per le tipiche raccolte di immagini, senza alcuna dipendenza aggiuntiva da database vettoriali da installare o gestire.

Perché usare il Python package di Ultralytics se CLIP è di OpenAI?#

Sebbene CLIP sia sviluppato da OpenAI, il pacchetto Python di Ultralytics racchiude la generazione di embedding, l'indicizzazione e la ricerca basata sulla similarità del coseno in un flusso di lavoro completo di ricerca di immagini semantiche dietro poche righe di codice che funzionano e basta:

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 di embeddings.
  • Ricerca semantica efficiente con similarità del coseno.
  • Caricamento di 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 costruire un'interfaccia utente più dinamica con React, Vue o un altro framework frontend. Flask può fungere da API backend per la tua interfaccia personalizzata.

È possibile cercare nei video invece che in immagini statiche?#

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

Commenti