视觉语言模型详解【VLM】

news2025/5/22 20:56:22

视觉语言模型(Visual Language Models)是可以同时从图像和文本中学习以处理许多任务的模型,从视觉问答到图像字幕。在这篇文章中,我们将介绍视觉语言模型的主要组成部分:概述,了解它们的工作原理,弄清楚如何找到合适的模型,如何使用它们进行推理以及如何使用新版 trl 轻松微调它们!

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

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

视觉语言模型被广泛定义为可以从图像和文本中学习的多模态模型。它们是一种生成式模型,可以接受图像和文本输入并生成文本输出。

大型视觉语言模型具有良好的零样本能力,具有良好的泛化能力,并且可以处理多种类型的图像,包括文档、网页等。用例包括谈论图像、通过指令进行图像识别、视觉问答、文档理解、图像字幕等。

一些视觉语言模型还可以捕获图像中的空间属性。当系统提示检测或分割特定主题时,这些模型可以输出边界框或分割掩码,也可以定位不同的实体或回答有关其相对或绝对位置的问题。

现有的大型视觉语言模型集、它们所训练的数据、它们对图像的编码方式以及它们的能力都存在很大差异。

2、开源视觉语言模型概述

Hugging Face Hub 上有许多开源视觉语言模型。下表列出了一些最突出的模型。

  • 有基础模型,也有针对聊天进行微调的模型,可用于对话模式。
  • 其中一些模型具有称为“grounding”的功能,可减少模型幻觉。
  • 除非另有说明,所有模型均使用英语进行训练。
ModelPermissive LicenseModel SizeImage ResolutionAdditional Capabilities
LLaVA 1.6 (Hermes 34B)34B672x672
deepseek-vl-7b-base7B384x384
DeepSeek-VL-Chat7B384x384Chat
moondream2~2B378x378
CogVLM-base17B490x490
CogVLM-Chat17B490x490Grounding, chat
Fuyu-8B8B300x300Text detection within image
KOSMOS-2~2B224x224Grounding, zero-shot object detection
Qwen-VL4B448x448Zero-shot object detection
Qwen-VL-Chat4B448x448Chat
Yi-VL-34B34B448x448Bilingual (English, Chinese)

3、寻找合适的视觉语言模型

有很多方法可以为你的用例选择最合适的模型。

Vision Arena 是一个完全基于模型输出匿名投票的排行榜,并不断更新。在这个竞技场中,用户输入一张图片和一个提示,然后匿名抽取两个不同模型的输出,然后用户可以选择他们喜欢的输出。这样,排行榜就完全基于人类的偏好构建。

Open VLM Leaderboard 是另一个排行榜,其中根据这些指标和平均分数对各种视觉语言模型进行排名。你还可以根据模型大小、专有或开源许可证筛选模型,并根据不同的指标进行排名。

VLMEvalKit 是一个工具包,用于在支持 Open VLM Leaderboard 的视觉语言模型上运行基准测试。另一个评估套件是 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/ 

Vision Arena 和 Open VLM Leaderbard 都仅限于提交给它们的模型,并且需要更新才能添加新模型。如果你想查找其他模型,可以浏览 Hub 中图像-文本-文本任务下的模型。

你可能会在排行榜中遇到不同的用于评估视觉语言模型的基准。我们将介绍其中的一些。

  • 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,它甚至没有图像编码器。相反,图像块直接输入到投影层,然后序列经过自回归解码器。

大多数情况下,你不需要预先训练视觉语言模型,因为可以使用现有模型之一,也可以根据自己的用例对其进行微调。接下来我们将介绍如何使用 transformer 使用这些模型,以及如何使用 SFTTrainer 进行微调。

5、用transformer 执行视觉语言模型

你可以使用 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)

现在我们将图像和文本提示传递给处理器,然后将处理后的输入传递给生成。请注意,每个模型都使用自己的提示模板,请小心使用正确的模板以避免性能下降。

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] <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)

调用解码来解码输出标记:

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

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

我们很高兴地宣布,TRL 的 SFTTrainer 现在包括对视觉语言模型的实验性支持!我们在此提供了一个示例,说明如何使用包含 260k 个图像对话对的 llava-instruct 数据集在 Llava 1.5 VLM 上执行 SFT。该数据集包含格式化为消息序列的用户助手交互。例如,每个对话都与用户询问问题的图像配对。

要使用实验性的 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' %}<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()。要将我们的最终检查点推送到 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()

可以在此处找到训练好的模型。


原文链接:视觉语言模型详解 - BimAnt

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

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

相关文章

MySQL事务篇2:InnoDB引擎

InnoDB是MySQL的默认存储引擎&#xff0c;支持ACID事务、行级锁定和外键约束&#xff0c;通过多版本并发控制&#xff08;MVCC&#xff09;实现高并发性能。InnoDB使用聚簇索引存储数据&#xff0c;具备崩溃恢复能力&#xff0c;确保数据一致性和完整性。其主要特性包括数据和索…

谷粒商城实战(029 业务-订单支付模块-支付宝支付2)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第305p-第p310的内容 代码编写 前端代码 这里使用的是jsp 在这里引用之前配置的各种支付信息 在AlipayConfig.java里 这里是调用阿里巴巴写…

【onnx问题解决】关键词:found at least two devices、torch.onnx.export

关键词&#xff1a;Expected all tensors to be on the same device, but found at least two devices, cpu and cuda:0! 报错&#xff1a; [34m[1mONNX:[0m export failure ❌ 3.8s: Expected all tensors to be on the same device, but found at least two devices, cpu an…

【R语言】获取任意颜色的HTML 颜色代码、十六进制颜色代码、 RGB代码

网站来源&#xff1a; https://htmlcolorcodes.com/ 界面如下所示&#xff1a; 通过鼠标任意选择不同的颜色&#xff0c;就能获取该色的十六进制代码、RGB代码等。 除此之外&#xff0c;还提供了一些常用颜色的便捷选项,如下&#xff1a; 任意选择一种颜色&#xff0c;即可出…

Java开发快速入门

Java执行流程分析 .java文件 **(源文件)** ---javac编译--->.class文件 **(字节码文件)** ---java运行--->结果 运行的本质: .java文件称之为源文件 .class文件称之为字节码文件 什么是编译 javac Hello.java 1. 有了java源文件, 通过编译器将其编译成JVM可以识别的…

【吊打面试官系列】Java高并发篇 - AQS 支持几种同步方式 ?

大家好&#xff0c;我是锋哥。今天分享关于 【AQS 支持几种同步方式 &#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; AQS 支持几种同步方式 &#xff1f; 1、独占式 2、共享式 这样方便使用者实现不同类型的同步组件&#xff0c;独占式如 ReentrantLock&…

C语言动态顺序表结构的创建、初始化结构、尾插、尾删、头插、头删、指定位置插入、指定位置删除、找指定数值下标等的介绍

文章目录 前言一、 结构创建二、 初始化结构三、 打印动态顺序表四、 销毁动态顺序表五、 尾插六、尾删七、 头插八、 头删九、指定位置插入十、指定位置删除十一、找指定数值下标总结 前言 C语言动态顺序表结构的创建、初始化结构、尾插、尾删、头插、头删、指定位置插入、指…

Java 实验12 线程同步与通信

&#xff08;一&#xff09;实验目的 1、掌握JAVA中多线程的实现方法&#xff1b; 2、重点掌握多线程的同步与通信机制&#xff1b; 3、熟悉JAVA中有关多线程同步与通信的方法 &#xff1b; 4、能使用多线程机制解决实际应用中的线程同步与通信问题。 &#xff08;二&…

【社会信用体系1003】 企业违规新解:社会信用环境改善的实证分析!

今天给大家分享的是来自于国内顶级期刊金融研究2023年发表论文——《社会信用环境改善降低了企业违规吗&#xff1f;——来自“中国社会信用体系建设”的证据》所用到的重要数据集&#xff0c;该文章从企业层面探讨了社会信用系统建设对企业违规行为的影响&#xff0c;更精准地…

Srping 历史

一、History of Spring and the Spring Framework Spring came into being in 2003 as a response to the complexity of the early J2EE specifications. While some consider Java EE and its modern-day successor Jakarta EE to be in competition with Spring, they are …

小白不知道怎么投稿?记住这个好方法

作为一名单位信息宣传员,我最初踏上这条道路时,满心憧憬着通过文字传递我们单位的精彩瞬间,让社会听见我们的声音。然而,理想与现实之间的距离,却在一次次邮箱投稿的石沉大海中渐渐清晰。那时的我,像所有“小白”一样,以为只要用心撰写稿件,通过电子邮件发给各大媒体,就能收获满…

亚马逊云主管马特·加尔曼面临压力,致力于在人工智能领域赶超竞争对手

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Learning Deep Intensity Field for Extremely Sparse-View CBCT Reconstruction

摘要 稀疏视图锥束CT&#xff08;CBCT&#xff09;重建是降低辐射剂量和临床应用的一个重要方向&#xff0c;以往基于体素的重建方法将CT表示为离散体素&#xff0c;由于使用3D解码器&#xff0c;导致存储要求高和空间分辨率有限。我们将CT体积表示为连续强度场&#xff0c;并…

全面解析Java.lang.ClassCastException异常

全面解析Java.lang.ClassCastException异常 全面解析Java.lang.ClassCastException异常&#xff1a;解决方案与最佳实践 &#x1f680;&#x1f4da;摘要引言1. 什么是Java.lang.ClassCastException&#xff1f;代码示例 2. 报错原因2.1 类型不兼容2.2 泛型类型擦除2.3 接口和实…

【C++】STL快速入门基础

文章目录 STL&#xff08;Standard Template Library&#xff09;1、一般介绍2、STL的六大组件2.1、STL容器2.2、STL迭代器2.3、相关容器的函数vectorpairstringqueuepriority_queuestackdequeset, map, multiset, multimapunordered_set, unordered_map, unordered_multiset, …

Autodesk Flame 2025 for Mac:视觉特效制作的终极利器

在数字时代&#xff0c;视觉特效已经成为电影、电视制作中不可或缺的一部分。Autodesk Flame 2025 for Mac&#xff0c;这款专为视觉特效师打造的终极工具&#xff0c;将为您的创作提供无尽的可能。 Autodesk Flame 2025 for Mac拥有强大的三维合成环境&#xff0c;能够支持您…

stm32通过esp8266连接阿里云平台代码讲解

连接服务器 首先&#xff0c;按照一定的规则&#xff0c;获取连接阿里服务器所需要的ClientID&#xff08;客户端D&#xff09;、Username&#xff08;用户名&#xff09;、Passward(密码)&#xff0c;ServerIP&#xff08;域名&#xff09;&#xff0c;ServerPort&#xff08…

Qt | QTabBar 类(选项卡栏)

01、上节回顾 Qt | QStackedLayout 类(分组布局或栈布局)、QStackedWidget02、简介 1、QTabBar类直接继承自 QWidget。该类提供了一个选项卡栏,该类仅提供了一个选项卡, 并没有为每个选项卡提供相应的页面,因此要使选项卡栏实际可用,需要自行为每个选项卡设置需要显示的页…

冯 • 诺依曼体系结构和操作系统

目录 冯诺依曼体系结构基于冯诺依曼体系数据的高效流转数据流转示例操作系统(Operator System)操作系统(Operator System)层次结构硬件部分系统软件部分用户部分 管理——先描述&#xff0c;再组织 就一个程序而言&#xff0c;需要在计算机中运行的才能实现它的价值&#xff0c…

jmeter发送webserver请求和上传请求

有时候在项目中会遇到webserver接口和上传接口的请求&#xff0c;大致参考如下 一、发送webserver请求 先获取登录接口的token&#xff0c;再使用cookie管理器进行关联获取商品(webserver接口)&#xff0c;注意参数一般是写在消息体数据中&#xff0c;消息体有点像HTML格式 执…