入门教程-在Arduino上进行机器学习
Arduino团队的Sandeep Mistry&Dominic Pajak的客座帖子。git
Arduino的任务是让机器学习变得简单,任何人均可以使用。在过去的几个月里,咱们一直在与TensorFlow Lite团队合做,并很高兴向您展现咱们的合做成果:将TensorFlow Lite Micro应用于Arduino Nano 33 BLE Sense。在本文中,咱们将向您展现如何安装和运行几个新的TensorFlow Lite Micro示例,这些示例如今能够在Arduino库管理器( Arduino Library Manager)中找到。github
下面的第一个教程将向您展现如何在Arduino板上安装一个神经网络来识别简单的语音命。web
示例1:运行预先训练的 micro_speech 示例编程
接下来,咱们将介绍一个更深刻的教程,您可使用该教程来训练您本身的自定义手势识别模型,使用Colab中的TensorFlow为Arduino建立手势识别模型。本材料基于Sandep Mistry和Don Coleman举办的实践研讨会,该研讨会的更新版本现已在线。浏览器
例2:训练你本身的手势分类模型网络
若是你之前有过Arduino的经验,你能够在几个小时内完成这些教程。若是你对微控制器(microcontrollers)还不太熟悉,可能须要更长的时间。机器学习
咱们很高兴与你们分享一些最初的例子和教程,并看看您将从这里构建什么。咱们开始吧!编辑器
注:如下项目基于TensorFlow Lite for Microscular,目前在TensorFlow repo中进行实验。这仍然是一个新兴的领域!ide
微控制器(Microcontrollers)和TinyML
微控制器,如Arduino板上使用的微控制器,是低成本、单芯片、独立的计算机系统。它们是隐藏在数十亿件平常用品中的隐形电脑,如可穿戴设备、无人机、3D打印机、玩具、电饭煲、智能插头、电动滑板车、洗衣机。链接这些设备的趋势是所谓物联网的一部分。学习
Arduino是一个开源平台和社区,致力于让每一个人均可以访问微控制器应用程序开发。咱们使用的主板有一个Arm Cortex-M4微控制器,运行频率为64MHz,内存为1MB,内存为256KB。与云、PC或移动设备相比,这是很小的,但以微控制器标准来看是合理的。
Arduino Nano 33 BLE感应板比一片口香糖还小
可能有一些实际缘由须要在微控制器上压缩ML,包括:
-
功能-但愿智能设备在本地快速运行(独立于互联网)
-
成本-用简单、低成本的硬件实现这一点
-
隐私-不想在外部共享全部传感器数据
-
效率-更小的设备形状系数,能量收集或更长的电池寿命
有一个最终目标,咱们正在朝着这个目标努力,这是很是重要的:
- 机器学习可使微控制器对具备嵌入式开发背景的开发者开放
在机器学习方面,可使用一些技术将神经网络模型拟合到内存受限的设备(如微控制器)中。其中一个关键步骤是将权重从浮点量化为8位整数。这也有助于使推断更快地计算,而且更适用于较低的时钟速率设备。
TinyML是一个新兴的领域,还有不少工做要作——但使人兴奋的是,它有一个巨大的未经探索的应用空间。数以亿计的微控制器和各类各样的传感器结合在一块儿,在将来可能会带来一些很是有创意和价值的微型ML应用。
你须要开始作什么
-
一条链接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示例:
从Arduino_TensorFlowLite库编译一个示例
聚焦语音识别实例:micro_speech
使用Arduino板的第一步是让LED闪烁。在这里,咱们将经过使用TensorFlow Lite Micro识别语音关键字来实现。它有一个简单的“是”和“否”的词汇表记住这个模型是在一个只有256KB内存的微控制器上本地运行的,因此不要指望商业语音助手的级别精度, 它没有互联网链接,而且只有2000倍的本地内存可用。
注意,电路板也能够用电池供电。因为Arduino能够链接到电机、执行器等,这为语音控制项目提供了潜力。
运行micro_speech示例
如何使用Arduino IDE运行示例
或者,您可使用ArduinoIDE应用程序尝试相同的推理示例
首先,按照下一节中的说明设置Arduino IDE。
在Arduino IDE中,您将看到经过Arduino IDE中的**File > Examples> Arduino_TensorFlowLite **菜单提供的示例.
选择一个示例,草图将打开。要compile、upload和运行板上的示例,请单击箭头图标:
对于更喜欢命令行的高级用户,还有arduino-cli。
为Arduino训练TensorFlow Lite Micro模型
Arduino Nano 33 BLE感应板的手势分类,输出为表情符号
接下来,咱们将使用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培训。
Arduino手势识别训练codelab
Codelab将引导您完成如下步骤:
-
设置Python环境
-
上传
punch.csv
和flex.csv
数据 -
分析和准备数据
-
创建和训练模型
-
将训练模型转换为TensorFlow Lite
-
在Arduino头文件中编码模型
codelab的最后一步是生成要下载的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键盘 👊.