รายงานเชิงเทคนิค: มาตรการรองรับความทนทานต่อสภาพแสงและสีพื้นหลัง (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 (
) และค่าความน่าจะเป็น ( 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:
- ตรรกะการควบคุม (Throttling): คำสั่งตรวจสอบภาพนี้กินทรัพยากรเครื่องสูงหากรันทุกเฟรม ระบบจึงรันเช็คเฉพาะช่วงอุ่นเครื่องเตรียมตัว และจำกัดความถี่ไว้ที่ทุก ๆ 60 เฟรม (~2 วินาทีต่อครั้ง)
- เกณฑ์การตัดสินใจ (Luminance Threshold): หากพบว่าค่าเฉลี่ย
(จากสเกลเต็ม 255) ควบคู่กับค่าความเชื่อมั่นการมองเห็นเฉลี่ยของข้อต่อหลัก (Shoulders, Elbows, Wrists, Hips) ต่ำกว่า ระบบจะระงับการทำงานทันที และแจ้งเตือนผู้ใช้ด้วยป๊อปอัปและเสียงสังเคราะห์พูดทันที: - ➡️ "แสงสว่างน้อยเกินไป กรุณาเพิ่มไฟในห้องหรือเลี่ยงมุมย้อนแสง"
- การสกัดกั้นตั้งแต่เฟสแรกนี้ทำขึ้นเพื่อให้การเก็บข้อมูล Dataset ที่อัปโหลดเข้าคลาวด์สะอาดที่สุด ปราศจากพิกัดขยะ (Noisy Data)
- การนำไปใช้งานในซอร์สโค้ด (Code Implementation Reference):
- สูตรการคำนวณค่าความสว่าง (
): ฟังก์ชัน 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) บนพิกัดข้อมือและข้อศอกในเบราว์เซอร์:
- โดย
คือพิกัดดิบจาก MediaPipe ในเฟรมปัจจุบัน, คือพิกัดตัวกรองในเฟรมก่อนหน้า และ เป็นค่าน้ำหนักปรับตัวตามธรรมชาติของการรำไทเก๊กที่ขยับช้าแต่ต่อเนื่อง ช่วยขจัดปัญหา "ข้อมือสั่นกระตุกชั่วขณะ" จากแสงสลัวได้เป็นอย่างดี - การนำไปใช้งานในซอร์สโค้ด (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
- ตัวกรองระดับ Landmark ของ MediaPipe: ใน camera_manager.js (บรรทัดที่ 307) ผ่านออปชัน
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หากต่ำกว่าเกณฑ์จะละเว้นการนำจุดกระโดดมาประมวลผล และใช้ตำแหน่งเดิมช่วยวาดต่อเพื่อรักษาความราบเรียบของเส้นวิถี
- การตรวจจับความเชื่อมั่นและรักษาตำแหน่งเดิม (Zero-Order Hold): ใน pose_processor.js (บรรทัดที่ 652, 662 และ 677) ตรวจจับความชัดเจนของข้อมือ
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) | • แจ้งเตือนผู้ใช้ด้วยป๊อปอัปหน้าจอและระบบเสียงสังเคราะห์ให้ไปเปิดไฟก่อนเริ่มซ้อม | • ป้องกันไม่ให้พิกัดขยะหลุดเข้าฐานข้อมูลสตอเรจ คุมคุณภาพ Dataset ให้เสถียร |
| เกิด Motion Blur จากกล้องสลัว | • ตรวจสอบ Jitters และสัญญาณรบกวนพิกัดความถี่สูงบนเว็บแอป | • กรองพิกัด Real-time ด้วย One Euro Filter และตัวกรองเคลื่อนที่ EMA | • พิกัดโครงกระดูกเคลื่อนที่ได้อย่างสมูทต่อเนื่อง สะท้อนรูปทรง 2 มือคงเดิม |
| สีเสื้อกลืนกับกำแพง (Low Contrast) | • ตรวจจับผ่านโมเดลการเรียนรู้โครงสร้าง Semantic Pose (MediaPipe) | • กำหนดมาตรฐานเสื้อผ้าในคู่มือ และใช้สคริปต์ Python คัดกรองเซสชันที่พิกัดหลุดออก | • โมเดล AI ในเฟส 3 เรียนรู้เฉพาะข้อมูลพิกัด (Coordinates) ที่สมบูรณ์แบบเท่านั้น |