3. 模型选型原则:给MCU挑个“能跑”的轻量模型

说实话,很多刚入坑嵌入式AI的朋友,第一个问题就是:“我该用哪个模型?”

我见过不少项目,模型在PC上跑得飞起,一部署到STM32上,要么Flash爆了,要么RAM不够,要么推理一次要好几秒。嗯,这就是典型的“选型翻车”。

咱们得明白一个道理:MCU不是GPU。它的Flash、RAM、算力(MIPS)都是按KB和MHz算的。所以,选模型的核心原则就一句话——在精度和资源消耗之间,找到那个最狠的平衡点。

核心选型三要素:

  • Flash:模型权重和代码能塞进去吗?
  • RAM:中间激活值和输入输出缓冲区够用吗?
  • MIPS:每秒能处理几帧?实时性要求能满足吗?

3.1 四大轻量级模型横向对比

我个人习惯,在给STM32选模型时,会先看这四类:TinyML、MobileNetV1、DS-CNN、Temporal Convolutional Networks(TCN)。它们各有各的脾气,咱们一个一个说。

模型类型 典型参数量 Flash占用(8bit量化后) RAM占用(推理时) 适用场景
TinyML 10K ~ 100K 10KB ~ 100KB 2KB ~ 20KB 关键词唤醒、简单手势识别
MobileNetV1 0.5M ~ 4.2M 0.5MB ~ 4MB 100KB ~ 500KB 图像分类、目标检测(高精度需求)
DS-CNN 20K ~ 500K 20KB ~ 500KB 10KB ~ 100KB 音频分类、振动信号分析
TCN 50K ~ 1M 50KB ~ 1MB 50KB ~ 300KB 时间序列预测、传感器数据流

我的经验: 别只看参数量。我遇到过MobileNetV1的0.5M版本,参数量看着不大,但深度可分离卷积的中间激活值特别多,RAM直接飙到400KB。STM32F4系列根本扛不住。所以,RAM才是真正的瓶颈。

3.2 逐个拆解:谁适合你的STM32?

3.2.1 TinyML:极致轻量,但精度有限

TinyML其实不是一个具体的模型,而是一类极简模型的统称。比如DNN(深度神经网络)或者极小的CNN。它的特点就是“小”,小到可以在Cortex-M0上跑。

我曾经在一个项目中,用TinyML做关键词唤醒。模型只有12KB,RAM只用了4KB,在STM32L4上跑一次推理只要5ms。效果嘛,唤醒率95%以上,够用了。

适合场景: 资源极度受限(Flash < 64KB,RAM < 16KB),且对精度要求不高的任务。

3.2.2 MobileNetV1:精度与资源的“妥协大师”

MobileNetV1的核心是深度可分离卷积。它把标准卷积拆成两步:先逐通道卷积,再逐点卷积。参数量和计算量直接降为原来的1/8到1/9。

但要注意,MobileNetV1的宽度乘数(α)和分辨率乘数(ρ)可以调。α=0.25时,模型只有0.5M参数,Flash占用约0.5MB。这在STM32H7系列上是可以跑的。

避坑指南: 我曾经在STM32F767上部署MobileNetV1(α=0.25),Flash勉强够,但RAM爆了。后来发现,问题出在输入分辨率上。我把输入从224x224降到160x160,RAM立刻降了40%。所以,先调分辨率,再调宽度乘数,这是省RAM的捷径。

3.2.3 DS-CNN:音频处理的“老熟人”

DS-CNN(Depthwise Separable Convolutional Neural Network)是专门为音频和振动信号设计的。它和MobileNetV1有点像,但结构更简单,层数更少。

我做过一个电机故障诊断的项目,用DS-CNN处理振动信号。模型只有80KB,RAM占用30KB,在STM32G4上跑一次推理只要2ms。效果比传统的FFT+阈值判断好太多了。

适合场景: 音频分类、振动分析、简单的一维信号处理。

3.2.4 TCN:时间序列的“新贵”

TCN(时间卷积网络)用因果卷积和空洞卷积来捕捉时间依赖。它比LSTM更轻量,而且可以并行计算,非常适合MCU。

我记得有个手势识别的项目,用TCN处理加速度计和陀螺仪的数据。模型200KB,RAM 80KB,在STM32L4上跑一次推理只要10ms。效果比LSTM好,而且不会出现梯度消失的问题。

适合场景: 传感器数据流、手势识别、心率监测等时间序列任务。

3.3 选型决策流程:一张图搞定

你想想看,面对这么多模型,怎么快速选?我一般会走这个流程:

MCU模型选型决策流程 开始:确定任务类型 图像任务?音频任务?时间序列? 图像:MobileNetV1 音频:DS-CNN 时间序列:TCN 评估Flash/RAM/MIPS 评估Flash/RAM/MIPS 评估Flash/RAM/MIPS 满足资源限制? 满足资源限制? 满足资源限制? ✅ 部署到MCU ✅ 部署到MCU ✅ 部署到MCU ❌ 换模型/量化 ❌ 换模型/量化 ❌ 换模型/量化

3.4 实战选型清单:照着做就行

好了,理论说完了,咱们来点实际的。我总结了一个选型检查清单,你每次做项目前,照着过一遍就行。

  1. 确定任务类型:图像?音频?时间序列?还是其他?
  2. 测量MCU资源:Flash还剩多少?RAM还剩多少?CPU主频多少?
  3. 估算模型资源:用netron看模型结构,或者用tflite_convert的--output-format参数导出资源报告。
  4. 对比资源余量:模型占用的Flash和RAM,不能超过MCU总资源的80%。留点余量给系统代码和堆栈。
  5. 评估推理速度:用STM32Cube.AI或者TensorFlow Lite for Microcontrollers的benchmark工具,跑一次推理,看耗时。
  6. 如果超了:先降输入分辨率,再降宽度乘数,最后考虑量化(int8)。
  7. 如果还超:换更轻量的模型,比如从MobileNetV1换到TinyML。

一个小技巧: 我习惯在项目初期,先用STM32Cube.AI的--benchmark模式,直接输入模型文件,它会自动分析出Flash、RAM和MIPS的预估。这比手动算快多了。

3.5 总结:选型没有银弹

说白了,模型选型就是一场资源与精度的博弈。没有哪个模型是万能的。TinyML省资源但精度低,MobileNetV1精度高但吃RAM,DS-CNN和TCN各有专长。

我的建议是:先定任务,再定资源,最后定模型。别一上来就想着用最牛的模型,先问问你的STM32答不答应。