所有教程由网友发布,仅供参考,请谨慎采纳。科创不对教程的科学性、准确性、可靠性负责。
STM32MCU边缘AI部署之初探NanoEdge AI Studio(一)
全桥整流2024/09/10原创 秋名山最速传说 IP:广东

前言:上星期去了ST的广州研讨会,得知低算力MCU(STM32F1)也能部署模型使用机器学习了(甚至还是好几年前的技术了),大为震惊。虽然STM32MCU算力不太高(反正也不准备跑图像,H7算力是够但价格高了),但对于多输入多输出的系统,可将上述系统抽象成一个黑箱,无需复杂的判断逻辑和建模即可输出结果,省去建模的烦恼,无疑是令人愉悦的。并且可以全系列部署,而且自动使用上万个模型匹配数据,每个模型都有自带的超参数等,据技术人员表述差不多是轮询一遍给出得分最高的模型。如果使用CubeAI会麻烦点,要自己一个一个转,没有这么方便。下面本人将NanoEdge AI Studio(下面简称为软件)的使用经验浅述一下。

本系列第二篇文章:STM32MCU边缘AI部署之再探NanoEdge AI Studio(二) - 科创网 (XXXXXXXXXXXX)


正文:

先摆上点参考链接

软件下载地址:NanoEdge AI Studio - STMicroelectronics - STM32 AI

软件的安装教程(其实不看这个也行,这个软件安装不算困难,免费使用的):边缘AI工具-NanoEdge AI Studio 安装教程_nanoedge ai 如何安装-CSDN博客

使用边缘AI改进嵌入式系统的一些例子:边缘AI案例研究 - STMicroelectronics

软件的使用说明:AI:NanoEdge AI Studio - stm32mcu (XXXXXXXXXXXXXXXXXXXXX)

7个详细的现实生活中的训练部署例子:分类:NEAI - 教程 - stm32mcu (XXXXXXXXXXXXXXXXXXXXX)

上面的上一级目录,资料会多一点:分类:NanoEdgeAI - stm32mcu (XXXXXXXXXXXXXXXXXXXXX)


下面直接进入正题,先把流程跑通,更详细的说明请阅读上面的链接,我这里跑个二分类作为例子(异常检测)。

1、打开软件(纯废话了),填入注册码。在下载软件时,你要填写邮箱,这个不能乱写,ST会发个注册码到你的邮箱的,激活要使用。

2、欣赏一下这个界面,左上是新建project的地方,我们可以看到支持四种类型的项目:异常检测,1 类分类,N 级分类,外推法(推理)。根据我们的需要,选择第一个异常检测。并create new project。

image.png

3、选板子和数据类型,我使用的是STM32L496,数据类型根据实际来选就行(更详细的信息参考ST的文档),比如说你收集陀螺仪三轴加速度数据,那就是3 Axis,我这里打算使用一维正态分布的两组不同期望的数据来跑流程,所以选1 Axis,然后,点next。什么?你问我板子哪里买到的?当然是研讨会送的啦 sticker

image.png

4、理解理解这个是什么意思,就比如说单纯收集陀螺仪的偏航角(YAW)作为样本,回传速率是600Hz,如果每次都只使用个数据来训练,那是学习不到数据之间的关系的,无法进行分类,所以一般是使用时间序列的方法。记录下时间连续的多个数据,这样子就可以学习特征。缓冲区大小应为 2 的幂次方并且不少于16(这个在数据生成的时候会再次提到)。每个传感器轴至少包含 20 行(信号示例,这个一般是多点好,但不绝对,要保证信号质量,减少杂波,ST的手册有提到)。点ADD导入数据。

image.png

5、由于我现在手上没有传感器的数据,直接用Python整些正态分布数据出来导入excel,当做传感器的数据,下面是生成正态分布的数据的.py程序。

import numpy as np
import pandas as pd

# 设置随机种子以确保结果可重复
np.random.seed(42)

# 生成一个形状为 (200, 16) 的矩阵,正态分布,期望为 3,标准差为 1
matrix = np.random.normal(loc=3, scale=1, size=(200, 16))

# 创建一个 DataFrame
df = pd.DataFrame(matrix)

# 将 DataFrame 导出为 CSV 文件
file_path = '3-1-200-16.csv'
df.to_csv(file_path, index=False)

上面生成的.csv大概是这样的,我们上面提到过的缓冲区大小(这里是16)通过excel表的数据很清晰的展现出来,行数不解释。

image.png

我们再生成一个形状为 (200, 16) 的矩阵,正态分布,期望为 3.5,标准差为 1。(这个不展示了)

6、从文件导入(第一个),从串口导入要烧录另外的程序,这个等开发板到了之后再试试。导入完continue。

image.png

7、删除多余的行,把第一行删掉。左边就是一些不同的数据分割方式,对于excel选第一个comma就行。注意,删除完第一个文件的点击show next删除下一个文件的。然后import

image.png

8、check一下,都是绿色通过就行。

image.png

9、点击上方的Abnormal signals,然后Add signal进去,和上面第6、7、8步一样的操作。

10、点上方的Benchmark,Run new benchmark,选一下两类信号,and Start!CPU马上咆哮起来(这里是用CPU跑的,不支持GPU)。

image.png

11、我训练个几分钟不训练了,不想等了直接Stop,有时间也可以等待全部跑完。下图一是训练过程,下图二是训练结果,图二的右上角有STM32F411使用硬件浮点加速器运算的耗时结果可供参考。另外上方第五个选项点进去可以看到其他模型出来的结果,也可以参考下。

image.png

image.png

12、点上方第6个Deployment,把模型down下来,下图二是down下来的压缩包的内容,里面包含:静态预编译的 NanoEdge AI 库文件 libneai.a、NanoEdge AI 头文件NanoEdgeAI.h、知识头文件(仅限分类和外推项目)knowledge.h、NanoEdge AI 仿真器(Windows 和 Linux 版本)。

中的一些库元数据信息metadata.json

image.png

image.png

13、有人会说,老湿啊,你这正确率也不高哇,怎么提升啊?直接把缓冲区大小提高(注意是2的幂次方,下面使用的大小是128)就行,我实际测试下来这个方法比增加训练时间获得的正确率提升要多,下面再生成两个.csv,分别是:

形状为 (200, 128) 的矩阵,正态分布,期望为 3,标准差为 1

形状为 (200, 128) 的矩阵,正态分布,期望为 3.5,标准差为 1

其他过程和上面一致,再丢进去跑一下......两分钟等待......效果显著

image.png

image.png

14、......没有14了......突然发现已经写了2500字,meow~(喵~)。


PS:由于实际采集数据会有回传速率限制,对MCU的响应速度也有要求,因此缓冲区大小不可能无限大。

PPS:前5有KC币,欢迎提建议和意见。

PPPS:算力表

stm32算力表.png

[修改于 7天6时前 - 2024/09/12 18:10:59]

+25  科创币    虎哥    2024/09/13 资瓷
来自:电子信息 / 电子技术计算机科学 / 软件综合严肃内容:教程/课程
8
4
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
WE24
9天2时前 IP:江苏
937298

记得这东西是转换模型文件的。

+0.5
科创币
全桥整流
2024-09-10
喵喵喵
引用
评论(1)
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
WE24
9天2时前 IP:江苏
937299

最新版本的软件已经集成了训练+部署功能,相较于旧版本还是有很大进步的。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
zRed洲虹
8天7时前 IP:上海
937335

喔 感谢分享!既然全系列,那f103这种老前辈也可以再折腾折腾咯 sticker

+0.5
科创币
全桥整流
2024-09-11
狠狠压榨老设备算力()
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
荷城工业_Nitload_Industry
3天0时前 IP:安徽
937518

好家伙,早两年知道的话,比赛项目中图形识别部分就不用那么麻烦了,估计用树莓派做锐化和二值化后直接交给32算就行了,比自己写框架折腾快多了(显然当时没写出来)

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
WernerPleischner
3天0时前 修改于 2天23时前 IP:广东
937519
引用荷城工业_Nitload_Industry发表于4楼的内容
好家伙,早两年知道的话,比赛项目中图形识别部分就不用那么麻烦了,估计用树莓派做锐化和二值化后直接交给...

什么舍近求远,放着四核A**不用跑到M*上面跑算法。。。

锐化二值化是上古视觉处理算法了,神经网络输入不需要预先经过这些步骤(因为CNN卷积层本来就是N个可以自适应的滤波器),二值化之后更是什么信息都不剩了。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
全桥整流作者
2天14时前 IP:广东
937533
引用荷城工业_Nitload_Industry发表于4楼的内容
好家伙,早两年知道的话,比赛项目中图形识别部分就不用那么麻烦了,估计用树莓派做锐化和二值化后直接交给...

如果你要跑图像,你要用CubeAI转换模型然后部署,我上文这个软件,它有Axis限制,最多是255,也就是说这个软件最大支持16×16的图像矩阵(当然这里不排除利用一些奇技淫巧(bushi)扩充)。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
荷城工业_Nitload_Industry
2天1时前 IP:安徽
937565
引用全桥整流发表于6楼的内容
如果你要跑图像,你要用CubeAI转换模型然后部署,我上文这个软件,它有Axis限制,最多是255,...

估计够用了,我们需要识别的也就是方形标牌上的两个数字。用OpenGL处理后应该是很容易控制在这个范围里的

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
全桥整流作者
1天15时前 IP:广东
937574
引用荷城工业_Nitload_Industry发表于7楼的内容
估计够用了,我们需要识别的也就是方形标牌上的两个数字。用OpenGL处理后应该是很容易控制在这个范围...

想想16×16的图像矩阵甚至都可以识别手写汉字了

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}