Project003 / app.py
kbg05204's picture
Update app.py
89db6e4 verified
raw
history blame
6.63 kB
import os
import json
import re
import streamlit as st
from openai import OpenAI
from googleapiclient.discovery import build
from google.oauth2 import service_account
# 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()