2021 年 5 月 7 日 - Chris Knorowski 的客座文章,SensiML首席技术官 TinyML 简化了在边缘添加 AI 的复杂性,从而实现新的应用程序,这些应用程序无法将流数据回传到云端。当前利用 TinyML 的一些应用程序示例包括:视觉和音频 唤醒词,当图像中检测到人或说出关键词时,它们会触发一个动作。使用传感器对工业机器进行预测性维护,以持续监控异常行为。用于医疗、消费和农业设备的姿势和活动检测,例如步态分析、跌倒检测或动物健康监测。
Chris Knorowski 的客座文章,SensiML 首席技术官
TinyML 简化了在边缘添加 AI 的复杂性,从而实现新的应用程序,这些应用程序无法将流数据回传到云端。当前利用 TinyML 的一些应用程序示例包括
所有这些应用程序的一个共同因素是它们运行的硬件的低成本和低功耗。当然,我们可以在台式电脑上检测音频和视觉唤醒词或分析传感器数据以进行预测性维护。但是,为了使许多这些应用程序变得可行,硬件需要廉价且节能(以便它可以长时间使用电池供电)。
幸运的是,硬件现在已经发展到可以进行实时分析的程度。令人难以置信的是,Arm Cortex-M4 处理器每秒可以执行的 FFT 比奔腾 4 处理器更多,同时功耗却低几个数量级。传感器和无线通信领域也取得了类似的功耗/性能提升。TinyML 允许我们利用这些硬件方面的进步,创建以前无法实现的各种新颖应用程序。
在 SensiML ,我们的目标是赋予开发人员快速将 AI 添加到其自己的边缘设备的能力,使他们的应用程序能够自主地将原始传感器数据转换为有意义的洞察。我们已经积累了多年创建依赖于边缘优化机器学习的产品的经验,并将这些知识提炼成一个单一框架,即 SensiML 分析工具包,它提供了一个端到端开发平台,涵盖数据收集、标记、算法开发、固件生成和测试。
那么构建 TinyML 应用程序需要什么?
构建 TinyML 应用程序需要涉及从硬件工程、嵌入式编程、软件工程、机器学习、数据科学到有关您正在构建的应用程序的领域专业知识等各种技能。构建应用程序所需的步骤可以分为四个部分
本教程将引导您完成所有步骤,最后您将为 Arduino Nano 33 BLE Sense 创建一个边缘优化的 TinyML 应用程序,该应用程序能够使用来自板载 IMU 传感器的陀螺仪和加速度计传感器数据实时识别不同的拳击拳法。
我们将使用 SensiML 分析工具包 来处理收集和标注传感器数据、创建传感器预处理管道以及生成固件。我们将使用 TensorFlow 来训练我们的机器学习模型,并使用 TensorFlow Lite Micro 来进行推理。在开始之前,我们建议您注册 SensiML 社区版 以获取访问 SensiML 分析工具包的权限。
Arduino Nano 33 BLE Sense 具有一个运行频率为 64 MHz 的 Arm Cortex-M4 微控制器,拥有 1MB Flash 内存和 256 KB RAM。如果您习惯于使用云/移动设备,这可能看起来很小,但许多应用程序可以在这种资源受限的环境中运行。
Nano 33 BLE Sense 还拥有各种板载传感器,这些传感器可用于您的 TinyML 应用程序。在本教程中,我们将使用运动传感器,它是一个 9 轴 IMU(加速度计、陀螺仪、磁力计)。
为了无线供电,我们使用了 Adafruit 锂离子电池背包。如果您没有电池背包,仍然可以使用足够长的 micro USB 线缆为板供电来完成本教程。虽然当您有线连接时,收集姿势数据并不像无线那样有趣。请参见下面的图像,展示了如何将电池连接到 Nano 33 BLE Sense。
对于每个机器学习项目来说,最终产品的质量取决于数据集的质量。与图像和音频不同,时间序列数据通常对每个应用程序都是独一无二的。因此,您通常需要收集和标注数据集。本教程的下一部分将引导您完成如何连接到 Nano 33 BLE Sense 以通过 BLE 无线流式传输数据以及标注数据以便将其用于训练 TensorFlow 模型的步骤。
在本项目中,我们将为 5 种不同的姿势收集数据,以及一些我们将标记为未知的负例数据。我们将收集数据的 5 种拳击姿势是Jab、Overhand、Cross、Hook 和Uppercut。
我们还将收集左右手套的数据。这样我们总共会得到 10 个不同的类别。为了简化操作,我们将构建两个独立的模型,一个用于右手套,另一个用于左手套。本教程将重点介绍左手套。
TinyML 项目的第一个挑战通常是弄清楚如何从传感器获取数据。根据您的需求,您可以选择 Wi-Fi、BLE、串行或 LoRaWAN。或者,您可能会发现将数据存储到内部 SD 卡并在之后传输文件是收集数据的最佳方式。在本教程中,我们将利用板载 BLE 无线电从 Nano 33 BLE Sense 流式传输传感器数据。
我们将使用运行在我们电脑上的 SensiML 开放网关 来检索传感器数据。要下载并启动网关,请打开终端并运行以下命令
git clone https://github.com/sensiml/open-gateway
cd open-gateway
pip3 install -r requirements.txt
python3 app.py
网关现在应该正在您的机器上运行。
接下来,我们需要将网关服务器连接到 Nano 33 BLE Sense。确保您已将 数据收集固件 刷写到您的 Nano 33。此固件实现了 简单流式传输接口规范,该规范创建了用于流式传输数据的两个主题。/config 主题返回描述传感器数据的 JSON,/stream 主题将原始传感器数据流式传输为 Int16 值的字节数组。
要配置网关连接到您的传感器
网关将从您的设备中提取配置,并准备开始转发传感器数据。您可以通过转到测试流选项卡并点击开始流按钮来验证其是否正常工作。
现在我们可以流式传输数据了,下一步是记录和标记拳击姿势。为此,我们将使用 SensiML 数据捕获实验室。如果您还没有,请 下载 并安装数据捕获实验室来记录传感器数据。
我们创建了一个模板项目来帮助您入门。该项目预先填充了姿势标签和元数据信息,以及一些预先录制好的示例姿势文件。要将此项目添加到您的帐户
上传项目后,您可以开始捕获传感器数据。在本教程中,我们将通过网关通过 TCP/IP 将数据流式传输到数据捕获实验室。要通过网关从数据捕获实验室连接到 Nano 33 BLE Sense
您应该看到传感器数据在屏幕上滚动。如果您在执行此步骤时遇到问题,请参阅完整文档此处以进行故障排除。
数据捕获实验室还可以播放与您的传感器数据一起记录的视频。如果您想捕获视频并将其与传感器数据同步,请参阅此处的文档。这在标注阶段非常有用,有助于解释在时间序列传感器波形中的特定时间点发生了什么。
现在,数据已流入数据捕获实验室,我们可以开始捕获手势数据集。
点击停止记录后,捕获的数据将被保存到本地并与云项目同步。您可以通过转到项目资源管理器并双击新创建的文件来查看该文件。
以下视频演示了如何捕获传感器数据。
要实时分类传感器数据,您需要确定要馈送到分类器的传感器流的多少和哪一部分。在边缘设备上,这变得更加困难,因为由于内存有限,您只能使用一小部分数据缓冲区。为应用程序识别正确的分割算法可以通过限制执行的分类次数来节省电池寿命,并通过识别手势的开始和结束来提高准确性。
分割算法通过接收来自传感器的输入并缓冲数据,直到它们确定找到了一个新的片段,从而工作。在这一点上,它们将数据缓冲区传递到管道的结果。最简单的分割算法是滑动窗口,它不断地将一组数据块馈送到分类器。但是,滑动窗口在离散手势识别方面存在许多缺点,例如在没有事件时执行分类。这会浪费电池,并冒着将事件分成多个窗口的风险,这会降低准确性。
我们通过在传感器数据中的事件周围创建片段来识别数据捕获实验室中的事件。当您打开一个文件并定义事件的位置时,片段将以一对蓝色和红色的线显示。
数据捕获实验室有两种方法可以为您的事件添加标签:手动和自动。在手动模式下,您可以手动将一个片段拖放到图形上,以识别传感器数据中的事件。自动模式使用分割算法根据可自定义的参数自动检测事件。在本教程中,我们将使用自动模式下的分割算法。我们用于确定事件的分割算法也将作为固件的一部分进行编译,以便设备上的模型将被馈送到与训练时相同的数据片段。
我们已经根据迄今为止收集的数据集为该项目创建了一个分割算法。要在新捕获的数据文件中执行自动事件检测
注意:如果事件与文件中的真实片段不匹配,您可能需要调整分割算法的参数。
请记住,自动事件检测只检测到事件已发生,它不会确定发生了哪种类型的事件。对于检测到的每个事件,您需要对其应用一个标签。为此
我们将使用Google Colab来训练我们的机器学习模型,使用我们之前从 Nano 33 BLE Sense 收集的数据。Colab 提供了一个 Jupyter 笔记本,允许我们在 Web 浏览器中运行我们的 TensorFlow 训练。打开Google Colab笔记本并按照说明训练您的模型。
保存模型后,转到Analytic Studio执行离线验证。要针对任何捕获的数据文件测试模型
现在您已经离线验证了模型,是时候看看它在边缘的表现如何了。为此,我们将模型下载并刷入 Nano 33 BLE Sense。
下载库后,我们将构建固件并将其上传到 Nano 33 BLE Sense。在此步骤中,您将需要Nano 33 知识包固件。为了编译固件,我们使用Visual Studio Code和Platform IO 插件。要编译您的模型并使用此固件刷入 Nano 33 BLE Sense
git clone https://github.com/sensiml/nano33_knowledge_pack/
knowledgepack_project/
libsensiml/
设备重启后,它将启动,并且您的模型将自动运行。以下视频演示了这些步骤。
要实时查看分类结果,请使用 Android TestApp 或SensiML Open Gateway通过 BLE 连接到您的设备。当您扫描设备时,该设备将显示为Nano33 SensiML KP。我们已经训练了两个模型,一个用于左手套,另一个用于右手套。您可以在以下视频中看到两个模型同时运行的演示。
我们希望这篇博文能为您提供开始使用 TensorFlow Lite for Microcontrollers 和 SensiML Analytics Toolkit 构建端到端 TinyML 应用程序所需的工具。有关 TinyML 应用程序的更多教程和示例,请查看我们文档中的应用程序示例。在LinkedIn上关注我们,或与我们联系,我们很乐意听到社区正在进行的所有令人惊叹的 TinyML 应用程序!