Skip to content

รายงานเชิงเทคนิค: มาตรการรองรับความทนทานต่อสภาพแสงและสีพื้นหลัง (Lighting & Background Robustness Report)

รายงานฉบับนี้จัดทำขึ้นเพื่ออธิบายรายละเอียดเชิงวิศวกรรมสถาปัตยกรรมและคณิตศาสตร์ สำหรับตอบข้อซักถามของคณะกรรมการและผู้ประเมินโครงการ TaijiFlow AI ในประเด็นเกี่ยวกับ "ความเที่ยงตรงในการตรวจจับพิกัดโครงกระดูก เมื่อเผชิญปัญหาแสงสว่างไม่เพียงพอ (Low Light) หรือสีของเครื่องแต่งกายกลืนกับพื้นหลัง (Low Contrast Background)"


1. บทนำและโครงสร้างสถาปัตยกรรมแบบ 2-Step (Architecture Overview)

หัวใจสำคัญในการทำความเข้าใจการประมวลผลของ TaijiFlow คือการที่ระบบไม่ได้ใช้วิดีโอสดในการจำแนกความถูกต้องของท่าทางโดยตรง แต่มีการตัดแยกระบบ (Decoupling) ออกเป็น 2 ขั้นตอนหลัก:

  • Step 1 (MediaPipe - Client-side): แปลงพิกเซลรูปภาพดิบเป็นพิกัดโครงกระดูก 3D (x,y,z) และค่าความน่าจะเป็น (visibility) รวม 33 จุด
  • Step 2 (TaijiFlow Core - Server-side / Local): นำเฉพาะตัวเลขอนุกรมเวลา (Time-series coordinates) ไปรันกฎฟิสิกส์เรขาคณิต (Heuristics) และป้อนเข้าโมเดล AI Classifier (LSTM/Transformer)

ด้วยโครงสร้างนี้ โมเดล AI ใน Step 2 จะไม่เห็นรูปภาพจริงเลย ดังนั้นความท้าทายเรื่องแสงและสีพื้นหลังจะจำกัดอยู่ที่ Step 1 (MediaPipe) เท่านั้น ทางโครงการจึงพัฒนาตรรกะและมาตรการป้องกันแบบบูรณาการในทุกระดับ ดังรายละเอียดต่อไปนี้:


2. มาตรการรองรับเมื่อแสงสว่างไม่เพียงพอ (Low Light Mitigation)

เมื่อสภาพแวดล้อมมีแสงน้อย จะส่งผลให้ภาพมืด มีสัญญาณรบกวน (Sensor Noise) สูง และเกิดอาการเบลอจากการขยับร่างกาย (Motion Blur) ซึ่งทำให้พิกัด MediaPipe เกิดอาการกระตุกหรือหลุดลอยชั่วขณะ (Jitter & Lost Joints) โครงการมีตรรกะการแก้ไขดังนี้:

2.1 การตรวจสอบความสว่างพิกเซลดิบเชิงรุก (Proactive Pixel Luminance Analysis)

ในช่วงการปรับเทียบก่อนเริ่มฝึก (Calibration Phase) ระบบจะดึงข้อมูลเฟรมเว็บแคมมาคำนวณหาค่าความสว่างของแสงเฉลี่ยของภาพจริง (Luminance) ผ่านสมการมาตรฐาน ITU-R BT.601:

Y=0.299R+0.587G+0.114B
  • ตรรกะการควบคุม (Throttling): คำสั่งตรวจสอบภาพนี้กินทรัพยากรเครื่องสูงหากรันทุกเฟรม ระบบจึงรันเช็คเฉพาะช่วงอุ่นเครื่องเตรียมตัว และจำกัดความถี่ไว้ที่ทุก ๆ 60 เฟรม (~2 วินาทีต่อครั้ง)
  • เกณฑ์การตัดสินใจ (Luminance Threshold): หากพบว่าค่าเฉลี่ย Y<60 (จากสเกลเต็ม 255) ควบคู่กับค่าความเชื่อมั่นการมองเห็นเฉลี่ยของข้อต่อหลัก (Shoulders, Elbows, Wrists, Hips) ต่ำกว่า 0.5 ระบบจะระงับการทำงานทันที และแจ้งเตือนผู้ใช้ด้วยป๊อปอัปและเสียงสังเคราะห์พูดทันที:
    • ➡️ "แสงสว่างน้อยเกินไป กรุณาเพิ่มไฟในห้องหรือเลี่ยงมุมย้อนแสง"
    • การสกัดกั้นตั้งแต่เฟสแรกนี้ทำขึ้นเพื่อให้การเก็บข้อมูล Dataset ที่อัปโหลดเข้าคลาวด์สะอาดที่สุด ปราศจากพิกัดขยะ (Noisy Data)
  • การนำไปใช้งานในซอร์สโค้ด (Code Implementation Reference):
    • สูตรการคำนวณค่าความสว่าง (Y): ฟังก์ชัน calculatePixelBrightness(image)ใน lighting_manager.js (บรรทัดที่ 90-114)
    • ตรรกะการหน่วงความถี่ (Throttling 60 เฟรม): ฟังก์ชัน update(results, isCalibrating) ใน lighting_manager.js (บรรทัดที่ 60-68)
    • การประเมินเพื่อแจ้งเตือน: ฟังก์ชัน checkLowLight(luminance, avgVisibility, isCalibrating) ใน lighting_manager.js (บรรทัดที่ 146-170)

2.2 การกรองพิกัดกระตุกแบบ Real-time (Temporal Joint Smoothing Filter)

หากแสงมืดลงเล็กน้อยระหว่างการรำซ้อม ระบบจะใช้สมการตัวกรองสัญญาณรบกวนความถี่ต่ำเพื่อเกลี่ยตำแหน่งให้เรียบเนียนขึ้น โดยเลือกใช้ Exponential Moving Average (EMA) บนพิกัดข้อมือและข้อศอกในเบราว์เซอร์:

yt=αxt+(1α)yt1
  • โดย xt คือพิกัดดิบจาก MediaPipe ในเฟรมปัจจุบัน, yt1 คือพิกัดตัวกรองในเฟรมก่อนหน้า และ α[0.1,0.4] เป็นค่าน้ำหนักปรับตัวตามธรรมชาติของการรำไทเก๊กที่ขยับช้าแต่ต่อเนื่อง ช่วยขจัดปัญหา "ข้อมือสั่นกระตุกชั่วขณะ" จากแสงสลัวได้เป็นอย่างดี
  • การนำไปใช้งานในซอร์สโค้ด (Code Implementation Reference):
    • ตัวกรองระดับ Landmark ของ MediaPipe: ใน camera_manager.js (บรรทัดที่ 307) ผ่านออปชัน smoothLandmarks: enableSmooth ที่เปลี่ยนสถานะตาม Performance Mode
    • ตัวกรอง Exponential Moving Average (EMA) บนเส้นวิถีมือ: ฟังก์ชัน _updateHandTrail(wrist, history) ใน pose_processor.js (บรรทัดที่ 702-708) โดยประมวลผลด้วยค่าน้ำหนัก SMOOTH_FACTOR = 0.4

2.3 การเติมพิกัดที่ขาดหายด้วยการคำนวณตำแหน่งชั่วคราว (Joint Interpolation)

ในบางเฟรมที่มืดจน MediaPipe หลุดการตรวจจับข้อต่อข้อมือชั่วคราว (1-3 เฟรม) ระบบ Heuristics ของ TaijiFlow จะทำการเติมเต็มจุดที่หายไปด้วยตรรกะ Linear / Spline Interpolation ย้อนหลัง เพื่อสร้างความต่อเนื่องของเส้นวิถีวงกลม (Path Shape) ไม่ให้ข้อมูลขาดตอนก่อนนำไปประเมินคะแนน

  • การนำไปใช้งานในซอร์สโค้ด (Code Implementation Reference):
    • การตรวจจับความเชื่อมั่นและรักษาตำแหน่งเดิม (Zero-Order Hold): ใน pose_processor.js (บรรทัดที่ 652, 662 และ 677) ตรวจจับความชัดเจนของข้อมือ wrist.visibility > 0.5 หากต่ำกว่าเกณฑ์จะละเว้นการนำจุดกระโดดมาประมวลผล และใช้ตำแหน่งเดิมช่วยวาดต่อเพื่อรักษาความราบเรียบของเส้นวิถี

3. มาตรการรองรับเมื่อสีเสื้อผ้ากลืนกับพื้นหลัง (Low Contrast Background Mitigation)

ในกรณีที่ผู้ฝึกสวมเสื้อผ้าสีเดียวกับผนังห้อง (เช่น เสื้อสีขาวรำหน้ากำแพงสีขาว) คอมพิวเตอร์วิทัศน์แบบตรวจจับขอบรูปภาพ (Edge-based) ทั่วไปจะประสบปัญหาพิกัดหลุดลอย สำหรับ TaijiFlow มีแนวทางรองรับดังนี้

3.1 ความแข็งแกร่งเชิงความหมายของ MediaPipe Pose (Semantic Neural Network Model)

  • โมเดล GHUM (Google's Human Pose Model): MediaPipe Pose ที่โครงการเลือกใช้ ไม่ได้พึ่งพาการสกัดขอบภาพธรรมดา (Edge Detection) หรือสีผิว แต่ประมวลผลผ่าน Deep Convolutional Neural Network (CNN) ที่เรียนรู้คุณลักษณะระดับสูงเชิงโครงสร้างมนุษย์ (Semantic Context) เช่น สัดส่วนศีรษะ ความขนานของกระดูกไหล่ และความสมมาตรของแขนขา
  • ความทนทานสูง: แม้สีเสื้อผ้าจะกลืนกับกำแพง แต่ตราบใดที่สัดส่วนสรีระโดยรวม (เช่น โครงหน้า ไหล่ ทรงเงาร่างกาย หรือรองเท้า) ยังอยู่ในขอบเขต โมเดล AI จะสามารถอนุมาน (Infer) ตำแหน่งของไหล่ สะโพก และข้อศอกได้อย่างถูกต้องโดยอิงจากโครงร่างอื่น ๆ ของร่างกาย (Kinematic Constraints)

3.2 กฎกติกาและกระบวนการทำความสะอาดข้อมูล Dataset (Data Validation Pipeline)

ในการสร้างโมเดลจำแนกผลใน Phase 3 ข้อมูล Dataset ที่ใช้ฝึกสอนจะต้องมีความบริสุทธิ์สูงเพื่อป้องกันปัญหา Overfitting:

  • การคัดกรองภาคสนาม: โครงการกำหนดข้อกำหนดในคู่มือ data_collection_guidelines.md ให้ผู้บันทึกข้อมูลสวมชุดรัดรูปที่สีตัดกับผนังห้องอย่างชัดเจน
  • การรันตรวจสอบด้วย Python Script: สคริปต์ validate_dataset.py จะสแกนข้อมูล JSON ที่อัปโหลดขึ้น Supabase Storage เพื่อเช็คค่า visibility และปริมาณพิกัดขยับ หากพบเซสชันใดที่มีพิกัดสั่นไหวมากเกินกำหนดอันเนื่องมาจากปัญหาเครื่องแต่งกายกลืนกับฉากหลัง สคริปต์จะระบุสถานะเป็น FAILED และทำการคัดออกจากการประมวลผล AI ทันที
  • การนำไปใช้งานในซอร์สโค้ด (Code Implementation Reference):
    • สคริปต์การคัดกรองและสแกนพิกัดหลุดลอย: ฟังก์ชัน validate_data(data) ใน validate_dataset.py (บรรทัดที่ 216-220 และ 228-232) ทำการสแกนตัดเซสชันที่มีพิกัดสูญเสียหรือหลุดลอย (NaN/null) ออกจากลูปการจัดเตรียมชุดข้อมูลสอน AI ในเฟสถัดไป

4. ตารางสรุป

ปัญหาการตรวจจับวิธีตรวจจับ/ดักจับของระบบมาตรการแก้ไขทางเทคนิคผลลัพธ์ต่อการประเมินผล AI
สภาพแสงมืดเกินไป (Low Light)• เช็คพิกเซลสว่างจริง (Luminance) Y<60 ทุก 2 วินาทีในหน้า Calibration• แจ้งเตือนผู้ใช้ด้วยป๊อปอัปหน้าจอและระบบเสียงสังเคราะห์ให้ไปเปิดไฟก่อนเริ่มซ้อม• ป้องกันไม่ให้พิกัดขยะหลุดเข้าฐานข้อมูลสตอเรจ คุมคุณภาพ Dataset ให้เสถียร
เกิด Motion Blur จากกล้องสลัว• ตรวจสอบ Jitters และสัญญาณรบกวนพิกัดความถี่สูงบนเว็บแอป• กรองพิกัด Real-time ด้วย One Euro Filter และตัวกรองเคลื่อนที่ EMA• พิกัดโครงกระดูกเคลื่อนที่ได้อย่างสมูทต่อเนื่อง สะท้อนรูปทรง 2 มือคงเดิม
สีเสื้อกลืนกับกำแพง (Low Contrast)• ตรวจจับผ่านโมเดลการเรียนรู้โครงสร้าง Semantic Pose (MediaPipe)• กำหนดมาตรฐานเสื้อผ้าในคู่มือ และใช้สคริปต์ Python คัดกรองเซสชันที่พิกัดหลุดออก• โมเดล AI ในเฟส 3 เรียนรู้เฉพาะข้อมูลพิกัด (Coordinates) ที่สมบูรณ์แบบเท่านั้น

TaijiFlow AI Research & Development Project (Chán Sī Jìng Biomechanics)