Qwen2.5-VL 视觉语言模型
在 Clore.ai 的 GPU 上运行 Qwen2.5-VL——领先的开源视觉语言模型,用于图像/视频/文档理解。
最后更新于
这有帮助吗?
这有帮助吗?
# 安装 ollama
curl -fsSL https://ollama.ai/install.sh | sh
# 拉取并运行 7B 视觉模型
ollama run qwen2.5vl:7b>>> 描述这张图片:/path/to/photo.jpgpip install torch torchvision --index-url https://download.pytorch.org/whl/cu124
pip install transformers accelerate qwen-vl-utils pillowimport torch
from transformers import Qwen2_5_VLForConditionalGeneration, AutoProcessor
from qwen_vl_utils import process_vision_info
model_name = "Qwen/Qwen2.5-VL-7B-Instruct"
model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
model_name,
torch_dtype=torch.bfloat16,
device_map="auto",
)
processor = AutoProcessor.from_pretrained(model_name)
messages = [
{
"role": "user",
"content": [
{"type": "image", "image": "https://upload.wikimedia.org/wikipedia/commons/a/a7/Camponotus_flavomarginatus_ant.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",
).to(model.device)
output_ids = model.generate(**inputs, max_new_tokens=512)
response = processor.batch_decode(
output_ids[:, inputs.input_ids.shape[1]:],
skip_special_tokens=True,
)[0]
print(response)import torch
from transformers import Qwen2_5_VLForConditionalGeneration, AutoProcessor
from qwen_vl_utils import process_vision_info
model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
"Qwen/Qwen2.5-VL-7B-Instruct",
torch_dtype=torch.bfloat16,
device_map="auto",
)
processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-VL-7B-Instruct")
messages = [
{
"role": "user",
"content": [
{"type": "video", "video": "file:///workspace/clip.mp4", "max_pixels": 360 * 420, "fps": 1.0},
{"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",
).to(model.device)
output_ids = model.generate(**inputs, max_new_tokens=1024)
print(processor.batch_decode(output_ids[:, inputs.input_ids.shape[1]:], skip_special_tokens=True)[0])messages = [
{
"role": "user",
"content": [
{"type": "image", "image": "file:///workspace/receipt.jpg"},
{"type": "text", "text": "从此收据中提取所有商品、数量和价格。以 JSON 格式返回。"},
],
}
]
# 使用上面相同的模型/处理器设置进行处理
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").to(model.device)
output_ids = model.generate(**inputs, max_new_tokens=2048)
print(processor.batch_decode(output_ids[:, inputs.input_ids.shape[1]:], skip_special_tokens=True)[0])import ollama
import base64
from pathlib import Path
def analyze_image(image_path: str, question: str) -> str:
"""通过 Ollama API 将图像发送到 Qwen2.5-VL。"""
image_data = base64.b64encode(Path(image_path).read_bytes()).decode()
response = ollama.chat(
model="qwen2.5vl:7b",
messages=[{
"role": "user",
"content": question,
"images": [image_data],
}],
)
return response["message"]["content"]
# 批量处理一个图像文件夹
from pathlib import Path
for img in sorted(Path("./photos").glob("*.jpg")):
result = analyze_image(str(img), "用一句话描述这张图片。")
print(f"{img.name}: {result}")