Qwen2.5 VL 自定义模型的回复数量
Qwen2.5 VL 自定义模型的回复数量
flyfish
from transformers import AutoProcessor
from vllm import LLM, SamplingParams
from qwen_vl_utils import process_vision_info
import os
import jsonMODEL_PATH = "/media/models/Qwen/Qwen2.5-VL-3B-Instruct"
image_path = "1.jpg"# 初始化模型
llm = LLM(model=MODEL_PATH,limit_mm_per_prompt={"image": 10, "video": 10},
)# 配置采样参数
num_descriptions = 5 # 期望生成的描述数量
sampling_params = SamplingParams(temperature=0.7,top_p=0.9,n=1, #repetition_penalty=1.05,max_tokens=2048 # 增加最大token数,以容纳可能的JSON结构)# 构建多模态输入
if not os.path.exists(image_path):raise FileNotFoundError(f"图像文件不存在: {image_path}")# 定义提示文本,要求模型生成JSON格式
prompt = f"""详细描述这张图片里的内容,包括场景、物体和可能的活动。
请生成{num_descriptions}种不同的描述,并组织成JSON格式:
[{', '.join('{"描述": "图片内容描述..."}' for _ in range(num_descriptions))}
]"""# 构建消息
messages = [{"role": "system", "content": "You are a helpful and accurate multimodal assistant. 请严格按照用户要求的JSON格式返回结果。"},{"role": "user","content": [{"type": "image","image": image_path,"min_pixels": 224 * 224,"max_pixels": 1280 * 1280,},{"type": "text", "text": prompt}],},
]# 处理多模态输入
prompt = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
image_inputs, video_inputs = process_vision_info(messages)# 准备模型输入
mm_data = {}
if image_inputs is not None:mm_data["image"] = image_inputs
if video_inputs is not None:mm_data["video"] = video_inputsllm_inputs = {"prompt": prompt,"multi_modal_data": mm_data,
}# 生成回复
outputs = llm.generate([llm_inputs], sampling_params=sampling_params)raw_output = outputs[0].outputs[0].text.strip()
print(f"原始输出: {raw_output}")
# 尝试从输出中提取JSON部分
try:# 简单的JSON提取逻辑,寻找第一个'['和最后一个']'start_idx = raw_output.find('[')end_idx = raw_output.rfind(']') + 1if start_idx >= 0 and end_idx > start_idx:json_str = raw_output[start_idx:end_idx]descriptions = json.loads(json_str)# 验证JSON格式是否符合预期if all("描述" in item for item in descriptions):print("成功解析JSON格式的描述:")print(json.dumps(descriptions, ensure_ascii=False, indent=2))else:print("JSON格式不符合预期,缺少'描述'字段")else:print("未能从输出中提取有效的JSON格式")except json.JSONDecodeError as e:print(f"JSON解析错误: {e}")
原始输出: ```json
[{"描述": "这幅画描绘了一个古代文人与兔子互动的场景。画面左侧有一只兔子站在树旁,眼睛直视前方,显得非常警觉。文人穿着传统的古代服饰,手持一把扫帚,似乎在观察或准备捕捉兔子。背景是淡雅的山水画风格,营造出宁静而古朴的氛围。"},{"描述": "这幅画展示了一位身穿传统服饰的文人在户外与一只兔子互动的场景。文人手持扫帚,姿态专注,似乎在进行某种观察或准备行动。画面左侧是一棵树,树下有几根树枝,整体色调柔和,给人一种宁静的感觉。"},{"描述": "这幅画中,一位古代文人正站在户外,手持一把扫帚,目光注视着画面右侧的一只兔子。兔子站在树旁,看起来很警觉。背景采用了淡雅的山水画风格,充满了古典气息。"},{"描述": "这幅画呈现了一位古代文人在户外与一只兔子互动的情景。文人穿着传统服饰,手持扫帚,似乎在准备捕捉或观察兔子。背景采用淡雅的山水画手法,营造出一种宁静而古朴的氛围。"},{"描述": "这幅画中,一位古代文人正在与一只兔子互动。文人手持扫帚,表情专注,似乎在观察兔子。背景采用了淡雅的山水画风格,营造出宁静的氛围。画面左侧有一棵树,树下有几根树枝,增添了自然的美感。"}
]
```
成功解析JSON格式的描述:
[{"描述": "这幅画描绘了一个古代文人与兔子互动的场景。画面左侧有一只兔子站在树旁,眼睛直视前方,显得非常警觉。文人穿着传统的古代服饰,手持一把扫帚,似乎在观察或准备捕捉兔子。背景是淡雅的山水画风格,营造出宁静而古朴的氛围。"},{"描述": "这幅画展示了一位身穿传统服饰的文人在户外与一只兔子互动的场景。文人手持扫帚,姿态专注,似乎在进行某种观察或准备行动。画面左侧是一棵树,树下有几根树枝,整体色调柔和,给人一种宁静的感觉。"},{"描述": "这幅画中,一位古代文人正站在户外,手持一把扫帚,目光注视着画面右侧的一只兔子。兔子站在树旁,看起来很警觉。背景采用了淡雅的山水画风格,充满了古典气息。"},{"描述": "这幅画呈现了一位古代文人在户外与一只兔子互动的情景。文人穿着传统服饰,手持扫帚,似乎在准备捕捉或观察兔子。背景采用淡雅的山水画手法,营造出一种宁静而古朴的氛围。"},{"描述": "这幅画中,一位古代文人正在与一只兔子互动。文人手持扫帚,表情专注,似乎在观察兔子。背景采用了淡雅的山水画风格,营造出宁静的氛围。画面左侧有一棵树,树下有几根树枝,增添了自然的美感。"}
]