想在STM32 MCU上部署机器学习模型?这份入门教程,让你一学就会~

cathy的头像
cathy 发布于:周六, 10/08/2022 - 13:57 ,关键词:

机器学习 (ML) 在服务器和移动应用中已经风靡多年,现在这种趋势已蔓延到边缘设备,并且变得突出。由于边缘设备需要节能,因此开发人员需要学习和了解如何将ML模型部署到基于微控制器的系统中。

在微控制器上运行的ML模型通常被称为tinyML。然而,将模型部署到微控制器并非易事,但它正在变得越来越容易,没有经过任何专业培训的开发人员也能在规定时间完成部署。

本文探讨了嵌入式环境开发人员如何通过STMicroelectronics的STM32微控制器开始使用ML。为此,文中展示了如何通过X-CUBE-AITensorFlow Lite for Microcontrollers模型转换用于STM32CubeIDE,来创建“Hello World”应用。

tinyML用例介绍

tinyML是一个不断发展的领域,它将ML功能整合到微控制器等资源和功耗受限的设备中,通常采用深度神经网络。然后,这些微控制器设备可以运行ML模型,在边缘进行有价值的工作。以下几个用例中的tinyML非常值得关注。

第一个用例常见于许多移动设备和家庭自动化设备,即关键词识别。通过关键词识别,嵌入式设备可以使用麦克风捕获语音并检测预先训练的关键词。tinyML模型使用表示语音的时间序列输入,将其转换为语音特征,通常为频谱图,其中包含随时间变化的频率信息。然后,将频谱图输入经过训练的神经网络,以检测特定的字词,结果就是检测到特定字词的概率。图1显示了这个过程的示例。

“图1:关键词识别是tinyML的有趣用例。输入的语音被转换为频谱图,然后输入经过训练的神经网络,以确定是否有预先训练的字词。(图片来源:Arm®)"
图1:关键词识别是tinyML的有趣用例。输入的语音被转换为频谱图,然后输入经过训练的神经网络,以确定是否有预先训练的字词。(图片来源:Arm®)

许多嵌入式环境开发人员感兴趣的另一个tinyML用例为图像识别。微控制器从摄像头捕获图像,然后将其输入预先训练的模型。模型可以辨别图中的内容。例如,模型可以确定是否有猫、狗或者鱼等等。图像识别用于边缘的一个很好的例子是视频门铃。视频门铃通常可以检测门口是否有人,或者是否有放下的包裹。

最后一个非常常见的用例是用tinyML进行预见性维护。预见性维护使用ML基于异常检测、分类算法和预测模型来预测设备状态。同样,从HVAC系统到工厂车间设备,应用非常广泛。

尽管上述三个用例是目前常见的tinyML,但开发人员无疑还可以找到更多潜在的用例。以下是相关应用的列表:

  • 手势分类
  • 异常检测
  • 模拟量表读取器
  • 指导和控制 (GNC)
  • 包装检测

无论哪个用例,开始熟悉tinyML的最好方法是使用“Hello World”应用,它可以帮助开发人员学习和理解实现并运行一个最基础的系统所遵循的基本流程。在STM32微控制器上运行tinyML模型,有5个必要步骤:

1、捕获数据
2、标记数据
3、训练神经网络
4、转换模型
5、在微控制器上运行模型

捕获、标记和训练“Hello World”模型

关于捕获和标记用于训练模型所需的数据,开发人员通常有许多选择。首先,有大量的线上训练数据库。开发人员可以搜索他人收集和标记的数据。例如,对于基本的图像检测,有CIFAR-10或ImageNet。如需训练模型来检测照片中的微笑,也有一个图像集。从在线数据存储库开始显然是不错的选择。

如果所需的数据尚未在互联网上公开,开发人员也可以生成自己的数据。可以使用Matlab或其他工具来生成数据集。如果不能自动生成数据,也可以手动完成。最后,如果觉得这些都太耗时,也可在互联网上购买数据集。收集数据往往是最令人兴奋和有趣的选择,但也最费事。

这里探讨的“Hello World”示例展示了如何训练模型来生成正弦波并将其部署到STM32上。这个示例由Pete Warden和Daniel Situnayake整理,当时他们在谷歌开展TensorFlow Lite for Microcontrollers工作。这样一来,工作变得更容易,因为他们已经整理出了简单的捕获、标记和训练模型的公开教程。可以在Github上找到(点击此处);打开链接后,开发人员应点击“Run in Google Colab”(在Google Colab中运行)按钮。Google Colab是Google Collaboratory的简称,它允许开发人员在浏览器中编写和执行Python,无需配置,并提供对Google GPU的免费访问。

浏览训练示例将输出两个不同的模型文件;一个是为微控制器量化的model.tflite TensorFlow模型,一个是没有量化的model_no_quant.tflite模型。量化可以表明如何以数字方式存储模型的激活和偏置。量化后可以得到更小的模型,更适合于微控制器。好奇的读者可以在图2中查看训练过的模型结果与实际正弦波结果的对比。模型的输出以红色显示。正弦波输出并不完美,但对“Hello World”程序而言,其效果已经很好了。

“图2:TensorFlow模型正弦波预测与实际值的对比。(图片来源:Beningo
图2:TensorFlow模型正弦波预测与实际值的对比。(图片来源:Beningo Embedded Group)

选择开发板

在研究如何转换TensorFlow模型以便在微控制器上运行之前,需要选择该模型中部署的微控制器。本文将重点介绍STM32微控制器,因为STMicroelectronics公司有许多tinyML/ML工具,可以很好地转换和运行模型。此外,STMicroelectronics有多种与其ML工具兼容的元器件(图3)。

“图3:图示为STMicroelectronics
图3:图示为STMicroelectronics AI生态系统目前支持的微控制器和微处理器单元(MPU)。(图片来源:STMicroelectronics)

如果办公室里有这样一块开发板,就非常适合启动和运行“Hello World”应用。然而,如果对本例之外的应用感兴趣,想要了解手势控制或关键词识别,可以选择STM32 B-L4S5I-IOT01A开发套件物联网节点(图4)。

该开发板带有STM32L4+系列Arm Cortex®-M4处理器。该处理器有2MB闪存和640KB RAM,为tinyML模型提供了充足的空间。该模块还带有STMicroelectronics的MP34DT01微机电系统 (MEMS) 麦克风,可用于关键词识别的应用开发,适用于tinyML用例实验。此外,同样来自STMicroelectronics的板载LIS3MDLTR三轴加速计,可用于基于tinyML的手势检测。

“图4:STM32
图4:STM32 B-L4S5I-IOT01A开发套件物联网节点搭载Arm Cortex-M4处理器、MEMS麦克风和三轴加速计,是适应性tinyML实验平台。(图片来源:STMicroelectronics)

使用STM32Cube.AI转换和运行TensorFlow Lite模型

凭借可以运行tinyML模型的开发板,开发人员现在可以开始对TensorFlow Lite模型进行转换,以便在微控制器上运行。TensorFlow Lite模型可以直接在微控制器上运行,但需要一个运行时环境来处理它。

运行模型时,需要执行一系列的功能。这些功能首先收集传感器数据,然后筛选,提取必要特征,并反馈给模型。该模型输出结果,然后对结果进一步筛选,通常还会再进行一些操作。图5显示了该过程的概况。

“图5:数据如何从传感器流向运行时,再到tinyML应用的输出。(图片来源:Beningo
图5:数据如何从传感器流向运行时,再到tinyML应用的输出。(图片来源:Beningo Embedded Group)

STM32CubeMx的X-CUBE-AI插件提供了解释TensorFlow Lite模型的运行时环境,并提供了开发人员可以利用的替代运行时和转换工具。X-CUBE-AI插件在项目中默认不启用。然而,在创建新项目并初始化电路板后,在Software Packs-> Select Components(软件包-> 选择组件)下,有一个启用AI运行时的选项。这里有几个选项;确保本例中使用的是Application模板,如图6所示。

“图6:X-CUBE-AI插件需要使用本例的应用模板来启用。(图片来源:Beningo
图6:X-CUBE-AI插件需要使用本例的应用模板来启用。(图片来源:Beningo Embedded Group)

启用X-CUBE-AI后,STMicroelectronics X-CUBE-AI类别将出现在工具链中。点击该类别,开发人员能选择自己创建的模型文件并设置模型参数,如图7所示。可通过分析按钮对模型进行分析,并为开发人员提供RAM、ROM和执行周期信息。强烈建议开发人员比较Keras和TFLite模型选项。在较小的正弦波模型示例中,没有显著差异,但却可以发现其中的区别。点击“Generate code”(生成代码)可生成该项目。

“图7:分析按钮为开发人员提供RAM、ROM和执行周期信息。(图片来源:Beningo
图7:分析按钮为开发人员提供RAM、ROM和执行周期信息。(图片来源:Beningo Embedded Group)

代码生成器将初始化项目,并为tinyML模型构建运行时环境。但默认情况下,不会为模型提供输入。开发人员需要添加代码,为模型提供输入值 — x值,模型将解释该值并生成正弦y值。如图8所示,需要在acquisition_and_process_data和post_process函数中增加几段代码。

“图8:所示代码将连接伪输入传感器值到正弦波模型。(图片来源:Beningo
图8:所示代码将连接伪输入传感器值到正弦波模型。(图片来源:Beningo Embedded Group)

此时,本例运行就绪。注意:添加一些printf语句来获取模型输出,以便快速验证。快速编译和部署能让“Hello World”tinyML 模型运行。获取整个周期的模型输出得到图9所示的正弦波。它并不完美,但对于首个tinyML应用来说非常优秀。由此,开发人员可以将输出与脉冲宽度调制器 (PWM) 联结起来,并产生正弦波。

“图9:在
图9:在 STM32上运行时的“Hello World”正弦波模型输出。(图片来源:Beningo Embedded Group)

嵌入式系统上的ML技巧和窍门

开发人员若要在基于微控制器的系统上开始使用ML,需要做相当多的工作,才能让自己的首个tinyML应用运行起来。然而,记住几个“技巧和窍门”,可以简化和加快其开发:

  • 浏览TensorFlow Lite for Microcontrollers的“Hello World”示例,包括Google Colab文件。花点儿时间调整参数,了解这些参数对经过训练的模型的影响。
  • 在微控制器应用中使用量化模型。量化模型经过压缩,可以使用uint8_t而非32位浮点数。因此,该模型更小,执行速度更快。
  • 了解TensorFlow Lite for Microcontrollers资源库中的其他示例。其他示例包括手势检测和关键词检测。
  • 以“Hello World”为例,将模型输出连接到PWM和低通滤波器上,以查看产生的正弦波。执行运行时实验,增加和减少正弦波频率。
  • 选择包括“额外”传感器的开发板,以便尝试广泛的ML应用。
  • 尽管收集数据很有趣,但一般来说,购买或使用开源数据库来训练模型更容易。

开发人员遵循这些“技巧和窍门”,可以在确保应用安全的同时节省更多的时间并省去更多的麻烦。

本文小结

机器学习已经蔓延至网络边缘,而基于资源受限微控制器的系统是其主要目标。最新的工具可以转换和优化机器学习模型,以在实时系统上运行。如图所示,在STM32开发板上实现和运行模型相对容易,但也会涉及复杂性问题。虽然只探讨了产生正弦波的简单模型,但也可以实现更复杂的模型,如手势检测和关键词识别。

来源:得捷电子DigiKey
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 483