ST Model Zoo够用吗?嵌入式AI还要自己设计模型吗?
ST不是已经有Model Zoo了吗直接拿现成模型用不就行了——这是我在ST中文社区和线下嵌入式交流会上最近几个月被问得最多的一句话。问的人有做工业设备的、有做消费电子的也有刚转嵌入式AI的学生。他们的逻辑都一样反正ST意法半导体官方把预训练模型都做好了我们这些搞应用的人何必再从零折腾网络结构、训练、量化这一大堆事这个逻辑有没有道理有但只有一半。另一半等你真正把一个模型装进你的产品、面对真实客户数据的时候才会慢慢明白。这篇文章我打算把这件事彻底聊透ST的Model Zoo到底提供了什么什么样的项目可以直接用它什么样的项目必须自己设计模型以及夹在两者之间的迁移学习怎么做。我会结合自己做嵌入式AI项目的实际经历来写有些坑该踩的我都替你踩过了。1. 先把话说清楚ST 的 Model Zoo 到底给了我们什么1.1 名字容易搞混的三件套先说个前置知识很多人把ST在嵌入式AI上的东西混成一谈其实有三样。STM32Cube.AI这是一个工具/插件负责把你的模型转换成能在STM32上跑的C代码。你训练好的Keras、TFLite或ONNX模型经过它一转换就变成可以在MCU上做推理的库函数。STM32 Model Zoo这是一个GitHub仓库里面是一堆针对STM32优化好的预训练模型附带完整的部署配置、在官方开发板上的性能基准。这是模型从哪来的部分。NanoEdge AI Studio这是一个自动化建模工具你喂给它正常/异常数据它自动帮你搜索并生成一个合适的轻量模型。它不给你现成模型而是帮你从数据里设计模型。很多人问用Model Zoo是不是就不用碰Cube.AI了完全是误会。Model Zoo只是把训练好的模型和参考部署脚本给了你真正要塞进STM32仍然要过一遍Cube.AI转换。你可以把Model Zoo理解为菜谱和半成品食材Cube.AI是你的锅和灶。顺便说一句ST这个词在不同语境里含义很多。做算法竞赛的朋友可能会想到ST表Sparse Table写C的朋友可能搜到过std::reverse被手滑打成了st d reverse——但在嵌入式圈子里ST就是指意法半导体。1.2 我实际翻了一遍仓库里面真正能用的东西去GitHub上把STM32 Model Zoo翻过一遍大致是这么几类模型类型常见结构典型用途图像分类MobileNet v1/v2/v3、ResNet变体目标类别识别、物料分类目标检测YOLO变体、SSD等人/车/物品检测、流量统计音频/关键词识别小型CNN、KWS模型语音唤醒词、简单声音识别姿态估计关键点检测网络人体姿态、动作识别部分版本有每个模型不是光秃秃一个权重文件那么简单通常还带着训练代码和数据集说明已经做好的INT8量化版本这个对MCU很关键在ST官方开发板上实测过的性能表推理帧率、Flash占用、RAM占用CubeMX和Cube.AI的参考配置工程。也就是说官方替你做了不少脏活选结构、训练、量化、验证、跑基准。你只要照着文档把它导入工程就能在开发板上看到效果。对想做快速验证的人来说这个过程相当友好。1.3 一个残酷事实模型库里的模型都是参考设计但我必须把话说直白Model Zoo的定位是参考设计不是产品方案。它的目的是向你展示这块芯片配合这套工具链AI能力能做到什么程度帮你评估平台、设定预期、快速跑通端到端流程。它不等于你的产品可以直接拿它来推理。原因也很简单这些模型都是在公开数据集上训练的。ImageNet里有猫、狗、汽车、飞机有工人、办公室、街道但它没有你车间里那台设备在特定光照下的表面划痕没有你客户那边配电柜里轴承缺油的那种异响也没有你们公司产品装配线上那种只有3毫米的瑕疵。用宜家样板间来类比最合适你去样板间看一圈知道了这个户型能装成什么样、需要多少预算但你不可能直接把样板间整个搬回家住。你得按自己的房型、生活动线、收纳习惯重新改。2. 为什么直接用现成模型这个诱惑这么难拒绝2.1 它确实解决了嵌入式AI最脏最累的活这几年整个AI行业聊得最多的是开源模型的质变动辄百亿参数、可以在消费级设备上跑的大模型层出不穷。但我要先泼一盆冷水那是云计算和桌面端的逻辑和MCU上跑AI是两条完全不同的赛道。ST Model Zoo里的模型哪怕最大的也就几MB跟大模型这个词不在一个量级上。但正因为这样直接用现成模型这句话在小模型世界里反而更有诱惑力——因为它的确省事。我从来不反对先用现成模型。实际上我自己的项目流程里第一步永远是找一个现成模型先把端到端跑通。理由很实在省数据对多数中小团队来说采集、清洗、标注数据是最大的成本。现成模型至少能让你在拿到数据之前就把流程走通。省训练训练一个像样的网络哪怕在GPU上也要几小时到几天还要盯着loss曲线、做过拟合处理。用现成模型这段全免。省优化MCU上部署最难的不是训练而是后续的量化、裁剪、算子适配。官方模型已经把量化版本和部署工程做好了。省评估官方给出了性能基准你在做方案论证的时候可以直接用这些数字估时间、估成本不用等板子到手才知道行不行。所以如果你是做预研、做Demo、做竞标演示或者在评估这个MCU能不能扛起这个AI任务Model Zoo是效率最高的起点。我自己做可行性评估的时候基本就是先拿官方模型跑一遍用数据说话。2.2 免费午餐的边界在哪里免费的部分是通用的特征提取能力。一个在ImageNet上训练过的网络它前几层已经学会了如何识别边缘、纹理、形状、色彩渐变这些能力对所有图像任务都有价值。不免费的部分是对你的场景做最终判断的能力。深层的分类边界是完全面向原数据集的——它把猫和狗分得很清楚不代表它也分得清合格焊点和虚焊焊点。所以直接用官方模型真正成立的条件是下面几项同时满足你的目标类别在模型训练数据集中很常见人、车辆、宠物、常见物体你的输入数据形态和训练数据接近普通可见光图像、常见音频采样率你的精度要求不是极致有个八、九成能用就行你主要做演示、验证或内部工具不出货给最终客户。这几条都满足直接用就是最优解。但做产品的人心里都清楚这几条往往同时不满足。2.3 从实际项目看什么时候官方模型一装就灵举两个真实例子。有一回我们做一个展厅的人流统计方案用的是官方目标检测模型类似YOLO的轻量变体跑在STM32H7上。效果出乎意料地好——因为人这个类别在COCO数据集里是最大类的存在模型见过的行人姿态、穿着、角度都非常多。从Demo到小批量部署基本没有返工。另一个例子是门禁场景的口罩识别。公开数据集中口罩类别非常充足官方模型稍微一微调就能用。这种场景你确实没必要自己设计什么新网络结构。这两个例子的共同点是目标类别被大规模公开数据集覆盖环境相对固定输入质量可控。碰到这种情况老老实实去用现成模型省下来的时间可以做更有价值的事。3. 哪些场景下官方模型库会尴尬到你必须自己动手3.1 数据分布错位这是绝大多数翻车现场的总根源先说清楚一个问题模型训练和实际推理之间有一个数据分布的概念通俗讲就是模型见过的东西和你让它看的东西是不是一类。Model Zoo里的模型见过ImageNet没见过你的产线。这种错位在工业场景里几乎是必然的表面缺陷检测划痕、脏污、色差、压伤、特定物体识别某种型号的汽车零件、某种茶叶的包装缺陷、特定声音识别泵的异响、轴承故障这些目标类别在公开数据集里要么完全没有要么少到可以忽略。我朋友做过一个项目识别普洱茶饼的包装缺陷。好茶饼和有凹陷的茶饼的差异极其细微而且判断标准是他们工厂自己的质检规范。这种任务拿什么现成模型都没用因为全世界只有他们手里那几千张图包含了这个知识。这种情况只能走自己采集数据自己设计/微调模型这条路。3.2 任务类型覆盖不到分类检测之外的需求怎么办Model Zoo的模型以图像分类、目标检测、语音关键词识别为主。但嵌入式AI的很多需求根本不在这个范围内回归任务预测电池剩余电量、预测电机负载、估算振动量的变化趋势。分类模型干不了这个你需要的是一个输出连续值的回归模型。我见过不少团队直接用LightGBM这类传统机器学习模型做回归效果比硬套神经网络好得多模型也小得多。异常检测很多设备只有正常数据异常样本非常稀有。你没法训练一个没见过异常的分类器。经典的思路是做重构误差检测或单类分类Model Zoo里没有这种现成货。时序分类基于滑动窗口的振动波形、电流波形分析。这需要一维卷积或TCN结构而Model Zoo主要是二维视觉模型。你至少要在数据处理和网络结构上做大量改造。图像分割如果需要给图片逐像素分类比如焊缝区域的像素级分割Model Zoo基本没有直接能用的模型UNet那类结构往往要自己搭、自己训。说白了官方模型库只是在几个常见任务方向上准备了参考实现。你的任务稍微偏一点整条链路就要自己来。3.3 资源约束比官方基准更极端MCU不是开发板官方性能基准跑在ST自家的评估板上用的通常是H7、F4这类中高端芯片Flash和RAM给得非常宽裕。而实际产品里的MCU可能只是G0、L0这类小资源型号而且Flash/RAM还要同时分给RTOS、通信协议栈、文件系统、UI留给AI的可能只有几十KB。这时候你会碰到一个很现实的问题官方模型对你而言依旧太大。要么加大量化力度要么缩小输入分辨率要么削减通道数要么换更小的结构。而这些动作几乎每一步都意味着你要重新训练或至少做微调已经不是直接拿来用了。我在这些项目里经常想起深度学习圈子里说的低显存运行模型——本质都是在有限资源里抠空间只是MCU上抠的是Flash和RAM比显存抠得更狠。你在抠的时候官方模型超配的问题就变得很刺眼。3.4 公开模型的安全隐患模型中毒不是危言耸听还有一个容易被忽略的点公开模型库有安全风险。学术界这些年反复讨论过模型中毒backdoor attack / poisoning attack——攻击者可以向训练数据或预训练模型里植入触发器让模型在特定条件下产生错误输出。在Demo、玩具、内部工具里这无所谓。但如果你做的是工业控制、安防、医疗辅助这类对可靠性要求高的产品直接拿一个来源不明的预训练模型就上线数据链路完全不可控这本身就是风险。至少你应该自己重训或者微调一遍确保模型的行为你心里有数。注意我不是让大家因噎废食——Model Zoo毕竟是官方渠道可信度比第三方网盘资源高得多。但官方发布不等于免疫一切风险有条件的话模型版本管理、验证集测试这些流程该上还是得上。4. 自己设计模型的完整工作流从约束到板端验证如果前面的分析让你决定自己动手那接下来的问题是怎么做才靠谱我按自己踩过坑之后沉淀下来的流程写一遍。4.1 先算清楚预算Flash、RAM、时延、功耗四本账自己设计模型的第一步不是画网络结构而是算账。目标芯片的资源是有限的你得先知道预算再设计模型。Flash预算模型权重以INT8存储时每1万参数约占10KB Flash。一个50万参数的模型权重就占500KB。还要加上代码体积和运行时库。RAM预算推理时的中间激活值往往比权重更占内存。输入输出的张量、每一层的特征图、以及临时缓冲峰值可能比权重还高。时延预算粗略估算时可以用每百万乘加运算需要多少毫秒来框算具体数值要等板端实测。关键是先定一个可接受的上限比如100ms。功耗预算一次推理耗电多少取决于推理时间和平均电流。如果产品用电池供电每天推理次数和单次功耗决定了电池寿命。我自己的习惯是第一版模型在总预算上留50%的余量。因为后面大概率要加功能、加算子、加数据缓存预算全占满的话任何一个改动都可能把工程逼进死胡同。4.2 数据是最难的一关嵌入式场景的数据为何稀缺自己设计模型的另一大难关是数据。产品还没量产传感器还没铺出去现场数据根本不存在就算有样机采集回来的原始信号也充满噪声、缺标签、时序不齐。我的经验是搭建一个最小数据采集系统尽量在真实工况下采集不要偷懒用仿真数据冒充。仿真数据和真实数据的差异会在模型部署后报复你。用滑动窗口把长序列切成固定长度样本。切窗长度既要有物理意义比如一个完整的机械旋转周期的振动也要匹配模型输入要求。窗口之间加一点重叠相当于免费扩增数据。数据增强要物理正确。图像加噪声、亮度扰动没问题时间序列做幅度缩放、轻微时间扭曲没问题但把图像随便旋转90度对工业缺陷检测可能就是灾难因为你实际根本不关心倒着的缺陷。另外标注成本高时别硬着头皮攒大几千张数据。优先走少量数据迁移学习路线后面第5章会细讲。4.3 结构选型轻量网络的三个方向自己设计模型不等于发明新网络。绝大多数情况下你是在已经有理论验证的结构里做裁剪和变体。轻量CNN以深度可分离卷积为主的MobileNet系列适合图像任务。它用先深度卷积再逐点卷积的方式把计算量降了一个数量级是MCU上最常用的视觉骨干。一维时序模型TCN、时序卷积网络适合振动、电流、声音波形。它们在实现上就是一维卷积Cube.AI支持很好。RNN/LSTM在MCU上部署不友好循环展开容易把时延和内存顶爆。传统机器学习模型LightGBM、随机森林等结构化模型适合从信号里手工提特征再建模。很多MCU上跑这类推理比神经网络还快。如果任务能回归、能做成结构化输入别不好意思用传统方法。还有一句话我必须说别被Transformer的热潮带偏。云端跑大模型和MCU跑轻量网络是两条完全不同的赛道。在几十KB内存的芯片上做时序建模一维卷积大概率比一个注意力变体稳定得多。你要是真的对序列依赖有硬需求先去看看有没有成熟的线性复杂度变体不要直接照搬标准Transformer。4.4 训练与量化为什么我坚持用 QAT 而不是 PTQ模型训练完之后部署到MCU上几乎必然要转成INT8。这里有一个关键选择训练后量化PTQ还是量化感知训练QAT。对比项PTQ训练后量化QAT量化感知训练做法模型训完后直接用校准集统计量化参数训练过程中模拟量化误差让权重适应离散值精度损失小模型上掉点明显可能超过3-5%通常控制在1%以内实现难度简单不需要改训练代码需要训练代码要插入伪量化节点适用情况模型有冗余、时间紧、快速验证模型很小、精度敏感、正式产品我的经验是MCU上跑的模型本来就不大冗余很有限PTQ掉点经常掉到不能接受QAT虽然麻烦但在小模型上是值得的。这也是为什么从Model Zoo里拿现成模型有时反而尴尬——它给了你量化好的权重但没给你完整的QAT训练脚本你想重训还得自己复原整个训练流程。这时候要不要自己设计模型就有了另一个层面的答案设计一个自己能完全掌控训练流程的模型部署阶段会顺手很多。4.5 部署Cube.AI 转换时的算子兼容检查模型训练好之后用STM32Cube.AI转成C代码。这个环节最常翻车的不是转换本身而是算子兼容性不是所有PyTorch/Keras算子都支持。自定义层、动态控制流、某些高级激活函数可能在Cube.AI的算子支持列表之外。ONNX中间格式的算子版本不匹配也是常见问题。尽量用Cube.AI文档里推荐的训练框架和版本。预处理尽量放在模型外面做用C语言实现别把resize、归一化这些操作塞进模型里当算子——转换麻烦运行也慢。命令行转换大概是这个风格示意stm32ai generate -m my_model.tflite \ --name my_model \ --output ./stm32ai_output \ --type tflite转换完成后会生成一个性能报告里面包含各层的Flash/RAM占用和推理周期估算。这个报告要留着后面板端实测要拿它对照。4.6 板端验证别只盯着准确率模型在PC上准确率再高都不算数。上板之后你要测的是这几样推理时间用GPIO翻转或硬件定时器测单次推理时间跑几十次取平均比Cube.AI报告里的估算更可信。内存峰值Cube.AI报告会给出静态RAM占用但动态缓冲和系统其他模块的占用要靠实际链接后确认。链接报错超RAM是家常便饭。真机数据用现场采集的、模型没见过的一段数据流去测别用训练集或验证集糊弄自己。这一步能暴露光照变化、噪声、传感器漂移造成的真实表现。功耗用电流探头实测平均电流和峰值电流结合推理频率算连续工作功耗。我还会为每个版本建一张模型卡记下模型结构、参数量、训练数据版本、量化方式、验证精度、实测时延、Flash/RAM占用。没有这张卡迭代三个版本之后你就会彻底记不清哪个版本对应哪次实验。5. 更聪明的折中在官方模型上做迁移学习5.1 迁移学习为什么在这里特别合适自己设计模型听着爽但成本和风险也高。实际上大部分项目有一个比从零设计聪明得多的中间路线迁移学习。还记得前面说的吗预训练模型的前几层是通用的特征提取器。所以完全没必要从随机初始化开始训练。把官方模型当作学会了看世界的基础功的人你只需要教会它你们车间里什么样的焊点算合格。这比从零训练省数据、省时间比直接用现成模型贴合你的私有数据。我在做迁移学习时有个类比官方模型像一位已经认识一万种物体的实习生你对他的要求只是再认识一下你们公司的三百种产品缺陷。教一个懂行的人学新东西总比教一个婴儿从零认识世界快得多。5.2 实操加载官方模型、冻结主干、换分类头以Keras/TFLite为例思路是这样的代码示意具体层名以实际模型为准import tensorflow as tf # 加载ST Model Zoo里的预训练模型 base_model tf.keras.models.load_model(st_mobilenetv2_quant.h5) # 冻结骨干网络先不更新权重 base_model.trainable False # 找到倒数第二个特征层接上新的分类头 feature base_model.get_layer(global_average_pooling2d).output x tf.keras.layers.Dense(128, activationrelu)(feature) x tf.keras.layers.Dropout(0.3)(x) out tf.keras.layers.Dense(num_classes, activationsoftmax)(x) model tf.keras.Model(inputsbase_model.input, outputsout) model.compile(optimizertf.keras.optimizers.Adam(1e-3), losscategorical_crossentropy, metrics[accuracy])关键点在于先把骨干冻结住只训练新加的分类头让随机初始化的那几层先学会用已有的特征。第一轮跑通之后再解冻后面一部分层比如最后两三个卷积块用很小的学习率1e-4甚至更低做一轮微调。这个先冻结后解冻的顺序能避免随机初始化的分类头在刚开始就把骨干网络的梯度带偏。5.3 只有几百张图时怎么微调才不翻车现实痛点往往是数据少。少到只有几百张标注图怎么办根基在预训练特征数据越少越不要训练太深的层。很多时候只训练分类头就足够连解冻微调都可以不做。增强要做够图像加噪声、翻转、裁剪、亮度扰动都要上。但要注意物理正确工业场景别做无意义的旋转。学习率一定要小1e-3到1e-4这个量级是安全的。用大学习率微调预训练模型几轮就会把之前学好的特征破坏掉。盯紧验证集如果训练精度一直涨而验证精度开始掉说明模型在死记硬背训练集赶紧Early stopping。这里还有个很实用的小技巧你可以把预训练模型当成一个特征提取器把每张图过一遍网络取出中间层的特征向量然后用SVM这类经典方法在这个特征向量上做分类。很多情况下这个特征线性分类器路线比端到端微调更稳尤其数据量极小的时候。这跟深度学习圈里Embedding模型的用法是同一个道理——先拿通用表示再学一个轻量头的决策边界。5.4 一个真实案例从通用模型到产品模型的转身我亲手做过一个声音异响识别的项目。设备是一台小型旋转机械要识别的是轴承缺油后的异响。最开始图省事直接部署了ST Model Zoo里的音频分类模型效果惨不忍睹——不是因为模型差而是因为它的训练数据里根本没有轴承缺油这种声音它连正常运转和异常异响的分类边界都没法建立。后来我们做的正是迁移学习保留官方模型的滤波器组和浅层特征提取部分它们对声音频段的分解能力是通用的把后面的分类部分整个换掉用自己的两百多段正常/异常录音做微调。其中正常声音来自现场样机异常声音来自人为设置故障的样机让轴承缺油、加大负载、改变转速。微调之后的模型在独立测试集上的召回率从最初的50%出头提到了93%左右。整个过程我没有从零设计网络结构但最终模型的实际形态已经和官方版本差别很大——新的分类层、更小的输入尺寸、重新量化过的权重。这就是我为什么坚持说这个问题的答案不是用官方或不用官方二选一而是以官方模型为起点把它改造成你的模型。6. 我的最终决策策略一张表和一个朴素建议6.1 场景决策表把前面所有分析浓缩成一张表给正在纠结的人直接对号入座你的需求推荐路线理由预研Demo/可行性验证直接用Model Zoo省时省力快速给出结论通用类别人、车、常见物体识别直接用Model Zoo公开数据集已覆盖掉点有限私有目标/特定缺陷/私有声音基于官方模型迁移学习省数据贴合场景风险可控回归/异常检测/时序分类等非覆盖任务自己设计模型或传统ML现成模型不具备对应能力内存极度紧张几十KB级别自己设计极简模型官方模型超出预算高可靠/安全敏感场景自己重训或严格验证数据链路可控降低模型投毒风险6.2 我在这个选择上栽过的跟头说个我自己的反面教材。早年间做产品为了赶交付直接拿一个当时很流行的开源检测模型部署到了设备里。在办公室测试时一切正常准确率报表亮眼客户验收也通过了。结果设备到了客户现场开始疯狂误报。问题出在哪里客户的厂房是低照度环境相机视角是俯视45度背景里有大量和检测目标颜色相近的管道。办公室测试数据里完全没有这些变化。模型在实验室的分布里是好的到了真实分布里就直接失灵。后来我养成了一个习惯也是我要分享给所有做嵌入式AI的同行的习惯无论用现成模型还是自己设计模型第一步永远是用你自己场景里的少量真实数据跑一遍看看。这一步成本很低可能半天就够但它能直接告诉你这个模型在你的世界里活不活得下去。很多灾难往往就是从跳过这一步开始的。6.3 给新入坑者的一个朴素建议关于ST已经有Model Zoo了我们还需要自己设计模型吗我的答案已经很清楚大概率不是从零设计一个全新网络但也不是原封不动地用官方模型。多数项目的正解是把官方模型当成一个高质量的起点做一定程度的迁移学习和裁剪让它真正变成自己的模型。哪怕你最后全改了当初那个官方模型也帮你证明了这条路走得通。最后分享一个小习惯从我第一次做嵌入式AI开始就坚持给每个项目建一个模型实验记录文档记录模型版本、数据集版本、量化方式、验证精度、实测时延和资源占用。刚开始觉得麻烦但迭代过几轮之后你会发现它救过你很多次——你永远不会在三个月后看着一段代码想不起来这个模型用的是哪批数据训的。这个习惯建议你也趁早养成不管最后你选择用Model Zoo还是自己设计都用得上。