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