客座文章,作者:Chris Knorowski,SensiML 首席技术官
TinyML 降低了向端侧添加 AI 的复杂性,在禁止将数据流式传输回云端的场景中实现了新的应用。目前正在使用 TinyML 的部分应用示例包括:
- 在图像中检测到某个人或说出关键词时,会触发操作的视觉和音频 唤醒词。
- 使用传感器持续监测异常行为的工业机器预测性维护。
- 医疗、消费者和农业设备的手势和活动检测,如步态分析、跌倒检测或动物健康监测。
所有这些应用的共同因素是它们所用硬件的低成本和低功耗。当然,我们可以在桌面设备上检测音频和视觉唤醒词或分析传感器数据来进行预测性维护。但是,为了支持更多应用,硬件必须便宜和省电(以在电池上运行更长时间)。
幸运的是,现在的硬件已经达到可以运行实时分析的程度。相较于奔腾 4 处理器,Arm Cortex-M4 处理器每秒的 FFT 更多,而功耗却低了几个数量级,这简直不可思议。在传感器和无线通信方面,功率/性能也具有类似提升。TinyML 让我们得以利用这些硬件进一步创建过去无法实现的各种新式应用。
在 SensiML,我们的目标是使开发者能够将 AI 快速添加到边缘设备,使其应用能够将原始传感器数据自主转换为有意义的数据分析。我们将创建依赖边缘优化机器学习的产品的多年经验提炼到单一框架 SensiML Analytics Toolkit 中,该框架提供了一个涵盖数据收集、标记、算法开发、固件生成和测试的端到端开发平台。
那么构建 TinyML 应用需要什么?
构建 TinyML 应用涉及的技能包括硬件工程、嵌入式编程、软件工程、机器学习、数据科学,以及与所构建应用相关的领域专业知识。构建应用所需的步骤可以分为四个部分:
1. 收集和注释数据
2. 应用信号预处理
3. 训练分类算法
4. 创建针对边缘设备的资源预算优化的固件
本教程将引导您完成所有步骤,为 Arduino Nano 33 BLE Sense 创建边缘优化的 TinyML 应用,该应用能够以板载 IMU 传感器的陀螺仪和加速度计传感器数据实时识别不同的拳击。
事前准备
我们将使用 SensiML Analytics Toolkit 处理传感器数据的收集和注释、传感器预处理流水线创建以及固件生成。我们将使用 TensorFlow 训练我们的机器学习模型,并使用 TensorFlow Lite Micro 进行推断。首先,我们建议您注册 SensiML Community Edition 以获得 SensiML Analytics Toolkit 的使用权。
软件
- 我们将使用开源 Python 应用 SensiML Open Gateway 从边缘设备流式传输数据。
- 我们将使用 SensiML Data Capture Lab (Windows 10) 记录和标记传感器数据。
- 我们将使用 Google Colab 以 TensorFlow Lite for Microcontrollers 训练我们的模型。
- 我们将使用 SensiML Analytics Studio 进行固件的离线验证和代码生成。
- 我们将使用带有 Platform IO 扩展的 Visual Studio Code 刷写固件。
硬件
- Arduino Nano 33 BLE Sense
- Adafruit Li-Ion Backpack 插件(可选)
- 锂离子聚合物电池 (3.7v 100mAh)
- Zebra Byte Case
- 手套和双面胶
Arduino Nano 33 BLE Sense 具有一个以 64 MHz 运行的 Arm Cortex-M4 微控制器,具有 1MB 闪存和 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 种拳击手势是前手直拳、大摆拳、后手直拳、勾拳和上勾拳。
我们还将收集左右两只手套的数据。由此得到总计 10 个不同的类。为简化起见,我们将建立两个独立的模型,一个用于右手套,一个用于左手套。本教程将重点讨论左手套。
通过 BLE 从 Nano 33 流式传输传感器数据
TinyML 项目的第一个挑战通常是理清如何从传感器获取数据。您可以根据需要选择 Wi-Fi、BLE、串行或 LoRaWAN。另外,最好的方式也可能是将数据存储到内部 SD 卡并在传输文件后收集数据。在本教程中,我们将利用板载 BLE 无线电流式传输来自 Nano 33 BLE Sense 的传感器数据。
我们将使用计算机上运行的 SensiML Open Gateway 检索传感器数据。要下载和启动网关,请先打开终端并运行以下命令:
git clone https://github.com/sensiml/open-gateway
cd open-gateway
pip3 install -r requirements.txt
python3 app.py
网关随后应开始在您的计算机上运行。
接下来,我们需要将网关服务器连接到 Nano 33 BLE Sense。确保已将 Data Collection Firmware 刷写到 Nano 33。此固件实现了 Simple Streaming Interface 规范,该规范创建了两个用于流式传输数据的主题。/config 主题返回描述传感器数据的 JSON,/stream 主题将原始传感器数据作为 Int16 值的字节数组流式传输。
要配置网关以连接到传感器,请执行以下操作:
1. 在浏览器中转到网关地址(默认为 localhost:5555)
2. 点击 Home 标签页
3. 设置 Device Mode: Data Capture
4. 设置 Connection Type: BLE
5. 点击 Scan 按钮,选择名为 Nano 33 DCL 的设备
6. 点击 Connect to Device 按钮
网关将从您的设备中提取配置,并准备开始转发传感器数据。您可以转到 Test Stream 标签页,点击 Start Stream 按钮验证其是否正常运作。
设置 Data Capture Lab Project
现在我们可以流式传输数据,下一步是记录和标记拳击手势。为此,我们将使用 SensiML Data Capture Lab。如果您尚未记录,应 下载 并安装 Data Capture Lab 记录传感器数据。
我们创建了一个模板项目来帮助您快速上手。该项目预先填充了手势标签和元数据信息,还带有一些预先记录的示例手势文件。要将此项目添加到您的帐号,请执行以下操作:
1. 下载并解压缩 Boxing Glove Gestures Demo 项目
2. 打开 Data Capture Lab
3. 点击 Upload Project
4. 点击 Brows e,查看文件资源管理器窗口
5. 导航到刚刚解压缩的 Boxing Glove Gestures Demo 文件夹,选择 Boxing Glove Gestures Demo.dclproj 文件
6. 点击 Upload
连接到网关
上传项目后,即可开始采集传感器数据。在本教程中,我们将通过 TCP/IP 从网关将数据流式传输到 Data Capture Lab。要通过网关从 Data Capture Lab 连接到 Nano 33 BLE Sense,请执行以下操作:
1. 打开项目 Boxing Glove Gestures Dem o
2. 点击 Switch Modes → Capture Mode
3. 选择 Connection Method:Wi-Fi
4. 点击 Find Devices 按钮
5. 输入网关机器的 IP 地址以及运行服务器的端口(通常为 127.0.0.1:5555)
6. 点击 Add Device
7. 选择新添加的设备
8. 点击 Connect 按钮
您应该可以在屏幕上看到传感器数据开始流式传输。如果您在这一步骤中遇到问题,请参阅 完整文档 进行问题排查。
采集拳击手势传感器数据
Data Capture Lab 还可以播放与传感器数据同时记录的视频。如果要采集视频并将其与传感器数据同步,请参阅 此处 的文档。这在注释阶段非常有用,有助于解释时间序列传感器波形中给定点处的情况。
现在,数据已经流式传输到 Data Capture Lab,接下来可以开始采集手势数据集。
1. 从 Capture Properties 屏幕的 Label 下拉列表选择“Jab”。(这将是文件的名称)
2. 选择采集背景(主题、手套、经验等)的元数据
3. 然后点击 Begin Recording 按钮,开始记录传感器数据。
4. 做出几个“Jab”(前手直拳)手势
5. 完成后点击 Stop Recording 按钮
点击停止记录后,采集的数据将在本地保存并与云项目同步。如果要查看文件,您可以转到 Project Explore r,双击新创建的文件。
以下视频将逐步介绍如何捕获传感器数据。
注释传感器数据
为了对传感器数据进行实时分类,您需要决定有多少和哪一部分的传感器数据流需要馈送到分类器。在边缘设备上这更为困难,因为 RAM 有限,您只能使用少量数据缓冲区。为应用确定正确的分割算法,可以通过限制执行的分类次数来节省电池电量,以及通过识别手势的开始和结束来提高准确率。
分割算法的工作原理是从传感器获取输入并缓冲数据,直至确定找到新的片段为止。随后,它们将数据缓冲区传递到流水线的结果。最简单的分割算法是滑动窗口,该窗口可连续将一组数据输入分类器。然而,滑动窗口在离散手势识别方面有很多缺点,例如在没有事件的情况下执行分类。这浪费了电量,并有可能使事件被分割到多个窗口,降低准确率。
在 Data Capture Lab 中分割
我们围绕传感器数据中的事件创建片段,标识 Data Capture Lab 中的事件。打开文件并定义事件所在位置时,片段会以一对蓝线和红线显示。
Data Capture Lab 有两种标记事件的方法:Manual 和 Auto。在 Manual 模式下,您可以手动将片段拖放到计算图上,标识传感器数据中的事件。Auto 模式使用分割算法根据可自定义的参数自动检测事件。在本教程中,我们将在 Auto 模式下使用分割算法。我们用于确定事件的分割算法也将被编译为固件的一部分,使设备上的模型获得与训练时相同的数据段。
我们已经根据到目前为止收集的数据集为此项目创建了分割算法。对新采集的数据文件执行自动事件检测:
1. 从 Project Explorer 选择文件
2. 点击 Detect Segments 按钮
3. 分割算法将针对采集运行,发现的片段将添加到文件中
注:如果事件与文件中的实际片段不匹配,则可能需要调整分割算法的参数。
在 Data Capture Lab 中标记事件
请注意,自动事件检测只会检测到事件已发生,而不能确定事件的类型。对于检测到的每个事件,您都需要为其添加标签。为此,请执行以下操作:
1. 从计算图中选择一个或多个片段
2. 点击 Edit 按钮或 (Ctrl+E)
3. 指定与该事件关联的标签
4. 对采集中的所有片段重复步骤 1-3
5. 点击 Save
创建 TinyML 模型
我们将使用 Google Colab 通过上一部分从 Nano 33 BLE Sense 收集的数据训练我们的机器学习模型。Colab 提供 Jupyter 笔记本,让我们可以在网络浏览器中运行自己的 TensorFlow 训练。打开 Google Colab 笔记本,然后继续训练模型。
离线模型验证
保存模型后,转到 Analytic Studio 进行离线验证。要针对任何采集的数据文件测试模型,请执行以下操作:
1. 在 Summary 标签页中打开 Boxing Glove Gestures Demo 项目
2. 转到 Test Model 标签页
3. 从 Model Name 下拉列表中选择您的模型
4. 点击选择一个或多个采集文件
5. 点击 Compute Accuracy 按钮,使用所选模型对采集进行分类。
点击 Compute Accuracy 按钮后,分割算法、预处理步骤和 TensorFlow 模型将被编译到一个知识包中。然后,您选择的每个采集的分类结果和准确率将以编译的知识包计算得出。点击单个采集的 Results 按钮,查看所有检测到的事件的分类及其与标准答案标签的比较。
在 Nano 33 BLE Sense
上部署和测试
将模型下载为固件
现在,您已经离线验证了模型,是时候看看它在边缘的表现了。为此,我们需要下载模型并将其刷写到 Nano 33 BLE Sense。
1. 转到 Analytics Studio 的 Download Model 标签页
2. 选择 HW Platform:Arduino CortexM4
3. 选择 Format:Library
4. 点击 Download 按钮
5. 编译后的库文件将下载到您的计算机
刷写固件
下载库后,我们将构建固件并将其上传到 Nano 33 BLE Sense。对于此步骤,您将需要 Nano 33 Knowledge Pack Firmware。为了编译固件,我们将使用包含 Platform IO 插件的 Visual Studio Code。要编译您的模型并使用此固件刷写 Nano 33 BLE Sense,请执行以下操作:
1. 打开并运行终端:
git clone https://github.com/sensiml/nano33_knowledge_pack/
2. 解压缩下载的知识包。
3. 在文件夹中,您将找到以下目录:
knowledgepack_project/
libsensiml/
**4.**将 libsensiml 中的文件复制到 nano33_knowledge_pack/lib/sensiml。您将覆盖存储区中包含的文件。
5. 将 knowledgepack_projec 中的文件复制到 nano33_knowledge_pack/src/。
6. 在 VS Code 中切换到 Platform I/O 扩展标签页。
7. 使用 Micro USB 数据线将 Nano 33 BLE Sense 连接到计算机。
8. 点击 PlatformI/O 标签页中 nano33ble_with_tensorflow 下的 Upload and Monitor。
它将在设备重启后启动,您的模型将自动运行。下面的视频介绍了这些步骤。
查看分类结果
要实时查看分类结果,可以使用 Android TestApp 或 SensiML Open Gateway 通过 BLE 连接到您的设备。扫描设备时,该设备将以 Nano33 SensiML KP 的名称显示。我们已经训练了两个模型,一个用于左手套,一个用于右手套。您可以在下面的视频中看到两个模型同时运行的演示。
结论
我们希望这篇博客能为您提供足够的工具,帮助您开始使用 TensorFlow Lite For Microcontrollers 和 SensiML Analytics Toolkit 构建端到端 TinyML 应用。有关 TinyML 应用的更多教程和示例,可以查看我们文档中的 应用示例。在 LinkedIn 上关注我们或 与我们联系,我们非常期待社区开发的出色 TinyML 应用!
原文:Building a TinyML Application with TF Micro and SensiML
中文:TensorFlow 公众号