如何在 Arduino 上开始使用机器学习
2019 年 10 月 15 日
Arduino 团队的 Sandeep Mistry 和 Dominic Pajak 的客座文章

Arduino 的使命是让机器学习足够简单,任何人都可以使用。在过去的几个月里,我们一直在与 TensorFlow Lite 团队合作,并很高兴向您展示我们一起取得的成果:将 TensorFlow Lite Micro 带到 Arduino Nano 33 BLE Sense。在本文中,我们将向您展示如何安装和运行多个新的 TensorFlow Lite Micro 示例,这些示例现在可在 Arduino 库管理器 中使用。

下面的第一个教程向您展示了如何在 Arduino 板上安装一个神经网络来识别简单的语音命令。

A microcontroller recognizing speech
示例 1:运行预训练的 micro_speech 推理示例。
接下来,我们将介绍一个更深入的教程,您可以使用它在 Colab 中使用 TensorFlow 训练您自己的自定义手势识别模型以供 Arduino 使用。此材料基于 Sandeep Mistry 和 Don Coleman 举办的实践研讨会,该研讨会的更新版本 现已在线

A microcontroller recognizing gestures
示例 2:训练您自己的手势分类模型。
如果您以前有使用 Arduino 的经验,您可能能够在几个小时内完成这些教程。如果您完全不熟悉微控制器,可能需要更长的时间。

我们很高兴与您分享一些首批示例和教程,并期待看到您将从这里构建什么。让我们开始吧!



注意:以下项目基于 TensorFlow Lite for Microcontrollers,该软件目前在 TensorFlow 库 中处于实验阶段。这仍然是一个新兴领域!

微控制器和 TinyML

微控制器,例如 Arduino 板上使用的微控制器,是低成本的单芯片、独立的计算机系统。它们是嵌入在数十亿台日常设备(如可穿戴设备、无人机、3D 打印机、玩具、电饭煲、智能插座、电动滑板车、洗衣机)中的无形计算机。连接这些设备的趋势是物联网的一部分。

Arduino 是一个开源平台和社区,专注于使微控制器应用程序开发对 所有人 易于使用。我们在这里使用的 具有以 64 MHz 运行的 Arm Cortex-M4 微控制器,配备 1MB 闪存和 256 KB RAM。与云、PC 或移动设备相比,这很小,但在微控制器标准中是合理的。

A microcontroller
Arduino Nano 33 BLE Sense 板比一块口香糖还小

您可能想要在微控制器上挤压 ML 的一些实际原因,包括

  • 功能 - 希望智能设备快速且本地(独立于互联网)地行动。
  • 成本 - 使用简单、低成本的硬件来实现这一点。
  • 隐私 - 不想将所有传感器数据共享到外部。
  • 效率 - 更小的设备外形尺寸、能量收集或更长的电池寿命。

我们正在努力实现的最终目标非常重要

  • 机器学习可以使微控制器对没有嵌入式开发背景的开发人员变得易于使用。

在机器学习方面,您可以使用一些技术将神经网络模型拟合到像微控制器这样的内存受限设备中。关键步骤之一是 将权重从浮点数量化为 8 位整数。这也使推理计算速度更快,更适用于低时钟速率的设备。

TinyML 是一个新兴领域,还有很多工作要做 - 但令人兴奋的是,那里有广阔的未开发应用空间。数十亿个微控制器与各种传感器结合,在各种地方,将来可能会产生一些非常有创意和有价值的 Tiny ML 应用程序。

开始使用需要什么


Arduino Nano 33 BLE Sense 具有各种板载传感器,这意味着可能有一些很酷的 Tiny ML 应用程序
  • 语音 - 数字麦克风
  • 运动 - 9 轴 IMU(加速度计、陀螺仪、磁力计)
  • 环境 - 温度、湿度和压力
  • 光线 - 亮度、颜色和物体接近度

与传统的 Arduino Uno 不同,该板将微控制器与板载传感器相结合,这意味着您可以解决许多用例,而无需额外的硬件或布线。该板也很小,可以用于可穿戴设备等最终应用。顾名思义,它具有蓝牙 LE 连接功能,因此您可以将数据(或推理结果)发送到笔记本电脑、移动应用程序或其他 BLE 板和外设。

提示:USB 记忆棒上的传感器

通过 USB 连接 BLE Sense 板是一种简单的方法,可以捕获数据并将多个传感器添加到单板计算机,而无需额外的布线或硬件 - 例如,对 Raspberry Pi 来说是一个不错的补充。

TensorFlow Lite for Microcontrollers 示例

TensorFlow Lite for Microcontrollers 的推理示例现在已打包并可通过 Arduino 库管理器使用,可以轻松地在 Arduino 上包含并运行它们。在本节中,我们将向您展示如何运行它们。这些示例是
  • micro_speech - 使用板载麦克风进行语音识别
  • magic_wand - 使用板载 IMU 进行手势识别
  • person_detection - 使用外部 ArduCam 相机进行人物检测

有关这些示例的更多背景信息,您可以查看 TensorFlow 库 中的源代码。这些示例中的模型已在之前进行过训练。以下教程向您展示了如何在 Arduino 上部署和运行它们。在下一节中,我们将讨论训练。

如何使用 Arduino Create 网页编辑器运行示例

将 Arduino Nano 33 BLE Sense 连接到台式机上的 USB 线缆后,您将能够通过使用 Arduino Create 网页编辑器在板上编译和运行以下 TensorFlow 示例。

The Arduino Create web editor
从 Arduino_TensorFlowLite 库编译示例

重点介绍语音识别示例:micro_speech

使用 Arduino 板的第一步之一是让 LED 闪烁。在这里,我们将使用 TensorFlow Lite Micro 来识别语音关键字,从而实现这种方式。它具有简单的“yes”和“no”词汇表。请记住,此模型是在本地在微控制器上运行的,只有 256 KB 的 RAM,因此不要期望商用“语音助手”级别的准确性 - 它没有互联网连接,并且可用的本地 RAM 大约是它的 2000 倍。

请注意,该板也可以由电池供电。由于 Arduino 可以连接到电机、执行器等等,因此这为语音控制项目提供了可能性。

A microcontroller recognizing speech
运行 micro_speech 示例

如何使用 Arduino IDE 运行示例

或者,您可以尝试使用 Arduino IDE 应用程序运行相同的推理示例。首先,按照下一节设置 Arduino IDE中的说明进行操作。

在 Arduino IDE 中,您将看到通过文件 > 示例 > Arduino_TensorFlowLite菜单在 ArduinoIDE 中提供的示例。

选择一个示例,草图将打开。要编译、上传并在板上运行示例,请单击箭头图标


对于喜欢使用命令行的高级用户,还有 arduino-cli

训练用于 Arduino 的 TensorFlow Lite Micro 模型

A microcontroller recognizing gestures
Arduino BLE 33 Nano Sense 上的手势分类,输出为 Emoji
接下来,我们将使用 ML 使 Arduino 板能够识别手势。我们将从 Arduino Nano 33 BLE Sense 板捕获运动数据,将其导入 TensorFlow 以训练模型,并将生成的分类器部署到该板。

本教程的想法来自 Charlie Gerard 的精彩作品 使用 Arduino 和 Tensorflow.js 通过身体动作玩街霸。在 Charlie 的示例中,该板将从 Arduino 流式传输所有传感器数据到另一台机器,该机器在 Tensorflow.js 中执行手势分类。我们将此推进一步,并通过在 Arduino 板本身上执行手势分类来实现“TinyML 化”。在我们这种情况下,这变得更容易,因为我们使用的 Arduino Nano 33 BLE Sense 板具有更强大的 Arm Cortex-M4 处理器和一个板载 IMU。

我们已经调整了以下教程,因此无需额外的硬件 - 采样在检测到板的运动时开始。教程的原始版本添加了一个面包板和一个硬件按钮,用于按下以触发采样。如果您想使用一些硬件,可以按照该版本进行操作。

设置 Arduino IDE

按照以下步骤设置 Arduino IDE 应用程序,该应用程序用于在下一节中将推理模型上传到您的板子以及从板子上下载训练数据。与使用 Arduino Create 网页编辑器相比,这里需要多做几步,因为我们需要在 Arduino IDE 中下载和安装特定的板子和库。

The Arduino website

  • 从 https://arduino.cc/downloads 下载并安装 Arduino IDE
  • 打开您刚刚安装的 Arduino 应用程序
  • 在 Arduino IDE 菜单中,选择 **工具 > 板 > 板管理器…**
  • 搜索“Nano BLE”,然后点击板子上的安装按钮
  • 安装过程需要几分钟
  • 安装完成后,关闭板管理器窗口
Board manager window

  • 现在,转到库管理器:**工具 > 管理库…**
  • 搜索并安装 Arduino_TensorFlowLite 库
  • 接下来,搜索并安装 Arduino_LSM9DS1 库

Library manager window

  • 最后,将 micro USB 数据线连接到板子和电脑
  • 选择板子:**工具 > 板 > Arduino Nano 33 BLE**
  • 选择端口:**工具 > 端口 > COM5 (Arduino Nano 33 BLE)**
  • 请注意,实际的端口名称可能在您的电脑上有所不同

如果您需要帮助,Arduino 网站上提供了更详细的 入门指南故障排除指南

从 Arduino 板流式传输传感器数据

首先,我们需要采集一些训练数据。您可以使用与用于对板子进行编程的笔记本电脑或 PC 相同的 USB 数据线,从 Arduino 板采集传感器数据日志。

Arduino 板运行小型应用程序(也称为 *草图*),这些应用程序是从 .ino 格式的 Arduino 源代码编译而来,并使用 Arduino IDE 或 Arduino Create 编程到板子上。

我们将使用一个预制的草图 **IMU_Capture.ino**,它执行以下操作:
  • 监控板子的加速度计和陀螺仪
  • 在检测到板子的显著线性加速度时触发采样窗口
  • 以 119Hz 的频率采样 1 秒,并通过 USB 输出 CSV 格式的数据
  • 循环回到并监控下一个手势

我们选择从板子上读取的传感器、采样率、触发阈值以及我们是否以 CSV、JSON、二进制或其他格式流式传输数据输出,这些都是可以在 Arduino 上运行的草图中自定义的。在数据输出到日志之前,我们还可以对设备上的信号进行预处理和滤波——这将在另一篇博文中介绍。现在,您只需上传草图并开始采样即可。

要在 Arduino IDE 中使用此草图对板子进行编程:
  • 下载 IMU_Capture.ino 并将其在 Arduino IDE 中打开
  • 使用 **草图 > 上传** 将其编译并上传到板子上

可视化 Arduino 板的实时传感器数据日志

完成上述操作后,我们现在可以可视化从板子输出的数据。我们还没有采集数据——这只是为了让您了解传感器数据采集是如何触发的,以及采样窗口的持续时间。这将有助于我们收集训练样本。
  • 在 Arduino IDE 中,打开串行绘图仪:**工具 > 串行绘图仪**
  • 如果您收到关于板子不可用的错误,请重新选择端口
  • **工具 > 端口 > portname (Arduino Nano 33 BLE)**
  • 拿起板子并练习您的拳打和弯曲手势
  • 您将看到它只采样 1 秒的窗口,然后等待下一个手势
  • 您应该看到传感器数据采集的实时图形(参见下面的 GIF)
Serial plotter window
Arduino IDE 串行绘图仪将显示从您的板子输出的 CSV 数据的实时图形。
完成后,请务必关闭串行绘图仪窗口——这很重要,因为下一步无法在未关闭串行绘图仪的情况下进行。

采集手势训练数据

要将数据作为 CSV 日志采集以上传到 TensorFlow,您可以使用 **Arduino IDE > 工具 > 串行监视器** 来查看数据并将其导出到您的台式机
  • 按下板子上方的白色小按钮以重置板子
  • 用一只手拿起板子(稍后拿起板子将触发采样)
  • 在 Arduino IDE 中,打开串行监视器:**工具 > 串行监视器**
  • 如果您收到关于板子不可用的错误,请重新选择端口
  • **工具 > 端口 > portname (Arduino Nano 33 BLE)**
  • 用您手中的板子做出一个拳打手势(小心操作!)
  • 快速地向外挥拳以触发采集
  • 缓慢地回到中立位置,以避免再次触发采集
  • 重复手势采集步骤 10 次或更多次以收集更多数据
  • 将串行控制台中的数据复制并粘贴到一个名为 **punch.csv** 的新文本文件中
  • 清除控制台窗口的输出,并重复上述所有步骤,这次使用一个名为 **flex.csv** 的文件进行弯曲手势
  • 每次都快速地向内弯曲,并缓慢地返回,以触发采集

请注意,您的两个 csv 文件的第一行应该包含字段 **aX**、**aY**、**aZ**、**gX**、**gY**、**gZ**。

Serial window output (as a CSV)

**Linux 提示:**如果您愿意,您可以在命令行中将 Arduino 的传感器日志输出重定向到一个 .csv 文件。在关闭串行绘图仪/串行监视器窗口的情况下,使用

$ cat /dev/cu.usbmodem[nnnnn] > sensorlog.csv

在 TensorFlow 中进行训练

我们将使用 Google Colab 来使用我们在上一节中从 Arduino 板收集的数据训练我们的机器学习模型。Colab 提供了一个 Jupyter 笔记本,允许我们使用网页浏览器运行 TensorFlow 训练。

A picture of colab
Arduino 手势识别训练 Colab


Colab 将指导您完成以下步骤:

  • 设置 Python 环境
  • 上传 **punch.csv** 和 **flex.csv** 数据
  • 解析和准备数据
  • 构建和训练模型
  • 将训练好的模型转换为 TensorFlow Lite
  • 在 Arduino 头文件中对模型进行编码

Colab 的最后一步是生成 model.h 文件,供您下载并包含在下一节的 Arduino IDE 手势分类项目中

A picture of the files window in colab


让我们在 Colab 中打开笔记本,并运行各个单元格中的步骤—— arduino_tinyml_workshop.ipynb

对 IMU 数据进行分类

接下来,我们将在 Arduino IDE 项目中使用我们在上一节中从 Colab 训练并下载的 model.h 文件
  • 在 Arduino IDE 中打开 IMU_Classifier.ino
  • 在 IDE 中创建一个新的选项卡。当提示您命名时,将其命名为 **model.h**
Arduino IDE with the IMU_Classifier sample open


  • 打开 model.h 选项卡,并将您从 Colab 下载的版本粘贴到其中
  • 上传草图:**草图 > 上传**
  • 打开串行监视器:**工具 > 串行监视器**
  • 执行一些手势
  • 每个手势的置信度将被打印到串行监视器中(0 = 低置信度,1 = 高置信度)

恭喜,您刚刚为 Arduino 训练了您的第一个 ML 应用程序!

Arduino IDE output of running the classifier example
为了增加乐趣,Emoji_Button.ino 示例展示了如何创建一个 USB 键盘,在 Linux 和 macOS 中打印表情符号字符。尝试将 Emoji_Button.ino 示例与 IMU_Classifier.ino 草图结合起来,创建一个手势控制的表情符号键盘 👊。

结论

这是一个令人兴奋的时期,在 Tiny ML 中有很多东西要学习和探索。我们希望这篇博文能给您一些关于其潜力的了解,以及一个开始将其应用于您自己的项目中的起点。请务必让我们知道您构建了什么,并与 Arduino 社区分享。

A picture of the book TinyML


要全面了解 TinyML 以及本文中的示例应用程序,我们推荐 Pete Warden 和 Daniel Situnayake 新出版的 O'Reilly 书籍 “TinyML:Arduino 和超低功耗微控制器上的 TensorFlow 机器学习”。
下一篇文章
How-to Get Started with Machine Learning on Arduino

Arduino 团队的 Sandeep Mistry 和 Dominic Pajak 的客座文章

Arduino 的使命是让机器学习变得足够简单,任何人都可以使用。在过去的几个月里,我们一直在与 TensorFlow Lite 团队合作,并很高兴向您展示我们一起取得的成果:将 TensorFlow Lite Micro 带到 Arduino Nano 33 BLE Sense。在这篇文章中,我们将向您展示如何安装一个…