基于Keras构建模型并部署到STM32F4的完整指南

发布时间:2026/9/24 17:17:48
基于Keras构建模型并部署到STM32F4的完整指南 基于 Keras 构建模型并部署到 STM32F4 的完整指南概述将基于 Keras 构建的模型部署到 STM32F4 微控制器上属于典型的 TinyML微型机器学习应用。由于 STM32F4 的硬件资源如 Flash 和 RAM相对有限无法直接运行完整的深度学习模型必须经过模型转换、量化压缩以及 C 代码生成等一系列步骤。本文档涵盖以下三个阶段阶段一PC 端使用 Keras 构建与训练模型Python 正弦函数模拟数据阶段二模型压缩为 INT8 并转换为 C 代码阶段三不使用 STM32CubeMX手工搭建 STM32F4 工程并部署下面是整个部署流程的概览图PC 端Keras 构建与训练模型模型保存为 .h5 文件NNoM 量化压缩为 INT8生成 C 代码net.c / weights.h手工搭建 STM32F4 工程编写业务逻辑main.c部署到 STM32F4 并推理阶段一PC 端生成数据与 Keras 模型训练1.1 环境准备在 Python 环境中安装以下依赖numpytensorflow包含 Keras1.2 生成带噪声的正弦数据使用正弦函数加高斯噪声模拟真实传感器数据importnumpyasnp np.random.seed(42)Xnp.linspace(0,2*np.pi,1000)ynp.sin(X)np.random.normal(0,0.05,X.shape)# 加入高斯噪声1.3 构建轻量级模型为了适应 MCU 的低资源特性精简隐藏层神经元数量选择轻量级架构fromtensorflowimportkerasfromtensorflow.keras.modelsimportSequentialfromtensorflow.keras.layersimportDense modelSequential([Dense(16,activationrelu,input_shape(1,)),# 隐藏层16个节点Dense(1)# 输出层])model.compile(optimizeradam,lossmse)model.fit(X,y,epochs100,batch_size32,verbose1)1.4 模型保存训练完成后将模型保存为 Keras 原生格式model.save(sine_model.h5)阶段一的完整流程如下生成带噪声的正弦数据构建轻量级 Keras 模型训练模型保存为 sine_model.h5阶段二模型 INT8 量化与 C 代码转换2.1 量化原理STM32F4 的 FPU 处理浮点较慢且 Flash/RAM 有限必须将模型量化为 INT8 并转为 C 代码。INT8 量化将模型权重和激活值从 32 位浮点数FP32转换为 8 位整数INT8。这通常可使模型体积减小 75% 以上并大幅降低内存占用和功耗。量化感知训练在训练或转换过程中模拟量化操作以尽量保持模型在低精度下的准确率。2.2 使用 NNoM 进行量化与代码生成推荐使用轻量级开源框架NNoM它专为 MCU 设计支持 Keras 模型一键转 C 代码。安装 NNoMpipinstallnnom量化与导出代码importnnomimporttensorflowastf# 加载模型modeltf.keras.models.load_model(sine_model.h5)# 使用 NNoM 进行 INT8 量化并导出 C 代码nnom_modelnnom.NNoM(model)nnom_model.build(representative_dataX[:100])# 传入部分真实数据用于校准量化参数nnom_model.save(nnom_sine_model)# 生成 weights.h, net.h, net.c 等文件说明生成的weights.h包含了量化后的权重数组net.c包含了推理逻辑。阶段二的量化与代码生成流程如下加载 Keras 模型.h5NNoM 构建模型传入校准数据X[:100]INT8 量化导出 C 代码weights.h / net.c阶段三STM32F4 端手工搭建工程与部署不使用 STM32CubeMX采用“古法”纯手工搭建工程可以让你完全掌控代码的每一个细节。以 STM32F407 为例。3.1 规划工程目录结构在电脑上新建一个无中文、无空格的文件夹创建以下目录STM32F4_Sine_AI/ ├── 01_MDK-ARM/ # Keil工程文件(.uvprojx) ├── 02_User/ # main.c 等用户业务代码 ├── 03_CMSIS/ # Cortex-M4内核文件 (core_cm4.h 等) ├── 04_Device/ # STM32F4专属文件 (启动文件, system_stm32f4xx.c) ├── 05_NNoM_Lib/ # 放入 NNoM 生成的 net.c, net.h, weights.h 及 NNoM 核心源码 └── 06_HAL_Driver/ # (可选) 如果不用寄存器可放入标准外设库/HAL库3.2 提取底层核心文件从 ST 官方的STM32CubeF4固件包中提取以下文件到对应目录文件用途存放目录startup_stm32f407xx.s启动文件04_Devicesystem_stm32f4xx.c和.h系统时钟文件04_Devicecore_cm4.h、cmsis_compiler.h等CMSIS 核心03_CMSISstm32f4xx.h,stm32f407xx.h设备头文件04_Device3.3 Keil 工程配置魔术棒设置Target 选项卡选择芯片型号如 STM32F407ZGT6勾选Use MicroLIBNNoM 依赖标准 C 库的内存分配C/C 选项卡Define 中添加宏定义STM32F407xx, USE_STDPERIPH_DRIVER若使用了标准库Include Paths 添加所有头文件所在的路径优化等级选择-O2或-O3并勾选C99 Mode添加文件到工程在 Keil 左侧 Project 树中建立对应的 Group将上述提取的.c文件、启动文件以及 NNoM 生成的net.c全部添加进去。3.4 编写业务逻辑main.c在main.c中初始化系统时钟并调用 NNoM 的推理接口#includestm32f4xx.h#includenet.h// NNoM 生成的头文件#includeweights.h// NNoM 生成的权重头文件#includestdio.hintmain(void){// 1. 初始化系统时钟 (可调用 SystemInit() 或手动配置 RCC 寄存器)SystemInit();// 2. 初始化 NNoM 模型nnom_model_t*modelnnom_model_create();// 3. 准备输入数据 (例如输入 PI/2期望输出接近 1.0)floatinput_val1.57f;int8_tq_input;// 注意需要根据 NNoM 生成的量化参数将 float 转为 int8q_input(int8_t)(input_val/model-in-tensor-q_scale)model-in-tensor-q_zero_point;// 4. 执行推理memcpy(model-in-tensor-p_data,q_input,sizeof(int8_t));nnom_predict(model);// 5. 获取并反量化输出结果int8_tq_output((int8_t*)model-out-tensor-p_data)[0];floatresult(q_output-model-out-tensor-q_zero_point)*model-out-tensor-q_scale;// result 即为模型预测的 sin(PI/2) 的值while(1){// 可以在这里通过串口打印 result或控制 LED}}阶段三的工程搭建与部署流程如下规划工程目录结构提取底层核心文件Keil 工程配置魔术棒设置添加文件到工程编写业务逻辑main.c编译、烧录并验证推理结果核心注意事项4.1 内存分配神经网络推理需要大量临时内存务必在启动文件.s中将 Stack 和 Heap 调大例如 Stack0x1000Heap0x2000否则极易发生 HardFault。4.2 量化对齐NNoM 在导出时会生成量化参数Scale 和 Zero-point在 C 端喂入数据和读取数据时必须严格按照这些参数进行浮点与定点的转换。总结与建议对于 STM32F4建议采用Keras 训练 INT8 量化 NNoM 生成代码的工作流。这条路径不仅避开了复杂的底层算子移植还能充分利用开源框架的轻量化优势是落地稳定且开发效率较高的选择。扩展方向可根据具体应用场景如语音唤醒、手势识别、传感器分类等设计更合适的轻量级模型结构并进一步优化量化策略与推理性能。整体工作流总结如下STM32F4 端PC 端Keras 训练INT8 量化NNoM 生成 C 代码手工搭建工程编写 main.c部署与推理

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询