import gradio as gr from transformers import pipeline from PIL import Image classifier = pipeline( task="zero-shot-image-classification", model="openai/clip-vit-base-patch32" ) LABELS = [ "cardboard waste", "glass waste", "metal waste", "paper waste", "plastic waste", "general trash" ] CLASS_ZH = { "cardboard waste": "紙板/紙箱類", "glass waste": "玻璃類", "metal waste": "金屬類", "paper waste": "紙類", "plastic waste": "塑膠類", "general trash": "一般垃圾" } RECYCLE_TIPS = { "cardboard waste": "建議壓扁後回收,若沾有大量油污或食物殘渣,應依當地規定處理。", "glass waste": "建議清空內容物後回收,破玻璃需妥善包裝,避免割傷清潔人員。", "metal waste": "建議清空內容物後回收,鋁罐、鐵罐通常可歸入金屬回收。", "paper waste": "乾淨紙類可回收,若嚴重沾油、沾水或污染,可能需作一般垃圾處理。", "plastic waste": "建議清空並簡單沖洗後回收,依塑膠材質與當地規則分類。", "general trash": "此類較可能為一般垃圾,建議確認是否仍有可回收部分。" } def predict_garbage(image): if image is None: return None, "請先上傳一張圖片。" results = classifier(image, candidate_labels=LABELS) best = results[0] label = best["label"] score = best["score"] chinese_name = CLASS_ZH.get(label, label) tip = RECYCLE_TIPS.get(label, "請依照當地垃圾分類規則處理。") top_text = "" for item in results: item_label = item["label"] item_score = item["score"] zh = CLASS_ZH.get(item_label, item_label) top_text += f"{item_label}({zh}):{item_score * 100:.2f}%\n" output_text = f"""預測結果:{label} 中文類別:{chinese_name} 信心分數:{score:.4f} 信心百分比:{score * 100:.2f}% 分類建議: {tip} 各類別預測結果: {top_text} """ return image, output_text custom_css = """ .gradio-container { max-width: 1100px !important; margin: auto !important; } #title-block { text-align: center; padding: 22px 12px 10px 12px; } #title-block h1 { font-size: 34px; margin-bottom: 8px; } #title-block p { font-size: 16px; opacity: 0.85; } """ with gr.Blocks(css=custom_css, title="AI 垃圾分類影像辨識系統") as demo: gr.HTML("""

AI 垃圾分類影像辨識系統

上傳垃圾圖片,系統會辨識 cardboard、glass、metal、paper、plastic、trash 類別

""") with gr.Row(): with gr.Column(scale=1): input_image = gr.Image(type="pil", label="上傳垃圾圖片") submit_btn = gr.Button("開始辨識", variant="primary") clear_btn = gr.ClearButton([input_image], value="清除圖片") with gr.Column(scale=1): output_image = gr.Image(type="pil", label="輸入圖片預覽") output_text = gr.Textbox(label="模型預測結果", lines=14) submit_btn.click( fn=predict_garbage, inputs=input_image, outputs=[output_image, output_text] ) gr.Markdown(""" ### 使用說明 1. 上傳一張垃圾圖片。 2. 點選「開始辨識」。 3. 系統會輸出垃圾類別、中文說明、信心分數與分類建議。 """) if __name__ == "__main__": demo.launch()