记得这东西是转换模型文件的。
前言:上星期去了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。
3、选板子和数据类型,我使用的是STM32L496,数据类型根据实际来选就行(更详细的信息参考ST的文档),比如说你收集陀螺仪三轴加速度数据,那就是3 Axis,我这里打算使用一维正态分布的两组不同期望的数据来跑流程,所以选1 Axis,然后,点next。什么?你问我板子哪里买到的?当然是研讨会送的啦 :
4、理解理解这个是什么意思,就比如说单纯收集陀螺仪的偏航角(YAW)作为样本,回传速率是600Hz,如果每次都只使用个数据来训练,那是学习不到数据之间的关系的,无法进行分类,所以一般是使用时间序列的方法。记录下时间连续的多个数据,这样子就可以学习特征。缓冲区大小应为 2 的幂次方并且不少于16(这个在数据生成的时候会再次提到)。每个传感器轴至少包含 20 行(信号示例,这个一般是多点好,但不绝对,要保证信号质量,减少杂波,ST的手册有提到)。点ADD导入数据。
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表的数据很清晰的展现出来,行数不解释。
我们再生成一个形状为 (200, 16) 的矩阵,正态分布,期望为 3.5,标准差为 1。(这个不展示了)
6、从文件导入(第一个),从串口导入要烧录另外的程序,这个等开发板到了之后再试试。导入完continue。
7、删除多余的行,把第一行删掉。左边就是一些不同的数据分割方式,对于excel选第一个comma就行。注意,删除完第一个文件的点击show next删除下一个文件的。然后import
8、check一下,都是绿色通过就行。
9、点击上方的Abnormal signals,然后Add signal进去,和上面第6、7、8步一样的操作。
10、点上方的Benchmark,Run new benchmark,选一下两类信号,and Start!CPU马上咆哮起来(这里是用CPU跑的,不支持GPU)。
11、我训练个几分钟不训练了,不想等了直接Stop,有时间也可以等待全部跑完。下图一是训练过程,下图二是训练结果,图二的右上角有STM32F411使用硬件浮点加速器运算的耗时结果可供参考。另外上方第五个选项点进去可以看到其他模型出来的结果,也可以参考下。
12、点上方第6个Deployment,把模型down下来,下图二是down下来的压缩包的内容,里面包含:静态预编译的 NanoEdge AI 库文件 libneai.a、NanoEdge AI 头文件NanoEdgeAI.h、知识头文件(仅限分类和外推项目)knowledge.h、NanoEdge AI 仿真器(Windows 和 Linux 版本)。
中的一些库元数据信息metadata.json
13、有人会说,老湿啊,你这正确率也不高哇,怎么提升啊?直接把缓冲区大小提高(注意是2的幂次方,下面使用的大小是128)就行,我实际测试下来这个方法比增加训练时间获得的正确率提升要多,下面再生成两个.csv,分别是:
形状为 (200, 128) 的矩阵,正态分布,期望为 3,标准差为 1
形状为 (200, 128) 的矩阵,正态分布,期望为 3.5,标准差为 1
其他过程和上面一致,再丢进去跑一下......两分钟等待......效果显著
14、......没有14了......突然发现已经写了2500字,meow~(喵~)。
PS:由于实际采集数据会有回传速率限制,对MCU的响应速度也有要求,因此缓冲区大小不可能无限大。
PPS:前5有KC币,欢迎提建议和意见。
PPPS:算力表
[修改于 2个月12天前 - 2024/09/12 18:10:59]
最新版本的软件已经集成了训练+部署功能,相较于旧版本还是有很大进步的。
喔 感谢分享!既然全系列,那f103这种老前辈也可以再折腾折腾咯
好家伙,早两年知道的话,比赛项目中图形识别部分就不用那么麻烦了,估计用树莓派做锐化和二值化后直接交给32算就行了,比自己写框架折腾快多了(显然当时没写出来)
引用荷城工业_Nitload_Industry发表于4楼的内容好家伙,早两年知道的话,比赛项目中图形识别部分就不用那么麻烦了,估计用树莓派做锐化和二值化后直接交给...
什么舍近求远,放着四核A**不用跑到M*上面跑算法。。。
锐化二值化是上古视觉处理算法了,神经网络输入不需要预先经过这些步骤(因为CNN卷积层本来就是N个可以自适应的滤波器),二值化之后更是什么信息都不剩了。
引用荷城工业_Nitload_Industry发表于4楼的内容好家伙,早两年知道的话,比赛项目中图形识别部分就不用那么麻烦了,估计用树莓派做锐化和二值化后直接交给...
如果你要跑图像,你要用CubeAI转换模型然后部署,我上文这个软件,它有Axis限制,最多是255,也就是说这个软件最大支持16×16的图像矩阵(当然这里不排除利用一些奇技淫巧(bushi)扩充)。
如果你要跑图像,你要用CubeAI转换模型然后部署,我上文这个软件,它有Axis限制,最多是255,...
估计够用了,我们需要识别的也就是方形标牌上的两个数字。用OpenGL处理后应该是很容易控制在这个范围里的
引用荷城工业_Nitload_Industry发表于7楼的内容估计够用了,我们需要识别的也就是方形标牌上的两个数字。用OpenGL处理后应该是很容易控制在这个范围...
想想16×16的图像矩阵甚至都可以识别手写汉字了
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。