คาบ 11 — Edge AI Model: เลือก รัน อ่านผล

ให้บอร์ดถามโมเดล AI แล้วอ่านคำตอบกลับมา

คาถาประจำคาบ: AI ตอบได้หลายครั้งต่อวินาที — เรามีหน้าที่ตัดสินว่าครั้งไหนเชื่อได้

ดูของจริงก่อน — เลือกโมเดล กด Run แล้วดูมันตอบ

ตั้งแต่ต้นเทอม เราสั่งให้บอร์ดอ่านเซนเซอร์แล้วค่อยตัดสินใจเองด้วย if
วันนี้ให้บอร์ด ถามโมเดล AI แทน แล้วอ่านคำตอบกลับมา

  1. เปิด examples/s13/00_ai_model_lab.py แล้วกด Run
  2. เลื่อนวงล้อเลือกโมเดล กด Run สีเขียว
  3. เขย่าบอร์ดหรือพูดใส่ไมค์ ดูป้าย "AI says" และแถบความมั่นใจ
  4. กดปุ่มอีกครั้ง มันกลายเป็น Stop สีแดง

จอจริงของ Eva Kit เฟิร์มแวร์ 1.7.8 (2026-10-15)

ทำไม · คืออะไร · ทำยังไง — แผนที่ของคาบนี้

ทำไม โมเดล AI บนบอร์ดตอบเองได้ในไม่กี่ร้อยมิลลิวินาที ไม่ต้องส่งข้อมูลขึ้นคลาวด์ก่อน ข้อมูลเสียงและการสั่นจึงไม่ต้องออกจากบอร์ด

คืออะไร โมดูล edge_ai มีไม่กี่คำสั่ง: ดูรายชื่อโมเดล เลือก รัน หยุด อ่านผล

ทำยังไง ห้าตัวอย่างไล่ทีละขั้น (01 ถึง 05) แล้วปิดด้วย AI Model Lab ที่เอาทุกขั้นมารวมเป็นหน้าจอเดียว

คาบหน้า (คาบ 12) เราเอาผลที่อ่านได้วันนี้ส่งขึ้น MQTT ต่อจากคาบ 10

วันนี้มีสามส่วน ทำตามลำดับ

ส่วน ทำอะไร ได้อะไร
1. เตรียมบอร์ด อัปเดตเฟิร์มแวร์ · เปิด Local Edge AI Store · ต่อบอร์ดดูว่ามีโมเดลอะไร · ส่งโมเดลลงบอร์ด บอร์ดเฟิร์มแวร์ 1.7.8 ที่มีโมเดลจาก Store
2. เขียนโค้ดเรียกโมเดล ตัวอย่าง 01 ถึง 05 แล้วลอง AI Model Lab อ่านผล AI ให้ถูก และรู้ว่าเมื่อไรควรเชื่อ
3. Smart HMI ตัวอย่าง 06 ถึง 09 เอาผล AI ไปขับจอแบบที่ใช้ในโรงงาน อาคารเรียน โรงพยาบาล และบ้าน

ส่วนที่ 1 ทำครั้งเดียวต่อบอร์ด ถ้าบอร์ดของคุณพร้อมแล้ว ข้ามไปส่วนที่ 2 ได้เลย

เป้าหมายของคาบนี้

เมื่อจบคาบ คุณต้องทำสิ่งเหล่านี้ได้เอง

  1. อัปเดตเฟิร์มแวร์ และส่งโมเดลจาก Store ลงบอร์ดเองได้
  2. ดูได้ว่าบอร์ดมีโมเดลอะไร มาจากไหน ใช้เซนเซอร์อะไร
  3. เลือกโมเดล ด้วยชื่อ แล้วรัน/หยุดจากโค้ด
  4. อ่านผลสดให้ถูกวิธี และรู้ว่าเมื่อไรผลคือผลใหม่
  5. กรองผลดิบด้วยความมั่นใจและกฎ "k ใน n" ก่อนจะเตือน
  6. เลือกระหว่างวนอ่านเองกับให้บอร์ดเรียก (callback) ได้ว่าอันไหนเหมาะกับงาน

ส่วนที่ 1 — เตรียมบอร์ด

สิ่งที่ต้องมี

  • Eva Kit กับสาย USB ที่ ส่งข้อมูลได้ (สายชาร์จอย่างเดียวใช้ไม่ได้)
  • เบราว์เซอร์ Chrome หรือ Edge บนคอม
  • บัญชี GitHub ของตัวเอง (ใช้ตอนส่งโมเดลลงบอร์ด)
  • BENTO IDE ที่ https://ide.tesaiot.dev/

ก่อนเริ่ม — บอร์ดของคุณเป็นเฟิร์มแวร์อะไร

ดูที่หน้า Home ของบอร์ด มุมซ้ายบน ต่อจากคำว่า Make Anything.

  • ขึ้น v1.7.8 แล้ว ข้ามสามขั้นถัดไป ไปที่ Store ได้เลย
  • เป็นเลขอื่น ทำสามขั้นถัดไปเพื่ออัปเดต

คาบนี้ทดสอบกับ Eva Kit เฟิร์มแวร์ 1.7.8

อัปเดตเฟิร์มแวร์ ขั้นที่ 1 จาก 3 — กด Welcome

ใน BENTO IDE กดปุ่ม Welcome ที่แถบบนสุด

หน้าต่าง Welcome จะเปิดขึ้น พร้อมรายการบอร์ดให้เลือก

อัปเดตเฟิร์มแวร์ ขั้นที่ 2 จาก 3 — เลือกบอร์ด

คลิกการ์ด PSoC Edge Eval Kit แล้วกด Flash this board →

ดูชื่อบอร์ดใต้การ์ดให้ตรง: Eva Kit คือ KIT_PSE84_EVAL_EPC2

อัปเดตเฟิร์มแวร์ ขั้นที่ 3 จาก 3 — เลือกเฟิร์มแวร์

เลือก BENTO MicroPython — PSoC Edge Eval Kit v1.7.8

  • อย่าเลือก Game Console ตัวนั้นเป็นเฟิร์มแวร์เกม คาบนี้ใช้ MicroPython
  • เปิดแอป TESAIoT Programmer บนคอม แล้ว สลับเป็นโหมด Remote ปุ่มล่างสุดจะขึ้น Waiting for Programmer to pair… จนกว่าแอปจะจับคู่ ถ้ายังไม่มีแอปนี้ หน้าต่างจะพาไปติดตั้งก่อน (ทำครั้งเดียว)
  • รอจนหน้าต่างบอกว่าแฟลชเสร็จ แล้วดูเลขเวอร์ชันที่หน้า Home ของบอร์ดอีกครั้ง

โมเดลมีสองที่มา

ติดมากับบอร์ด (built-in) จาก Edge AI Store
ได้มาอย่างไร อยู่ในเฟิร์มแวร์ รันได้ทันที ต้อง deploy ลงบอร์ดก่อน
ตัวอย่าง Motion, Baby Cry, Cough, Alarm, Siren Detection (Push Detection มีเฉพาะ Dev Kit) AnomalousVibration, HumanActivity, HomeSounds, SurfaceMic ฯลฯ
ช่อง builtin True False
สัญญา ตามเฟิร์มแวร์ CC BY-NC 4.0: ให้เครดิตผู้สร้าง และห้ามใช้เชิงพาณิชย์

สไลด์ถัดไปพาไปเอาโมเดลจาก Store ลงบอร์ดทีละขั้น

ผู้สร้างโมเดล อยากเอาโมเดลที่เทรนเองเข้า Store: ดูภาคเสริมท้ายคาบ (ก่อนหน้าสถานะการทดสอบ) ว่าต้องทำอะไรที่ DEEPCRAFT Studio ได้ไฟล์อะไร และนำเข้าอย่างไร

Local Edge AI Store — ร้านโมเดลของเรา

เปิด https://edgeai-store.tesaiot.dev/ ใน Chrome หรือ Edge

ดูโมเดลได้ทุกคนโดยไม่ต้องล็อกอิน แต่จะ ส่งโมเดลลงบอร์ดได้ต้อง Sign in with GitHub ก่อน (มุมขวาบน)

อยากได้หน้าร้านภาษาไทย เปิด https://edgeai-store.tesaiot.dev/?lang=th ปุ่มจะเปลี่ยนเป็นภาษาไทย เช่น Connect a board = เชื่อมต่อบอร์ด · Deploy = ติดตั้ง · Ready to install = พร้อมติดตั้ง ภาพในสไลด์เป็นหน้าภาษาอังกฤษซึ่งเป็นค่าเริ่มต้น

Store ขั้นที่ 1 — Sign in with GitHub

กด Sign in with GitHub แล้วยืนยันในหน้าของ GitHub

ร้านเห็นแค่ชื่อและรูปสาธารณะของ GitHub แล้วพากลับมาที่หน้าเดิม

ยังไม่ได้ล็อกอินแล้วกด Connect a board จะเจอหน้าต่างนี้เหมือนกัน

Store ขั้นที่ 2 — ต่อบอร์ด

กด Connect a board แล้วเลือกบอร์ดของคุณในรายการของเบราว์เซอร์

  • ก่อนกด ถ้า BENTO IDE ต่อบอร์ดอยู่ ให้กด Disconnect ใน IDE ก่อน สาย USB หนึ่งเส้นใช้ได้ทีละโปรแกรม ถ้าลืม ร้านจะขึ้นว่า Board in use by another program
  • ข้อความยาวบนแถบ (Deploy sends your choice back to the IDE…) ใช้ตอนเปิดร้านจากใน IDE คาบนี้เราต่อบอร์ดกับร้านโดยตรงด้วยปุ่ม Connect a board
  • ต่อบอร์ดของตัวเองแค่ตัวเดียวเข้ากับคอม จะได้ไม่เลือกผิดตัว

Store ขั้นที่ 3 — ดูว่าบอร์ดมีโมเดลอะไรแล้ว

ต่อสำเร็จ แถบนี้บอกจำนวนโมเดลบนบอร์ด และรุ่นบอร์ด

  • KIT_PSE84_EVAL_EPC2 คือ Eva Kit
  • ตัวเลขนับรวมโมเดลที่ติดมากับเฟิร์มแวร์ด้วย ตรงกับ edge_ai.models() ในตัวอย่าง 01
  • ภาพนี้ถ่ายหลัง deploy ไปหนึ่งตัว ก่อน deploy แถบนี้ขึ้น 13

Store ขั้นที่ 3 ต่อ — ป้ายบนการ์ดบอกว่าตัวไหนมีแล้ว

ดูป้ายมุมซ้ายล่างของการ์ดแต่ละใบ

  • Ready to install = ยังไม่มีบนบอร์ด กด Deploy ได้
  • On your board = มีอยู่แล้ว กรอบสีส้มบอกว่าบอร์ดกำลังใช้รุ่นไหน กด Send again จะส่งทับของเดิม
  • Unload from the board = เอาออกจากบอร์ด

ภาพนี้ตัดการ์ดสองใบมาวางคู่กัน (เส้นประคือรอยต่อ) บนหน้าจริงมีการ์ดอื่นอยู่ระหว่างสองใบนี้

Deploy ขั้นที่ 1 จาก 4 — กด Deploy บนการ์ด

เลือกโมเดลที่ป้ายเป็น Ready to install แล้วกด Deploy

ตัวอย่าง 02 ถึง 05 หา AnomalousVibration ก่อน ถ้าบอร์ดไม่มีจึงใช้ Motion Detection ที่ติดมากับบอร์ด

ดูชนิดเซนเซอร์ใต้ชื่อโมเดล: IMU / motion ใช้การเคลื่อนไหวและการสั่น · Audio / mic ใช้เสียง

Deploy ขั้นที่ 2 จาก 4 — ยืนยัน

ตรวจชื่อโมเดล แล้วกด Deploy อีกครั้ง

โมเดลถูกเขียนลงที่เก็บของบอร์ดผ่านสาย USB และ ยังอยู่หลังบอร์ดรีสตาร์ต

Deploy ขั้นที่ 3 จาก 4 — รอให้ครบ 3 ขั้น อย่าถอดสาย

รอจนแถบเต็ม ใช้เวลาราว 10 วินาทีต่อโมเดล

ระหว่างนี้บอร์ดจะรีสตาร์ต และจอขึ้นคำว่า Programming Mode นั่นคือการส่งไฟล์ ไม่ใช่บอร์ดเสีย เสร็จแล้วบอร์ดกลับมาทำงานเอง

Deploy ขั้นที่ 4 จาก 4 — เสร็จแล้ว

ขึ้น Loaded onto the board กด Close

  • โมเดลอยู่บนบอร์ดแล้ว ไปเปิดใช้ที่บอร์ดในสไลด์ถัดไป
  • จะส่งโมเดลตัวต่อไป ทำซ้ำตั้งแต่ขั้นที่ 1

บนบอร์ด — เปิดหน้า Edge AI

เปิดหน้า Edge AI แล้วเลือกโมเดลจากรายการในหน้านั้น

  • ส่งเสร็จ ถ้าบอร์ดอยู่ที่หน้า Home ให้แตะการ์ด Edge AI สีม่วง (การ์ดสีเขียวถัดไปคือ Edge AI Creator เป็นคนละหน้า)
  • ถ้ารายการยังเป็นของเดิม ให้ออกจากหน้า Edge AI แล้วเข้าใหม่

ถ้าเจอปัญหาตอนส่งโมเดลหรือเปิดโมเดล

อาการ สาเหตุ แก้
ร้านขึ้น Board in use by another program BENTO IDE หรือแท็บอื่นถือสาย USB อยู่ กด Disconnect ที่โปรแกรมนั้น แล้วกด Connect a board ใหม่
รายการพอร์ตว่าง สาย USB ส่งข้อมูลไม่ได้ หรือบอร์ดไม่มีไฟ เปลี่ยนสาย ตรวจไฟบนบอร์ด
จอบอร์ดขึ้น Programming Mode กำลังส่งโมเดล ปกติ รอจนเสร็จ อย่าถอดสาย
select not confirmed หรือ Cannot start <model> เปิดหลายโมเดลต่อกันในการเปิดเครื่องครั้งเดียว กดปุ่ม RESET บนบอร์ด แล้วรันใหม่
Environment Sounds เปิดไม่ขึ้น ใช้หน่วยความจำมาก (ราว 71 KB) กด RESET แล้วลองใหม่
หา Push Detection ไม่เจอ มีเฉพาะ Dev Kit ที่มีเรดาร์ ใช้โมเดลอื่นบน Eva Kit

ส่วนที่ 2 — เขียนโค้ดเรียกโมเดล

ห้าตัวอย่าง 01 ถึง 05 ไล่ทีละขั้น แต่ละตัวสอนหนึ่งเรื่อง

แล้วปิดด้วย AI Model Lab ที่รวมทุกขั้นไว้ในจอเดียว

คำสั่งของ edge_ai ที่เราใช้ในคาบนี้

คำสั่ง ทำอะไร ตัวอย่าง
edge_ai.models() รายการโมเดล (dict ต่อโมเดล: name, sensor, labels, builtin) 01
edge_ai.select(i) โหลดโมเดลลำดับ i แล้วเริ่มรันทันที 02
edge_ai.active() ลำดับของโมเดลที่รันอยู่ (ติดลบ = ไม่มี) 02
edge_ai.stop() หยุด คืน True เมื่อแกน AI หยุดจริง 02
edge_ai.result() ผลล่าสุด (dict) หรือ None 03
edge_ai.on_result(fn) ให้บอร์ดเรียก fn(r) เมื่อมีผล 05
edge_ai.thresholds(i) เกณฑ์ความมั่นใจของโมเดล 00

แกะโค้ดจริง — 01 บนบอร์ดมีโมเดลอะไรบ้าง

def main():
    ms = edge_ai.models()
    n_store = sum(1 for m in ms if m.get("builtin") is False)
    print("models:", len(ms), "| from Store:", n_store)
    for m in ms:                     # Console: ชื่อคลาสครบทุกตัว
        print(row_text(m), m.get("labels"))

    ui.screen()
    time.sleep_ms(150)
    ui.Label("Models on this board: %d  (Store %d)" % (len(ms), n_store),
             x=12, y=6, color=COL_TEXT, value=20)
    ui.Label("#  name  source  sensor  classes", x=12, y=36, color=COL_DIM, value=16)
    for i, m in enumerate(ms[:2 * ROWS]):
        col = COL_STORE if m.get("builtin") is False else (COL_BUILTIN if m.get("builtin") else COL_DIM)

edge_ai.models() คืนรายการ ลำดับ (index) คือตำแหน่งในรายการนี้

จำไว้: รายการโมเดลขึ้นกับสิ่งที่บอร์ดแต่ละตัวมีจริงในตอนนั้น บอร์ดของเพื่อนอาจมีโมเดลไม่เหมือนของเรา และถ้า deploy โมเดลเพิ่ม ลำดับก็เปลี่ยนตาม ลำดับจึงไม่ใช่ชื่อถาวร โปรแกรมควรหาโมเดลด้วยชื่อจากรายการของบอร์ดตัวนั้นทุกครั้ง

แกะโค้ดจริง — 02 หาด้วยชื่อ แล้ว select / stop

def find_model(keys):
    # (index, name) ของตัวแรกที่ชื่อตรง ไม่เจอ = None
    ms = edge_ai.models()
    for key in keys:
        for m in ms:
            if m["name"] == key:
                return m["index"], m["name"]
    return None

ชื่อต้องตรงทุกตัวอักษร: SirenDetection (จาก Store) กับ Siren Detection (ติดมากับบอร์ด) เป็นคนละโมเดล

02 ต่อ — select แล้ว stop ให้ครบ

                t0 = time.ticks_ms()
                try:
                    edge_ai.select(idx)          # รอจนแกน AI ยืนยัน
                    running = True
                    w["took"].text("select() took %d ms" % time.ticks_diff(time.ticks_ms(), t0))
                    w["say"].text("Running")
  • select() รอจนแกน AI ยืนยัน อาจช้าได้หลายวินาที จอจะนิ่งช่วงนั้น จึงขึ้นป้าย "กำลังโหลด" ก่อนเรียก
  • start() เปล่า ๆ หลัง stop() จะรันโมเดลลำดับ 0 ไม่ใช่ตัวที่เลือกไว้ ดูชื่อบนจอเสมอ
  • เลือกด้วยเลขที่ไม่มีบนบอร์ด จะต้องรอ 15 วินาทีกว่าจะรู้ว่าไม่สำเร็จ

แกะโค้ดจริง — 03 อ่านผลสด ๆ ให้ถูกวิธี

        while time.ticks_diff(time.ticks_ms(), t0) < RUN_S * 1000:
            r = edge_ai.result()
            if r is None:
                n["None"] += 1                   # ยังไม่มีผลเลย
            elif r["index"] != idx:
                n["other"] += 1                  # ผลของโมเดลอื่น
            elif r["seq"] == last_seq:
                n["same"] += 1                   # ผลเดิม ยังไม่มีผลใหม่
            else:
                n["new"] += 1
                last_seq, lat, fresh = r["seq"], lat + r["latency_ms"], r
            now = time.ticks_ms()

ช่องที่ใช้: label (คลาสที่ชนะ) · conf (0 ถึง 1) · scores · seq · latency_ms · running · index

03 ต่อ — กับดักสามข้อของ result()

  1. หลัง select() ผลแรกอาจเป็น None เพราะโมเดลยังไม่ตอบ ต้องตรวจก่อนใช้
  2. ผลใหม่ดูจาก seq ที่เปลี่ยน อ่านถี่กว่าที่โมเดลตอบก็ได้ผลเดิมซ้ำ อย่านับว่าเป็นผลใหม่
  3. หลัง stop() ยังได้ผลเก่าค้างอยู่ ดูช่อง running

ถ้ามีคนเปลี่ยนโมเดลจากเมนู Edge AI ระหว่างที่โปรแกรมเรารัน ผลที่ได้จะเป็นของตัวอื่น ให้เช็ก r["index"] ทุกครั้ง

อย่าเชื่อผล AI ทีละผล — 04 กรองสองชั้น

def alert_rule(hist, alerting, danger):
    # hist = ผลล่าสุดไม่เกิน WINDOW_N ตัว (1 = อันตราย) · คืน (hist ใหม่, เตือนไหม)
    hist = (hist + [int(danger)])[-WINDOW_N:]
    hits = sum(hist)
    return hist, hits >= CONFIRM_N or (alerting and hits > 0)
  1. conf ต่ำกว่า CONF_MIN ไม่นับ
  2. คลาสอันตรายต้องชนะ CONFIRM_N ครั้งใน WINDOW_N ผลล่าสุดจึงเตือน (ตัวอย่างใช้ 3 ใน 5)
  3. หายเตือนเมื่อ WINDOW_N ผลล่าสุดไม่มีคลาสอันตรายเลย

ทำไมต้องกรอง — AI ตอบผิดได้ แม้มั่นใจสูง

ของจริงจากบอร์ด Eva Kit ในห้องทดลอง (2026-10-15)

  • HumanActivity บอร์ดวางนิ่งบนโต๊ะ แต่ตอบ walking 91% (ภาพขวา)
  • Environment Sounds ห้องเงียบ แต่ตอบ dog

ผลเดียวที่มั่นใจสูงยังเชื่อไม่ได้ เราจึงต้อง

  1. ตัดผลที่ conf ต่ำ
  2. รอให้ชนะ k ครั้งใน n ผลล่าสุด
  3. ลองกับสถานการณ์จริงให้ครบ ทุกคลาส ก่อนบอกว่าใช้ได้

Class scores ของ HumanActivity ขณะบอร์ดวางนิ่ง

ลองเล่น 04 — ดูตัวนับสองตัวห่างกันแค่ไหน

วางบอร์ดนิ่ง แล้วทำตามลำดับ

  1. วางนิ่ง
  2. เขย่าเบา ๆ สั้น ๆ
  3. เขย่าแรงค้างไว้ 3 วินาที

จอมีสองตัวนับ: ป้ายดิบเปลี่ยนกี่ครั้ง กับ เตือนจริงกี่ครั้ง ตัวแรกมากกว่าตัวที่สองเท่าไร นั่นคือสิ่งที่กฎ "k ใน n" ช่วยกันไม่ให้ไปเตือนผิด

ภาพจากคอร์ส Smart Farm (BDH / AIC) ตัวอย่าง sf3_04 ใช้กฎ k ใน n ชุดเดียวกัน

Emulator: ท่าเขย่ามั่นใจได้ไม่ถึง 55% ตั้ง CONF_MIN = 50 ก่อนลอง ไม่งั้นไม่เตือนเลย

แกะโค้ดจริง — 05 ให้บอร์ดเรียกเรา (callback)

def on_result(r):
    # เรียกจากบอร์ด: เก็บแล้วกลับ (ห้ามวาดจอ ห้ามรอ)
    got["n"] += 1
    got["last"] = r
        edge_ai.select(idx)
  • callback ต้องสั้น เก็บผลไว้แล้วกลับทันที งานจอทำในลูปหลัก
  • ก่อน stop() ให้ edge_ai.on_result(None) เลิก callback ก่อน
  • ใน callback ให้อ่านด้วย r.get() เสมอ เพราะบางครั้งมีแค่ top conf label

วัดจริง — callback กับวนอ่าน ได้จำนวนไม่เท่ากัน

AnomalousVibration วางนิ่ง 10 วินาที

บอร์ด callback วนอ่านแล้วนับเมื่อ seq เปลี่ยน
Dev Kit เฟิร์มแวร์ 2.4.4 (3 รอบได้เท่ากัน) 10 ครั้ง (ราววินาทีละครั้ง) 142 ผล (ราว 14 ผลต่อวินาที)
Eva Kit เฟิร์มแวร์ 1.7.8 (2026-10-15) 10 ครั้ง 134 ผล

บอร์ดเรียก callback เมื่อ คลาสที่ชนะเปลี่ยน ถ้าไม่เปลี่ยนก็เรียกไม่เกินวินาทีละครั้ง และไม่เรียกเลยตอนรันหลายโมเดลพร้อมกัน

เลือกใช้: อยากรู้ "ตอนที่ป้ายเปลี่ยน" ใช้ callback · อยากได้ทุกผลละเอียด ใช้วนอ่าน

ผลจริงบนบอร์ด Eva Kit — ตัวอย่าง 01 ถึง 04

01 บอร์ดนี้มี 14 โมเดล (Store 9)

02 select() ใช้ 66 ms · active() = 10

03 อ่านได้ผลใหม่ 219 ครั้ง ไม่มี None

04 ป้ายดิบเปลี่ยน 1 ครั้ง เตือน 0 ครั้ง

AI Model Lab — เอาทุกขั้นมารวมเป็นหน้าจอเดียว

ไฟล์ examples/s13/00_ai_model_lab.py อ่านทุกอย่างจากบอร์ด: รายชื่อโมเดล คลาส เซนเซอร์ และเกณฑ์ (edge_ai.thresholds())

  • วงล้อเลือกโมเดล · ปุ่ม Run/Stop
  • "AI says" ตามคลาสที่แรงที่สุดเทียบกับเกณฑ์ Hearing at / Confirm at
  • Eva Kit: ใช้วงล้อและปุ่มบนจอ
  • Dev Kit: SW5 (ปุ่มล่าง) = โมเดลถัดไป, SW6 (ปุ่มบน) = Run/Stop
  • ไม่มีเสียงออกลำโพงโดยตั้งใจ เพราะเสียงจะเข้าไมค์ทำให้โมเดลไมค์ผิด

จอ AI Model Lab บน Eva Kit 1.7.8 (2026-10-15)

ตัวอย่างหนึ่งไฟล์ต่อหนึ่งโมเดล (1/2)

อยู่ที่ short_courses/smart_farm/s3/models/ ของคอร์ส Smart Farm

ไฟล์ โมเดล ใช้ทำอะไร
motion_detection.py Motion Detection (ในตัว) สวิตช์ท่าทาง: วาดวงกลมกลางอากาศเพื่อเปิด/ปิดไฟ
push_detection.py Push Detection (ในตัว) ปุ่มไร้สัมผัส: ดันฝ่ามือเข้าหาเรดาร์ (ตัวอย่างเรดาร์ของ Infineon ใช้ระยะราว 60 ซม.) ใช้ได้เฉพาะ Dev Kit ที่มีเรดาร์
baby_cry_detection.py Baby Cry Detection (ในตัว) เตือนเมื่อได้ยินเสียงเด็กร้อง
cough_detection.py Cough Detection (ในตัว) นับเสียงไอในโรงเรือน
alarm_detection.py Alarm Detection (ในตัว) ฟังเสียงสัญญาณเตือนภัย ใช้เพื่อการเรียนเท่านั้น ห้ามใช้แทนอุปกรณ์ความปลอดภัยจริง
siren_detection.py Siren Detection (ในตัว) เตือนเมื่อได้ยินเสียงไซเรน
siren_detection_store.py SirenDetection (Store) เทียบกับ Siren Detection (ในตัว) เทียบสองโมเดลแบบ A/B: เปิดเสียงไซเรน กด Swap แล้วเปิดเสียงเดิมอีกครั้ง
anomalous_vibration.py AnomalousVibration (Store) ตรวจสุขภาพปั๊ม: ติดบอร์ดกับพัดลมที่มีตะแกรงครอบ แล้วตั้งเกณฑ์ Alert/Danger ด้วยแถบเลื่อน

ตัวอย่างหนึ่งไฟล์ต่อหนึ่งโมเดล (2/2)

ไฟล์ โมเดล ใช้ทำอะไร
human_activity.py HumanActivity (Store) ไทม์ไลน์กิจกรรม: ติดบอร์ดไว้ที่หน้าอก
surface_mic.py SurfaceMic (Store) สมองหุ่นยนต์ดูดฝุ่น: แยกชนิดพื้นผิวจากเสียงเครื่องดูดฝุ่น
drill_material_mic.py DrillMaterialMic (Store) สว่านอัจฉริยะ: แยกชนิดวัสดุจากเสียงเจาะ ผู้สอนสาธิตเท่านั้น ต้องยึดชิ้นงานให้แน่น และสวมแว่นกับที่ครอบหู
home_sounds.py HomeSounds (Store) กระดานเสียงในบ้าน 3 ชนิด แตะช่องเพื่อปิด/เปิดเสียงเตือนของชนิดนั้น
environment_sounds.py Environment Sounds (Store, ทดลอง) ห้องทดลองความสับสนของโมเดล: แตะช่อง แล้วเปิดเสียงนั้น 10 วินาที
yes_no.py Yes / No (Store, ทดลอง) ยืนยันด้วยเสียง: แตะ Ask แล้วพูด yes หรือ no ภายใน 5 วินาที
voice_commands.py Voice Commands (Store, ทดลอง) บังคับรถเข็นด้วยคำสั่งเสียง

โมเดลที่ติดป้าย (ทดลอง) ผลยังไม่นิ่ง ใช้เพื่อดูความสับสนของโมเดล ไม่ใช่เพื่อใช้งานจริง

ใครคุมแกน AI อยู่ตอนนี้

เมนู Edge AI บนบอร์ดกับโปรแกรมของเราใช้แกน AI ตัวเดียวกัน ถ้ามีคนเปลี่ยนโมเดลจากเมนูระหว่างที่โปรแกรมเรารัน ผลที่ result() คืนจะเป็นของโมเดลอื่นทันที

  • ก่อนเริ่ม ถ้าเมนู Edge AI กำลังรันโมเดลอยู่ ให้กด Stop ที่เมนูก่อน
  • ระหว่างรัน เช็ก r["index"] ว่ายังเป็นโมเดลของเรา
  • เลิกโปรแกรมให้ stop() เสมอ ใส่ไว้ใน finally ตามที่ตัวอย่างทำ

กับดักที่เจอในคาบนี้ — รวมไว้หน้าเดียว

อาการ สาเหตุ แก้
result() เป็น None เพิ่ง select() ยังไม่มีผลแรก ตรวจ None ก่อนใช้
ผลไม่ขยับ อ่านถี่กว่าที่โมเดลตอบ ดู seq
หลัง stop() ยังได้ผล ผลเก่าค้าง ดู running
ได้โมเดลผิดตัว start() เปล่า ๆ รันลำดับ 0 ใช้ select(idx)
โมเดลหาไม่เจอ ชื่อไม่ตรงทุกตัวอักษร เทียบชื่อจาก models()
ลำดับเลื่อน deploy โมเดลเพิ่ม หาด้วยชื่อทุกครั้ง
รอนาน 15 วินาที select() ด้วยเลขที่ไม่มี ตรวจเลขก่อน
select not confirmed / Cannot start เปิดหลายโมเดลต่อกันในการเปิดเครื่องครั้งเดียว กด RESET แล้วรันใหม่

ส่วนที่ 3 — Smart HMI

เอาผล AI ไปขับจอแบบที่ใช้จริง ไม่ใช่แค่พิมพ์ป้าย

ตัวอย่าง 06 โรงงาน · 07 อาคารเรียน · 08 โรงพยาบาล · 09 บ้าน

Smart HMI สี่ชุด — เลือกชุดที่ทีมสนใจ

ไฟล์ จอ โมเดล (หาตามลำดับ ตัวแรกที่มีบนบอร์ด) ลองเล่น
examples/s13/06_hmi_machine.py โรงงาน ปั๊มหล่อเย็น P-101 AnomalousVibration (Store) ไม่มีใช้ Motion Detection วางนิ่ง → เขย่าแรงค้าง 3 วินาที → วางนิ่ง → กด "สร้างใบสั่งซ่อม" → กด "ซ่อมเสร็จ ปิดงาน"
examples/s13/07_hmi_safety.py อาคารเรียน แผงแจ้งเหตุ 3 ชั้น (ไมค์ของบอร์ด = ห้องคอม 202) Alarm Detection → Siren Detection → SirenDetection เปิดเสียงสัญญาณเตือนจากมือถือใกล้บอร์ด 3-5 วินาที → กดรีเซ็ตขณะเสียงยังดัง → รับทราบ → ปิดเสียง → รีเซ็ต
examples/s13/08_hmi_nursery.py โรงพยาบาล ห้องเด็กอ่อน เตียง 4 Baby Cry Detection → HomeSounds → Environment Sounds เปิดเสียงเด็กร้องจากมือถือ 5 วินาที แล้วปิด ดูว่าเวลารอยังเดินจนกดรับทราบ
examples/s13/09_hmi_voice.py บ้าน สั่งไฟด้วยเสียง 3 ห้อง Voice Commands (Store) พูด right → up → up → stop → go ชัด ๆ ใกล้บอร์ด ทีละคำ เว้นช่วงสั้น ๆ
  • ทุกชุดใช้กฎ conf + "k ใน n" (3 ใน 5) ของตัวอย่าง 04 ก่อนเชื่อผล และไม่มีเสียงออกจากบอร์ดโดยตั้งใจ
  • 06 ต้อง deploy AnomalousVibration ก่อน (ไม่มีจะใช้ Motion Detection) · 09 ต้อง deploy Voice Commands · 07 กับ 08 ใช้โมเดลที่ติดมากับบอร์ด
  • ในไฟล์มีตัวแปร DEMO ให้คงเป็น False ไว้

ตัวอย่างเพื่อการเรียน ไม่ใช่อุปกรณ์ความปลอดภัยหรืออุปกรณ์การแพทย์

จอจริงบน Eva Kit 1.7.8 — Smart HMI สี่ชุด

06 โรงงาน · AI: AnomalousVibration

07 อาคารเรียน · AI: Alarm Detection

08 โรงพยาบาล · AI: Baby Cry Detection

09 บ้าน · AI: Voice Commands
รันด้วยปุ่ม Program to Device ของ BENTO IDE (2026-10-16) ตอนถ่ายยังไม่ได้ทำให้เกิดเหตุ และยังไม่ได้พูดคำสั่ง

สถานะสามขั้น แบบแผงควบคุมจริง

normal
ปกติ
→ AI ยืนยันเหตุ → alert
เตือน ยังไม่มีใครรับ
→ คนกดรับเรื่อง → ack
รับทราบแล้ว
→ เหตุหายแล้ว → normal
  • เหตุหายเองก็ยังเตือนค้าง จนกว่ามีคนรับเรื่อง จอจริงต้องเป็นแบบนี้ ไม่งั้นเหตุสั้น ๆ จะหายไปโดยไม่มีใครรู้
  • 06 กับ 07 กลับ normal ได้ด้วยปุ่มเท่านั้น (ซ่อมเสร็จ ปิดงาน / รีเซ็ต) และกดได้เมื่อเหตุหายแล้วเท่านั้น
  • 08 กลับ normal เองเมื่อเด็กหยุดร้องหลังมีคนรับทราบแล้ว (MANUAL_RESET = False)
  • 09 ไม่ใช่เหตุ แต่เป็นคำสั่ง: left / right เลือกห้อง · up / down ปรับความสว่าง · go เปิด · stop ปิด คำเดียวกันต้องชนะ 3 ใน 5 ก่อนทำ และพูดค้างนับครั้งเดียว

แกะโค้ดจริง — สถานะถัดไป และ snapshot()

def step(state, alerting, act, manual):
    # สถานะถัดไป · act = แตะปุ่มหลัก · manual = ต้องกดรีเซ็ตเอง · คืน (สถานะใหม่, ถูกปฏิเสธไหม)
    if state == "normal":
        return ("alert" if alerting else "normal"), False
    if state == "alert":                         # เหตุหายเองก็ยังเตือน จนกว่ามีคนรับทราบ
        return ("ack" if act else "alert"), False
    if not alerting and (act or not manual):     # state == "ack"
        return "normal", False
    return "ack", act and alerting               # ยังพบเหตุอยู่ = รีเซ็ตไม่ได้


def snapshot():
    # ผล AI ทั้งหมดใน dict เดียว json.dumps ได้ทันที - คาบ 12 ส่ง dict นี้ขึ้น MQTT
    return {"id": TEAM, "kit": KIT, "model": S["model"], "label": S["label"], "conf": S["conf"],
            "state": S["state"], "events": S["events"], "n": S["n"]}

step() กับ snapshot() เหมือนกันใน 06 07 08 ต่างกันแค่ค่าตั้งต้นและหน้าจอ · 09 ใช้ snapshot() แบบเดียวกัน แต่ state เป็น on/off ของไฟ · คาบหน้าเราส่ง snapshot() ขึ้น MQTT

ทั้งสี่ชุดต่อยอดจากแม่แบบใน BENTO HMI Studio

แต่ละไฟล์เริ่มจากแม่แบบหน้าจอใน BENTO HMI Studio แล้วตัดค่าจำลองออก ใช้ผล AI จริงแทน

ไฟล์ แม่แบบต้นทาง
06 ซ่อมบำรุงเชิงพยากรณ์ (hmi-industry-predictive)
07 แผงแจ้งเหตุเพลิงไหม้ (hmi-security-fire-panel)
08 เรียกพยาบาล (hmi-healthcare-nurse-call)
09 บ้านอัจฉริยะ (hmi-living-home)

อยากออกแบบหน้าจอเอง เปิด BENTO HMI Studio จากแถบบนของ IDE แล้วดูแม่แบบที่ใกล้งานของทีม แม่แบบในภาพระบุว่ารองรับ Eva Kit Game Console และ TESAIoT Dev Kit ส่วนไฟล์ 06 ถึง 09 เราปรับให้รันบน Eva Kit 1.7.8 แล้ว

งานในคาบ — แผน 3 ช่วง

ช่วงที่ 1 (ทำตาม) เตรียมบอร์ดตามส่วนที่ 1 แล้วรันตัวอย่าง 01 ถึง 03 บนบอร์ด จดว่าบอร์ดคุณมีโมเดลอะไร ลำดับเท่าไร

ช่วงที่ 2 (ปรับ) เลือก 1 โมเดลที่คุณสนใจ รัน 04 กับโมเดลนั้น ปรับ CONF_MIN CONFIRM_N WINDOW_N ให้เตือนตอนที่ควรเตือน และเงียบตอนที่ควรเงียบ

ช่วงที่ 3 (ตาราง Model Tour) ลอง AI Model Lab กับอย่างน้อย 3 โมเดล จดในใบงาน: ชื่อโมเดล เซนเซอร์ คลาส ที่ลองแล้วได้ผลอย่างไร และโมเดลไหนที่ผลสับสน

ต่อยอด (ถ้ามีเวลา) เลือก Smart HMI หนึ่งชุด (06 ถึง 09) แล้วลองตามแถว "ลองเล่น"

ใช้ Emulator ได้ในช่วงที่ 1 และ 2 (มีเฉพาะโมเดลในตัว ผลเป็นผลจำลอง)

ภาคเสริมสำหรับผู้สร้างโมเดล — ไฟล์เดินทางอย่างไร

ถ้าคุณจะเอาโมเดลที่ เทรนเอง ไปรันบนบอร์ด ไฟล์ต้องผ่านสามที่ แต่ละที่ทำอะไร ได้ไฟล์อะไร อยู่ในหน้าถัดไป

จำสั้น ๆ ส่ง 5 ไฟล์จากโปรเจกต์เดียวกัน เข้า Local Edge AI Store แล้วร้านแปลงเป็นโมเดลของบอร์ดให้เอง ไม่ต้องแปลงเป็น .tflite ก่อน

ขั้นที่ 1 — ที่ DEEPCRAFT Studio: เทรน แล้ว Generate Code

  1. เทรนโมเดลให้เสร็จ (โมเดลไมโครโฟน: เก็บเสียงที่ 16 kHz เท่านั้น เพราะไมค์บนบอร์ดทำงานที่ 16 kHz)
  2. เปิดไฟล์โมเดล *.h5 ในโปรเจกต์ แล้วคลิกแท็บ Code Gen ทางซ้าย
  3. Architecture = Infineon PSOC · Target Device = PSOC Edge M55/U55
  4. ติ๊ก Enable Network Quantization และเลือก Use Project file (.improj) ให้ Studio ใช้ข้อมูลของโปรเจกต์เป็นตัวสอบเทียบ (โปรเจกต์ตัวอย่างที่เราทดสอบมี calibrationData.npz อยู่ในโฟลเดอร์ Infineon)
  5. กด Update Dependencies (ครั้งแรกครั้งเดียว) แล้วกด Generate Code ได้ model.c กับ model.h ในโฟลเดอร์ Output Directory (ค่าเริ่มต้นชื่อ Infineon)

ระวัง ใช้เฉพาะเลเยอร์มาตรฐาน (Conv1D, Conv2D, Dense, BatchNormalization, Activation, Dropout, Flatten, Reshape, Pooling) ห้ามมี Lambda ร้านจะปฏิเสธ · ไม่เกิน 8 คลาส

ที่มา: เอกสาร DEEPCRAFT Studio หัวข้อ Code Generation for Infineon PSOC boards

ขั้นที่ 2 — ได้ไฟล์อะไรมา และอยู่ตรงไหน

วงสีแดง = ต้องส่ง · วงสีเขียว = ไม่บังคับแต่ควรส่ง

ทั้ง 5 ไฟล์ร้านเอาไปทำอะไร

ไฟล์ ร้านอ่านค่าอะไร ถ้าขาด
.improj sample rate · stride · ชื่อคลาส ส่งไม่ได้ (ต้องมี)
.h5 เครือข่ายที่เทรนแล้ว ร้านแปลงเป็น int8 และคอมไพล์ให้ NPU ส่งไม่ได้ (ต้องมี)
model.h รหัสประจำโมเดล (GUID) ส่งไม่ได้ (ต้องมี)
model.c โมเดลไมโครโฟน: ความยาว FFT · hop · window · stride ของฟีเจอร์เสียง (โปรเจกต์แบบ Speech Features มีค่าเหล่านี้ใน model.c ที่เดียว) ถ้า .improj ระบุขั้นตอนไว้ครบ (แบบหน่วยแยก) ร้านอ่านค่าจาก .improj ให้ แต่จะไม่ได้ตรวจเทียบกับโค้ด ถ้าโปรเจกต์ใช้บล็อก Speech Features ต้องมี model.c ไม่งั้นถูกปฏิเสธ MODELC_REQUIRED
calibrationData.npz ข้อมูลจริงที่ใช้หาสเกล int8 ผ่านได้ แต่ร้านใช้ข้อมูลสังเคราะห์ ความแม่นยำยังไม่ยืนยัน

กฎข้อเดียวที่ต้องจำ ทั้ง 5 ไฟล์ต้องมาจาก โปรเจกต์เดียวกัน และการ Generate Code ครั้งเดียวกัน ถ้าเอา model.c ของรอบหนึ่งมาคู่กับ .improj ของอีกรอบ ร้านจะเทียบค่ากันแล้วปฏิเสธ (MODELC_IMPROJ_MISMATCH)

ขั้นที่ 3 — นำเข้า Local Edge AI Store ทีละขั้น

  1. เปิด https://edgeai-store.tesaiot.dev/ แล้ว Sign in with GitHub (ไม่ต้องสมัครใหม่ ใช้บัญชี GitHub ของคุณ)
  2. กดปุ่ม My models ที่มุมหัวเว็บ (ผู้ดูแลจะเห็นคำว่า Admin) แล้วกด Add a model
  3. ขั้น Model file: ลากไฟล์ .h5 ใส่ แล้วเลือกไฟล์ที่เหลือในกรอบ "The rest of the DEEPCRAFT project" (.improj · model.h · model.c · calibrationData.npz) → กด Convert and continue (ราว 10 วินาที)
  4. ขั้น Project values: ตรวจค่าที่ร้านอ่านมาให้ (sample rate · stride · ชื่อคลาส) ตั้ง model id ชื่อ และสัญญา
  5. ขั้น Review → Save to catalogue

โมเดลของคุณเห็นเฉพาะคุณ (หน้า My models) จนกว่าผู้ดูแลอนุมัติ · แปลงได้วันละ 10 ครั้งต่อคน · มี .tflite อยู่แล้วก็ลากเข้าได้ แต่ต้องกรอกค่าหลายช่องเอง ทาง .h5 ง่ายกว่า

ถูกปฏิเสธ? ดูรหัสแล้วแก้ตามนี้

ร้านบอกรหัสกับเหตุผลเป็นภาษาคนอ่านได้ในหน้าจอ ตารางนี้คือรหัสที่เจอบ่อย

รหัส แปลว่า แก้
MODELC_REQUIRED โปรเจกต์แบบ Speech Features (หรือ stride อ่านจาก .improj ไม่ได้) แต่ไม่ได้ส่ง model.c ส่ง model.c จากโฟลเดอร์ Infineon
MODELC_IMPROJ_MISMATCH model.c กับ .improj คนละการ export ใช้ไฟล์จากโปรเจกต์เดียวกัน รอบเดียวกัน
MODELC_CHAIN model.c มีขั้นตอนเตรียมเสียงที่บอร์ดไม่รองรับ ใช้ mel มาตรฐานใน Studio (Hann/Hamming → mel → log → clip)
MIC_RATE_MISMATCH เทรนที่ความถี่ไม่ใช่ 16 kHz เก็บ/แปลงเสียงเป็น 16 kHz แล้วเทรนใหม่
H5_UNSAFE_LAYER มีเลเยอร์ Lambda (พกโค้ด Python) ใช้เลเยอร์มาตรฐานแทน
CLASSES_OVER_CAP เกิน 8 คลาส รวมหรือตัดคลาส แล้วเทรนใหม่
OVER_STAGE_CAP โมเดลใหญ่เกิน 48 KB หลังแพ็ก ลด filter/เลเยอร์ หรือใช้ window สั้นลง
PARTIAL_NPU_OFFLOAD รันบน NPU ได้ไม่ครบทั้งโมเดล ใช้เลเยอร์ที่ NPU รองรับ

ก่อนกดส่ง — เช็กลิสต์ และข้อจำกัดที่พูดตรง ๆ

เช็กลิสต์ 5 ไฟล์มาจากโปรเจกต์เดียวกัน/Generate Code รอบเดียวกัน · โมเดลเสียงแบบ Speech Features มี model.c (แบบอื่นส่งด้วยจะได้ตรวจเทียบ) · เสียง 16 kHz · ไม่เกิน 8 คลาส · ไม่มี Lambda

"แปลงผ่าน" ไม่เท่ากับ "แม่นบนบอร์ด"

  • โมเดลตัวอย่าง HelpClassification แปลงผ่านบนร้านจริงเมื่อ 2026-10-02 (ได้ 8,880 ไบต์ รันบน NPU 100%) แต่ชุดทดสอบอ้างอิง (golden) ครอบคลุมเสียงคลาส unlabeled คลาสเดียว ส่วน Blackground และ Help ยังไม่มีหลักฐาน
  • ถ้าไม่ส่ง calibrationData.npz ร้านใช้ข้อมูลสังเคราะห์สอบเทียบ ความแม่นยำบนบอร์ดยังไม่ยืนยัน
  • ขั้นเตรียมเสียงบนบอร์ด (mel) เราอ่านโค้ดเทียบแล้ว แต่ยังไม่ได้รันเทียบตัวเลขบนบอร์ดจริง
  • ถ้าไม่ส่ง model.c ร้านตรวจไม่ได้ว่าโปรเจกต์กับโค้ดที่สร้างมาจากการ Generate Code คนละรอบหรือไม่

ทำเอง ลองโมเดลบนบอร์ดกับเสียงหรือการสั่นจริง ให้ครบ ทุกคลาส ก่อนบอกว่าใช้ได้ แล้วจดผลส่งผู้สอน

สถานะการทดสอบ — พูดตรง ๆ ว่าอะไรผ่านแล้ว

  • Eva Kit เฟิร์มแวร์ 1.7.8: ผ่าน (2026-10-15) ตัวอย่าง 00 ถึง 05
  • Dev Kit เฟิร์มแวร์ 2.4.3 ถึง 2.4.4: ตัวอย่าง 00 ถึง 05 ผ่าน 3 ใน 3 รอบทางปุ่ม Run ของ BENTO IDE · Smart HMI 06 ถึง 09 ยังไม่ได้ทดสอบบน Dev Kit
  • Smart HMI 06 ถึง 09 Eva Kit เฟิร์มแวร์ 1.7.8 (2026-10-16): เปิดจอ หาโมเดลเจอ อ่านผลสดได้ ยังไม่ได้ลองให้เกิดเหตุจริง
  • Emulator: ตรวจบนคอมด้วยโมดูลของ Emulator มีเฉพาะโมเดลในตัว ผลเป็นผลจำลอง

ถ้าคุณเจออะไรที่ไม่ตรงกับสไลด์ จดไว้แล้วบอกผู้สอน นั่นคือข้อมูลที่เราต้องการ

สรุปคาบ 11

  • เตรียมบอร์ด: อัปเดตเฟิร์มแวร์ด้วย Welcome → เลือกบอร์ด → เลือกเฟิร์มแวร์ แล้วส่งโมเดลจาก Store ด้วย Connect a board → Deploy
  • models() ดูรายชื่อ · select() เลือก · stop() หยุด · result() อ่าน · on_result() ให้บอร์ดเรียก
  • หาโมเดลด้วย ชื่อ ไม่ใช่ลำดับ
  • ผลใหม่ดูจาก seq
  • อย่าเชื่อผลทีละผล: กรองด้วยความมั่นใจและ k ใน n
  • Smart HMI: สถานะ normal → alert → ack และเหตุหายเองก็ยังเตือนจนมีคนรับเรื่อง · 09 ใช้คำสั่งเสียงคุมไฟ
  • ผู้สร้างโมเดล: ส่ง 5 ไฟล์จากโปรเจกต์เดียวกันเข้า Store (.improj · .h5 · model.h · model.c · calibrationData.npz) ร้านแปลงให้เอง

คาบหน้า เอาผลที่อ่านได้วันนี้ส่งขึ้น MQTT พร้อมออกแบบว่า "ส่งเมื่อไร" รับคำสั่งกลับมาเลือกโมเดลได้ และดูผลของทั้งห้องบนแดชบอร์ดเว็บ

ไฟล์ของคาบนี้บน GitHub

กดชื่อไฟล์เพื่อเปิดอ่านหรือคัดลอก

fit-css

VIDEO-SLOT: คลิป 60-90 วินาที ถ่ายหน้าจอ AI Model Lab บน Dev Kit: วงล้อเลือกโมเดล กด Run เขย่าบอร์ด ดูป้ายผลเปลี่ยน กด Stop

☰ สารบัญ