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

2023-05-16

01 


前言

为什么可以在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开发板

02 


AI神经网络模型搭建


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

bd5c115726b3c876615807998d03feba.png

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

2.1 模型介绍

在Keras中使用CNN进行人类活动识别:此存储库包含小型项目的代码。该项目的目的是创建一个简单的基于卷积神经网络(CNN)的人类活动识别(HAR)系统。该系统使用来自3D加速度计的传感器数据,并识别用户的活动。

例如:前进或后退。HAR意为Human Activity Recognition(HAR)system,即人类行为识别。

这个模型是根据人一段时间内的3D加速度数据,来判断人当前的行为,比如走路,跑步,上楼,下楼等,很符合Cortex-M系列MCU的应用场景。使用的数据如下图所示。

8a510ae6ae14273e3b5d654885049278.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模型,才是我们需要的。

03 


新建工程


1.  这里默认大家都已经安装好了STM32CubeMX软件。

在STM32上验证神经网络模型(HAR人体活动识别),一般需要STM32F3/F4/L4/F7/L7系列高性能单片机,运行网络模型一般需要3MB以上的闪存空间,一般的单片机不支持这么大的空间。

CUBEMX提供了一个压缩率的选项,可以选择合适的压缩率,实际是压缩神经网络模型的权重系数,使得网络模型可以在单片机上运行,压缩率为8,使得模型缩小到366KB,验证可以通过;

741a3c340fb9ae55dd5e384581022d31.png

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

b0193f52dba2c956a53b8039f241adcd.png

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

23b8d856c72fd0ed423b34a231212c39.png

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

68dd987ce3fce5eb3ea132d678f54b0e.png

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

c4fc61300f470d18d535a155a9274a24.png

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

9bba3a1f731cd5cbf0b9bec5c6783692.png41bcef1e606d090ed6296f75c68c77ac.png

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

6f459bd1c34e35a0a676436634332b93.png

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

e7e1f4f574e5c684009757c0f364c749.png5675a1671f06d1fbf78b961844425a76.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选项卡。

8e77aec52665650450313524e68c4ae0.png

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

ec06f79c9f23a1f0be2aa41c294f3c1b.png

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

c74642a2f73eee4cefefd3fd10b0aa3b.png

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

d48e4a175385ecd2f8b749a15e9cf3a5.png

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

c4445a1160eff5baeb72d4d9693bde5f.png

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

04 


模型转换与部署


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

193c22386b185217bb09de3c21895c83.pngdd043ace0fcaf9a91aef9a659f851290.pngcd4d67ba808544edbb4aacefaf5df5b8.png

最后点击GENERATE CODE生成工程。

271d53eceaee34253b60613e3e6712bb.png

然后在MDK中编译链接。

019c17b86dc8c60e5d8485da83aa44b7.png

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

bf02598d4466c3b93cfe3837a2b3a85f.png27d1d89601259bb1b03c94b8e0a46f0b.png

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

b3e52c5aafef308ff9a1fa73a8c9ff89.png

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

5b8dfbb42b121c4493e27a241c400ae9.png815a40d902cb6eff06bf61f3111dc698.png

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

参考资料:

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

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

8ce9f7d19c98b14218f9e6f1e51b651b.png

原来这些元器件最容易引发电路故障。。。

d60be748be9e01117a7fd903f5737b9b.png

模块化编程到底有多重要?

dcf5d7797402bd75b40cbab622195262.png

这些焊接不良,你遇见过吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我在STM32单片机上跑神经网络算法 的相关文章

  • 本地SVN服务器的搭建(WINDOWS环境)

    1 下载安装 VISUALSVN SERVER 1 1下载地址 xff1a https www visualsvn com server download 1 2下载完成后 xff0c 双击安装 2 下载安装 TortoiseSVN 1 1
  • 微信第三方平台全网发布流程

    版权声明 xff1a 本文为博主原创文章 xff0c 遵循 CC 4 0 BY SA 版权协议 xff0c 转载请附上原文出处链接和本声明 本文链接 xff1a https blog csdn net weixin 35829542 art
  • 百度短地址 API接口 985.so 是一个免费且好用的短地址

    文档URL http help baidu com question prod en 61 webmaster amp class 61 CD F8 D2 B3 CB D1 CB F7 CC D8 C9 AB B9 A6 C4 DC amp
  • Python图形GUI工具包tkinter如何调整元件在窗口中的位置几何布局管理

    Tkinter中的GUI总是有一个root窗口 不管你是主动或者别动获得 主窗口就是你的程序开始运行的时候创建的 在主窗口中你通常是放置了你主要的部件 另外 Tkinter脚本可以依据需要创建很多独立的窗口 主要的方法就是通过创建Tople
  • Mysql数据库的使用总结之ERROR 1146 (42S02)

    在使用 mysql 数据库过程中 xff0c 遇到了错误 ERROR 1146 42S02 xff1a Table doesn t exist xff0c 经过了两天 xff0c 终于解决了这个问题 引起该错误的原因不同 xff0c 对应的
  • 电子专业必懂的焊接知识与技能!

    点击上方 大鱼机器人 xff0c 选择 置顶 星标公众号 福利干货 xff0c 第一时间送达 焊接贴片元件需要的常用工具 让我们来了解一些常用的焊接贴片元件所需的一些基本工具 xff08 见图1 xff09 图1 手工焊接贴片元件所用到常用
  • HTTP消息中header头部信息的讲解

    HTTP Request的Header信息 1 HTTP请求方式 如下表 xff1a GET 向Web服务器请求一个文件 POST 向Web服务器发送数据让Web服务器进行处理 PUT 向Web服务器发送数据并存储在Web服务器内部 HEA
  • HTTP 状态码

    HTTP状态码 当浏览者访问一个网页时 xff0c 浏览者的浏览器会向网页所在服务器发出请求 当浏览器接收并显示网页前 xff0c 此网页所在的服务器会返回一个包含HTTP状态码的信息头 xff08 server header xff09
  • HTTP请求的header头解析

    Request Headers xff1a 下图是我访问一个URL xff1a http www hzau edu cn 的一个 header 根据具体实例来分析一下各部分的功能及其作用 Accept 作用 xff1a 浏览器端可以接受的媒
  • http请求消息体和响应消息体

    http www cnblogs com mydomain archive 2012 11 05 2754487 html HTTP 基于请求与响应模式的 无状态的 应用层的协议 xff0c 常基于TCP 的连接方式 HTTP 允许传输任意
  • HTTP Header 详解

    HTTP Header 详解 HTTP xff08 HyperTextTransferProtocol xff09 即超文本传输协议 xff0c 目前网页传输的的通用协议 HTTP协议采用了请求 响应模 型 xff0c 浏览器或其他客户端发
  • PHP模拟http请求

    http flandycheng blog 51cto com 855176 251752 方法一 xff1a 利用php的socket编程来直接给接口发送数据来模拟post的操作 建立两个文件post php getpost php po
  • HTTP 消息结构

    HTTP是基于客户端 服务端 xff08 C S xff09 的架构模型 xff0c 通过一个可靠的链接来交换信息 xff0c 是一个无状态的请求 响应协议 一个HTTP 34 客户端 34 是一个应用程序 xff08 Web浏览器或其他任
  • php 构造http头 php模拟http请求 伪装头部信息

    http jingyan baidu com article 335530daafcd6019ca41c352 html lt php 构造 http 请求 filename 61 34 http sj mjerp com dabenyin
  • 使用驱动器中J:的光盘之前需要将其格式化。

    http tieba baidu com p 3203627680 不知道神马原因致使U盘无法打开 大家千万注意 xff1a 以后遇见这种情况千万别格式化 xff08 当然如果你的U盘或者硬盘里没有重要东西那就另当别论 xff09 xff0
  • 404、500、502等HTTP状态码介绍

    一些常见的状态码为 xff1a 200 服务器成功返回网页 404 请求的网页不存在 503 服务不可用 详细分解 xff1a 1xx xff08 临时响应 xff09 表示临时响应并需要请求者继续执行操作的状态代码 代码 说明 100 x
  • 2020年电赛题目,命题专家权威解析!

    关注 星标公众号 xff0c 直达精彩内容 来源 xff1a 德州仪器TI校园计划 大学生电子设计竞赛培训网上次发了关于电赛题目前三道题目解析的视频 xff1a 2020年电赛题目 xff0c 命题专家们怎么看 xff1f xff0c 这篇
  • php curl请求信息和返回信息设置代码实例

    在用curl抓取网页内容的时候 xff0c 经常要知道 xff0c 网页返回的请求头信息 xff0c 和请求的相关信息 xff0c 特别是在请求过程中存在重定向的时候获取请求返回头信息对分析请求内容很有帮助 下面就是一个请求中存在重定向的例
  • URL特殊字符转义

    问题描述 xff1a 在工作中 xff0c 因为需要将另外一个系统的一批产品转移到自己系统 xff0c 产品基础资料什么的 xff0c 都没问题 xff0c 直接给字段插入数据库就好 xff0c 但是遇到了图片的问题 xff0c 图片是在别
  • PHP中GET/POST方法参数传递空格+逗号等特殊字符处理办法

    自己在项目开发中写了个自用接口 xff0c 用GET方法传参 xff08 用户名和密码 xff09 最近收到用户反馈 xff1a 密码为特殊字符时会出错 我一开始想是不是php的mysql real escape string函数将特殊字符

随机推荐