Noeies commited on
Commit
66e89d0
·
verified ·
1 Parent(s): daed4d9

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +98 -0
app.py ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from transformers import AutoImageProcessor, AutoModelForImageSegmentation
3
+ from PIL import Image
4
+ import torch
5
+ import matplotlib.pyplot as plt
6
+ import numpy as np
7
+
8
+ # 1️⃣ โหลดโมเดล pre-trained จาก Hugging Face
9
+ model_name = "MLforHealthcare/sam2rad" # MedSAM2
10
+ processor = AutoImageProcessor.from_pretrained(model_name)
11
+ model = AutoModelForImageSegmentation.from_pretrained(model_name)
12
+
13
+ # 2️⃣ dictionary คำอธิบายอวัยวะ 50 ชิ้น
14
+ organ_desc = {
15
+ 0: "สมอง 🧠: ควบคุมการทำงานของร่างกาย",
16
+ 1: "หัวใจ ❤️: สูบฉีดเลือด",
17
+ 2: "ปอด 💨: แลกเปลี่ยนก๊าซ",
18
+ 3: "ตับ 🍵: กำจัดสารพิษ",
19
+ 4: "ไต 💧: กรองของเสียในเลือด",
20
+ 5: "กระเพาะอาหาร 🥘: ย่อยอาหาร",
21
+ 6: "ลำไส้เล็ก 🌾: ดูดซึมอาหาร",
22
+ 7: "ลำไส้ใหญ่ 🌽: ดูดซึมและขับถ่าย",
23
+ 8: "ตับอ่อน 🍭: สร้างอินซูลิน",
24
+ 9: "กระเพาะปัสสาวะ 💦: เก็บปัสสาวะ",
25
+ 10: "ม้าม 🔴: กรองเลือดและระบบภูมิคุ้มกัน",
26
+ 11: "หลอดเลือดแดงใหญ่ 🔴: นำเลือดจากหัวใจไปยังร่างกาย",
27
+ 12: "หลอดเลือดดำใหญ่ 🔵: นำเลือดกลับสู่หัวใจ",
28
+ 13: "กระดูกสันหลัง 🦴: รองรับร่างกายและปกป้องไขสันหลัง",
29
+ 14: "กล้ามเนื้อแขน 💪: ขยับแขน",
30
+ 15: "กล้ามเนื้อขา 🦵: ขยับขาและเดิน",
31
+ 16: "ผิวหนัง 🩸: ปกป้องร่างกาย",
32
+ 17: "ลูกตา 👁️: รับภาพ",
33
+ 18: "หู 👂: ได้ยินและรักษาสมดุล",
34
+ 19: "จมูก 👃: ดมกลิ่น",
35
+ 20: "ลิ้น 👅: ชิมอาหาร",
36
+ 21: "ฟัน 🦷: เคี้ยวอาหาร",
37
+ 22: "หูชั้นกลาง 🔊: นำเสียงเข้าโสตประสาท",
38
+ 23: "กล่องเสียง 🗣️: สร้างเสียงพูด",
39
+ 24: "หลอดลม 🌬️: นำอากาศเข้าสู่ปอด",
40
+ 25: "หลอดอาหาร 🍴: นำอาหารสู่กระเพาะ",
41
+ 26: "ไส้เลื่อน/เนื้อเยื่อใต้ผิว 🔹: ปกป้องอวัยวะภายใน",
42
+ 27: "ต่อมไทรอยด์ 🦋: ควบคุมเมตาบอลิซึม",
43
+ 28: "ต่อมหมวกไต 🏔️: ผลิตฮอร์โมน",
44
+ 29: "อัณฑะ/รังไข่ 🔵: สร้างเซลล์สืบพันธุ์",
45
+ 30: "มดลูก/อวัยวะสืบพันธุ์หญิง 🌸: ตั้งครรภ์",
46
+ 31: "หลอดน้ำเหลือง 💛: ระบบภูมิคุ้มกัน",
47
+ 32: "ต่อมน้ำเหลือง 💚: กรองเชื้อโรค",
48
+ 33: "กระดูกเชิงกราน 🦴: รองรับอวัยวะภายใน",
49
+ 34: "หัวเข่า 🦵: ขยับขา",
50
+ 35: "ข้อศอก 💪: ขยับแขน",
51
+ 36: "ไส้ติ่ง 🔺: อวัยวะเสริมย่อยอาหาร",
52
+ 37: "เนื้อเยื่อไขมัน 🟡: เก็บพลังงาน",
53
+ 38: "กล้ามเนื้อหน้าอก 💪: ช่วยหายใจและขยับแขน",
54
+ 39: "กระดูกหน้าอก 🦴: ปกป้องหัวใจและปอด",
55
+ 40: "ขากรรไกร 👄: เคี้ยวอาหาร",
56
+ 41: "หลอดเลือดฝอย 🔴🔵: แลกเปลี่ยนสารอาหารและออกซิเจน",
57
+ 42: "กระดูกสันคอ 🦴: ปกป้องไขสันหลังส่วนคอ",
58
+ 43: "เส้นประสาท 🧬: ส่งสัญญาณร่างกาย",
59
+ 44: "เส้นเอ็น/เอ็นกล้ามเนื้อ 🔗: เชื่อมกล้ามเนื้อกับกระดูก",
60
+ 45: "กล้ามเนื้อหน้าท้อง 💪: รองรับอวัยวะภายใน",
61
+ 46: "ผนังช่องท้อง 🩻: ปกป้องอวัยวะในช่อ��ท้อง",
62
+ 47: "ต่อมน้ำลาย 🟤: ผลิตน้ำลาย",
63
+ 48: "ต่อมน้ำนม 🍼: สร้างน้ำนม (หญิง)",
64
+ 49: "สมองน้อย 🧠: ควบคุมการทรงตัวและการเคลื่อนไหว"
65
+ }
66
+
67
+ # 3️⃣ ฟังก์ชันตรวจจับอวัยวะ
68
+ def detect_organs(img):
69
+ inputs = processor(images=img, return_tensors="pt")
70
+ with torch.no_grad():
71
+ outputs = model(**inputs)
72
+ seg_map = outputs.logits.argmax(dim=1).squeeze().cpu().numpy()
73
+
74
+ # วาด overlay
75
+ plt.figure(figsize=(6,6))
76
+ plt.imshow(img)
77
+ plt.imshow(seg_map, alpha=0.5, cmap='jet')
78
+ plt.axis('off')
79
+ plt.tight_layout()
80
+ plt.savefig("segmented.png", bbox_inches='tight', pad_inches=0)
81
+ segmented_img = Image.open("segmented.png")
82
+
83
+ # ดึงคำอธิบายอวัยวะที่พบ
84
+ detected_organs = np.unique(seg_map)
85
+ descriptions = [organ_desc.get(int(o), f"อวัยวะ {int(o)}") for o in detected_organs]
86
+
87
+ return segmented_img, "\n".join(descriptions)
88
+
89
+ # 4️⃣ สร้าง Gradio Interface
90
+ iface = gr.Interface(
91
+ fn=detect_organs,
92
+ inputs=gr.Image(type="pil"),
93
+ outputs=[gr.Image(type="pil"), gr.Textbox()],
94
+ title="ตรวจจับอวัยวะ 50 ชิ้นด้วย MedSAM2",
95
+ description="อัปโหลดภาพ → AI ตรวจจับอวัยวะ → วาดกรอบ → แสดงคำอธิบาย"
96
+ )
97
+
98
+ iface.launch()