基于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, BlipForConditionalGenerationprocessor = 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.liveThis 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上部署这些模型,并自动为给定的输入图像生成相关的输出文字字幕。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【从0带做】基于Springboot3+Vue3的场馆预约系统

大家好&#xff0c;我是武哥&#xff0c;最近给大家手撸了一个基于SpringBoot3Vue3的场馆预约系统&#xff0c;可用于毕业设计、课程设计、练手学习&#xff0c;系统全部原创&#xff0c;如有遇到网上抄袭站长的&#xff0c;欢迎联系博主~ 项目演示视频和教程视频 https://ww…

unity与android拓展

一.AndroidStudio打包 1.通过Unity导出Android Studio能够打开的工程 步骤 1.设置导出基本信息&#xff1a;公司名、游戏名、图标、包名等关键信息 2.在File——>Build Settings中&#xff0c;勾选 Export Project 选项 3.点击Export 导出按钮 2.在Android Studio中打开Un…

计算机网络期末复习-part1-概述

1、互联网的组成 互联网由两大块组成。 1、边沿部分&#xff1a;由所有连接在互联网上的主机组成&#xff0c;是用户直接使用的部分。 2、核心部分&#xff0c;由大量网络和路由器组成&#xff0c;为边缘部分提供服务。 2、数据传送阶段的三种交换方式的主要特点 1、电路交…

matlab中disp,fprintf,sprintf,display,dlmwrite输出函数之间的区别

下面是他们之间的区别&#xff1a; disp函数与fprintf函数的区别 输出格式的灵活性 disp函数&#xff1a;输出格式相对固定。它会自动将变量以一种比较直接的方式显示出来。对于数组&#xff0c;会按照行列形式展示&#xff1b;对于字符串&#xff0c;直接原样输出并换行。例如…

【数据中心建设资料】数据中心安全建设解决方案,数据中心整理解决方案,数据中心如何做到安全保障,数据中台全方案(Word全原件)

第一章 解决方案 1.1 建设需求 1.2 建设思路 1.3 总体方案 信息安全系统整体部署架构图 1.3.1 IP准入控制系统 1.3.2 防泄密技术的选择 1.3.3 主机账号生命周期管理系统 1.3.4 数据库账号生命周期管理系统 1.3.5 双因素认证系统 1.3.6 数据库审计系统 1.3.7 数据脱敏系统 1.3.8…

Go学习:变量

目录 1. 变量的命名 2. 变量的声明 3. 变量声明时注意事项 4. 变量的初始化 5. 简单例子 变量主要用来存储数据信息&#xff0c;变量的值可以通过变量名进行访问。 1. 变量的命名 在Go语言中&#xff0c;变量名的命名规则 与其他编程语言一样&#xff0c;都是由字母、数…

使用ensp搭建内外互通,使用路由跨不同vlan通信。

1.网络拓扑图 2.规则 &#xff08;1&#xff09;允许 &#xff08;自己&#xff09;ping通内外网&#xff0c;内外网随便一个pc就可以. &#xff08;2&#xff09; 允许&#xff08;电信&#xff09;ping通内外网&#xff0c;内外网随便一个pc就可以 &#xff08;时间问题不做…

基于Vue实现的移动端手机商城项目 电商购物网站 成品源码

&#x1f4c2;文章目录 一、&#x1f4d4;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站演示 &#x1f4f8;部分截图 &#x1f3ac;视频演示 五、⚙️网站代码 &#x1f9f1;项目结构 &#x1f492;vue代码预览 六、&#x1f527;完整…

使用 postman 传递 binary 类型的图片到后端接口遇到的坑

使用 psotman 传 binary 类型图片报错&#xff1a; -2024-12-04 [http-nio-9090-exec-1] WARN org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required r…

SQL 优化经历:从 30248.271s 到 0.001s

今天分享一篇SQL优化的文&#xff0c;带你深入了解如何提升查询效率、降低系统负载。 无论你是数据库管理员还是开发者&#xff0c;都不能错过这份关于SQL性能优化的实用指南。让我们一起穿越数据库迷宫&#xff0c;发现隐藏在代码背后的优化黄金点&#xff01; 场景 用的数据…

开发者如何使用GCC提升开发效率Opencv操作

看此篇前请先阅读 https://blog.csdn.net/qq_20330595/article/details/144134160?spm=1001.2014.3001.5502 https://blog.csdn.net/qq_20330595/article/details/144134160?spm=1001.2014.3001.5502 https://blog.csdn.net/qq_20330595/article/details/144216351?spm=1001…

PyQt 中的无限循环后台任务

在 PyQt 中实现一个后台无限循环任务&#xff0c;需要确保不会阻塞主线程&#xff0c;否则会导致 GUI 无响应。常用的方法是利用 线程&#xff08;QThread&#xff09; 或 任务&#xff08;QRunnable 和 QThreadPool&#xff09; 来运行后台任务。以下是一些实现方式和关键点&a…

node.js实现分页,jwt鉴权机制,token,cookie和session的区别

文章目录 1. 分⻚功能2. jwt鉴权机制1.jwt是什么2.jwt的应用3.优缺点 3. cookie&#xff0c;token&#xff0c;session的对比 1. 分⻚功能 为什么要分页 如果数据量很⼤&#xff0c;⽐如⼏万条数据&#xff0c;放在⼀个⻚⾯显⽰的话显然不友好&#xff0c;这时候就需要采⽤分⻚…

ED6H系列FPGA口袋实验室

一、产品概述 ED6H系列FPGA口袋实验室是中科亿海微自主研发的基于“FPGA在线教学平台”的教学实践工具&#xff0c;专为高校电子相关专业师生打造&#xff0c;旨在为高校师生创造更具创新性与高效性的教学场景。具有高集成度、小巧便携、可扩展设计及自主可控等特点。本系列共…

实验三:Mybatis-动态 SQL

目录&#xff1a; 一 、实验目的&#xff1a; 通过 mybatis 提供的各种标签方法实现动态拼接 sql 二 、预习要求&#xff1a; 预习 if、choose、 when、where 等标签的用法 三、实验内容&#xff1a; 根据性别和名字查询用户使用 if 标签改造 UserMapper.xml使用 where 标签进行…

Python爬虫——猫眼电影

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

python 三钱筮法项目开发

三钱筮法项目技术说明 1. 技术栈 GUI框架: CustomTkinter 现代化的Tkinter扩展提供美观的界面组件支持主题定制 数据存储: JSON 卦象数据: gua_info.json记忆数据: memory.json易经解释: detail.json 图像处理: PIL (Python Imaging Library) 处理图标和图片资源 2. 主要功…

yagmail邮件发送库:如何用Python实现自动化邮件营销?

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

无人机的计算机仿真模拟控制

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月3日10点24分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅h…

vue+mars3d给影像底图叠加炫酷效果

话不多说&#xff0c;直接上效果图&#xff1a; 在这里墙体其实是有一个不太明显的流动效果 实现方式&#xff1a;这里我使用了PolylineEntityWallPrimitive&#xff0c;开始我用的是polygonEntity但是发现实现效果并不好&#xff0c;所有直接改用了线 map.vue文件&#xff1…