Spaces:
Runtime error
Runtime error
Create app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
from PIL import Image, ImageDraw
|
| 3 |
+
|
| 4 |
+
# -----------------------------
|
| 5 |
+
# 1️⃣ ใส่ไฟล์ภาพของคุณ
|
| 6 |
+
# -----------------------------
|
| 7 |
+
img_path = "body.png" # <-- ใส่ชื่อไฟล์ภาพของคุณ
|
| 8 |
+
img = Image.open(img_path)
|
| 9 |
+
|
| 10 |
+
# -----------------------------
|
| 11 |
+
# 2️⃣ กำหนด list ของอวัยวะ 50 ชิ้น + กรอบ + คำอธิบาย
|
| 12 |
+
# -----------------------------
|
| 13 |
+
# รูปแบบ: "ชื่ออวัยวะ": [(x1,y1,x2,y2), "คำอธิบาย"]
|
| 14 |
+
organs = {
|
| 15 |
+
"สมอง": [(180,10,270,80), "ควบคุมความคิด 🧠"],
|
| 16 |
+
"ต่อมไทรอยด์": [(210,90,270,120), "ควบคุมเมตาบอลิซึม 🧬"],
|
| 17 |
+
"ตาซ้าย": [(150,40,180,70), "การมองเห็น 👁️"],
|
| 18 |
+
"ตาขวา": [(270,40,300,70), "การมองเห็น 👁️"],
|
| 19 |
+
"หูซ้าย": [(120,40,150,80), "การได้ยิน 👂"],
|
| 20 |
+
"หูขวา": [(300,40,330,80), "การได้ยิน 👂"],
|
| 21 |
+
"จมูก": [(210,70,240,100), "ดมกลิ่น 👃"],
|
| 22 |
+
"ปาก": [(200,100,250,130), "รับอาหารและสื่อสาร 👄"],
|
| 23 |
+
"ฟัน": [(200,105,250,115), "บดเคี้ยวอาหาร 🦷"],
|
| 24 |
+
"ลิ้น": [(210,120,240,130), "รับรส 👅"],
|
| 25 |
+
"คอหอย": [(200,140,250,160), "ทางเดินอาหารและหายใจ"],
|
| 26 |
+
"หัวใจ": [(220,300,280,400), "สูบฉีดเลือด ❤️"],
|
| 27 |
+
"ปอดซ้าย": [(180,400,250,550), "แลกเปลี่ยนก๊าซ 💨"],
|
| 28 |
+
"ปอดขวา": [(250,400,320,550), "แลกเปลี่ยนก๊าซ 💨"],
|
| 29 |
+
"ตับ": [(200,550,300,650), "กรองของเสีย 🍷"],
|
| 30 |
+
"ไตซ้าย": [(150,650,220,720), "กรองของเสีย 💧"],
|
| 31 |
+
"ไตขวา": [(280,650,350,720), "กรองของเสีย 💧"],
|
| 32 |
+
"กระเพาะอาหาร": [(200,580,300,620), "ย่อยอาหาร 🍽️"],
|
| 33 |
+
"ลำไส้เล็ก": [(180,720,320,820), "ดูดซึมอาหาร 🌀"],
|
| 34 |
+
"ลำไส้ใหญ่": [(180,820,320,900), "ขับของเสีย 💩"],
|
| 35 |
+
"ม้าม": [(150,500,200,550), "ทำลายเม็ดเลือดเก่า 💉"],
|
| 36 |
+
"ตับอ่อน": [(300,500,350,550), "สร้างอินซูลิน 💊"],
|
| 37 |
+
"ถุงน้ำดี": [(270,550,300,580), "เก็บน้ำดี 💚"],
|
| 38 |
+
"กระเพาะปัสสาวะ": [(200,900,300,950), "เก็บปัสสาวะ 🚰"],
|
| 39 |
+
"มดลูก": [(220,950,280,990), "ที่อยู่ของทารก 🤰"],
|
| 40 |
+
"รังไข่ซ้าย": [(180,930,220,970), "สร้างไข่ ⚪"],
|
| 41 |
+
"รังไข่ขวา": [(280,930,320,970), "สร้างไข่ ⚪"],
|
| 42 |
+
"อัณฑะซ้าย": [(180,950,220,990), "ผลิตอสุจิ ⚽"],
|
| 43 |
+
"อัณฑะขวา": [(280,950,320,990), "ผลิตอสุจิ ⚽"],
|
| 44 |
+
"กระดูกสันหลัง": [(210,150,250,550), "รองรับร่างกาย 🦴"],
|
| 45 |
+
"กระดูกซี่โครง": [(180,300,320,400), "ป้องกันอวัยวะสำคัญ 🦴"],
|
| 46 |
+
"กล้ามเนื้อแขนซ้าย": [(120,400,180,600), "เคลื่อนไหวแขน 💪"],
|
| 47 |
+
"กล้ามเนื้อแขนขวา": [(320,400,380,600), "เคลื่อนไหวแขน 💪"],
|
| 48 |
+
"กล้ามเนื้อขาซ้าย": [(150,900,220,1050), "เคลื่อนไหวขา 💪"],
|
| 49 |
+
"กล้ามเนื้อขาขวา": [(280,900,350,1050), "เคลื่อนไหวขา 💪"],
|
| 50 |
+
"กระดูกเชิงกราน": [(180,850,320,900), "รองรับอวัยวะภายใน 🦴"],
|
| 51 |
+
"หัวไหล่ซ้าย": [(180,200,220,300), "เคลื่อนไหวแขน 🦴"],
|
| 52 |
+
"หัวไหล่ขวา": [(280,200,320,300), "เคลื่อนไหวแขน 🦴"],
|
| 53 |
+
"มือซ้าย": [(100,600,160,700), "จับสิ่งของ ✋"],
|
| 54 |
+
"มือขวา": [(340,600,400,700), "จับสิ่งของ ✋"],
|
| 55 |
+
"เท้าซ้าย": [(150,1050,220,1120), "ทรงตัวและเดิน 👣"],
|
| 56 |
+
"เท้าขวา": [(280,1050,350,1120), "ทรงตัวและเดิน 👣"],
|
| 57 |
+
"ไหล่": [(200,200,300,220), "เชื่อมแขนและตัว"],
|
| 58 |
+
"ลำคอ": [(210,120,250,140), "ผ่านอาหารและอากาศ"],
|
| 59 |
+
"กระดูกก้นกบ": [(200,1050,250,1080), "เชื่อมกับกระดูกสันหลัง"],
|
| 60 |
+
"กระดูกสะโพกซ้าย": [(150,850,200,900), "รองรับน้ำหนักร่างกาย"],
|
| 61 |
+
"กระดูกสะโพกขวา": [(300,850,350,900), "รองรับน้ำหนักร่างกาย"],
|
| 62 |
+
"ข้อศอกซ้าย": [(140,500,180,550), "ยืดและงอแขน"],
|
| 63 |
+
"ข้อศอกขวา": [(320,500,360,550), "ยืดและงอแขน"],
|
| 64 |
+
"เข่าซ้าย": [(160,900,200,950), "งอและเหยียดขา"],
|
| 65 |
+
"เข่าขวา": [(300,900,340,950), "งอและเหยียดขา"]
|
| 66 |
+
}
|
| 67 |
+
|
| 68 |
+
# -----------------------------
|
| 69 |
+
# วาดกรอบบนภาพ
|
| 70 |
+
# -----------------------------
|
| 71 |
+
draw = ImageDraw.Draw(img)
|
| 72 |
+
for name, (box, desc) in organs.items():
|
| 73 |
+
draw.rectangle(box, outline="red", width=2)
|
| 74 |
+
|
| 75 |
+
# -----------------------------
|
| 76 |
+
# ฟังก์ชันตรวจสอบคลิก
|
| 77 |
+
# -----------------------------
|
| 78 |
+
def detect_organ(evt: gr.SelectData):
|
| 79 |
+
x, y = evt.index[0], evt.index[1]
|
| 80 |
+
for name, (box, desc) in organs.items():
|
| 81 |
+
x1, y1, x2, y2 = box
|
| 82 |
+
if x1 <= x <= x2 and y1 <= y <= y2:
|
| 83 |
+
return f"{name}: {desc}"
|
| 84 |
+
return "คลิกบนกรอบอวัยวะเพื่อดูคำอธิบาย"
|
| 85 |
+
|
| 86 |
+
# -----------------------------
|
| 87 |
+
# Gradio Interface
|
| 88 |
+
# -----------------------------
|
| 89 |
+
with gr.Blocks() as demo:
|
| 90 |
+
gr.Markdown("## 🧍 คลิกบนกรอบอวัยวะเพื่อดูคำอธิบาย")
|
| 91 |
+
img_display = gr.Image(value=img, interactive=True)
|
| 92 |
+
output = gr.Textbox(label="ข้อมูลอวัยวะ")
|
| 93 |
+
img_display.select(detect_organ, None, output)
|
| 94 |
+
|
| 95 |
+
demo.launch()
|