借助STM32实现网络边缘的人工智能
发布于2023-04-12
几十年来,工程师和技术人员一直依靠建立在压力测试组件上的“最佳猜测”模型来规划和安排复杂系统的预测性维护。虽然这个概念本身并没有什么问题,但故障依然有可能过早地发生(硬件故障发生的概率通常随着时间推移遵循所谓的故障可能性浴盆曲线)。反之,对不需要任何维护的系统进行维护,就可能是一种资源(财力、人力、物力)的浪费。预测性维护 (PdM) 通过使维护决策成为数据驱动的过程来改变这种状况,其关键是由机器学习 (ML) 算法驱动的嵌入式设备,这些算法可以感知、处理和传达任何给定系统的健康指标。从历史上看,开发基于ML的解决方案是一个繁琐的过程,但STMicroelectronics (ST) 正在通过创新的硬件和软件解决方案,解决系统工程师在开发预测性维护功能时面临的挑战。
ST的B-U585I-IOT02A探索套件是一款开箱即用的强大开发平台。它采用STM32U585AI微控制器,基于ARM Cortex-M33内核、2MB闪存和786KB SRAM构建。此外,由于该板面向构建物联网 (IoT) 产品的开发人员,因而集成了许多易于访问的传感器,包括麦克风、温度和湿度计、磁力计、加速度计、陀螺仪、压力计、飞行时间传感器和手势检测传感器。如果你有定制硬件想要开展测试和集成工作的话,这块开发板还提供了标准的硬件接口,如Arduino Uno V3扩展板、STMod+和Pmod。最后,作为一款物联网开发套件,板载Wi-Fi和蓝牙模块也是必须有的。
当然,没有软件的硬件就像没有燃料的汽车。借助适用于Windows和Ubuntu Linux的NanoEdge AI Studio平台,为你的STM32硬件量身打造ML软件是非常简单的。Studio具有类似向导的界面,可引导你完成将ML算法定位到基于STM32的目标开发套件所需的五个步骤。训练模型的数据可以从文件上传,也可以从目标开发板实时上传。这是训练、构建和测试异常检测或分类ML算法的一种灵活而直接的方法。
项目材料与资源
本项目以STM B-U585I-IOT02A开发套件为中心。该套件专为需要利用ML技术的工业应用而设计,集成了许多板载传感器,可以方便地训练ML算法,并在部署期间运行推理引擎。本文中,我们将利用板载的ISM330DHCX,这是一款以工业为重点的系统级封装3D加速度计和陀螺仪,可在广泛的加速度和角加速度值范围内提供方便的数字输出,对于本文将详细介绍的项目非常有用。
物料清单 (BOM)
你可以点击这个贸泽项目共享链接来获取BOM表并查看其中的物料在贸泽的当前价格。截至本文撰写之时,该BOM表需要花费约65美元(不含适用的税费和运费)。表1列出了该BOM表中的物料。
表1:IOT2A NanoEdge AI Studio BOM
|
数量 |
贸泽编号 |
说明 |
|
1 |
511-B-U585I-IOT02A |
开发板和工具包 - 用于物联网节点的ARM探索套件,带STM32U5系列 |
项目资源
本项目所有源文件均可从GitHub存储库获取。该资源库由两个主要文件夹构成,包括:
Documentation
Documentation文件夹包含原理图的图形文件和其他重要参考资料。
Software
Software文件夹包含源代码。有关这些文件的更多信息,将在后文“软件开发”一节中进行介绍。该文件夹中的两个主要目录如下:
- iot2a_neai_training_application:包含一个应用程序的代码库,该应用程序将读取加速度计数据,并转为可供NanoEdge AI Studio应用程序内的ML训练模块(又称“信号”)使用的格式。
- iot2a_inferencing_application:包含由经过训练的ML模型生成的推理引擎代码,可用于开发一个项目,以响应B-U585I-IOT02A探索开发套件上的板载三轴加速度计产生的数据。
工具
本项目假定你可以使用以下工具:
- 具有高速Internet连接,运行Windows 10、Windows 11或Ubuntu Linux的计算机。
构建项目
工业设施在很大程度上依赖风扇的各种用途。保持空气流动,对于保持温度,去除空气中的颗粒物、异味和水分至关重要,实际用途还远不止于此。电机或风扇叶片发生故障,会对工业运营带来严重后果。本项目将演示如何借助机器学习,通过检测风扇外壳振动相对于受控基线的变化来确定风扇的运行状态。下一节包含启动和运行本项目的必要步骤,共包含以下几个小节:
- 将开发套件连接到开发计算机
- 设置软件开发工具链
- 软件开发:训练应用
- 软件开发:推理应用
- 实际运行
从产品工程师的角度来看,开发基于ML的设备可以分为三个主要步骤。首先,收集训练数据并对其进行分类;然后,利用训练数据创建神经网络,再对其性能进行基准测试,并根据需要进行调整。最后,将代码部署到端点设备,同时进行推理——也就是使用现实世界中未用于训练或测试/基准测试的实时数据来运行ML模型。
将开发套件连接到开发计算机
B-U585I-IOT02A探索开发套件(图1)具有三个不同用途的USB接口,包括一个USB-C接口 (CN1) 用于在正常操作期间为电路板供电、一个micro-USB接口 (CN12) 用于更新板载蓝牙模块,以及另一个micro-USB接口 (CN8) 供我们通过板载STLINKV3E在线编程器/调试器对STM32U585AI微控制器进行编程和调试,无需借助外部硬件!
图1:B-U585I-IOT02A探索开发板集成了许多用于开发ML应用的板载传感器。编程和调试通过位于电路板右侧的USB端口进行。(图源:Green Shoe Garage)
对Windows用户的重要提示:在连接B-U585I-IOT02A探索开发套件之前,需要先从ST网站下载并安装驱动程序,才能通过STLINK-V3E进行交互,否则可能导致开发板无法正确出现在虚拟COM端口列表中。
安装好驱动程序后,将USB数据线插入计算机和开发板。接下来,应将micro-USB数据线插入开发板右侧的micro-USB端口(CN8连接器)。最后,电源指示灯LED和UART通信LED应点亮。在Windows计算机上,应弹出通知表明检测到连接到系统的B-U585I-IOT02A探索开发板。
设置软件开发工具链
该项目由两个软件应用程序组成。第一个应用程序是采用C++编写的数据记录器,它从开发板获取传感器数据,并发送到NanoEdge AI Studio的训练工具。该应用程序将使用ARM Keil Studio Cloud集成开发环境 (IDE) 编写,可以访问这里建立免费帐户。对于本项目,我们首先需要设置一个数据记录器,来读取加速度计的三个轴。然后,我们将收集三个不同的数据集:第一个数据集将显示风扇处于关闭状态;第二个数据集将显示风扇处于故障模式,该故障模式由物体阻碍了叶片旋转而引起;第三个也是最后一个数据集将显示风扇处于正常工作状态。
NanoEdge AI Studio可在Windows 10和11以及Ubuntu Linux上运行。截至本文撰写时,可从此处下载Studio 3.0最新版本的90天免费试用版。但是,还是那句话:先下载STLINK驱动程序。这在上一节“将开发套件连接到开发计算机”里面已经讲过了。
ARM Keil Studio Cloud(图2)是一款基于Web的IDE,应可以在任何现代浏览器中运行。我们使用基于Chromium的浏览器,并安装了所有最新更新以便用于本项目。
图2:Keil Cloud IDE提供了一种通过基于Chromium的浏览器随时随地对开发板进行编程的便捷方式。(图源:Green Shoe Garage)
软件开发:训练应用
本项目的代码库是用C++编写的。首先,我们必须创建一个小型的数据记录器应用程序,它将加速度计数据从开发板发送到NanoEdge AI Studio训练软件。出于测试目的,我们将生成以下数据集用于训练:
- fan_off:该数据集包含开发板连接到风扇且风扇未运行时加速度计的值。加速度计将输出等于或接近0g的X、Y和Z加速度读数。
- fan_normal:该数据集包含风扇正常运行时加速度计的值。X、Y和Z加速度读数将相当一致,随着风扇的打开和关闭逐渐上升和下降。
- fan_failure:该数据集包含风扇旋转受阻导致机械故障时加速度计的值。X、Y和Z加速度值将随机快速变化。
当然,如果想要更精细的输出(也就是信号类),还可以创建额外的训练数据集。不过这里为了便于解释,我们保持这三种状态。
在访问板载ISM330DHCX加速度计之前,我们必须从ST的GitHub存储库中下载驱动程序。该驱动程序尚未包含在B-U585I-IOT02A探索开发板的标准板支持包 (BSP) 文件夹中。要克隆或下载ISM330DHCX库,请单击此处。
关于准备信号文件的重要提示:正确捕获感兴趣的现象所产生的信号,对于训练可靠的ML模型至关重要。信号文件是通过在有限的时间内对连续的传感器信号进行离散采样而生成的。回想一下:奈奎斯特准则要求以感兴趣的信号的最高频率分量的两倍速率来对信号进行采样。如果不这样做,可能会由于混叠效应而导致误报或漏报。有关收集训练数据以及格式化训练和测试数据文件的更多信息,请查看AI:NanoEdge AI Studio - stm32mcu。
关键文件
本项目的关键文件包括:
- main.cpp:包含生成UI的代码,以及事件发生(如屏幕打开、按钮按下等)时触发的回调代码
- ism330dhcx.c/.h:这些是板载ISM330DHCX加速度计的驱动程序文件。这些文件中包含的函数使开发人员能够在设备运行时操作加速度计的设置,并读取加速度值。
关键变量和常数
你可需要注意一些变量,可能还需要根据特定的设计选择来对它们进行调整。以下变量可以在main.cpp文件中找到:
- ISM330DHCX_Object_t ism330dhcx_object:允许我们与板载加速度计通信的对象。
- ISM330DHCX_AxesRaw_t acc_values:一种枚举数据类型,由表示x、y和z轴的三个uint_16_t值组成。
- float x, y, z:在main.cpp中本地存储加速度计值的地方。
- static int32_t ISM330DHCX_Probe(void):获取和设置板载加速度计设置的机制。
主要函数
main.cpp文件包含本项目的初始化代码、主循环和支持函数。支持函数包括:
- ISM330DHCX_ACC_Enable(&ism330dhcx_object):打开加速度计硬件。不进行此操作将产生垃圾数据。必须传递一个指向ism330dhcx对象的指针。
- ISM330DHCX_ACC_GetAxesRaw(&ism330dhcx_object, &acc_values):请求加速度计数据的机制。必须向它传递一个指向ism330dhcx对象的指针和一个指向枚举数据结构的指针,以存储x、y和z轴数据。
软件开发:推理应用
现在,数据记录器应用程序已经完成,是时候开发推理应用程序了,它将检测开发板上的实时运动或无运动。这部分项目的代码库也是用C++编写的。这一部分就可以展现出NanoEdge AI Studio(图4)的长处。它提供了一个简明的五步流程,用于为任何支持的STM32硬件平台和传感器构建、测试和部署函数推理引擎。快速浏览一下这五个步骤:
- Project Settings(项目设置):声明打算使用的开发板和传感器。
- Signals(信号):从文件中收集模型训练数据,或通过串行连接直接从开发板上收集数据。
- Benchmark(基准测试):创建ML模型,并测试其准确性和内存占用。
- Emulator(仿真):使用独立的测试数据测试模型。
- Deployment(部署):创建可在目标设备上运行的推理应用程序。
图3:NanoEdge Studio AI是一款可用于训练、测试ML算法并将其部署到嵌入式设备的强大工具。(图源:ST)
首先,我们在开发计算机上启动Studio应用程序。此时它会向我们展示可以构建的四种ML算法,分别是:
- Anomaly Detection(异常检测):用于使用动态模型检测数据中的异常。
- Class Classification(1级分类):用于使用静态模型检测数据中的异常。
- N-Class Classification(N级分类):用于使用静态模型区分n个不同状态。
- Extrapolation(外推):用于使用静态模型通过其他已知参数估计未知目标值。
对于本项目,我们选择N-Class Classification模型,然后选择Create New Project(创建新项目)。此举将从Project Settings(项目设置)步骤开始整个工作流程。
图4:训练ML模型的流程,从选择目标设备和首选传感器开始。(图源:ST)
Project Settings(项目设置)
该流程的第一步是选择我们的目标开发板,以及我们将从哪些板载传感器收集数据(图5)。对于本项目,选择如下:
- Name(名称):为这个特定项目指定一个标题。
- Target(目标):目标开发板,本例中选择Disco-B-U585I-IOT02A。
- Sensor Type(传感器类型):选择Accelerometer 3 axes(3轴加速度计)。
图5:NanoEdge AI Studio提供多种方式将训练引入到ML模型训练引擎中。这里的数据是通过USB串口从探索套件开发板上实时传输的。(图源:Green Shoe Garage)
Signals(信号)
开发ML模型的第二步,是从选定的开发板上收集真实世界的训练数据(图6)。为此,我们需要执行以下步骤:
- 单击ADD SIGNAL(添加信号)
- 选择FROM SERIAL (USB)(从串口 (USB))
- 选择正确的COM端口和波特率,本例中为9600bps。
- 勾选Maximum number of lines(最大行数)复选框,输入100。
- 单击START/STOP(开始/停止)按钮。等待所有100个数据点都完成收集。此时,输入的数据应可在Serial output(串行输出)文本框中看到,并且这些数据还会以图形方式绘制。
- 单击CONTINUE(继续)预览数据。
- 确保分隔符类型为space(空格)。
- 单击IMPORT(导入)。
- 在name(名称)文本框中为数据集命名(例如no_motion、at_rest等)。
- 单击RUN OPTIONAL CHECKS(运行可选检查),让Studio验证数据集中是否有常见错误。
-------
图6:NanoEdge AI Studio提供了一个基准测试工具来确定ML模型的准确性及其内存占用。(图源:Green Shoe Garage)
Benchmark(基准测试)
接下来,Studio将生成一个神经网络模型,然后针对数据集运行基准测试,以检查模型对训练数据的跟踪情况(图7)。此操作将报告准确度分数、置信度分数,以及模型在目标板上将消耗多少RAM和闪存。要运行基准测试,请执行以下操作:
- 单击RUN NEW BENCHMARK(运行新基准测试)。
- 在要进行基准测试的每个信号类别中打勾。
- 使用滑块调整希望专用于基准测试的CPU内核数。内核数越多,基准测试速度越快,但可能会使计算机运行变慢,具体取决于数据集的大小。
-------
图7:为了验证ML模型的性能,Studio提供一个基于浏览器的仿真器和一个可以在本地运行的仿真器,以根据测试数据和训练数据验证性能。(图源:Green Shoe Garage)
Emulator(仿真)
现在,我们有了一个可以工作的模型,我们可以运行一个仿真器,针对新的测试数据来测试该模型,检查它在没有用于训练的数据集上表现如何(图8)。简而言之,我们可以看到该模型在真实(尽管是仿真)世界中的工作情况。同样,测试数据可以作为文本文件上传,或通过USB从目标开发板上实时传输。要对ML模型进行仿真,请执行以下步骤:
- 选择要仿真的基准测试。
- 单击INITIALIZE EMULATOR(初始化仿真器)。或者,也可以在Linux或Windows计算机上本地运行仿真器。然后,选择适合计算机操作系统的仿真器。
- 选择正确的COM端口和波特率(对我们的代码而言,依然选择9600bps)。
- 单击START/STOP(开始/停止)按钮。
-------
图8:开发人员对ML推理引擎的性能感到满意后,只需单击几下鼠标即可将该模型部署到目标硬件。(图源:ST)
Deployment(部署)
流程的最后一步,是生成可以在目标板上运行的固件,以便在实际目标硬件上进行推理(图9)。同样,我们可以通过在复选框中打勾来选择几个选项(编译标志)。这些选项是:
- Multi-library(多库):如果要在程序中集成多个NanoEdge AI库,请选中此框,然后为每个库选择一个后缀。
- Float abi:指定“soft”时,GCC会生成包含浮点运算库调用的输出。指定“hard”时,会生成浮点指令并使用特定于FPU的调用约定。
- fshort-wchar:“-fshort-wchar”选项可以提高内存使用率,但可能会降低性能,因为窄内存访问的效率可能低于全寄存器宽度访问。默认值为“-fno-short-wchar”。wchar_t的默认大小为4字节。
- fshort-enums:“-fshort-enums”选项可以提高内存使用率,但可能会降低性能,因为窄内存访问的效率可能低于全寄存器宽度访问。默认值为“-fno-short-enums”。也就是说,无论枚举器值的值有多大,枚举器类型的大小至少是32位。
我们现在先不谈这些选项。准备生成推理引擎代码时,请执行以下步骤:
- 从下拉菜单中选择想要据此生成代码的基准测试。
- 单击COMPILE LIBRARY(编译库)生成代码,并下载包含推理代码的.ZIP文件。
- 复制生成的“hello world”应用程序,并将其粘贴到main.cpp推理应用程序文件中。-------
实际运行
项目完成总装和固件安装后,就可以开始验证推理引擎能否正常工作了。将USB电缆插入设备,就像之前进行编程和调试一样。将电路板放在实验室工作台上,然后启动串行终端,例如PuTTY。确保开发板放在风扇上,并且与收集训练数据集时连接的数据记录器的位置相同。如果位置不同,可能会导致误报和漏报。作为一般建议,将加速度计放在略微偏离旋转中心轴的位置,似乎会产生最好的结果。
确保选择了正确的COM端口,并将波特率设置为9600bps。来自推理引擎的数据将在几秒钟后开始通过串行端口实时传输。需要留意的关键值包括:
- class_name:推理引擎认为当前正在发生的类的名称(如in_motion、at_rest)。
- class_status:类的数字标识符。
- class_probability:所有枚举类的概率。使用class_status值作为可能的概率列表的索引来确定每个类的概率。
此例中,我们让风扇正常运行,推理引擎确定连接到风扇的加速度计正在检测正常的运动,并告诉我们选择了正确类的概率为99.97%(图10)。我们还选择了在最可能的类(概率超过80%)为fan_normal类时,点亮用户可定义的LED(连接到GPIO_Pin_7)。
-----有了这些对风扇健康状况的新认识,我们就可以开始建立主动的维护程序,当系统发出检测到异常行为的通知时就会触发。在我们的例子中(图11),这件事情非常简单:如果风扇处于fan_failure状态超过十分钟,我们就需要派一名技术人员去看看究竟出了什么问题。当然,这种支持ML的PdM还有许多其他用例,例如:
- 测量通过断路器的电流,分析电流消耗,作为机械健康状况分析或能源管理计划的一部分。
- 检测和分析管道系统中的流体流速,以检测是否存在堵塞;如果因堵塞而发生泄漏,将可能不得不采取代价高昂的环境补救措施。
- 检测冰箱内的异常温度、湿度和振动,帮助预测即将发生的故障,避免食材变质,从而帮助餐馆节省大量资金。
-------
图9:对加速度计放置位置进行试验,以优化结果。(左图)将开发板放在风扇电机外壳上;(右图)将开发板放在风扇保护罩上。将开发板放在电机外壳上似乎效果最好。(图源:Green Shoe Garage)
由STM的IoT02A探索套件及其NanoEdge AI Studio等智能技术解决方案驱动的预测性维护,正在改变我们规划、检查、维护和修理工业机械的方式。减少停机时间,同时优化资源利用(技术人员的时间、金钱、材料),意味着工业运营将无需过多地权衡利弊。维护不必是被动的或基于统计模型,也不需要“只是为了安全”而开展。将机器学习算法与低成本但功能强大的嵌入式系统相结合,即可真正地让智能、可预测维护成为今天我们看到的现实。如需进一步了解STM的IoT02A探索套件及其NanoEdge AI Studio,请访问此处:B-U585I-IOT02A Discovery套件 - STMicro | 贸泽
作者简介
专业工程师Michael Parks是Green Shoe Garage的所有者。Green Shoe Garage是一家提供定制电子设计的工作室和技术咨询机构,位于马里兰州南部。Michael Parks创办了《S.T.E.A.M. Power Podcast》播客来提升公众对科技的认知。他拥有马里兰州专业工程师资质,并拥有约翰·霍普金斯大学的系统工程硕士学位。