Spaces:
Runtime error
Runtime error
File size: 2,865 Bytes
694e578 | 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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | import gradio as gr
from transformers import pipeline
from PIL import Image
# --- 1. 載入 AI 模型 ---
# 使用 Hugging Face pipeline 快速載入預訓練模型
# 任務: "image-to-text" (圖片轉文字)
# 模型: "nlpconnect/vit-gpt2-image-captioning"
#
# 第一次執行時,會自動下載模型 (可能需要幾分鐘)
print("正在載入 AI 模型...")
# 確保模型在 CPU 上運行 (符合作業的 Zero GPU/CPU 要求)
captioner = pipeline("image-to-text",
model="nlpconnect/vit-gpt2-image-captioning",
device="cpu")
print("模型載入完成。")
# --- 2. 定義核心 AI 功能 ---
def generate_caption(input_image: Image.Image) -> str:
"""
接收一個 PIL Image 物件,返回 AI 生成的描述文字。
Args:
input_image: Gradio 傳入的 PIL 圖片物件。
Returns:
一個描述圖片的字串。
"""
if input_image is None:
return "錯誤:請先上傳圖片。"
try:
# 使用 pipeline 進行預測
# pipeline 會返回一個 list,其中包含一個 dict
# result 格式: [{'generated_text': 'a cat sitting on a couch'}]
result = captioner(input_image)
caption = result[0]['generated_text']
# 對輸出做一點清理,讓它更易讀
return caption.capitalize()
except Exception as e:
print(f"處理圖片時發生錯誤: {e}")
return f"發生錯誤: {e}"
# --- 3. 建立 Gradio Web UI 介面 ---
# 定義輸入介面:
# type="pil" 確保傳入 Python 函式的是 PIL Image 物件
input_component = gr.Image(type="pil", label="上傳圖片 (Upload Image)")
# 定義輸出介面:
output_component = gr.Textbox(label="AI 產生的圖片描述 (AI-Generated Caption)")
# 讀取範例圖片 (請確保你已在 sample_images/ 資料夾放入對應檔案)
# 這是為了讓使用者一點就知道怎麼用
example_list = [
["sample_images/cat.jpg"],
["sample_images/dog_park.jpg"],
]
# 組合介面
iface = gr.Interface(
fn=generate_caption, # 要呼叫的函式
inputs=input_component, # 輸入元件
outputs=output_component, # 輸出元件
# 介面標題與說明
title="Vision Language AI:智慧圖片描述",
description="這是一個使用 Gradio 和 Hugging Face Transformers 打造的 Web App。\n上傳一張圖片,AI 將會自動為您產生一段描述文字。",
# 提供範例
examples=example_list,
# 介面主題 (可選)
theme=gr.themes.Soft()
)
# --- 4. 啟動 Web App ---
if __name__ == "__main__":
# share=True 會產生一個公開的臨時網址,方便分享
# (但在 HF Spaces 上部署時不需要 share=True)
iface.launch() |