ลงมือทำ: ให้โมเดลใหม่โผล่ใน edge_ai.models()
โมดูล 7 — ใต้ฝากระโปรงและการต่อเติม · สไลด์: slides.md · ภาพรวมโมดูล · หน้าหลักสูตร
เติมห้าจุดใน s19_extend_model.py ที่ข้ามสองฝั่ง ครึ่งบนสร้าง C ROW จากสเปกในภาษา Python ครึ่งล่างถามทะเบียนด้วย count() และ models() แล้วเลือกรันโมเดลของเรา จากนั้นเพิ่มโมเดลเข้าเฟิร์มแวร์จริง ยืนยันด้วยจำนวนโมเดลก่อนและหลัง และเดิน checklist ก่อนเชื่อผลบนฮาร์ดแวร์
เป้าหมาย
หัวข้อที่มีชื่อว่า “เป้าหมาย”เมื่อจบบทเรียนนี้ คุณจะ:
- เติมห้าจุดใน practice/s19_extend_model.py จนพิมพ์ ROW ที่มีสี่ชื่อฟังก์ชันและคลาสครบ และหา index ของโมเดลในทะเบียนจากชื่อได้ (บน Emulator จะยังไม่เจอ Fall ซึ่งถูกต้อง)
- เพิ่มโมเดลเข้าเฟิร์มแวร์ (สามการแก้ในซอร์สตัวเต็ม หรือ ai_engine_register() ใน SDK สาธารณะ) แล้วแสดง edge_ai.count() ก่อนและหลัง ชื่อใหม่ใน models() และ verdict จริงเมื่อ select
- เดิน checklist ก่อนเชื่อผล (ตรวจสัญลักษณ์ด้วย nm, section .ml_weights, clean build, hard power-cycle) และอธิบายเหตุผลของแต่ละข้อ
ก่อนเริ่ม
หัวข้อที่มีชื่อว่า “ก่อนเริ่ม”ผ่านบทเรียน 7.3 มาแล้ว รู้จักสามการแก้ สัญญาสี่ฟังก์ชัน และทางเทียบเท่าใน SDK ถ้าจะทำส่วนเฟิร์มแวร์ ติดตั้ง ModusToolbox และ clone SDK สาธารณะ ไว้ พร้อมโมเดลที่ห่อตามสัญญาสี่ฟังก์ชันแล้ว
- อุปกรณ์: บอร์ด TESAIoT Dev Kit ที่ลงเฟิร์มแวร์ MicroPython ของ BENTO แล้ว หรือ BENTO Emulator ใน BENTO IDE — ครึ่งบนของไฟล์ (สเปกกับ ROW) ซ้อมบน Emulator ได้ การเพิ่มโมเดลต้อง build เฟิร์มแวร์ด้วย ModusToolbox แล้วลงบอร์ด ซอร์สตัวเต็มยังไม่เปิดเผย จึงใช้ SDK สาธารณะกับ ai_engine_register() แทนการแก้ ai_engine.c
- เรียนมาก่อน: บทเรียน 7.3 — เพิ่มโมเดลของเราเอง: สามการแก้ สัญญาสี่ฟังก์ชัน และ Vela
ไฟล์นี้ข้ามฝั่ง: เขียนสเปก → พิมพ์ C ROW ที่ต้องวาง → ถามทะเบียนว่าโผล่ยัง → เลือกรันแล้วอ่าน verdict ห้าจุดที่เติมคือ
(1) "sensor": edge_ai.SENSOR_IMU กับ "labels": ["normal", "fall"] ใน SPEC (2) deq_fn = "AIM_%s_dequeue" % prefix ใน make_row()
ที่ประกอบข้อความ #if defined(EDGE_AI_MODEL_fall) / #define FALL_ROW {...} / #endif ให้ก๊อปไปวาง ลืมจุดนี้ ROW จะมี .dequeue = None ซึ่งคอมไพล์ไม่ผ่าน
(3) n = edge_ai.count() (4) mine = i เมื่อชื่อตรง ซึ่งหา index จากชื่อ ไม่ hard-code ตัวเลข และ (5) edge_ai.select(idx) ตามด้วย r = edge_ai.result()
ห่อด้วย try/except OSError เพราะโมเดลใหม่อาจ init ไม่ผ่าน
บน Emulator ใช้ซ้อมครึ่งบนได้ ทะเบียนมีห้าโมเดลและยังไม่มี Fall ซึ่งถูกต้อง เพราะเบราว์เซอร์ build C ไม่ได้ ครึ่งล่างทดลองกับโมเดลที่มีอยู่ เช่น Motion
บนบอร์ด ในซอร์สตัวเต็มทำสามการแก้ แล้ว rm -rf proj_cm55/build; make program EDGE_AI_MODEL=combo ถ้าใช้ SDK สาธารณะ ให้เรียก ai_engine_register(&desc)
จากโค้ดของเราตอนบูต แล้ว build ด้วย ModusToolbox จากนั้นกด Re-check: count() ต้องเพิ่มขึ้น (บนบอร์ดหกเป็นเจ็ด) ชื่อใหม่ขึ้นสีเขียว แล้ว Run mine
ขยับบอร์ดจนคลาสสลับ normal กับ fall ก่อนเชื่อผลให้เดิน checklist: ทดสอบ .tflite ใน Python ก่อนห่อ ตรวจด้วย nm ว่าสัญลักษณ์ไม่ชนกัน
weights ก้อนใหญ่อยู่ใน .ml_weights front-end ตรงกับตอนฝึก clean build และ hard power-cycle หนึ่งการเปลี่ยนต่อหนึ่งการ flash
ตัวอย่างสมบูรณ์
หัวข้อที่มีชื่อว่า “ตัวอย่างสมบูรณ์”s19_extend_model_full.py รองรับทั้ง STYLE = "AIM" (โมเดลจาก DEEPCRAFT Studio) และ "IMAI" (Ready-Model แบบ .a) ตรวจว่าสัญญาสี่ฟังก์ชันครบ
เทียบ count() ก่อนและหลัง และแยกสี verdict ตาม CONF_FLOOR พร้อม latency
| ไฟล์ | ไฟล์นี้สอน |
|---|---|
| examples/s19_extend_model_full.py | เพิ่มโมเดลของเราเองเข้า Edge AI (ฉบับเต็ม) |
ฝึกเติม
หัวข้อที่มีชื่อว่า “ฝึกเติม”คอมเมนต์ # เติม อยู่ที่บรรทัด 44 (SPEC sensor และ labels), 60 (deq_fn), 129 (count), 138 (mine = i) และ 156 (select กับ result)
ถ้า ROW ที่พิมพ์มี None อยู่ จุดที่ 60 ยังว่าง ถ้า diff ของจำนวนโมเดลเป็นศูนย์เสมอ ตรวจจุดที่ 129
| ไฟล์ฝึก | เรื่อง |
|---|---|
| practice/s19_extend_model.py | เพิ่มโมเดลของเราเองเข้า Edge AI (ฉบับฝึกเติมโค้ด) |
เปิดเฉลยหลังจากลองเองแล้วอย่างน้อยหนึ่งรอบ และอ่าน วิธีใช้เฉลย ก่อน
| เฉลย | คู่กับ |
|---|---|
| solution/s19_extend_model.py | practice/s19_extend_model.py |
เช็กความเข้าใจ
หัวข้อที่มีชื่อว่า “เช็กความเข้าใจ”คำถามชุดเดียวกันอยู่ใน quiz.yaml สำหรับระบบที่ตรวจอัตโนมัติ
-
ROW ที่พิมพ์ออกมามี .dequeue = None จุดใดยังว่าง (เลือกหนึ่งข้อ · เป้าหมายข้อ 1)
- ก) จุดที่ 1 SPEC
- ข) จุดที่ 2 deq_fn ใน make_row()
- ค) จุดที่ 3 count()
- ง) จุดที่ 5 select
เฉลย
ข — make_row ประกอบชื่อฟังก์ชันทั้งสี่จาก prefix ถ้า deq_fn ยังเป็น None ข้อความ ROW จะคอมไพล์ไม่ผ่าน
-
รันบน Emulator แล้ว scan_registry() ไม่เจอ Fall Detection หมายความว่าอะไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 1)
- ก) โค้ดผิด
- ข) ถูกต้องแล้ว Emulator มีห้าโมเดลที่คอมไพล์มาแล้ว และ build C ในเบราว์เซอร์ไม่ได้
- ค) ต้องรีเฟรชเบราว์เซอร์
- ง) ต้องเพิ่มชื่อใน edge_ai.py
เฉลย
ข — การเพิ่มโมเดลต้องมี toolchain และ flash ลงบอร์ด นี่คือเส้นแบ่งระหว่างงานเฟิร์มแวร์กับงานระดับแอป
-
หลักฐานข้อใดยืนยันว่าเพิ่มโมเดลสำเร็จจริง (เลือกหนึ่งข้อ · เป้าหมายข้อ 2)
- ก) build ผ่านโดยไม่มี error
- ข) count() เพิ่มขึ้น ชื่อใหม่อยู่ใน models() และ select แล้ว verdict สลับตามการขยับจริง
- ค) ไฟล์โมเดลอยู่ในโฟลเดอร์ถูกที่
- ง) ROW พิมพ์ออกมาครบ
เฉลย
ข — build ผ่านหรือไฟล์อยู่ถูกที่ยังไม่ได้แปลว่าทั้งสี่ฟังก์ชันต่อสายถูก ต้องเห็นทั้งทะเบียนและ verdict บนบอร์ด
-
ทำไม checklist จึงให้ hard power-cycle ก่อนเชื่อผลบนฮาร์ดแวร์ (เลือกหนึ่งข้อ · เป้าหมายข้อ 3)
- ก) เพื่อล้างไฟล์ใน flash
- ข) หลัง flash เซนเซอร์และ NPU บางตัวต้อง init ใหม่จากไฟจริง ไม่งั้นค่าที่อ่านอาจค้างจากรอบก่อน
- ค) เพื่อให้ Wi-Fi ต่อใหม่
- ง) ไม่จำเป็น
เฉลย
ข — หนึ่งการเปลี่ยนต่อหนึ่งการ flash แล้ว power-cycle ก่อนเชื่อ ช่วยให้แน่ใจว่าผลที่เห็นมาจากการเปลี่ยนครั้งนี้จริง
MVP ของชุดบทเรียน 7.3–7.4: โมเดลใหม่ที่เพิ่มเอง edge_ai.count() เพิ่มขึ้น ชื่อโผล่ใน edge_ai.models() และเลือกรันแล้วได้ verdict จริงบนบอร์ด
- เติมไฟล์ฝึกครบห้าจุด รันบน Emulator แล้วตรวจ ROW ที่พิมพ์ออกมาทีละฟิลด์
- บนบอร์ด จด
edge_ai.count()ก่อนเพิ่มโมเดล - เพิ่มโมเดล (สามการแก้ในซอร์สตัวเต็ม หรือ
ai_engine_register()ใน SDK) build แล้ว hard power-cycle จดcount()หลังเพิ่ม และ verdict เมื่อ Run mine - เขียน checklist ที่คุณเดินจริงลงบันทึกการเรียน พร้อมหลักฐานของแต่ละข้อ (เช่นผลของ
nm)
โมดูลถัดไป (Capstone) เราจะรวมทุกอย่างตั้งแต่ DAQ ถึงแอปเป็นแอป Edge AI ของเราเองในไฟล์เดียว
บทเรียนถัดไป: บทเรียน 8.1 — ออกแบบ capstone: Guardian สามเสาในไฟล์เดียว
สะท้อนคิด
หัวข้อที่มีชื่อว่า “สะท้อนคิด”- ถ้า count() เพิ่มแล้วแต่ verdict ไม่เคยเปลี่ยนเลย คุณจะไล่หาสาเหตุจากชั้นไหนก่อน
- ในสินค้าจริง คุณจะเลือกเพิ่มโมเดลตอน build หรือโหลดตอนรัน และเพราะอะไร
คำถามทบทวน
ลองตอบเองก่อน แล้วค่อยเปิดดูเฉลย
-
ROW ที่พิมพ์ออกมามี .dequeue = None จุดใดยังว่าง (เป้าหมายข้อ 1)
- จุดที่ 1 SPEC
- จุดที่ 2 deq_fn ใน make_row()
- จุดที่ 3 count()
- จุดที่ 5 select
ดูเฉลย
คำตอบ: B. จุดที่ 2 deq_fn ใน make_row()
make_row ประกอบชื่อฟังก์ชันทั้งสี่จาก prefix ถ้า deq_fn ยังเป็น None ข้อความ ROW จะคอมไพล์ไม่ผ่าน
-
รันบน Emulator แล้ว scan_registry() ไม่เจอ Fall Detection หมายความว่าอะไร (เป้าหมายข้อ 1)
- โค้ดผิด
- ถูกต้องแล้ว Emulator มีห้าโมเดลที่คอมไพล์มาแล้ว และ build C ในเบราว์เซอร์ไม่ได้
- ต้องรีเฟรชเบราว์เซอร์
- ต้องเพิ่มชื่อใน edge_ai.py
ดูเฉลย
คำตอบ: B. ถูกต้องแล้ว Emulator มีห้าโมเดลที่คอมไพล์มาแล้ว และ build C ในเบราว์เซอร์ไม่ได้
การเพิ่มโมเดลต้องมี toolchain และ flash ลงบอร์ด นี่คือเส้นแบ่งระหว่างงานเฟิร์มแวร์กับงานระดับแอป
-
หลักฐานข้อใดยืนยันว่าเพิ่มโมเดลสำเร็จจริง (เป้าหมายข้อ 2)
- build ผ่านโดยไม่มี error
- count() เพิ่มขึ้น ชื่อใหม่อยู่ใน models() และ select แล้ว verdict สลับตามการขยับจริง
- ไฟล์โมเดลอยู่ในโฟลเดอร์ถูกที่
- ROW พิมพ์ออกมาครบ
ดูเฉลย
คำตอบ: B. count() เพิ่มขึ้น ชื่อใหม่อยู่ใน models() และ select แล้ว verdict สลับตามการขยับจริง
build ผ่านหรือไฟล์อยู่ถูกที่ยังไม่ได้แปลว่าทั้งสี่ฟังก์ชันต่อสายถูก ต้องเห็นทั้งทะเบียนและ verdict บนบอร์ด
-
ทำไม checklist จึงให้ hard power-cycle ก่อนเชื่อผลบนฮาร์ดแวร์ (เป้าหมายข้อ 3)
- เพื่อล้างไฟล์ใน flash
- หลัง flash เซนเซอร์และ NPU บางตัวต้อง init ใหม่จากไฟจริง ไม่งั้นค่าที่อ่านอาจค้างจากรอบก่อน
- เพื่อให้ Wi-Fi ต่อใหม่
- ไม่จำเป็น
ดูเฉลย
คำตอบ: B. หลัง flash เซนเซอร์และ NPU บางตัวต้อง init ใหม่จากไฟจริง ไม่งั้นค่าที่อ่านอาจค้างจากรอบก่อน
หนึ่งการเปลี่ยนต่อหนึ่งการ flash แล้ว power-cycle ก่อนเชื่อ ช่วยให้แน่ใจว่าผลที่เห็นมาจากการเปลี่ยนครั้งนี้จริง
อ้างอิงบทเรียนนี้
ถ้านำบทเรียนนี้ไปสอน ทำสไลด์ หรือทำเอกสารต่อ ให้อ้างอิงด้วยข้อความนี้ ถ้าดัดแปลงเนื้อหา ให้เติม (ดัดแปลง)ต่อท้ายชื่อบทเรียน
"ลงมือทำ: ให้โมเดลใหม่โผล่ใน edge_ai.models()" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0
ข้อความอ้างอิงภาษาอังกฤษ: "Hands-on: make a new model appear in edge_ai.models()" 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/m07-under-the-hood/l04-extend-model-lab/
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0
เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA