ในภาคแรก เป็นเรื่องของการต่อเซ็นเซอร์ต่างๆ เข้ากับบอร์ด Wio Terminal และส่งข้อมูลแบบไร้สายออกไปที่ LoRa-E5 module ตามมาตราฐานของ LoRaWAN ในคลื่นความถี่สำหรับประเทศไทย หากคุณยังไม่ได้ดู ตามไปที่ลิงค์นี้ รีวิว SenseCAP K1100 : Sensor Prototype ด้วย LoRaWAN และ AI (Episode I)
สำหรับภาคสอง จะเป็นการนำ SenseCAP K1100 มาประยุกต์ใช้งาน Grove Vision AI module ร่วมกับบอร์ด Wio Terminal ทำการ Train Model จับภาพใบหน้า แสดงผลจากกล้องวิดีโอไปที่คอมพิวเตอร์ และประเมินผลลัพธ์ว่า Face detection Model มีความแม่นยำเพียงใด โดยประมวลผลในลักษณะ Edge Computing Sensor และแจ้งผลส่งข้อมูลแบบไร้สายระยะไกลผ่าน LoRa-E5 module ไปที่ระบบ Private LoRaWAN IoT Platform ต่อไป
การทำความเข้าใจว่าปัญญาประดิษฐ์คืออะไร และจะใช้มันเพื่อเป็นประโยชน์ต่อธุรกิจและองค์กรของคุณได้อย่างไร เราควรทำความเข้าใจกับความหมายของมันให้ถ่องแท้เสียก่อน
- ปัญญาประดิษฐ์ (AI : Artificial Intelligence) คือการนำความฉลาดของมนุษย์ไปใส่ไว้ในคอมพิวเตอร์ ทำให้คอมพิวเตอร์มีความฉลาดคล้ายคลึงกับมนุษย์ โดยให้คอมพิวเตอร์ประมวลผลบางอย่างที่มีความจำเพาะเจาะจง ด้วยการใส่ข้อมูลที่จำเป็น ในการประมวลผลแต่ละครั้งคอมพิวเตอร์จะรู้ว่ามีความเป็นไปได้ที่จะเกิดผลลัพธ์ใดขึ้นบ้าง
- การเรียนรู้ของเครื่อง (ML : Machine Learning) คือการสอนให้เรียนรู้ทำความเข้าใจและตัดสินใจได้ด้วยตัวเองจากข้อมูลที่ป้อนให้ จากการสร้าง Algorithm และนำ Algorithm ไปเรียนรู้กับชุดข้อมูลต้นแบบ (Training Set) เพื่อให้ได้ Function ออกมาเป็น Black box หรือสมการ จากนั้นจึงนำ Function ที่ได้นี้ ไปใช้ประมวลผลกับชุดข้อมูลทดสอบ เพื่อให้ได้เป็นผลลัพธ์ที่พร้อมนำไปใช้งานได้
- การเรียนรู้หยั่งลึก (DL : Deep Learning) คือวิธีการเรียนรู้แบบอัตโนมัติ ด้วยการเลียนแบบการทำงานของโครงข่ายระบบประสาทของมนุษย์ โดยการนำระบบโครงข่ายประสาท (Neural Network) มาซ้อนๆ กัน หลายๆ ชั้น (Layers) และทำการเรียนรู้ข้อมูลตัวอย่าง ซึ่งข้อมูลดังกล่าวจะถูกนำไปใช้ในการหารูปแบบ (Pattern) หรือจำแนกหมวดหมู่ของข้อมูล ทำให้เกิดความสามารถในการจดจำ เช่น ใบหน้า หรือ พฤติกรรมของลูกค้า เป็นต้น
Grove – Vision AI Module
คือบอร์ดของกล้อง AI ขนาดเล็ก ซึ่งได้รับการติดตั้งอัลกอริธึม TinyML (Machine Learning) สามารถใช้ฟังก์ชัน AI ที่แตกต่างกันได้ ตามที่ Seeed จัดหาให้ เช่น การตรวจจับบุคคล การตรวจจับศัตรูพืช การนับคน การจดจำวัตถุ หรือสร้างเป็นโมเดลของตนเอง ผ่านเครื่องมือการฝึกสอนให้เครื่องเรียนรู้ และนำโมเดลนั้น มาปรับใช้และแสดงผลได้อย่างง่ายดายภายในไม่กี่นาที โดยทำงานภายใต้โมเดลพลังงานต่ำพิเศษ
Pinout Overview
Hardware Preparation
- 1x Wio Terminal
- 1x Grove Vision AI Module
- 1x Grove LoRa-E5 Module
- 2x USB Type-C cable
- 1x Computer
Customize Training Model
ทาง Seeed Studio ได้จัดเตรียมโมเดลที่ตรวจจับคนก่อนการฝึกสอน เราสามารถนำมาใช้ได้เลย เพื่อความรวดเร็วในการเรียนรู้จักกับกล้อง Vision AI ดังนี้
Deploy the trained model & Library Installation
- Step 1. ต่อสาย USB Type-C เข้ากับ Grove Vision AI Module เชื่อมต่อกับคอมพิวเตอร์
- Step 2. กดปุ่ม BOOT ที่บอร์ด Vision AI 2 ครั้ง เพื่อเข้าสู่ Boot mode และที่เครื่องคอมพิวเตอร์จะปรากฎ Disk Drive ชื่อ “GROVEAI” มีข้อมูลอยู่ 2 ไฟล์ คือ INDEX.HTM , INFO_UF2.TXT
- Step 3. เราจะเลือกใช้ไฟล์ที่ผ่านการ Train Model มาแล้วชื่อ “People Face Detected Model” คัดลอกไฟล์ Pre-train Model ไฟล์ Bootloader “.uf2” (USB Flashing Format) มาใส่ที่ Drive GROVEAI จะเห็นไฟกระพริบที่บอร์ด Vision AI แสดงว่าอยู่ระหว่างการ Burn Firmware.
หมายเหตุ:- หาก trained model มีหลายไฟล์ ให้คัดลอกทีละไฟล์ โดยเริ่มจากไฟล์แรก รอจนกว่าไฟกระพริบจะดับ จึงค่อยเข้าสู่ Boot mode และคัดลอกไฟล์ลำดับถัดไปจนกระทั่งครบทั้งหมด - Step 4. ขณะที่บอร์ด Vision AI module ต่อกับเครื่องคอมพิวเตอร์ ที่บอร์ด Wio Terminal ให้ต่อสาย Grove I2C เข้ากับ Port I2C ของ Vision AI module และต่อสาย USB type-C ที่บอร์ด Wio Terminal
- Step 5. เพิ่ม Library Source Code สำหรับบอร์ด Vision AI Module โดยดาวน์โหลดไฟล์ Seeed-Grove-Vision-AI-Moudle.zip
Arduino IDE -> Sketch -> Include Library -> Add .ZIP Library -> เลือก Seeed-Grove-Vision-AI-Moudle - Step 6. เพิ่ม Library Source Code สำหรับบอร์ด LoRaWAN Module โดยดาวน์โหลดไฟล์ Disk91_LoRaE5.zip
Arduino IDE -> Include Library -> Add .ZIP Library -> เลือก Disk91_LoRaE5 - Step 7. Run โปรแกรม Arduino IDE และเปิดไฟล์ LoRa-VisionAI-FaceDetection.ino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 |
// LoRaWAN + Vision AI Face Detection + TFT LCD // by.. Ninephon kongangkab <[email protected]> #include <SoftwareSerial.h> #include "Seeed_Arduino_GroveAI.h" #include <Wire.h> #include "TFT_eSPI.h" #include "Seeed_FS.h" //Including SD card library #include "RawImage.h" //Including image processing library TFT_eSPI tft; GroveAI ai(Wire); uint8_t state = 0; SoftwareSerial mySerial(A0, A1); // RX, TX static char recv_buf[512]; static bool is_exist = false; static bool is_join = false; static int at_send_check_response(char *p_ack, int timeout_ms, char *p_cmd, ...) { int ch; int num = 0; int index = 0; int startMillis = 0; va_list args; memset(recv_buf, 0, sizeof(recv_buf)); va_start(args, p_cmd); mySerial.printf(p_cmd, args); Serial.printf(p_cmd, args); va_end(args); delay(200); startMillis = millis(); if (p_ack == NULL) { return 0; } do { while (mySerial.available() > 0) { ch = mySerial.read(); recv_buf[index++] = ch; Serial.print((char)ch); delay(2); } if (strstr(recv_buf, p_ack) != NULL) { return 1; } } while (millis() - startMillis < timeout_ms); return 0; } static void recv_prase(char *p_msg) { if (p_msg == NULL) { return; } char *p_start = NULL; int data = 0; int rssi = 0; int snr = 0; p_start = strstr(p_msg, "RX"); if (p_start && (1 == sscanf(p_start, "RX: \"%d\"\r\n", &data))) { Serial.println(data); } p_start = strstr(p_msg, "RSSI"); if (p_start && (1 == sscanf(p_start, "RSSI %d,", &rssi))) { Serial.println(rssi); } p_start = strstr(p_msg, "SNR"); if (p_start && (1 == sscanf(p_start, "SNR %d", &snr))) { Serial.println(snr); } } void setup(void) { //Initialise SD card if (!SD.begin(SDCARD_SS_PIN, SDCARD_SPI)) { while (1); } tft.begin(); tft.setRotation(3); drawImage<uint16_t>("cnxsoftware.bmp", 0, 0); //Display this 16-bit image in sd card Wire.begin(); Serial.begin(115200); mySerial.begin(9600); delay(5000); Serial.print("E5 LORAWAN TEST\r\n"); if (ai.begin(ALGO_OBJECT_DETECTION, MODEL_EXT_INDEX_1)) // Object detection and pre-trained model 1 { Serial.print("Version: "); Serial.println(ai.version()); Serial.print("ID: "); Serial.println( ai.id()); Serial.print("Algo: "); Serial.println( ai.algo()); Serial.print("Model: "); Serial.println(ai.model()); Serial.print("Confidence: "); Serial.println(ai.confidence()); state = 1; } else { Serial.println("Algo begin failed."); } if (at_send_check_response("+AT: OK", 100, "AT\r\n")) { is_exist = true; at_send_check_response("+ID: DevEui", 1000, "AT+ID=DevEui,\"2CF7xxxxxxxx034F\"\r\n"); at_send_check_response("+ID: AppEui", 1000, "AT+ID=AppEui,\"8000xxxxxxxx0009\"\r\n"); at_send_check_response("+MODE: LWOTAA", 1000, "AT+MODE=LWOTAA\r\n"); at_send_check_response("+DR: AS923", 1000, "AT+DR=AS923\r\n"); at_send_check_response("+CH: NUM", 1000, "AT+CH=NUM,0-2\r\n"); at_send_check_response("+KEY: APPKEY", 1000, "AT+KEY=APPKEY,\"8B91xxxxxxxxxxxxxxxxxxxxxxxx6545\"\r\n"); at_send_check_response("+CLASS: A", 1000, "AT+CLASS=A\r\n"); at_send_check_response("+PORT: 8", 1000, "AT+PORT=8\r\n"); delay(200); is_join = true; } else { is_exist = false; Serial.print("No E5 module found.\r\n"); } } void loop(void) { if (is_exist) { int ret = 0; char cmd[128]; if (is_join) { ret = at_send_check_response("+JOIN: Network joined", 12000, "AT+JOIN\r\n"); if (ret) { is_join = false; } else { Serial.println(""); Serial.print("JOIN failed!\r\n\r\n"); delay(5000); } } else { if (state == 1) { if (ai.invoke()) // begin invoke { while (1) // wait for invoking finished { CMD_STATE_T ret = ai.state(); if (ret == CMD_STATE_IDLE) { break; } delay(20); } uint8_t len = ai.get_result_len(); // receive how many people detect if(len) { Serial.print("Number of people: "); Serial.println(len); object_detection_t data; //get data for (int i = 0; i < len; i++) { Serial.println("result:detected"); Serial.print("Detecting and calculating: "); Serial.println(i+1); ai.get_result(i, (uint8_t*)&data, sizeof(object_detection_t)); //get result Serial.print("confidence:"); Serial.print(data.confidence); Serial.println(); sprintf(cmd, "AT+CMSGHEX=\"%04X %04X\"\r\n", len, data.confidence); ret = at_send_check_response("Done", 10000, cmd); if(!ret){ break; Serial.print("Send failed!\r\n\r\n"); } else{ recv_prase(recv_buf); } } } else { Serial.println("No identification"); } } else { delay(1000); Serial.println("Invoke Failed."); } } } } else { delay(1000); } delay(500); } |
- Step 8. แก้ไขโปรแกรม เพื่อกำหนดข้อมูลที่จำเป็นสำหรับบอร์ด LoRaWAN ดังนี้หมายเลข
- DevEui จำนวน 8 byte
- หมายเลข AppvEui จำนวน 8 byte
- หมายเลข APPKEY จำนวน 16 byte
- กำหนดการเชื่อมต่อเป็นแบบ OTAA (Over-The-Air Activation)
- กำหนดย่านความถี่ใช้งานสำหรับประเทศไทยเป็น AS923
- Step 9. Upload โปรแกรมลงไปที่บอร์ด Wio Terminal
- Step 10. เปิดโปรแกรม Serial Monitor ดังรูป Grove Vision AI module จะประมวลผล Machine Learning ด้วยอัลกอริทึม People Face Detected Model และแสดงผลลัทธ์ของการทำงานในลักษณะ Edge Computing ดังนี้
- Number of people: จำนวนผู้คนที่สามารถตรวจจับใบหน้าได้
- Confidence: เปอร์เซ็นต์ความเชื่อมั่นในการตรวจจับใบหน้า
- Step 11. แสดงภาพวิดีโอจากกล้องผ่านทาง Browser URL https://files.seeedstudio.com/grove_ai_vision/index.html ด้วย Google Chrome หรือ Microsoft Edge browser
- Step 12. จากเว็ปเพจ SenseCAP AI Vision กดปุ่ม Connect เลือก Grove AI-Paired กด Connect
- Step 13. ถือ Grove Vision AI module หันกล้องไปยังผู้คนที่เราต้องการ จะแสดงภาพวิดีโอการจับหน้าระบุว่าเป็นบุคคล และมีค่าระดับความเชื่อมั่นกี่เปอร์เซ็นต์
Private LoRaWAN IoT On-Premise Platform
เป็น IoT Platform ที่ผู้รีวิวติดตั้งขึ้นมาใช้งานเป็นการส่วนตัว เพื่อความสะดวกในการบริหารจัดการระบบ LoRaWAN ได้อย่างเบ็ดเสร็จ ประกอบด้วยซอฟท์แวร์ต่างๆ ที่จำเป็นในการใช้งาน ซึ่งอยู่ในรูปแบบของ Open Source ทั้งหมดดังนี้
- ChirpStack : LoRaWAN Network and Application Server ทำการลงทะเบียนหมายเลขอุปกรณ์ LoRaWAN IoT และถอดรหัสข้อมูลที่ได้รับในรูปแบบ AES128 และมีตัวกลาง MQTT broker (Message Queuing Telemetry Transport) โดยทำหน้าที่เป็นผู้ส่ง (publish)
- Node-RED : เป็นเครื่องมือพัฒนาแบบโฟลว์สำหรับการเขียนโปรแกรม โดยเป็นผู้รับ (subscribe) มาจาก ChirpStack ผ่านโปรโตคอล MQTT และนำข้อมูลจาก payload มาถอดรหัสตามรูปแบบ BASE64 ก็จะได้ข้อมูลที่ส่งมาจากเซนเซอร์ นำไปเก็บไว้ที่ InfluxDB
- InfluxDB : Time Series Database ใช้เก็บข้อมูลที่มาจากเซนเซอร์และข้อมูลที่มาจาก LoRaWAN Gateway ไว้ในฐานข้อมูล โดยเรียงตามอนุกรมของเวลาโดยอัตโนมัติ ทำให้เราสามารถนำข้อมูลไปวิเคราะห์ หรือดูย้อนหลังได้ตลอดเวลา
- Grafana : Real Time Dashboard นำข้อมูลจากฐานข้อมูลมาแสดงผลในรูปแบบต่างๆ
ข้อเสนอแนะ
หากต้องการนำไปใช้งานจริง ควรเลือกใช้ Sensor ประเภท Industrial grade จะมีความเหมาะสมกับสภาพแวดล้อมจริงและให้ความน่าเชื่อถือได้มากกว่า Industrial Grade SenseCAP A1101 – LoRaWAN Vision AI Sensor
ความคิดเห็นส่วนตัว
- หลังจากที่ได้ลองศึกษา SenseCAP K1100 ทั้งเซ็นเซอร์จาก Wio Terminal onboard และ Grove โดยทุกๆ เซ็นเซอร์ จะส่งข้อมูลผ่านบอร์ด LoRa-E5 ไร้สายระยะไกลไปที่ LoRaWAN Gateway ยิ่งศึกษาไปเรื่อยๆ ก็ยิ่งสนุก เพราะสามารถนำเซ็นเซอร์มาต่อได้หลากหลายโปรโตคอลมากๆ ทั้งดิจิตอลและอนาล็อกผ่านทาง GPIO 40pin หรือบอร์ดเซ็นเซอร์สำเร็จรูปต่างๆ เช่น I2C , SPI
- เวลา Upload program เขียนลงบอร์ด Wio Terminal ได้โดยอัตโนมัติ (Automatic Bootloader) ไม่ต้องกดปุ่มใดๆ และหากเข้าสู่โหมด Automatic Bootloader ไม่ได้ ทาง SeeedStudio ก็ออกแบบ Firmware รองรับไว้แล้ว โดยยอมให้เข้าสู่โหมด Manual Bootloader ด้วยการเลื่อนสวิทซ์ 2 ครั้งแบบเร็วๆ รายละเอียดวิธีทำอยู่ในรีวิว Episode I
- การใช้งาน LoRaWAN ส่งข้อมูลแบบไร้สายระยะไกล จำเป็นต้องอาศัยความรู้ความเข้าใจพอสมควร เนื่องจากระบบ LoRa มีขั้นตอนการเชื่อมต่อที่สลับซับซ้อนกว่า Wi-Fi หรือ Bluetooth มาก ดังนั้นหากทางบริษัท SeeedStudio พัฒนา Firmware ตัวใหม่ออกมาที่สามารถเชื่อมต่อได้โดยไม่ต้อง Coding ก็จะดีมากๆ
- ผลิตภัณฑ์ SenseCAP K1100 มีความสามารถสูง, เชื่อถือได้, ทำงานไม่เคยแฮงค์ และถูกพัฒนาปรับปรุงอย่างต่อเนื่องตลอดเวลา สถาบันการศึกษาต่างๆ ทั้งระดับประถม, มัธยม และอุดมศึกษา น่านำไปเป็นส่วนหนึ่งของอุปกรณ์การเรียนการสอนในหลักสูตร STEM (Science, Technology, Engineering and Mathematics) ดังนั้นหากทำให้นักเรียน, นักศึกษา สามารถเข้าถึงได้ในราคาที่ย่อมเยาว์กว่านี้ ก็จะดีต่อใจมิใช่น้อย
ขอขอบคุณบริษัท SeeedStudio ที่ส่งชุดผลิตภัณฑ์ SenseCAP K1100 มาให้รีวิวในครั้งนี้ หากทุกท่านมีความสนใจในผลิตภัณฑ์ดังกล่าว ติดตามได้จากลิงค์ SenseCAP K1100 ราคา $99.00 หรือ ~3,500฿
ผู้คลั่งไคล้เทคโนโลยีนวัตกรรมแห่งอนาคต Automation, PLC, DCS, SCADA, Robot Arm, Sensor, Embedded, Maker, IoT, LoRaWAN, Industry 4.0, Smart City, Smart Home, Smart Energy, Smart Environment, Smart Economy, Smart Precision Agriculture, Hi-Fi Audio/Visual, Home Cinema, RC Drone (Radio Control).