← 回文章列表

在 ESP32-S3 上跑 AI 模型:ESP-SR、ESP-DL、TFLite Micro 怎麼選?

在 MCU 上跑 AI 模型(TinyML、Edge AI)已經不是新鮮事。而 ESP32-S3 是目前最容易入手的選擇之一:一顆幾美元的晶片,內建 Wi-Fi 和藍牙,還有能加速神經網路運算的向量指令。

這篇不從零教學,而是整理開始動手前最需要知道的事:S3 能做到什麼程度、該用哪個框架、模型要怎麼塞進去。

ESP32-S3 的 AI 能力從哪裡來

項目 規格
CPU 雙核 Xtensa LX7,最高 240 MHz
AI 加速 向量(SIMD)指令,用於加速神經網路與訊號處理
內部記憶體 512 KB SRAM、384 KB ROM
外部記憶體 支援 Octal SPI 的 Flash 與 PSRAM(例如 ESP32-S3-WROOM-2 模組最高 32 MB Flash、16 MB PSRAM)

要特別注意的是:S3 沒有獨立的 NPU。它的 AI 加速來自 CPU 的向量指令,一次可以對多筆資料做相同的運算,非常適合卷積、矩陣乘法這類工作。但你不會直接寫這些指令,而是透過 Espressif 已經最佳化好的函式庫,例如 ESP-NN、ESP-DSP 和 ESP-DL,間接使用。

這個加速效果有多大?以 Espressif 官方的 TFLite Micro 範例為例,在 ESP32-S3(240 MHz)上執行人物偵測模型:

設定 單次推論時間
不使用 ESP-NN 最佳化 2,300 ms
使用 ESP-NN 最佳化 54 ms

同一個模型、同一顆晶片,速度差了四十倍以上。有沒有用到最佳化的運算核心,比模型本身的選擇影響更大。

三條路線怎麼選

Espressif 官方提供三套工具,各自適合不同的需求:

路線 適合 你需要做的事
ESP-SR 喚醒詞、語音指令 幾乎不用碰模型,直接用官方訓練好的
ESP-DL 影像辨識、物件偵測、自己的模型 把 PyTorch / ONNX 模型量化成 ESP-DL 格式
TFLite Micro 已經在用 TensorFlow 生態系 把模型轉成 int8 的 .tflite

路線 1:ESP-SR,語音應用的最短路徑

如果你要做的是「說『嗨,樂鑫』就喚醒裝置,再說『打開燈』來控制」這類應用,不需要自己訓練模型。ESP-SR 已經包好了完整的語音處理流程:

  • AFE(音訊前端):回音消除、雜訊抑制、語音活動偵測、盲源分離
  • WakeNet:喚醒詞偵測
  • MultiNet:語音指令辨識,支援中文和英文,最多 300 條指令。最方便的是,新增指令不需要重新訓練模型,直接設定指令文字就好

MultiNet 只支援 S3、P4 等有足夠運算資源的晶片。想做離線語音控制的 IoT 裝置,這是 S3 最成熟的應用。

路線 2:ESP-DL,影像與自訂模型

ESP-DL 是 Espressif 自己的深度學習推論框架,支援 ESP32-S3 與 ESP32-P4,需要 ESP-IDF v5.3 以上。它的流程是:

PyTorch / TensorFlow 模型
        │ 匯出
        ▼
      ONNX
        │ ESP-PPQ 量化(pip install esp-ppq)
        ▼
   .espdl 模型檔
        │ ESP-DL API 載入與推論
        ▼
     ESP32-S3

幾個特點:

  • 量化:支援 8-bit(w8a8)、16-bit(w16a16),以及權重 8-bit、激活值 16-bit 的混合量化(w8a16)。精度掉太多的層可以改用 16-bit,速度和精度之間有比較大的調整空間
  • 模型格式:.espdl 以 FlatBuffers 為基礎,可以直接用 Netron 開啟檢視
  • 官方範例:包括 YOLO11n 物件偵測、貓咪偵測、OCR 等,可以直接拿來改
  • 持續最佳化:Espressif 在 2026 年 5 月的更新中表示,MobileNetV2 與 YOLO11 在 ESP32-S3 上提速超過 3 倍;卷積運算也支援雙核心排程

開始轉換自己的模型之前,先查 ESP-DL 的運算子支援清單。模型裡只要有一個不支援的運算子,就得回頭修改模型架構。這一步省不得。

路線 3:TFLite Micro,沿用 TensorFlow 生態系

如果你已經熟悉 TensorFlow,或者想用網路上大量的 TinyML 教學與範例,esp-tflite-micro 是最順的選擇。它把 Google 的 TensorFlow Lite for Microcontrollers 移植到 ESP-IDF,並且預設就會用 ESP-NN 加速,也就是上面那個從 2,300 ms 變成 54 ms 的範例。

用 ESP-IDF 的元件管理器加入專案,或直接從官方範例建立新專案:

idf.py add-dependency "esp-tflite-micro"

# 從範例建立專案:hello_world、micro_speech、person_detection
idf.py create-project-from-example "esp-tflite-micro:person_detection"

在電腦上用 TensorFlow 訓練好模型後,轉成全整數量化的 .tflite:

import tensorflow as tf

def representative_data():
    # 提供數百筆真實輸入,讓轉換器估算每一層的數值範圍
    for sample in calibration_samples:
        yield [sample[None, ...].astype("float32")]

converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_data
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8
converter.inference_output_type = tf.int8

with open("model.tflite", "wb") as f:
    f.write(converter.convert())

representative_data 一定要用真實的資料,而不是隨機數。量化的精度取決於轉換器看到的數值範圍是否接近實際情況。

把模型塞進 MCU 的實務要點

1. 記憶體預算才是真正的限制

在 MCU 上,比起「算得夠不夠快」,更常遇到的問題是「放不放得下」。模型需要的記憶體分成兩部分:

  • 權重:模型參數。量化成 int8 後,大小約等於參數數量(每個參數 1 byte)。可以放在 Flash 或 PSRAM
  • 中間運算結果:各層的輸入輸出,也就是 TFLite Micro 的 tensor arena。放在內部 SRAM 最快,但 SRAM 總共只有 512 KB,還要分給 Wi-Fi、藍牙和你的應用程式

影像和語音應用幾乎都需要 PSRAM。挑開發板時,選有 8 MB 以上 PSRAM 的版本(例如型號帶 R8 的 ESP32-S3),可以省掉很多麻煩。

2. 一律量化成整數

浮點模型在 S3 上又大又慢。int8 量化能讓模型大小縮小到約四分之一,而且只有整數運算才吃得到向量指令的加速。如果量化後精度下降太多,可以考慮:

  • 改用量化感知訓練(QAT),讓模型在訓練時就適應量化誤差。ESP-DL 的 YOLO11n 範例就是用 QAT
  • 在 ESP-DL 中把敏感的層改用 16-bit

3. 從小模型開始

MCU 上適合的是專門為邊緣裝置設計的架構,例如 MobileNet、YOLO 的 nano 版本,或者自己設計的小型 CNN。先確認小模型在晶片上跑得動、精度可以接受,再逐步加大,而不是把電腦上的大模型硬塞進去。

輸入解析度也是重要的調整旋鈕:影像從 224×224 降到 96×96,運算量大約少了五倍。

4. 在晶片上量測,不要只看電腦上的結果

量化後的精度、實際推論時間、記憶體峰值,都要在 ESP32-S3 上實際量測。電腦上的 int8 模擬結果,和晶片上的實際表現不一定一致。

S3 適合做什麼、不適合做什麼

適合:

  • 離線語音控制:喚醒詞與指令辨識(ESP-SR)
  • 低解析度影像:人物偵測、簡單物件偵測、人臉偵測
  • 感測器資料:振動異常偵測、手勢辨識、預測性維護
  • 對隱私或網路有要求的場景:資料不必上傳雲端

不適合:

  • 大型語言模型(LLM):記憶體差了好幾個數量級
  • 高解析度、高幀率的即時影像分析
  • 需要頻繁更換大型模型的應用

如果需要更強的運算能力,Espressif 的 ESP32-P4 是下一個選擇。ESP-DL 同樣支援它,可以沿用相同的工具鏈。

小結

在 ESP32-S3 上跑 AI,最重要的不是追求最新的模型,而是:

  1. 選對路線:語音用 ESP-SR,影像或自訂模型用 ESP-DL,TensorFlow 使用者用 TFLite Micro
  2. 確保用到最佳化的運算核心:有沒有用到最佳化,速度可以差四十倍
  3. 先算記憶體預算:決定模型大小的,通常是記憶體而不是運算速度
  4. 一律量化、在晶片上量測

一顆幾美元的 MCU 能在本地完成語音辨識或物件偵測,對 IoT 產品來說,代表更低的延遲、更低的雲端成本,也讓資料不必離開裝置。

資料來源