2、AI模型基础与选型:卷积神经网络与轻量级模型

各位同学,欢迎来到第二章。上一章我们聊了STM32CubeAI的整体流程,今天咱们把镜头拉近,看看AI模型本身。

很多初学者一上来就问我:“老师,我该选哪个模型?” 说实话,这个问题没有标准答案。但我可以告诉你,选错了模型,后面全白干。我在一个项目里就吃过这个亏——选了个ResNet-50,在PC上跑得飞起,结果往STM32F4上一烧,Flash直接爆了。嗯,那感觉,就像你给自行车装了个飞机引擎。

所以今天,咱们把模型选型这件事彻底讲透。

2.1 卷积神经网络(CNN)到底在干什么?

先别急着背公式。CNN说白了,就是一台“特征提取机”。

你想想看,一张图片输入进去,计算机看到的只是一堆0到255的数字。它怎么知道这是猫还是狗?CNN的做法是:一层一层地“看”,从最基础的边缘、纹理,到复杂的形状、物体部件。

我习惯把CNN拆成三个核心部件:

  • 卷积层:用一个小窗口(比如3x3)在图像上滑动,提取局部特征。就像你用放大镜看一幅画,每次只看一小块。
  • 池化层:把特征图“压缩”。比如最大池化,就是取一个2x2区域里最大的那个数。这样做的好处是:减少计算量,同时让模型对位置变化不那么敏感。
  • 全连接层:把提取到的特征“拼起来”,然后做分类。说白了,就是“看完所有细节后,下结论”。

核心要点:CNN的深度决定了它能提取多“抽象”的特征。但深度越大,参数越多,MCU就越扛不住。这就是为什么我们需要轻量级模型。

2.2 为什么MCU上不能用大模型?

我直接给你算笔账。

一个标准的VGG-16模型,参数大约1.38亿个。每个参数用32位浮点数存,那就是约528MB。而STM32F4系列的Flash,最大也就2MB。你想想看,差了260多倍。

更别说运行时需要的RAM了。VGG-16一次前向推理,中间特征图占用的内存轻松超过100MB。而STM32的SRAM,通常只有192KB到1MB。

所以,在MCU上跑模型,必须满足三个条件:

  • 参数少:模型大小控制在几百KB以内
  • 计算量小:乘加操作数(MACs)在几百万以内
  • 内存友好:中间特征图不能太大,否则SRAM装不下

避坑指南:我曾经在一个项目里,模型大小只有200KB,但推理时中间特征图占用了300KB的RAM。结果STM32L4的SRAM只有256KB,直接跑不起来。所以选模型时,不光要看模型大小,还要看峰值内存占用。

2.3 轻量级模型三剑客

目前最适合MCU的轻量级模型,我总结了三类。咱们一个一个看。

2.3.1 MobileNet系列

MobileNet是Google推出的,核心思想是“深度可分离卷积”。

传统卷积,一个卷积核同时处理所有通道。而深度可分离卷积,先把每个通道单独处理,再用1x1卷积把通道信息融合。这样做的好处是:计算量直接降到原来的1/8到1/9。

我举个例子:

传统卷积:输入3通道,输出32通道,3x3卷积核
计算量 = 3 x 32 x 3 x 3 x H x W = 864 x H x W

深度可分离卷积:
第一步:3通道分别用3x3卷积,计算量 = 3 x 3 x 3 x H x W = 27 x H x W
第二步:1x1卷积融合通道,计算量 = 3 x 32 x 1 x 1 x H x W = 96 x H x W
总计算量 = 123 x H x W

看到了吗?计算量从864降到了123,整整7倍差距。

我个人习惯用MobileNetV1作为MCU上的首选。为什么?因为它结构简单,没有复杂的残差连接,在STM32上部署起来特别顺畅。

模型 参数数量 模型大小(FP32) 适合MCU?
MobileNetV1 (α=0.25) 0.47M 1.8MB ✅ 适合
MobileNetV1 (α=0.5) 1.34M 5.1MB ⚠️ 需量化
MobileNetV2 (α=0.35) 1.7M 6.5MB ❌ 偏大

实战技巧:MobileNet的α参数是宽度乘数。α=0.25表示把每层的通道数都压缩到原来的1/4。在STM32F4上,我建议用α=0.25的版本,量化到8位后,模型大小只有450KB左右,非常友好。

2.3.2 TinyML模型

TinyML不是一个具体的模型,而是一类专门为微控制器设计的模型。它们的共同特点是:参数极少,通常在几十KB级别。

我推荐两个:

  • TinyConv:只有2到3层卷积,加上1到2层全连接。参数总量在50KB以内。适合做简单的二分类或三分类任务。
  • DS-CNN:深度可分离卷积的极致简化版。Google在TensorFlow Lite Micro里主推的模型。我在一个关键词唤醒项目里用过,效果出奇的好。

但要注意,TinyML模型的能力有限。你不可能指望它去识别1000类物体。我建议:

  • 分类数 ≤ 10 类:TinyML模型完全够用
  • 分类数 10-50 类:考虑MobileNetV1 α=0.25
  • 分类数 > 50 类:建议用更强大的MCU,或者考虑模型剪枝

2.3.3 其他值得关注的模型

除了上面两个,还有几个模型我在项目中试过,效果不错:

  • SqueezeNet:用1x1卷积替代部分3x3卷积,参数比MobileNet还少。但推理速度稍慢。
  • ShuffleNetV2:通道混洗技术,计算效率很高。但实现起来稍微复杂,STM32CubeAI的兼容性需要验证。
  • EfficientNet-Lite:EfficientNet的轻量版,适合有NPU的MCU。普通MCU上跑起来有点吃力。

2.4 选型决策树

说了这么多,到底怎么选?我整理了一个决策流程,你照着走就行:

  1. 先看任务复杂度:几类?图像分辨率多大?
  2. 再看MCU资源:Flash多大?SRAM多大?有没有硬件乘法器?
  3. 然后选模型:按上面的表格对号入座
  4. 最后做量化:FP32转INT8,模型大小直接缩到1/4

我的经验:如果你用的是STM32F4系列(比如F407、F429),我建议优先尝试MobileNetV1 α=0.25,量化到8位。如果Flash还有余量,可以试试α=0.5的版本。对于STM32L4系列,由于Flash较小,建议直接上TinyML模型。

2.5 一个真实的选型案例

去年我做了一个口罩识别项目,要求:

  • 识别戴口罩、没戴口罩、戴得不规范 3种情况
  • 运行在STM32F407上(Flash 1MB,SRAM 192KB)
  • 推理时间 < 500ms

我一开始试了MobileNetV1 α=0.5,量化后模型大小约1.2MB。嗯,Flash装不下。后来换成α=0.25,量化后450KB,完美。推理时间约280ms,完全满足要求。

所以你看,选型不是越强越好,而是刚刚好。

2.6 本章小结

今天咱们把CNN的原理、轻量级模型、选型方法都过了一遍。核心就一句话:MCU上跑模型,轻量是王道,量化是必须

下一章,我会手把手教你用STM32CubeAI把模型部署到开发板上。到时候你会发现,前面这些准备工作,会让你的部署过程顺畅很多。

好,今天就到这里。有问题随时交流。