我在STM32单片机上跑神经网络算法—CUBE-AI

文章介绍了如何在STM32单片机上使用CUBE-AI工具,将Keras模型转换并部署到STM32F407ZGT6芯片上进行人类活动识别。通过STM32CubeMX配置环境,解决XCOMbug,并详细阐述了模型压缩、验证和部署的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要:为什么可以在STM上面跑人工智能?简而言之就是通过X-Cube-AI扩展将当前比较热门的AI框架进行C代码的转化,以支持在嵌入式设备上使用,目前使用X-Cube-AI需要在STM32CubeMX版本7.0以上,目前支持转化的模型有Keras、TF lite、ONNX、Lasagne、Caffe、ConvNetJS。Cube-AI把模型转化为一堆数组,而后将这些数组内容解析成模型,和Tensorflow里的模型转数组后使用原理是一样的。

一、环境安装和配置

STM32CubeMX
MDK/IAR/STM32CubeIDE
F4/H7/MP157开发板

芯片平台:stm32F407ZGT6 flash:1024K ram:256K

二、AI神经网络模型搭建

这里使用官方提供的模型进行测试,用keras框架训练:
在这里插入图片描述

https://github.com/Shahnawax/HAR-CNN-Keras

没有的,我已下载好,直接拿走
链接:https://pan.baidu.com/s/1jbyBvYl2WNuWlmMwULOb-g
提取码:AI23
–来自百度网盘超级会员V5的分享

模型介绍

在Keras中使用CNN进行人类活动识别:此存储库包含小型项目的代码。该项目的目的是创建一个简单的基于卷积神经网络(CNN)的人类活动识别(HAR)系统。该系统使用来自3D加速度计的传感器数据,并识别用户的活动,例如:前进或后退。HAR意为Human Activity Recognition (HAR) system,即人类行为识别。这个模型是根据人一段时间内的3D加速度数据,来判断人当前的行为,比如走路,跑步,上楼,下楼等,很符合Cortex-M系列MCU的应用场景。使用的数据如下图所示。

在Keras中使用CNN进行人类活动识别:此存储库包含小型项目的代码。该项目的目的是创建一个简单的基于卷积神经网络(CNN)的人类活动识别(HAR)系统。该系统使用来自3D加速度计的传感器数据,并识别用户的活动,例如:前进或后退。HAR意为Human Activity Recognition (HAR) system,即人类行为识别。这个模型是根据人一段时间内的3D加速度数据,来判断人当前的行为,比如走路,跑步,上楼,下楼等,很符合Cortex-M系列MCU的应用场景。使用的数据如下图所示。
在这里插入图片描述
存储库包含以下文件

  • 1.HAR.py,Python脚本文件,包含基于CNN的人类活动识别(HAR)模型的Keras实现,
  • 2.actitracker_raw.txt、包含此实验中使用的数据集的文本文件,
  • 3.model.h5,一个预训练模型,根据训练数据进行训练,
  • 4.evaluate_model.py、Python 脚本文件,其中包含评估脚本。此脚本在提供的 testData 上评估预训练 netowrk 的性能,
  • 5.testData.npy,Python 数据文件,包含用于评估可用预训练模型的测试数据,
  • 6.groundTruth.npy,Python 数据文件,包含测试数据的相应输出的地面真值和
  • 7.README.md.
    这么多文件不要慌,模型训练后得到model.h5模型,才是我们需要的。

三、新建工程

1.这里默认大家都已经安装好了STM32CubeMX软件。
在STM32上验证神经网络模型(HAR人体活动识别),一般需要STM32F3/F4/L4/F7/L7系列高性能单片机,运行网络模型一般需要3MB以上的闪存空间,一般的单片机不支持这么大的空间,CUBEMX提供了一个压缩率的选项,可以选择合适的压缩率,实际是压缩神经网络模型的权重系数,使得网络模型可以在单片机上运行,压缩率为8,使得模型缩小到366KB,验证可以通过;
在这里插入图片描述
然后按照下面的步骤安装好CUBE.AI的扩展包
在这里插入图片描述
这个我安装了三个,安装最新版本的一个版本就可以。
在这里插入图片描述
接下来就是熟悉得新建工程了
在这里插入图片描述
因为安装了AI的包,所以在这个界面会出现artificial intelligence这个选项,点击Enable可以查看哪一些芯片支持AI
在这里插入图片描述
接下来就是配置下载接口和外部晶振了。
在这里插入图片描述
在这里插入图片描述
然后记得要选择一个串口作为调试信息打印输出。
在这里插入图片描述
选择Software Packs,进入后把AI相关的两个包点开,第一个打上勾,第一个选择Validation。
在这里插入图片描述

  • System Performance工程:整个应用程序项目运行在STM32MCU上,可以准确测量NN推理结果,CP∪U负载和内存使用情况。使用串行终端监控结果(e.g.Tera Term)。
  • Validation工程:完整的应用程序,在桌面PC和基于STM32 Arm Cortex-m的MCU嵌入式环境中,通过随机或用户测试数据,递增地验证NN返回的结果。与 X-CUBE-A验证工具一起使用。
  • Application Template工程:允许构建应用程序的空模板项目,包括多网络支持。

之后左边栏中的Software Packs点开,选择其中的X-CUBE-AI,弹出的Mode窗口中两个复选框都打勾,Configuration窗口中,点开network选项卡。

在这里插入图片描述
选择刚刚配置的串口作为调试用。
在这里插入图片描述
点击add network,选择上述下载好的model点h5模型,选择压缩倍数8;
在这里插入图片描述
点击分析,可从中看到模型压缩前后的参数对比
在这里插入图片描述
点击validation on desktop 在PC上进行模型验证,包括原模型与转换后模型的对比,下方也会现在验证的结果。
在这里插入图片描述
致此,模型验证完成,下面开始模型部署

四、模型转换与部署

时钟配置,系统会自动进行时钟配置。按照你单片机的实际选型配置时钟就可以了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后点击GENERATE CODE生成工程。
在这里插入图片描述
然后在MDK中编译链接。
在这里插入图片描述
在这里插入图片描述
选择好下载器后就可以下载代码了。
在这里插入图片描述
在这里插入图片描述
然后打开串口调试助手就可以看到一系列的打印信息了。

在这里插入图片描述
代码烧写在芯片里后,回到CubeMX中下图所示位置,我们点击Validate on target,在板上运行验证程序,效果如下图,可以工作,证明模型成功部署在MCU中。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

XCOM

链接:https://pan.baidu.com/s/1DKKGt61qQ5V7e5Od86-BNQ
提取码:AI23
–来自百度网盘超级会员V5的分享

bug解决

L6221E: Execution region ER_RO with Execution range [0x00000000,0x000001。
学习stm32的时候,使用keil5编译编译空的工程时候遇到的问题,在网上找了很久没找到答案,自己瞎操作解决了问题,其实也不知道有没有解决,仅供参考。
在这里插入图片描述
只需要将上图位置打勾,再编译即可。

reference

<think>好的,用户想了解如何在STM32CubeAI中使用PyTorch模型或者转换模型以适应嵌入式设备。首先,我需要回忆STM32CubeAI的相关知识。STM32CubeAISTMicroelectronics提供的工具,用于将训练好的模型转换为可在STM32微控制器上运行的优化代码。它支持多种框架,比如TensorFlow、Keras,但PyTorch的支持可能需要中间步骤。 用户的问题核心在于如何将PyTorch模型整合到STM32CubeAI中。由于STM32CubeAI本身不直接支持PyTorch,所以可能需要先将PyTorch模型转换为ONNX格式,然后再通过CubeAI转换。ONNX是一个开放的模型交换格式,能够帮助不同框架之间的模型转换。因此,步骤可能包括:导出PyTorch模型到ONNX,然后使用CubeAI转换ONNX模型为C代码。 接下来,我需要验证这个过程是否正确。查阅资料发现,确实,PyTorch模型通常通过导出为ONNX,然后CubeAI处理ONNX文件。同时,需要注意模型的兼容性,比如算子支持、量化等,这些都会影响最终在嵌入式设备上的运行效果。 另外,用户可能需要知道如何安装和配置CubeAI,以及如何将生成的代码集成到STM32项目中。可能还需要考虑模型优化,比如量化、剪枝,以减少模型大小和计算量,适应微控制器的资源限制。 需要提醒用户注意模型的复杂度,因为STM32的资源有限,太大的模型可能无法部署。此外,CubeAI支持哪些STM32型号,是否需要特定的硬件加速模块(如Arm Cortex-M的DSP扩展)也是需要考虑的。 总结步骤应该是:训练PyTorch模型→导出为ONNX→使用CubeAI转换→验证和优化→部署到STM32。同时,提供代码示例,比如导出ONNX的Python代码,CubeAI的命令行操作,以及如何在STM32工程中包含生成的模型。 最后,生成相关问题,帮助用户进一步了解模型优化、性能测试、实时性处理等可能遇到的问题。</think>### 如何在STM32CubeAI中使用PyTorch模型 #### 步骤1: **将PyTorch模型转换为ONNX格式** STM32CubeAI目前主要支持TensorFlow Lite、Keras和ONNX格式的模型[^1]。因此,PyTorch模型需先转换为ONNX: ```python import torch import torch.onnx # 假设已定义并训练好PyTorch模型 model = ... # 你的PyTorch模型 dummy_input = torch.randn(1, 3, 224, 224) # 输入张量(根据模型调整) torch.onnx.export( model, dummy_input, "model.onnx", input_names=["input"], output_names=["output"] ) ``` #### 步骤2: **使用STM32CubeMX生成代码** 1. 打开STM32CubeMX,创建工程并选择目标MCU(如STM32H7系列支持AI加速)。 2. 进入**“AI”选项卡**,点击**“Import Model”**,选择生成的`model.onnx`文件。 3. 配置模型参数(如量化选项、输入输出层),生成优化后的C代码。 #### 步骤3: **验证模型兼容性** - 检查CubeAI是否支持模型的算子,若报错需调整模型结构(如替换不支持的层)[^2]。 - 量化模型可减少内存占用(如从FP32转为INT8),但可能影响精度。 #### 步骤4: **集成到嵌入式工程** 生成的代码会包含: - 模型推理接口(如`ai_run()`函数)。 - 预处理的输入/输出缓冲区。 - 内存管理优化(如使用静态内存分配)。 #### 示例:调用模型推理 ```c // 在main.c中调用生成的AI函数 #include "network.h" ai_handle network = AI_NETWORK_INSTANCE; void inference(float* input_data, float* output_data) { ai_buffer ai_input = { .data = AI_HANDLE_PTR(input_data) }; ai_buffer ai_output = { .data = AI_HANDLE_PTR(output_data) }; ai_run(network, &ai_input, &ai_output); } ``` --- ### 关键优化技巧 1. **模型压缩** - 使用PyTorch的量化工具(如`torch.quantization`)减小模型体积。 - 剪枝冗余参数(如通过`torch.nn.utils.prune`)。 2. **硬件加速** - 选择支持Cortex-M7/M4的MCU,利用SIMD指令加速矩阵运算[^3]。 - 启用STM32的硬件FPU(浮点单元)提升计算效率。 --- ### 常见问题与解决 - **问题1:CubeAI报告算子不支持** 修改模型结构,或使用TensorFlow重写该层后重新导出。 - **问题2:内存不足** 降低输入分辨率或使用更小的模型(如MobileNetV2代替ResNet)。 ---
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值