我在STM32单片机上跑神经网络算法 您所在的位置:网站首页 如何使用算法 我在STM32单片机上跑神经网络算法

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

#我在STM32单片机上跑神经网络算法| 来源: 网络整理| 查看: 265

01 

前言

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

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用到的原始数据

存储库包含以下文件

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

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

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有