|
SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (ModusToolbox)
|
ตัวอย่าง MicroPython ใช้ได้บน mtb-mpy เท่านั้น ส่วนการยุบรวมผลฝั่ง C และสิ่งที่สังเกตได้บนหน้าจอใช้ได้ทั้งสอง variant โค้ดฝั่ง C ในบทนี้เขียนขึ้นจาก API สาธารณะใน ai_engine.h ตัวอย่างที่สมบูรณ์อยู่ที่ template/proj_cm55/examples/edge_ai/03_parallel_set_run.c และ 04_set_membership.c
สั่งให้หลายโมเดลทำงานพร้อมกันในฐานะ set อ่านผลตัดสินจาก set โดยไม่ทำให้การตรวจจับหายไป และรู้จักช่วงตั้งตัว (settle) ที่ผลตัดสินถูกกันไว้ไม่กี่วินาทีหลังจาก set เริ่มทำงาน ประโยคที่สำคัญที่สุดเพียงประโยคเดียว: ai_engine_snapshot() ใช้ไม่ได้ภายใน set
ค่าคงที่ของ set (ai_engine.h): MIC = 255, ROOM = 254, INTRUDER = 253, ALL = 252 และ AI_PARALLEL_FIRST = ALL ส่วนชื่อเรียกเดิม 13/14/15 แปลงเป็น 253/254/255 (บท E1) เครื่องยนต์จะยอมรับดัชนีของ set ก็ต่อเมื่ออิมเมจนั้น build พร้อมโมเดลไมโครโฟนอย่างน้อยหนึ่งตัว มิฉะนั้น ai_engine_start() คืนค่า false
สมาชิกของ set ai_engine_set_models() คืนรายชื่อสมาชิกที่มีผลอยู่: หากเคยกำหนดสมาชิกภาพแบบชัดแจ้งด้วย ai_engine_set_define() รายการนั้นจะใช้แทนรายการที่คอมไพล์มา มิฉะนั้นจึงใช้รายการที่คอมไพล์มา โมเดลที่ init() ล้มเหลวไปครั้งหนึ่งไม่ถูกตัดออกจาก set ตลอดรอบการบูต การ start set ครั้งถัดไปจะลองโมเดลนั้นอีกครั้ง
สมาชิกภาพที่กำหนดเอง — edge_ai.set_define(set, [i, j, ...]) แปลงดัชนีเดิมก่อน แล้วส่ง SET_BEGIN, SET_ADD หนึ่งครั้งต่อหนึ่งสมาชิก และ SET_COMMIT จากนั้นอ่านกลับด้วย Q_SET — การอ่านกลับนี้เป็นสิ่งเดียวที่จับได้ว่ามี ADD ตัวใดหล่นหาย ฝั่ง CM55 นำคำนิยามไปใช้ทั้งชุดตอน SET_COMMIT ฝั่ง C ทำสิ่งเดียวกันด้วยการเรียก 2 ครั้ง โดยการอ่านกลับเป็นการตอบรับเพียงอย่างเดียวที่มี:
การยุบรวมผลภายใน set — เลือกสมาชิกที่เป็นผลบวกซึ่งมีค่าความเชื่อมั่นสูงสุด ผ่าน ai_engine_set_members() + ai_engine_snapshot_model() + ai_result_top_positive():
ผ่านการเชื่อมโมเดล คะแนนแต่ละคลาสถูกรายงานเป็นช่วง 0..100 (score_pct ในคำตอบของ Q_RESULT) ส่วน class_count == 0 หมายความว่า "ยังไม่มีผลตัดสิน" และ edge_ai.result() คืนค่า None
ผลข้างเคียงเรื่องอัตราเซนเซอร์ การ start set ที่มีสมาชิกเป็นโมเดล IMU อย่างน้อยหนึ่งตัวจะยกอัตราของ accelerometer ขึ้นเป็น 50 Hz ตลอดช่วงการทำงานนั้น ส่วน ai_engine_model() คืนค่า NULL สำหรับดัชนีเทียมของ set ดังนั้นให้แยกกิ่งด้วย idx >= AI_PARALLEL_FIRST ก่อนเป็นอันดับแรก:
บนหน้าจอ ให้เปิดดรอปดาวน์เลือกโมเดลบนหน้า Edge AI แถวของ set จะถูกเพิ่มเข้ามาก็ต่อเมื่อ set นั้นมีสมาชิกอย่างน้อย 2 ตัว และ ai_engine_set_name() คืนชื่อที่ไม่ใช่ NULL
สิ่งที่ควรสังเกต แถวของ set (Sound Watch, Room Presence, Intruder Watch, All Models) ปรากฏต่อจากโมเดลเดี่ยวที่คอมไพล์มา ส่วน set ที่มีสมาชิกน้อยกว่า 2 ตัวในอิมเมจนี้จะไม่ปรากฏเลย ซึ่งเป็นข้อเท็จจริงเรื่องเนื้อหาของ build ไม่ใช่ความผิดพลาด
สิ่งที่ควรสังเกต ในช่วงไม่กี่วินาทีแรก result() คืนค่า None — เพราะ class_count == 0 — ระหว่างที่ข้อมูลนำเข้าของ set กำลังตั้งตัว บนหน้าจอ ป้ายผลตัดสินจะอ่านว่า filling windows lu%% โดยตัวเลขร้อยละไต่ขึ้น และ badge แสดง Loading ฝั่ง C ใช้ ai_engine_mic_settling() / ai_engine_mic_settle_pct():
ให้แสดงข้อมูลวินิจฉัยต่อไป ระหว่าง ช่วงตั้งตัวด้วย บรรทัดสถิติของหน้า Edge AI อัปเดตต่อไปในช่วงนี้ เพื่อให้การที่ NPU ค้างในช่วงตั้งตัวยังมองเห็นได้ ส่วน mic_settle_pct() มีความหมายเฉพาะเมื่ออยู่ภายใน set เท่านั้น กรณีอื่นมันคืนค่า 100
สิ่งที่ควรสังเกต เมื่อตั้งตัวเสร็จแล้ว จะได้ผลลัพธ์ที่ฟิลด์ต่าง ๆ มาจากสมาชิกที่เป็นผลบวกซึ่งมีค่าความเชื่อมั่นสูงสุด แต่ละแถวของสมาชิกบนหน้าจอมีตัวจับเวลาความเงียบของตัวเอง ซึ่งนับจากเวลาที่ seq ของสมาชิกนั้นไม่เปลี่ยน:
ai_engine_snapshot_model() ที่คืนค่า false หมายความว่า "ไม่เคยเผยแพร่ผลเลย" ซึ่งไม่เหมือนกับ "เงียบ" และดัชนีที่ส่งเข้าไปต้องเป็นดัชนีจริงใน registry ห้ามเป็นดัชนีเทียมของ set เด็ดขาด
สิ่งที่ควรสังเกต set_define คืนค่าหลังจากที่การอ่านกลับด้วย Q_SET ยืนยันสมาชิกครบทุกตัวแล้ว ADD ที่หล่นหายจะปรากฏเป็นรายการที่สั้นลง และคำนิยามทั้งชุดจะถูกปฏิเสธหากมีดัชนีใดไม่ถูกต้อง (ได้หมดหรือไม่ได้เลย) สมาชิกภาพรับได้ 1..8 รายการ และ set_define(252, ...) ล้มเหลวเสมอ เพราะ AI_PARALLEL_ALL คือโมเดลทุกตัวที่ลงทะเบียนไว้โดยนิยาม จึงกำหนดใหม่ไม่ได้ กำหนดได้เฉพาะ INTRUDER, ROOM และ MIC
สิ่งที่ควรสังเกต ไม่มีอะไรให้เห็น เพราะนี่คือวินัยที่กันไม่ให้ป้ายเลย์เอาต์กับจำนวนแถวไม่ตรงกัน ในตอนที่การเชื่อมโมเดลสั่ง start หรือ stop เครื่องยนต์จาก task อื่นกลางรอบเรนเดอร์
| mtb-mpy | mtb-only | |
|---|---|---|
| เลือก set | edge_ai.select(252..255) | แถวในดรอปดาวน์ แล้วกด Load |
| กำหนดสมาชิกภาพ | edge_ai.set_define() | ทำได้จากโค้ด CM55 ที่เขียนเองเท่านั้น โดยเรียก ai_engine_set_define() จาก task แล้วอ่านกลับด้วย ai_engine_set_members_defined() |
| สิ่งที่สังเกตได้ระหว่างตั้งตัว | result() เป็น None; หน้าจอแสดง filling windows lu%% | หน้าจอแสดง filling windows lu%% |
| ผลตัดสิน | dict จาก edge_ai.result() | ป้ายผลตัดสิน บวกตัวจับเวลาความเงียบรายแถว |