4. STM32Cube.AI 模型转换与验证:模型导入、分析报告解读、RAM/Flash 占用评估
模型训练好了,只是第一步。怎么把它塞进STM32里跑起来?这中间有个关键环节——模型转换与验证。说白了,就是把你在电脑上训练出来的.h5或.tflite文件,变成STM32能理解的C代码。
我刚开始做这个的时候,以为直接点个按钮就完事了。结果第一次部署,模型在板子上跑出来的结果跟电脑上完全不一样。后来才发现,是量化参数没调对。嗯,这章咱们就把这些坑一个个填上。
4.1 模型导入:支持哪些格式?
STM32Cube.AI支持的模型格式,我整理了一张表,你直接对照着看:
| 框架 | 支持格式 | 版本要求 | 我的建议 |
|---|---|---|---|
| TensorFlow | .h5 / SavedModel / Frozen Graph | TF 1.x ~ 2.x | 优先用.h5,兼容性最好 |
| Keras | .h5 | Keras 2.x | 直接导出,不用额外处理 |
| TensorFlow Lite | .tflite | TFLite 2.x | 量化模型首选 |
| ONNX | .onnx | ONNX 1.8+ | 跨框架迁移时用 |
| PyTorch | .pt → 转ONNX | 需先转ONNX | 不直接支持,绕一下 |
4.2 导入操作步骤
打开STM32Cube.AI,操作其实不复杂。我带你走一遍:
- 选择模型文件:点击"Import model",选你的.h5或.tflite文件
- 确认输入输出:系统会自动解析,你核对一下输入张量的形状对不对
- 选择目标芯片:比如STM32F746、STM32H743,不同芯片算力差很多
- 设置量化参数:这个最关键,后面细说
- 点击Analyze:等几秒钟,报告就出来了
4.3 分析报告解读:到底在说什么?
分析报告生成后,很多人一看满屏数字就懵了。其实核心就几个指标,我一个个给你拆开讲。
4.3.1 模型结构概览
报告第一部分会列出模型的层结构。比如:
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 112, 112, 32) 896
max_pooling2d_1 (MaxPooling2D) (None, 56, 56, 32) 0
conv2d_2 (Conv2D) (None, 56, 56, 64) 18496
...
=================================================================
Total params: 1,234,567
Trainable params: 1,234,567
Non-trainable params: 0
这里要注意的是:参数量不等于内存占用量。你想想看,参数是权重,运行时还要有中间激活值、输入输出缓冲区。这些加起来才是真正的RAM占用。
4.3.2 RAM占用评估
报告里会给出一个RAM占用明细表,大概长这样:
| 内存类型 | 大小(KB) | 说明 |
|---|---|---|
| 权重 | 128.5 | 模型参数,存Flash |
| 激活值 | 64.2 | 中间计算结果,存RAM |
| 输入缓冲区 | 12.8 | 输入数据,存RAM |
| 输出缓冲区 | 6.4 | 输出结果,存RAM |
| 总计RAM | 83.4 | 激活+输入+输出 |
4.3.3 Flash占用评估
Flash占用就是模型参数+代码本身的大小。报告里会给出:
- 权重Flash:模型参数占用的空间
- 代码Flash:Cube.AI生成的推理代码大小
- 总计Flash:两者之和
举个例子:
Flash占用明细:
- 权重: 128.5 KB
- 代码: 24.3 KB
- 总计: 152.8 KB
嗯,这里要注意:如果你的芯片Flash只有256KB,那152.8KB还算安全。但如果你还要放RTOS、其他应用代码,就得精打细算了。
4.4 量化:让模型瘦身的关键
量化,说白了就是把模型从float32变成int8。好处很明显:
- Flash占用减少4倍:32位变8位
- 推理速度提升2~4倍:整数运算比浮点快
- RAM占用也减少:中间激活值也变成int8
但代价是精度会掉一点。我做过一个分类模型,float32版本准确率97.2%,int8量化后降到96.5%。掉了0.7%,但Flash从1.2MB降到了300KB。值不值?看你的应用场景。
4.5 验证:模型在板子上跑得对吗?
模型转换完,不能直接上板子。你得先在PC上验证一下。Cube.AI提供了验证工具:
- 准备测试数据:选几张典型的图片或信号数据
- 运行验证:Cube.AI会用生成的C代码在PC上模拟推理
- 对比结果:跟Python模型的输出做对比
我一般会看两个指标:
- 数值误差:每个输出值的绝对误差,一般要求小于0.01
- 分类一致性:如果分类任务,看top-1结果是否一致
4.6 知识结构图:模型转换与验证全流程
下面这张图,把整个流程串起来了。你保存下来,以后做项目时对照着走:
4.7 实战案例:一个分类模型的转换
最后,我拿一个实际项目给你演示一下。假设我有一个手写数字识别模型,输入28x28灰度图,输出10个类别。
原始模型参数:
- 输入:1x28x28 (float32)
- 层数:3个卷积 + 2个全连接
- 参数量:约120万
- float32大小:4.6MB
量化后结果:
- int8大小:1.15MB(缩小4倍)
- RAM占用:从320KB降到96KB
- 推理速度:从120ms降到35ms(STM32F746 @216MHz)
- 精度:从98.5%降到98.1%(只掉了0.4%)