Qwen 2.5 VL多模态模型的应用
阿里巴巴的Qwen 2.5 VL大模型是通义千问团队推出的开源多模态视觉语言模型,以强大的视觉理解、视频解析和跨模态推理能力为核心突破,被业界认为是目前最先进的开源多模态算法之一。
Qwen 2.5 VL采用三模块架构:
- 大语言模型(LLM):基于Qwen2.5语言模型预训练权重,引入多模态旋转位置编码(MRoPE)对齐时间、空间与文本模态。
- 视觉编码器(ViT):重新设计的动态分辨率ViT,支持原生分辨率输入,通过窗口注意力机制(最大窗口112×112)和二维旋转位置编码(2D-RoPE)降低计算复杂度,同时保持空间感知精度。
- 视觉-语言融合模块:采用多层感知机(MLP)压缩视觉特征序列,提升与LLM的交互效率。
其创新技术包括:
- 动态帧率(FPS)训练与绝对时间编码:通过时间戳对齐实现长视频理解(支持1小时以上)和秒级事件定位
- 结构化输出设计:生成JSON格式的坐标、属性数据,以及QwenVL HTML格式的文档版面还原
- 设备操作能力:无需微调即可控制电脑、手机完成多步骤任务(如订机票、修图)
下面介绍一下如何使用VL模型进行图像识别和视频识别。在HF-Mirror.com网站中下载Qwen2.5-VL-7B-Instruct-AWQ的权重,这是7B参数量的量化版本,可以在我的3090显卡上运行。以下代码是加载模型
from transformers import Qwen2_5_VLForConditionalGeneration, AutoTokenizer, AutoProcessor
from qwen_vl_utils import process_vision_info
import torch
import base64
import os
import cv2
import matplotlib.pyplot as pltmodel = Qwen2_5_VLForConditionalGeneration.from_pretrained("Qwen2.5-VL-7B-Instruct-AWQ",torch_dtype=torch.float16,attn_implementation="flash_attention_2",device_map="auto",
)processor = AutoProcessor.from_pretrained("Qwen2.5-VL-7B-Instruct-AWQ")
首先是对图像进行识别,例如选取以下的图片
img = cv2.imread('./1.jpg')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.axis('off') # 不显示坐标轴
plt.show()
图片显示如下:
对图像进行描述,如以下代码
messages = [{"role": "user","content": [{"type": "image","image": "./1.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 = inputs.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_text = processor.batch_decode(generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_text)
最后输出的描述信息如下:
这张图片展示了一位穿着蓝色衬衫和深色领带的男子。他双手握拳,表情非常激动,似乎在庆祝或表达强烈的情感。背景是深灰色的,突出了人物的形象。
可以看到对于图像的描述非常准确。
下面是对视频进行描述,代码如下:
video = './test.mp4'
question = '描述一下视频的情节'messages = [{"role": "user","content": [{"type": "video","video": video,},{"type": "text", "text": question},],}
]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 = inputs.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_text = processor.batch_decode(generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_text)
最后输出的内容如下:
这段视频展示了一系列紧张且充满戏剧性的场景,主要围绕着一个小镇的污染事件展开。以下是情节的详细描述:
1. **办公室内的对话**:
- 视频开始于一个办公室内,两位男性角色正在激烈地讨论。一位穿着深色夹克的男子显得非常焦虑和愤怒,另一位则戴着眼镜,表情严肃。
- 对话中提到“一个乡的老百姓让你当书记”,暗示了角色之间的权力关系和责任。
2. **审讯般的怒吼**:
- 画面切换到一个会议室,其中一位角色被要求回答问题。
以上就是VL模型的使用方法。