特邀博文 / Dominic Pajak 和 Sandeep Mistry,来自 Arduino 团队
Arduino 肩负着让任何人均可轻松使用机器学习的使命。去年前,我们宣布 TensorFlow Lite Micro 可以在 Arduino 库管理器中使用。这样便可使用一些现成的炫酷 ML 示例,例如语音识别、简单的机器视觉,甚至是端到端手势识别训练教程。如需全面了解背景信息,我们建议您阅读这篇文章。
在本文中,我们将带您了解一个更为简单的端到端教程:使用 TensorFlow Lite Micro 库,以及 Arduino Nano 33 BLE Sense 的色度计和近接感测器传感器来分类对象。为此,我们将在开发板上运行一个小型神经网络。
运行 TensorFlow Lite Micro 的 Arduino BLE 33 Nano Sense
Tiny ML 的理念是在设备上用较少的资源(更小巧的外形、更少的能耗和更低成本的芯片)完成更多的工作。若与传感器在同一块开发板上运行推理,无论是对隐私还是电池续航时间都大有裨益,且意味着无需连网即可完成推理。
我们在电路板上安装了近接感应器,这意味着我们可以即时读取开发板前方对象的深度,而无需使用摄像头,也无需通过机器视觉来确定某个对象是否为目标对象。
在本教程中,当对象足够近时,我们可以对颜色进行采样,此时的板载 RGB 传感器可以看作是一个 1 像素的彩色摄像头。虽然此方法存在一定限制,但却让我们只需使用少量资源便可快速分类对象。请注意,实际上您可以在设备端运行完整的基于 CNN 的视觉模型。这块特殊的 Arduino 开发板配有一个板载色度计,因此我们认为以此方式开始演示不仅有趣,还极具指导意义。
基于 CNN 的视觉模型
http://cs231n.github.io/convolutional-networks/
我们将展示一个简单但完整的端到端 TinyML 应用,无需深厚的 ML 或嵌入式背景就可以快速实现。此处所涉内容包括数据采集、训练和分类器部署。我们介绍的是一个演示应用,您可连接一个外部摄像头,在此基础上进行改进和完善。我们希望您能了解我们提供的工具能够实现什么,这里只是为您提供了一个起点。
您需要具备的条件
几个具有不同颜色的对象
Arduino 开发板简介
我们所使用的 Arduino BLE 33 Nano Sense 开发板配备 Arm Cortex-M4 微控制器,该控制器运行着 mbedOS,并具备多个板载传感器,包括数字麦克风、加速度计、陀螺仪,以及温度、湿度、压力、光线、颜色和近接感应器。
虽然该微控制器按照云或移动标准来看非常微小,但其功能非常强大,足以运行 TensorFlow Lite Micro 模型并对来自板载传感器的传感器数据进行分类。
设置 Arduino Create 网页编辑器
在本教程中,我们将使用 Arduino Create 网页编辑器,一款基于云端的 Arduino 开发板编程工具。您需要注册一个免费帐户来使用,然后安装一个插件允许浏览器通过 USB 线与 Arduino 开发板进行通信。
登录或注册免费帐号
(请注意,您也可以使用 Arduino IDE 桌面应用,相关设置说明可以在之前的教程中找到)
拍摄训练数据
现在,我们将采集用于在 TensorFlow 中训练模型所需的数据。首先,选择几种颜色不同的对象。在这里,我们将使用水果,但您可以使用任何您喜欢的其他对象。
设置 Arduino,以便采集数据
接下来,我们将使用 Arduino Create 对 Arduino 开发板进行编程,让其运行 object_color_capture.ino
应用,该应用可以采集附近对象的颜色数据样本。开发板会通过 USB 线将颜色数据以 CSV 日志形式发送至您的桌面设备。
object_color_capture.ino
应用加载到 Arduino 开发板,请执行以下操作:
点击此链接,在 Arduino Create 中打开 object_color_capture.ino
。
您的浏览器将打开 Arduino Create 网页应用(参见上方的 GIF 图)
点按“OPEN IN WEB EDITOR”(在网页编辑器中打开)
对于现有用户,此按钮将被标记为“ADD TO MY SKETCHBOOK”(添加至我的 Sketchbook)
您会看到开发板上的黄灯在闪烁,说明其正在“接受编程”
现在,当对象在开发板顶部附近时,您将会在此处看到 CSV 格式的颜色数据
将每个对象的数据采集至 CSV 文件中
我们会针对每一个要分类的对象采集一些颜色数据。我们只针对每个类快速采集一个示例,这样做显然无法训练通用模型,但我们仍然可以通过手头的对象来快速验证概念!
Red,Green,Blue
字样
使用顶部的白色小按钮重置开发板。
重复执行上述操作,以采集其他对象并保存日志信息(例如 banana.csv、orange.csv)。
注意:每个 .csv 文件的第一行均应显示为:Red,Green,Blue
如果您未在顶部看到此内容,则只需将其复制并粘贴到代码行的上方。
训练模型
下载此模型以在 Arduino 上运行分类器
完成上述步骤后,您应该已经下载了可以在 Arduino 开发板上运行对象分类的 model.h
文件!
Colab 会引导您将 .csv 文件拖放入文件窗口,结果如上图所示
Colab 会对 Arduino 开发板采集的标准化颜色样本进行绘制
将 TFLM 模型编写到 Arduino 开发板
打开 Classify_Object_Color.ino
使用 Import File to Sketch(将文件导入 Sketch)导入从 colab 下载的 model.h
文件:
导入从 colab 下载的 model.h 文件
model.h 标签页应如上所示
完成后,您将在 Monitor 中看到以下消息:
您将在 Monitor 中看到分类结果输出:
Arduino Create Monitor 中的分类器输出
您也可以编辑 object_color_classifier.ino sketch 以输出颜文字来替代名字(我们在代码注释中保留了 unicode!),您可以关闭 Arduino Create 所在的网页浏览器标签页,重置开发板并输入 cat /cu/usb.modem[n]
,在 Mac OS X 或 Linux 终端中查看这些表情符号。
从 Arduino 串口输出到 linux 终端并使用 ANSI 突出显示的结果,以及 unicode 表情符号
结论
至此,我们了解了一个在 Arduino 上运行的机器学习的快速端到端的演示。这个框架也可用于对不同传感器进行采样,以及训练更为复杂的模型。对于按颜色分类对象的任务,我们还可以在更多条件下采集更多示例样本,以泛化该模型。
在未来的研究当中,我们还会探索如何运行设备端 CNN。与此同时,我们希望于您而言,这将会是一个有趣而精彩的项目。请尽情体验 TinyML 带来的乐趣吧!
点‘在看’让我看到你的 AI ❤️~