import os import gradio as gr import torch import time from swift.llm import ( get_model_tokenizer, get_template, inference, get_default_template_type ) from swift.utils import seed_everything # ========== 模型配置 ========== MODEL_TYPE = os.environ.get("MODEL_TYPE", "internvl2-2b") MODEL_PATH = os.environ.get("MODEL_PATH", "./model") print(f"Model type: {MODEL_TYPE}") print(f"Model path: {MODEL_PATH}") template_type = get_default_template_type(MODEL_TYPE) print(f"Template type: {template_type}") # ========== 加载模型 ========== model, tokenizer = get_model_tokenizer( model_type=MODEL_TYPE, model_id_or_path=MODEL_PATH, torch_dtype=torch.bfloat16, ) model.generation_config.max_new_tokens = 256 template = get_template(template_type, tokenizer) seed_everything(42) print("=" * 50) print("Model loaded successfully!") print("=" * 50) # ========== 推理函数 ========== def predict(image_url: str, query: str = "这张图片中有任何人为编辑的迹象吗?"): """ 图片编辑检测接口 """ if not image_url or not image_url.startswith("http"): return "错误:请提供有效的图片URL(以http/https开头)" # 构建消息(使用官方推荐的messages格式) messages = [{ "role": "user", "content": f"{image_url}{query}" }] # 推理计时 start = time.time() resp_list = inference(model, template, messages) elapsed = time.time() - start response = resp_list[0]["response"] # 返回带计时信息的结果 return f"{response}\n\n【推理用时: {elapsed:.2f}秒】" # ========== Gradio界面 ========== with gr.Blocks(title="图像编辑检测 - Tiger Vision") as demo: gr.Markdown(""" # 🐯 Tiger Vision **基于 InternVL2 的图像篡改检测服务** """) with gr.Row(): with gr.Column(): image_input = gr.Textbox( label="图片URL", placeholder="https://example.com/image.jpg", lines=2, ) question_input = gr.Textbox( label="检测问题(可选)", value="这张图片中有任何人为编辑的迹象吗?", lines=2, ) submit_btn = gr.Button("🔍 开始检测", variant="primary") with gr.Column(): output = gr.Textbox( label="检测结果", lines=12, show_copy_button=True, ) gr.Examples( examples=[["https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/road.png", "这张图片中有任何人为编辑的迹象吗?"]], inputs=[image_input, question_input], ) submit_btn.click(fn=predict, inputs=[image_input, question_input], outputs=output) image_input.submit(fn=predict, inputs=[image_input, question_input], outputs=output) # ========== 启动(Space标准配置)========== if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860)