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

news2025/1/23 17:45:40

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

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

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

相关文章

解决Jupyter Notebook无法转化为Pdf的问题(基于Typora非常实用)

笔者在完成各项作业和做笔记时&#xff0c;经常用到jupyter notebook&#xff1b;其因为可以同时运行python并提供格式化的数字公式的输入方式&#xff0c;得到了广大用户的喜爱。 当我们想要将.ipynb文件导出为pdf时&#xff0c;有两种常用方法。 1.Ctrlp 2.通过File ->…

ROS-plotjuggler的使用

简介 一个基于Qt的应用程序&#xff0c;允许用户加载、搜索和打印数据。通常对rosbag画图的辅助工具使用。 使用方法 启动 rosrun plotjuggler plotjuggler打开界面左上角&#xff0c;加载并选择相应数据 如果要用两个数据绘图&#xff0c;则ctrl选中后右键拖入

【笔记】离散数学 1-3 章

1. 数理逻辑 1.1 命题逻辑的基本概念 1.1.1 命题的概念 命题&#xff08;Proposition&#xff09;&#xff1a;是一个陈述句&#xff0c;它要么是真的&#xff08;true&#xff09;&#xff0c;要么是假的&#xff08;false&#xff09;&#xff0c;但不能同时为真和假。例如…

在服务器上实现本地python文件的依赖

1、在python中&#xff0c;一个python文件就可以视为一个模块进行导入 2、使用import 导入时&#xff0c;若使用pip 下载过可以直接导入 3、假如是自己写的同项目中的文件会去sys.path 中查找 比如说 我现在 test 下有一个 python文件 运行 下面的代码 打印的数据如上图所示p…

解决python 使用pip 安装模块时遇到的错误SSL: CERTIFICATE_VERIFY_FAILED

最近有一个使用python 2.7.* 使用requests模块的需求,在安装的过程中遇到了一个问题&#xff0c;在这里分享给大家&#xff01; 安装requests命令如下 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests 遗憾的是&#xff0c;报错了 Collecting requests …

蓝桥杯准备训练(lesson2 ,c++)

3.1 字符型 char //character的缩写在键盘上可以敲出各种字符&#xff0c;如&#xff1a; a &#xff0c; q &#xff0c; &#xff0c; # 等&#xff0c;这些符号都被称为字符&#xff0c;字符是⽤单引号括 起来的&#xff0c;如&#xff1a; ‘a’ &#xff0c; ‘b’ &…

opencvocr识别手机摄像头拍摄的指定区域文字,文字符合规则就语音报警

安装python&#xff0c;pycharm&#xff0c;自行安装。 Python下安装OpenCv 2.1 打开cmd,先安装opencv-python pip install opencv-python --user -i https://pypi.tuna.tsinghua.edu.cn/simple2.2 再安装opencv-contrib-python pip install opencv-contrib-python --user …

LabVIEW中“this VI‘s owning library is missing”错误及解决

问题描述 当加载或打开一个VI时&#xff0c;如果其所属的项目库未加载到内存&#xff0c;LabVIEW将提示错误&#xff1a;“this VIs owning library is missing”&#xff08;该VI的所属库不存在&#xff09;。 该问题通常发生在以下情况下&#xff1a; 项目库文件丢失或路径…

【效果】回到顶部功能实现

实现效果&#xff1a; 相关代码&#xff1a; <template><div class"cats" :style"{ top: catsTop }" ref"cats" click"catTop"></div> </template> 样式&#xff1a; /* 回到顶部 - 小猫咪 */ .cats {posi…

算法第一弹-----双指针

目录 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.查找总价值为目标值的两个商品 7.三数之和 8.四数之和 双指针通常是指在解决问题时&#xff0c;同时使用两个指针&#xff08;变量&#xff0c;常用来指向数组、链表等数据结构中的元素位置&am…

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

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

【Linux系统编程】——理解冯诺依曼体系结构

文章目录 冯诺依曼体系结构硬件当代计算机是性价比的产物冯诺依曼的存储冯诺依曼的数据流动步骤冯诺依曼结构总结 冯诺依曼体系结构硬件 下面是整个冯诺依曼体系结构 冯诺依曼结构&#xff08;Von Neumann Architecture&#xff09;是现代计算机的基本结构之一&#xff0c;由数…

微信创建小程序码 - 数量不受限制

获取小程序码&#xff1a;小程序码为圆图&#xff0c;且不受数量限制。 目录 文档 接口地址 请求方式 功能描述 注意事项 获取 scene 值 请求参数 返回参数 对接 请求方法 获取小程序码 调用获取小程序码 总结 文档 接口地址 https://api.weixin.qq.com/wxa/get…

JDK8 下载与安装

下载安装包 官网下载 官网 找到适合的版本: 网盘下载 网盘链接 提取码: 6666 下载得到的安装包: 安装步骤 双击安装包开始安装. 安装路径不要有中文或者特殊符号如空格等. 更改安装路径: 跳出一个页面, 安装公共 JRE: 安装完成: 安装目录: 安装的公共 JRE: JDK 里面的 JR…

笔记本电脑usb接口没反应怎么办?原因及解决方法

笔记本电脑的USB接口是我们日常使用中非常频繁的一个功能&#xff0c;无论是数据传输、充电还是外接设备&#xff0c;都离不开它。然而&#xff0c;当USB接口突然没有反应时&#xff0c;这无疑会给我们的工作和学习带来不小的困扰。下面&#xff0c;我们就来探讨一下笔记本USB接…

Axure设计之模拟地图人员移动轨迹

在产品原型设计时&#xff0c;为了更好的表达和呈现预期的效果&#xff0c;让客户或开发看一眼就能理解要实现的功能&#xff0c;往往需要在产品设计时尽量去接近现实&#xff0c;这就需要我们在使用Axure制作原型时应具有高度细节和逼真度的原型设计。原型设计不仅包含了产品的…

【配置查询】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

error=‘null‘], commandType=io.lettuce.core.RedisPublisher$SubscriptionCommand]

问题 查看java应用启动日志输出下面错误&#xff1a; errornull], commandTypeio.lettuce.core.RedisPublisher$SubscriptionCommand] Completing command LatencyMeteredCommand [typeINFO, outputStatusOutput [output# Server redis_version:4.0.14 redis_git_sha1:000…

Python 数据分析用库 获取数据(二)

Beautiful Soup Python的Beautiful Soup&#xff08;常被称为“美丽汤”&#xff09;是一个用于解析HTML和XML文档的第三方库&#xff0c;它在网页爬虫和数据提取领域具有广泛的应用。 作用 HTML/XML解析&#xff1a; Beautiful Soup能够解析HTML和XML文档&#xff0c;包括不…

915DEBUG-obsidianTemplater使用

Templater使用 tp函数不正常显示相应数据 模板使用方式不正确 <% tp.date.now("YYYY-MM-DD") %> 应该被放置在一个被Templater识别为模板的文件中&#xff0c;或者在你使用Templater的插入模板功能时输入。如果只是在一个普通的Markdown文件中直接输入这段代码…