在STM32单片机上跑神经网络算法
摘要:为什么可以在STM32上面跑神经网络?简而言之就是使用STM32CubeMX中的X-Cube-AI扩展包将当前比较热门的AI框架进行C代码的转化,以支持在嵌入式设备上使用,目前使用X-Cube-AI需要在STM32CubeMX版本5.0以上,支持转化的模型有Keras、TFlite、ONNX、Lasagne、Caffe、ConvNetJS。Cube-AI把模型转化为一堆数组,而后将这些数组内容解析成模型,和Tensorflow里的模型转数组后使用原理是一样的。
一、环境安装和配置
STM32CubeMX
MDK/IAR/STM32CubeIDE
F4/H7/MP157开发板
二、AI神经网络模型搭建
这里使用官方提供的模型进行测试,用keras
框架训练:
https://github.com/Shahnawax/HAR-CNN-Keras
模型介绍
在Keras中使用CNN进行人类活动识别:此存储库包含小型项目的代码。该项目的目的是创建一个简单的基于卷积神经网络(CNN)的人类活动识别(HAR)系统。该系统使用来自3D加速度计的传感器数据,并识别用户的活动,例如:前进或后退。HAR意为Human Activity Recognition(HAR)system,即人类行为识别。这个模型是根据人一段时间内的3D加速度数据,来判断人当前的行为,比如走路,跑步,上楼,下楼等,很符合Cortex-M系列MCU的应用场景。使用的数据如下图所示。
存储库包含以下文件
HAR.py,Python脚本文件,包含基于CNN的人类活动识别(HAR)模型的Keras实现,
actitracker_raw.txt、包含此实验中使用的数据集的文本文件,
model.h5
,一个预训练模型,根据训练数据进行训练,evaluate_model.py、Python 脚本文件,其中包含评估脚本。此脚本在提供的 testData 上评估预训练 netowrk 的性能,
testData.npy,Python 数据文件,包含用于评估可用预训练模型的测试数据,
groundTruth.npy,Python 数据文件,包含测试数据的相应输出的地面真值和
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中。
这次就这样先跑一下官方的例程,以后再研究一下,跑跑自己的模型。
参考资料:
https://youtu.be/grgNXdkmzzQ?t=10
https://youtu.be/grgNXdkmzzQ?t=103
在STM32单片机上跑神经网络算法相关推荐
- 我在STM32单片机上跑神经网络算法
01 前言 为什么可以在STM32上面跑神经网络? 简而言之就是使用STM32CubeMX中的X-Cube-AI扩展包将当前比较热门的AI框架进行C代码的转化,以支持在嵌入式设备上使用. 目前使用X ...
- 在51单片机上跑RTOS有没有意义?
关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 最近看见我的一个技术交流群在讨论一个问题:在51单片机上跑RTOS有没有意义? 今天就来围绕51和R ...
- 红外测距传感器GP2D12与STM32单片机程序,滤波算法
红外测距传感器GP2D12与STM32单片机程序,滤波算法,设计步骤和代码流程清晰非常实用. 是机器人中最常用的红外测距传感器. 程序源码注释详细,非常适合单片机开发人员. ID:7887031794 ...
- 【程序】在STM32单片机上用1700行代码实现基于LwIP 2.1.2协议栈raw API和FatFs文件系统的FTP服务器(20230315版)
[更新记录] 本程序基于20200703版的程序,作出了如下更新: 1. 解决了当accept函数的参数err!=ERR_OK时,程序出现HardFault错误的bug. 2. 当lwip MEM_S ...
- [MATLAB学习]:Matlab生成滑动平均滤波算法文件并移植到STM32单片机上运行——基于CubeMX
前言 人生如逆旅,我亦是行人. 今天分享一个在 MATLAB 上生成C算法文件,并将其移植到 keil5上,运行至 STM32 单片机,一个很有用的方法. 准备工作: 已安装 MATLAB 的软件(注 ...
- 单片机c语言跑马灯,基于STM32单片机对跑马灯的控制
基于学习STM32有一段时间了,特意写下一篇关于一个简单的跑马灯 的例程,梳理思路,也希望我自己的理解能帮到一些学习STM32的初学者 //============================== ...
- POWERLINK协议源码(最新)在stm32单片机上的移植指南
最近着了powerlink的道,连续几晚十二点前没睡过觉.不得不说兴趣这东西劲太大了,让人睡不着.喜欢上研究POWERLINK,最新版的源码结构挺清晰的,移植并测试了嵌入式linux作为从站和电脑主站 ...
- 【程序】在STM32单片机上实现基于LwIP 2.1.3协议栈raw API的DHCP服务器,为其他设备分配IPv4地址(20220122版)
本程序是参考了udhcp-0.9.8后编写的. 使用方法: ip4_addr_t ip4addr, netmask, gw; struct dhcpd_config dhcpd; struct net ...
- jpg 神经网络 手势识别_在STM32上跑神经网络做手势识别
为了在Cortex-M的MCU上成功跑起CNN,用的模型是一个不到10层FCN网络,但是即便如此,对于主频只有不到100MHz,SRAM只有不到100K的单片机来说依然是极其吃力的,模型不做量化的话肯 ...
最新文章
- Ubuntu关闭ipv6
- html5--6-68 实战前的准备工作:了解HTML5大纲算法
- Mirror--镜像使用的工作线程数
- 深度解析单例与序列化之间的爱恨情仇
- React后台管理系统-品类的增加、修改和查看
- 在一个数组中,如何确定所需元素在数组中的位置.
- java程序设计_Java程序设计--final(笔记)
- Eclipse添加git插件上传项目到github
- Java基础篇:嵌套 switch 语句
- gdal-3.1.2-release下载页面出错
- zend 插件 html,插入自定义HTML到Zend_Form的
- 银行数据仓库体系实践(13)--数据应用之监管报送
- Hacker's Technique programme pdf+源码
- java手机视频下载_使用JAVA合并哔哩哔哩手机客户端下载的视频
- 怎么把计算机管理的磁盘找出来,电脑分区显示不出来怎么办
- Spark中--jars与spark.driver.extraClassPath、spark.executor.extraClassPath区别与联系
- php cms下载地址,下载phpcms详细步骤
- iOS 页面的卡顿的原因以及如何解决. 如何优化app的启动速度
- 星空璀璨,时光流逝,分享技术,记录生活——2016年11月22日
- LTspice使用教程笔记
热门文章
- HAProxy用法详解 全网最详细中文文档
- 幽幽的灵光射不出你想要的疯狂
- 第二个Spring冲刺周期团队进展报告
- Struts2中ValueStack结构和总结
- [转]一个人脸检测器
- OSPF的虚链路配置
- ASP.NET中Cookie编程的基础知识
- python标准库os中的方法_python中OS常用方法
- Django REST framework 解析器和渲染器
- oracle 未找到段的存储定义,Exp-00003 no storage definition found issue in oracle 11g (未找到段 (0,0) 的存储定义)...