Transformadores de Visión (ViT) en Generación de Leyendas de Imágenes Utilizando Modelos ViT Preentrenados.

Using pretrained ViT models for Image Captioning with Vision Transformers (ViT).

Introducción

La generación de subtítulos de imagen utilizando modelos ViT pre-entrenados se puede ver como un texto o descripción escrita debajo de una imagen destinada a proporcionar una descripción de los detalles de la imagen. Es la tarea de traducir una imagen en una descripción textual. Se realiza conectando Visión (imagen) y Lenguaje (Texto). En este artículo, logramos esto utilizando Transformers de Visión (ViT) en imágenes como la tecnología principal utilizando el backend de PyTorch. El objetivo es mostrar una forma de emplear transformers, en particular ViTs, en la generación de subtítulos de imágenes, utilizando modelos entrenados sin necesidad de volver a entrenar desde cero.

Fuente: Springer

Con la tendencia actual de las plataformas de redes sociales y el uso en línea de imágenes, los beneficios de esta habilidad son numerosos y podrían hacerse por muchas razones, incluyendo la descripción, la cita, para ayudar a las personas con discapacidad visual e incluso la optimización de motores de búsqueda. Esto hace que aprender esta técnica sea muy útil para proyectos que involucren imágenes.

Objetivos de aprendizaje

  • La idea de la Generación de subtítulos de imagen
  • Utilizando ViTs para la generación de subtítulos de imagen
  • Realizar la generación de subtítulos de imagen con modelos pre-entrenados
  • Utilizar Transformers utilizando Python

Puede encontrar todo el código utilizado en este repositorio de GitHub.

Este artículo se publicó como parte del Data Science Blogathon.

¿Qué son los modelos Transformer?

Antes de ver Vit, comencemos con una comprensión de los Transformers. Desde la introducción de los transformers en 2017 por Google Brain, despertó interés en su capacidad en el procesamiento del lenguaje natural. Un transformer es un modelo de aprendizaje profundo distinguido por su adopción de autoatención, ponderando diferencialmente la importancia de cada parte de los datos de entrada. Y se ha utilizado principalmente en el procesamiento del lenguaje natural (NLP).

Los Transformers procesan datos de entrada secuenciales, como en el lenguaje natural, pero los transformers procesan toda la entrada de una sola vez. Con la ayuda del mecanismo de atención, hay un contexto para cualquier posición en la secuencia de entrada. Esta eficiencia permite una mayor paralelización y reduce los tiempos de entrenamiento mientras mejora la eficiencia.

Arquitectura Transformer

Ahora veamos la estructura arquitectónica de los Transformers. La arquitectura Transformer está compuesta principalmente por una estructura codificador-decodificador. La estructura codificador-decodificador de la arquitectura Transformer se presentó en un famoso artículo titulado “Attention Is All You Need”.

El codificador está compuesto por capas responsables de procesar iterativamente la entrada una capa después de otra, mientras que por otro lado, las capas del decodificador reciben la salida del codificador y generan una salida decodificada. En resumen, el codificador mapea la secuencia de entrada a una secuencia que luego se introduce en un decodificador. El decodificador luego genera una secuencia de salida.

¿Qué son los Transformers de Visión?

Dado que este artículo muestra un uso práctico de los ViTs en la generación de subtítulos de imágenes, es útil tener también una comprensión de cómo funcionan los ViTs. Los transformers de visión son un tipo de transformers que realizan tareas relacionadas con la visualización que incluyen imágenes. Son un transformer que también utiliza mecanismos de atención para encontrar las relaciones entre las imágenes de entrada. En este caso de uso, conectarán nuestra imagen con tokens o textos.

Fuente: Alexey et al. 2021

Implementando la generación de subtítulos de imagen

Con la comprensión de lo que son los transformers y cómo funcionan, pasemos a implementar nuestro modelo de generación de subtítulos de imagen. Comenzaremos instalando la biblioteca transformer y luego construiremos el modelo antes de usarlo para generar subtítulos de imágenes.

Antes de escribir los códigos, recordemos que estamos utilizando el modelo vit-gpt2-image-captioning entrenado para la generación de subtítulos de imágenes disponible en la biblioteca Hugging Face. La base de este modelo es un vision transformer.

Importación de bibliotecas requeridas

Lo primero es instalar la biblioteca Transformer, ya que aún no está preinstalada en Colab.

# Instalando bibliotecas Transformer

!pip install transformers

Ahora, podemos importar las bibliotecas.

# Manejador de enlaces web
import requests

# Backend
import torch

# Procesamiento de imágenes
from PIL import Image

# Transformer y modelo pre-entrenado
from transformers import VisionEncoderDecoderModel, ViTImageProcessor, GPT2TokenizerFast

# Manejo de carga de procesamiento
from tqdm import tqdm

# Asignar GPU disponible
device = "cuda" if torch.cuda.is_available() else "cpu"

Puede encontrar todo el código en este repositorio de GitHub.

# Cargando un modelo Transformer de subtítulos de imágenes afinado

# Modelo ViT Encoder-Decoder
model = VisionEncoderDecoderModel.from_pretrained("nlpconnect/vit-gpt2-image-captioning").to(device)

# Tokenizador correspondiente de ViT
tokenizer = GPT2TokenizerFast.from_pretrained("nlpconnect/vit-gpt2-image-captioning")

# Procesador de imágenes
image_processor = ViTImageProcessor.from_pretrained("nlpconnect/vit-gpt2-image-captioning")

Hemos introducido tres (3) modelos pre-entrenados de la clase transformers. Veamos sus funciones brevemente.

  • VisionEncoderDecoderModel: Esto ayuda a llevar a cabo la generación de texto a partir de imágenes con cualquier modelo de visión pre-entrenado utilizando un Transformers (como el codificador) como ViT (que usamos aquí) o modelos similares a BEiT que usan pre-entrenamiento auto-supervisado de Vision Transformers (ViTs) para superar el pre-entrenamiento supervisado junto con cualquier modelo de lenguaje pre-entrenado como el decodificador, como GPT2 (que también estamos usando aquí). Por lo tanto, en este enfoque, empleamos VisionEncoderDecoder como una aplicación para la generación de subtítulos de imágenes, usándolo para codificar la imagen y luego usar un modelo de lenguaje para generar los subtítulos.
  • GPT2TokenizerFast: Esto crea un tokenizador GPT-2 utilizando la biblioteca de tokenizadores de Hugging Face. Cargamos la biblioteca de tokenizadores en transformers. El tokenizador ya ha sido entrenado para manejar todas las características que requerimos para los subtítulos.
  • ViTImageProcessor: Por último, está el ViTImageProcessor. Ayuda a construir un procesador de imágenes ViT.

Preparando la imagen para capturar

Ahora necesitamos crear una función para cargar URL y procesar las imágenes que deseamos capturar.

# Accediendo a imágenes desde la web
import urllib.parse as parse
import os
# Verificar la URL
def check_url(string):
    try:
        result = parse.urlparse(string)
        return all([result.scheme, result.netloc, result.path])
    except:
        return False

# Cargar una imagen
def load_image(image_path):
    if check_url(image_path):
        return Image.open(requests.get(image_path, stream=True).raw)
    elif os.path.exists(image_path):
        return Image.open(image_path)

Acabamos de crear dos funciones para, primero verificar una URL y otra función para usar esa URL verificada para cargar la imagen para su captura.

Realizando inferencia en la imagen

La inferencia nos ayuda a llegar a una conclusión razonable sobre la imagen basada en sus características. Un enfoque es convertir la imagen en tensores usando PyTorch (como se usa aquí) o tratarla como píxeles. Para realizar nuestra inferencia, usamos el método general como se muestra a continuación para generar autoregresivamente el subtítulo.

# Inferencia de imagen
def get_caption(model, image_processor, tokenizer, image_path):
    image = load_image(image_path)
    
    # Preprocesando la imagen
    img = image_processor(image, return_tensors="pt").to(device)
    
    # Generando subtítulos
    output = model.generate(**img)
    
    # Decodificar la salida
    caption = tokenizer.batch_decode(output, skip_special_tokens=True)[0]
    
    return caption

Hemos utilizado decodificación codiciosa, que es la predeterminada. Otras opciones podrían incluir búsqueda de haz o muestreo multinomial. Puede experimentar con ellos y ver la diferencia.

Cargando y capturando imágenes

Por último, podemos cargar y capturar nuestras imágenes según sea necesario. Cargaremos varias imágenes y veremos cómo se realiza la captura. Tenga en cuenta que estas imágenes no son del conjunto de datos coco sino de fuentes en la web. Siéntase libre de usar sus propias imágenes como desee.

# Visualización de medios de imagen
from IPython.display import display

Ejemplo 1

# Carga de URLs
url = "https://images.pexels.com/photos/101667/pexels-photo-101667.jpeg?auto=compress&cs=tinysrgb&w=600"

# Mostrar imagen
display(load_image(url))

# Mostrar leyenda
get_caption(model, image_processor, tokenizer, url)
Fuente: Pexels

Leyenda:

un caballo negro corriendo por un campo cubierto de hierba

Ejemplo 2

# Carga de URLs
url = "https://images.pexels.com/photos/103123/pexels-photo-103123.jpeg?auto=compress&cs=tinysrgb&w=600"

# Mostrar imagen
display(load_image(url))

# Mostrar leyenda
get_caption(model, image_processor, tokenizer, url)
Fuente: Pexels

Leyenda:

un hombre parado en la cima de una colina con una montaña

Ejemplo 3

# Carga de URLs
url = "https://images.pexels.com/photos/406014/pexels-photo-406014.jpeg?auto=compress&cs=tinysrgb&w=600"

# Mostrar imagen
display(load_image(url))

# Mostrar leyenda
get_caption(model, image_processor, tokenizer, url)
Fuente: Pexels

Leyenda:

un perro con un largo hocico

Otras aplicaciones de los transformadores de visión

Antes de terminar, veamos algunos otros casos de uso de los transformadores de visión además de la generación de subtítulos de imagen:

  • Reconocimiento óptico de caracteres (OCR)
  • Detección/Clasificación de imágenes
  • Identificación de Deepfakes
  • Detección/Segmentación de anomalías
  • Segmentación y análisis de imágenes

Conclusión

Hemos llevado a cabo la generación de subtítulos de imagen utilizando la tecnología de los transformadores de visión (ViT) con un backend de PyTorch. Los ViT son modelos de aprendizaje profundo que procesan datos de entrada secuenciales y reducen los tiempos de entrenamiento. El uso de los modelos pre-entrenados VisionEncoderDecoderModel, GPT2TokenizerFast y ViTImageProcessor proporcionó una manera fácil de construir sin tener que hacerlo desde cero. También tienen la capacidad de superar el pre-entrenamiento supervisado y son adecuados para la generación de subtítulos de imagen.

Puntos clave

  • Pudimos ver la generación de subtítulos de imagen mediante la traducción de una imagen en una descripción textual utilizando modelos pre-entrenados de transformadores de visión (ViT) y un backend de PyTorch.
  • Los transformadores son modelos que procesan datos de entrada secuenciales utilizando la auto-atención, la paralelización y la reducción de los tiempos de entrenamiento.
  • Demostramos el uso práctico de los ViT en la generación de subtítulos de imagen, utilizando mecanismos de atención para conectar imágenes con textos.

Preguntas frecuentes (FAQs)

  • GitHub del proyecto: https://github.com/inuwamobarak/Image-captioning-ViT
  • Transformador de visión (ViT)Estamos en un viaje para avanzar y democratizar la inteligencia artificial a través del código abierto y la ciencia abierta.huggingface.co
  • OpenAI GPT2Estamos en un viaje para avanzar y democratizar la inteligencia artificial a través del código abierto y la ciencia abierta.huggingface.co
  • TokenizerEstamos en un viaje para avanzar y democratizar la inteligencia artificial a través del código abierto y la ciencia abierta.huggingface.co
  • Modelos de codificador-decodificador de visiónEstamos en un viaje para avanzar y democratizar la inteligencia artificial a través del código abierto y la ciencia abierta.huggingface.co
  • https://link.springer.com/chapter/10.1007/978-3-030-74478-6_7
  • https://en.wikipedia.org/wiki/Transformer_(machine_learning_model)
  • https://openreview.net/pdf?id=YicbFdNTTy

Los medios mostrados en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor.