Spaces:
Sleeping
Sleeping
File size: 2,693 Bytes
76684fa |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
from PIL import Image
from transformers import AutoModel, AutoTokenizer
from logger import LOG # 引入日志模块,用于记录日志
# 加载模型和分词器
# 这里我们使用 `AutoModel` 和 `AutoTokenizer` 加载模型 'openbmb/MiniCPM-V-2_6-int4'
# 参数 `trust_remote_code=True` 表示信任远程代码(根据模型文档设置)
model = AutoModel.from_pretrained('openbmb/MiniCPM-V-2_6-int4', trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained('openbmb/MiniCPM-V-2_6-int4', trust_remote_code=True)
model.eval() # 设置模型为评估模式,以确保不进行训练中的随机性操作
def chat_with_image(image_file, question='描述下这幅图', sampling=False, temperature=0.7, stream=False):
"""
使用模型的聊天功能生成对图像的回答。
参数:
image_file: 图像文件,用于处理的图像。
question: 提问的问题,默认为 '描述下这幅图'。
sampling: 是否使用采样进行生成,默认为 False。
temperature: 采样温度,用于控制生成文本的多样性,值越高生成越多样。
stream: 是否流式返回响应,默认为 False。
返回:
生成的回答文本字符串。
"""
# 打开并转换图像为 RGB 模式
image = Image.open(image_file).convert('RGB')
# 创建消息列表,模拟用户和 AI 的对话
msgs = [{'role': 'user', 'content': [image, question]}]
# 如果不启用流式输出,直接返回生成的完整响应
if not stream:
return model.chat(image=None, msgs=msgs, tokenizer=tokenizer, temperature=temperature)
else:
# 启用流式输出,则逐字生成并打印响应
generated_text = ""
for new_text in model.chat(image=None, msgs=msgs, tokenizer=tokenizer, sampling=sampling, temperature=temperature, stream=True):
generated_text += new_text
print(new_text, flush=True, end='') # 实时输出每部分生成的文本
return generated_text # 返回完整的生成文本
# 主程序入口
if __name__ == "__main__":
import sys # 引入 sys 模块以获取命令行参数
if len(sys.argv) != 2:
print("Usage: python src/minicpm_v_model.py <image_file>") # 提示正确的用法
sys.exit(1) # 退出并返回状态码 1,表示错误
image_file = sys.argv[1] # 获取命令行传入的图像文件路径
question = 'What is in the image?' # 定义默认问题
response = chat_with_image(image_file, question, sampling=True, temperature=0.7, stream=True) # 调用生成响应函数
print("\nFinal Response:", response) # 输出最终响应
|