Abrir en Google Colab Descargar notebook

BLIP (Bootstrapping Language-Image Pre-training)

La arquitectura BLIP combina varios componentes que hemos visto anteriormente:

  • Vision Transformer (ViT)

  • Text Encoder: Similar al que vimos con la arquitectura de BERT, codifica el texto para el modelo.

  • Image-Grounded Text Encoder: Este componente particularmente es nuevo en este curso, aunque su idea es simple. Combina la información del texto con la información de la imagen dentro del espacio de embeddings, generando asi una representación latente multimodal.

  • Image-Grounded Text Decoder: Se trata del componente homologo al encoder anterior. Este decoder es entrenado via una función de perdida de cross-entropy de forma autoregresiva para resolver tareas de generación de texto como podria ser generación de subtitulos o generación de texto como respuestas a preguntas (visual-question answering).

En este ejemplo, veremos como utilizar estos componentes para realizar tareas de vision-question answering.

Preparación del ambiente

Instalemos las librerias necesarias:

[ ]:
%pip install -U transformers datasets evaluate --quiet

Recordar reiniciar la sessión si se encuentra trabajando en Google Colab.

Utilizando el modelo BLIP

Para comenzar, descargaremos el modelos preentrenado de BLIP desde HuggingFace. Este modelo fue propuesto por la empresa Salesforce.

[ ]:
import torch
from transformers import BlipForConditionalGeneration

model = BlipForConditionalGeneration.from_pretrained(
    "Salesforce/blip-image-captioning-base", torch_dtype=torch.float16
  ).to("cuda")

Como vimos anteriormente, descargamos el modelo y el procesador de imagenes y texto asociado al mismo. Recuerde que estos objetos en la libraría transformers nos permiten realizar el mismo procesamiento sobre las imagenes de entrada que se realizó sobre el modelo en cuestión.

[ ]:
from transformers import  BlipProcessor

processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-base")

Aplicando BLIP para taras de visual question-answering

Utilicemos una imagen de ejemplo:

[ ]:
from google.colab import files
from PIL import Image
from pprint import pprint

uploaded = files.upload()

for fn in uploaded.keys():
  try:
    img = Image.open(fn)
  except Exception as e:
    print(f'Error al cargar la imagen: {e}')
Upload widget is only available when the cell has been executed in the current browser session. Please rerun this cell to enable.
Saving 000000039769.jpg to 000000039769 (4).jpg
[ ]:
img
../../_images/vision_multimodal_blip_11_0.png

CLIP es un modelo capaz de computar la similaridad pares de textos e imagenes. Utilicemos el modelo para procesar pares de textos con una determinada imagen y ver cual de ellos se encuentra mas cercano:

[ ]:
prompt = "Question: How many remotes are there? Answer:"
inputs = processor(images=img, text=prompt, return_tensors="pt")

Una vez que preprocesamos nuestras entradas, podemos ejecutar el modelo:

[ ]:
with torch.no_grad():
  outputs = model.generate(**inputs)

Utilicemos ahore el componente de decoding para generar texto a partir de la salida del modelo.

[ ]:
generation = processor.tokenizer.batch_decode(outputs, skip_special_tokens=True)
print(generation)