视觉语言模型详解

视觉语言模型可以同时从图像和文本中学习,因此可用于视觉问答、图像描述等多种任务。本文,我们将带大家一览视觉语言模型领域: 作个概述、了解其工作原理、搞清楚如何找到真命天“模”、如何对其进行推理以及如何使用最新版的 trl 轻松对其进行微调。

什么是视觉语言模型?

视觉语言模型是可以同时从图像和文本中学习的多模态模型,其属于生成模型,输入为图像和文本,输出为文本。大视觉语言模型具有良好的零样本能力,泛化能力良好,并且可以处理包括文档、网页等在内的多种类型的图像。其拥有广泛的应用,包括基于图像的聊天、根据指令的图像识别、视觉问答、文档理解、图像描述等。一些视觉语言模型还可以捕获图像中的空间信息,当提示要求其检测或分割特定目标时,这些模型可以输出边界框或分割掩模,有些模型还可以定位不同的目标或回答其相对或绝对位置相关的问题。现有的大视觉语言模型在训练数据、图像编码方式等方面采用的方法很多样,因而其能力差异也很大。

VLM 能力

开源视觉语言模型概述

Hugging Face Hub 上有很多开放视觉语言模型,下表列出了其中一些佼佼者。

  • 其中有基础模型,也有可用于对话场景的针对聊天微调的模型。
  • 其中一些模型具有“接地 (grounding )”功能,因此能够减少模型幻觉。
  • 除非另有说明,所有模型的训练语言皆为英语。
模型可否商用模型尺寸图像分辨率其它能力
LLaVA 1.6 (Hermes 34B)34B672x672
deepseek-vl-7b-base7B384x384
DeepSeek-VL-Chat7B384x384聊天
moondream2~2B378x378
CogVLM-base17B490x490
CogVLM-Chat17B490x490接地、聊天
Fuyu-8B8B300x300图像中的文本检测
KOSMOS-2~2B224x224接地、零样本目标检测
Qwen-VL4B448x448零样本目标检测
Qwen-VL-Chat4B448x448聊天
Yi-VL-34B34B448x448双语 (英文、中文)

寻找合适的视觉语言模型

有多种途径可帮助你选择最适合自己的模型。

视觉竞技场 (Vision Arena):西部世界加速的原理 是一个完全基于模型输出进行匿名投票的排行榜,其排名会不断刷新。在该竞技场上,用户输入图像和提示,会有两个匿名的不同的模型为其生成输出,然后用户可以基于他们的喜好选择一个输出。这种方式生成的排名完全是基于人类的喜好的。

视觉竞技场 (Vision Arena)

开放 VLM 排行榜 提供了另一种选择,各种视觉语言模型按照所有指标的平均分进行排名。你还可以按照模型尺寸、私有或开源许可证来筛选模型,并按照自己选定的指标进行排名。

开放 VLM 排行榜

VLMEvalKit 是一个工具包,用于在视觉语言模型上运行基准测试,开放 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/ |

视觉竞技场和开放 VLM 排行榜都仅限于提交给它们的模型,且需要更新才能添加新模型。如果你想查找其他模型,可以在 image-text-to-text 任务下浏览 hub 中的 模型。

在排行榜中,你会看到各种不同的用于评估视觉语言模型的基准,下面我们选择其中几个介绍一下。

MMMU

针对专家型 AGI 的海量、多学科、多模态理解与推理基准 (A Massive Multi-discipline Multimodal Understanding and Reasoning Benchmark for Expert AGI,MMMU) 是评估视觉语言模型的最全面的基准。它包含 11.5K 个多模态问题,这些问题需要大学水平的学科知识以及跨学科 (如艺术和工程) 推理能力。

MMBench

MMBench 由涵盖超过 20 种不同技能的 3000 道单选题组成,包括 OCR、目标定位等。论文还介绍了一种名为 CircularEval 的评估策略,其每轮都会对问题的选项进行不同的组合及洗牌,并期望模型每轮都能给出正确答案。

另外,针对不同的应用领域还有其他更有针对性的基准,如 MathVista (视觉数学推理) 、AI2D (图表理解) 、ScienceQA (科学问答) 以及 OCRBench (文档理解)。

技术细节

对视觉语言模型进行预训练的方法很多。主要技巧是统一图像和文本表征以将其输入给文本解码器用于文本生成。最常见且表现最好的模型通常由图像编码器、用于对齐图像和文本表征的嵌入投影子模型 (通常是一个稠密神经网络) 以及文本解码器按序堆叠而成。至于训练部分,不同的模型采用的方法也各不相同。

例如,LLaVA 由 CLIP 图像编码器、多模态投影子模型和 Vicuna 文本解码器组合而成。作者将包含图像和描述文本的数据集输入 GPT-4,让其描述文本和图像生成相关的问题。作者冻结了图像编码器和文本解码器,仅通过给模型馈送图像与问题并将模型输出与描述文本进行比较来训练多模态投影子模型,从而达到对齐图像和文本特征的目的。在对投影子模型预训练之后,作者把图像编码器继续保持在冻结状态,解冻文本解码器,然后继续对解码器和投影子模型进行训练。这种预训练加微调的方法是训练视觉语言模型最常见的做法。

视觉语言模型典型结构

将投影子模型输出与文本嵌入相串接

再举一个 KOSMOS-2 的例子,作者选择了端到端地对模型进行完全训练的方法,这种方法与 LLaVA 式的预训练方法相比,计算上昂贵不少。预训练完成后,作者还要用纯语言指令对模型进行微调以对齐。还有一种做法,Fuyu-8B 甚至都没有图像编码器,直接把图像块馈送到投影子模型,然后将其输出与文本序列直接串接送给自回归解码器。

大多数时候,我们不需要预训练视觉语言模型,仅需使用现有的模型进行推理,抑或是根据自己的场景对其进行微调。下面,我们介绍如何在 transformers 中使用这些模型,以及如何使用 SFTTrainer 对它们进行微调。

在 transformers 中使用视觉语言模型

你可以使用 LlavaNext 模型对 Llava 进行推理,如下所示。

首先,我们初始化模型和数据处理器。

|  | from transformers import LlavaNextProcessor, LlavaNextForConditionalGeneration |
|  | import torch |
|  |  |
|  | device = 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 requests |
|  |  |
|  | url = "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] \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 对输出词元进行解码。

|  | print(processor.decode(output[0], skip\_special\_tokens=True)) |

使用 TRL 微调视觉语言模型

我们很高兴地宣布,作为一个实验性功能,TRL 的 SFTTrainer 现已支持视觉语言模型!这里,我们给出了一个例子,以展示如何在 llava-instruct 数据集上进行 SFT,该数据集包含 260k 个图像对话对。

llava-instruct 数据集将用户与助理之间的交互组织成消息序列的格式,且每个消息序列皆与用户问题所指的图像配对。

要用上 VLM 训练的功能,你必须使用 pip install -U trl 安装最新版本的 TRL。你可在 此处 找到完整的示例脚本。

|  | from trl.commands.cli\_utils import SftScriptArguments, TrlParser |
|  |  |
|  | parser = 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' %}{% endif %}{% endfor %}{% if message['role'] == 'user' %} {% else %}{{eos\_token}}{% endif %}{% endfor %}""" |

现在,初始化模型和分词器。

|  | from transformers import AutoTokenizer, AutoProcessor, TrainingArguments, LlavaForConditionalGeneration |
|  | import torch |
|  |  |
|  | model\_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 = tokenizer |
|  |  |
|  | model = LlavaForConditionalGeneration.from\_pretrained(model\_id, torch\_dtype=torch.float16) |

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

|  | class LLavaDataCollator: |
|  | def \_\_init\_\_(self, processor): |
|  |  self.processor = processor |
|  |  |
|  | def \_\_call\_\_(self, examples): |
|  |  texts = [] |
|  |  images = [] |
|  | for example in examples: |
|  |  messages = example["messages"] |
|  |  text = self.processor.tokenizer.apply\_chat\_template( |
|  |  messages, tokenize=False, add\_generation\_prompt=False |
|  |  ) |
|  |  texts.append(text) |
|  |  images.append(example["images"][0]) |
|  |  |
|  |  batch = self.processor(texts, images, return\_tensors="pt", padding=True) |
|  |  |
|  |  labels = batch["input\_ids"].clone() |
|  | if self.processor.tokenizer.pad\_token\_id is not None: |
|  |  labels[labels == self.processor.tokenizer.pad\_token\_id] = -100 |
|  |  batch["labels"] = labels |
|  |  |
|  | return batch |
|  |  |
|  | data\_collator = LLavaDataCollator(processor) |

加载数据集。

|  | from datasets import load\_dataset |
|  |  |
|  | raw\_datasets = load\_dataset("HuggingFaceH4/llava-instruct-mix-vsft") |
|  | train\_dataset = raw\_datasets["train"] |
|  | eval\_dataset = raw\_datasets["test"] |

初始化 SFTTrainer ,传入模型、数据子集、PEFT 配置以及数据整理器,然后调用 train() 。要将最终 checkpoint 推送到 Hub,需调用 push_to_hub()

|  | from trl import SFTTrainer |
|  |  |
|  | trainer = SFTTrainer( |
|  |  model=model, |
|  |  args=training\_args, |
|  |  train\_dataset=train\_dataset, |
|  |  eval\_dataset=eval\_dataset, |
|  |  dataset\_text\_field="text", # need a dummy field |
|  |  tokenizer=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() |

你可在 此处 找到训得的模型。你也可以通过下面的页面试玩一下我们训得的模型⬇️。

https://HuggingFaceH4-vlm-playground.hf.space

致谢

我们感谢 Pedro Cuenca、Lewis Tunstall、Kashif Rasul 和 Omar Sanseviero 对本文的评论和建议。


英文原文: https://hf.co/blog/vlms
原文作者: Merve Noyan,Edward Beeching
译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。

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

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

相关文章

【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)

🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、回调函数二、快速排序(Qsort)2.1 Qsort参数部分介绍2.2 不…

报错“Install Js dependencies failed”【鸿蒙开发Bug已解决】

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结Bug解决方案寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了【报错“Install Js dependencies failed”】的问题。 报错如下 问题描述 …

【C++语法练习】计算梯形的面积

题目链接:https://www.starrycoding.com/problem/158 题目描述 已知一个梯形的上底 a a a,下底 b b b和高 h h h,请求出它的面积(结果保留两位小数)。 输入格式 第一行一个整数 T T T表示测试用例个数。 ( 1 ≤ T …

Linux 的静态库和动态库

本文目录 一、静态库1. 创建静态库2. 静态库的使用 二、动态库1. 为什么要引入动态库呢?2. 创建动态库3. 动态库的使用4. 查看可执行文件依赖的动态库 一、静态库 在编译程序的链接阶段,会将源码汇编生成的目标文件.o与引用到的库(包括静态库…

关于用户体验和设计思维

介绍 要开发有效的原型并为用户提供出色的体验,了解用户体验 (UX) 和设计思维的原则至关重要。 用户体验是用户与产品、服务或系统交互并获得相应体验的过程。 设计思维是一种解决问题的方法,侧重于创新和创造。 在启动期实现用户体验和设计思维时&#…

大数据分析与内存计算学习笔记

一、Scala编程初级实践 1.计算级数: 请用脚本的方式编程计算并输出下列级数的前n项之和Sn,直到Sn刚好大于或等于q为止,其中q为大于0的整数,其值通过键盘输入。(不使用脚本执行方式可写Java代码转换成Scala代码执行&a…

监视器和显示器的区别,普通硬盘和监控硬盘的区别

监视器与显示器的区别,你真的知道吗? 中小型视频监控系统中,显示系统是最能展现效果的一个重要环节,显示系统的优劣将直接影响视频监控系统的用户体验满意度。 中小型视频监控系统中,显示系统是最能展现效果的一个重要…

二叉树详细介绍与代码生成遍历

目录 树的概念及其结构树的构造——代码表示 二叉树概念及介绍二叉树的存储结构二叉树的顺序结构二叉树的链式结构链表的代码展示堆的基本概念和结构堆的代码体现二叉树生成二叉树遍历 四种不同遍历方式——代码展示 树的概念及其结构 要了解二叉树,那么首要的就是…

Spark Structured Streaming 分流或双写多表 / 多数据源(Multi Sinks / Writes)

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…

探索潜力:中心化交易所平台币的对比分析

核心观点 平台币在过去一年里表现差异显著: 在过去的一年里,只有少数几个平台币如BMX、BGB和MX的涨幅超过了100%。相比之下,由于市值较高,BNB和OKB的涨幅相对较低。 回购和销毁机制在平台币价值中起决定性作用: 像M…

2024五一数学建模竞赛(五一赛)选题建议+初步分析

提示&#xff1a;DS C君认为的难度&#xff1a;B>A>C&#xff0c;开放度&#xff1a;AB<C。 以下为A-C题选题建议及初步分析&#xff1a; A题&#xff1a;钢板最优切割路径问题 l 难度评估&#xff1a;中等难度。涉及数学建模和优化算法&#xff0c;需要设计最优的…

前后端数据加密代码实战(vue3.4+springboot 2.7.18)

简述&#xff1a; 文章主要讲述了在vue3与springboot交互数据的个人使用的一个加密形式 SHA256不可逆加密AES对称加密RSA非对称加密 加密算法就不带大家深入了&#xff0c;对于它的使用文章中有明确的案例 数据加密的大概流程为&#xff1a;&#xff08;有更优秀的方案可以…

Springboot+Vue项目-基于Java+MySQL的入校申报审批系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Python用KNN处理缺失值(4月30-5月1日)

首先试验KNN的简单示例代码 #方法3&#xff1a; # 本论文拟采用的填充缺失值的方法为KNN: import pandas as pd from sklearn.impute import KNNImputer #创建一个包含缺失值的数据集 data_KNN{第一列:[1,2,None,4,5],第二列:[3,None,5,7,9],第三列:[2,4,6,None,10] } dfpd.Da…

有哪些ai自动生成图片软件?AI绘画工具推荐

AI绘画工具是近年来快速发展的一种创新技术&#xff0c;它可以通过算法和机器学习技术来自动生成图片。那么又有有哪些ai自动生成图片软件呢&#xff1f;下面是小编给大家的AI绘画工具推荐。 一、爱制作AI 爱制作AI是一款多功能的人工智能助手&#xff0c;具备AI问答、AI写作、…

【FPGA】优化设计指南(一):设计原则

目录 避免采用不可综合的语句设计时采用同步的时钟组合逻辑与毛刺异步复位与同步复位动态分析与静态分析功能流水线时序违例乒乓操作面积和速度的平衡避免采用不可综合的语句 1.#1000延时语句 2.除法运算/,除非除数为2的整次幂 3.实数类型不可综合(real) 4.综上,使用可综合…

STM32进入睡眠模式的方法

#STM32进入睡眠模式的方法 今天学习了如何控制STM32进入睡眠模式&#xff0c;进入睡眠模式的好处就是省电&#xff0c;今天学习的只是浅度睡眠&#xff0c;通过中断就能唤醒。比如单片机在那一放&#xff0c;也许好几天好几个月都不用一次&#xff0c;整天的在那空跑while循环…

C#应用程序实现多屏显示

前言 随着业务发展&#xff0c;应用程序在一些特定场景下&#xff0c;只在一个显示器上展示信息已经不能满足用户需求。我们如何把主屏运行程序中多个窗体移动到各个扩展屏幕位置显示呢&#xff1f;C# 是通过什么方式来实现的&#xff0c;下面介绍 C# 使用 Screen 类的方式来实…

64、二分-搜索二维矩阵

思路&#xff1a; 通过使用二分方式&#xff0c;对于每行进行二分&#xff0c;因为每行的最后一个数小于下一行的第一个数&#xff0c;我们就可以依次二分。首先取出行数N&#xff0c;然后从0-N进行二分&#xff0c;如果mid最后一个数小于目标值说明0-mid中没有&#xff0c;舍弃…

jenkins转载文本

基于Docker容器DevOps应用方案 企业业务代码发布系统 一、企业业务代码发布方式 1.1 传统方式 以物理机或虚拟机为颗粒度部署部署环境比较复杂&#xff0c;需要有先进的自动化运维手段出现问题后重新部署成本大&#xff0c;一般采用集群方式部署部署后以静态方式展现 1.2 容…