Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題

Edge Impulse

說到近年最強勢的邊緣端 ML 平台,莫過於 Edge Impulse 莫屬了!囊括資料收集、數據標記、模型訓練、模型佈署等眾多功能集成於單一雲端平台上操作。支援的硬體從高階的 x86、NVIDIA Jetson樹莓派到 MCU 層級的 Arduino NiclaPi RP2040 甚至 ESP32 都支援。軟體的易用性搭配硬體的廣泛支援,造就 Edge Impulse 在社大社群上的討論度都勇冠群雄。本篇筆者將實際操作 Edge Impulse 影像分類模型訓練,並且佈署到 XIAO ESP32S3 Sense 這個熱門 MCU 開發板上!

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
Edge Impulse 在社群上擁有極高的討論度

怎麼玩?

在 Edge Impulse 進行模型訓練大致會經過以下七個流程,本篇將會帶領各位讀者逐步進行操作:

  1. 建立專案
  2. 匯入資料
  3. 標記資料
  4. 創建流水線(Impulse)
  5. 資料前處理
  6. 訓練模型
  7. 佈署模型

建立專案:首先到 Edge Impulse 官網進行註冊後登入,建立一個新專案開始操作。

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
建立 Edge Impulse 新專案

接著轉跳到專案總覽(dashboard),這頁面提供專案的資訊一覽以及教學指引,後續要下載模型也可以於此頁面中找到訓練好的模型。

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
專案儀錶板 dashboard

匯入資料:在訓練模型之前必須準備好訓練資料,點選左側選單欄位中的 “Data acquisition”。把資料匯入 Edge Impulse 可以自行上傳檔案或是使用 Client 端設備進行資料採集後上傳。由於筆者預計要使用 XIAO ESP32S3 Sense 做推論,他還沒辦法使用 Client 端直接拍照上傳功能,取而代之必須要先將照片儲存到 SD Card 上,在讀出來上傳。不過筆者這邊打算偷吃步一下,直接使用 Teachable Machine 從電腦的 webcam 做資料收集,並且整包儲存為一個專案檔,內部解壓縮就有涵蓋影像資料在其中了。缺點可能是透過 webcam 蒐集到的影像資料的顏色與變形程度會跟實際推論使用的 camera 會有所不同,但好處則是可以省時許多!而 Teachable Machine 的操作方式可以參考筆者本系列前述的文章,在此就不做贅述了!

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
資料匯入的介面

從 Teachable Machine 匯出的 .tm 檔案實為一個壓縮檔,將其解壓縮後可以得到所有類別的影像資料,其命名規則為 <class name>-!-<number>.jpg,吾等可以將此資料夾內容全數上傳到 Edge Impulse 上在標籤設定即可。於 “Data acquisition” 頁面點選 ”+ Add data” ,彈出對話框中可選擇 “Select a folder” 一次上傳所有照片資料。標籤部分可以先忽略,後續會用篩選方式更新標籤。接著點選 “Upload data” 等待一段時間後即完成上傳。

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
上傳資料對話框

標記資料:上傳完成預設會以 80:20 比例分為訓練資料與測試資料,都可以在 “Data acquisition” 頁面當中查看與編輯,也可在此進行標籤的修改。

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
Data acquisition 的資料檢索

選擇漏斗的圖示,在 “By name” 欄位輸入篩選字串,也就是 teachable machine 上個分類的名稱,輸入後可以一次勾選所有檔案,再點選 “Edit Labels” 按鈕,輸入新的標籤名稱。重複數次後即可完成所有資料的標籤修改。

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
修改所有資料的標籤 Label

創建流水線(Impulse):點選 “Impulse Design” 中的 “Create Impulse” 來創建 Edge Impulse 的工作流水線,輸入資料大小選擇 “96×96″,

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
Create Impulse

接著在第二格虛框中點選 “Add a processing block”,點選 “Image” 右側的 “Add” 按鈕,將正規化處理後的影像資料作為訓練資料輸入。

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
Add a processing block

再來在第三格虛框中點選 “Add a learning block”,點選 “Transfer Learning(Images)” 右側的 “Add” 按鈕,採用遷移學的方式載入預訓練模型權重再次訓練成所需要的模型。

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
Add a learning block

完成後點選右側的 “Save impulse” 完成流水線的設定,以上都是筆者建議入門者的設定參數,若各位之後有興趣研究,都可以回到此階段進行參數調整。

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題

資料前處理:點選 “Impulse design” 中的 “Image”,在此管理要進行訓練的資料內容,對於滾動式更新的輸入資料還可以於此設定與區分不同版本。新的資料在訓練之前需要點選上方 “Generate features” 分頁,接著點選 “Generate features” 按鈕,產生資料特徵與正規化,便利於後續作為訓練資料輸入。

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
generate features

訓練模型:終於要來到訓練模型階段了!點選 “Impulse design” 中的 “Transfer learning”,這邊已經預先載入好遷移學習的訓練參數,包含訓練次數(training cycle)、學習率(learning rate)、神經網路模型(model)等。建議初次使用的夥伴保持預設即可,右上方目標運行的裝置 “Target” 目前還沒有 ESP32S3 的選項,可以選擇較為貼近的 “Espressif ESP-EYE (ESP32 240MHz)”,接著點選下方 “Start training” 按鈕開始進行訓練,右側則會顯示訓練過程的 log 資訊。

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
進行遷移學習 Transfer learning 訓練

等待一段時間過後,當模型訓練完成右方則會顯示此模型的資訊,包含精確度(Accuracy)、混淆矩陣(Confusion matrix)、以及預估在目標裝置上的推論效能等。

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
模型訓練結果資訊

佈署模型:進入到最後階段,點選 ”Deployment” 設定佈署模型的參數。選擇要佈署的平台為 “Arduino Library”,並且將下方 “Enable EON Compiler” 的選項關閉,目前 ESP32 S3 並不支援此功能,而量化格式選擇為 “int8。完成設定後點選下方的 “Build” 按鈕,Edge Impulse 會將所有需要的程式碼打包成壓縮檔並且自動下載,檔案名稱為 ei-<project name>-arduino-<version>.zip,因此很好區分專案與不同的模型版本。於此即完成了 Edge Impulse 上所有操作,接下來就是實際將程式碼燒錄到 XIAO ESP32S3 Sense 上進行推論了!

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
佈署模型

佈署到 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。由於函式庫較大,編譯所耗費的時間較長,也請保持耐心稍加等待。

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
開發板參數設定

燒錄完成後將要辨識的物體放置於 XIAO ESP32S3 Sense 鏡頭前方,從 Arduino IDE 開啟序列埠監控視窗來觀察辨識到的結果。

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
執行影像分類推論

筆者同樣是運用影像分類去辨識 LinkIt7697PICOTTGO 與背景四個分類。實際測試除了 LinkIt7697 與 PICO 依舊因為高度相似不易辨識出(此為筆著故意安排的比較)之外,TTGO 、 PICO與 Nothing 均能順利辨識出來。每次推論所耗費的時間約為 223 ms, FPS 可超過 4 張,對於 MCU 來說已經算相當不錯了,在沒有精細的時間要求下已算是堪用了!

Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
辨識到背景
Maker 玩 AI 系列(十一):Edge Impulse 搭配 XIAO ESP32-S3 實作影像分類專題
辨識到 TTGO 開發板

小結-TinyML 的最強組合

XIAO ESP32S3 Sense 的核心搭載可以說是目前社群討論度非常熱門的 ESP32S3,搭配 Edge Impulse 實踐 MCU 層級的影像分類性價比可說是無人能出其右。即便目前的 Edge Impulse 官方尚未正式支援 ESP32S3,但在社群的助力之下可以藉由 Marcelo Rovai 大神實作的 ESP32S3 TinyML 專案,來實現此熱門開發板的各類 AI 推論應用,相關技術細節也可在 Marcelo RovaiTinyML Talk 線上分享來窺探一二。除此之外 XIAO ESP32S3 Sense 也可以透過板上內建的 MEMS 麥克風搭配 Edge Impulse 實作關鍵字辨識或聲音分類功能,有興趣的夥伴也都能試試看,發掘這套軟硬體組合的潛能![]~( ̄▽ ̄)~*