经过一年的不懈努力,今天我们很高兴发布Qwen2-VL ! Qwen2-VL 是 Qwen 模型系列中视觉语言模型的最新版本。
SoTA 理解各种分辨率和比例的图像:Qwen2-VL 在视觉理解基准上实现了最先进的性能,包括 MathVista、DocVQA、RealWorldQA、MTVQA 等。
理解20分钟以上的视频:借助在线流媒体功能,Qwen2-VL可以通过基于高质量视频的问答、对话、内容创作等来理解20分钟以上的视频。
可以操作手机、机器人等的智能体:Qwen2-VL具有复杂的推理和决策能力,可以与手机、机器人等设备集成,基于视觉环境和文本指令进行自动操作。
多语言支持:为了服务全球用户,除了英语和中文之外,Qwen2-VL现在支持图像内不同语言文本的理解,包括大多数欧洲语言、日语、韩语、阿拉伯语、越南语等。
朴素动态分辨率:与以前不同,Qwen2-VL可以处理任意图像分辨率,将它们映射到动态数量的视觉标记中,提供更接近人类的视觉处理体验。
多模态旋转位置嵌入(M-ROPE) :将位置嵌入分解为多个部分,以捕获1D文本、2D视觉和3D视频位置信息,增强其多模态处理能力。
我们开源了Qwen2-VL模型,包括Apache 2.0许可下的Qwen2-VL-2B和Qwen2-VL-7B,以及Qwen许可下的Qwen2-VL-72B。这些模型现已与 Hugging Face Transformers、vLLM 和其他第三方框架集成。我们希望您喜欢使用它们!
2024.09.19:指令调整的 Qwen2-VL-72B 模型及其量化版本 [AWQ、GPTQ-Int4、GPTQ-Int8] 现已推出。我们还同步发布了Qwen2-VL论文。
2024年8月30日:我们发布了Qwen2-VL系列。 2B 和 7B 型号现已上市,开源的 72B 型号即将推出。欲了解更多详情,请查看我们的博客!
基准 | 以前的 SoTA (开源 LVLM) | 克劳德-3.5 十四行诗 | GPT-4o | Qwen2-VL-72B (?? | Qwen2-VL-7B (??) | Qwen2-VL-2B (??) |
---|---|---|---|---|---|---|
MMMU值 | 58.3 | 68.3 | 69.1 | 64.5 | 54.1 | 41.1 |
MMMU-专业版 | 46.9 | 51.5 | 51.9 | 46.2 | 43.5 | 37.6 |
DocVQA测试 | 94.1 | 95.2 | 92.8 | 96.5 | 94.5 | 90.1 |
信息VQA测试 | 82.0 | - | - | 84.5 | 76.5 | 65.5 |
图表QA测试 | 88.4 | 90.8 | 85.7 | 88.3 | 83.0 | 73.5 |
文本VQA值 | 84.4 | - | - | 85.5 | 84.3 | 79.7 |
OCRBench | 第852章 | 第788章 | 第736章 | 第877章 | 第845章 | 第794章 |
MTV质量保证 | 17.3 | 25.7 | 27.8 | 30.9 | 25.6 | 18.1 |
VCR简单 | 84.67 | 63.85 | 91.55 | 91.93 | 89.70 | 81.45 |
VCR zh 简单 | 22.09 | 1.0 | 14.87 | 65.37 | 59.94 | 46.16 |
真实世界质量保证 | 72.2 | 60.1 | 75.4 | 77.8 | 70.1 | 62.9 |
MME总和 | 2414.7 | 1920.0 | 2328.7 | 2482.7 | 2326.8 | 1872.0 |
MMBench-EN测试 | 86.5 | 79.7 | 83.4 | 86.5 | 83.0 | 74.9 |
MMBench-CN测试 | 86.3 | 80.7 | 82.1 | 86.6 | 80.5 | 73.5 |
MMBench-V1.1测试 | 85.5 | 78.5 | 82.2 | 85.9 | 80.7 | 72.2 |
MMT-台架测试 | 63.4 | - | 65.5 | 71.7 | 63.7 | 54.5 |
MM星 | 67.1 | 62.2 | 63.9 | 68.3 | 60.7 | 48.0 |
MMVet GPT-4-涡轮 | 65.7 | 66.0 | 69.1 | 74.0 | 62.0 | 49.5 |
HallBench平均 | 55.2 | 49.9 | 55.0 | 58.1 | 50.6 | 41.7 |
MathVista测试迷你 | 67.5 | 67.7 | 63.8 | 70.5 | 58.2 | 43.0 |
数学视觉 | 16.97 | - | 30.4 | 25.9 | 16.3 | 12.4 |
基准 | 以前的 SoTA (开源 LVLM) | 双子座 1.5-Pro | GPT-4o | Qwen2-VL-72B (??) | Qwen2-VL-7B (??) | Qwen2-VL-2B (??) |
---|---|---|---|---|---|---|
MVBench | 69.6 | - | - | 73.6 | 67.0 | 63.2 |
感知测试测试 | 66.9 | - | - | 68.0 | 62.3 | 53.9 |
自我图式测试 | 62.0 | 63.2 | 72.2 | 77.9 | 66.7 | 54.9 |
视频MME (无/无潜艇) | 66.3/69.6 | 75.0 / 81.3 | 71.9/77.2 | 71.2/77.8 | 63.3/69.0 | 55.6/60.4 |
基准 | 公制 | 以前的 SoTA | GPT-4o | Qwen2-VL-72B | |
---|---|---|---|---|---|
一般的 | FnCall [1] | TM | - | 90.2 | 93.1 |
EM | - | 50.0 | 53.2 | ||
游戏 | 数轴 | SR | 89.4 [2] | 91.5 | 100.0 |
二十一点 | SR | 40.2 [2] | 34.5 | 42.6 | |
易点 | SR | 50.0 [2] | 85.5 | 100.0 | |
第24点 | SR | 2.6 [2] | 3.0 | 4.5 | |
安卓 | 爱兹 | TM | 83.0 [3] | 70.0 | 89.6 |
EM | 47.7 [3] | 35.3 | 72.1 | ||
艾2雷神 | ALFRED有效-未见 | SR | 67.7 [4] | - | 67.8 |
气相色谱 | 75.3 [4] | - | 75.8 | ||
VLN | R2R有效-未见 | SR | 79.0 | 43.7 [5] | 51.7 |
REVERIE有效-未见 | SR | 61.0 | 31.6 [5] | 31.0 |
SR、GC、TM 和 EM 是成功率、目标条件成功、类型匹配和精确匹配的缩写。 ALFRED 得到 SAM [6]的支持。
Qwen 团队自行策划的函数调用基准
通过强化学习微调大型视觉语言模型作为决策代理
动物园里的 Android:GUI 代理的行动链思想
ThinkBot:带有思想链推理的具身指令
MapGPT:地图引导提示与视觉和语言导航的自适应路径规划
分割任何东西。
型号 | 增强现实 | 德 | FR | 它 | 日本航空协会 | KO | 鲁 | TH | 六、 | 平均电压 |
---|---|---|---|---|---|---|---|---|---|---|
Qwen2-VL-72B | 20.7 | 36.5 | 44.1 | 42.8 | 21.6 | 37.4 | 15.6 | 17.7 | 41.6 | 30.9 |
GPT-4o | 20.2 | 34.2 | 41.2 | 32.7 | 20.0 | 33.9 | 11.5 | 22.5 | 34.2 | 27.8 |
克劳德3作品 | 15.1 | 33.4 | 40.6 | 34.4 | 19.4 | 27.2 | 13.0 | 19.5 | 29.1 | 25.7 |
双子座超 | 14.7 | 32.3 | 40.0 | 31.8 | 12.3 | 17.2 | 11.8 | 20.3 | 28.6 | 23.2 |
这些结果是在 MTVQA 基准上评估的。
下面,我们提供简单的示例来展示如何使用 Qwen2-VL 和 ?模型范围和?变形金刚。
Qwen2-VL 的代码已包含在最新的 Hugging Face Transformer 中,我们建议您使用以下命令从源代码构建:
pip install git+https://github.com/huggingface/transformers@21fac7abba2a37fae86106f87fcf9974fd1e3830 accelerate
或者您可能会遇到以下错误:
KeyError: 'qwen2_vl'
注意:当前最新版本的transformers
在加载 Qwen2-VL 配置时存在错误,因此您需要安装如上所述的特定版本的变压器。
我们提供了一个工具包来帮助您更方便地处理各种类型的视觉输入,就像您使用 API 一样。这包括 base64、URL 以及交错的图像和视频。您可以使用以下命令安装它:
# 强烈建议使用 `[decord]` 功能以加快视频加载速度。pip install qwen-vl-utils[decord]
如果您不使用 Linux,则可能无法从 PyPI 安装decord
。在这种情况下,您可以使用pip install qwen-vl-utils
,它将回退到使用 torchvision 进行视频处理。但是,您仍然可以从源代码安装decord,以便在加载视频时使用decord。
这里我们展示了一个代码片段,向您展示如何将聊天模型与transformers
和qwen_vl_utils
结合使用:
from Transformers import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessorfrom qwen_vl_utils import process_vision_info# default: 在可用设备上加载模型 model = Qwen2VLForConditionalGeneration.from_pretrained("Qwen/Qwen2-VL-7B-Instruct", torch_dtype="auto", device_map= "auto")# 我们建议启用 flash_attention_2 以获得更好的加速和节省内存,特别是在多图像和视频场景中。# model = Qwen2VLForConditionalGeneration.from_pretrained(# "Qwen/Qwen2-VL-7B-Instruct",# torch_dtype=torch.bfloat16,# attn_implementation="flash_attention_2",# device_map=" auto",# )# 默认处理器processor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct")# 模型中每张图像的视觉标记数量默认范围为4-16384。# 可以根据需要设置min_pixels和max_pixels,比如令牌范围为 256-1280,以平衡性能和成本。# min_pixels = 256*28*28# max_pixels = 1280*28*28# 处理器 = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct", min_pixels=min_pixels, max_pixels=max_pixels)messages = [ {“角色”:“用户”,“内容”:[ {"type": "image","image": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg", }, {"type": "text", "text": "描述这张图片。"}, ], } ]# 推理准备text =processor.apply_chat_template(messages, tokenize=False, add_ Generation_prompt=True)image_inputs, video_inputs = process_vision_info(messages)inputs =processor(text=[text],images=image_inputs,videos=video_inputs,padding=True, return_tensors =“pt”, )inputs = input.to("cuda")# 推理:生成输出 generated_ids = model.generate(**inputs, max_new_tokens=128) generated_ids_trimmed = [out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs .input_ids、生成的_ids) ]output_text=processor.batch_decode( generated_ids_trimmed,skip_special_tokens=True,clean_up_tokenization_spaces=False)print(output_text)
# 包含多个图像和文本的消息 querymessages = [ {“角色”:“用户”,“内容”:[ {"type": "image", "image": "file:///path/to/image1.jpg"}, {"type": "image", "image": "file:///path/to/image2.jpg"}, {"type": "text", "text": "识别这些图像之间的相似之处。"}, ], } ]# 推理准备text =processor.apply_chat_template(messages, tokenize=False, add_ Generation_prompt=True)image_inputs, video_inputs = process_vision_info(messages)inputs =processor(text=[text],images=image_inputs,videos=video_inputs,padding=True, return_tensors =“pt”, )inputs = input.to("cuda")# Inference generated_ids = model.generate(**inputs, max_new_tokens=128) generated_ids_trimmed = [out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids) ]output_text=processor.batch_decode( generated_ids_trimmed,skip_special_tokens=True,clean_up_tokenization_spaces=False)print(output_text)
# 包含视频图像列表和文本的消息 querymessages = [ {“角色”:“用户”,“内容”:[ {"type": "video","video": ["file:///path/to/frame1.jpg","file:///path/to/frame2.jpg","file:///路径/to/frame3.jpg","文件:///path/to/frame4.jpg", ], }, {"type": "text", "text": "描述这个视频。"}, ], } ]# 包含本地视频路径和文本查询的消息 = [ {“角色”:“用户”,“内容”:[ {“类型”:“视频”,“视频”:“文件:///path/to/video1.mp4”,“最大像素”:360 * 420,“fps”:1.0, }, {"type": "text", "text": "描述这个视频。"}, ], } ]# 包含视频 URL 和文本查询的消息 = [ {“角色”:“用户”,“内容”:[ {"type": "video","video": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-VL/space_woaudio.mp4", }, {"type": "text", "text": "描述这个视频。"}, ], } ]# 推理准备text =processor.apply_chat_template(messages, tokenize=False, add_ Generation_prompt=True)image_inputs, video_inputs = process_vision_info(messages)inputs =processor(text=[text],images=image_inputs,videos=video_inputs,padding=True, return_tensors =“pt”, )inputs = input.to("cuda")# Inference generated_ids = model.generate(**inputs, max_new_tokens=128) generated_ids_trimmed = [out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids) ]output_text=processor.batch_decode( generated_ids_trimmed,skip_special_tokens=True,clean_up_tokenization_spaces=False)print(output_text)
视频URL兼容性很大程度上取决于第三方库版本。详细信息如下表所示。如果您不想使用默认后端,请通过FORCE_QWENVL_VIDEO_READER=torchvision
或FORCE_QWENVL_VIDEO_READER=decord
更改后端。
后端 | HTTP协议 | HTTPS |
---|---|---|
火炬视觉 >= 0.19.0 | ✅ | ✅ |
火炬视觉 < 0.19.0 | ❌ | ❌ |
装饰 | ✅ | ❌ |
# 批量推理的示例消息messages1 = [ {“角色”:“用户”,“内容”:[ {"type": "image", "image": "file:///path/to/image1.jpg"}, {"type": "image", "image": "file:///path/to/image2.jpg"}, {"type": "text", "text": "这些图片中有哪些共同元素?"}, ], } ]消息2 = [ {"role": "system", "content": "你是一个得力助手。"}, {"role": "用户", "content": "你是谁?"}, ]# 合并消息进行批量处理messages = [messages1, messages2]# 批量推理准备texts = [processor.apply_chat_template(msg, tokenize=False, add_ Generation_prompt=True)for msg in messages]image_inputs, video_inputs = process_vision_info(messages)inputs =处理器(文本=文本,图像= image_inputs,视频= video_inputs,填充= True,return_tensors =“pt”, )inputs = input.to("cuda")# 批量推理 generated_ids = model.generate(**inputs, max_new_tokens=128) generated_ids_trimmed = [out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids ) ]output_texts=processor.batch_decode( generated_ids_trimmed,skip_special_tokens=True,clean_up_tokenization_spaces=False)print(output_texts)
我们强烈建议用户尤其是中国大陆的用户使用ModelScope。 snapshot_download
可以帮助您解决有关下载检查点的问题。
对于输入图像,我们支持本地文件、base64 和 URL。对于视频,我们目前仅支持本地文件。
# 您可以直接将本地文件路径、URL或base64编码的图像插入到文本中您想要的位置。## 本地文件pathmessages = [ {“角色”:“用户”,“内容”:[ {"type": "image", "image": "file:///path/to/your/image.jpg"}, {"type": "text", "text": "描述这张图片。"}, ], } ]## 图片 URL 消息 = [ {“角色”:“用户”,“内容”:[ {“类型”:“图像”,“图像”:“http://path/to/your/image.jpg”}, {"type": "text", "text": "描述这张图片。"}, ], } ]## Base64 编码的图像消息 = [ {“角色”:“用户”,“内容”:[ {"type": "image", "image": "data:image;base64,/9j/..."}, {"type": "text", "text": "描述这张图片。"}, ], } ]
该模型支持多种分辨率输入。默认情况下,它使用原始分辨率进行输入,但更高的分辨率可以提高性能,但代价是更多的计算。用户可以设置最小和最大像素数,以实现适合其需求的最佳配置,例如令牌计数范围为 256-1280,以平衡速度和内存使用。
min_pixels = 256 * 28 * 28max_pixels = 1280 * 28 * 28processor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct", min_pixels=min_pixels, max_pixels=max_pixels)
此外,我们提供了两种方法来细粒度控制输入到模型的图像大小:
指定精确尺寸:直接设置resized_height
和resized_width
。这些值将四舍五入到最接近的 28 倍数。
定义 min_pixels 和 max_pixels:图像将被调整大小以将其纵横比保持在 min_pixels 和 max_pixels 范围内。
# 调整大小的高度和调整大小的宽度消息 = [ {“角色”:“用户”,“内容”:[ {“类型”:“图像”,“图像”:“文件:///path/to/your/image.jpg”,“调整大小的高度”:280,“调整大小的宽度”:420, }, {"type": "text", "text": "描述这张图片。"}, ], } ]# min_pixels 和 max_pixelsmessages = [ {“角色”:“用户”,“内容”:[ {“类型”:“图像”,“图像”:“文件:///path/to/your/image.jpg”,“最小像素”:50176,“最大像素”:50176, }, {"type": "text", "text": "描述这张图片。"}, ], } ]
默认情况下,图像和视频内容直接包含在对话中。处理多个图像时,为图像和视频添加标签以便更好地参考会很有帮助。用户可以通过以下设置控制此行为:
对话=[ {"role": "user","content": [{"type": "image"}, {"type": "text", "text": "你好,你好吗?"}], }, {"role": "assistant","content": "我很好,谢谢您的询问。今天需要什么帮助吗?", }, {“角色”:“用户”,“内容”:[ {"type": "text", "text": "你能描述一下这些图片和视频吗?"}, {“类型”:“图像”}, {“类型”:“图像”}, {“类型”:“视频”}, {"type": "text", "text": "这些是我假期里的。"}, ], }, {"role": "assistant","content": "我很乐意为您描述这些图像和视频。您能提供更多有关您的假期的背景信息吗?", }, {"role": "user","content": "这是一次山里旅行。你能看到图片和视频中的细节吗?", }, ]# 默认值:prompt_without_id = process.apply_chat_template(conversation, add_ Generation_prompt=True)# 例外输出: '<|im_start|>systemnYou are a happy Assistant.<|im_end|>n<|im_start|>usern<|vision_start|>< |image_pad|><|vision_end|>您好,最近怎么样你?<|im_end|>n<|im_start|>assistantn我很好,谢谢你的询问。今天我能为您提供什么帮助?<|im_end|>n<|im_start|>usern您能描述一下这些图像和视频吗?<|vision_start|><|image_pad|><|vision_end|><|vision_start|><|image_pad| ><|vision_end|><|vision_start|><|video_pad|><|vision_end|>这些来自我的假期。<|im_end|>n<|im_start|>assistantn我很乐意为您描述图像和视频。您能否提供更多有关您假期的背景信息?<|im_end|>n<|im_start|>usern这是一次山间旅行。你能看到图像和视频中的详细信息吗?<|im_end|>n<|im_start|>assistantn'# add idsprompt_with_id = process.apply_chat_template(conversation, add_ Generation_prompt=True, add_vision_id=True)# 异常输出: '<|im_start |>systemn你是一个得力助手。<|im_end|>n<|im_start|>usernPicture 1: <|vision_start|><|image_pad|><|vision_end|>你好,你好吗?<|im_end|>n<|im_start|>assistantn我很好,谢谢你的询问。今天我能为您提供什么帮助?<|im_end|>n<|im_start|>usern您能描述一下这些图像和视频吗?图片 2: <|vision_start|><|image_pad|><|vision_end|>图片 3: <|vision_start |><|image_pad|><|vision_end|>视频 1:<|vision_start|><|video_pad|><|vision_end|>这些来自我的假期。<|im_end|>n<|im_start|>assistantn我很乐意为您描述图像和视频。您能否提供更多有关您假期的背景信息?<|im_end|>n<|im_start|>usern这是一次山间旅行。您能看到图片和视频中的详细信息吗?<|im_end|>n<|im_start|>assistantn'
首先,请确保安装最新版本的Flash Attention 2:
pip install -U flash-attn --no-build-isolation
另外,您应该有一个与 Flash-Attention 2 兼容的硬件。请在 Flash Attention 存储库的官方文档中阅读更多相关信息。 FlashAttention-2 仅当模型加载到torch.float16
或torch.bfloat16
中时才能使用。
要使用 Flash Attention-2 加载并运行模型,只需在加载模型时添加attn_implementation="flash_attention_2"
即可,如下所示:
from Transformers import Qwen2VLForConditionalGenerationmodel =