จบชุดบทเรียนนี้เราจะเดินครบ 4 เรื่อง แล้วปิดท้ายด้วยโมเดลที่ฝึกเองและทดสอบผ่าน:
s12_train.py แล้วรันใน Docker จนได้ model_int8.tflite + รายงานความแม่นปลายทางของวันนี้: โมเดลที่ คุณฝึกเอง ทายท่ามือของชุดทดสอบ (ที่โมเดลไม่เคยเห็น) ได้แม่น พร้อมไฟล์ .tflite ที่ชุดบทเรียนถัดไปจะเอาไปลงเบราว์เซอร์และบอร์ด
วันนี้เราเน้น "ฝึกได้ + อ่านผลเป็น + บีบ int8 เป็น" ส่วนการเอาไปรันบนบอร์ดจริง (Vela/NPU) เก็บไว้ บทเรียน 5.8–5.9
จำวงจรชีวิตข้อมูล 5 ขั้นจากบทเรียน 1.1–1.3 ได้ไหม — วันนี้เรามาถึง ขั้นที่ 4 (Training) แล้ว หลังเก็บข้อมูลเอง (DAQ) และแปลงสัญญาณเป็น (Analysis)
gestures.csvgestures.csv ไปฝึกโมเดลใน TensorFlow แล้วบีบเป็น model_int8.tfliteโจทย์ของเราคือท่ามือ 3 คลาส
idle / circle / shaking— ตัวเดียวกับโมเดล Motion ที่ติดมากับบอร์ด ตั้งแต่ บทเรียน 1.1–1.3 พอฝึกเองเสร็จ เราจะเทียบโมเดลของเรากับของโรงงานได้เลย
ชุดบทเรียนนี้ไม่ได้เริ่มจากศูนย์ ของสำคัญที่ บทเรียน 5.1–5.2 ส่งต่อมาคือ ข้อมูลที่พร้อมฝึก และ เครื่องมือจัดการข้อมูล
dataset_tools.py ทำงานหนักเรื่องข้อมูลให้เราแล้ว: อ่าน CSV → ตัดหน้าต่าง (window) → normalize → แบ่งชุดimport dataset_tools as dt แล้วเรียกใช้ — เหมือนที่ บทเรียน 1.1–1.3 เราได้ edge_ai.models() มาฟรีๆถ้ายังไม่มี
gestures.csvจริง ก็รันได้ —dataset_tools.synthesize()สร้างชุดสังเคราะห์ให้ pipeline เดินได้ก่อน แล้วค่อยเอาข้อมูลจริงมาแทน (ฉบับเต็มทำ fallback นี้ให้อัตโนมัติ)
การฝึกโมเดลต้องใช้ TensorFlow + ไลบรารีเป็นสิบ แต่ละเครื่องเวอร์ชันไม่ตรงกัน นี่คือฝันร้ายคลาสสิก "บนเครื่องผมรันได้นะ" — Docker แก้ปัญหานี้
Dockerfile ของเราเริ่มจาก python:3.11-slim แล้ว pip install tensorflow ai-edge-litert numpy scikit-learntensorflow (ไม่ใช่ tensorflow-cpu) เพราะมี wheel สำหรับ linux/arm64 → รันบน Docker ของ Apple Silicon ได้-v "$PWD":/work) แก้ไฟล์บนเครื่อง เห็นผลใน container ทันที ไม่ต้อง rebuildDocker คือ "สภาพแวดล้อมสำเร็จรูปในกล่อง" — เหมือนเฟิร์มแวร์บนบอร์ดที่ทุกคนได้เหมือนกัน แต่คราวนี้เป็นโต๊ะฝึกโมเดลบน PC ที่ทุกคนได้เหมือนกัน
ทั้ง Pillar 4 หมุนรอบไฟล์เดียว: model_int8.tflite เราสร้างมันในชุดบทเรียนนี้ แล้ว บทเรียน 5.6–5.9 เอาไปกระจายสี่ทาง
มีแค่ MCU ที่ต้องคอมไพล์เพิ่ม (Vela) เพราะต้องแปลงให้ NPU อ่านออก · PC / Web / Cortex-A ใช้ไฟล์
.tfliteเดียวกันเป๊ะ — นี่คือ "train once, run everywhere" ที่จับต้องได้ วันนี้เราสร้างชิ้นงานนั้นและทดสอบมันบน PC
ถ้าเครื่องยังไม่มี Docker หรืออยากได้ GPU ฟรี ใช้ Colab notebook ที่ให้มาได้เลย — pipeline เดียวกันเป๊ะ (synthesize → Conv1D → int8 → eval → ดาวน์โหลด model_int8.tflite):
train_edge_ai.ipynb (รันครบทุกเซลล์ = ได้ไฟล์ int8 พร้อม deploy)model_int8.tflite ไปเข้าบทเรียน 5.6–5.7 (Web) / บทเรียน 5.8–5.9 (บอร์ด) ต่อได้ทันทีDocker = reproducible แบบมืออาชีพ · Colab = เริ่มได้ทันทีในเบราว์เซอร์ — เลือกได้ตามสะดวก ผลได้ไฟล์เดียวกัน
ยังไม่ต้องเข้าใจโค้ด รันให้เห็นก่อน เปิด terminal ในโฟลเดอร์ shared/training/ แล้ว build อิมเมจครั้งเดียว:
cd courses/edge-ai-developer/shared/training # ในโฟลเดอร์ที่ clone repo นี้มา
docker build -t edgeai-train .
Dockerfile แล้วประกอบ "กล่องสำเร็จรูป" ที่มี TensorFlow + ai-edge-litert พร้อมใช้Dockerfile เอง)-t edgeai-train = ตั้งชื่อกล่องว่า edgeai-train จะได้เรียกใช้ง่ายๆครั้งแรกจะโหลดนาน (ดึง TensorFlow ~หลายร้อย MB) รอสักครู่ พอขึ้น
naming to ... edgeai-trainก็พร้อม ครั้งต่อไปเร็วมาก
ทีนี้สั่งฝึกจริง ใช้ 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)
มีโมเดลแล้ว ทดสอบไฟล์ 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 มีปัญหาเราเพิ่งเห็น "ปลายทาง" แล้ว: โมเดลของเราทายชุดทดสอบถูกหมด ทีนี้ย้อนกลับไปแกะว่า
train.pyทำอะไรทีละจังหวะ