testvlm_gradio / app.py
Frank1983's picture
Update app.py
a76f1c7 verified
import gradio as gr
from transformers import AutoModelForVision2Seq, AutoProcessor
from PIL import Image
# 1. 模型加载 (请替换为您选择的 VLM 模型ID)
MODEL_ID = "google/paligemma-3b-mix-448" # 示例 VLM
processor = AutoProcessor.from_pretrained(MODEL_ID)
model = AutoModelForVision2Seq.from_pretrained(MODEL_ID)
# 2. 推理函数:接受图片和文本
def vlm_inference(image: Image.Image, prompt: str):
"""
接收用户上传的图片和文本提示,并返回 VLM 的生成结果。
"""
if image is None:
return "请上传一张图片。"
# 构建 VLM 输入格式 (根据模型要求调整)
# 对于 IDEFICS 这类 VLM,输入通常是一个包含图片和文本的列表
chats = [
"User:",
image,
f"Prompt: {prompt}",
"<end_of_utterance>",
"\nAssistant:"
]
print(f'input = {chats}, image.size {image.size}')
# 预处理和生成
inputs = processor(chats, return_tensors="pt")
# 注意:大型 VLM 需要 GPU 部署。如果使用免费 CPU 空间,请选择小型 VLM
# outputs = model.generate(**inputs, max_length=128) # 确保模型在 CPU/GPU 上
# 模拟生成(如果您正在测试或使用 CPU 部署)
# 请取消注释上面的 model.generate 行,并删除下面这行
outputs = f"(模型生成结果)您询问的是图片中的内容:'{prompt}'。图片尺寸为 {image.size}。"
print(outputs)
# 假设模型返回文本结果
return outputs
# 3. Gradio 界面定义
with gr.Blocks(title="VLM 多模态聊天演示") as demo:
gr.Markdown("# 🎨 Hugging Face Spaces VLM 演示")
# 定义输入组件
with gr.Row():
image_input = gr.Image(type="pil", label="上传图片")
prompt_input = gr.Textbox(label="输入文本提示 (例如: 描述这张图片的内容)")
# 定义输出组件和按钮
output_text = gr.Textbox(label="VLM 生成结果")
submit_btn = gr.Button("运行 VLM")
# 绑定函数
submit_btn.click(
fn=vlm_inference,
inputs=[image_input, prompt_input],
outputs=output_text
)
# 启动应用
if __name__ == "__main__":
# 在本地测试时运行
demo.launch()