模型简介
空间感知能力大幅提升:2D grounding 从绝对坐标变为相对坐标,支持判断物体方位、视角变化、遮挡关系,能实现 3D grounding,为复杂场景下的空间推理和具身场景打下基础。
OCR 支持更多语言及复杂场景:支持的中英外的语言从 10 种扩展到 32 种,覆盖更多国家和地区;在复杂光线、模糊、倾斜等实拍挑战性场景下表现更稳定;对生僻字、古籍字、专业术语的识别准确率也显著提升;超长文档理解和精细结构还原能力进一步提升。
一是采用 MRoPE-Interleave:原始 MRoPE 将特征维度按照时间(t)、高度(h) 和宽度(w) 的顺序分块划分,使得时间信息全部分布在高频维度上。在 Qwen3-VL 中采取了 t,h,w 交错分布的形式,实现对时间,高度和宽度的全频率覆盖,这样更加鲁棒的位置编码能够保证模型在图片理解能力相当的情况下,提升对长视频的理解能力;
二是引入 DeepStack 技术:融合 ViT 多层次特征,提升视觉细节捕捉能力和图文对齐精度;我们沿用 DeepStack 的核心思想,将以往多模态大模型(LMM)单层输入视觉 tokens 的范式,改为在大型语言模型 (LLM) 的多层中进行注入。这种多层注入方式旨在实现更精细化的视觉理解。在此基础上,进一步优化了视觉特征 token 化的策略。具体而言,我们将来自 ViT 不同层的视觉特征进行 token 化,并以此作为视觉输入。这种设计能够有效保留从底层(low-level)到高层(high-level)的丰富视觉信息。实验结果表明,该方法在多种视觉理解任务上均展现出显著的性能提升。
三是将原有的视频时序建模机制 T-RoPE 升级为文本时间戳对齐机制:该机采用'时间戳 - 视频帧'交错的输入形式,实现帧级别的时间信息与视觉内容的细粒度对齐。同时,模型原生支持'秒数'与'时:分:秒'(HMS)两种时间输出格式。这一改进显著提升了模型对视频中动作、事件的语义感知与时间定位精度,使其在复杂时序推理任务——如事件定位、动作边界检测、跨模态时间问答等——中表现更稳健、响应更精准。
环境配置
conda create -n Qwen3-vl python=3.10
conda activate Qwen3-vl
pip install accelerate
pip install qwen-vl-utils==0.0.14
uv pip install -U vllm
下载代码
git clone https://github.com/QwenLM/Qwen3-VL
下载权重文件
权重文件较大,建议使用国内镜像源下载。
# 在下载前,请先通过如下命令安装 ModelScope
pip install modelscope
# 下载完整模型库
modelscope download --model Qwen/Qwen3-VL-2B-Instruct
推理代码
修改 Qwen/Qwen3-VL-4B-Instruct 为你下载的参数地址以及图片地址。
from transformers import Qwen3VLForConditionalGeneration, AutoProcessor
import torch
from PIL import Image
def load_qwen3_vl_4b_model():
"""加载 Qwen3-VL-4B-Instruct 模型和处理器"""
model = Qwen3VLForConditionalGeneration.from_pretrained(
"Qwen/Qwen3-VL-4B-Instruct",
torch_dtype=torch.bfloat16,
device_map=,
attn_implementation=
)
processor = AutoProcessor.from_pretrained()
model, processor
():
image = Image.(image_path).convert()
messages = [
{
: ,
: [
{: , : image},
{: , : text_query}
]
}
]
inputs = processor.apply_chat_template(
messages, tokenize=, add_generation_prompt=,
return_dict=, return_tensors=
)
generated_ids = model.generate(
**inputs, max_new_tokens=, do_sample=,
temperature=, top_p=
)
generated_ids_trimmed = [
out_ids[(in_ids):] in_ids, out_ids (inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(
generated_ids_trimmed, skip_special_tokens=, clean_up_tokenization_spaces=
)
output_text[] output_text
__name__ == :
model, processor = load_qwen3_vl_4b_model()
image_path =
query =
result = process_multimodal_query(model, processor, image_path, query)
(, result)


