Utilizza Llama 3.2-90b-vision-instruct per query AI multimodali in Python con watsonx

In questo tutorial, scoprirai come applicare il modello Meta Llama 3.2-90b-vision-instruct, ora disponibile su watsonx.ai, a compiti di computer vision come la didascalia delle immagini e la risposta visiva a domande.

Panoramica dell'AI multimodale

Modelli di AI multimodale contro modelli unimodali

Molti di noi conoscono le applicazioni di AI unimodali, di cui un esempio molto popolare è ChatGPT. I chatbot come ChatGPT utilizzano l'elaborazione del linguaggio naturale (NLP) per comprendere le domande degli utenti e automatizzare le risposte in tempo reale. Il tipo di input a cui possono essere applicati questi modelli linguistici di grandi dimensioni (LLM) unimodali è limitato al testo.

L'intelligenza artificiale (AI) multimodale si basa su modelli di apprendimento automatico costruiti su reti neurali. Queste reti neurali sono in grado di elaborare e integrare informazioni provenienti da più tipi di dati utilizzando tecniche complesse di deep learning. Queste diverse modalità prodotte dal modello di AI generativa, talvolta chiamate modelli di gen AI, possono includere testo, immagini, video e audio input.

I sistemi di AI multimodali hanno molti casi d'uso reali che vanno dalla diagnosi di immagini mediche in contesti sanitari tramite la computer vision al riconoscimento vocale nelle applicazioni di traduzione. Questi progressi della tecnologia AI possono ottimizzare vari ambiti. Il vantaggio principale delle architetture multimodali è la capacità di elaborare diversi tipi di dati.

AI multimodale: come funziona

L'AI multimodale comprende tre elementi:

Modulo di input

Il modulo input è costruito su più reti neurali per la pre-elaborazione di diversi tipi di dati. Qui, i dati sono preparati per gli algoritmi di machine learning eseguiti nel modulo fusion.

Modulo fusion

In questo modulo avviene la combinazione, l'allineamento e l'elaborazione dei dati. Il processo di fusione avviene per ogni modalità di dati. In questo modulo sono comunemente utilizzate diverse tecniche. Un esempio è la fusione precoce, dove i dati non elaborati di tutti i tipi di input vengono combinati. La fusione intermedia avviene invece quando i dati di diverse modalità vengono codificati in diverse fasi di pre-elaborazione. Infine, la fusione tardiva consolida i dati dopo che vengono elaborati nel modulo di input da diversi modelli corrispondenti a ciascuna modalità.

Modulo di output

Il modulo di output genera risultati nel formato di output desiderato dando senso ai dati prodotti nel modulo di fusione. Questi output possono assumere varie forme, come testo, immagine o una combinazione di formati.

Passaggi

Consulta questo video di IBM Technology su YouTube che ti guida attraverso le seguenti istruzioni di configurazione nei passaggi 1 e 2.

Passaggio 1. Configurare il tuo ambiente

Sebbene sia possibile scegliere tra diversi strumenti, questo tutorial è più adatto a un Jupyter Notebook. I Jupyter Notebook sono ampiamente utilizzati nella data science per combinare codice con varie fonti di dati come testo, immagini e visualizzazioni dei dati.

Questo tutorial spiega come configurare un account IBM per utilizzare un Jupyter Notebook.

  1. Accedi a watsonx.ai usando il tuo account IBM Cloud.

  2. Crea un progetto watsonx.ai.

    Puoi ottenere l'ID del tuo progetto dall'interno del tuo progetto. Clicca sulla scheda Gestisci. Quindi, copia l'ID del progetto dalla sezione Dettagli della pagina Generali. Per questo tutorial ti serve questo ID.

  3. Crea un Jupyter Notebook.

    Questo passaggio aprirà un ambiente notebook in cui potrai copiare il codice da questo tutorial per implementare autonomamente la regolazione del prompt. In alternativa, puoi scaricare questo notebook sul tuo sistema locale e caricarlo nel tuo progetto watsonx.ai come asset. Questo Jupyter Notebook insieme ai set di dati utilizzati sono disponibili su GitHub.

    Per evitare conflitti di dipendenza tra pacchetti Python, consigliamo di impostare un ambiente virtuale.

Passaggio 2: configura un'istanza di watsonx.ai Runtime e una chiave API

Per questo tutorial, suggeriamo di utilizzare il modello Meta 3.2-90b-vision-instruct con watsonx.ai per ottenere risultati simili. Puoi usare qualsiasi modello AI che supporti l'apprendimento multimodale a tua scelta. Ci sono diversi modelli AI tra cui scegliere, tra cui GPT-4 V(ision) e DALL-E 3 di OpenAI, nonché Gemini di Google. Assicurati di utilizzare l'API appropriata se lavori con altri modelli, poiché questo tutorial è pensato per watsonx.ai.

  1. Crea un'istanza di servizio watsonx.ai Runtime (seleziona l'area geografica appropriata e scegli il piano Lite, che è un'istanza gratuita).

  2. Genera una chiave API.

  3. Associa l'istanza del servizio watsonx.ai Runtime al progetto che hai creato in watsonx.ai.

Passaggio 3. Installare e importare le librerie pertinenti e configurare le tue credenziali

Abbiamo bisogno di alcune librerie e moduli per questo tutorial. Assicurati di importare le seguenti e, se non sono installate, puoi risolvere il problema con una rapida installazione pip.

#installations
%pip install image | tail -n 1
%pip install -U "ibm_watsonx_ai>=1.1.14" | tail -n 1
%pip install python-dotenv | tail -n 1 #imports
import requests
import base64
import os

from PIL import Image
from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai.foundation_models import ModelInference
from dotenv import load_dotenv
load_dotenv(os.getcwd()+"/.env", override=True)

Per impostare le nostre credenziali, abbiamo bisogno della Watsonx WATSONX_APIKEY  e WATSONX_PROJECT_ID che hai generato nel passaggio 1. Puoi memorizzarle in un file .env nella directory oppure sostituire il testo segnaposto. Configureremo anche l'URL che fungerà da endpoint API.

WATSONX_APIKEY = os.getenv('WATSONX_APIKEY', "<YOUR_WATSONX_APIKEY_HERE>")
WATSONX_PROJECT_ID = os.getenv('WATSONX_PROJECT_ID', "<YOUR_WATSONX_PROJECT_ID_HERE>")
URL = "https://us-south.ml.cloud.ibm.com"

Possiamo utilizzare la classe Credenziali per incapsulare le credenziali passate.

credentials = Credentials(
    url=URL,
    api_key=WATSONX_APIKEY
)

Passaggio 4. Codificare le immagini

In questo tutorial lavoreremo con diverse immagini per applicazioni AI multimodali, come la didascalia delle immagini e il rilevamento degli oggetti. È possibile accedere alle immagini che utilizzeremo tramite i seguenti URL. Possiamo memorizzare questi URL in un elenco per codificarli in modo iterativo.

url_image_1 = 'https://assets.ibm.com/it-it/is/image/ibm/hv6b0935?$original$'
url_image_2 = 'https://assets.ibm.com/it-it/is/image/ibm/c30a2d57-a62b-4bb3-818895bfe2fc7bf8?$original$'
url_image_3 = 'https://assets.ibm.com/it-it/is/image/ibm/nt170969?$original$'
url_image_4 = 'https://assets.ibm.com/it-it/is/image/ibm/fb123b45-6530-4dd9-a758-10a7ec234d9d?$original$'

image_urls = [url_image_1, url_image_2, url_image_3, url_image_4]

Per comprendere meglio i nostri dati di input, mostriamo le immagini.

for idx, url in enumerate(image_urls):
    print(f'url_image_{idx}')
    display(Image.open(requests.get(url, stream=True).raw))

Output

url_image_0

Fotografia di New York

url_image_1

Donna che corre

url_image_2

Fattoria allagata dal fiume Mississippi

url_image_3

Un'etichetta nutrizionale

Per codificare queste immagini in modo digeribile per l'LLM, codificheremo le immagini in byte che poi decodificheremo in rappresentazione UTF-8.

encoded_images = []

for url in image_urls:
    encoded_images.append(base64.b64encode(requests.get(url).content).decode("utf-8"))

Passaggio 5. Configura la richiesta API e l'LLM

Ora che le nostre immagini possono essere passate al LLM, configuriamo una funzione per le chiamate API Watsonx. La funzione augment_api_request_body prende la query utente e l'immagine come parametri e completa il corpo della richiesta API. Utilizzeremo questa funzione in ogni iterazione.

def augment_api_request_body(user_query, image):
    messages = [
        {
            "role": "user",
            "content": [{
                "type": "text",
                "text": "Sei un assistente disponibile. Rispondi alla seguente domanda dell'utente in 1 o 2 frasi: " + user_query
            },
            {
                "type": "image_url",
                "image_url": {
                "url": f"data:image/jpeg;base64,{image}",
                }
            }]
        }
    ]

    return messages

Istanziamo l'interfaccia del modello usando la classe theModelInference. In questo tutorial utilizzeremo il modello themeta-llama/llama-3-2-90b-vision-instruct.

model = ModelInference(
    model_id="meta-llama/llama-3-2-90b-vision-instruct",
    credentials=credentials,
    project_id=WATSONX_PROJECT_ID,
    params={
        "max_tokens": 200
    }
)

Passaggio 6. Acquisizione delle immagini

Ora possiamo scorrere le nostre immagini per vedere le descrizioni di testo prodotte dal modello in risposta alla domanda "Cosa sta succedendo in questa immagine?"

for i in range(len(encoded_images)):
    image = encoded_images[i]
    user_query = "What is happening in this image?"
    messages = augment_api_request_body(user_query, image)
    response = model.chat(messages=messages)
    print(response['choices'][0]['message']['content'])

Output

Questa immagine mostra una strada cittadina trafficata, con edifici alti e automobili, e persone che camminano sul marciapiede. La strada è piena di semafori, alberi e segnali stradali e diverse persone attraversano la strada a un incrocio.
L'immagine ritrae una donna in abbigliamento sportivo che corre per strada, con un edificio e un'auto visibili sullo sfondo. La donna indossa una felpa gialla con cappuccio, leggings neri e scarpe da ginnastica e sembra impegnata nella corsa o nel jogging.
L'immagine raffigura un'area allagata, con acqua che copre il terreno e gli edifici circostanti. L'alluvione sembra essere grave, con il livello dell'acqua che raggiunge i tetti di alcune strutture.
**Descrizione dell'immagine**

* L'immagine mostra un primo piano di un'etichetta nutrizionale, con un dito che la indica.
* L'etichetta fornisce informazioni dettagliate sul contenuto nutrizionale di un alimento specifico, tra cui:
        + Calorie
        + Grassi
        + Sodio
        + Carboidrati
        + Altre informazioni rilevanti
        * L'etichetta è mostrata su uno sfondo bianco con testo nero, rendendola facile da leggere e comprendere.

Il modello Llama 3.2-90b-vision-instruct è stato in grado di acquisire con successo ogni immagine con un livello di dettaglio significativo.

Passaggio 7. Rilevamento degli oggetti

Ora che abbiamo dimostrato la capacità del modello di eseguire la conversione da immagine a testo nel passaggio precedente, poniamo al modello alcune domande che richiedono rilevamento. Per quanto riguarda la seconda immagine, quella che raffigura la donna che corre all'aperto, chiederemo alla modella: "Quante auto ci sono in questa immagine?"

image = encoded_images[1]
user_query = "How many cars are in this image?"
messages = augment_api_request_body(user_query, image)
response = model.chat(messages=messages)
print(response['choices'][0]['message']['content'])

Output: C'è un'auto in questa immagine. L'auto è parcheggiata sulla strada, a destra dell'edificio.

Il modello ha identificato correttamente l'unico veicolo presente nell'immagine. Ora, chiediamo informazioni sui danni rappresentati nell'immagine delle inondazioni.

image = encoded_images[2]
user_query = "How severe is the damage in this image?"
messages = augment_api_request_body(user_query, image)
response = model.chat(messages=messages)
print(response['choices'][0]['message']['content'])

Output: i danni in questa immagine sono gravi: le acque alluvionali coprono una porzione significativa del terreno e, potenzialmente, causano danni estesi alle strutture e alle colture. Il livello dell'acqua sembra essere profondo almeno fino alla vita, il che potrebbe portare a perdite significative per i proprietari di immobili e gli agricoltori della zona.

Questa risposta evidenzia il valore che l'AI multimodale ha per ambiti come l'assicurazione. Il modello è stato in grado di rilevare la gravità del danno causato alla casa allagata. Questo potrebbe essere uno strumento potente per migliorare i tempi di elaborazione delle richieste assicurative.

A seguire, chiediamo al modello quanta quantità di sodio c'è nell'immagine dell'etichetta nutrizionale.

image = encoded_images[3]
user_query = "How much sodium is in this product?"
request_body = augment_api_request_body(user_query, image)
messages = augment_api_request_body(user_query, image)
response = model.chat(messages=messages)
print(response['choices'][0]['message']['content'])

Output: **Contenuto di sodio:** 640 milligrammi (mg)

Fantastico! Il modello era in grado di individuare oggetti all'interno delle immagini a seguito delle richieste degli utenti. Ti invitiamo a provare altre query per dimostrare ulteriormente le prestazioni del modello.

Riepilogo

In questo tutorial, hai utilizzato il modello Llama 3.2-90b-vision-instruct per eseguire operazioni multimodali, tra cui la didascalia delle immagini e la risposta visiva alle domande. Per altri casi d'uso di questo modello, ti invitiamo a consultare la pagina ufficiale della documentazione. Lì troverai maggiori informazioni sui parametri e le funzionalità del modello. L'output Python è importante perché mostra la capacità del sistema multimodale di estrarre informazioni da dati multimodali.

Soluzioni correlate
IBM watsonx.ai

Addestra, convalida, adatta e implementa le funzionalità di AI generativa, foundation model e machine learning con IBM watsonx.ai, uno studio aziendale di nuova generazione per builder AI. Crea applicazioni AI in tempi ridotti e con una minima quantità di dati.

Scopri watsonx.ai
Soluzioni di intelligenza artificiale

Metti l'AI al servizio della tua azienda grazie all'esperienza leader di settore e alla gamma di soluzioni di IBM nel campo dell'AI.

Esplora le soluzioni AI
Servizi AI

Reinventa i flussi di lavoro e le operazioni critiche aggiungendo l'AI per massimizzare le esperienze, il processo decisionale in tempo reale e il valore di business.

Esplora i servizi AI
Fai il passo successivo

Ottieni l'accesso completo a funzionalità che coprono l'intero ciclo di vita dello sviluppo dell'AI. Crea soluzioni AI all'avanguardia con interfacce intuitive, workflow e accesso alle API e agli SDK standard di settore.

Esplora watsonx.ai Prenota una demo live