在STM32单片机上跑神经网络算法

09b262a34f5a466f031aff0ce3b2efab.png

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

一、环境安装和配置

  1. STM32CubeMX

  2. MDK/IAR/STM32CubeIDE

  3. F4/H7/MP157开发板

二、AI神经网络模型搭建

这里使用官方提供的模型进行测试,用keras框架训练:

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

模型介绍

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

09fc50e9f6e3c2e720bfd7d62c6e3627.png
HAR用到的原始数据

存储库包含以下文件

  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,验证可以通过;

727912530e61a2e6c65cb7c86315bea4.png

然后按照下面的步骤安装好CUBE.AI的扩展包

4cfd784ac9eb334d0a011875a8c5251d.png

这个我安装了三个,安装最新版本的一个版本就可以。

a07ea804618da4f56df278b3ace430f9.png

接下来就是熟悉得新建工程了

f1ff07e59a7ab4fefa1d1bc3fe117211.png

因为安装了AI的包,所以在这个界面会出现artificial intelligence这个选项,点击Enable可以查看哪一些芯片支持AI

66d41a50d05103b42986765c538ca563.png

接下来就是配置下载接口和外部晶振了。

9ca60a674394da4cf1c7b1439fd764b0.pnge4438e33b43f7ed5785367f5c92693e1.png

然后记得要选择一个串口作为调试信息打印输出。

a96d8c2252739bd5b5faf1d1912d5dbb.png

选择Software Packs,进入后把AI相关的两个包点开,第一个打上勾,第一个选择Validation

688e37d2fc4d60f6c0029f64d7e36f0b.png5884edfade78fad7a86dc8ddb6c13e3e.png
  • 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选项卡。

b8da5d1e07eab508f33b2e30a71895cf.png

选择刚刚配置的串口作为调试用。

455cc6b1be5d63f80c18abaf8fb7dab2.png

点击add network,选择上述下载好的model点h5模型,选择压缩倍数8;

eb4a8b452ca373c1ac6b58a5f923943c.png

点击分析,可从中看到模型压缩前后的参数对比

1a41a703bd922d5dcf3f50218d7ec345.png

点击validation on desktop 在PC上进行模型验证,包括原模型与转换后模型的对比,下方也会现在验证的结果。

e30dd93d4b1f5f512d4a78601565ee38.png

致此,模型验证完成,下面开始模型部署

四、模型转换与部署

时钟配置,系统会自动进行时钟配置。按照你单片机的实际选型配置时钟就可以了。

f891239396f483405e65777cf77c38c2.pngdbff8f275eb8a048138b692b4214a9cc.png835294fa23a216ab34a72d50e161ed99.png

最后点击GENERATE CODE生成工程。

a27133942480948238d991bb299c8d6a.png

然后在MDK中编译链接。

f16774d2c010e6ea17ff554bf498c602.png

选择好下载器后就可以下载代码了。

b5218368526b6c9dd8aaae3e923fa300.png91bf1ccfd25305db76b1d691b3f74cf0.png

然后打开串口调试助手就可以看到一系列的打印信息了。

4419466bcd6431fa14693aeb3a929299.png

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

3d0a9c7f81cae054341ee1e85bdc1c50.png444ecc3bffbb9f24c9ba25c910069988.png

这次就这样先跑一下官方的例程,以后再研究一下,跑跑自己的模型。

参考资料:

  • https://youtu.be/grgNXdkmzzQ?t=10

  • https://youtu.be/grgNXdkmzzQ?t=103

7ac0333316e92e69fc0429031498c845.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF Edu54 E. Vasya and a Tree DFS+树状数组

Vasya and a Tree 题意: 给定一棵树,对树有3e5的操作,每次操作为,把树上某个节点的不超过d的子节点都加上值x; 思路: 多开一个vector记录每个点上的操作。dfs这颗树,同时以深度开一个树状数组,踩…

通信教程 | 串口丢数据常见的原因

UART:Universal Asynchronous Receiver / Transmitter,通用异步收发传输器,即我们通常说的串口。串口是工程师最常用的串行外设之一,但在实际应用中还是会经常遇到各种问题。比如:丢失一字节数据。今天我们就结合STM32…

三次握手 四次握手 与socket函数的关系

我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket&am…

110-简单类型之整数类型和小数类型

简单类型-整数 简单类型-小数 float myFloat12.5f;转载于:https://www.cnblogs.com/wuxiaohui1983/p/9965493.html

看了2022华为春季发布会

我之前在一家智能家居的公司干过,而且我是从0开始做的,所以对这个行业多少还是有点了解,我从技术人角度看一下这场发布会。看到了智能家居的几个产品,然后再想起来我们之前做的东西,嗯,感觉我们做的提前做了…

你们还在用8位单片机吗?

工作这些年,一种从事嵌入式相关的工作,大部分接触的是ARM芯片,不过也有接触到8位单片机的机会,在一些控制领域,8位单片机还是有自己的用武之地的,大家也来说一说,自己还有接触到8位单片机吗&…

TCP拥塞控制详解

为了防止网络的拥塞现象 ,TCP提出了一系列的拥塞控制机制。最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion avoidance)”组成,后来TCP Reno版本中又针对性的加入了“快速重传(Fast retransmit)”…

北航博士,研究所月入两万

大家好,看到张老师的一篇文章,说的一位研究生大哥的心路历程,分享给大家。作者:易贝贝https://www.zhihu.com/question/64371326/answer/2251105460文章转自:大鱼机器人北航博士,2019 年 7 月毕业&#xff…

c语言随机迷宫生成器,作为新手该如何快速上手 C++

1.C 实现基数树使用 C 实现Radix树:一种基于二进制表示的键值的查找树,尤其适合处理非常长的、可变长度的键值,Patricia 的基本思想是构建一个二叉树。2.C 实现并行计算的K-Means聚类算法使用 C 实现一个完整的面向对象的可并行K-Means算法。…

薪资是跳出来的,不是涨出来的!

下面的内容是转自朱老师的公众号,他说的观点我是认同的,之前在一个国外的论坛,有个老外总结了程序员的涨薪情况,里面就有提到,如果想拿到比较好的薪水,靠的还是跳槽。当然,他还总结了很多其他方…

团队Alpha冲刺(三)

目录 组员情况组员1(组长):胡绪佩组员2:胡青元组员3:庄卉组员4:家灿组员5:凯琳组员6:丹丹组员7:家伟组员8:政演组员9:鸿杰组员10:刘一好组员11:何…

快速排序非递归算法c语言实现,数据结构与算法----3.5 非递归的快速排序方法

[c]代码库#include using namespace std;#include using namespace std;typedef int KeyType;struct LElemType{KeyType key;};struct SElemType{int a;int b;};struct SList{LElemType *r;int length;};const int StackInitSize10;const int StackInc15;struct SStack{SElemTy…

C++类中成员变量的初始化总结

C类中成员变量的初始化总结 1. 普通的变量: 一般不考虑啥效率的情况下 可以在构造函数中进行赋值。考虑一下效率的可以再构造函数的初始化列表中进行。 1 class CA 2 { 3 public: 4 int data; 5 public: 6 CA(); 7 }; 8 9 CA::CA():data(0) //……#1……

今天把房子定下来了

今天同学L跟我说,今天付了定金,把买房子的事给定下了。先说下疫情这两年的房价在疫情之前,2019年那时候,深圳经历了一波房价上涨,那时候的房价上涨是我完全没有预料到的,但是在2015年房价的那一波房价上涨&…

android群英传 自定义滑动view,Android群英传学习之路-View的滑动

滑动效果是如何产生的?滑动一个View从本质上来说就是移动一个View,改变其当前的坐标。所以,想要滑动一个View,就必须监听该View的触摸事件,并且根据事件的坐标,不断的改变View的坐标从而实现View的滑动。An…

艹,正则表达式!

大家好,我是球哥,转发良许同学的一篇文章。不知道大家有没有被正则表达式支配过的恐惧?看着一行火星文一样的表达式,虽然每一个字符都认识,但放在一起直接就让人蒙圈了~你是不是也有这样的操作,比如你需要使…

Linux Centos安装步骤

在虚拟机VMware10上安装Centos系统步骤 (1)首先需要创建一个虚拟机,选择操作系统,进行一系列的硬件配置,选择Centos系统镜像 虚拟机创建完成 虚拟机创建完成后,重新启动虚拟机,就会自动开始安装CentOS系统的…

通信PK电子,谁牛?

工程师很多都有强迫症,有的是拆解强迫症,有的是排线布线强迫症,至今还记得第一堂焊电路板的课上,有同学把跳线排排焊,期末考获得了光荣的A。论起排线布线的手艺,早前,德国弱电工程师的完美布线让…

[机器视觉] SIFT特征-尺度不变特征理解

SIFT特征-尺度不变特征理解 简介 SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局…

harmonyos手机开发者beta,HarmonyOS 手机应用开发者 Beta 版到来,对开发者意味着什么...

北京时间12月16日,HarmonyOS手机开发者Beta活动在北京国贸开启,这场活动现场的人潮涌动也足以说明一切——用户和开发者对HarmonyOS手机应用开发者Beta版期待已久。作者 | 贾凯强头图 | 华为官方提供打破手机单设备限制,为万物互联而生在活动…