Press "Enter" to skip to content

使用预训练的ViT模型在图像字幕中使用Vision Transformers(ViT)

介绍

使用预训练的ViT模型进行图像描述可以看作是一种文本或书面描述,位于图像下方,旨在提供对图像细节的描述。它是将图像转换为文本描述的任务。通过连接视觉(图像)和语言(文本)来完成。在本文中,我们使用PyTorch后端,使用视觉变换器(ViT)作为主要技术,在图像中实现了这一目标。目标是展示一种使用转换器,特别是ViTs,利用经过训练的模型生成图像标题的方法,而无需从头开始重新训练。

来源:Springer

随着社交媒体平台和在线图片使用的当前趋势,掌握这种技能的好处很多,可以出于多种原因进行描述、引用、帮助视力受损者,甚至是搜索引擎优化。这使得学习这种技术对涉及图像的项目非常有用。

学习目标

  • 图像描述的概念
  • 使用ViTs进行图像捕捉
  • 使用预训练模型进行图像描述
  • 使用Python利用转换器

您可以在此GitHub仓库中找到使用的全部代码。

本文是数据科学博客马拉松的一部分。

什么是Transformer模型?

在我们研究ViT之前,让我们先了解一下Transformer。自从Google Brain于2017年引入transformers以来,它引起了人们对其在NLP方面的能力的兴趣。Transformer是一种深度学习模型,其特点是采用自我关注,不同地加权输入数据的每个部分的重要性。并且主要用于自然语言处理(NLP)领域。

Transformer处理序列输入数据,例如自然语言,但transformer一次处理整个输入。借助注意机制,任何输入序列的位置都有上下文。这种效率允许更多的并行化,减少训练时间,同时提高效率。

Transformer体系结构

现在让我们看一下transformers的体系结构组成。Transformer体系结构主要由编码器-解码器结构组成。Transformer体系结构的编码器-解码器结构在一篇著名的论文中被提出,标题为“Attention Is All You Need”。

使用预训练的ViT模型在图像字幕中使用Vision Transformers(ViT) 机器学习 第2张

编码器由层组成,负责逐层处理输入,而解码器层接收编码器输出并生成解码输出。简单地说,编码器将输入序列映射到序列,然后将其馈送到解码器。解码器然后生成一个输出序列。

什么是Vision Transformers?

由于本文展示了ViTs在图像描述中的实际用途,因此也有必要了解ViTs的工作原理。Vision transformers是一种transformer,用于执行与图像相关的任务,包括图像。它们是一种变压器,也使用注意机制来查找输入图像之间的关系。在这种用例中,它们将我们的图像与令牌或文本连接起来。

来源:Alexey et al. 2021

实现图像描述

了解转换器是什么以及它们如何工作之后,让我们继续实现我们的图像描述模型。我们将从安装转换器库开始,然后构建模型,最后使用我们的模型生成图像标题。

使用预训练的ViT模型在图像字幕中使用Vision Transformers(ViT) 机器学习 第4张

在编写代码之前,让我们先想一想,我们实际上是使用了 Hugging Face 库提供的 vit-gpt2-image-captioning 模型进行图像字幕生成的训练。该模型的骨干是一个视觉转换器。

导入所需库

第一件事是安装 Transformer 库,因为它还没有在 Colab 中预安装。

# 安装 Transformer 库

!pip install transformers

现在,我们可以导入库。

# Web links Handler
import requests

# Backend
import torch

# Image Processing
from PIL import Image

# Transformer and pre-trained Model
from transformers import VisionEncoderDecoderModel, ViTImageProcessor, GPT2TokenizerFast

# Managing loading processing
from tqdm import tqdm

# 分配可用 GPU
device = "cuda" if torch.cuda.is_available() else "cpu"

您可以在此 GitHub 存储库中找到完整的代码。

# 加载微调的图像字幕 Transformer 模型

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

# 对应的 ViT Tokenizer
tokenizer = GPT2TokenizerFast.from_pretrained("nlpconnect/vit-gpt2-image-captioning")

# 图像处理器
image_processor = ViTImageProcessor.from_pretrained("nlpconnect/vit-gpt2-image-captioning")

我们介绍了 Transformers 类中的三个预训练模型。让我们简要地看一下它们的功能。

  • VisionEncoderDecoderModel :这有助于使用 Transformers(作为编码器)对任何预训练视觉模型(如我们在这里使用的 ViT 或使用自监督预训练的 Vision Transformers(ViTs)来超越监督预训练,并使用任何预训练语言模型(如我们在这里使用的 GPT2)作为解码器,从而进行图像到文本生成。因此,在这种方法中,我们使用 VisionEncoderDecoder 作为图像字幕应用程序,使用它来对图像进行编码,然后使用语言模型生成字幕。
  • GPT2TokenizerFast :这使用 Hugging Face tokenizers 库创建 GPT-2 tokenizer。我们将 tokenizer 库加载到 transformers 中。该 tokenizer 已经经过训练,可以处理我们需要进行字幕处理的所有功能。
  • ViTImageProcessor :最后是 ViTImageProcessor。它有助于构建 ViT 图像处理器。

准备捕获图像

现在,我们需要创建一个函数来加载 URL 并处理我们想要捕获的图像。

# Accesssing images from the web
import urllib.parse as parse
import os
# Verify url
def check_url(string):
    try:
        result = parse.urlparse(string)
        return all([result.scheme, result.netloc, result.path])
    except:
        return False

# Load an image
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)

因此,我们刚刚创建了两个函数,第一个用于验证 URL,另一个函数用于使用已验证的 URL 加载图像以进行捕获。

对图像进行推断

推断有助于根据图像的特征得出合理的结论。一种方法是使用 PyTorch(如此处所用)将图像转换为张量,或者将其视为像素进行处理。为了进行推断,我们使用下面显示的通用方法,以自回归方式生成字幕。

# Image inference
def get_caption(model, image_processor, tokenizer, image_path):
    image = load_image(image_path)
    
    # Preprocessing the Image
    img = image_processor(image, return_tensors="pt").to(device)
    
    # Generating captions
    output = model.generate(**img)
    
    # decode the output
    caption = tokenizer.batch_decode(output, skip_special_tokens=True)[0]
    
    return caption

我们使用了默认的 greedy decoding。其他选项可能包括 beam search 或 multinomial sampling。您可以尝试它们并查看差异。

加载和捕获图像

最后,我们可以根据需要加载和捕获我们的图像。我们将加载一些图像并查看捕获的效果。请注意,这些图像不是来自coco数据集,而是来自网络上的其他来源。随意使用您想要的图像。

#  Image media display
from IPython.display import display

示例1

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

# 显示图像
display(load_image(url))

# 显示标题
get_caption(model, image_processor, tokenizer, url)
来源:Pexels

标题:

一匹黑马在草地上奔跑

示例2

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

# 显示图像
display(load_image(url))

# 显示标题
get_caption(model, image_processor, tokenizer, url)
来源:Pexels

标题:

一个站在山顶上的男人

示例3

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

# 显示图像
display(load_image(url))

# 显示标题
get_caption(model, image_processor, tokenizer, url)
来源:Pexels

标题:

一只长鼻子的狗

Vision Transformers的其他应用

在我们结束之前,让我们看一些Vision Transformers的其他用例,除了图像字幕化之外:

  • 光学字符识别(OCR)
  • 图像检测/分类
  • Deepfake识别
  • 异常检测/分割
  • 图像分割和分析

结论

我们使用PyTorch后端的Vision Transformers(ViT)技术进行了图像字幕化。ViTs是深度学习模型,可以处理序列输入数据并减少训练时间。使用预训练模型VisionEncoderDecoderModel、GPT2TokenizerFast和ViTImageProcessor,提供了一种不需要从头开始构建的简单方法。它们还具有优于监督预训练的能力,适用于图像字幕化。

关键点

  • 我们能够通过使用预训练的Vision Transformers(ViT)模型和PyTorch后端将图像转化为文本描述来看到图像字幕化。
  • Transformers是使用自注意力、并行化和减少训练时间处理序列输入数据的模型。
  • 我们展示了ViTs在图像字幕化中的实际用途,利用了注意力机制来连接图像和文本。

常见问题(FAQs)

  • 项目GitHub:https://github.com/inuwamobarak/Image-captioning-ViT
  • Vision Transformer(ViT)我们通过开放源代码和开放科学的方式,推动和民主化人工智能。huggingface.co
  • OpenAI GPT2我们通过开放源代码和开放科学的方式,推动和民主化人工智能。huggingface.co
  • Tokenizer我们通过开放源代码和开放科学的方式,推动和民主化人工智能。huggingface.co
  • Vision Encoder Decoder Models我们通过开放源代码和开放科学的方式,推动和民主化人工智能。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

本文中显示的媒体不属于Analytics Vidhya所有,仅由作者自行决定使用。

Leave a Reply

Your email address will not be published. Required fields are marked *