โปรเจกต์ วิธีทำให้ Coffee Machine ของคุณไม่มีวันน้ำแห้ง
ใช้ Classification Model แบบง่ายเพื่อตรวจสอบล่วงหน้าว่า Water Tank จำเป็นต้อง Refill หรือไม่ก่อนทำ Coffee!
ใช้ Classification Model แบบง่ายเพื่อตรวจสอบล่วงหน้าว่า Water Tank จำเป็นต้อง Refill หรือไม่ก่อนทำ Coffee!
เป้าหมายของบทเรียนนี้คือการตรวจจับว่าเมื่อใดที่เครื่องชงกาแฟกำลังจะหมดน้ำก่อนที่มันจะเกิดขึ้น เพราะการใช้งานปั๊มของเครื่องโดยไม่มีน้ำอาจทำให้ตัวเครื่องเสียหายได้
เราจะทำด้วยวิธีที่ไม่รบกวนระบบเดิมเลย โดยเราจะติดแค่ Board Arduino พร้อมกับ Accelerometer ไว้บนเครื่องชงกาแฟ
เราจะใช้ NanoEdge AI Studio (เครื่องมือฟรี) เพื่อสร้าง AI Model โดยอัตโนมัติ ซึ่งสามารถจำแนกได้ว่าเสียงกริ่งประตูกำลังดังหรือเป็นเพียงเสียงรบกวนพื้นหลัง
ไม่ต้องกังวล คุณไม่จำเป็นต้องมีความรู้เรื่อง AI ก็สามารถทำตามบทเรียนนี้ได้ :)
ขั้นแรกให้เสียบ Shield ของ STMicroelectronics เข้ากับ Board Arduino จากนั้นใช้ blu tack (หรือกาวอเนกประสงค์อื่นๆ) เพื่อติด Board เข้ากับเครื่องชงกาแฟ


ใน Arduino IDE:
ตรวจสอบให้แน่ใจว่าคุณเลือก COM port ที่ถูกต้อง: Tools > Port และเลือกอันที่ถูกต้อง
เลือก Board ที่ถูกต้อง:
เราใช้ STMicroelectronics X-NUCLEO-ISK01A3 สำหรับ LSM6DSO ของมัน หากคุณมี Accelerometer รุ่นอื่น ก็สามารถใช้งานได้
ในการรับ Code สำหรับ Datalogging เราจะใช้ NanoEdge AI Studio Datalogger generator สำหรับ Arduino

NanoEdge จะส่งออกไฟล์ .zip ที่มีไฟล์ .ino ซึ่งคุณสามารถนำไปใช้ใน Arduino IDE ได้โดยตรง:
Code ถูกแนบไว้ด้านล่างในชื่อ main_datalogging.c
โดยปกติแล้ว Code จะมีส่วนที่คอมเมนต์ไว้สำหรับ Library ของ NanoEdge AI แต่เราจะใช้งานในภายหลัง หลังจากสร้าง Model เสร็จแล้ว
NanoEdge AI Studio เป็น Software ฟรีที่พัฒนาโดย STMicroelectronics เพื่อช่วยให้ผู้ใช้งาน Embedded สร้าง AI Model ได้อย่างง่ายดาย และมันใช้งานง่ายมาก:
ในที่นี้เราจะทำโปรเจกต์ตรวจจับความผิดปกติ (Anomaly detection - AD) เราต้องการตรวจจับสถานการณ์ปกติที่มีน้ำสำหรับชงกาแฟ และสถานการณ์ที่ผิดปกติเมื่อไม่มีน้ำเหลืออยู่แล้ว
เราสามารถเลือกทำเป็น Model แบบ N class classification ได้เช่นกัน แต่จะกล่าวถึงเพิ่มเติมในช่วงท้าย
ใน Project Settings:
ใน Regular signals:
ที่นี่เราจะบันทึกสัญญาณปกติ ในกรณีของเราคือตอนที่เครื่องชงกาแฟมีน้ำเพียงพอสำหรับชงกาแฟ
คุณสามารถเลือกได้ว่าจะ Import ข้อมูลที่มีอยู่แล้ว (ไฟล์ .txt หรือ .csv) หรือจะบันทึกโดยตรงใน NanoEdge
วิธีบันทึกข้อมูลใน NanoEdge โดยตรง:

ใน Abnormal signals:
ทำแบบเดิม แต่ทำตอนที่มีน้ำไม่เพียงพอหรือไม่มีน้ำเลยสำหรับการชงกาแฟ
Benchmark:
ตอนนี้เมื่อเรามีข้อมูล 2 ประเภทแล้ว เราสามารถสั่งให้ NanoEdge AI Studio นำข้อมูลเหล่านี้มาสร้าง AI Library ที่ประกอบด้วย Model และ Parameter ต่างๆ รวมถึงการทำ Preprocessing กับข้อมูลของเรา เช่น FFT เป็นต้น
คลิกที่ New Benchmark แล้วเลือกข้อมูลทั้งสองประเภทจากนั้นคลิก Start
ระหว่างการทำ Benchmark จะมีการทดสอบชุดค่าผสมนับแสนรายการเพื่อค้นหาสิ่งที่ทำงานได้ดีที่สุดกับข้อมูลที่ให้ไว้
คะแนน (Score) คือตัวชี้วัดที่พิจารณาจาก Accuracy โดยรวมของ Model และการใช้ RAM กับ FLASH
เมื่อคุณได้ค่า Accuracy ตั้งแต่ 90% ขึ้นไป คุณสามารถหยุดการทำ Benchmark ได้ มันอาจใช้เวลาหลายชั่วโมงในการพยายามค้นหา Library ที่เหมาะสมที่สุด แต่ในที่นี้หากเราได้อันที่ใช้งานได้ก็เพียงพอแล้ว

Validation:
ในการตรวจสอบ (Validation) เป้าหมายคือการทดสอบว่า Model ที่พบระหว่างการทำ Benchmark นั้นทำงานได้กับข้อมูลใหม่หรือไม่ สิ่งที่อาจเกิดขึ้นกับ AI Model คือ Overfitting ซึ่งหมายความว่า Model จดจำข้อมูลได้แม่นยำเกินไปแต่ไม่รู้วิธีแยกแยะพวกมัน ผลที่ตามมาคือมันจะทำงานได้ไม่ดีกับข้อมูลที่ไม่เคยเห็นมาก่อน
เลือก 5 Model ที่ดีที่สุด คลิกที่ New Experiment และเพิ่มไฟล์ข้อมูลใหม่:
หลังจากผ่านไปสักครู่ คุณจะได้รับค่า Accuracy ใหม่สำหรับทั้ง 5 Model ที่เลือก คุณควรได้ค่า Accuracy ใกล้เคียงกับที่ได้ระหว่างการทำ Benchmark หากไม่เป็นเช่นนั้น ให้ทำ Benchmark ใหม่ด้วยข้อมูลที่มากขึ้น
Compilation:
ในที่นี้เรามีสองทางเลือก:
หากคุณไม่ต้องการ Retrain ให้คลิกที่ Compile ได้เลย
หากคุณต้องการความรู้จากการทำ Benchmark ให้ติ๊กถูกที่ช่อง "Include knowledge from benchmark" ก่อนทำการ Compile
ผมจะเปลี่ยน Code เพียงไม่กี่บรรัดในภายหลังในบทเรียนนี้ อ่านเพิ่มเติมได้ที่นี่:
https://wiki.st.com/stm32mcu/wiki/AI:NanoEdge_AI_Library_for_anomaly_detection_(AD)
ตอนนี้เมื่อเรามี Library สำหรับตรวจจับความผิดปกติแล้ว เราต้องเพิ่มมันลงใน Code Arduino ของเรา:
หากคุณใช้ Library ของ NanoEdge AI ใน Arduino IDE อยู่แล้ว: ให้ไปที่ document/arduino/library และลบโฟลเดอร์ NanoEdge ทิ้ง จากนั้นทำตามคำแนะนำด้านบนเพื่อ Import Library ใหม่
ข้อสำคัญ:
หากคุณพบข้อผิดพลาดเกี่ยวกับ RAM อาจเป็นเพราะ Library ใน NanoEdge ให้กลับไปที่ขั้นตอน VALIDATION ใน NanoEdge และเลือก Library ที่มีขนาดเล็กลง (คลิกที่รูปมงกุฎทางด้านขวา) จากนั้นทำการ Compile และนำไปเปลี่ยนใน Arduino IDE
ตัวเลือก A: Retrain ตัว Model
ใน Code ที่เราใช้สำหรับ Datalogging ให้เปลี่ยน NEAI_MODE เป็น 1 และยกเลิกคอมเมนต์ Code ต่อไปนี้:
...
#include <NanoEdgeAI.h>
...
#define NEAI_MODE 1 //0 is data logging code, 1 is detection code
...
void setup(){
...
neai_code = neai_anomalydetection_init(); //initialisation
if(neai_code != NEAI_OK) {
Serial.print("Not supported board.\n");
}
}
void loop(){
...
if(NEAI_MODE) {
if(neai_cnt < MINIMUM_ITERATION_CALLS_FOR_EFFICIENT_LEARNING) {
neai_anomalydetection_learn(neai_buffer);
Serial.print((String)"Learn: " + neai_cnt + "/" + MINIMUM_ITERATION_CALLS_FOR_EFFICIENT_LEARNING + ".\n");
neai_cnt++;
}
else {
neai_anomalydetection_detect(neai_buffer, &similarity);
Serial.print((String)"Detect: " + similarity + "/100.\n");
}
}
}
ตัวเลือก B: ใช้ความรู้จากการทำ Benchmark
หากคุณตัดสินใจเลือกใช้ความรู้จากการทำ Benchmark นี่คือสิ่งที่ต้องทำ:
#include <NanoEdgeAI.h>
#include "knowledge.h" // DON T FORGET TO LOAD THE KNOWLEDGE
void setup(){
...
neai_code = neai_anomalydetection_init();
if (neai_code != NEAI_OK) {
Serial.print("Not supported board.\n");
} else {
neai_anomalydetection_knowledge(knowledge); //this part is to load the knowledge
}
}
void loop(){
...
if(NEAI_MODE) {
// no more learning part, but detect is the same
neai_anomalydetection_detect(neai_buffer, &similarity);
Serial.print((String)"Detect: " + similarity + "/100.\n");
}
...
}
neai_anomalydetection_detect() คือส่วนของ Code ที่ใช้ Model ในการตรวจจับ
หากค่า Similarity เป็น 100 หมายความว่าเราได้สัญญาณที่เหมือนกับข้อมูลปกติ 100% (มีน้ำเพียงพอ) หากเป็น 0 หมายความว่าไม่มีโอกาสเลยที่จะเป็นข้อมูลปกติ
ใน Code เริ่มต้นเราจะพิมพ์แค่คะแนน Similarity ออกมา คุณสามารถเขียนคำสั่ง if เพื่อแสดงคำว่า OK หากค่า Similarity สูงกว่า 90 หรือ "Not enough water, please add water" ในกรณีอื่นๆ ได้ตามใจคุณ:
if (similarity > 90){
Serial.print("OK");
} else {
Serial.print("Not enough water, please add water");
}
ขอบคุณที่อ่านจนจบครับ :)
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้