『大模型笔记』视觉语言模型解释

视觉语言模型解释

文章目录

  • 一. 视觉语言模型解析
    • 1.什么是视觉语言模型?
    • 2. 开源视觉语言模型概览
    • 3. 如何找到合适的视觉语言模型
      • MMMU
      • MMBench
    • 4. 技术细节
    • 5.使用变压器 (transformers) 运用视觉语言模型
    • 6. 使用 TRL 微调视觉语言模型
  • 二. 参考文章

一. 视觉语言模型解析

视觉语言模型是一类能够同时从图像和文本中学习,以处理从视觉问题回答到图像描述等多种任务的模型。本文将深入探讨视觉语言模型的核心组成部分,介绍其工作原理,如何选取适合的模型,以及如何利用 trl 的新版本进行便捷的微调。

1.什么是视觉语言模型?

视觉语言模型是指能够从图像和文本中学习的多模态模型。这类模型属于生成模型,能够接收图像和文本输入,并产生文本输出。大型视觉语言模型具备优秀的零样本能力,能够广泛适应多种图像类型,如文档、网页等,并且表现出良好的泛化性。应用场景包括图像聊天、图像识别指导、视觉问答、文档理解和图像描述等。部分视觉语言模型还能识别图像中的空间属性,例如,在被要求检测或分割特定对象时,能够输出边界框或分割蒙版,或定位不同实体并回答关于它们的相对或绝对位置的问题。当前大型视觉语言模型在训练数据、图像编码方式上具有多样性,因此它们的能力也各不相同。

在这里插入图片描述

2. 开源视觉语言模型概览

Hugging Face Hub 提供了众多开源视觉语言模型。以下是一些显著的模型:

  • 包括基础模型为聊天应用而微调的模型,均可用于对话模式。
  • 部分模型具备“定位(grounding)”功能,有助于减少幻觉现象。
  • 除非另有说明,所有模型均采用英语进行训练。

在这里插入图片描述

3. 如何找到合适的视觉语言模型

选择适合特定用例的模型有多种方法:

Vision Arena 是一个基于模型输出的匿名投票排行榜,不断更新。在这个平台上,用户提交图像及提示,系统从两个不同模型中生成输出,用户则根据偏好选择输出,从而构建基于用户偏好的排行榜。

_Vision Arena_

Open VLM排行榜 根据各种视觉语言模型的表现和平均得分进行排名。用户还可以根据模型大小、是否为开源以及不同的性能指标来筛选模型。

在这里插入图片描述

VLMEvalKit 是一个评估工具包,可以在视觉语言模型上运行基准测试,支持 Open VLM 排行榜。另一个评估套件是 LMMS-Eval,它提供了一个标准的命令行界面,用于使用托管在 Hugging Face Hub 上的数据集评估选定的 Hugging Face 模型,示例如下:

accelerate launch --num_processes=8 -m lmms_eval --model llava --model_args pretrained=\"liuhaotian/llava-v1.5-7b\" --tasks mme,mmbench_en --batch_size 1 --log_samples --log_samples_suffix llava_v1.5_mme_mmbenchen --output_path ./logs/

如果您希望探索更多模型,可以在 Hub 上

浏览执行image-text-to-text任务的模型

您可能会在排行榜上看到不同的视觉语言模型评估基准。下面是其中一些基准的介绍:

MMMU

全面的多学科多模态理解与推理基准,用于评估专家级通用人工智能 (AGI) (MMMU) 是评估视觉语言模型最全面的基准之一。它包含 11.5K 个多模态挑战,涉及艺术、工程等多个学科,需要大学级别的知识和推理能力。

MMBench

MMBench 是一个包含 3000 个单项选择题的评估基准,涵盖 20 种不同的技能,如 OCR、对象定位等。该论文还引入了一种名为 CircularEval 的评估策略,通过不同组合混洗答案选项,并期望模型在每次都能给出正确答案。此外,还有其他更具体的跨不同领域的基准,如 MathVista(视觉数学推理)、AI2D(图表理解)、ScienceQA(科学问答)和 OCRBench(文档理解)。

4. 技术细节

预训练视觉语言模型有多种方法。核心技术是统一图像和文本的表示,并将其输入文本解码器进行生成。常见的模型通常包括 图像编码器、用于对齐图像和文本表征的嵌入投影器(通常是一个密集型神经网络)及文本解码器。

例如,LLaVA 模型包括一个 CLIP 图像编码器、多模态投影器和一个 Vicuna 文本解码器。开发者将图像及其标题的数据集输入到 GPT-4 中,生成相关的问题。在此过程中,图像编码器和文本解码器被冻结,只对多模态投影器进行训练,以通过比较模型输出和实际标题来对齐图像和文本特征。预训练完成后,保持图像编码器冻结,解冻文本解码器,并继续训练投影器和解码器。这种预训练及微调方法是训练视觉语言模型的常见方式。

典型视觉语言模型的结构

_典型视觉语言模型结构_
投影和文本嵌入的连接

**加粗样式**

KOSMOS-2 采用了全面的端到端训练方法,与 LLAVA 式的预训练相比,在计算上更为昂贵。开发者后续还进行了语言指令的微调以优化模型。另一个例子是 Fuyu-8B,该模型不使用图像编码器,而是直接将图像块输入到投影层,然后通过自回归解码器进行处理。通常情况下,您可以使用现有的视觉语言模型,或根据自己的需求对模型进行微调。

5.使用变压器 (transformers) 运用视觉语言模型

您可以使用以下代码使用 Llava 模型进行推断:

首先初始化模型和处理器。

from transformers import LlavaNextProcessor, LlavaNextForConditionalGeneration
import torchdevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
processor = LlavaNextProcessor.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf")
model = LlavaNextForConditionalGeneration.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf",torch_dtype=torch.float16,low_cpu_mem_usage=True
)
model.to(device)

现在我们将图像和文本提示传递给处理器,然后将处理过的输入传递给generate。请注意,每个模型使用自己的提示模板,正确使用以确保性能。

from PIL import Image
import requestsurl = "https://github.com/haotian-liu/LLaVA/blob/1a91fc274d7c35a9b50b3cb29c4247ae5837ce39/images/llava_v1_5_radar.jpg?raw=true"
image = Image.open(requests.get(url, stream=True).raw)
prompt = "[INST] <image>\nWhat is shown in this image? [/INST]"inputs = processor(prompt, image, return_tensors="pt").to(device)
output = model.generate(**inputs, max_new_tokens=100)

调用 decode 方法来解码输出 token。

print(processor.decode(output[0], skip_special_tokens=True))

6. 使用 TRL 微调视觉语言模型

我们高兴地宣布,TRLSFTTrainer 现在支持视觉语言模型的实验性训练!我们提供了一个示例,展示如何使用 llava-instruct 数据集对 Llava 1.5 VLM 进行 SFT,该数据集包含 260k 张图像对话对。这些数据集包含的是格式化为消息序列的用户与助手之间的互动,例如,每个对话都配对一张图像,用户会就此图像提问。

要使用这项实验性训练支持,请安装 TRL 的最新版本,使用命令 pip install -U trl。完整的示例脚本可在此处查看。

from trl.commands.cli_utils import SftScriptArguments, TrlParserparser = TrlParser((SftScriptArguments, TrainingArguments))
args, training_args = parser.parse_args_and_config()

我们现在初始化用于指令性微调的聊天模板。

LLAVA_CHAT_TEMPLATE = """A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions. {% for message in messages %}{% if message['role'] == 'user' %}USER: {% else %}ASSISTANT: {% endif %}{% for item in message['content'] %}{% if item['type'] == 'text' %}{{ item['text'] }}{% elif item['type'] == 'image' %}<image>{% endif %}{% endfor %}{% if message['role'] == 'user' %} {% else %}{{eos_token}}{% endif %}{% endfor %}"""

我们将初始化我们的模型和 tokenizer。

from transformers import AutoTokenizer, AutoProcessor, TrainingArguments, LlavaForConditionalGeneration
import torchmodel_id = "llava-hf/llava-1.5-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.chat_template = LLAVA_CHAT_TEMPLATE
processor = AutoProcessor.from_pretrained(model_id)
processor.tokenizer = tokenizermodel = LlavaForConditionalGeneration.from_pretrained(model_id, torch_dtype=torch.float16)

创建一个数据整合器来结合文本和图像对。

class LLavaDataCollator:def __init__(this, processor):this.processor = processordef __call__(this, examples):texts = []images = []for example in examples:messages = example["messages"]text = this.processor.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=False)texts.append(text)images.append(example["images"][0])batch = this.processor(texts, images, return_tensors="pt", padding=True)labels = batch["input_ids"].clone()if this.processor.tokenizer.pad_token_id is not None:labels[labels == this.processor.tokenizer.pad_token_id] = -100batch["labels"] = labelsreturn batchdata_collator = LLavaDataCollator(processor)

加载我们的数据集。

from datasets import load_datasetraw_datasets = load_dataset("HuggingFaceH4/llava-instruct-mix-vsft")
train_dataset = raw_datasets["train"]
eval_dataset = raw_datasets["test"]

初始化 SFTTrainer,传入模型、数据集分割、PEFT 配置和数据整合器,并调用 train()。要将我们的最终检查点推送到 Hub,请调用 push_to_hub()

from trl import SFTTrainertrainer = SFTTrainer(model=model,args=training_args,train_dataset=train_dataset,eval_dataset=eval_dataset,dataset_text_field="text",  # need a dummy fieldtokenizer=tokenizer,data_collator=data_collator,dataset_kwargs={"skip_prepare_dataset": True},
)trainer.train()

保存模型并将其推送到 Hugging Face Hub。

trainer.save_model(training_args.output_dir)
trainer.push_to_hub()

您可以在下方的 VLM 游乐场中直接体验我们新训练的模型 ⬇️

致谢

我们要感谢 Pedro Cuenca, Lewis Tunstall, Kashif Rasul 和 Omar Sanseviero 对这篇博客文章的审阅和建议。

二. 参考文章

Vision Language Models Explained:https://huggingface.co/blog/vlms

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

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

相关文章

10.基础乐理-高音点、低音点

首先唱名&#xff08;do、re、mi、fa、sol、la、si 1234567&#xff09;先对应在 小字一组上&#xff0c;一般调号 1c 时都是对应在 小字一组上 然后从 小字一组 开始往左或往右&#xff0c;往左的音是越低的&#xff0c;往右的音是越高的&#xff0c;这时也需要给唱名&#xf…

47---PCIE硬件电路设计

视频链接 PCIe硬件电路设计01_哔哩哔哩_bilibili PCIe硬件电路设计 1、PCIE介绍 1.1、PCIe简介 PCI-Express (peripheral component interconnect express)是一种高速串行计算机扩展总线标准&#xff0c;用于在CPU与外围组件之间实现高速串行通信。如今已成为主板扩展总线…

jenkins+git+maven+nodejs安装(linux系统)

前文已经安装完成sonarqube和Sonar Scanner了&#xff0c;接下来可以开始jenkins了 jenkins安装 命令&#xff08;版本为 2.440&#xff09; wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo wget https://pkg.jenkins.io/redh…

vue 开发 滑动页面中出现tabs 并且需要分页的

效果 需求 我们这个页面顶部有tabs 栏 而且可以滑动到底部 进行分页 实现这样的页面我们应该怎么做 你应该会想到scroll-view 这个组件吧 下面我们来详情介绍一下这个页面的实现和功能开发 首先展示一下代码 item 循环项 <template><div class"wechat-or…

Clustering and Projected Clustering with Adaptive Neighbors 论文阅读

1 Abstract 许多聚类方法基于输入数据的相似性矩阵对数据组进行划分。因此&#xff0c;聚类结果高度依赖于数据相似性学习。由于相似性度量和数据聚类通常是分两步进行的&#xff0c;学习到的数据相似性可能不是数据聚类的最佳选择&#xff0c;从而导致次优结果。在本文中&…

蓝牙耳机哪个品牌的好?五款实力超群品牌分享推荐!

​音乐不仅仅是一种娱乐&#xff0c;它还能激发灵感、放松心情。一款优质的蓝牙耳机能够让音乐体验更加丰富和便捷。在众多的蓝牙耳机中&#xff0c;我特别挑选了几款在音质、设计和功能上都表现出色的产品。无论你是在家中放松、在健身房锻炼&#xff0c;还是在通勤路上&#…

鸿蒙 UI预览报错

SyntaxError: Unexpected end of JSON input 删除entry下的.preview文件 重新刷新预览

从IPv4到IPv6:解密网络通信的新时代

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 从IPv4到IPv6&#xff1a;解密网络通信的新时代 前言ipv4介绍ipv6介绍IPv4与IPv6的区别IPv4地址枯竭问题和IPv6的解决方案 ipv6的优势IPv6在新兴技术领域的应用 ipv4向ipv6的过渡挑战解决方案IPv6部署…

电压比较器LM339介绍和仿真

电压比较器LM339介绍和仿真 &#x1f4d1;LM339相关特性 工作电源电压范围宽&#xff0c;单电源、双电源均可工作&#xff0c;单电源&#xff1a; 2&#xff5e;36V&#xff0c;双电源&#xff1a;1&#xff5e;18V&#xff1b;消耗电流小&#xff0c; Icc1.3mA&#xff1b;输…

怎么使用JMeter进行性能测试?

一、简介 JMeter是Apache软件基金会下的一款开源的性能测试工具&#xff0c;完全由Java开发。它专注于对我们应用程序进行负载测试和性能测量&#xff0c;最初设计用于web应用程序&#xff0c;现在已经扩展到其他测试功能&#xff0c;比如&#xff1a;FTP、Database和LDAP等。…

CompletableFuture用法详解

CompletableFuture 1 前言1.1 Fork/Join1.2 Future接口的局限性 2 正文2.1 神奇的CompletableFuture2.2 CompletableFuture API2.3 组合式异步编程2.4 几个小例子 1 前言 1.1 Fork/Join 1.概念 Fork/Join 是 JDK 1.7 加入的新的线程池实现&#xff0c;它体现的是一种分治思想…

【项目实战】记录一次PG数据库迁移至GaussDB测试(下)

上一篇分享了安装、迁移&#xff0c;本篇将继续分享迁移前操作、 DRS迁移数据、迁移后一致性检查、问题总结及解决方法。 目录 四、迁移前操作 4.1 源端(PG) 4.2 目标端(GaussDB库) 五、DRS迁移数据 5.1 创建复制用户 5.2创建迁移任务。 六、迁移后一致性检查 6.1使用…

maven 基础用法 (终端界面和IDEA界面)

目录 maven定义 Maven环境配置 仓库 本地仓库 关于pom.xml 运行方式 关于maven在IDEA创建 maven定义 Maven 是一个项目管理和整合工具。通过对 目录结构和构建生命周期 的标准化&#xff0c; 使开发团队用极少的时间就能够自动完成工程的基础构建配置。 ​ Maven 简化了…

【HarmonyOS 4+NEXT】开发工具安装指南

&#x1f64b;‍ 一日之际在于晨 ⭐本期内容&#xff1a;开发工具安装 &#x1f3c6;系列专栏&#xff1a;鸿蒙HarmonyOS4NEXT&#xff1a;探索未来智能生态新纪元 文章目录 前言准备工作下载开发工具安装开发工具配置开发环境总结 前言 随着科技的不断进步&#xff0c;智能设…

浅析Redis④:字典dict实现

什么是dict&#xff1f; 在 Redis 中&#xff0c;dict 是指哈希表&#xff08;hash table&#xff09;的一种实现&#xff0c;用于存储键值对数据。dict 是 Redis 中非常常用的数据结构之一&#xff0c;用于实现 Redis 的键空间。 在 Redis 源码中&#xff0c;dict 是一个通用…

IO流-字节缓冲流

简介 缓冲流就是对原始流进行包装&#xff0c;以提高原始数据流读写数据的性能 缓冲流继承体系 缓冲流的作用 构造器API 代码示例 try(// 创建字节输入流和输出流InputStream is new FileInputStream("test.txt");OutputStream os new FileOutputStream("test…

开源项目|使用go语言搭建高效的环信 IM Rest接口(附源码)

项目背景 环信 Server SDK 是对环信 IM REST API 的封装&#xff0c; 可以节省服务器端开发者对接环信 API 的时间&#xff0c;只需要配置自己的 App Key 相关信息即可使用。 环信目前提供java和PHP版本的Server SDK&#xff0c;此项目使用go语言对环信 IM REST API 进行封装…

在比特币中,1 sat 是多少美元?

普通人绝对想不到&#xff0c;比特币能在2024年达到这个价值&#xff0c;早知道的话&#xff0c;我当初就是破釜沉舟也得买一个啊。 而在4月19号&#xff0c;也将迎来比特币再次减半。减半并不是说玩家手中的比特币要被突然减去一半&#xff0c;而是在后续的挖矿过程中&#xf…

【Unity】游戏场景添加后处理特效PostProcessing

添加后处理特效PostProcessing 添加雾效果后处理何为后处理&#xff1f;添加后处理特效 添加雾效果 依次点击Window -> Rendering -> Lighting添加Lighting面板。 点击Lighting里面的Environment&#xff0c;找到Other Setting 将Fog选项勾选 更改下方的颜色 调整雾的浓…

移动端web适配方案

以下是移动端适配的多个方案&#xff0c;也可以说说你是怎么做的。 正文 自适应&#xff1a;根据不同的设备屏幕大小来自动调整尺寸、大小 响应式&#xff1a;会随着屏幕的实时变动而自动调整&#xff0c;是一种更强的自适应 为什么要做移动端适配&#xff1f; 目前市面上…