NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模
本教程将介绍如何为Arduino Nano 33 BLE Sense创建一个边缘优化的 TinyML 应用程序,该应用程序能够使用陀螺仪和加速度计传感器实时识别不同的拳击拳来自板载 IMU 传感器的数据。
1、TinyML简介
TinyML 降低了将 AI 添加到边缘的复杂性,支持将数据流回云的新应用程序令人望而却步。目前正在使用 TinyML 的一些应用程序示例如下:
- 当在图像中检测到人或说出关键字时触发动作的 视觉和听觉唤醒词。
- 使用传感器对工业机器进行预测性维护,以持续监控异常行为。
- 用于医疗、消费和农业设备的手势和活动检测,例如步态分析、跌倒检测或动物健康监测。
所有这些应用程序的一个共同因素是它们运行的硬件的低成本和低功耗。当然,我们可以检测音频和视觉唤醒词或分析传感器数据以在台式计算机上进行预测性维护。但是,要使这些应用程序中的许多应用程序可行,硬件需要便宜且节能(因此它可以使用电池长时间运行)。
幸运的是,硬件现在已经可以运行实时分析了。想起来很疯狂,但是Arm Cortex-M4处理器每秒可以执行比 Pentium 4 处理器更多的 FFT,而功耗却少了几个数量级。在传感器和无线通信方面也取得了类似的功率/性能增益。TinyML 使我们能够利用硬件的这些进步来创建以前根本不可能的各种新颖的应用程序。
SensiML的目标是让开发人员能够将 AI 快速添加到他们自己的边缘设备中,让他们的应用程序能够自主地将原始传感器数据转换为有意义的洞察力。我们在创建依赖于边缘优化机器学习的产品方面吸取了多年的经验教训,并将这些知识提炼成一个单一的框架SensiML Analytics Toolkit,它提供了一个端到端的开发平台,涵盖数据收集、标签、算法开发、固件生成和测试。
那么构建一个 TinyML 应用程序需要什么?
构建 TinyML 应用程序涉及的技能组合包括硬件工程、嵌入式编程、软件工程、机器学习、数据科学和有关您正在构建的应用程序的领域专业知识。构建应用程序所需的步骤可以分为四个部分:
- 收集和注释数据
- 应用信号预处理
- 训练分类算法
- 创建针对边缘设备资源预算优化的固件
2、准备软件和硬件
我们将使用SensiML Analytics Toolkit来处理收集和注释传感器数据、创建传感器预处理管道以及生成固件。我们将使用TensorFlow来训练我们的机器学习模型,并使用TensorFlow Lite Micro进行推理。在开始之前,我们建议您注册 SensiML Community Edition以访问 SensiML Analytics Toolkit。
软件
- 我们将使用SensiML Open Gateway,这是一个开源 python 应用程序,用于从边缘设备流式传输数据。
- 我们将使用SensiML Data Capture Lab (Windows 10) 来记录和标记传感器数据。
- 我们将使用Google Colab使用 TensorFlow Lite for Microcontrollers 训练我们的模型
- 我们将使用SensiML Analytics Studio进行固件的离线验证和代码生成
- 我们将使用带有平台 IO扩展的Visual Studio Code来刷新固件。
硬件
- Arduino Nano 33 BLE Sense
- Adafruit 锂离子背包附加组件(可选)
- 锂离子聚合物电池(3.7v 100mAh)
- 斑马字节案例
- 手套和双面胶带
Arduino Nano 33 BLE Sense具有运行频率为 64 MHz 的Arm Cortex-M4 微控制器,具有 1MB 闪存和 256 KB RAM。如果您习惯使用云/移动,这可能看起来很小,但许多应用程序可以在这种资源受限的环境中运行。
Nano 33 BLE Sense 还具有多种板载传感器,可用于您的 TinyML 应用程序。在本教程中,我们使用的是运动传感器,它是一个 9 轴 IMU(加速度计、陀螺仪、磁力计)。
对于无线电源,我们使用了 Adafruit 锂离子电池组。如果您没有电池组,您仍然可以使用适当长度的微型 USB 电缆为电路板供电来完成本教程。虽然在有线时收集手势数据并不那么有趣。请参阅下图将电池连接到 Nano 33 BLE Sense。
![](http://www.bimant.com/blog/content/images/2022/04/image-57.png)
![](http://www.bimant.com/blog/content/images/2022/04/image-60.png)
3、构建数据集
对于每个机器学习项目,最终产品的质量取决于数据集的质量。与图像和音频不同,时间序列数据通常对每个应用程序都是唯一的。因此,您经常需要收集和注释数据集。本教程的下一部分将引导您了解如何连接到 Nano 33 BLE Sense,以通过 BLE 无线传输数据并标记数据,以便用于训练 TensorFlow 模型。
对于这个项目,我们将收集 5 种不同手势的数据以及一些负面情况的数据,我们将其标记为未知。我们要收集数据的 5 个拳击手势是Jab、Overhand、Cross、Hook和Uppercut。
![](http://www.bimant.com/blog/content/images/2022/04/image-61.png)
我们还将收集左右手套的数据。给我们总共10个不同的分类。为了简化事情,我们将构建两个单独的模型,一个用于右手套,一个用于左手套。本教程将重点介绍左手套。
4、流式读取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
网关现在应该已经在你的机器上启动了。
![](http://www.bimant.com/blog/content/images/2022/04/image-62.png)
接下来,我们需要将网关服务器连接到 Nano 33 BLE Sense。确保你已将数据收集固件刷新到 Nano 33。该固件实现了简单流接口规范,该规范创建了两个用于流数据的主题。/config 主题返回描述传感器数据的 JSON,而 /stream 主题将原始传感器数据流式传输为 Int16 值的字节数组。
要配置网关以连接到您的传感器:
- 转到浏览器中的网关地址(默认为localhost:5555)
- 单击主页选项卡
- 设置设备模式:数据采集
- 设置连接类型:BLE
- 单击扫描按钮,然后选择 名为Nano 33 DCL的设备
- 单击连接到设备按钮
![](http://www.bimant.com/blog/content/images/2022/04/image-63.png)
网关将从你的设备中提取配置,并准备好开始转发传感器数据。可以通过转到Test Stream选项卡并单击Start Stream按钮来验证它是否正常工作。
5、设置Data Capture Lab项目
现在我们可以流式传输数据,下一步是记录和标记拳击手势。为此,我们将使用SensiML 数据捕获实验室。如果您还没有这样做,请下载并安装 Data Capture Lab 以记录传感器数据。
我们创建了一个模板项目来帮助你入门。该项目预先填充了手势标签和元数据信息,以及一些预先录制的示例手势文件。将此项目添加到你的帐户:
- 下载并解压缩拳击手套手势演示项目
- 打开数据采集实验室
- 点击上传项目
- 单击“浏览”将打开文件资源管理器窗口
- 导航到刚刚解压缩的Boxing Glove Gestures Demo文件夹并选择Boxing Glove Gestures Demo.dclproj文件
- 点击上传
![](http://www.bimant.com/blog/content/images/2022/04/image-64.png)
6、连接到网关
上传项目后,你可以开始捕获传感器数据。对于本教程,我们将通过 TCP/IP 从网关将数据流式传输到数据捕获实验室。通过网关从 Data Capture Lab 连接到 Nano 33 BLE Sense:
- 打开项目拳击手套手势演示
- 单击切换模式->捕获模式
- 选择连接方式:Wi-Fi
- 单击查找设备按钮
- 输入网关机器的 IP 地址和服务器运行的端口(通常为 127.0.0.1:5555)
- 点击添加设备
- 选择新添加的设备
- 单击连接按钮
![](http://www.bimant.com/blog/content/images/2022/04/image-65.png)
你应该会在屏幕上看到传感器数据流。如果在执行此步骤时遇到问题,请参阅此处的完整文档以进行故障排除。
![](http://www.bimant.com/blog/content/images/2022/04/image-66.png)
7、捕获拳击手势传感器数据
Data Capture Lab 还可以播放与传感器数据一起录制的视频。如果想捕捉视频并将它们与传感器数据同步,请参阅此处的文档。这在注释阶段非常有用,有助于解释时间序列传感器波形中给定点发生的情况。
现在数据正在流入数据捕获实验室,我们可以开始捕获手势数据集。
- 从Capture Properties屏幕的 Label 下拉菜单中选择“Jab” 。(这将是文件的名称)
- 选择捕获上下文的元数据(主题、手套、经验等)
- 然后单击Begin Recording按钮 开始记录传感器数据
- 执行几个“Jab”手势
- 完成后单击停止录制按钮
点击停止录制后,捕获的数据将保存在本地并与云项目同步。您可以通过转到Project Explorer并双击新创建的文件来查看该文件。
![](http://www.bimant.com/blog/content/images/2022/04/image-67.png)
8、标注传感器数据
要实时对传感器数据进行分类,你需要决定将传感器流的多少和哪一部分提供给分类器。在边缘设备上,由于 RAM 有限,只能使用少量数据缓冲区,因此变得更加困难。为应用程序识别正确的分割算法可以通过限制执行的分类次数以及通过识别手势的开始和结束来提高准确性来节省电池寿命。
分割算法的工作原理是从传感器获取输入并缓冲数据,直到它们确定找到了新的段。那时,他们将数据缓冲区向下传递给管道的结果。最简单的分割算法是滑动窗口,它不断地将一组数据提供给分类器。但是,对于离散手势识别,滑动窗口有很多缺点,比如在没有事件的情况下进行分类。这会浪费电池并冒着将事件拆分到多个窗口的风险,这会降低准确性。
9、Data Capture Lab中的分段
我们通过围绕传感器数据中的事件创建分段来 识别数据捕获实验室中的事件。当您打开文件并定义事件所在的位置时,段会显示为一对蓝线和红线。
![](http://www.bimant.com/blog/content/images/2022/04/image-68.png)
Data Capture Lab 有两种标记事件的方法:Manual和Auto。在手动模式下,你可以手动将片段拖放到图表上,以识别传感器数据中的事件。自动模式使用分段算法根据可自定义的参数自动检测事件。对于本教程,我们将在自动模式下使用分段算法。我们用于确定事件的分段算法也将作为固件的一部分进行编译,以便设备上的模型将被提供与训练时相同的数据段。
我们已经根据迄今为止收集的数据集为这个项目创建了一个分割算法。要对新捕获的数据文件执行自动事件检测:
- 从Project Explorer中选择文件
- 单击检测分段按钮
- 分割算法将针对捕获运行,它找到的段将被添加到文件中
![](http://www.bimant.com/blog/content/images/2022/04/image-69.png)
注意:如果事件与文件中的真实片段不匹配,您可能需要调整分割算法的参数。
10、在Data Capture Lab中标记事件
请记住,自动事件检测仅检测已发生的事件,并不能确定已发生的事件类型。对于检测到的每个事件,你都需要为它们应用标签。要做到这一点:
- 从图表中选择一个或多个段
- 单击编辑按钮或(Ctrl+E)
- 指定与该事件关联的标签
- 对捕获中的所有片段重复步骤 1-3
- 点击保存
![](http://www.bimant.com/blog/content/images/2022/04/image-70.png)
11、构建 TinyML 模型
我们将使用Google Colab使用我们在上一节中从 Nano 33 BLE Sense 收集的数据来训练我们的机器学习模型。Colab 提供了一个 Jupyter 笔记本,允许我们在 Web 浏览器中运行 TensorFlow 训练。打开 Google Colab笔记本并跟随训练你的模型。
12、离线模型验证
保存模型后,进入Analytic Studio进行离线验证。针对任何捕获的数据文件测试模型
1、在摘要选项卡 中打开拳击手套手势演示项目
![](http://www.bimant.com/blog/content/images/2022/04/image-71.png)
2、转到测试模型选项卡
3、从型号名称下拉列表 中选择您的型号
4、通过单击选择一个或多个捕获文件
5、单击Compute Accuracy按钮 以使用所选模型对捕获进行分类
![](http://www.bimant.com/blog/content/images/2022/04/image-72.png)
当你点击Compute Accuracy按钮时,分割算法、预处理步骤和 TensorFlow 模型将被编译到一个知识包中。然后使用编译的知识包计算你选择的每个捕获的分类结果和准确性。单击单个捕获的结果按钮以查看所有检测到的事件的分类以及它们与地面实况标签的比较情况。
13、在 Nano 33 BLE Sense 上部署和测试
13.1 下载固件
现在你已经离线验证了模型,是时候看看它在边缘的表现如何了。为此,我们将模型下载并闪存到 Nano 33 BLE Sense。
- 转到Analytics Studio 的下载模型选项卡
- 选择硬件平台: Arduino CortexM4
- 选择格式:图书馆
- 点击下载按钮
- 编译后的库文件应下载到你的计算机
13.2 刷新固件
下载库后,我们将构建固件并将其上传到 Nano 33 BLE Sense。对于此步骤,你将需要Nano 33 知识包固件。为了编译固件,我们使用带有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、将文件从知识包项目复制到nano33_knowledge_pack/src/
![](http://www.bimant.com/blog/content/images/2022/04/image-73.png)
6、切换到 VS Code 中的Platform I/O extension 选项卡
7、使用微型 USB 电缆 将Nano 33 BLE Sense连接到计算机。
8、单击PlatformI/O 选项卡中nano33ble_with_tensorflow下的 上传和监控。
![](http://www.bimant.com/blog/content/images/2022/04/image-74.png)
当设备重新启动时,它将启动并且模型将自动运行。
14、查看分类结果
要实时查看分类结果,请使用 Android TestApp或SensiML Open Gateway通过 BLE 连接到您的设备。当你扫描设备时,该设备将显示名称为Nano33 SensiML KP 。我们训练了两个模型,一个用于左手套,一个用于右手套。可以在下面视频中看到两个模型同时运行的演示。
![](http://www.bimant.com/blog/content/images/2022/04/image-75.png)
15、结束语
我们希望这篇博客为你提供了开始使用 TensorFlow Lite For Microcontrollers 和 SensiML Analytics Toolkit 构建端到端 TinyML 应用程序所需的工具!
原文链接:Building a TinyML Application with TF Micro and SensiML
BimAnt翻译整理,转载请标明出处