如何在 STM32 微控制器上執行「Hello World」機器學習模型
資料提供者:DigiKey 北美編輯群
2022-08-18
機器學習 (ML) 在伺服器和行動應用中已風靡多年,目前更轉而成為邊緣設備的必備要素。由於邊緣裝置需要考慮能效,因此開發人員必須學習並瞭解如何在微控制器型系統中部署 ML 模型。在微控制器上執行的 ML 模型通常稱為 tinyML。遺憾的是,在微控制器上部署模型並非易事。不過此任務已經越來越簡單,即使是沒有接受過任何專門訓練的開發人員,也能及時辦到。
本文將探討嵌入式開發人員如何開始使用 STMicroelectronics 的 STM32 微控制器進行 ML。為此,本文將說明如何使用 X-CUBE-AI,將微控制器 TensorFlow Lite 模型轉換成適用於 STM32CubeIDE 的形式,以建立「Hello World」應用程式。
tinyML 使用案例簡介
TinyML 的應用領域不斷擴大,通常可透過深度神經網路,能將 ML 的能力引進到資源與電力有限的裝置 (如微控制器) 中。這些微控制器裝置之後就能執行 ML 模型,並在邊緣端完成許多重要工作。有幾個使用案例可看出 tinyML 的妙用。
第一個使用案例在許多行動裝置和居家自動化設備中都能看到,那就是關鍵詞辨識。關鍵詞辨識能讓嵌入式裝置使用麥克風擷取語音,然後偵測經過訓練的關鍵詞。tinyML 模型採用時序輸入代表語音,再將輸入訊號轉換為語音特點 (通常會轉換為頻譜圖)。頻譜圖包含隨著時間變化的頻率資訊。然後將頻譜圖饋送至訓練過的神經網路以偵測特定單詞,就可得到偵測出特定單詞的機率。圖 1 為此過程的範例說明。
圖 1:關鍵詞辨識是有趣的 tinyML 使用案例。輸入的語音訊號會轉換成頻譜圖,然後饋送至訓練過的神經網路,以判斷訊號中是否有預先訓練過的關鍵詞。(圖片來源:Arm®)
許多嵌入式開發人員感興趣的另一個 tinyML 使用案例就是影像辨識。微控制器可透過攝影機擷取影像,再將影像饋送至預先訓練好的模型中。此模型能識別影像內容,例如影像裡是否有貓、狗、魚等等。有個在邊緣端採用影像辨識的絕佳範例就是視訊門鈴。視訊門鈴通常能夠偵測門口是否有人,或者是否有包裹放在門口。
最後有個很受歡迎的 tinyML 使用案例就是預測性維護。預測性維護會採用 ML,依據異常偵測、分類演算法和預測性模型,來預測設備的狀態。預測性維護的應用範圍相當廣泛,可涵蓋 HVAC 系統到廠區設備。
雖然上述三項是目前最受歡迎的 tinyML 使用案例,但無疑還有許多仍待開發人員發掘的潛在使用案例。以下簡單列出一些使用案例:
- 手勢分類
- 異常偵測
- 類比儀表抄表器
- 導引與控制 (GNC)
- 包裹偵測
無論是何種使用案例,開始使用並熟悉 tinyML 的最佳方式就是透過「Hello World」應用程式。這有助於開發人員學習並瞭解基本流程,接著就可依此流程,架設精簡系統並開始運行。要在 STM32 微控制器上運行 tinyML 模型有五個必經步驟:
- 資料擷取
- 資料標記
- 神經網路訓練
- 模型轉換
- 在微控制器上運行模型
擷取、標記與訓練「Hello World」模型
一般而言,開發人員有多種方式可用來擷取和標記模型訓練所需的資料。首先,現在有很多線上訓練資料庫。開發人員可以搜尋其他人已經收集並標記的資料。例如,若是基本的影像偵測,就可參考 CIFAR-10 或 ImageNet 資料庫。如果要訓練模型來偵測照片中的笑臉,也已經有相關的影像資料集可供使用。線上資料儲存庫是相當不錯的起點。
如果網路上找不到可用的公開資料,另一個方法就是由開發人員自行產生資料。可以利用 Matlab 或其他工具產生資料集。如果無法自動產生資料,則可手動進行。最後,要是手動產生資料太過耗時,網路上也有些資料集可供購買。收集資料往往最有趣且令人興奮,雖然這也是最費力的工作。
此處列舉的「Hello World」範例將說明如何訓練模型產生正弦波,再將其部署到 STM32。這項範例由 Pete Warden 和 Daniel Situnayake 統整;這是他們在 Google 負責的微控制器 TensorFlow Lite 專案一部份。這可讓工作更加輕鬆,因為他們已經把模型的擷取、標記和訓練流程統整成簡單易懂的教學內容,並且公開發佈。此內容可在 Github 取得;進入網站後,開發人員只要按「在 Google Colab 中執行」按鈕即可。Google Colab 是 Google Collaboratory 的簡稱,能讓開發人員在瀏覽器中編寫及執行 Python,無需任何組態,並可免費存取 Google GPU。
完成訓練範例後的輸出結果會包含兩個不同的模型檔案:一個是針對微控制器量化的 model.tflite TensorFlow 模型;另一個是未量化的 model_no_quant.tflite 模型。量化結果可指出模型的啟用和偏置如何以數值方式儲存。量化版產生的模型較小,更適合用於微控制器。若好奇訓練後的模型結果與實際的正弦波結果有何不同,可參見圖 2。模型的輸出結果以紅色標示。雖然正弦波的輸出結果並不完美,但對「Hello World」程式而言已經夠用。
圖 2:TensorFlow 模型正弦波預測值與實際值的比較結果。(圖片來源:Beningo Embedded Group)
挑選開發板
探討如何轉換 TensorFlow 模型以便在微控制器上運行之前,需要先挑選可部署在模型中的微控制器。本文將著重探討 STM32 微控制器,因為 STMicroelectronics 擁有許多適用於轉換和運行模型的 tinyML/ML 工具。此外,STMicroelectronics 還有一系列零件可相容於 ML 工具 (圖 3)。
圖 3:STMicroelectronics 的 AI 生態系統目前支援的微控制器和微處理器單元 (MPU)。(圖片來源:STMicroelectronics)
如果您的辦公室剛好有上述其中一種開發板,則非常適合用來建立和執行「Hello World」應用程式。然而,如果您想要比此範例更深入,對手勢控制或關鍵詞辨識等領域更感興趣,則可選擇 STM32 B-L4S5I-IOT01A 探索物聯網節點 (圖 4)。
此開發板搭載以 STM32L4+ 系列為基礎的 Arm Cortex®-M4 處理器。此處理器內建 2 MB 快閃記憶體和 640 KB RAM,因此有足夠空間放置 tinyML 模型。此模組可依 tinyML 使用案例實驗進行調整,也因為配備 STMicroelectronics 的 MP34DT01 微機電系統 (MEMS) 麥克風,因此可用於開發關鍵詞辨識應用。此外,板載 LIS3MDLTR 三軸加速計也是 STMicroelectronics 的產品,可用於 tinyML 手勢偵測。
圖 4:STM32 B-L4S5I-IOT01A 探索物聯網節點配備 Arm Cortex-M4 處理器、MEMS 麥克風和三軸加速計,是可依 tinyML 進行調整的實驗平台。(圖片來源:STMicroelectronics)
使用 STM32Cube.AI 轉換與執行 TensorFlow Lite 模型
在具備可用於執行 tinyML 模型的開發板後,開發人員就可開始將 TensorFlow Lite 模型轉換成能在微控制器上運行的形式。雖然 TensorFlow Lite 模型可以直接在微控制器上運行,但需要在執行階段環境中才能處理。
模型運行時,需要執行一系列功能。這些功能包括收集感測器資料、進行過濾、擷取必要的特點,再將這些特點饋送至模型中。模型會產生結果,結果可以進一步過濾,然後 (通常會) 再採取一些行動。圖 5 是以上流程的概覽。
圖 5:資料流如何從感測器流至執行階段,再輸出至 tinyML 應用程式。(圖片來源:Beningo Embedded Group)
STM32CubeMx 的 X-CUBE-AI 外掛程式可提供解譯 TensorFlow Lite 模型用的執行階段環境,並提供開發人員可運用的其他執行階段及轉換工具。X-CUBE-AI 外掛程式在專案中預設為不啟用。不過在建立新專案並初始化開發板後,可前往 [軟體套件] -> [選擇元件] 來啟用 AI 執行階段。此處有多個選項;請確認選用本範例的應用程式範本,如圖 6 所示。
圖 6:請務必選用本範例的應用程式範本,以啟用 X-CUBE-AI 外掛程式。(圖片來源:Beningo Embedded Group)
X-CUBE-AI 啟用後,STMicroelectronics X-CUBE-AI 類別就會顯示在工具鏈中。點選該類別,開發人員就能選擇要建立的模型檔案,並可設定模型參數,如圖 7 所示。分析按鈕還可對模型進行分析,並為開發人員提供 RAM、ROM 和執行週期資訊。強烈建議開發人員針對 Keras 和 TFLite 模型選項進行比較。在正弦波模型範例中,兩者的差異不大,但仍可看出區別。然後,開發人員可以點選「產生程式碼」來建立專案。
圖 7:分析按鈕可為開發人員提供 RAM、ROM 和執行週期資訊。(圖片來源:Beningo Embedded Group)
程式碼產生器會初始化專案,並為 tinyML 模型建置執行階段環境。不過在預設情況下,不會饋送任何資料給模型。開發人員需要新增程式碼以提供模型輸入值:x 值,接著模型將會解譯這些數值並產生正弦 y 值。需要新增幾段程式碼到 acquire_and_process_data 和 post_process 函數中,如圖 8 所示。
圖 8:在此顯示的程式碼會將假的感測器輸入值連接至正弦波模型。(圖片來源:Beningo Embedded Group)
此時,這個範例就已準備好可以運行了。備註:可新增一些 printf 陳述式取得模型輸出,以利快速驗證。快速編譯和部署就能讓「Hello World」tinyML 模型投入運作。模型輸出的正弦波完整週期結果如圖 9 所示。雖然結果不夠完美,但對於初試 tinyML 應用而言,已經很好了。此後開發人員就能將輸出與脈寬調變器 (PWM) 連結,即可產生正弦波。
圖 9:在 STM32 上執行「Hello World」的正弦波模型輸出結果。(圖片來源:Beningo Embedded Group)
在嵌入式系統上執行 ML 的秘訣與技巧
若開發人員想在微控制器型系統上執行 ML,有不少前置作業要完成,才可首次建立及執行 tinyML 應用程式。然而,開發人員需謹記幾項「秘訣與技巧」,即可簡化並加速開發:
- 熟悉 TensorFlow Lite 微控制器的「Hello World」範例,包括 Google Colab 檔案。花點時間調整參數,並瞭解參數對訓練後的模型有何影響。
- 在微控制器應用中使用量化版模型。量化版模型會經過壓縮,以配合 uint8_t 而非 32 位元浮點數。這樣一來,模型會變得更小,運作速度也會加快。
- 探索 TensorFlow Lite 微控制器資源庫裡的其他範例,包括手勢偵測和關鍵詞偵測。
- 以「Hello World」為例,將模型輸出連接到 PWM 和低通濾波器,查看產生的正弦波結果。在執行階段中進行實驗,增加和減少正弦波的頻率。
- 挑選內建「額外」感測器的開發板,如此一來,就能嘗試各種不同的 ML 應用。
- 雖然收集資料相當有趣,但一般而言,購買或使用開源資料庫來訓練模型較為省事。
開發人員若遵循這些「秘訣和訣竅」,便可省下很多時間與麻煩,又可確保應用程式順利運行。
結論
ML 已拓展到網路邊緣,資源有限的微控制器型系統自然是 ML 邁進的主要目標。目前最新的工具已可轉換 ML 模型並將其最佳化,以便在即時系統上運行。如本文所述,在 STM32 開發板上建立並執行模型相對容易,但其中仍牽涉一些複雜的問題。雖然本文只探討產生正弦波的簡易模型,但實際上在系統上建置如手勢偵測和關鍵詞辨識等更複雜的模型也可行。

聲明:各作者及/或論壇參與者於本網站所發表之意見、理念和觀點,概不反映 DigiKey 的意見、理念和觀點,亦非 DigiKey 的正式原則。