Ricerca semantica moderna per immagini

La moderna ricerca semantica delle immagini

Un articolo su come utilizzare Python, Pinecone, Hugging Face e il modello Open AI CLIP per creare un’applicazione di ricerca semantica per le tue foto nel cloud.

Immagine dell'autore

Vuoi trovare “quella foto” di alcuni anni fa. Ricordi alcuni dettagli sul contesto. Apple Photos non offre la ricerca semantica e Google Photos è limitato a pochi classificatori di elementi predefiniti. Nessuno dei due si comporterà bene con questo tipo di ricerca. Illustrerò il problema con due query insolite su Google Photos: “torta di compleanno a forma di ciambella” e “labbro gonfio da una battaglia a palle di neve”. Poi spiegherò come creare la tua applicazione di ricerca di immagini semantica.

Esempio n. 1

Mi piacciono le torte di compleanno. Mi piacciono anche le ciambelle. L’anno scorso, ho avuto l’idea brillante di combinarli con una pila di ciambelle come torta di compleanno. Cerchiamo di trovarla.

Ricerca su Google Photos: “torta di compleanno a forma di ciambella”

Risultati: Sei foto di torte senza ciambelle seguite da quella che volevo.

Immagine dell'autore

Ricerca nell’app Semantic Search: “torta di compleanno a forma di ciambella”

Risultati: Due immagini e un video che erano esattamente quello che volevo.

Immagine dell'autore

Esempio n. 2

Sono andato sulla neve con mio figlio adolescente e un grande gruppo dei suoi amici. Sono saliti in cima a un tunnel ferroviario abbandonato. “Lanciate palle di neve tutti insieme e registrerò un video a rallentatore!”, ho urlato. Non è stato il mio momento più brillante, poiché non avevo previsto l’ovvia conclusione che sarei diventato il bersaglio di venti ragazzi adolescenti con braccia forti.

Ricerca su Google Photos: “labbro gonfio da una battaglia a palle di neve”

Risultati:

Immagine creata dall'autore

Il modello di classificazione delle immagini attuale di Google è limitato alle parole su cui è stato addestrato.

Ricerca nell’app Semantic Search: “labbro gonfio da una battaglia a palle di neve”

Risultati: La foto del labbro gonfio (non mostrata) e il video precedente il labbro gonfio sono i risultati uno e due.

Immagine dell'autore

Modello OpenAI CLIP e architettura dell’applicazione

CLIP consente al modello di apprendere come associare i pixel dell’immagine al testo e gli conferisce la flessibilità di cercare cose come “torte di ciambelle” e “labbra gonfie”, cose che non verrebbero mai incluse durante l’addestramento di un classificatore di immagini. Sta per Constastive Language-Image Pretraining. È un modello multimodale e a zero-shot open-source. È stato addestrato su milioni di immagini con didascalie descrittive.

Con una immagine e delle descrizioni di testo, il modello può predire la descrizione di testo più rilevante per quella immagine, senza ottimizzare per una particolare attività.

Fonte: Nikos Karfitsas, Towards Data Science

L’architettura CLIP che trovi nella maggior parte dei tutorial online è abbastanza buona per un POC, ma non è pronta per un’azienda. In questi tutorial, CLIP e i processori Hugging Face trattengono gli embedding in memoria per fungere da vettore di archiviazione per l’esecuzione di punteggi di similarità e recupero.

Immagine creata dall'autore

Un database di vettori come Pinecone è un componente chiave per scalare un’applicazione come questa. Fornisce funzionalità semplificate, robuste e pronte per l’uso aziendale come l’elaborazione batch e in streaming di immagini, la gestione aziendale degli embedding, il recupero a bassa latenza e il filtraggio dei metadati.

Immagine creata dall'autore

Costruzione dell’applicazione

Il codice e i file di supporto per questa applicazione possono essere trovati su GitHub a https://github.com/joshpoduska/llm-image-caption-semantic-search. Usali per costruire un’applicazione di ricerca semantica per le tue foto cloud.

L’applicazione viene eseguita localmente su un laptop con una quantità sufficiente di memoria. L’ho testata su un MacBook Pro.

Componenti necessari per costruire l’app

  • Pinecone o un database di vettori simile per l’archiviazione degli embedding e la ricerca semantica (la versione gratuita di Pinecone è sufficiente per questo tutorial)
  • Modelli e pipeline di Hugging Face
  • Modello CLIP di OpenAI per la creazione di embedding di immagini e testo di query (accessibile da Hugging Face)
  • Google Photos API per accedere alle tue foto personali su Google Photos

Informazioni utili prima di iniziare

Accedi alle tue immagini

L’API di Google Photos ha diversi campi di dati chiave da notare. Vedi il riferimento all’API per ulteriori dettagli.

  • Id è immutabile
  • baseUrl ti consente di accedere ai byte degli elementi multimediali. Sono validi per 60 minuti.

Una combinazione delle librerie pandas, JSON e requests può essere utilizzata in modo semplice per caricare un DataFrame con ID delle immagini, URL e date.

Generare le rappresentazioni delle immagini

Grazie ad Hugging Face e al modello OpenAI CLIP, questo passaggio è il più semplice di tutta l’applicazione.

from sentence_transformers import SentenceTransformerimg_model = SentenceTransformer('clip-ViT-B-32')embeddings = img_model.encode(images)

Creare i metadati

La ricerca semantica viene spesso arricchita con filtri di metadati. In questa applicazione, utilizzo la data della foto per estrarre l’anno, il mese e il giorno. Queste informazioni vengono memorizzate come dizionario in un campo DataFrame. Le query di Pinecone possono utilizzare questo dizionario per filtrare le ricerche in base ai metadati nel dizionario.

Ecco la prima riga del mio DataFrame pandas con i campi delle immagini, i vettori e il campo del dizionario dei metadati.

Immagine dell'autore

Caricare le rappresentazioni

Ci sono ottimizzazioni di Pinecone per il caricamento asincrono e parallelo. La funzione di caricamento di base è semplice, come segue.

index.upsert(vectors=ids_vectors_chunk, async_req=True)

Interrogare le rappresentazioni

Per interrogare le immagini con il modello CLIP, dobbiamo inserirgli il testo della nostra query semantica. Questo viene facilitato caricando il modello di embedding di testo CLIP.

text_model = SentenceTransformer(‘sentence-transformers/clip-ViT-B-32-multilingual-v1’)

Ora possiamo creare una rappresentazione per la nostra frase di ricerca e confrontarla con le rappresentazioni delle immagini memorizzate in Pinecone.

# creare il vettore di queryxq = text_model.encode(query).tolist()# effettuare la queryxc = index.query(xq,                filter= {                "anno": {"$in":years_filter},                "mese": {"$in":months_filter}                        },                top_k= top_k,                include_metadata=True)

Conclusione

Il modello CLIP è incredibile. Si tratta di un modello a zero-shot con una conoscenza generale, che ha imparato ad associare immagini a testi in un modo che lo libera dai vincoli dell’addestramento di un classificatore di immagini su classi predefinite. Quando uniamo tutto ciò alla potenza di un database vettoriale di livello enterprise come Pinecone, possiamo creare applicazioni di ricerca semantica delle immagini con bassa latenza e alta fedeltà. Questa è solo una delle emozionanti applicazioni dell’intelligenza artificiale generativa che spuntano ogni giorno.