File size: 6,647 Bytes
66e89d0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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()