把图像视频喂给 Qwen2.5-VL 前,qwen-vl-utils 如何替你管好视觉输入像素控制
【免费下载链接】Qwen3-VLQwen3-VL is the multimodal large language model series developed by Qwen team, Alibaba Cloud.项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen3-VL
在 Qwen2.5-VL 的推理链路里,qwen-vl-utils 负责视觉输入像素控制:smart_resize 把图片对齐到 28 的倍数并卡住像素上下限,smart_nframes 按 fps 或 nframes 决定视频抽多少帧,process_vision_info 把整批消息里的图和视频统一预处理成模型可直接吃的张量。三者决定 token 消耗和显存占用,本文带你把它们的用法和默认值一次讲清。
先搞清楚:为什么视觉输入要"管"像素
多模态模型会把图像切成一小块一小块的 patch,再映射成 token 送进模型:
- 像素越多,token 越多,单次推理的显存和耗时跟着涨;
- 像素太少,细节丢失,答案质量掉得明显;
- 如果你自己手动缩放,缩法和模型内部的 patch 网格(14×14,2×2 合并后按 28 对齐)不一致,还会白白浪费算力。
这张桌面截图在演示里会被压到 28 的整数倍再切 patch。对,一张整屏截图在模型眼里可能只值几十个 token,全看像素预算给多少。
所以缩放这件事交给工具包做,你只负责定规则。
3 分钟跑通第一个例子
pip install qwen-vl-utils装完就能用。下面这段是图像输入的最小闭环,跑通即算上手:
from transformers import Qwen2_5_VLForConditionalGeneration, AutoProcessor from qwen_vl_utils import process_vision_info messages = [{"role": "user", "content": [ {"type": "image", "image": "file:///path/to/img.jpg"}, {"type": "text", "text": "图里有什么?"}]}] images, videos = process_vision_info(messages) # 随后交给 AutoProcessor / 模型即可,processor(text=..., images=images, videos=videos)process_vision_info(messages)扫描消息列表里的image/video条目,读完文件就完成 smart_resize 对齐,返回两个列表:图片列表和视频张量列表。
三个高频问题,一次解决
图片太大,token 爆表怎么办
先手算一遍缩放结果:
from qwen_vl_utils import smart_resize h, w = smart_resize(height=800, width=600, factor=28) print(h, w) # 476 336,均为 28 的倍数smart_resize把高宽对齐到 28 的倍数、尽量保比例,总像素被min_pixels/max_pixels卡住;不传时默认 3136 ~ 12,845,056 像素(对应 4 ~ 16,384 个 token)。
真调用时两种写法:
messages = [{"role": "user", "content": [ {"type": "image", "image": "file:///a.jpg", "resized_height": 280, "resized_width": 420}, # 指定目标尺寸 {"type": "image", "image": "file:///b.jpg", "max_pixels": 512 * 28 * 28}, # 直接给像素预算 {"type": "text", "text": "两图各是什么?"}]}]前者给目标宽高(内部仍走一遍smart_resize),后者用max_pixels直接圈定上限;超了自动缩,传值会取 min 值兜底。
视频帧数怎么定才不拖慢速度
一条 2 分钟、30fps 的视频,默认 2fps 采样就是 240 帧,逐帧过视觉编码器非常吃时间。用smart_nframes先算出该抽几帧:
from qwen_vl_utils import smart_nframes n = smart_nframes({"nframes": 12}, total_frames=2100, video_fps=30) print(n) # 12{"nframes": 12}表示从 2100 帧里均匀抽 12 帧(结果对齐到偶数),{"fps": 1.0}则按每秒抽 1 帧计算,再用min_frames/max_frames兜底(默认 4 ~ 768)。
注意:fps和nframes二选一,同时传会直接断言报错;短视频若算出帧数超过总帧数,会打一条 warning 后按全帧处理。
显存不够怎么调
视频是显存大户:每帧都占 token,总预算受最大序列长度约束。三个旋钮:
export VIDEO_MAX_PIXELS=768*28*28 # 单帧上限 export MODEL_SEQ_LEN=64000 # 序列长度上限MODEL_SEQ_LEN(默认 128000)决定视频总像素预算的上限,VIDEO_MAX_PIXELS收紧单帧上限;也可以在视频消息字段里直接传max_pixels/total_pixels逐条覆盖。降帧数(nframes)、降单帧像素(max_pixels)、降总预算(MODEL_SEQ_LEN)三条路,按你的显存挑着拧。
参数与环境变量速查
| 参数 | 所在位置 | 默认值 | 作用 |
|---|---|---|---|
factor | smart_resize | 28 | 高宽对齐因子,patch(14) × 2×2 合并 |
min_pixels/max_pixels | smart_resize | 3136 / 12,845,056 | 图片总像素上下限(4 / 16,384 token) |
nframes | smart_nframes | — | 直接指定抽帧数,对齐到偶数 |
fps | smart_nframes | 2.0 | 按目标帧率换算抽帧数,与 nframes 二选一 |
min_frames/max_frames | smart_nframes | 4 / 768 | fps 模式下的抽帧数兜底区间 |
resized_height/resized_width | image / video 消息 | 不传=自动 | 目标尺寸,内部仍经 smart_resize 对齐 |
max_pixels/total_pixels | image / video 消息 | 16,384×28² / 按 MODEL_SEQ_LEN | 单图 / 视频总像素预算,传值取较小者生效 |
VIDEO_MIN_PIXELS/VIDEO_MAX_PIXELS | 环境变量 | 128×28² / 768×28² | 视频单帧像素上下限 |
MODEL_SEQ_LEN | 环境变量 | 128000 | 最大序列长度,决定视频总预算 |
FORCE_QWENVL_VIDEO_READER | 环境变量 | 自动探测 | 强制后端:torchcodec / decord / torchvision |
TORCHCODEC_NUM_THREADS | 环境变量 | 8 | torchcodec 的 ffmpeg 解码线程数 |
报错排查速答
Q:日志出现 "video_reader_backend ... error, use torchvision as default"?
A:主后端(decord 或 torchcodec)解码失败,工具包会自动降级到 torchvision 重读,属于自愈,留意 warning 即可。想固定某后端,设FORCE_QWENVL_VIDEO_READER。
Q:absolute aspect ratio must be smaller than 200?
A:图片宽高比超过 200 时smart_resize拒绝处理,不会自动裁切。先裁掉黑边或改走小图通道再送入。
Q:assert "Only accept either fps or nframes"?
A:fps和nframes是互斥写法,留一个删一个。短视频按 fps 算出的帧数超过总帧数时,会打 warning 并退化为全帧采样,属正常行为。
下一步
qwen-vl-utils 把视觉输入像素控制的三件事收口:smart_resize 管像素对齐,smart_nframes 管抽帧数,process_vision_info 管整体预处理。建议先用默认配置跑通一条推理,再按显存逐步收紧max_pixels与MODEL_SEQ_LEN;遇到解码异常,先看 stderr 里打印的后端名和total_frames信息,答案基本就在那里。
更多消息字段与 Qwen3-VL 的接入差异,见qwen-vl-utils 的 README。
【免费下载链接】Qwen3-VLQwen3-VL is the multimodal large language model series developed by Qwen team, Alibaba Cloud.项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen3-VL
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考