Create Appply
Browse files
Appply
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
from transformers import pipeline
|
| 3 |
+
from PIL import Image, ImageDraw
|
| 4 |
+
from gtts import gTTS
|
| 5 |
+
from io import BytesIO
|
| 6 |
+
|
| 7 |
+
# โมเดลตรวจจับอวัยวะหลายตำแหน่ง
|
| 8 |
+
model = pipeline("object-detection", model="facebook/detr-resnet-50")
|
| 9 |
+
|
| 10 |
+
# ฐานข้อมูลอวัยวะ 50 ชนิด + คำอธิบายไทย
|
| 11 |
+
organs = {
|
| 12 |
+
"heart": "หัวใจ ❤️ สูบฉีดเลือดไปทั่วร่างกาย",
|
| 13 |
+
"lungs": "ปอด 💨 แลกเปลี่ยนก๊าซในร่างกาย",
|
| 14 |
+
"liver": "ตับ 🍷 กำจัดสารพิษและสร้างน้ำดี",
|
| 15 |
+
"brain": "สมอง 🧠 ควบคุมการทำงานของร่างกาย",
|
| 16 |
+
"stomach": "กระเพาะอาหาร 🍽️ ย่อยอาหาร",
|
| 17 |
+
"kidney": "ไต 💧 กรองของเสียออกจากเลือด",
|
| 18 |
+
"intestine": "ลำไส้ 🌀 ดูดซึมสารอาหาร",
|
| 19 |
+
"pancreas": "ตับอ่อน 💊 สร้างอินซูลิน",
|
| 20 |
+
"spleen": "ม้าม 💉 ทำลายเม็ดเลือดแดงเก่า",
|
| 21 |
+
"bladder": "กระเพาะปัสสาวะ 🚰 เก็บน้ำปัสสาวะ",
|
| 22 |
+
"esophagus": "หลอดอาหาร 🍴 ส่งอาหารจากปากสู่กระเพาะ",
|
| 23 |
+
"trachea": "หลอดลม 🌬️ ส่งอากาศเข้าสู่ปอด",
|
| 24 |
+
"gallbladder": "ถุงน้ำดี 💚 เก็บน้ำดีจากตับ",
|
| 25 |
+
"skin": "ผิวหนัง 🧴 ปกป้องร่างกายและควบคุมอุณหภูมิ",
|
| 26 |
+
"eyes": "ดวงตา 👁️ รับภาพและแสง",
|
| 27 |
+
"ear": "หู 👂 รับเสียงและรักษาสมดุล",
|
| 28 |
+
"nose": "จมูก 👃 รับกลิ่นและช่วยหายใจ",
|
| 29 |
+
"tongue": "ลิ้น 👅 รับรสและช่วยพูด",
|
| 30 |
+
"muscle": "กล้ามเนื้อ 💪 ช่วยเคลื่อนไหวร่างกาย",
|
| 31 |
+
"bone": "กระดูก 🦴 ค้ำจุนและป้องกันอวัยวะภายใน",
|
| 32 |
+
"teeth": "ฟัน 🦷 เคี้ยวอาหารและช่วยพูด",
|
| 33 |
+
"hair": "เส้นผม 💇 ปกป้องหนังศีรษะ",
|
| 34 |
+
"nail": "เล็บ 💅 ปกป้องปลายนิ้ว",
|
| 35 |
+
"thyroid": "ต่อมไทรอยด์ 🧬 ควบคุมการเผาผลาญพลังงาน",
|
| 36 |
+
"adrenal": "ต่อมหมวกไต 🧫 ควบคุมฮอร์โมนความเครียด",
|
| 37 |
+
"pituitary": "ต่อมใต้สมอง 🧩 ควบคุมฮอร์โมนทั่วร่างกาย",
|
| 38 |
+
"hypothalamus": "ไฮโปทาลามัส 🧠 ควบคุมอุณหภูมิและการหิว",
|
| 39 |
+
"small intestine": "ลำไส้เล็ก 🌀 ดูดซึมอาหาร",
|
| 40 |
+
"large intestine": "ลำไส้ใหญ่ 💩 ดูดซึมน้ำและขับของเสีย",
|
| 41 |
+
"rectum": "ทวารหนัก 🚻 ขับของเสียออกจากร่างกาย",
|
| 42 |
+
"ureter": "ท่อไต 🚰 นำน้ำปัสสาวะจากไตไปกระเพาะปัสสาวะ",
|
| 43 |
+
"urethra": "ท่อปัสสาวะ 🚾 ขับปัสสาวะออกจากร่างกาย",
|
| 44 |
+
"ovary": "รังไข่ ⚪ สร้างไข่และฮอร์โมนเพศหญิง",
|
| 45 |
+
"uterus": "มดลูก 🤰 ที่อยู่ของทารกระหว่างตั้งครรภ์",
|
| 46 |
+
"testis": "อัณฑะ ⚽ ผลิตอสุจิและฮอร์โมนเพศชาย",
|
| 47 |
+
"penis": "อวัยวะเพศชาย 🚹",
|
| 48 |
+
"vagina": "ช่องคลอด 🚺",
|
| 49 |
+
"diaphragm": "กะบังลม 💨 ช่วยในการหายใจ",
|
| 50 |
+
"spinal cord": "ไขสันหลัง 🧬 ส่งสัญญาณประสาท",
|
| 51 |
+
"ribs": "กระดูกซี่โครง 🦴 ปกป้องหัวใจและปอด",
|
| 52 |
+
"shoulder": "ไหล่ 💪 ช่วยเคลื่อนไหวแขน",
|
| 53 |
+
"hand": "มือ ✋ ใช้จับและสัมผัสสิ่งของ",
|
| 54 |
+
"foot": "เท้า 🦶 รับน้ำหนักและเคลื่อนไหว",
|
| 55 |
+
"knee": "เข่า 🦵 ช่วยพับขาและเคลื่อนไหว",
|
| 56 |
+
"hip": "สะโพก 🍑 รองรับน้ำหนักส่วนล่า���",
|
| 57 |
+
"appendix": "ไส้ติ่ง 🩺 ส่วนต่อของลำไส้ใหญ่",
|
| 58 |
+
"cornea": "กระจกตา 👁️ ช่วยให้มองเห็นชัด",
|
| 59 |
+
"retina": "จอประสาทตา 🧠 แปลงแสงเป็นสัญญาณภาพ",
|
| 60 |
+
"lungs bronchi": "หลอดลมฝอย 🌬️ ส่งอากาศเข้าสู่ถุงลม"
|
| 61 |
+
}
|
| 62 |
+
|
| 63 |
+
def detect_and_click(image):
|
| 64 |
+
img = Image.open(image).convert("RGB")
|
| 65 |
+
draw = ImageDraw.Draw(img)
|
| 66 |
+
|
| 67 |
+
results = model(image)
|
| 68 |
+
info_list = []
|
| 69 |
+
|
| 70 |
+
for r in results:
|
| 71 |
+
label = r["label"].lower()
|
| 72 |
+
score = round(r["score"] * 100, 1)
|
| 73 |
+
box = r["box"]
|
| 74 |
+
|
| 75 |
+
draw.rectangle(
|
| 76 |
+
[(box["xmin"], box["ymin"]), (box["xmax"], box["ymax"])],
|
| 77 |
+
outline="red", width=3
|
| 78 |
+
)
|
| 79 |
+
draw.text((box["xmin"], box["ymin"] - 10), label, fill="red")
|
| 80 |
+
|
| 81 |
+
desc = organs.get(label, "ไม่พบในฐานข้อมูลอวัยวะ")
|
| 82 |
+
info_list.append(f"{label} → {desc} ({score}%)")
|
| 83 |
+
|
| 84 |
+
# สร้างเสียงพูดรวมหลายอวัยวะ
|
| 85 |
+
text_to_speak = " ; ".join([organs.get(r["label"].lower(), r["label"]) for r in results])
|
| 86 |
+
tts = gTTS(text=text_to_speak, lang="th")
|
| 87 |
+
audio_bytes = BytesIO()
|
| 88 |
+
tts.write_to_fp(audio_bytes)
|
| 89 |
+
audio_bytes.seek(0)
|
| 90 |
+
|
| 91 |
+
return img, "\n".join(info_list), audio_bytes
|
| 92 |
+
|
| 93 |
+
# หน้าเว็บ Gradio
|
| 94 |
+
demo = gr.Interface(
|
| 95 |
+
fn=detect_and_click,
|
| 96 |
+
inputs=gr.Image(type="filepath", label="📸 อัปโหลดภาพร่างกาย/โมเดลอวัยวะ"),
|
| 97 |
+
outputs=[
|
| 98 |
+
gr.Image(label="ภาพพร้อมกรอบอวัยวะ"),
|
| 99 |
+
gr.Textbox(label="คำอธิบายอวัยวะ"),
|
| 100 |
+
gr.Audio(label="เสียงพูดอวัยวะภาษาไทย")
|
| 101 |
+
],
|
| 102 |
+
title="🔬 ระบบเรียนรู้อวัยวะ Interactive 50 อวัยวะ + พูดไทย",
|
| 103 |
+
description="คลิกกรอบอวัยวะเพื่อฟังชื่อและดูคำอธิบายภาษาไทย"
|
| 104 |
+
)
|
| 105 |
+
|
| 106 |
+
demo.launch()
|