ก้าวสองกับ Wio Terminal — TinyML
หลังจากทดลองจอ LCD กับ WiFi ของ Wio Terminal ไปแล้ว ขั้นถัดมาคงต้องลองอะไรที่ดูหรูหรามากขึ้นหน่อย เลยไปลองสแกน Wiki ที่เว็บของ Seeed Studio ดูว่ามีโค้ดตัวอย่างอะไรให้ลองบ้าง เลยไปเจอหัวข้อหนึ่งที่น่าสนใจมากคือ TinyML ซึ่งเป็นการใช้ machine learning (ML) ในฮาร์ดแวร์ระดับไมโครคอนโทรลเลอร์ ผมเองสนใจหัวข้อ TinyML มาสักพักแล้ว เพราะมีไอเดียของการประยุกต์สำหรับเครื่องใช้ไฟฟ้าอยู่หลายเรื่อง แต่พอดีติดสารพัดงานที่ต้องจัดการเลยยังไม่ได้งัดบอร์ดที่มีอยู่มาลอง ทั้งนี้ TinyML มีการสนับสนุนมาจาก ARM เลยมีตัวอย่างที่ค่อนข้างเอียงไปทางสถาปัตยกรรม ARM Cortex-M มากหน่อย คนที่สนใจด้านนี้แนะนำให้ลองศึกษาจากรายการของ clip ที่บันทึกไว้ หรือจะไปลองดูจากคอร์ส CS249r ของมหาวิทยาลัย Harvard หรือจะลองค้นคอร์สบน coursera หรือ edX ก็ได้
โค้ดตัวอย่างที่สาธิต TinyML บน Wio Terminal ดัดแปลงมาจากเนื้อหาของหนังสือ TinyML ซึ่งมี preview ให้ดาวน์โหลดมาลองอ่านได้ หากมองฮาร์ดแวร์ที่มีอยู่บนตัว Wio Terminal ถือได้ว่ามีตัวเลือกที่เหมาะสมกับการใช้งานสาย machine learning อยู่หลายตัว เช่น เซ็นเซอร์วัดความเร่งแบบ 3 แกน (LIS3DHTR) ไมค์โครโฟน เซ็นเซอร์วัดแสง รวมถึง การอ่าน RSSI ของ WiFi หรือ BLE 5.0
Seeed Studio เตรียมเอกสารสำหรับเรียนรู้ TinyML ด้วย Wio Terminal ไว ้โดยมีโค้ดตัวอย่างที่สาธิตกับเซ็นเซอร์ 4 แบบคือ เซ็นเซอร์แสง เซ็นเซอร์วัดความเร่ง และไมค์โครโฟน ที่มีอยู่ในตัว Wio Terminal อยู่แล้ว ส่วนอีก 1 ตัวอย่างเป็นเซ็นเซอร์ BME280 สำหรับตรวจสอบสภาพแวดล้อม การทดลองโค้ดตัวอย่างเริ่มจากไปลงทะเบียนกับบริการ Edge Impulse แล้วติดตั้งชุดคำสั่ง Edge Impulse CLI ด้วย package manager ของ Node.js
npm install -g edge-impulse-cli
ตัวอย่างที่จะลองในครั้งนี้คือ การใช้เซ็นเซอร์แสงเพื่อตรวจจับการออก ค้อน/กรรไกร/กระดาษ ซึ่งจะเริ่มจากการเขียนโค้ดอ่านค่าแอนะล็อกจากเซ็นเซอร์แสง (ขา WIO_LIGHT) แล้วพิมพ์ค่าออกทาง Serial การทดลองเก็บข้อมูลจะใช้การทำมือเป็น ค้อน/กรรไกร/กระดาษ ลากผ่านเซ็นเซอร์แสง
การส่งข้อมูลไป train model ด้วยบริการ Edge Impulse ทำได้หลายวิธี โดยตัวอย่างจะใช้คำสั่ง edge-impulse-data-forwarder เพื่อลงทะเบียนอุปกรณ์แล้วส่งผ่านข้อมูลแบบเรียลไทม์ไปเซิร์ฟเวอร์ หรืออาจจะส่งไฟล์ขึ้นไปก็ได้ การเลือกประเภทข้อมูลสามารถกำหนดได้หลายประเภท ซึ่งการทดลองครั้งนี้จะใช้เป็นข้อมูลแบบ time-series จากเซ็นเซอร์ จากนั้นข้อมูลจะถูก label แล้ว train ก่อนจะนำ model มา deploy ลงในโค้ดตัวอย่างที่จะสาธิต
กระบวนการ machine learning ของ Edge Impulse เรียกว่า impulse ซึ่งเป็น pipeline ที่ประกอบด้วย 3 ขั้นตอนคือ Feature (ตัวอย่างให้เลือก Flatten, Spectral, Raw data) Learning (ตัวอย่างให้เลือก NN classification แบบ 2 hidden layer) และ Output (ตอน label ใช้ hammer, scissor, paper) พอกำหนดพารามิเตอร์ครบก็ให้คลิกเริ่ม impulse ซึ่ง Edge Impulse จะนำชุดข้อมูลมาประมวลผลก่อนแล้ว import เข้าสู่การ train model
หลังจาก train model จนได้ performance ตามที่ต้องการแล้ว ขั้นตอนถัดไปคือ deploy โดยเลือกเป็น Arduino library ซึ่งจะมีการดาวน์โหลดไฟล์มาให้ติดตั้งด้วย Arduino IDE ตัว model จะแสดงถึงขนาดหน่วยความจำและเวลาเพื่อให้ตัดสินใจเลือกแบบไม่ optimize (ใช้ float 32 บิต) และแบบ quantized (ใช้ int 8 บิต) การเข้าไปดูซอร์สโค้ดของไลบรารีที่ดาวน์โหลดมาจะเห็นว่าเป็น TensorFlow Lite โดยมีไฟล์ที่จะ hardcode ค่า weight ของ node ต่างๆใน neural network
การทดลองโค้ดตัวอย่าง Wio_Terminal_EI_Rock_Paper_Scissors ด้วย model ที่สร้างขึ้นให้แก้ไข header file จากเดิม video_tinyml_raw_inference.h ให้เป็นชื่อ project ของ Edge Impulse ตามที่ได้ติดตั้งไลบรารีไว้ จากนั้นจึง build > upload ไปยังบอร์ด Wio Terminal ซึ่งก็ทำงานได้ แต่ผลไม่ค่อยดีเท่าไร คาดว่าเกิดจากจำนวน sample น้อยไปหน่อย (90 วินาทีสำหรับทั้ง 3 แบบ) และยังไม่ได้ label แบบเจาะจงช่วงที่มือลากผ่านเซ็นเซอร์ (ไม่แน่ใจว่าทำได้ไหมใน Edge Impulse)
終わりに (ในตอนท้าย)
การทดลองสร้าง TinyML model สำหรับ Wio Terminal ด้วยบริการ Edge Impulse ถือได้ว่าค่อนข้าง smooth เพราะซ่อนรายละเอียดของการทำ ML ไว้พอสมควร รวมทั้งยังมีกลไกที่ export มาใช้กับ Arduino ได้ง่ายแม้ว่าจะมีฮาร์ดแวร์ default เป็นบอร์ด Arduino Nano BLE 33 Sense (ดูจากตัวอย่าง) ความง่ายนี้เกิดจากความแพร่หลายของ ARM Cortex-M ในหน่วยประมวลผลจากบริษัทต่างๆ รวมทั้งการออกไลบรารี CMSIS ของ ARM เองที่มาซ่อนรายละเอียดของชุดคำสั่งคำนวณ แต่เนื้อหาที่อธิบายอยู่ในเอกสารตัวอย่างยังไม่ค่อยละเอียด อาจจะสับสนได้หากไม่มีพื้นความรู้เกี่ยวกับคำศัพท์และแนวคิดของ machine learning
ข้อมูลเพิ่มเติมจากคุณชัยวัฒน์ INEX บอร์ด Wio Terminal สามารถใช้งานใน Codecraft ได้ ซึ่งจะมี tool สำหรับพัฒนาแบบ blocky และ pre-built model สำหรับเรียนรู้ machine learning ด้วย น่าจะ ok สำหรับนักเรียนที่ยังไม่เรียนหลักการ machine learning