Ricerca semantica delle immagini per gli articoli utilizzando Amazon Rekognition, i modelli di base di Amazon SageMaker e il servizio Amazon OpenSearch

Ricerca semantica delle immagini con Amazon Rekognition, Amazon SageMaker e Amazon OpenSearch.

I editori digitali sono continuamente alla ricerca di modi per semplificare e automatizzare i loro flussi di lavoro sui media al fine di generare e pubblicare nuovi contenuti il più rapidamente possibile.

Gli editori possono avere repository contenenti milioni di immagini e, al fine di risparmiare denaro, devono essere in grado di riutilizzare queste immagini in diversi articoli. Trovare l’immagine che meglio si abbina a un articolo in repository di questa dimensione può essere un compito manuale, ripetitivo e che richiede molto tempo, ma può essere automatizzato. Inoltre, ci si affida al fatto che le immagini nel repository siano etichettate correttamente, cosa che può essere anch’essa automatizzata (per una storia di successo del cliente, fare riferimento a Aller Media Finds Success with KeyCore and AWS).

In questo post, dimostriamo come utilizzare Amazon Rekognition, Amazon SageMaker JumpStart e Amazon OpenSearch Service per risolvere questo problema aziendale. Amazon Rekognition facilita l’aggiunta di capacità di analisi delle immagini alle tue applicazioni senza alcuna competenza in materia di apprendimento automatico (ML) e dispone di varie API per soddisfare casi d’uso come il rilevamento degli oggetti, la moderazione dei contenuti, il rilevamento e l’analisi dei volti e il riconoscimento del testo e delle celebrità, che utilizziamo in questo esempio. SageMaker JumpStart è un servizio low-code che offre soluzioni predefinite, notebook di esempio e molti modelli pre-addestrati di ultima generazione provenienti da fonti pubblicamente disponibili e che possono essere facilmente distribuiti con un solo clic nel tuo account AWS. Questi modelli sono stati confezionati in modo da poter essere distribuiti in modo sicuro e semplice tramite le API di Amazon SageMaker. Il nuovo SageMaker JumpStart Foundation Hub ti consente di distribuire facilmente modelli linguistici di grandi dimensioni (LLM) e integrarli nelle tue applicazioni. OpenSearch Service è un servizio completamente gestito che semplifica la distribuzione, la scalabilità e il funzionamento di OpenSearch. OpenSearch Service consente di archiviare vettori e altri tipi di dati in un indice e offre funzionalità avanzate che consentono di cercare documenti utilizzando vettori e misurare la relazione semantica, che utilizziamo in questo post.

Il obiettivo finale di questo post è mostrare come possiamo mostrare un insieme di immagini che sono semanticamente simili a un testo, sia esso un articolo o una sinossi di una trasmissione televisiva.

Lo screenshot seguente mostra un esempio di come prendere un mini articolo come input di ricerca, anziché utilizzare parole chiave, e essere in grado di mostrare immagini semanticamente simili.

Panoramica della soluzione

La soluzione è divisa in due sezioni principali. Inizialmente, si estraggono le etichette e i metadati delle celebrità dalle immagini, utilizzando Amazon Rekognition. Successivamente, si genera una rappresentazione numerica dei metadati utilizzando un LLM. Vengono quindi archiviati i nomi delle celebrità e la rappresentazione numerica dei metadati in OpenSearch Service. Nella seconda sezione principale, si dispone di un’API per interrogare l’indice di OpenSearch Service per trovare immagini che siano semanticamente simili al testo inserito.

Questa soluzione utilizza i nostri servizi basati sugli eventi Amazon EventBridge, AWS Step Functions e AWS Lambda per orchestrare il processo di estrazione dei metadati dalle immagini utilizzando Amazon Rekognition. Amazon Rekognition effettuerà due chiamate API per estrarre le etichette e le celebrità conosciute dalle immagini.

L’API di rilevamento delle celebrità di Amazon Rekognition restituisce diversi elementi nella risposta. Per questo post, si utilizzano i seguenti:

  • Nome, ID e URL: il nome della celebrità, un ID univoco di Amazon Rekognition e una lista di URL come il link IMDb o Wikipedia della celebrità per ulteriori informazioni.
  • MatchConfidence: un punteggio di confidenza di corrispondenza che può essere utilizzato per controllare il comportamento dell’API. Si consiglia di applicare una soglia adeguata a questo punteggio nella propria applicazione per scegliere il punto di funzionamento preferito. Ad esempio, impostando una soglia del 99%, è possibile eliminare ulteriori falsi positivi, ma si potrebbero perdere alcune corrispondenze potenziali.

Nella seconda chiamata API, l’API di rilevamento delle etichette di Amazon Rekognition restituisce diversi elementi nella risposta. Si utilizzano i seguenti:

  • Nome: il nome dell’etichetta rilevata
  • Confidenza: il livello di confidenza nell’etichetta assegnata a un oggetto rilevato

Un concetto chiave nella ricerca semantica sono le rappresentazioni numeriche. Una rappresentazione numerica di una parola o di un gruppo di parole è una rappresentazione numerica sotto forma di vettore. Quando si hanno molti vettori, è possibile misurare la distanza tra di essi e i vettori che sono vicini in termini di distanza sono semanticamente simili. Pertanto, se si genera una rappresentazione numerica di tutti i metadati delle immagini e quindi si genera una rappresentazione numerica del testo, sia esso un articolo o una sinossi di una trasmissione televisiva ad esempio, utilizzando lo stesso modello, è possibile trovare immagini che siano semanticamente simili al testo fornito.

Esistono molti modelli disponibili all’interno di SageMaker JumpStart per generare embedding. Per questa soluzione, si utilizza l’Embedding GPT-J 6B di Hugging Face. Produce embedding di alta qualità e ha una delle migliori metriche di prestazione secondo i risultati di valutazione di Hugging Face. Amazon Bedrock è un’altra opzione, ancora in anteprima, dove è possibile scegliere il modello di embedding Amazon Titan Text per generare gli embedding.

Si utilizza il modello pre-addestrato GPT-J di SageMaker JumpStart per creare un embedding dei metadati dell’immagine e memorizzarlo come vettore k-NN nel proprio indice OpenSearch Service, insieme al nome della celebrità in un altro campo.

La seconda parte della soluzione consiste nel restituire all’utente le prime 10 immagini semanticamente simili al testo, sia esso un articolo o una sinossi TV, inclusi eventuali personaggi famosi. Quando si sceglie un’immagine da accompagnare a un articolo, si desidera che l’immagine risuoni con i punti pertinenti dell’articolo. SageMaker JumpStart ospita molti modelli di riassunto che possono prendere un lungo corpo di testo e ridurlo ai punti principali dell’originale. Per il modello di riassunto, si utilizza il modello AI21 Labs Summarize. Questo modello fornisce riassunti di alta qualità di articoli di notizie e il testo di origine può contenere circa 10.000 parole, consentendo all’utente di riassumere l’intero articolo in un’unica operazione.

Per rilevare se il testo contiene nomi, potenziali celebrità conosciute, si utilizza Amazon Comprehend, che può estrarre entità chiave da una stringa di testo. Si filtra quindi per l’entità “Person”, che si utilizza come parametro di ricerca di input.

Successivamente, si prende l’articolo riassunto e si genera un embedding da utilizzare come ulteriore parametro di ricerca di input. È importante notare che si utilizza lo stesso modello distribuito sulla stessa infrastruttura per generare l’embedding dell’articolo come si è fatto per le immagini. Si utilizza quindi Exact k-NN con uno script di punteggio in modo da poter effettuare la ricerca per due campi: nomi delle celebrità e il vettore che ha catturato le informazioni semantiche dell’articolo. Fare riferimento a questo post, Amazon OpenSearch Service’s vector database capabilities explained, sulla scalabilità dello script di punteggio e su come questo approccio su indici di grandi dimensioni possa portare a elevate latenze.

Procedura guidata

Il diagramma seguente illustra l’architettura della soluzione.

Seguendo le etichette numerate:

  1. Caricare un’immagine in un bucket Amazon S3
  2. Amazon EventBridge ascolta questo evento e quindi attiva l’esecuzione di una AWS Step function
  3. La Step Function prende in input l’immagine, estrae l’etichetta e i metadati delle celebrità
  4. La funzione AWS Lambda prende i metadati dell’immagine e genera un embedding
  5. La funzione Lambda inserisce quindi il nome della celebrità (se presente) e l’embedding come vettore k-NN in un indice OpenSearch Service
  6. Amazon S3 ospita un semplice sito web statico, servito da una distribuzione di Amazon CloudFront. L’interfaccia utente (UI) front-end consente di autenticarsi con l’applicazione utilizzando Amazon Cognito per cercare immagini
  7. Si invia un articolo o un testo tramite l’interfaccia utente
  8. Un’altra funzione Lambda chiama Amazon Comprehend per rilevare eventuali nomi nel testo
  9. La funzione riassume quindi il testo per ottenere i punti pertinenti dell’articolo
  10. La funzione genera un embedding dell’articolo riassunto
  11. La funzione quindi cerca nel’indice delle immagini di OpenSearch Service eventuali immagini corrispondenti al nome della celebrità e ai vicini più prossimi per il vettore utilizzando la similarità coseno
  12. Amazon CloudWatch e AWS X-Ray offrono visibilità sull’intero flusso di lavoro per avvisare in caso di eventuali problemi.

Estrarre e memorizzare i metadati chiave delle immagini

Le API Amazon Rekognition DetectLabels e RecognizeCelebrities forniscono i metadati dalle immagini, etichette di testo che è possibile utilizzare per generare un embedding. L’articolo fornisce un input di testo che è possibile utilizzare per generare un embedding.

Generare e memorizzare gli embedding di parole

La figura seguente mostra la rappresentazione grafica dei vettori delle nostre immagini in uno spazio bidimensionale, dove per aiuto visivo abbiamo classificato gli embedding in base alla loro categoria principale.

Generi anche un embedding di questo nuovo articolo scritto, in modo da poter cercare nel servizio OpenSearch le immagini più vicine all’articolo in questo spazio vettoriale. Utilizzando l’algoritmo dei k-nearest neighbors (k-NN), definisci quanti immagini restituire nei tuoi risultati.

Ingrandendo la figura precedente, i vettori sono classificati in base alla loro distanza dall’articolo e quindi restituiscono le immagini K-nearest, dove K è 10 in questo esempio.

OpenSearch Service offre la possibilità di archiviare grandi vettori in un indice e offre anche la funzionalità di eseguire query contro l’indice utilizzando k-NN, in modo da poter effettuare una query con un vettore per restituire i documenti k-nearest che hanno vettori a distanza ravvicinata utilizzando varie misurazioni. Per questo esempio, utilizziamo la similarità cosinale.

Rileva nomi nell’articolo

Utilizzi Amazon Comprehend, un servizio di elaborazione del linguaggio naturale (NLP) basato sull’IA, per estrarre entità chiave dall’articolo. In questo esempio, utilizzi Amazon Comprehend per estrarre entità e filtrare l’entità Persona, che restituisce eventuali nomi che Amazon Comprehend può trovare nella storia del giornalista, con poche righe di codice:

def get_celebrities(payload):
    response = comprehend_client.detect_entities(
        Text=' '.join(payload["text_inputs"]),
        LanguageCode="en",
    )
    celebrities = ""
    for entity in response["Entities"]:
        if entity["Type"] == "PERSON":
            celebrities += entity["Text"] + " "
    return celebrities

In questo esempio, carichi un’immagine su Amazon Simple Storage Service (Amazon S3), che attiva un flusso di lavoro in cui stai estraendo metadati dall’immagine, inclusi etichette e eventuali celebrità. Quindi trasformi quei metadati estratti in un embedding e archivi tutti questi dati in OpenSearch Service.

Riassumi l’articolo e genera un embedding

Riassumere l’articolo è un passaggio importante per assicurarsi che l’embedding delle parole stia catturando i punti pertinenti dell’articolo e quindi restituisca immagini che risuonano con il tema dell’articolo.

Il modello di sintesi AI21 Labs è molto semplice da usare senza alcun input e solo poche righe di codice:

def summarise_article(payload):
    sagemaker_endpoint_summarise = os.environ["SAGEMAKER_ENDPOINT_SUMMARIZE"]
    response = ai21.Summarize.execute(
        source=payload,
        sourceType="TEXT",
        destination=ai21.SageMakerDestination(sagemaker_endpoint_summarise)
    )
    response_summary = response.summary 
    return response_summary

Quindi utilizzi il modello GPT-J per generare l’embedding

def get_vector(payload_summary):
    sagemaker_endpoint = os.environ["SAGEMAKER_ENDPOINT_VECTOR"]
    response = sm_runtime_client.invoke_endpoint(
        EndpointName=sagemaker_endpoint,
        ContentType="application/json",
        Body=json.dumps(payload_summary).encode("utf-8"),
    )
    response_body = json.loads((response["Body"].read()))
    return response_body["embedding"][0]

Quindi cerchi le tue immagini in OpenSearch Service

Di seguito è riportato un esempio di frammento di quella query:

def search_document_celeb_context(person_names, vector):
    results = wr.opensearch.search(
        client=os_client,
        index="images",
        search_body={
            "size": 10,
            "query": {
                "script_score": {
                    "query": {
                        "match": {"celebrities": person_names }
                    },
                    "script": {
                        "lang": "knn",
                        "source": "knn_score",
                        "params": {
                            "field": "image_vector",
                            "query_value": vector,
                            "space_type": "cosinesimil"
                        }
                    }
                }
            }
        },
    )
    return results.drop(columns=["image_vector"]).to_dict()

L’architettura contiene una semplice web app per rappresentare un sistema di gestione dei contenuti (CMS).

Per un esempio di articolo, abbiamo utilizzato il seguente input:

“Werner Vogels amava viaggiare in giro per il mondo nella sua Toyota. Vediamo la sua Toyota comparire in molte scene mentre guida per andare a incontrare vari clienti nelle loro città natali.”

Nessuna delle immagini ha metadata con la parola “Toyota”, ma le semantica della parola “Toyota” sono sinonime di auto e guida. Pertanto, con questo esempio, possiamo dimostrare come possiamo andare oltre la ricerca per parole chiave e restituire immagini semanticamente simili. Nella schermata sopra dell’interfaccia utente, la didascalia sotto l’immagine mostra i metadata estratti da Amazon Rekognition.

È possibile includere questa soluzione in un flusso di lavoro più ampio in cui si utilizzano i metadata già estratti dalle immagini per iniziare a utilizzare la ricerca vettoriale insieme ad altri termini chiave, come i nomi dei personaggi famosi, per restituire le migliori immagini e documenti in risonanza con la tua query di ricerca.

Conclusioni

In questo post, abbiamo mostrato come è possibile utilizzare Amazon Rekognition, Amazon Comprehend, SageMaker e OpenSearch Service per estrarre metadata dalle immagini e quindi utilizzare tecniche di apprendimento automatico per scoprirle automaticamente utilizzando la ricerca per celebrità e semantica. Questo è particolarmente importante nell’industria editoriale, dove la velocità è fondamentale per pubblicare rapidamente contenuti freschi su più piattaforme.

Per ulteriori informazioni su come lavorare con risorse multimediali, fare riferimento a Media intelligence è diventata più intelligente con Media2Cloud 3.0.