บทเรียน 5.3 — ฝึกโมเดลใน Docker: หนึ่งชิ้นงาน สี่เป้าหมาย

ฝึกโมเดลใน TensorFlow (Docker) แล้วทดสอบบน PC

โมดูล 5 — ฝึกโมเดลและนำไปใช้หลายเป้าหมาย

โมดูล 5 · Pillar 4 — Training (train once, run everywhere)

คาถาประจำบทเรียน: "เลิกยืมโมเดลสำเร็จรูป — ชุดบทเรียนนี้เราฝึกโมเดลของเราเอง จากข้อมูลของเราเอง แล้วบีบให้เล็กพอจะลงชิป"

TensorFlow ใน Docker (รันเหมือนกันทุก OS) · ปลายทางคือไฟล์ model_int8.tflite หนึ่งไฟล์

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

เปิดบทเรียนด้วยของจริงก่อน

เหมือนทุกบทเรียน เราเริ่มแบบ กลับด้าน — รันการฝึกที่ทำงานได้จริงก่อน เห็นตัวเลข accuracy ขึ้นจริง แล้วค่อยแกะว่าแต่ละบรรทัดทำอะไร

รันการฝึกก่อน docker run train แกะดูข้างใน 4 จังหวะของการฝึก เติม/แก้เอง 4 ช่องหลัก โมเดลของเรา .tflite หนึ่งไฟล์

เราใช้แนว PRIMM เหมือนเดิม (Predict–Run–Investigate–Modify–Make) แต่รอบนี้ "ของที่ทำงานได้" ไม่ใช่แอปบนจอ — มันคือ สคริปต์ฝึกโมเดล ที่พ่นตัวเลข accuracy กับ confusion matrix ออกมา

ชุดบทเรียนนี้ไม่ต้องเข้าใจ TensorFlow ทุกบรรทัด ขอแค่ได้เห็นโมเดลของคุณเรียนรู้จากข้อมูลจริง แล้วทายท่ามือชุดทดสอบถูก เท่านั้นพอ

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

เป้าหมายของชุดบทเรียนนี้

จบชุดบทเรียนนี้เราจะเดินครบ 4 เรื่อง แล้วปิดท้ายด้วยโมเดลที่ฝึกเองและทดสอบผ่าน:

  1. ทำไมต้องฝึกใน Docker — สภาพแวดล้อมที่ทำซ้ำได้ รันเหมือนกันบน macOS / Windows / Linux
  2. สี่จังหวะของการฝึก — สร้างโมเดล (build) → ฝึก (fit) → บีบ int8 (convert) → ทดสอบบน PC (eval)
  3. ทำไมต้อง int8 และ representative dataset คืออะไร — หัวใจที่ทำให้โมเดลลงชิปได้
  4. อ่านผลเป็น — float32 vs int8 accuracy, confusion matrix, จุดที่โมเดลสับสน
  5. ลงมือ: เติม 4 ช่องใน s12_train.py แล้วรันใน Docker จนได้ model_int8.tflite + รายงานความแม่น

ปลายทางของวันนี้: โมเดลที่ คุณฝึกเอง ทายท่ามือของชุดทดสอบ (ที่โมเดลไม่เคยเห็น) ได้แม่น พร้อมไฟล์ .tflite ที่ชุดบทเรียนถัดไปจะเอาไปลงเบราว์เซอร์และบอร์ด

วันนี้เราเน้น "ฝึกได้ + อ่านผลเป็น + บีบ int8 เป็น" ส่วนการเอาไปรันบนบอร์ดจริง (Vela/NPU) เก็บไว้ บทเรียน 5.8–5.9

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ชุดบทเรียนนี้อยู่ตรงไหนของวงจร

จำวงจรชีวิตข้อมูล 5 ขั้นจากบทเรียน 1.1–1.3 ได้ไหม — วันนี้เรามาถึง ขั้นที่ 4 (Training) แล้ว หลังเก็บข้อมูลเอง (DAQ) และแปลงสัญญาณเป็น (Analysis)

1 · DAQ เก็บข้อมูล (โมดูล 2) 2 · Processing คณิต+ฟิสิกส์ (โมดูล 3) 3 · Analysis DSP+feature (โมดูล 4) 4 · Training เราอยู่นี่ โมดูล 5 5 · Apps อนุมาน+action (โมดูล 6) ตอนเริ่มคอร์ส เราเริ่มจากขั้น 5 (รันของสำเร็จ) วันนี้เราถอยกลับมาสร้างโมเดลเองที่ขั้น 4
  • บทเรียน 5.1–5.2 (ชุดบทเรียนก่อนหน้า) — เราเก็บ dataset ท่ามือบนบอร์ด แล้วแบ่ง train/val/test ได้ gestures.csv
  • บทเรียน 5.3–5.5 (วันนี้) — เอา gestures.csv ไปฝึกโมเดลใน TensorFlow แล้วบีบเป็น model_int8.tflite
  • บทเรียน 5.6–5.9 (ถัดไป) — เอาไฟล์เดิมไปรันบนเบราว์เซอร์ (บทเรียน 5.6–5.7) และบนบอร์ด NPU (บทเรียน 5.8–5.9)

โจทย์ของเราคือท่ามือ 3 คลาส idle / circle / shaking — ตัวเดียวกับโมเดล Motion ที่ติดมากับบอร์ด ตั้งแต่ บทเรียน 1.1–1.3 พอฝึกเองเสร็จ เราจะเทียบโมเดลของเรากับของโรงงานได้เลย

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ย้อนความ — บทเรียน 5.1–5.2 ให้อะไรเรามาบ้าง

ชุดบทเรียนนี้ไม่ได้เริ่มจากศูนย์ ของสำคัญที่ บทเรียน 5.1–5.2 ส่งต่อมาคือ ข้อมูลที่พร้อมฝึก และ เครื่องมือจัดการข้อมูล

บอร์ด BENTO เขย่า/วาดวง/วางนิ่ง data/gestures.csv label,ax,ay,az,gx,gy,gz หนึ่งแถวต่อหนึ่งตัวอย่าง ~50 Hz dataset_tools.py load_csv · make_windows normalize · split
  • dataset_tools.py ทำงานหนักเรื่องข้อมูลให้เราแล้ว: อ่าน CSV → ตัดหน้าต่าง (window) → normalize → แบ่งชุด
  • ในโค้ดชุดบทเรียนนี้ เราจึง import dataset_tools as dt แล้วเรียกใช้ — เหมือนที่ บทเรียน 1.1–1.3 เราได้ edge_ai.models() มาฟรีๆ
  • งานใหม่ของ บทเรียน 5.3–5.5 คือทุกอย่างที่เกิด หลัง ได้ข้อมูล: สร้างโมเดล ฝึก บีบ ทดสอบ

ถ้ายังไม่มี gestures.csv จริง ก็รันได้ — dataset_tools.synthesize() สร้างชุดสังเคราะห์ให้ pipeline เดินได้ก่อน แล้วค่อยเอาข้อมูลจริงมาแทน (ฉบับเต็มทำ fallback นี้ให้อัตโนมัติ)

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ทำไมต้องฝึกใน Docker

การฝึกโมเดลต้องใช้ TensorFlow + ไลบรารีเป็นสิบ แต่ละเครื่องเวอร์ชันไม่ตรงกัน นี่คือฝันร้ายคลาสสิก "บนเครื่องผมรันได้นะ" — Docker แก้ปัญหานี้

ลง TensorFlow เองบนเครื่อง macOS ไม่มี GPU wheel · เวอร์ชันชนกัน โปรแกรม vendor GUI ไม่รันบน mac เพื่อนได้ผลไม่เท่าเรา ตามหา bug ทั้งวัน "บนเครื่องผมรันได้นะ" ฝึกใน Docker อิมเมจเดียว = เวอร์ชันเป๊ะเหมือนกันทุกคน รันเหมือนกันบน macOS / Windows / Linux ไม่รกเครื่อง ลบทิ้งได้ในบรรทัดเดียว "build ครั้งเดียว รันซ้ำได้ตลอด"
  • Dockerfile ของเราเริ่มจาก python:3.11-slim แล้ว pip install tensorflow ai-edge-litert numpy scikit-learn
  • เราเลือก package tensorflow (ไม่ใช่ tensorflow-cpu) เพราะมี wheel สำหรับ linux/arm64 → รันบน Docker ของ Apple Silicon ได้
  • โค้ดของเราถูก bind-mount เข้าไปตอนรัน (-v "$PWD":/work) แก้ไฟล์บนเครื่อง เห็นผลใน container ทันที ไม่ต้อง rebuild

Docker คือ "สภาพแวดล้อมสำเร็จรูปในกล่อง" — เหมือนเฟิร์มแวร์บนบอร์ดที่ทุกคนได้เหมือนกัน แต่คราวนี้เป็นโต๊ะฝึกโมเดลบน PC ที่ทุกคนได้เหมือนกัน

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ภาพรวม pipeline — หนึ่งชิ้นงาน สี่เป้าหมาย

ทั้ง Pillar 4 หมุนรอบไฟล์เดียว: model_int8.tflite เราสร้างมันในชุดบทเรียนนี้ แล้ว บทเรียน 5.6–5.9 เอาไปกระจายสี่ทาง

train.py (Keras ใน Docker) ชุดบทเรียนนี้เราทำจังหวะนี้ model_int8.tflite "train once" — หนึ่งชิ้นงาน MCU + Ethos-U55 quantize_vela.sh · 5.8–5.9 PC / Docker eval_pc.py · ชุดบทเรียนนี้ Web / เบราว์เซอร์ convert_web.py · 5.6–5.7 Cortex-A (Linux) ไฟล์เดิม · eval_pc.py

มีแค่ MCU ที่ต้องคอมไพล์เพิ่ม (Vela) เพราะต้องแปลงให้ NPU อ่านออก · PC / Web / Cortex-A ใช้ไฟล์ .tflite เดียวกันเป๊ะ — นี่คือ "train once, run everywhere" ที่จับต้องได้ วันนี้เราสร้างชิ้นงานนั้นและทดสอบมันบน PC

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ทางเลือก — ฝึกบน Google Colab (ฟรี ไม่ต้องมี Docker)

ถ้าเครื่องยังไม่มี Docker หรืออยากได้ GPU ฟรี ใช้ Colab notebook ที่ให้มาได้เลย — pipeline เดียวกันเป๊ะ (synthesize → Conv1D → int8 → eval → ดาวน์โหลด model_int8.tflite):

Open In Colab

  • ไฟล์: train_edge_ai.ipynb (รันครบทุกเซลล์ = ได้ไฟล์ int8 พร้อม deploy)
  • เปิดได้ 2 ทาง: กดแบดจ์ หรือ Colab → File → Upload notebook แล้วเลือกไฟล์นี้
  • ผลลัพธ์เหมือนรันใน Docker — เอา model_int8.tflite ไปเข้าบทเรียน 5.6–5.7 (Web) / บทเรียน 5.8–5.9 (บอร์ด) ต่อได้ทันที

Docker = reproducible แบบมืออาชีพ · Colab = เริ่มได้ทันทีในเบราว์เซอร์ — เลือกได้ตามสะดวก ผลได้ไฟล์เดียวกัน

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

รันของจริงก่อน (1) — build อิมเมจ

ยังไม่ต้องเข้าใจโค้ด รันให้เห็นก่อน เปิด terminal ในโฟลเดอร์ shared/training/ แล้ว build อิมเมจครั้งเดียว:

cd courses/edge-ai-developer/shared/training   # ในโฟลเดอร์ที่ clone repo นี้มา
docker build -t edgeai-train .
  • คำสั่งนี้อ่าน Dockerfile แล้วประกอบ "กล่องสำเร็จรูป" ที่มี TensorFlow + ai-edge-litert พร้อมใช้
  • ทำครั้งเดียวพอ ครั้งต่อไป Docker ใช้ cache รันได้ทันที (ยกเว้นแก้ Dockerfile เอง)
  • -t edgeai-train = ตั้งชื่อกล่องว่า edgeai-train จะได้เรียกใช้ง่ายๆ

ครั้งแรกจะโหลดนาน (ดึง TensorFlow ~หลายร้อย MB) รอสักครู่ พอขึ้น naming to ... edgeai-train ก็พร้อม ครั้งต่อไปเร็วมาก

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

รันของจริงก่อน (2) — ฝึกโมเดล

ทีนี้สั่งฝึกจริง ใช้ eval เวอร์ชันสำเร็จ (train.py) ก่อน เพื่อดูว่าปลายทางหน้าตาเป็นยังไง:

docker run --rm -v "$PWD":/work edgeai-train \
    python train.py --data data/gestures.csv --out model_int8.tflite

จะเห็น log ไหลออกมาแบบนี้ (ตัวเลขจริงจากรันที่เราทดสอบไว้แล้ว):

train/val/test windows: 101 21 21
Epoch 1/25 ... loss: 1.05 - accuracy: 0.44 - val_accuracy: 0.68
...
Epoch 25/25 ... accuracy: 1.00 - val_accuracy: 1.00
float32 test accuracy: 1.000
wrote model_int8.tflite (11504 bytes)
  • -v "$PWD":/work = เอาโฟลเดอร์ปัจจุบันไปวางที่ /work ใน container โค้ด+ข้อมูล+ผลลัพธ์อยู่ที่เดียวกัน
  • --rm = ลบ container ทิ้งเมื่อจบ ไม่รกเครื่อง
  • ตอนจบได้ไฟล์ model_int8.tflite (~11 KB) โผล่มาในโฟลเดอร์จริงบนเครื่องเรา

สังเกต val_accuracy ไต่ตาม accuracy ขึ้นไปด้วยกัน — นั่นแปลว่าโมเดล "เข้าใจ" ไม่ใช่แค่ "จำข้อสอบ" (ถ้า val ไม่ตาม train แปลว่า overfit)

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

รันของจริงก่อน (3) — ทดสอบบน PC

มีโมเดลแล้ว ทดสอบไฟล์ int8 บน PC ด้วย eval_pc.py — นี่คือ ground truth ก่อนเอาลงบอร์ด:

docker run --rm -v "$PWD":/work edgeai-train \
    python eval_pc.py --model model_int8.tflite --data data/gestures.csv
int8 test accuracy: 1.000

confusion (rows=true, cols=pred): ['idle', 'circle', 'shaking']
  idle     [7 0 0]
  circle   [0 7 0]
  shaking  [0 0 7]
  • int8 test accuracy ควรใกล้ float32 test accuracy — ถ้าตกฮวบ แปลว่า quantization มีปัญหา
  • confusion matrix: แถว = คลาสจริง คอลัมน์ = คลาสที่โมเดลทาย เลขบนแนวทแยง = ทายถูก นอกแนวทแยง = สับสน
  • ตารางนี้สวยเพราะเป็นข้อมูลสังเคราะห์ (แยกคลาสง่าย) — ข้อมูลจริงจากบอร์ดจะเห็นความสับสนบ้าง

เราเพิ่งเห็น "ปลายทาง" แล้ว: โมเดลของเราทายชุดทดสอบถูกหมด ทีนี้ย้อนกลับไปแกะว่า train.py ทำอะไรทีละจังหวะ

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก Edge AI Developer (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0