** 01. **
单片机的局限性
在单片机开发中,单片机的Flash和RAM大小一直是局限单片机应用的一大方面,以STM32F103C8T6为例,作为一款被极大广泛使用的32位单片机,它的实用性已经被时间所证明。但是作为一款十多年前的产品,它
64K的Flash和20K的RAM 实在有些捉襟见肘。
记得我最早接触到STM系列在神经网络方面的应用还是在使用OpenMV的时候,有一个对手写数字进行识别的功能。
作为一款基于STM32H7的摄像头产品,它有Plus版本和非Plus版本,二者的主要差距就是有没有足够的空间存放我们训练的模型。
同样的,STM32F103C8T6也是如此,64K的Flash实在难以支撑能装入多大的模型。但这就代表着STM32F103无法运行神经网络模型吗?或者换句话来说作为使用者,没有多少使用神经网络经验的使用者,一定要使用
高成本和高性能单片机或者烧录系统 才能部署神经网络吗?
答案是否定的,我们本期就来介绍一下STM AI生态系统中的 NanoEdge
.事实上越了解,就越是明白NanoEdge的亮点不仅仅是便利我们训练模型还有它在低成本单片机中部署模型的能力!
** 02. **
STM32的AI 生态系统
神经网络在嵌入式中的运用越来越多,前段时间ST的STM32N6也让人眼前一亮。我也出了很多期文章来介绍它们,在STM32的生态系统中,关于神经网络的运用大体可以分为两个部分:
NanoEdge AI和CubeAI
STM32 CubeAI
二者各有特点,前者帮助使用者 快速训练 一个适合的模型。后者帮助使用者将训练的 泛用模型 嵌入单片机中。
二者也各有缺点,NanoEdge的局限性比较大,主要用于传感器数据的异常检测、多分类模型的训练和部署,对于 图像数据 就有些束手无策。
CubeAI对于使用者要有很高的神经网络模型训练 经验 以及对这方面的技术知识要求,并且CubeAI并不能在如STM32F103这类芯片上部署。
本期我们用NanoEdge做一个 陀螺仪震动异常检测 识别。
** 03. **
NanoEdge
我们可以直接搜索NanoEdge AI免费下载NanoEdge AI.需要我们填写邮箱和一些信息,这时候我们会收到一封邮件,邮件中有 序列号
,第一次使用需要输入序列号激活。
当我们激活好NanoEdge AI之后,可以看到NanoEdge可以适用于以下四种模型训练:
从左到右分别是 异常检测、多分类模型、单分类模型、推理 。
例如我们如果想判断传感器数据是否异常,就可以利用异常检测来训练一个模型。
当我们需要对传感器数据进行分类,例如通过传感器的数值判断装置处于什么状态就可以使用n-Class来训练一个分类模型。
本期我们要使用的就是 异常检测 ,来判断陀螺仪数据是否异常。
** 04. **
异常检测
创建一个异常检测项目,芯片选择F1系列,限制一下芯片的RAM为20KB,Flash为64KB。传感器选择时间相关传感器,类型选择加速度计,轴数为3(XYZ)
这里不得不说距离我上次使用NanoEdge已经有几个月过去了,NanoEdge也有很多的更新,包括中文字符的使用还有其他传感器类型。
第二步是输入正常情况下的数据,这里需要注意一下数据的输入格式如上图,每一行的每一个数据用空格隔开,最后以换行符作为一行的结束。
这里的分隔符不一定要是空格,可以是逗号….但是一定要注意最后要用换行作为一行结束。
而且 不能是 数据 + 分割符号+换行符 结束 。
因此我上传数据的时候,在最后一行 手动加入一次换行符号 。
收集完足够的信号并分组检查之后,可以看到NanoEdge AI对我们的数据进行了离散傅里叶变换,将 时域数据转换为了频域数据
,这里需要注意最好采用2的倍数的数据量,比如128,256等。
这也就是为什么NanoEdge适合于传感器数据的使用而不适合用于图像数据处理的原因。
之后在输入一组异常信号,这里的异常信号我用摇晃作为演示。
完成了数据采集之后,对采集到的正常信号和非正常信号进行 模型训练
。随着模型的不断训练(这里好像是NanoEdge有一个庞大的库,它不断的测试合适的模型库和老版本的区别很大)
因此 不用等待训练完 ,当分数较高时,我们就可以选择一个合适的模型先对他进行验证。
异常检测的时候在使用模型之前需要对模型进行学习,需要 输入一些正常数据进行学习 ,这里需要输入二十组正常数据之后才能判断来使用。
之后就可以对模型进行验证,可以看到正不正常是取决于 预测分数 ,当分数低于阈值的时候,我们就可以认为数据属于异常数据。
测试满意的话就可以保存我们的模型啦,这样子我们得到了我们的模型文件 libneai.a和头文件NanoEdgeAI.h
** 05. **
下期预告
由于篇幅过长,本期我们介绍如何训练和获取模型文件,下次我们介绍如何在 STM32CubeIDE 中实现模型的部署和调用。