介绍
使用预训练的ViT模型进行图像描述可以看作是一种文本或书面描述,位于图像下方,旨在提供对图像细节的描述。它是将图像转换为文本描述的任务。通过连接视觉(图像)和语言(文本)来完成。在本文中,我们使用PyTorch后端,使用视觉变换器(ViT)作为主要技术,在图像中实现了这一目标。目标是展示一种使用转换器,特别是ViTs,利用经过训练的模型生成图像标题的方法,而无需从头开始重新训练。
随着社交媒体平台和在线图片使用的当前趋势,掌握这种技能的好处很多,可以出于多种原因进行描述、引用、帮助视力受损者,甚至是搜索引擎优化。这使得学习这种技术对涉及图像的项目非常有用。
学习目标
- 图像描述的概念
- 使用ViTs进行图像捕捉
- 使用预训练模型进行图像描述
- 使用Python利用转换器
您可以在此GitHub仓库中找到使用的全部代码。
本文是数据科学博客马拉松的一部分。
什么是Transformer模型?
在我们研究ViT之前,让我们先了解一下Transformer。自从Google Brain于2017年引入transformers以来,它引起了人们对其在NLP方面的能力的兴趣。Transformer是一种深度学习模型,其特点是采用自我关注,不同地加权输入数据的每个部分的重要性。并且主要用于自然语言处理(NLP)领域。
Transformer处理序列输入数据,例如自然语言,但transformer一次处理整个输入。借助注意机制,任何输入序列的位置都有上下文。这种效率允许更多的并行化,减少训练时间,同时提高效率。
Transformer体系结构
现在让我们看一下transformers的体系结构组成。Transformer体系结构主要由编码器-解码器结构组成。Transformer体系结构的编码器-解码器结构在一篇著名的论文中被提出,标题为“Attention Is All You Need”。
编码器由层组成,负责逐层处理输入,而解码器层接收编码器输出并生成解码输出。简单地说,编码器将输入序列映射到序列,然后将其馈送到解码器。解码器然后生成一个输出序列。
什么是Vision Transformers?
由于本文展示了ViTs在图像描述中的实际用途,因此也有必要了解ViTs的工作原理。Vision transformers是一种transformer,用于执行与图像相关的任务,包括图像。它们是一种变压器,也使用注意机制来查找输入图像之间的关系。在这种用例中,它们将我们的图像与令牌或文本连接起来。
实现图像描述
了解转换器是什么以及它们如何工作之后,让我们继续实现我们的图像描述模型。我们将从安装转换器库开始,然后构建模型,最后使用我们的模型生成图像标题。
在编写代码之前,让我们先想一想,我们实际上是使用了 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)
标题:
一匹黑马在草地上奔跑
示例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)
标题:
一个站在山顶上的男人
示例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)
标题:
一只长鼻子的狗
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所有,仅由作者自行决定使用。