基于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.xdnf.cn/news/33480.html

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

相关文章

AI技术在电商行业中的应用与发展

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

项目-02-数学学院后台项目开发过程中的问题总结

目录 一、后台&#xff08;pc端&#xff0c;vue2&#xff09;1. dialog对话框被黑色蒙层盖住2. 将前端表格导出为word文档3. 在线查看、下载 .docx、.doc、.pdf文档 一、后台&#xff08;pc端&#xff0c;vue2&#xff09; 1. dialog对话框被黑色蒙层盖住 问题&#xff1a; d…

大语言模型技术相关知识-笔记整理

系列文章目录 这个系列攒了很久。主要是前段之间面试大语言模型方面的实习&#xff08;被拷打太多次了&#xff09;&#xff0c;然后每天根据面试官的问题进行扩展和补充的这个笔记。内容来源主要来自视频、个人理解以及官方文档中的记录。方便后面的回顾。 文章目录 系列文章…

【计算机网络】实验11:边界网关协议BGP

实验11 边界网关协议BGP 一、实验目的 本次实验旨在验证边界网关协议&#xff08;BGP&#xff09;的实际作用&#xff0c;并深入学习在路由器上配置和使用BGP协议的方法。通过实验&#xff0c;我将探索BGP在不同自治系统之间的路由选择和信息交换的功能&#xff0c;理解其在互…

HTTP协议图--HTTP 报文实体

1. HTTP 报文实体概述 HTTP 报文结构 大家请仔细看看上面示例中&#xff0c;各个组成部分对应的内容。 接着&#xff0c;我们来看看报文和实体的概念。如果把 HTTP 报文想象成因特网货运系统中的箱子&#xff0c;那么 HTTP 实体就是报文中实际的货物。 报文&#xff1a;是网络…

PCL DipG-Seg 地面分割实现

DipG-Seg采用基于像素的图像方法,将点云投影到两个图像面,经过投影图像生成,图像预分割、图像精细分割、标签投票等步骤,完成对于地面的分割。验证后其分割效果优于patchwork++等传统算法,16线激光雷达可以达到200hz的速度。代码可以由单模态激光雷达数据扩展到多模态点云…

MySQL大小写敏感、MySQL设置字段大小写敏感

文章目录 一、MySQL大小写敏感规则二、设置数据库及表名大小写敏感 2.1、查询库名及表名是否大小写敏感2.2、修改库名及表名大小写敏感 三、MySQL列名大小写不敏感四、lower_case_table_name与校对规则 4.1、验证校对规则影响大小写敏感4.1、验证校对规则影响排序 五、设置字段…

4.5 TCP 报文段的首部格式

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 前言1 TCP 报文段的基本结构2 固定部分2.1 源端口与目的端口2.2 序号2.3 确认号2.4 数据偏移2.5 保留字段2.6 控制位2.7 窗口2.8 检验和2.9 紧急指针 3 可变部分3.1 选项3.2 填…

堆叠的简析

堆叠 堆叠的概念 堆叠是指将一台以上的交换机组合起来共同工作&#xff0c;以便在有限的空间内提供尽可能多的端口。‌ 堆叠技术可以通过专用连接电缆将多台交换机连接成一个堆叠单元&#xff0c;从而增加端口密度和管理效率。‌12 堆叠与级联有所不同。级联的交换机之间可以…

Qt复习学习

https://www.bilibili.com/video/BV1Jp4y167R9/?spm_id_from333.999.0.0&vd_sourceb3723521e243814388688d813c9d475f https://subingwen.cn/qt/qt-primer/#1-4-Qt%E6%A1%88%E4%BE%8B https://subingwen.cn/qt/ https://download.qt.io/archive/qt/1.1Qt的特点 1.2QT中的…

MySQL:函数

在MySQL中&#xff0c;为了提高代码重用性和隐藏实现细节&#xff0c;MySQL提供了很多函数。 在MySQL中&#xff0c;函数非常多&#xff0c;主要可以分为以下几类: 聚合函数数学函数字符串函数日期函数控制流函数窗口函数 聚合函数 在MySQL中&#xff0c;聚合函数主要由&…

同为科技(TOWE)柔性定制化PDU插座

随着科技的进步&#xff0c;越来越多的精密电子设备&#xff0c;成为工作生活密不可分的工具。 电子电气设备的用电环境也变得更为复杂&#xff0c;所以安全稳定的供电是电子电气设备的生命线。 插座插排作为电子电气设备最后十米范围内供配电最终核心部分&#xff0c;便捷、安…

javaweb-Day06~08

1.mysql数据库 单行注释的–注释后面要加空格才能真正实现注释&#xff0c;即“-- ” &#xff08;1&#xff09;所有的关系型数据库都是基于SQL语句的 2.DDL 3.数据库设计 4. DML 5.DQL &#xff08;1&#xff09;总 6.多表设计 &#xff08;1&#xff09;一对多 &#x…

基于遗传优化SVM的电机参数预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 数据收集与预处理 4.2模型构建与训练 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 输入&#xff1a;电机结构参数x1 x2 x3 x4 x5(分别是铁心高度 铁心厚度 绕组…

图形开发基础之在WinForms中使用OpenTK.GLControl进行图形绘制

前言 GLControl 是 OpenTK 库中一个重要的控件&#xff0c;专门用于在 Windows Forms 应用程序中集成 OpenGL 图形渲染。通过 GLControl&#xff0c;可以轻松地将 OpenGL 的高性能图形绘制功能嵌入到传统的桌面应用程序中。 1. GLControl 的核心功能 OpenGL 渲染上下文&…

PythonQt练习

下面是一个简单登录界面的搭建 import sys# 从PySide6中导入必要的模块&#xff0c;用于创建GUI界面 from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit from QtCore import Qt# 导入Qt Designer生成的UI文件 from TAJ import Ui_Form from secon…

【Windows系统下打造高效智能聊天平台LobeChat解锁远程协作新体验】

文章目录 前言1. LobeChat功能介绍2. 本地安装LobeChat3. 如何使用LobeChat工具4. 安装Cpolar内网穿透5. 实现公网访问LobeChat6. 固定LobeChat公网地址 前言 在这个数字化飞速发展的时代&#xff0c;人工智能已经深深地融入了我们的生活。从智能家居到自动驾驶&#xff0c;再…

基于ZYNQ-7000系列的FPGA学习笔记7——按键控制蜂鸣器(模块化编写)

基于ZYNQ-7000系列的FPGA学习笔记7——按键控制蜂鸣器&#xff08;模块化编写&#xff09; 1. 实验要求2. 功能分析3. 模块设计4. 波形图4.1 按键消抖模块4.2 按键控制蜂鸣器模块 5.代码编写5.1 rtl代码5.2 测试代码 6. 代码仿真7. 添加约束文件并分析综合 在上期的内容中&…

Linux 文本处理三剑客基本用法

Linux文本处理三剑客 - grep sed awk 1. 基本用法 grep 是一种强大的文本搜索工具&#xff0c;用于在文件中搜索指定的模式&#xff08;通常是字符串或正则表达式&#xff09;&#xff0c;并输出匹配的行。以下是 grep 的一些基本用法&#xff1a; 基本语法 grep [选项] 模式…

美畅物联丨智能监控,高效运维:视频汇聚平台在储能领域的实践探索

在当今全球能源格局不断变化的大背景下&#xff0c;对清洁能源的需求正以惊人的速度增长。储能项目作为平衡能源供需、提升能源利用效率的关键环节&#xff0c;其规模和复杂度也在不断攀升。在储能项目的运营管理过程中&#xff0c;安全监控、设备运维以及数据管理等方面面临着…