基于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)。

  • 硬件和操作系统:

    • AMD Instinct GPU

    • Ubuntu 22.04.3 LTS

  • 软件:

    • 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

图像来源: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.PNG

输入图像 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通过独特的架构在预训练策略中统一了这两类广泛的任务。

hallucination-example.PNG

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

BLIP-arch.PNG

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

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

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

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

BLIP-arch.PNG

图像来源: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 图像编码器上添加辅助卷积通道实现的。

alphaclip.PNG

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

alphaclip.PNG

图片来源: 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 以提供字幕生成中的区域特性。

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

alphaCLIP-MLLM

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

alphaCLIP-MLLM

图片来源: 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)

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

cars

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

cars

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/928756.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫——猫眼电影

用python中requests库爬取猫眼电影信息并保存到csv文件中 猫眼专业版 爬取界面 效果预览 代码 import requests import jsonurl1https://piaofang.maoyan.com/dashboard-ajax?orderType0&uuid1938bd58ddac8-02c2bbe3b009ed-4c657b58-144000-1938bd58ddac8&timeStamp…

非对称任意进制转换器(安卓)

除了正常进制转换&#xff0c;还可以输入、输出使用不同的数字符号&#xff0c;达成对数值进行加密的效果 点我下载APK安装包 使用unity开发。新建一个c#代码文件&#xff0c;把代码覆盖进去&#xff0c;再把代码文件添加给main camera即可。 using System.Collections; usin…

【HarmonyOS】鸿蒙应用地理位置获取,地理名称获取

【HarmonyOS】鸿蒙应用地理位置获取&#xff0c;地理名称获取 一、前言 首先要理解地理专有名词&#xff0c;当我们从系统获取地理位置&#xff0c;一般会拿到地理坐标&#xff0c;是一串数字&#xff0c;并不是地理位置名称。例如 116.2305&#xff0c;33.568。 这些数字坐…

OpenGL ES详解——文字渲染

目录 一、文字渲染 二、经典文字渲染&#xff1a;位图字体 1.概念 2.优缺点 三、现代文字渲染&#xff1a;FreeType 1.着色器 2.渲染一行文字 四、关于未来 一、文字渲染 当你在图形计算领域冒险到了一定阶段以后你可能会想使用OpenGL来绘制文字。然而&#xff0c;可能…

C++设计模式之外观模式

动机 下图中左边方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合&#xff0c;随着外部客户程序和各子系统的演化&#xff0c;这种过多的耦合面临很多变化的挑战。 如何简化外部客户程序和系统间的交互接口&#xff1f;如何将外部客户程序的演化和内部子系统…

【Redis篇】 List 列表

在 Redis 中&#xff0c;List 是一种非常常见的数据类型&#xff0c;用于表示一个有序的字符串集合。与传统的链表结构类似&#xff0c;Redis 的 List 支持在两端进行高效的插入和删除操作&#xff0c;因此非常适合实现队列&#xff08;Queue&#xff09;和栈&#xff08;Stack…

RE逆向基础知识及常见题型

通用寄存器 FAX: &#xff08;针对操作数和结果数据的&#xff09;累加器EBX: &#xff08;DS段的数据指针&#xff09;基址寄存器ECX: &#xff08;字符串和循环操作的&#xff09;计数器EDX: &#xff08;I/O指针&#xff09;数据寄存器ESI: &#xff08;字符串操作源指针&a…

APM装机教程(四):山鹰H743飞控四旋翼装机

文章目录 前言一、飞控说明书二、接线三、参数设置四、电机接线和转向 前言 固件版本&#xff1a;Copter 4.5.7 地面站&#xff1a;QGC 遥控器&#xff1a;云卓T10 飞控&#xff1a;山鹰H743 GPS&#xff1a;微空M9 这个飞控的原理图是开源的&#xff0c;网盘链接&#xff1a;…

实验四:MyBatis 的关联映射

目录&#xff1a; 一 、实验目的&#xff1a; 熟练掌握实体之间的各种映射关系。 二 、预习要求&#xff1a; 预习数据库原理中所讲过的一对一、一对多和多对多关系 三、实验内容&#xff1a; 1. 查询所有订单信息&#xff0c;关联查询下单用户信息(注意&#xff1a;因为一…

【C#设计模式(17)——迭代器模式(Iterator Pattern)】

前言 迭代器模式可以使用统一的接口来遍历不同类型的集合对象&#xff0c;而不需要关心其内部的具体实现。 代码 //迭代器接口 public interface Iterator {bool HashNext();object Next(); } //集合接口 public interface Collection {Iterator CreateIterator(); } //元素迭…

MySQL 主从同步一致性详解

MySQL主从同步是一种数据复制技术&#xff0c;它允许数据从一个数据库服务器&#xff08;主服务器&#xff09;自动同步到一个或多个数据库服务器&#xff08;从服务器&#xff09;。这种技术主要用于实现读写分离、提升数据库性能、容灾恢复以及数据冗余备份等目的。下面将详细…

Redis4——持久化与集群

Redis4——持久化与集群 本文讲述了1.redis在内存占用达到限制后的key值淘汰策略&#xff1b;2.redis主从复制原理&#xff1b;3.redis的哨兵模式&#xff1b;4.redis集群模式。 1. 淘汰策略 设置过期时间 expire key <timeout>只能对主hash表中的键设置过期时间。 查…

矩阵转置        ‌‍‎‏

矩阵转置 C语言代码C 语言代码Java语言代码Python语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入一个n行m列的矩阵A&#xff0c;输出它的转置 A T A^T AT。 输入 第一行包含两个整数n和m&#xff0c;表示矩阵A的行数和列数。…

Linux 无界面模式下使用 selenium

文章目录 前言什么是无界面模式&#xff1f;具体步骤安装谷歌浏览器查看安装的谷歌浏览器的版本下载对应版本驱动并安装Python 测试代码 总结个人简介 前言 在 Linux 服务器上运行自动化测试或网页爬虫时&#xff0c;常常需要使用 Selenium 来驱动浏览器进行操作。然而&#x…

windows部署PaddleSpeech详细教程

windows安装paddlespeech步骤&#xff1a; 1. 安装vs c编译环境 对于 Windows 系统&#xff0c;需要安装 Visual Studio 来完成 C 编译环境的安装。 Microsoft C Build Tools - Visual Studio 2. 安装conda conda create -y -p paddlespeech python3.8 conda activate pad…

11.7【miniob】【debug】

这里的vector是实际值&#xff0c;而relation是指针&#xff0c;所以要解引用&#xff0c;*$1&#xff0c;并在最后调用其析构函数 emplace_back 和 push_back 都是用于在容器&#xff08;如 std::vector&#xff09;的末尾添加元素的方法&#xff0c;但它们的工作方式有所不同…

聊聊JVM G1(Garbage First)垃圾收集器

CMS的垃圾回收机制&#xff0c;为什么分为四步https://blog.csdn.net/genffe880915/article/details/144205658说完CMS垃圾回收器&#xff0c;必定要说到目前一般应用项目中都推荐的G1。G1在JDK1.7 update4时引入&#xff0c;在JDK9时取代CMS成为默认的垃圾收集器。它是HotSpot…

一篇文章教会你红外接收模块接收红外遥控信号,附STM32代码示例

目录 一、红外线的通讯原理&#xff1a; &#xff08;1&#xff09;发射端&#xff1a; &#xff08;2&#xff09;接收端&#xff1a; &#xff08;3&#xff09;红外线通信的脉冲频率&#xff1a; &#xff08;4&#xff09;红外线通信&#xff1a; 二、NEC协议介绍&am…

Ignis如何将Tokenization解决方案应用于RWA和实体经济

随着区块链技术的发展&#xff0c;代币化&#xff08;Tokenization&#xff09;逐渐成为连接数字经济与实体经济的重要桥梁。尤其是RWA&#xff08;真实世界资产&#xff09;的概念&#xff0c;近年来成为金融行业的热议话题。Ignis作为Jelurida公司推出的公链平台&#xff0c;…

Linux的用户和权限【Linux操作系统】

文章目录 Linux的用户切换用户普通用户暂时以root用户的权限执行指令如何把一个普通用户加入白名单? 新建用户 Linux权限权限的组成更改权限文件/目录权限的表示方法&#xff1a; umask粘滞位添加粘滞位的方法 Linux的用户 Linux下有两种⽤⼾&#xff1a;超级用户&#xff08…