Arduino团队的Sandeep Mistry&Dominic Pajak的客座帖子。
作者: TensorFlow
原文链接: https://medium.com/tensorflow/how-to-get-started-with-machine-learning-on-arduino-7daf95b4157
Arduino的任务是让机器学习变得简单,任何人都可以使用。在过去的几个月里,我们一直在与TensorFlow Lite团队合作,并很高兴向您展示我们的合作成果:将TensorFlow Lite Micro应用于Arduino Nano 33 BLE Sense。在本文中,我们将向您展示如何安装和运行几个新的TensorFlow Lite Micro示例,这些示例现在可以在Arduino库管理器( Arduino Library Manager)中找到。
下面的第一个教程将向您展示如何在Arduino板上安装一个神经网络来识别简单的语音命令。
接下来,我们将介绍一个更深入的教程,您可以使用该教程来训练您自己的自定义手势识别模型,使用Colab中的TensorFlow为Arduino创建手势识别模型。本材料基于Sandep Mistry和Don Coleman举办的实践研讨会,该研讨会的更新版本现已在线。
如果你以前有过Arduino的经验,你可以在几个小时内完成这些教程。如果你对微控制器(microcontrollers)还不太熟悉,可能需要更长的时间。
我们很高兴与大家分享一些最初的例子和教程,并看看您将从这里构建什么。我们开始吧!
注:以下项目基于TensorFlow Lite for Microscular,目前在TensorFlow repo中进行实验。这仍然是一个新兴的领域!
微控制器(Microcontrollers)和TinyML
微控制器,如Arduino板上使用的微控制器,是低成本、单芯片、独立的计算机系统。它们是隐藏在数十亿件日常用品中的隐形电脑,如可穿戴设备、无人机、3D打印机、玩具、电饭煲、智能插头、电动滑板车、洗衣机。连接这些设备的趋势是所谓物联网的一部分。
Arduino是一个开源平台和社区,致力于让每个人都可以访问微控制器应用程序开发。我们使用的主板有一个Arm Cortex-M4微控制器,运行频率为64MHz,内存为1MB,内存为256KB。与云、PC或移动设备相比,这是很小的,但以微控制器标准来看是合理的。
可能有一些实际原因需要在微控制器上压缩ML,包括:
-
功能-希望智能设备在本地快速运行(独立于互联网)
-
成本-用简单、低成本的硬件实现这一点
-
隐私-不想在外部共享所有传感器数据
-
效率-更小的设备形状系数,能量收集或更长的电池寿命
有一个最终目标,我们正在朝着这个目标努力,这是非常重要的:
- 机器学习可以使微控制器对具有嵌入式开发背景的开发者开放
在机器学习方面,可以使用一些技术将神经网络模型拟合到内存受限的设备(如微控制器)中。其中一个关键步骤是将权重从浮点量化为8位整数。这也有助于使推断更快地计算,并且更适用于较低的时钟速率设备。
TinyML是一个新兴的领域,还有很多工作要做——但令人兴奋的是,它有一个巨大的未经探索的应用空间。数以亿计的微控制器和各种各样的传感器结合在一起,在未来可能会带来一些非常有创意和价值的微型ML应用。
你需要开始做什么
-
一块Arduino Nano 33 BLE感应板。
-
一条连接Arduino板和台式机的微型USB电缆。
- 要为您的电路板编程,您可以使用arduino Web编辑器或安装Arduino IDE。我们将在下一节详细介绍如何设置这些
Arduino Nano 33 BLE Sense具有多种车载传感器,这意味着可能用于一些凉爽的微型ML应用:
-
语音-数字麦克风
-
运动-9轴IMU(加速度计、陀螺仪、磁强计)
-
环境-温度、湿度和压力
-
光-亮度、颜色和物体距离
与经典的Arduino Uno不同,该板将微控制器与板载传感器结合在一起,这意味着您可以在不需要额外硬件或接线的情况下处理许多用例。该板也足够小,可以用于终端应用,如可穿戴设备。顾名思义,它具有蓝牙LE连接,因此您可以将数据(或推断结果)发送到笔记本电脑、移动应用程序或其他BLE板和外围设备。
提示:U盘上的传感器
通过USB连接BLE Sense板是一种简单的方式,可以捕获数据并将多个传感器添加到单板计算机中,而无需额外布线或硬件,例如,这是对Raspberry Pi的一个很好的补充。
TensorFlow Lite for Microcontrollers示例
现在,TensorFlow Lite for Microcontrollers的示例已经打包并通过Arduino库管理器提供,这样就可以在Arduino上include并运行它们。在本节中,我们将向您展示如何运行它们。例如:
-
micro_speech — 使用车载麦克风的语音识别。
-
magic_wand — 使用机载IMU进行手势识别。
- person_detection — 使用外部ArduCam摄像头进行人身检测。
有关示例的更多背景信息,您可以查看tensorflow存储库中的源代码。这些例子中的模型是以前训练过的。下面的教程将向您展示如何在Arduino上部署和运行它们。在下一节中,我们将讨论培训。
如何使用Arduino Create web编辑器运行示例
使用USB电缆将Arduino Nano 33 BLE Sense连接到桌面计算机后,您将能够使用Arduino Create web编辑器在板上编译并运行以下TensorFlow示例:
聚焦语音识别实例:micro_speech
使用Arduino板的第一步是让LED闪烁。在这里,我们将通过使用TensorFlow Lite Micro识别语音关键字来实现。它有一个简单的“是”和“否”的词汇表记住这个模型是在一个只有256KB内存的微控制器上本地运行的,所以不要期望商业语音助手的级别精度, 它没有互联网连接,并且只有2000倍的本地内存可用。
注意,电路板也可以用电池供电。由于Arduino可以连接到电机、执行器等,这为语音控制项目提供了潜力。
如何使用Arduino IDE运行示例
您可以使用ArduinoIDE应用程序尝试相同的推理示例
首先,按照下一节中的说明设置Arduino IDE。
在Arduino IDE中,您将看到通过Arduino IDE中的File > Examples > Arduino_TensorFlowLite菜单提供的示例.
选择一个示例,草图将打开。要compile、upload和运行板上的示例,请单击箭头图标:
对于更喜欢命令行的高级用户,还有arduino-cli。
为Arduino训练TensorFlow Lite Micro模型
接下来,我们将使用ML使Arduino板能够识别手势。我们将从Arduino Nano 33 BLE Sense board中捕获运动数据,将其导入TensorFlow以训练模型,并将生成的分类器部署到board上。
本教程的想法基于Charlie Gerard的《使用Arduino和Tensorflow.js进行身体运动的街头拳击手》。在Charlie的例子中,电路板将所有传感器数据从Arduino传输到另一台机器,该机器在Tensorflow.js中执行手势分类。我们通过在Arduino板上执行手势分类来进一步理解和表达它。我们使用的Arduino Nano 33 BLE感应板有一个更强大的Arm Cortex-M4处理器和一个板上IMU,因此这在我们的案例中更容易实现。
我们已经修改了下面的教程,因此不需要额外的硬件采样从检测板的移动开始。本教程的原始版本添加了一个实验板和一个硬件按钮来按下以触发采样。如果你想进入一个小硬件,你可以遵循这个版本。
设置Arduino IDE
按照以下步骤设置Arduino IDE应用程序,该应用程序用于将推理模型上载到您的电路板,并在下一节中从电路板下载培训数据。与使用Arduino Create web编辑器相比,还需要执行一些步骤,因为我们需要在Arduino IDE中下载并安装特定的板和库。
-
从https://arduino.cc/downloads下载并安装Arduino IDE
- 打开刚才安装的Arduino应用程序
- 在Arduino IDE菜单中,选择 Tools > Board > Boards Manager
- 搜索“Nano BLE”并点击 install 将其安装到板子上
- 安装需要几分钟时间。
-
完成后,关闭Boards Manager窗口。
-
现在转到 Library Manager Tools > Manage Libraries
- 搜索并安装 Arduino_TensorFlowLite 库
-
下一步搜索并安装 Arduino_LSM9DS1 库。
- 最后,将micro-USB电缆插入主板和计算机。
- 选择电路板 Tools > Board > Arduino Nano 33 BLE
-
选择端口 Tools > Port > COM5 (Arduino Nano 33 BLE)
- 请注意,计算机上的实际端口名可能不同
如果需要帮助,Arduino网站上有更详细的入门和故障排除指南
来自Arduino板的流式传感器数据(Streaming sensor data)
首先,我们需要获取一些训练数据。您可以从Arduino板上捕获传感器数据日志,所用USB电缆与笔记本电脑或PC程序板相同。
Arduino板运行小型应用程序(也称为草图),这些应用程序由.ino格式的Arduino源代码编译而成,并使用Arduino IDE或Arduino创建程序编程到板上。
我们将使用一个预先制作的草图 IMU_Capture.ino ,它执行以下操作:
-
监控电路板的加速度计和陀螺仪
-
触发检测电路板显著线性加速度的采样窗口
-
以119Hz采样1秒,通过USB输出CSV格式数据
- 回圈并监视下一个手势
我们选择从电路板读取的传感器、采样率、触发阈值,以及我们是否将数据流输出为CSV、JSON、二进制或其他格式,都可以在Arduino上运行的草图中自定义。在数据输出到日志之前,还可以在设备上执行信号预处理和过滤,我们可以在另一个博客中讨论这个问题。现在,您只需上传草图并开始采样。
要在Arduino IDE中使用此草图对电路板进行编程:
-
下载 IMU_Capture.ino并在Arduino IDE中打开它
- 用 Sketch>upload 编译并上传到板上
从Arduino板可视化实时传感器数据日志
完成后,我们现在可以看到从板上下来的数据。我们还没有捕获数据这只是让您了解传感器数据捕获是如何触发的,以及采样窗口有多长。这将有助于收集训练样本。
-
在Arduino IDE中,打开串行绘图仪 Tools > Serial Plotter
-
如果出现主板不可用的错误,请重新选择端口:
-
Tools > Port > portname (Arduino Nano 33 BLE)
-
拿起板子,练习你的击打和弯曲动作
-
你只会在一秒钟的窗口中看到它的样本,然后等待下一个手势。
- 您应该可以看到传感器数据捕获的实时图形(请参见下面的GIF)
Arduino IDE串行绘图仪将显示从板输出的CSV数据的实时图形
完成后,请确保关闭“串行绘图仪”窗口-这很重要,否则下一步无法工作。
获取手势训练数据
要将数据捕获为CSV日志并upload到TensorFlow,可以使用 Arduino IDE > Tools > Serial Monitor 来查看数据并将其导出到桌面计算机:
-
通过按下顶部的白色小按钮重置电路板
-
一只手捡起木板(稍后捡起会触发取样)
-
在Arduino IDE中,打开串行监视器 Tools > Serial Monitor
-
如果您遇到主板不可用的错误,请重新选择端口:
-
Tools > Port > portname (Arduino Nano 33 BLE)
-
用手中的板做一个打孔手势(做这个动作时要小心!)
-
以足够快的速度向外击打以触发捕捉
-
缓慢回到空档位置,以免再次触发捕捉
-
重复手势捕捉步骤10次或更多次以收集更多数据
-
将串行控制台中的数据复制并粘贴到名为
punch.csv
的新文本文件中 -
清除控制台窗口输出并重复上述所有步骤,这次在名为
flex.csv
的文件中使用flex手势 - 使向内弯曲足够快,以触发每次缓慢返回的捕获
注意,两个csv文件的第一行应该包含字段aX
、aY
、aZ
、gX
、gY
、gZ
Linux提示:如果您愿意,可以将传感器日志输出从Arduino直接重定向到命令行上的.csv文件。关闭串行绘图仪/串行监视器窗口时使用:
$ cat /dev/cu.usbmodem[nnnnn] > sensorlog.csv
在 TensorFlow 中训练
我们将使用Google Colab使用我们在上一节中从Arduino板收集的数据来训练我们的机器学习模型。Colab提供了一个Jupyter笔记本,允许我们在web浏览器中运行TensorFlow培训。
Colab将引导您完成以下步骤:
-
设置Python环境
-
上传
punch.csv
和flex.csv
数据 -
分析和准备数据
-
建立和训练模型
-
将训练模型转换为TensorFlow Lite
- 在Arduino头文件中编码模型
colab的最后一步是生成要下载的model.h文件,并将其包含在下一节的Arduino IDE手势分类器项目中:
让我们打开Colab的notebook,在单元格中浏览步骤 —arduino_tinyml_workshop.ipynb
Classifying IMU Data
接下来,我们将使用刚刚在Arduino IDE项目的上一节中从Colab下载的model.h文件:
-
在Arduino IDE中打开IMU_Classifier.ino
- 在IDE中创建一个新的选项卡。当被问到
model.h
时
-
打开
model.h
选项卡并粘贴到从Colab下载的版本中 -
上传草图: Sketch > Upload
-
打开串行监视器:Tools > Serial Monitor
-
做些手势
- 每个手势的置信度(confidence)将打印到串行监视器上(0 = low confidence, 1 = high confidence)
恭喜你,你刚刚为Arduino训练了第一个ML应用程序!
为了增加乐趣,Emoji_Button.ino示例演示了如何在Linux和macOS中创建打印Emoji字符的USB键盘。尝试将Emoji_Button.ino示例与IMU_Classifier.ino草图结合起来,创建一个手势控制的Emoji键盘