Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| from transformers import AutoImageProcessor, AutoModelForImageSegmentation | |
| from PIL import Image | |
| import torch | |
| import matplotlib.pyplot as plt | |
| import numpy as np | |
| # 1️⃣ โหลดโมเดล pre-trained จาก Hugging Face | |
| model_name = "MLforHealthcare/sam2rad" # MedSAM2 | |
| processor = AutoImageProcessor.from_pretrained(model_name) | |
| model = AutoModelForImageSegmentation.from_pretrained(model_name) | |
| # 2️⃣ dictionary คำอธิบายอวัยวะ 50 ชิ้น | |
| organ_desc = { | |
| 0: "สมอง 🧠: ควบคุมการทำงานของร่างกาย", | |
| 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: "สมองน้อย 🧠: ควบคุมการทรงตัวและการเคลื่อนไหว" | |
| } | |
| # 3️⃣ ฟังก์ชันตรวจจับอวัยวะ | |
| def detect_organs(img): | |
| inputs = processor(images=img, return_tensors="pt") | |
| with torch.no_grad(): | |
| outputs = model(**inputs) | |
| seg_map = outputs.logits.argmax(dim=1).squeeze().cpu().numpy() | |
| # วาด overlay | |
| plt.figure(figsize=(6,6)) | |
| plt.imshow(img) | |
| plt.imshow(seg_map, alpha=0.5, cmap='jet') | |
| plt.axis('off') | |
| plt.tight_layout() | |
| plt.savefig("segmented.png", bbox_inches='tight', pad_inches=0) | |
| segmented_img = Image.open("segmented.png") | |
| # ดึงคำอธิบายอวัยวะที่พบ | |
| detected_organs = np.unique(seg_map) | |
| descriptions = [organ_desc.get(int(o), f"อวัยวะ {int(o)}") for o in detected_organs] | |
| return segmented_img, "\n".join(descriptions) | |
| # 4️⃣ สร้าง Gradio Interface | |
| iface = gr.Interface( | |
| fn=detect_organs, | |
| inputs=gr.Image(type="pil"), | |
| outputs=[gr.Image(type="pil"), gr.Textbox()], | |
| title="ตรวจจับอวัยวะ 50 ชิ้นด้วย MedSAM2", | |
| description="อัปโหลดภาพ → AI ตรวจจับอวัยวะ → วาดกรอบ → แสดงคำอธิบาย" | |
| ) | |
| iface.launch() |