在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这颗树,同时以深度开一个树状数组,踩…

应用框架的设计与实现学习手札系列(持续更新)

应用框架的设计与实现学习手札 类工厂服务 应用框架的设计与实现学习手札之类工厂服务——反射 转载于:https://www.cnblogs.com/stwyhm/archive/2006/08/14/476061.html

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

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

电脑无法启动故障的10种解决方法

电脑无法启动故障的10种解决方法 开机自检时出现问题后会出现各种各样的英文短句,短句中包含了非常重要的信息,读懂这些信息可以自己解决一些小问题,可是这些英文难倒了一部分朋友,下面是一些常见的BIOS短句的解释,大家…

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

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

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

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

c语言 修改密码源码,基于51单片机串口密码修改设计-(源码+电路图)

名称:多功能电子密码锁(使用STM32平台 使用 keiluvision软件,用C语言写代码)系统由STM32单片机核心板电路、7位按键电路、串口电路、电源电路、液晶1602电路、继电器模块电路和LED灯指示电路组成。具体功能:①系统中有3组正确密码&#xff0c…

看了2022华为春季发布会

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

BackGroundWorker用法

在编程中经常会遇到在一个按钮中执行复杂操作,并将复杂操作最后返回的值加入一个ListView或ComboBox中候选。这个时候程序会卡,当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作时出现“线程间操作无效: 从不是创建控件的线程访问它”异常。 …

观易先生品三国

今天下了 易中天 易先生的品三国看了第一集 才知三国演义对三国历史曲解多深另外看到一副 剃头师傅的对联 颇有意思说是以关羽为祖师爷 颇有关羽的口气看天下头颅几许 看老夫手段如何转载于:https://www.cnblogs.com/slightboy/archive/2006/08/19/481439.html

TCP如何保证可靠性

TCP传输控制协议 TCP 协议是一种面向连接的,为不同主机进程间提供可靠数据传输的协议。TCP 协议假定其所使用的网络栈下层协议(如IP 协议)是非可靠的,其自身提供机制保证数据的可靠性传输。在目前的网络栈协议族中,在需…

c语言 数组循环移动,如何将一个数组的元素循环左移?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #define SIZE(a) (sizeof(a)/sizeof(a[0]))#define HBIT(a) ((a & 0x00000080) ! 0)#define LBIT(a) ((a & 0x00000001) ! 0)int TAB[] {0x10, 0x71, 0x12, 0x10, 0x10, 0x7C, 0x00, 0x00,0x00, 0x00, …

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

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

生成 excel 直接用 httpServletResponse 输出

之前写过一篇文章 《超详细的java生成excel文件并下载》,该文章虽然够详细,也行得通,但还是有一定的缺陷,该文章可以拆分成两个部分,一是指定位置生成excel文件,二是根据地址下载文件。缺陷的部分是会产生中…

获取网站投资(融资成功)的20个自我检查

1、web2.0提了也白提web2.0这是一个概念,打着web2.0的概念,只是说技术如何如何2.0,战略如何2.0,其实意 义真的不大。投资人需要的是一个网民能够接受,并且很有特点的网站,能够满足网民的某个需求&#xff0…

MYSQL AB复制原理

Mysql复制(replication)是一个异步的复制,从一个Mysql instace(称之为Master)复制到另一个Mysql instance(称之Slave)。实现整个复制操作主要由三个进程完成的,其中两个进程在Slave&…

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程序里总是提示缺少分号;,而明明有分号?...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼if(lpNULL)printf("********还没存入图书********\n");else{for(s0;s<5;s){while(( szp->snumber[s]!lp->number )&&(lp->next!NULL))lplp->next;if( szp->snumber[s]lp->number){printf(&…

django使用用户名或手机号码登录

django有自己的认证系统&#xff0c;会自动根据用户名和密码进行验证。如果需要使用用户名或手机登录的话&#xff0c;需要重写django的认证后台&#xff0c;并且设置到配置文件中。 重写django的认证后台 class UsernameMobileAuthBackend(ModelBackend):"""用…