用TF Micro和SensiML构建一个TinyML应用程序

135 阅读15分钟

SensiML 首席技术官Chris Knorowski的客座文章

TinyML降低了将人工智能添加到边缘的复杂性,在数据流回云端的情况下实现了新的应用。目前正在使用TinyML的一些应用的例子有::

  • 视觉和听觉唤醒词,当在图像中检测到一个人或说出一个关键词时,会触发一个动作。
  • 使用传感器持续监测异常行为,对工业机器进行预测性维护。
  • 医疗、消费和农业设备的手势和活动检测,如步态分析、跌倒检测或动物健康监测。

所有这些应用的一个共同因素是它们所运行的硬件的低成本和电力使用。当然,我们可以在台式电脑上检测音频和视觉唤醒词或分析传感器数据以进行预测性维护。但是,为了使很多这些应用可行,硬件需要便宜和省电(所以它可以在电池上运行很长时间)。

幸运的是,现在的硬件已经到了可以运行实时分析的程度。想想都觉得不可思议,但Arm Cortex-M4处理器每秒可以做比奔腾4处理器更多的FFT,而使用的功率却低了几个数量级。在传感器和无线通信方面也取得了类似的功率/性能提升。TinyML使我们能够利用这些硬件的进步来创造各种新的应用,这在以前是不可能的。

SensiML ,我们的目标是使开发者能够快速地将人工智能添加到他们自己的边缘设备中,使他们的应用程序能够自主地将原始传感器数据转化为有意义的洞察力。我们在创造依靠边缘优化的机器学习的产品中吸取了多年的经验教训,并将这些知识提炼成一个单一的框架,即SensiML分析工具包,它提供了一个端到端的开发平台,涵盖数据收集、标记、算法开发、固件生成和测试。

那么,建立一个TinyML应用需要什么呢?

构建一个TinyML应用程序涉及的技能包括硬件工程、嵌入式编程、软件工程、机器学习、数据科学和关于你正在构建的应用程序的领域专业知识。构建应用程序所需的步骤可分为四个部分。

  1. 收集和注释数据
  2. 应用信号预处理
  3. 训练一个分类算法
  4. 创建为边缘设备的资源预算而优化的固件

本教程将引导你完成所有的步骤,到最后你将为Arduino Nano 33 BLE Sense创建一个边缘优化的TinyML应用,该应用能够使用板载IMU传感器的陀螺仪和加速计传感器数据实时识别不同的拳击。

Gesture recognition using TinyML. Male punching a punching bag

你需要什么来开始

我们将使用SensiML分析工具箱来处理收集和注释传感器数据,创建一个传感器预处理管道,并生成固件。我们将使用TensorFlow 来训练我们的机器学习模型,并使用TensorFlow Lite Micro进行推理。在你开始之前,我们建议注册SensiML社区版,以获得SensiML分析工具箱的使用权。

软件

硬件

  • 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。

Nano 33 BLE Sense

battery connected to boxing glove

建立你的数据集

对于每个机器学习项目,最终产品的质量取决于你的数据集的质量。时间序列数据,与图像和音频不同,通常对每个应用都是独一无二的。正因为如此,你经常需要收集和注释你的数据集。本教程的下一部分将指导你如何连接到Nano 33 BLE Sense,通过BLE无线传输数据,并对数据进行标注,以便用于训练TensorFlow模型。

在这个项目中,我们将收集5个不同手势的数据,以及一些负面情况的数据,我们将其标记为未知。 我们要收集的5种拳击手势是刺拳、上手、横拳、钩拳上勾拳。

boxing gestures

我们还将收集左右两只手套的数据。这样我们总共有10个不同的类别。为了简化事情,我们将建立两个独立的模型,一个用于右手套,另一个用于左手套。本教程将重点讨论左手手套。

通过BLE从Nano 33流传传感器数据

TinyML项目的第一个挑战往往是要弄清楚如何从传感器上获取数据。根据你的需要,你可以选择Wi-Fi、BLE、串行或LoRaWAN。另外,你可能会发现将数据存储到内部的SD卡上,然后再传输文件是收集数据的最佳方式。在本教程中,我们将利用板载的BLE无线电,从Nano 33 BLE Sense中流传传感器数据。

我们将使用电脑上运行的SensiML开放网关来检索传感器数据。要下载并启动网关,请打开终端并运行以下命令。

git clone https://github.com/sensiml/open-gatewaycd open-gatewaypip3 install -r requirements.txtpython3 app.py

网关现在应该在你的机器上运行。

Gateway

接下来,我们需要将网关服务器连接到Nano 33 BLE Sense。确保你已经把数据收集固件刷到了你的Nano 33上。这个固件实现了简单流接口规范,创建了两个用于流数据的主题。/config主题返回描述传感器数据的JSON,/stream主题将原始传感器数据作为Int16值的字节数流。

要配置网关以连接到你的传感器。

  1. 在你的浏览器中进入网关地址(默认为localhost:5555)
  2. 点击 " 主页"标签
  3. 设置设备模式数据采集
  4. 设置连接类型BLE
  5. 点击扫描 按钮,并选择 ,名为Nano 33 DCL的设备
  6. 单击 "连接到设备 "按钮

SensiML Gateway

网关将从你的设备中提取配置,并准备好开始转发传感器数据。您可以通过进入测试流选项卡并点击开始流 按钮来验证它是否正常工作。

设置数据采集实验室项目

现在我们可以进行数据流,下一步是记录和标记拳击手势。要做到这一点,我们将使用SensiML数据采集实验室。如果你还没有这样做,请下载并安装数据采集实验室来记录传感器数据。

我们已经创建了一个模板项目来让你开始。该项目已经预先填充了手势标签和元数据信息,以及一些预先录制的手势示例文件。要把这个项目添加到你的账户中。

  1. 下载并解压Boxing Glove Gestures演示项目
  2. 打开数据采集实验室
  3. 点击上传项目
  4. 点击浏览,这将打开文件资源管理器窗口
  5. 导航到你刚刚解压的Boxing Glove Gestures Demo 文件夹,选择Boxing Glove Gestures Demo.dclproj文件。
  6. 点击上传

SensiML Data Capture Lab

连接到网关

上传项目后,你就可以开始采集传感器数据了。在本教程中,我们将通过TCP/IP将数据从网关流到数据采集实验室。要通过网关从数据采集实验室连接到Nano 33 BLE Sense。

  1. 打开 "拳击手套手势演示 "项目
  2. 点击切换模式->采集模式
  3. 选择连接方法。Wi-Fi
  4. 单击 "查找设备 "按钮
  5. 输入你的网关机器的IP地址,以及服务器运行的端口(通常是127.0.0.1:5555)。
  6. 点击添加设备
  7. 选择新添加的设备
  8. 点击 "连接 "按钮

wi-fi connection

你应该看到传感器数据在屏幕上流动。 如果您在这一步骤中遇到问题,请查看这里的完整文档以了解故障排除。

boxing gesture data streaming

捕捉拳击手势传感器数据

数据采集实验室还可以播放与你的传感器数据一起记录的视频。如果你想捕捉视频并将其与传感器数据同步,请看这里的文档。这在注释阶段非常有帮助,可以帮助解释在时间序列传感器波形的某一点上发生了什么。

现在,数据已经流入数据采集实验室,我们可以开始采集我们的手势数据集。

  1. 在 "捕捉属性 "屏幕中的标签下拉菜单中选择 "Jab"。(这将是文件的名称)
  2. 选择捕获上下文的元数据(主题、手套、经验等)。
  3. 然后点击开始 记录按钮 ,开始记录传感器数据
  4. 执行几个 "Jab "手势
  5. 完成后点击停止记录 按钮

在你点击停止记录后,捕获的数据将被保存在本地并与云项目同步。你可以通过进入项目资源管理器 ,双击新创建的文件来查看该文件。

GIF showing male boxing while program collects data

下面的视频介绍了捕捉传感器数据的方法。

对传感器数据进行注释

为了对传感器数据进行实时分类,你需要决定有多少和哪一部分的传感器数据流需要提供给分类器。在边缘设备上,这变得更加困难,因为由于有限的内存,你被限制在一个小的数据缓冲区。为一个应用确定正确的分割算法可以通过限制执行分类的数量来节省电池寿命,并通过识别手势的开始和结束来提高准确性。

分割算法的工作原理是接收来自传感器的输入并缓冲数据,直到它们确定找到了一个新的片段。在这一点上,他们将数据缓冲区传递给管道的结果。最简单的分割算法是滑动窗口,它不断向分类器提供一组数据块。 然而,滑动窗口在离散手势识别方面有很多缺点,例如在没有事件时进行分类。这就浪费了电池,并有可能使事件被分割到多个窗口,从而降低准确率。

在数据采集实验室中进行细分

我们在数据采集实验室中通过在传感器数据中的事件周围创建分段 来识别事件。当您打开一个文件并定义一个事件的位置时,分段显示为一对蓝色和红色线条。

数据采集实验室有两种方法来标记您的事件。手动自动。在手动模式下,您可以手动拖放一个片段到图表上,以确定传感器数据中的一个事件。自动模式使用一个分段算法,根据可定制的参数自动检测事件。在本教程中,我们将在自动模式下使用一个分段算法。我们用于确定事件的分割算法也将被编译为固件的一部分,这样设备上的模型将被输入它所训练的相同的数据段。

我们已经为这个项目创建了一个基于我们迄今为止收集的数据集的分割算法。对新采集的数据文件进行自动事件检测。

  1. 项目资源管理器中选择该文件
  2. 点击 "检测片段 "按钮
  3. 分割算法将针对捕获的数据运行,它发现的片段将被添加到文件中。

GIF of auto-segmentation

注意:如果事件与你文件中的真实片段不匹配,你可能需要调整分割算法的参数。

在数据采集实验室中对事件进行标记

请记住,自动事件检测只检测到一个事件的发生,它不确定发生了什么类型的事件*。* 对于检测到的每个事件,你需要给它们贴上一个标签。要做到这一点。

  1. 从图表中选择一个或多个片段
  2. 点击编辑按钮或**(Ctrl+E)**。
  3. 指定哪个标签与该事件有关
  4. 对捕获的所有片段重复步骤1-3
  5. 点击保存

GIF labeling data

建立一个TinyML模型

我们将使用Google Colab来训练我们的机器学习模型,使用我们在上一节从Nano 33 BLE Sense收集的数据。Colab提供了一个Jupyter笔记本,允许我们在网络浏览器中运行我们的TensorFlow训练。打开谷歌Colab笔记本,然后跟着训练你的模型。

**离线模型验证
**

保存模型后,去分析工作室执行离线验证。要针对任何捕获的数据文件测试该模型

  1. 摘要 标签中打开拳击手套手势演示项目

    SensiML analytics studio

  2. 转到测试模型标签

  3. 从 "模型名称"下拉菜单中选择你的模型

  4. 通过点击选择一个或多个捕获的文件

  5. 点击计算准确率 按钮 ,使用选定的模型对捕获的数据进行分类。

compute accuracy

p>当你点击计算准确率 按钮时,分割算法、预处理步骤和TensorFlow模型被编译成一个知识包。然后使用编译后的知识包计算您所选择的每个捕获物的分类结果和准确性。点击单个截图的结果 按钮,查看所有检测到的事件的分类,以及它们与地面真实标签的比较。

在Nano 33 BLE Sense上部署和测试

将模型下载为固件

现在你已经离线验证了模型,现在是时候看看它在边缘的表现了。为了做到这一点,我们将模型下载并闪存到Nano 33 BLE Sense。

  1. 进入分析工作室的下载模型标签
  2. 选择HW平台。 Arduino CortexM4
  3. 选择格式。库
  4. 点击 "下载 "按钮
  5. 编译后的库文件应该下载到你的电脑上

download knowledge pack

刷新固件

下载库后,我们将建立并上传固件到Nano 33 BLE Sense。对于这一步,你将需要Nano 33知识包固件。为了编译固件,我们将使用Visual Studio CodePlatform IO 插件。编译你的模型,用这个固件闪现Nano 33 BLE Sense。

  1. 打开你的终端,运行

    git clone https://github.com/sensiml/nano33_knowledge_pack/
    
  2. 解压下载的知识包。

  3. 在该文件夹中,你会发现以下目录。

    知识包_project/

    libsensiml/

  4. libsensiml 中的文件复制到 nano33_knowledge_pack/lib/sensiml。你将覆盖包括在资源库中的文件。

  5. 将文件从knowledgepack_project复制到nano33_knowledge_pack/src/

    Copy the files from knowledgepack_project to nano33_knowledge_pack/src/

  6. 在VS代码中切换到平台I/O扩展标签

  7. 用微型USB线把你的Nano 33 BLE Sense连接到你的电脑。

  8. 点击PlatformI/O标签nano33ble_with_tensorflow 下的Upload and Monitor

    Upload and Monitor tab

当设备重新启动时,它将启动,你的模型将自动运行。下面的视频介绍了这些步骤。

查看分类结果

要实时查看分类结果,请使用AndroidTestAppSensiML Open Gateway通过BLE连接到你的设备。当你扫描设备时,该设备将以Nano33 SensiML KP 的名称出现。我们已经训练了两个模型,一个用于左手套,一个用于右手套。你可以在下面的视频中看到两个模型同时运行的演示。

结论

我们希望这篇博客给你提供了开始使用TensorFlow Lite For Microcontrollers和SensiML Analytics Toolkit构建端到端TinyML应用程序所需的工具。更多关于TinyML应用的教程和例子,请查看我们文档中的应用实例。在LinkedIn上关注我们或与我们联系,我们喜欢听到社区正在开发的所有令人惊奇的TinyML应用!