基于Transformer的编码器-解码器图像描述模型在AMD GPU上的应用

Transformer based Encoder-Decoder models for image-captioning on AMD GPUs --- ROCm Blogs

图像描述,即基于生成式人工智能(GenAI)自动生成简洁的图像文本描述,在现实世界中有着非常重要的应用。例如,图像描述可以为视障用户提供图像的文本描述,从而改善他们的可访问性;在电子商务应用中,图像描述可以为产品添加文本描述;在早期儿童教育应用中,图像描述可以帮助孩子将图像与其文本描述进行对应。图像描述还可以自动描述监控摄像头录像中的物体和事件,在监控应用中发挥作用,并且在人机交互(HRI)应用中,机器人可以自动生成它们遇到的物体和事件的文本描述,还有更多应用。图像描述任务是一种序列到序列(seq2seq)的机器学习任务:模型将一个域(在这种情况下是图像)的序列转换为另一个域(其文本描述)的对应序列。在图像描述中,图像被分割成若干个图像块序列。然后,该图像块序列将被模型转换为相应的文本标记序列。

基于Transformer的编码器-解码器模型在诸如描述、转录、摘要和翻译等seq2seq应用中是一种流行的选择。多模态seq2seq应用结合了来自不同数据模态的两个数据分布,以在它们之间识别模式并提取下游任务的相关特征。这些模型通常由一个预训练的编码器和一个预训练的生成解码器组成,它们在特定任务的数据集上进行联合微调。

在这篇博客中,我们将为您提供在AMD GPU上运行ROCm实现三种不同基于Transformer的编码器-解码器图像描述模型的实操教程。我们将在这篇博客中讨论的三种模型,ViT-GPT2、BLIP和Alpha-CLIP,按复杂度递增顺序排列。首先讨论的模型,ViT-GPT2,是一个简洁的联合微调图像和文本数据的Transformer编码器-解码器模型。第二个模型,BLIP,是一个多模态混合模型,旨在减少图像生成文本任务中的幻觉和偏差。第三个模型,Alpha-CLIP,是一个类似CLIP的模型,微调以生成聚焦于特定区域的描述。Alpha-CLIP可以替换任何多模态模型中的图像编码器,比如LlaVA,以生成丰富的区域条件描述。

让我们开始吧,在AMD GPU上实现基于Transformer的编码器-解码器图像描述模型!

设置

本演示是使用以下设置创建的。有关安装ROCm的详细信息,请参阅ROCm安装说明(适用于Linux)

  • 硬件和操作系统:

  • 软件:

    • ROCm 6.1.2+

    • Pytorch 2.1.2

    • 或者,你也可以使用以下docker命令一次性设置上述软件需求:

      docker run -it --rm -p 8080:8080 --device=/dev/kfd --device=/dev/dri --group-add=video --shm-size 8G rocm/pytorch:rocm6.1.3_ubuntu22.04_py3.10_pytorch_release-2.1.2

    • 克隆与本文博客相关的代码库并安装requirements.txt中列出的库到<src文件夹>中。

      复制代码
      git clone https://github.com/ROCm/rocm-blogs.git
      cd rocm-blogs/blogs/artificial-intelligence/image-caption/src
      pip install -r requirements.txt
    • 单独安装 Hugging Face Accelerate 库以避免冲突

      pip install accelerate

ViT-GPT2 Transformer编码器-解码器

虽然联合训练基于CNN的视觉编码器和基于RNN的文本解码器以处理多模态任务的想法已经被探索过,但TrOCR: Transformer-based Optical Character Recognition with Pre-trained Models是最早引入基于Transformer编码器-解码器模型的文本识别模型之一。它展示了联合微调模型可以成功地从输入图像中识别文本。在典型的基于Transformer的多模态编码器-解码器模型中,编码器是一个Transformer编码器,如ViT、BEiT或DEiT,解码器是一个Transformer解码器,如GPT2或RoBERTa。

为了开始生成基于图像的描述,图像编码器一次性处理输入图像,输出每个图像块的Q、K和V值。然后,文本解码器接收句子开始的标记(`BOS`)用于开始生成图像描述。描述是自回归生成的,即当前输出被添加到下一个迭代的当前输入中,直到达到最大长度或句子结束标记(`EOS`)。

Transformer编码器和Transformer解码器之间的主要区别在于注意力的计算方式。如下图所示,多头注意力模块在三个不同的地方使用,每次计算注意力的方式都不同。

图像来源:Attention Is All You Need。右边是编码器,左边是解码器。

Transformer编码器中的多头注意力模块将Q、K和V矩阵作为输入用于计算注意力。这三个矩阵要么直接来自输入,要么来自前一层。

Transformer解码器中的掩码多头注意力模块对当前标记右侧的标记进行掩码。这使得学习具有单向性,从而避免关注尚未被预测的标记位置。例如,如果输入提示是`The cat is lying on the bed`,当处理`The`时,它只能关注自己,而不会关注输入中的其他标记。这将产生一个注意力输出。同样,在下一个迭代中,`cat`会关注`The`和`cat`,但不会关注剩余的输入提示。这将产生两个注意力输出。过程将持续直到提示结束。最终的注意力矩阵将看起来像一个下三角矩阵。基本上,通过掩盖(零化)不需要的值,我们会得到这个矩阵,因此被称为`掩码多头注意力`。

解码器中的多头注意力模块对编码器输出和解码器输入进行注意力计算。换句话说,K和V矩阵来自编码器输出,Q矩阵来自解码器输入。这使得能够从两种模式中学习,并生成基于这两种模式条件的输出。

实现

您可以使用以下代码,通过 Hugging Face 的 VisionEncoderDecoder 类来构建基于 Transformer 的编码器-解码器模型。此类初始化了一个组合模型,创建交叉注意力层,执行掩码注意力,并加载任何预训练权重。此示例使用了一组 ViT 和 GPT2 预训练模型,其中 ViT 作为编码器,GPT2 作为解码器。您也可以使用不同的编码器-解码器组合,例如 CLIP 和 GPT,或者 BEiT 和 BERT(Hugging Face 为 BERT 添加了交叉注意力层,将其从编码器转变为解码器)。

在模型初始化期间,从 Hugging Face 加载一个微调的检查点。此检查点包含在 COCO 2017 图像-文本数据集上微调的权重,有助于生成准确的输出字幕。

创建一个处理器,用于预处理输入图像和编码/解码文本序列。

复制代码
from transformers import ViTImageProcessor, GPT2Tokenizer
from transformers import GPT2Config, ViTConfig, VisionEncoderDecoderConfig, VisionEncoderDecoderModel
import requests
from PIL import Image
from matplotlib import pyplot as plt
import torch
import numpy as np

# 加载输入图像
image = Image.open('../images/tabby-cat.PNG').convert("RGB")
plt.figure()
plt.imshow(image)

model = VisionEncoderDecoderModel.from_pretrained("nlpconnect/vit-gpt2-image-captioning").to('cuda')
processor = ViTImageProcessor.from_pretrained("nlpconnect/vit-gpt2-image-captioning")
tokenizer = AutoTokenizer.from_pretrained("nlpconnect/vit-gpt2-image-captioning")

pixel_values = torch.Tensor(processor(image, return_tensors="np").pixel_values).to('cuda')
output_ids = model.generate(pixel_values, max_length=128)
preds = tokenizer.batch_decode(output_ids, skip_special_tokens=True)
preds = [pred.strip() for pred in preds]
print(preds)

输入图像 tabby-cat 来自 Hugging Face

复制代码
['two cats are laying on a blanket on a couch']

这个描述似乎非常适合上面显示的输入图像。

BLIP

Bootstrapping Language-Image Pre-training (BLIP) 是一种多模态混合编码器-解码器模型,旨在统一两个视觉-语言预训练任务:理解和生成。

理解任务,如图文检索(ITR),使用表示学习来共同学习视觉和文本模态的语义。生成任务如图像描述生成(image-captioning)和视觉问答(VQA),在输入图像的基础上生成文本数据。统一这两个任务有助于消除现有任务特定架构的需要。

基于编码器的模型如 Contrastive Language-Image Pre-training (CLIP) 用于分类任务,而基于编码器-解码器的模型如VL-BART则为图像-语言推理任务(如生成描述)设计。BLIP通过独特的架构在预训练策略中统一了这两类广泛的任务。

BLIP的架构由四个基于Transformer的部分组成:图像编码器、文本编码器、图像衍生文本编码器、和图像衍生文本解码器。

文本编码器、图像衍生文本编码器和图像衍生文本解码器部分除了自注意力层之外,共享所有层的参数。图像衍生文本编码器和图像衍生文本解码器部分还具有额外的交叉注意力层。每个部分在三种不同功能中操作,提升了BLIP的总体性能。

文本编码器组件与图像编码器组件一起通过图文对比(Image-Text Contrastive,ITC)损失函数训练。ITC损失函数在正样本对上给予奖励,而在负样本对上给予惩罚。

图像衍生文本编码器组件通过图文匹配(Image-Text Matching,ITM)损失函数训练。ITM是一种二元分类损失。

图像衍生文本解码器组件是一种具有交叉注意力和掩码自注意力层的解码器,用于语言建模(Language Modelling,LM)任务。它通过自回归的方式优化文本生成的似然性。预训练的模型混合体然后可以用于各种下游任务,既可用于迁移学习也可用于零样本迁移(Zero-shot transfer)。

图像来源:BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation

在微调过程中,BLIP生成引导图文对以减少幻觉现象。这是通过分别在网络数据集(如COCO数据集)上微调图像衍生文本编码器和图像衍生文本解码器实现的。前者作为过滤器在网络描述和合成描述之间进行选择。后者作为描述生成器,促进生成合成描述。如在BLIP部分的图片中,过滤器在网络描述和合成描述之间进行选择,从而避免了描述生成器引起的幻觉和偏差。

使用BLIP进行推理

本节演示如何在Hugging Face的BLIP模型上运行推理,以检查其图片描述生成能力。BLIP具有内置的处理器和分词器,这意味着同一个处理器将同时用于图像处理和文本解码。

复制代码
import torch
from transformers import BlipProcessor, BlipForConditionalGeneration

processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-base")
model = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-base").to("cuda")

image = Image.open('./images/tabby-cat.PNG').convert("RGB")

inputs = processor(image, return_tensors="np")
pixel_values = torch.Tensor(inputs['pixel_values']).to("cuda")

out = model.generate(pixel_values)
print(processor.decode(out[0], skip_special_tokens=True))
复制代码
two cats sleeping on a pink couch

这个描述对于输入的图像来说似乎是恰当的。

AlphaCLIP

Alpha-CLIP 是经过微调的 CLIP 版本,提供图像的区域关注能力。区域关注生成基于图像特定区域的字幕,从而更细致地理解输入并生成更可控的输出。例如,Alpha-CLIP 可以帮助在充满背景细节的图像中生成丰富的且详细的字幕来描述图片的主体,如排球运动员或鱼。这种区域关注是通过在 CLIP 图像编码器上添加辅助卷积通道实现的。

这个辅助通道通过分割掩码接受特定感兴趣区域的输入。虽然 CLIP 可以总结整个图像,Alpha-CLIP 能够突出图像中特定的部分,这些部分由辅助输入描述。

图片来源: Alpha-CLIP: A CLIP Model Focusing on Wherever You Want (https://aleafy.github.io/alpha-clip/)

Alpha-CLIP 在图像分类、2D 图像生成、3D 体积生成和图像字幕生成等任务上表现优于 CLIP。尽管是以 CLIP 为起点,Alpha-CLIP 是在数百万 RGBA 区域-文本对上训练的,同时保持 CLIP 文本编码器静态不变。Alpha-CLIP 使用一系列检测模型、分割模型和文本生成模型来生成训练用的区域-文本对数据集。一旦训练完成,Alpha-CLIP 能够聚焦于指定的区域并辅助下游任务如图像字幕生成。

本文将关注 Alpha-CLIP 的区域关注图像字幕生成能力,该能力在 Alpha-CLIP: A CLIP Model Focusing on Wherever You Want 中被称为多模态大语言建模 (MLLM)。

为了生成字幕,除了 Alpha-CLIP,还需要一个大型语言模型。因此,在推理时将利用 MLLM 如 BLIP-2 或 Llava,替换图像编码器为 Alpha-CLIP 以提供字幕生成中的区域特性。

区域特定字幕生成还可以减少如下图所示的幻觉现象。

第三行左侧图像的字幕在对象和颜色之间产生了幻觉,如题为"一张桌子上有一部红色电话"的字幕描述是一部绿色电话和红色蘑菇在桌子上。指定蘑菇区域后,字幕变为"一张桌子上的红色蘑菇",指定电话区域后,字幕变为"一张桌子上的绿色电话"。无需额外的过滤器或模型即可消除幻觉。

图片来源: Alpha-CLIP: A CLIP Model Focusing on Wherever You Want (https://arxiv.org/abs/2312.03818)

Alpha-CLIP 代码是公开的,可以在 SunzeY/AlphaCLIP 仓库 中获取。可以使用以下命令演示基于 LlaVa 的图像字幕生成器,以获得区域关注的字幕:

复制代码
git clone https://github.com/SunzeY/AlphaCLIP
cd AlphaCLIP/demo/with_llm
python app.py

此脚本将下载模型检查点并启动一个 gradio UI 服务器,该服务器托管 Alpha-CLIP 模型。点击链接并上传你选择的图像。添加标记到你希望字幕生成器关注的区域上。

复制代码
Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:03<00:00,  1.71s/it]
clip_l14@336_grit1m_fultune_8xe.pth
IMPORTANT: You are using gradio version 3.37.0, however version 4.29.0 is available, please upgrade.
--------
Running on local URL:  http://0.0.0.0:7860
Running on public URL: https://7787dc476f48e1b8f2.gradio.live

This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)

以下示例显示了繁忙街道的字幕。

当标记上白色卡车时,字幕会改变。

总结

本博客介绍了图像字幕生成,这是一项高度应用的序列到序列任务,用于为给定图像生成文字字幕。博客提供了三个基于Transformer的编码器-解码器图像字幕生成模型的实践教程:ViT-GPT2、BLIP和Alpha-CLIP,展示了如何在使用ROCm的AMD GPU上部署这些模型,并自动为给定的输入图像生成相关的输出文字字幕。

相关推荐
yuanbenshidiaos1 小时前
【大数据】机器学习----------强化学习机器学习阶段尾声
人工智能·机器学习
盼小辉丶6 小时前
TensorFlow深度学习实战——情感分析模型
深度学习·神经网络·tensorflow
好评笔记6 小时前
AIGC视频生成模型:Stability AI的SVD(Stable Video Diffusion)模型
论文阅读·人工智能·深度学习·机器学习·计算机视觉·面试·aigc
算家云6 小时前
TangoFlux 本地部署实用教程:开启无限音频创意脑洞
人工智能·aigc·模型搭建·算家云、·应用社区·tangoflux
AI街潜水的八角7 小时前
工业缺陷检测实战——基于深度学习YOLOv10神经网络PCB缺陷检测系统
pytorch·深度学习·yolo
叫我:松哥8 小时前
基于Python django的音乐用户偏好分析及可视化系统设计与实现
人工智能·后端·python·mysql·数据分析·django
熊文豪8 小时前
深入解析人工智能中的协同过滤算法及其在推荐系统中的应用与优化
人工智能·算法
Vol火山9 小时前
AI引领工业制造智能化革命:机器视觉与时序数据预测的双重驱动
人工智能·制造
tuan_zhang9 小时前
第17章 安全培训筑牢梦想根基
人工智能·安全·工业软件·太空探索·战略欺骗·算法攻坚
Antonio91510 小时前
【opencv】第10章 角点检测
人工智能·opencv·计算机视觉