作者:Felix
Edge Impulse
說到近年最強勢的邊緣端 ML 平台,莫過於 Edge Impulse 莫屬了!囊括資料收集、數據標記、模型訓練、模型佈署等眾多功能集成於單一雲端平台上操作。支援的硬體從高階的 x86、NVIDIA Jetson、樹莓派到 MCU 層級的 Arduino Nicla、Pi RP2040 甚至 ESP32 都支援。軟體的易用性搭配硬體的廣泛支援,造就 Edge Impulse 在社大社群上的討論度都勇冠群雄。本篇筆者將實際操作 Edge Impulse 影像分類模型訓練,並且佈署到 XIAO ESP32S3 Sense 這個熱門 MCU 開發板上!
怎麼玩?
在 Edge Impulse 進行模型訓練大致會經過以下七個流程,本篇將會帶領各位讀者逐步進行操作:
- 建立專案
- 匯入資料
- 標記資料
- 創建流水線(Impulse)
- 資料前處理
- 訓練模型
- 佈署模型
建立專案:首先到 Edge Impulse 官網進行註冊後登入,建立一個新專案開始操作。
接著轉跳到專案總覽(dashboard),這頁面提供專案的資訊一覽以及教學指引,後續要下載模型也可以於此頁面中找到訓練好的模型。
匯入資料:在訓練模型之前必須準備好訓練資料,點選左側選單欄位中的 “Data acquisition”。把資料匯入 Edge Impulse 可以自行上傳檔案或是使用 Client 端設備進行資料採集後上傳。由於筆者預計要使用 XIAO ESP32S3 Sense 做推論,他還沒辦法使用 Client 端直接拍照上傳功能,取而代之必須要先將照片儲存到 SD Card 上,在讀出來上傳。不過筆者這邊打算偷吃步一下,直接使用 Teachable Machine 從電腦的 webcam 做資料收集,並且整包儲存為一個專案檔,內部解壓縮就有涵蓋影像資料在其中了。缺點可能是透過 webcam 蒐集到的影像資料的顏色與變形程度會跟實際推論使用的 camera 會有所不同,但好處則是可以省時許多!而 Teachable Machine 的操作方式可以參考筆者本系列前述的文章,在此就不做贅述了!
從 Teachable Machine 匯出的 .tm 檔案實為一個壓縮檔,將其解壓縮後可以得到所有類別的影像資料,其命名規則為 <class name>-!-<number>.jpg,吾等可以將此資料夾內容全數上傳到 Edge Impulse 上在標籤設定即可。於 “Data acquisition” 頁面點選 ”+ Add data” ,彈出對話框中可選擇 “Select a folder” 一次上傳所有照片資料。標籤部分可以先忽略,後續會用篩選方式更新標籤。接著點選 “Upload data” 等待一段時間後即完成上傳。
標記資料:上傳完成預設會以 80:20 比例分為訓練資料與測試資料,都可以在 “Data acquisition” 頁面當中查看與編輯,也可在此進行標籤的修改。
選擇漏斗的圖示,在 “By name” 欄位輸入篩選字串,也就是 teachable machine 上個分類的名稱,輸入後可以一次勾選所有檔案,再點選 “Edit Labels” 按鈕,輸入新的標籤名稱。重複數次後即可完成所有資料的標籤修改。
創建流水線(Impulse):點選 “Impulse Design” 中的 “Create Impulse” 來創建 Edge Impulse 的工作流水線,輸入資料大小選擇 “96×96″,
接著在第二格虛框中點選 “Add a processing block”,點選 “Image” 右側的 “Add” 按鈕,將正規化處理後的影像資料作為訓練資料輸入。
再來在第三格虛框中點選 “Add a learning block”,點選 “Transfer Learning(Images)” 右側的 “Add” 按鈕,採用遷移學的方式載入預訓練模型權重再次訓練成所需要的模型。
完成後點選右側的 “Save impulse” 完成流水線的設定,以上都是筆者建議入門者的設定參數,若各位之後有興趣研究,都可以回到此階段進行參數調整。
資料前處理:點選 “Impulse design” 中的 “Image”,在此管理要進行訓練的資料內容,對於滾動式更新的輸入資料還可以於此設定與區分不同版本。新的資料在訓練之前需要點選上方 “Generate features” 分頁,接著點選 “Generate features” 按鈕,產生資料特徵與正規化,便利於後續作為訓練資料輸入。
訓練模型:終於要來到訓練模型階段了!點選 “Impulse design” 中的 “Transfer learning”,這邊已經預先載入好遷移學習的訓練參數,包含訓練次數(training cycle)、學習率(learning rate)、神經網路模型(model)等。建議初次使用的夥伴保持預設即可,右上方目標運行的裝置 “Target” 目前還沒有 ESP32S3 的選項,可以選擇較為貼近的 “Espressif ESP-EYE (ESP32 240MHz)”,接著點選下方 “Start training” 按鈕開始進行訓練,右側則會顯示訓練過程的 log 資訊。
等待一段時間過後,當模型訓練完成右方則會顯示此模型的資訊,包含精確度(Accuracy)、混淆矩陣(Confusion matrix)、以及預估在目標裝置上的推論效能等。
佈署模型:進入到最後階段,點選 ”Deployment” 設定佈署模型的參數。選擇要佈署的平台為 “Arduino Library”,並且將下方 “Enable EON Compiler” 的選項關閉,目前 ESP32 S3 並不支援此功能,而量化格式選擇為 “int8。完成設定後點選下方的 “Build” 按鈕,Edge Impulse 會將所有需要的程式碼打包成壓縮檔並且自動下載,檔案名稱為 ei-<project name>-arduino-<version>.zip,因此很好區分專案與不同的模型版本。於此即完成了 Edge Impulse 上所有操作,接下來就是實際將程式碼燒錄到 XIAO ESP32S3 Sense 上進行推論了!
佈署到 XIAO ESP32S3 Sense 推論
於筆者落筆之時 ESP32S3 尚未被 Edge Impulse 官方正式支援,若要在 XIAO ESP32S3 Sense 上進行推論尚需以下幾個流程:
- 安裝 Edge Impulse Arduino Library
- Patch ESP-NN
- 修改esp32-camera範例
- 燒錄、運行推論
安裝 Edge Impulse Arduino Library: 開啟 Arduino IDE(筆者使用版本為 2.2.0)在功能列選擇 “Sketch” → “Include Library” → “Add .ZIP Library…”,選擇剛剛從 Edge Impulse 下載的 Arduino Library,檔案名稱以筆者的專案為例是 “ei-esp32s3-dev-arduino-1.0.1.zip”。
Patch ESP-NN: 前往 Marcelo Rovai 大神的 github repo 下載 ESP-NN.zip,解壓縮至 “Arduino\libraries\esp32s3-dev_inferencing\src\edge-impulse-sdk\porting\espressif” 路徑並取代掉原有檔案,留意其中 “esp32s3-dev_inferencing” 為筆者的 Edge Impulse 專案名稱,可能會和各位讀者的操作有所不同。
修改esp32-camera範例:開啟範例 ”<project name>_inferencing” → “esp32” → “esp32_camera”,將原始行號 32~80 之間的 camera 設定參數改由以下的程式段落覆蓋,來對應到實際 XIAO ESP32S3 Sense 的 Pinout。
#define CAMERA_MODEL_XIAO_ESP32S3 // Has PSRAM
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 10
#define SIOD_GPIO_NUM 40
#define SIOC_GPIO_NUM 39#define Y9_GPIO_NUM 48
#define Y8_GPIO_NUM 11
#define Y7_GPIO_NUM 12
#define Y6_GPIO_NUM 14
#define Y5_GPIO_NUM 16
#define Y4_GPIO_NUM 18
#define Y3_GPIO_NUM 17
#define Y2_GPIO_NUM 15
#define VSYNC_GPIO_NUM 38
#define HREF_GPIO_NUM 47
#define PCLK_GPIO_NUM 13#define LED_GPIO_NUM 21
/* Constant defines ——————————————————– */
#define EI_CAMERA_RAW_FRAME_BUFFER_COLS 320
#define EI_CAMERA_RAW_FRAME_BUFFER_ROWS 240
#define EI_CAMERA_FRAME_BYTE_SIZE 3
燒錄、運行推論: 完成以上修改後將檔案另存新檔,就能進行編譯並且燒錄了!燒錄時務必選擇到正確的開發板,同時 PSRAM 選項也要選擇 “OPI PSRAM”(如下圖所示),確保能存取到外掛的 PSRAM。由於函式庫較大,編譯所耗費的時間較長,也請保持耐心稍加等待。
燒錄完成後將要辨識的物體放置於 XIAO ESP32S3 Sense 鏡頭前方,從 Arduino IDE 開啟序列埠監控視窗來觀察辨識到的結果。
筆者同樣是運用影像分類去辨識 LinkIt7697、PICO、TTGO 與背景四個分類。實際測試除了 LinkIt7697 與 PICO 依舊因為高度相似不易辨識出(此為筆著故意安排的比較)之外,TTGO 、 PICO與 Nothing 均能順利辨識出來。每次推論所耗費的時間約為 223 ms, FPS 可超過 4 張,對於 MCU 來說已經算相當不錯了,在沒有精細的時間要求下已算是堪用了!
小結-TinyML 的最強組合
XIAO ESP32S3 Sense 的核心搭載可以說是目前社群討論度非常熱門的 ESP32S3,搭配 Edge Impulse 實踐 MCU 層級的影像分類性價比可說是無人能出其右。即便目前的 Edge Impulse 官方尚未正式支援 ESP32S3,但在社群的助力之下可以藉由 Marcelo Rovai 大神實作的 ESP32S3 TinyML 專案,來實現此熱門開發板的各類 AI 推論應用,相關技術細節也可在 Marcelo Rovai 於 TinyML Talk 線上分享來窺探一二。除此之外 XIAO ESP32S3 Sense 也可以透過板上內建的 MEMS 麥克風搭配 Edge Impulse 實作關鍵字辨識或聲音分類功能,有興趣的夥伴也都能試試看,發掘這套軟硬體組合的潛能!
Maker 玩 AI 系列專欄用深入淺出的方式,介紹 Maker 容易入門的 AI 軟硬體工具,並且以實際案例引領上手。有好用的 AI 軟硬體也歡迎留言討論喔!
(本篇文章經同意轉載自vMaker,原文連結;責任編輯:謝嘉洵。)
- 【開箱實測】OpenVINO榨出單板極限,實作離線LLM AI助理! - 2024/07/25
- 【Maker 玩 AI】Grove Vision AI 模組讓 Arduino 也能玩 YOLO 模型 - 2023/12/26
- 【Maker 玩 AI】Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題 - 2023/12/04