ข้ามไปยังเนื้อหา

ออกแบบ capstone: Guardian สามเสาในไฟล์เดียว

โมดูล 8 — Capstone: แอป Edge AI ของเราเอง · สไลด์: slides.md · ภาพรวมโมดูล · หน้าหลักสูตร

ออกแบบ capstone ที่ต่างจากเดโมหนึ่งชิ้น Guardian ร้อยสามเสาของวงจรข้อมูลไว้ในลูปเดียว ได้แก่ DAQ (ความเร่งดิบเป็นบริบท) Processing (EMA กรองความมั่นใจ) และ Apps (verdict ผ่านชั้นตัดสินใจแล้วสั่งการ) พร้อมคณิตของขนาดเวกเตอร์ EMA และเงื่อนไขยิงสามด่าน และการเลือกค่าออกแบบอย่างมีเหตุผล

เมื่อจบบทเรียนนี้ คุณจะ:

  1. แยก capstone หรือผลิตภัณฑ์ออกจากเดโม และชี้ได้ว่า Guardian ข้ามสามเสาใด (DAQ, Processing, Apps) และต่อยอดด้วยเสา Training หรือ Analysis ได้อย่างไร
  2. คำนวณขนาดเวกเตอร์ความเร่งและ EMA ของความมั่นใจหนึ่งก้าว และอธิบายว่าทำไมต้องสร้างตัวกรองนอกลูปและล้างเมื่อกด Load
  3. เขียนเงื่อนไขยิง (top = alert_idx) ∧ (s_n ≥ CONF_FLOOR) ∧ (streak ≥ HITS_NEEDED) พร้อม edge-trigger และบอกว่าพีคหลอกแบบใดถูกด่านใดกันไว้
  4. เลือกค่า CONF_FLOOR, HITS_NEEDED, EMA_ALPHA และจังหวะลูปให้ผลิตภัณฑ์ที่กำหนด พร้อมเหตุผลเรื่องการพลาดของจริงเทียบกับการเตือนผิด ความไว ความนิ่ง และพลังงาน

ผ่านโมดูล 1 ถึง 7 มาแล้ว มี logger ฟิลเตอร์ โมเดลที่ฝึกเอง และท่อสั่งการในมือ เปิด s20_capstone_full.py (อยู่ในบทเรียน 8.2) ไว้ใน BENTO IDE

รัน s20_capstone_full.py เลือก Motion กด Load แล้วเขย่าค้างจนแบนเนอร์ ! ALERT ! เด้งพร้อมเสียงและตัวนับ จากนั้นเขย่าแวบเดียว สังเกตว่ามันไม่เตือน ถามตัวเองว่า Guardian ใช้ของจากโมดูลใดบ้างถึงทำแบบนี้ได้

เดโม ตอบว่า “ทำได้ไหม” ในสภาพอุดมคติ ส่วน capstone ตอบว่า “ใช้ได้จริงไหม” ต้องรับมือ noise, false positive และการเก็บกวาด แล้วอธิบายการออกแบบได้ ข้อกำหนดคือต้องข้ามอย่างน้อยสามเสาของวงจรข้อมูล Guardian ร้อยสามเสาในลูป while เดียว: DAQ อ่าน ax, ay, az = sensors.bmi270.acceleration() แล้วหา $mag = \sqrt{a_x^2 + a_y^2 + a_z^2}$ (วางนิ่งราว 9.8 m/s², เขย่าพุ่งขึ้น) เป็นบริบท Processing กรองความมั่นใจด้วย $s_n = \alpha c_n + (1-\alpha) s_{n-1}$ ผ่าน conf_ema = dsp.EMA(alpha=EMA_ALPHA) ที่สร้างนอกลูปเพราะต้องจำอดีต และ reset() เมื่อกด Load เพื่อเริ่มเฝ้ารอบใหม่ Apps ใช้แกนเดิม models / select / result / stop กับ CONF_FLOOR แล้วเพิ่มชั้นตัดสินใจ ต่อยอดได้ด้วยโมเดลที่ฝึกเอง (Training) หรือ feature จาก FFT (Analysis)

ชั้นตัดสินใจมีสามด่านซ้อนกัน: คลาสถูกตัว (top == alert_idx โดยกติกาออกแบบให้คลาสสุดท้ายคือเหตุการณ์ เช่น shaking) มั่นใจพอจากค่าที่กรองแล้ว (conf_s >= CONF_FLOOR) และติดกันพอ (streak >= HITS_NEEDED) คือ $\text{fire} \iff (top = alert_idx) \wedge (s_n \ge \text{CONF_FLOOR}) \wedge (streak \ge \text{HITS_NEEDED})$ แล้วใช้ธง fired ยิงครั้งเดียวต่อเหตุการณ์ พลาดด่านไหน streak กลับเป็นศูนย์ false positive ส่วนใหญ่ผ่านได้แค่หนึ่งหรือสองด่าน การบังคับให้ผ่านครบสามคือเหตุผลที่พีคแวบเดียวไม่ทำให้เตือน

ทุกค่าออกแบบมีราคาสองด้าน CONF_FLOOR สูงพลาดของจริง ต่ำเตือนผิด HITS_NEEDED สูงตอบช้า ต่ำโดนพีคหลอก EMA_ALPHA สูงไวแต่แกว่ง ต่ำนิ่งแต่หน่วง และ time.sleep_ms ของลูปแลกพลังงานกับความไว ไม่มีค่าที่ถูกที่สุด มีแต่ค่าที่เหมาะกับต้นทุนของการพลาดในงานนั้น เช่นตรวจการล้มของผู้สูงอายุยอมเตือนผิดดีกว่าพลาด ส่วนป้ายโฆษณากวักมือยอมพลาดดีกว่ากวนคนเดินผ่าน capstone เริ่มที่ Design (เฝ้าอะไร action อะไร เกณฑ์เท่าไรเพราะอะไร) แล้วค่อย Build และ Ship

สไลด์ของบทเรียนนี้อ้างถึงไฟล์ที่อยู่ในบทเรียนอื่นหรือใน shared/ ด้วย:

คำถามชุดเดียวกันอยู่ใน quiz.yaml สำหรับระบบที่ตรวจอัตโนมัติ

  1. Guardian แตะเสาใดโดยตรงบ้าง (เลือกหนึ่งข้อ · เป้าหมายข้อ 1)

    • ก) DAQ, Processing และ Apps
    • ข) Training เท่านั้น
    • ค) Analysis กับ Training
    • ง) Apps เท่านั้น
    เฉลย

    ก — อ่านความเร่งดิบ (DAQ) กรองความมั่นใจด้วย EMA (Processing) และ verdict สู่ action (Apps) ส่วน Training กับ Analysis เป็นทางต่อยอด

  2. EMA_ALPHA = 0.4 ค่าที่กรองไว้เดิม 0.30 และ conf ดิบใหม่ 0.90 ได้ค่าใหม่เท่าไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 2)

    • ก) 0.90
    • ข) 0.60
    • ค) 0.54
    • ง) 0.36
    เฉลย

    ค — 0.4 × 0.90 + 0.6 × 0.30 = 0.36 + 0.18 = 0.54 ผ่านเกณฑ์ 0.50 แล้ว แต่ยังต้องผ่านด่าน streak ด้วย

  3. ถ้าสร้าง dsp.EMA ใหม่ทุกรอบในลูป จะเกิดอะไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 2)

    • ก) กรองได้ดีขึ้น
    • ข) ตัวกรองเสียความจำทุกเฟรม ค่าออกเท่ากับค่าดิบ จึงไม่ได้กรองอะไรเลย
    • ค) โปรแกรมหยุด
    • ง) ค่ากลายเป็นศูนย์
    เฉลย

    ข — EMA ครั้งแรกคืนค่าที่ป้อนเข้าไป ถ้าสร้างใหม่ทุกรอบก็เหมือนไม่มีตัวกรอง จึงต้องสร้างครั้งเดียวก่อนลูป

  4. top = alert_idx, conf_s = 0.62 และ streak = 2 ขณะ HITS_NEEDED = 3 Guardian ยิงหรือไม่ (เลือกหนึ่งข้อ · เป้าหมายข้อ 3)

    • ก) ยิง เพราะคลาสถูกและมั่นใจพอ
    • ข) ยังไม่ยิง เพราะด่าน streak ยังไม่ครบ
    • ค) ยิงสองครั้ง
    • ง) ไม่ยิงเพราะ conf ต่ำ
    เฉลย

    ข — ต้องผ่านครบทั้งสามด่านพร้อมกัน ถ้าผลถัดไปยังถูกคลาสและมั่นใจพอ streak จะครบ 3 แล้วยิงครั้งเดียว

  5. Guardian ตรวจการล้มของผู้สูงอายุ ควรปรับค่าไปทางใด (เลือกหนึ่งข้อ · เป้าหมายข้อ 4)

    • ก) CONF_FLOOR สูงและ HITS_NEEDED มาก เพื่อไม่ให้เตือนผิดเลย
    • ข) ยอมเตือนผิดได้บ้างเพื่อไม่พลาดของจริง เช่น CONF_FLOOR ต่ำลงและ HITS_NEEDED น้อยลง
    • ค) ไม่ต้องมีชั้นตัดสินใจ
    • ง) EMA_ALPHA = 0
    เฉลย

    ข — ต้นทุนของการพลาดการล้มสูงกว่าการเตือนผิดมาก การจูนจึงต้องเอนไปทางไว แล้วเขียนเหตุผลนี้ไว้ในการออกแบบ

  • เขียนแผนผังสามเสาของ Guardian ในบันทึกการเรียน พร้อมชื่อคำสั่งหลักของแต่ละเสา
  • ใช้ 15 นาทีออกแบบ Guardian ของคุณ: เฝ้าโมเดลใด เหตุการณ์คืออะไร action คืออะไร และต้นทุนของการพลาดกับการเตือนผิดต่างกันแค่ไหน
  • เลือกค่าเริ่มต้นของ CONF_FLOOR, HITS_NEEDED, EMA_ALPHA พร้อมเหตุผลหนึ่งบรรทัดต่อค่า

บทเรียน 8.2 เราจะเติมห้าบรรทัดสันหลังของ s20_capstone.py แล้วสร้าง จูน และเดโม Guardian ของเราเอง

บทเรียนถัดไป: บทเรียน 8.2 — ลงมือทำ: สร้างและส่งมอบแอป Edge AI

  • งานรอบตัวคุณงานไหนที่การพลาดของจริงแพงกว่าการเตือนผิด และงานไหนกลับกัน
  • ถ้าได้เพิ่มเสาที่สี่ให้ Guardian คุณจะเลือก Training หรือ Analysis และได้อะไรเพิ่ม

คำถามทบทวน

ลองตอบเองก่อน แล้วค่อยเปิดดูเฉลย

  1. Guardian แตะเสาใดโดยตรงบ้าง (เป้าหมายข้อ 1)

    1. DAQ, Processing และ Apps
    2. Training เท่านั้น
    3. Analysis กับ Training
    4. Apps เท่านั้น
    ดูเฉลย

    คำตอบ: A. DAQ, Processing และ Apps

    อ่านความเร่งดิบ (DAQ) กรองความมั่นใจด้วย EMA (Processing) และ verdict สู่ action (Apps) ส่วน Training กับ Analysis เป็นทางต่อยอด

  2. EMA_ALPHA = 0.4 ค่าที่กรองไว้เดิม 0.30 และ conf ดิบใหม่ 0.90 ได้ค่าใหม่เท่าไร (เป้าหมายข้อ 2)

    1. 0.90
    2. 0.60
    3. 0.54
    4. 0.36
    ดูเฉลย

    คำตอบ: C. 0.54

    0.4 × 0.90 + 0.6 × 0.30 = 0.36 + 0.18 = 0.54 ผ่านเกณฑ์ 0.50 แล้ว แต่ยังต้องผ่านด่าน streak ด้วย

  3. ถ้าสร้าง dsp.EMA ใหม่ทุกรอบในลูป จะเกิดอะไร (เป้าหมายข้อ 2)

    1. กรองได้ดีขึ้น
    2. ตัวกรองเสียความจำทุกเฟรม ค่าออกเท่ากับค่าดิบ จึงไม่ได้กรองอะไรเลย
    3. โปรแกรมหยุด
    4. ค่ากลายเป็นศูนย์
    ดูเฉลย

    คำตอบ: B. ตัวกรองเสียความจำทุกเฟรม ค่าออกเท่ากับค่าดิบ จึงไม่ได้กรองอะไรเลย

    EMA ครั้งแรกคืนค่าที่ป้อนเข้าไป ถ้าสร้างใหม่ทุกรอบก็เหมือนไม่มีตัวกรอง จึงต้องสร้างครั้งเดียวก่อนลูป

  4. top = alert_idx, conf_s = 0.62 และ streak = 2 ขณะ HITS_NEEDED = 3 Guardian ยิงหรือไม่ (เป้าหมายข้อ 3)

    1. ยิง เพราะคลาสถูกและมั่นใจพอ
    2. ยังไม่ยิง เพราะด่าน streak ยังไม่ครบ
    3. ยิงสองครั้ง
    4. ไม่ยิงเพราะ conf ต่ำ
    ดูเฉลย

    คำตอบ: B. ยังไม่ยิง เพราะด่าน streak ยังไม่ครบ

    ต้องผ่านครบทั้งสามด่านพร้อมกัน ถ้าผลถัดไปยังถูกคลาสและมั่นใจพอ streak จะครบ 3 แล้วยิงครั้งเดียว

  5. Guardian ตรวจการล้มของผู้สูงอายุ ควรปรับค่าไปทางใด (เป้าหมายข้อ 4)

    1. CONF_FLOOR สูงและ HITS_NEEDED มาก เพื่อไม่ให้เตือนผิดเลย
    2. ยอมเตือนผิดได้บ้างเพื่อไม่พลาดของจริง เช่น CONF_FLOOR ต่ำลงและ HITS_NEEDED น้อยลง
    3. ไม่ต้องมีชั้นตัดสินใจ
    4. EMA_ALPHA = 0
    ดูเฉลย

    คำตอบ: B. ยอมเตือนผิดได้บ้างเพื่อไม่พลาดของจริง เช่น CONF_FLOOR ต่ำลงและ HITS_NEEDED น้อยลง

    ต้นทุนของการพลาดการล้มสูงกว่าการเตือนผิดมาก การจูนจึงต้องเอนไปทางไว แล้วเขียนเหตุผลนี้ไว้ในการออกแบบ

อ้างอิงบทเรียนนี้

ถ้านำบทเรียนนี้ไปสอน ทำสไลด์ หรือทำเอกสารต่อ ให้อ้างอิงด้วยข้อความนี้ ถ้าดัดแปลงเนื้อหา ให้เติม (ดัดแปลง)ต่อท้ายชื่อบทเรียน

"ออกแบบ capstone: Guardian สามเสาในไฟล์เดียว" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0

ข้อความอ้างอิงภาษาอังกฤษ: "Designing the capstone: Guardian, three pillars in one file" from TESA Open Knowledge by the Thai Embedded Systems Association (TESA), https://github.com/tesaiot/tesa-qualification-program, licensed under CC BY-NC 4.0

ลิงก์บทเรียน: https://tesaiot.github.io/tesa-qualification-program/courses/edge-ai-developer/m08-capstone/l01-capstone-design/

วิธีอ้างอิง TESA ฉบับเต็ม

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA