作者:Jacob Beningo
机器学习 (ML) 在服务器和移动应用中已经风靡多年,现在这种趋势已蔓延到边缘设备,并且变得突出。由于边缘设备需要节能,因此开发人员需要学习和了解如何将 ML 模型部署到基于微控制器的系统中。在微控制器上运行的 ML 模型通常被称为 tinyML。然而,将模型部署到微控制器并非易事,但它正在变得越来越容易,没有经过任何专业培训的开发人员也能在规定时间完成部署。
本文探讨了嵌入式环境开发人员如何通过 STMicroelectronics 的 STM32 微控制器开始使用 ML。为此,文中展示了如何通过 X-CUBE-AI 将 TensorFlow Lite for Microcontrollers 模型转换用于 STM32CubeIDE,来创建“Hello World”应用。
tinyML 用例介绍
TinyML 是一个不断增长的领域,它将 ML 功能整合到微控制器等资源和功耗受限的设备中,通常采用深度神经网络。然后,这些微控制器设备可以运行 ML 模型,在边缘进行有价值的工作。以下几个用例中的 tinyML 非常值得关注。
第一个用例常见于许多移动设备和家庭自动化设备,即关键词识别。通过关键词识别,嵌入式设备可以使用麦克风捕获语音并检测预先训练的关键词。tinyML 模型使用表示语音的时间序列输入,将其转换为语音特征,通常为频谱图,其中包含随时间变化的频率信息。然后,将频谱图输入经过训练的神经网络,以检测特定的字词,结果就是检测到特定字词的概率。图 1 显示了这个过程的示例。
图 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 Embedded Group)
选择开发板
在研究如何转换 TensorFlow 模型以便在微控制器上运行之前,需要选择该模型中部署的微控制器。本文将重点介绍 STM32 微控制器,因为 STMicroelectronics 公司有许多 tinyML/ML 工具,可以很好地转换和运行模型。此外,STMicroelectronics 有多种与其 ML 工具兼容的元器件(图 3)。
图 3:图示为 STMicroelectronics AI 生态系统目前支持的微控制器和微处理器单元 (MPU)。(图片来源:STMicroelectronics)
如果办公室里有这样一块开发板,就非常适合启动和运行“Hello World”应用。然而,如果对本例之外的应用感兴趣,想要了解手势控制或关键词识别,可以选择 STM32 B-L4S5I-IOT01A 开发套件物联网节点(图 4)。
该开发板带有 STM32L4+ 系列 Arm Cortex®-M4 处理器。该处理器有 2 MB 闪存和 640 KB RAM,为 tinyML 模型提供了充足的空间。该模块还带有 STMicroelectronics 的 MP34DT01 微机电系统 (MEMS) 麦克风,可用于关键词识别的应用开发,适用于 tinyML 用例实验。此外,同样来自 STMicroelectronics 的板载 LIS3MDLTR 三轴加速计,可用于基于 tinyML 的手势检测。
图 4:STM32 B-L4S5I-IOT01A 开发套件物联网节点搭载 Arm Cortex-M4 处理器、MEMS 麦克风和三轴加速计,是适应性 tinyML 实验平台。(图片来源:STMicroelectronics)
使用 STM32Cube.AI 转换和运行 TensorFlow Lite 模型
凭借可以运行 tinyML 模型的开发板,开发人员现在可以开始对 TensorFlow Lite 模型进行转换,以便在微控制器上运行。TensorFlow Lite 模型可以直接在微控制器上运行,但需要一个运行时环境来处理它。
运行模型时,需要执行一系列的功能。这些功能首先收集传感器数据,然后筛选,提取必要特征,并反馈给模型。该模型输出结果,然后对结果进一步筛选,通常还会再进行一些操作。图 5 显示了该过程的概况。
图 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 Embedded Group)
启用 X-CUBE-AI 后,STMicroelectronics X-CUBE-AI 类别将出现在工具链中。点击该类别,开发人员能选择自己创建的模型文件并设置模型参数,如图 7 所示。可通过分析按钮对模型进行分析,并为开发人员提供 RAM、ROM 和执行周期信息。强烈建议开发人员比较 Keras 和 TFLite 模型选项。在较小的正弦波模型示例中,没有显著差异,但却可以发现其中的区别。点击“Generate code”(生成代码)可生成该项目。
图 7:分析按钮为开发人员提供 RAM、ROM 和执行周期信息。(图片来源:Beningo Embedded Group)
代码生成器将初始化项目,并为 tinyML 模型构建运行时环境。但默认情况下,不会为模型提供输入。开发人员需要添加代码,为模型提供输入值 — x 值,模型将解释该值并生成正弦 y 值。如图 8 所示,需要在 acquisition_and_process_data 和 post_process 函数中增加几段代码。
图 8:所示代码将连接伪输入传感器值到正弦波模型。(图片来源:Beningo Embedded Group)
此时,本例运行就绪。注意:添加一些 printf 语句来获取模型输出,以便快速验证。快速编译和部署能让“Hello World”tinyML 模型运行。获取整个周期的模型输出得到图 9 所示的正弦波。它并不完美,但对于首个 tinyML 应用来说非常优秀。由此,开发人员可以将输出与脉冲宽度调制器 (PWM) 联结起来,并产生正弦波。
图 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 应用。
· 尽管收集数据很有趣,但一般来说,购买或使用开源数据库来训练模型更容易。
开发人员遵循这些“技巧和窍门”,可以在确保应用安全的同时节省更多的时间并省去更多的麻烦。
总结
ML 已经蔓延至网络边缘,而基于资源受限微控制器的系统是其主要目标。最新的工具可以转换和优化 ML 模型,以在实时系统上运行。如图所示,在 STM32 开发板上实现和运行模型相对容易,但也会涉及复杂性问题。虽然只探讨了产生正弦波的简单模型,但也可以实现更复杂的模型,如手势检测和关键词识别。