一、背景与意义
1.1 背景
随着ai的大力发展,推动了智能化向终端的延伸。MCU这类设备虽然资源受限,但是近年来AI模型的轻量化技术(如模型压缩、硬件加速、框架优化)快速发展,为单片机部署AI提供了可行性。
1.2 意义
传统AI应用依赖“数据上传云端→模型推理→结果回传”的模式,但这种模式存在网络延迟和可靠性风险,
单片机部署AI模型后,数据无需外传即可本地完成推理,将响应时间从“百毫秒级”压缩到“微秒级”,同时避免网络依赖,
单片机的典型应用场景(如物联网终端、可穿戴设备、智能家居传感器)往往对功耗、体积、成本极度敏感,
若依赖云端处理,设备需持续上传数据(消耗流量)并保持网络连接(增加射频模块功耗),导致续航大幅缩短。
通过部署轻量化AI模型(如经过剪枝、量化、知识蒸馏优化的模型),单片机可在极低算力下完成AI任务。
随着数据安全法规的完善,敏感数据的本地化处理成为刚需。
二、stm32部署神经网络
2.1 方案
在STM32单片机上部署神经网络模型,一般有两种方案1.移植支持MCU的神经网络框架, 2.采用STM32Cube.AI工具。
方案1:需要自己寻找合适的框架,并完成移植,通用性更好。
方案2:仅支持stm32系列单片机,甚至部分系列不支持,但该工具可以结合STM32CubeMX环境使用,比较方便。
2.2 NNoM库
2.2.1 简介
NNoM是一个专门为了神经网络在 MCU 上运行的框架。 NNoM 是一个定点神经网络库, 现在支持 8-bit定点格式。当前 NNoM 支持数十种操作,卷积,池化,激活,矩阵计算等等。此外还提供多种在线评估方法,包括时间统计,内存统计,Top-K 准确度,Confusion Matrix 等等。
它拥有以下优点:
快速开发: 电脑上训练的 Keras 模型直接转换成 C 文件。
默认纯C后端: 移植和使用畅通无阻,支持32/64bit,MCU/PC。
支持复杂结构: 支持多种复杂的网络模型结构。
完善的文档: 拥有 API 文档,入门指南,优化指南。
入门简单: 多个从简单到复杂的例子,完全开源。
MCU 上的神经网络能做什么?
语音关键词识别 (KeyWord Spotting)
使用运动传感器识别活动状态 (Human Activity Recognition)
神经网络控制系统 (替代PID等传统控制方法)
图像处理 (带专用加速器的 MCU)
...
目录结构
2.2.2 移植NNoM库
步骤1:新建stm32 keil工程
步骤2:下载源码https://gitcode.com/gh_mirrors/nn/nnom,将inc、port、src拷贝到stm32 keil工程中。
步骤3:需要将目录中的所有.c添加到工程,并添加头文件路径。
步骤4:由于NNoM库需要消耗大量空间,建议修改编译选项,例如-o1
步骤5:后期将训练好的模型文件(weights.h文件)添加到keil工程,编写对应的代码便可以进行推理。
2.3.1 简介
STM32Cube.AI是一款适用于STM32微控制器的AI模型优化工具,主要用于在STM32微控制器上优化并部署由主流AI框架训练的神经网络模型。目前cube.AI支持各种深度学习框架的训练模型,如Keras和TensorFlow™ Lite,并支持可导出为ONNX标准格式的所有框架,如PyTorch™、Microsoft® Cognitive Toolkit、MATLAB®等,然后通过 cube.MX可视化配置界面导入这些深度学习框架导出的训练模型来配置及生成c模型,进而部署在STM32芯片上。
2.3.2 基于STM32Cube.AI部署神经网络
步骤1:通过cubeMx创建工程,注意部分系列无法使用cube.ai,可以过滤器筛选
选择对应的芯片
步骤2:先进行基础配置,RCC、SYS、UART、时钟
步骤3:CUBE-AI配置,这里有三种选择:System Performance(系统性能)、Validation(模型验证)、Application Template(应用模板)
System Performance
用于评估神经网络模型在目标STM32 MCU上的运行效率,包括推理时间、内存占用(RAM/Flash)、CPU利用率等关键指标,帮助判断模型是否适配当前硬件资源。
Validation
完整的应用程序,在桌面PC和MCU环境中,通过随机或用户测试数据,递增地验证,与X-CBUE-AI验证工具一起使用。
Application Template
允许构建应用程序的空模版项目,包括多网络支持。
步骤4:添加模型文件,将训练得到model.h5添加进去,点击分析
步骤5:配置target参数
步骤6:查看目标板验证结果
步骤7:验证成功后,便可以编程来使用。