为什么可以在STM32上面跑神经网络

发布者:WhisperingHeart最新更新时间:2023-06-28 来源: elecfans关键字:STM32  神经网络  CNN 手机看文章 扫描二维码
随时随地手机看文章

摘要:为什么可以在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框架训练:

为什么可以在STM32上面跑神经网络

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

模型介绍

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

为什么可以在STM32上面跑神经网络

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

为什么可以在STM32上面跑神经网络

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

为什么可以在STM32上面跑神经网络

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

为什么可以在STM32上面跑神经网络

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

为什么可以在STM32上面跑神经网络

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

为什么可以在STM32上面跑神经网络

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

为什么可以在STM32上面跑神经网络
为什么可以在STM32上面跑神经网络

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

为什么可以在STM32上面跑神经网络

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

为什么可以在STM32上面跑神经网络
为什么可以在STM32上面跑神经网络

  • 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选项卡。

为什么可以在STM32上面跑神经网络

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

为什么可以在STM32上面跑神经网络

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

为什么可以在STM32上面跑神经网络

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

为什么可以在STM32上面跑神经网络

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

为什么可以在STM32上面跑神经网络

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

四、模型转换与部署

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

为什么可以在STM32上面跑神经网络
为什么可以在STM32上面跑神经网络
为什么可以在STM32上面跑神经网络

最后点击GENERATE CODE生成工程。

为什么可以在STM32上面跑神经网络

然后在MDK中编译链接。

为什么可以在STM32上面跑神经网络

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

为什么可以在STM32上面跑神经网络
为什么可以在STM32上面跑神经网络

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

为什么可以在STM32上面跑神经网络

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

为什么可以在STM32上面跑神经网络
为什么可以在STM32上面跑神经网络

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


关键字:STM32  神经网络  CNN 引用地址:为什么可以在STM32上面跑神经网络

上一篇:stm32f103zet6与stm32f103rct6的区别
下一篇:STM32的中断机制 stm32中断方式有几种

推荐阅读最新更新时间:2024-11-03 04:20

008_STM32之_keil编译内存大小解析
Program Size: Code=28784 RO-data=6480 RW-data=60 ZI-data=3900 的含义 1. Code: 程序所占用的FLASH大小,存储在FLASH. 2. RO-data: Read-only-data,程序定义的常量,存储在FLASH中。 3. RW-data:Read-write-data,已经被初始化的变量,存储在SRAM中。 4. ZI-data:Zero-Init-data,未被初始化的变量,存储在SRAM中。 简单的说就是在烧写的时候是FLASH中的被占用的空间为: ROM(Flash) size = Code+RO-data+RW-data; 上面代码大小
[单片机]
008_STM32之_keil编译内存大小解析
STM32单片机PS2遥控小车
电路原理图如下: STM32单片机源程序如下: #include led.h #include delay.h #include sys.h #include usart.h #include pstwo.h /********************************************************* 功能:通过PS2控制小车运动 作者:大海电子 时间:180531 硬件平台:STM32F103C8T6 时钟:8Mhz 硬件引脚分配: //手柄接口 DI=PB12; DO=PB13 ; CS=PB14; CLK=PB15; //L298N 电机驱动控制引脚 IN1=PA0;
[单片机]
<font color='red'>STM32</font>单片机PS2遥控小车
STM32的JTAG用作普通IO口设置方法
1. 引脚 STM32F10x系列的MCU复位后,PA13、PA14、PA15、PB3、PB4 默认为JTAG下载调试功能,不能当做普通IO口使用,有时为了充分利用资源,一般使用SW来下载调试,即只需要PA13、PA14两个引脚即可 PA13 - JTMS/SWDIO PA14 - JTCK/SWCLK PA15 - JTDI PB3 - JTDO PB4 - JTRST 2. 代码 void jtag_to_io( void ){ GPIO_InitTypeDef GPIO_InitStructure; /*使能GPIOA GPIOB AFIO(关闭JTAG)*/ RCC_APB2PeriphClockC
[单片机]
STM32中结构体的学习
在STM32中经常遇到一些结构体的设置,结构体的好处不用多少了,仔细看《C语言设计》谭浩强版本,这样设计让项目很有层次,一目了然,这里介绍一下结构体指针在STM32库函数的应用,如下 例子: (GPIO_TypeDef *) 这里的作用是 把GPIO_BASE地址转换为GPIO_TypeDef结构体指针类型, 在C语言中经常遇到结构体指针,这样定义 GPIO_TyepeDef * a; 其中,a为结构体指针,而不是 * a是结构体指针,
[单片机]
<font color='red'>STM32</font>中结构体的学习
关于stm32寄存器地址定义的小结
最近一直在研读正点原子的stm32开发板,在学习SysTick寄存器的过程中查不到该寄存器的地址是在哪里定义的,很是不解。上网搜后发现 http://www.eepw.com.cn/article/246289.htm 部分代码粘贴如下: typedef struct { __IO uint32_t CTRL; /*! Offset: 0x000 (R/W) SysTick Control and Status Register */ __IO uint32_t LOAD; /*! Offset: 0x004 (R/W) SysTick Reload Value Register */ __IO uint32_
[单片机]
中国AI企业融资总额占全球70%,背后存在这怎样的隐患?
今年以来, 人工智能 领域的发展迎来了新一波高潮。   人工智能消费级应用落地的速度不断加快,同时,市场和需求愈加细分。   市场人士称,人工智能商业应用元年已经到来。   从无人问津到投资人踏破门槛 人工智能融资额不断提高   人工智能领域基础的芯片、大数据处理等是需要大投入的产业,只有获得充分的资金支持,才能持续发展。          2018年,人工智能领域大额融资频发。今年4月, 商汤科技 宣布完成6亿美元C轮融资,刷新记录;5月,商汤科技再次完成C+轮6.2亿美元融资,估值超45亿美金,创全球总融资额最大,资本对人工智能仍保持较高的热情。    对人工智能行业的初期创业者来说,找投资是最棘手的问题。2014年陈宁
[嵌入式]
stm32中断服务函数c语言,STM32中断使用总结——不使用固件库
ST提供的固件库给我们很大的方面,但我十分不喜欢使用固件库因为它不简洁等一些原因,所以自己不断琢磨怎么用汇编和C语言编写自己想要的程序。以定时器TMI1上溢中断的产生为例总结一下这种方法。硬件条件是:外部晶振使用HIE=6MHz;目标是:定时器每10S进中断一次使LED闪烁。 首先要知道这个中断(TIM1上溢事件)的中断向量地址在哪?汇编部分就是编写一个跳转程序,用来保证在产生中断时会跳入自己写的C程序中,这个可以参考启动代码STM32F10X.S中的复位函数的编写,但要注意地址的对准,这里不在赘述。 然后根据需要编写一个中断处理程序,这个里面必须将TIM1的上溢中断标志清零(TIM1_SR中第0位),否则时间没到程序一直
[单片机]
STM32的位带操作重谈嵌入式中寻址与对齐的理解
觉得这篇文章很不错,普及知识: 初接触STM32的人一定花了不少时间用于理解其位带操作(bit banding)的原理与步骤。位带操作允许编程人员以字的单位读/写单一bit位。回想我们平时对于一个bit位的操作比如: @- PIN0 |= (1 3); @- PIN0 &= ~(1 5); 虽然这只是一行代码,但是实际上这一行做了好几步的工作。比如第一行,首先读出当前PIN0的值放到缓存区,将1左移三位放入缓存区,将二者进行 或 操作,即将当前PIN0的第三位置位1,将结果存入到实际PIN0所在的地址,即更新了PIN0的值。当然实际写成汇编后可能步骤不见得一定一样,但是这几步工作是一定得做的。 而对于位带操作,S
[单片机]
从<font color='red'>STM32</font>的位带操作重谈嵌入式中寻址与对齐的理解
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved