Generazione di testo immagine-a-testo senza addestramento con BLIP-2

Generazione testo immagine-a-testo senza addestramento con BLIP-2.

Questa guida presenta BLIP-2 di Salesforce Research, che consente una serie di modelli di linguaggio visuale all’avanguardia ora disponibili in 🤗 Transformers. Ti mostreremo come utilizzarlo per la descrizione delle immagini, la descrizione delle immagini con suggerimento, la risposta alle domande visive e il suggerimento basato sulla chat.

Indice

  1. Introduzione
  2. Cosa si nasconde dietro BLIP-2?
  3. Utilizzo di BLIP-2 con Hugging Face Transformers
    1. Descrizione delle immagini
    2. Descrizione delle immagini con suggerimento
    3. Risposta alle domande visive
    4. Suggerimento basato sulla chat
  4. Conclusioni
  5. Riconoscimenti

Introduzione

Gli ultimi anni hanno visto rapidi progressi nella visione artificiale e nell’elaborazione del linguaggio naturale. Tuttavia, molti problemi del mondo reale sono intrinsecamente multimodali: coinvolgono diverse forme di dati, come immagini e testo. I modelli di linguaggio visuale affrontano la sfida di combinare le modalità in modo che possano aprire la porta a una vasta gamma di applicazioni. Alcuni dei compiti di traduzione immagine-testo che i modelli di linguaggio visuale possono affrontare includono la descrizione delle immagini, il recupero immagine-testo e la risposta alle domande visive. La descrizione delle immagini può aiutare le persone con problemi di vista, creare descrizioni utili dei prodotti, identificare contenuti inappropriati al di là del testo e altro ancora. Il recupero immagine-testo può essere utilizzato nella ricerca multimodale, nonché in applicazioni come la guida autonoma. La risposta alle domande visive può aiutare nell’istruzione, consentire chatbot multimodali e assistere in varie applicazioni di recupero delle informazioni specifiche del dominio.

I modelli di visione artificiale e linguaggio naturale moderni sono diventati più capaci; tuttavia, sono anche significativamente cresciuti in dimensioni rispetto ai loro predecessori. Mentre pre-addestrare un modello monomodale richiede risorse e costi elevati, il costo del pre-addestramento di una visione e linguaggio end-to-end è diventato sempre più proibitivo. BLIP-2 affronta questa sfida introducendo un nuovo paradigma di pre-addestramento di visione e linguaggio visuale che può potenzialmente sfruttare qualsiasi combinazione di codificatore di visione pre-addestrato e LLM senza dover pre-addestrare l’intera architettura end-to-end. Ciò consente di ottenere risultati all’avanguardia su diversi compiti di visione e linguaggio riducendo significativamente il numero di parametri addestrabili e i costi di pre-addestramento. Inoltre, questo approccio apre la strada a un modello multimodale simile a ChatGPT.

Cosa si nasconde dietro BLIP-2?

BLIP-2 colma il divario tra i modelli di visione e linguaggio aggiungendo un Querying Transformer leggero (Q-Former) tra un codificatore di immagini pre-addestrato congelato e un grande modello di linguaggio congelato. Q-Former è l’unico componente addestrabile di BLIP-2; sia il codificatore di immagini che il modello di linguaggio rimangono congelati.

Q-Former è un modello di trasformazione che consiste in due sotto-moduli che condividono gli stessi livelli di auto-attenzione:

  • un trasformatore di immagini che interagisce con il codificatore di immagini congelato per l’estrazione delle caratteristiche visive
  • un trasformatore di testo che può funzionare sia come codificatore di testo che come decodificatore di testo

Il trasformatore di immagini estrae un numero fisso di caratteristiche di output dal codificatore di immagini, indipendentemente dalla risoluzione dell’immagine di input, e riceve incorporamenti di query apprendibili come input. Le query possono interagire anche con il testo attraverso gli stessi livelli di auto-attenzione.

Q-Former è pre-addestrato in due fasi. Nella prima fase, il codificatore di immagini è congelato e Q-Former viene addestrato con tre perdite:

  • Perdita contrastiva immagine-testo: viene calcolata la similarità pairwise tra ogni uscita di query e il token CLS dell’uscita di testo, e viene selezionata la più alta. Gli incorporamenti di query e il testo non si “vedono” l’un l’altro.
  • Generazione di testo basato sull’immagine: le query possono fare riferimento l’una all’altra ma non ai token di testo, e il testo ha una maschera causale e può fare riferimento a tutte le query.
  • Perdita di corrispondenza immagine-testo: le query e il testo possono vedere gli altri, e si ottiene un logit per indicare se il testo corrisponde o meno all’immagine. Per ottenere esempi negativi, viene utilizzato il mining negativo.

Nella seconda fase di pre-addestramento, gli incorporamenti di query hanno ora le informazioni visive rilevanti per il testo poiché sono passati attraverso un collo di bottiglia di informazioni. Questi incorporamenti vengono ora utilizzati come prefisso visuale per l’input al LLM. Questa fase di pre-addestramento coinvolge efficacemente un compito di generazione di testo basato sull’immagine utilizzando la perdita di LM causale.

Come codificatore visivo, BLIP-2 utilizza ViT, e per un LLM, gli autori del paper hanno utilizzato i modelli OPT e Flan T5. È possibile trovare i checkpoint pre-addestrati sia per OPT che per Flan T5 su Hugging Face Hub. Tuttavia, come già accennato, l’approccio di pre-addestramento introdotto consente di combinare qualsiasi struttura visiva con qualsiasi LLM.

Utilizzo di BLIP-2 con Hugging Face Transformers

Utilizzando Hugging Face Transformers, è possibile scaricare e eseguire facilmente un modello BLIP-2 pre-addestrato sulle immagini. Assicurati di utilizzare un ambiente GPU con una grande quantità di RAM se desideri seguire gli esempi in questo post del blog.

Iniziamo installando Transformers. Poiché questo modello è stato aggiunto a Transformers molto di recente, è necessario installare Transformers dalla sorgente:

pip install git+https://github.com/huggingface/transformers.git

Successivamente, avremo bisogno di un’immagine di input. Ogni settimana, The New Yorker organizza un concorso di didascalie per cartoni animati tra i suoi lettori, quindi prendiamo uno di questi cartoni animati per mettere alla prova BLIP-2.

import requests
from PIL import Image

url = 'https://media.newyorker.com/cartoons/63dc6847be24a6a76d90eb99/master/w_1160,c_limit/230213_a26611_838.jpg'
image = Image.open(requests.get(url, stream=True).raw).convert('RGB')  
display(image.resize((596, 437)))

Abbiamo un’immagine di input. Ora abbiamo bisogno di un modello BLIP-2 pre-addestrato e del preprocessore corrispondente per preparare gli input. Puoi trovare l’elenco di tutti i checkpoint pre-addestrati disponibili su Hugging Face Hub. Qui, caricheremo un checkpoint BLIP-2 che sfrutta il modello OPT pre-addestrato di Meta AI, che ha 2,7 miliardi di parametri.

from transformers import AutoProcessor, Blip2ForConditionalGeneration
import torch

processor = AutoProcessor.from_pretrained("Salesforce/blip2-opt-2.7b")
model = Blip2ForConditionalGeneration.from_pretrained("Salesforce/blip2-opt-2.7b", torch_dtype=torch.float16)

Nota che BLIP-2 è un caso raro in cui non puoi caricare il modello con l’API Auto (ad esempio AutoModelForXXX) e devi utilizzare esplicitamente Blip2ForConditionalGeneration. Tuttavia, puoi utilizzare AutoProcessor per ottenere la classe di preprocessore appropriata – Blip2Processor in questo caso.

Utilizziamo la GPU per rendere la generazione del testo più veloce:

device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)

Descrizione dell’immagine

Scopriamo se BLIP-2 può descrivere un cartone animato del New Yorker in modo zero-shot. Per descrivere un’immagine, non è necessario fornire alcun prompt di testo al modello, solo l’immagine di input preelaborata. Senza alcun prompt di testo, il modello inizierà a generare testo dal token BOS (inizio della sequenza) creando così una descrizione.

inputs = processor(image, return_tensors="pt").to(device, torch.float16)

generated_ids = model.generate(**inputs, max_new_tokens=20)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0].strip()
print(generated_text)

"due mostri dei cartoni animati seduti attorno a un falò"

Questa è una descrizione sorprendentemente accurata per un modello che non è stato addestrato su cartoni animati in stile New Yorker!

Descrizione dell’immagine con prompt

Possiamo estendere la descrizione dell’immagine fornendo un prompt di testo, che il modello continuerà a completare dato l’immagine.

prompt = "questo è un cartone animato di"

inputs = processor(image, text=prompt, return_tensors="pt").to(device, torch.float16)

generated_ids = model.generate(**inputs, max_new_tokens=20)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0].strip()
print(generated_text)

"due mostri seduti attorno a un falò"

prompt = "sembrano divertirsi"

inputs = processor(image, text=prompt, return_tensors="pt").to(device, torch.float16)

generated_ids = model.generate(**inputs, max_new_tokens=20)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0].strip()
print(generated_text)

"molto"

Risposta alle domande visive

Per la risposta alle domande visive, il prompt deve seguire un formato specifico: “Domanda: {} Risposta:”

prompt = "Domanda: Cosa tiene un dinosauro? Risposta:"

inputs = processor(image, text=prompt, return_tensors="pt").to(device, torch.float16)

generated_ids = model.generate(**inputs, max_new_tokens=10)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0].strip()
print(generated_text)

"Una torcia"

Prompting basato su chat

Infine, possiamo creare un’interfaccia simile a ChatGPT concatenando ogni risposta generata alla conversazione. Chiediamo al modello un testo (come “Cosa tiene un dinosauro?”), il modello genera una risposta (“una torcia”), che possiamo concatenare alla conversazione. Ripetiamo questo processo, costruendo il contesto. Tuttavia, assicuriamoci che il contesto non superi i 512 token, poiché questa è la lunghezza del contesto dei modelli linguistici utilizzati da BLIP-2 (OPT e T5).

context = [
   ("Cosa tiene un dinosauro?", "una torcia"),
   ("Dove sono?", "Nel bosco.")
]
domanda = "Per cosa?"
template = "Domanda: {} Risposta: {}."

prompt = " ".join([template.format(context[i][0], context[i][1]) for i in range(len(context))]) + " Domanda: " + domanda + " Risposta:"

print(prompt)

Domanda: Cosa tiene un dinosauro? Risposta: una torcia. Domanda: Dove sono? Risposta: Nel bosco.. Domanda: Per cosa? Risposta:

inputs = processor(image, text=prompt, return_tensors="pt").to(device, torch.float16)

generated_ids = model.generate(**inputs, max_new_tokens=10)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0].strip()
print(generated_text)

Per accendere un fuoco.

Conclusioni

BLIP-2 è un modello visivo-linguaggio a zero-shot che può essere utilizzato per molteplici compiti di trasformazione immagine-testo con prompt basati su immagini e immagini e testo. È un approccio efficace ed efficiente che può essere applicato alla comprensione delle immagini in numerosi scenari, specialmente quando gli esempi sono scarsi.

Il modello colma il divario tra le modalità di visione e di linguaggio naturale aggiungendo un trasformatore tra i modelli pre-addestrati. Il nuovo paradigma di pre-addestramento consente a questo modello di tenere il passo con gli avanzamenti nelle singole modalità.

Se desideri imparare come addestrare i modelli BLIP-2 per vari compiti di visione-linguaggio, dai un’occhiata alla libreria LAVIS di Salesforce, che offre un supporto completo per l’addestramento dei modelli.

Per vedere BLIP-2 in azione, prova la sua demo su Hugging Face Spaces.

Ringraziamenti

Molte grazie al team di ricerca di Salesforce per il lavoro su BLIP-2, a Niels Rogge per aver aggiunto BLIP-2 a 🤗 Transformers e a Omar Sanseviero per la revisione di questo post sul blog.