使用 Arduino 和 TensorFlow Lite Micro 进行水果识别
2019 年 11 月 7 日
Arduino 团队的 Dominic Pajak 和 Sandeep Mistry 的客座文章

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 板包括一个板载比色计,我们认为以这种方式演示将很有趣且具有指导意义,作为开始。

我们将展示一个简单但完整的端到端 TinyML 应用程序可以快速实现,而无需深入了解 ML 或嵌入式知识。我们在这里涵盖的内容是数据捕获、训练和分类器部署。这旨在作为一个演示,但如果您决定连接外部摄像头,则可以改进和扩展它。我们希望您了解可能的范围以及现有工具的起点。

您需要什么

  • Arduino BLE 33 Nano Sense
  • 一根微型 USB 数据线
  • 带有网络浏览器的台式机/笔记本电脑
  • 一些不同颜色的物体

关于 Arduino 板

我们在这里使用的 Arduino BLE 33 Nano Sense 板具有一个运行 mbedOS 的 Arm Cortex-M4 微控制器,以及大量板载传感器 - 数字麦克风、加速度计、陀螺仪、温度、湿度、压力、光线、颜色和接近传感器。 

虽然与云或移动标准相比很小,但微控制器功能强大,足以运行 TensorFlow Lite Micro 模型,并对来自板载传感器的传感器数据进行分类。
Arduino board

设置 Arduino Create Web 编辑器

在本教程中,我们将使用 Arduino Create Web 编辑器 - 一种用于编程 Arduino 板的基于云的工具。要使用它,您必须注册一个免费帐户,并安装一个插件,以允许浏览器通过 USB 数据线与您的 Arduino 板进行通信。

您可以按照 入门 指示快速设置,这些指示将指导您完成以下步骤
  • 下载并安装插件
  • 登录或注册一个免费帐户
(注意,如果您愿意,也可以使用 Arduino IDE 桌面应用程序,其设置方法在 上一篇教程 中有描述。)

捕获训练数据

现在我们将捕获数据,用于在 TensorFlow 中训练我们的模型。首先,选择一些不同颜色的物体。我们将使用水果,但您可以使用您喜欢的任何物体。

设置 Arduino 进行数据捕获

接下来,我们将使用 Arduino Create 为 Arduino 板编程一个名为 object_color_capture.ino 的应用程序,该应用程序从您放置在附近的物体中采样颜色数据。该板会将颜色数据作为 CSV 日志通过 USB 数据线发送到您的台式机。
Setting up the Arduino for data capture
要将 object_color_capture.ino 应用程序加载到您的 Arduino 板上,请执行以下操作:
  • 使用 USB 数据线将您的板连接到笔记本电脑或 PC
    • Arduino 板使用的是公型微型 USB 接口
  • 通过单击此 链接 在 Arduino Create 中打开 object_color_capture.ino。 
您的浏览器将打开 Arduino Create Web 应用程序(请参阅上面的 GIF 图)

按“在 WEB 编辑器中打开”
Open in Web Editor
  • 对于现有用户,此按钮将标为“添加到我的草稿本”
按“上传并保存”
  • 这将花费一分钟时间
  • 您将看到板上的黄色指示灯闪烁,表示正在对其进行编程
打开串行“监视器”
  • 这将在 Web 应用程序的左侧打开“监视器”面板
  • 当物体靠近板顶部的传感器时,您将在此处看到以 CSV 格式显示的颜色数据

    为每个物体捕获 CSV 文件中的数据

    对于我们想要分类的每个物体,我们将捕获一些颜色数据。通过仅使用每个类别的一个示例进行快速捕获,我们不会训练一个广义模型,但我们仍然可以快速获得一个概念验证,可以使用手边的物体进行验证! 

    例如,我们正在对一个苹果进行采样

    • 使用板顶部的白色小按钮重置板。
      • 除非您要对它进行采样,否则请将手指远离传感器!
      • Arduino Create 中的“监视器”会在几分钟内显示“串行端口不可用”。
    • 然后您应该看到 Red,Green,Blue 出现在串行监视器的顶部
    • 将板的正面靠近苹果。 
      • 该板仅在检测到物体靠近传感器且照明充足时(打开灯光或靠近窗户)才会进行采样。
    • 移动板,环绕物体的表面以捕获颜色变化。
    • 您将看到 RGB 颜色值以逗号分隔数据的形式出现在串行监视器中。 
    • 从物体上捕获几秒钟的样本。
    • 将这些日志数据从“监视器”复制并粘贴到文本编辑器中。
      • 提示:取消选中底部“自动滚动”复选框以停止文本移动
    • 将您的文件另存为 apple.csv
    • 使用板顶部的白色小按钮重置板。

    再进行几次,捕获其他物体(例如,banana.csv、orange.csv)。

    注意:每个 .csv 文件的第一行应该为

    Red,Green,Blue

    如果您没有在顶部看到它,您可以直接复制并粘贴上面的行。

    训练模型

    现在我们将使用 colab 使用您在上一步中捕获的数据训练一个 ML 模型。
    • 首先,在 colab 中打开 Jupyter Notebook
    • 按照 colab 中的说明操作
      • 您将上传您的 *.csv 文件 
      • 解析和准备数据
      • 使用 Keras 训练模型
      • 输出 TensorFlowLite Micro 模型
      • 将它下载到 Arduino 上以运行分类器 
    完成后,您将下载 model.h,以便在您的 Arduino 板上运行以对物体进行分类!
    The colab will guide you to drop your .csv files into the file window, the result shown above

    colab 会指导您将 .csv 文件放到文件窗口中,结果如上所示
    Normalized color samples captured by the Arduino board are graphed in colab

    Arduino 板捕获的归一化颜色样本在 colab 中以图形方式显示

    将 TensorFlow Lite Micro 模型编程到 Arduino 板上

    最后,我们将使用 Arduino Create 编译并上传我们在上一步中训练的模型到 Arduino 板上。 
    您的浏览器将打开 Arduino Create Web 应用程序
    • 按“在 WEB 编辑器中打开”按钮
    • 使用“将文件导入草稿”导入您从 colab 下载的 model.h
      Import the model.h you downloaded from colab
      导入您从 colab 下载的 model.h
      The model.h tab
      现在 model.h 选项卡应该如下所示
    • 编译并将应用程序上传到您的 Arduino 板上  
      • 这将花费一分钟时间
      • 完成后,您将在“监视器”中看到以下消息:监视器消息
    • 将您的 Arduino 的 RGB 传感器靠近您训练过的物体
    • 您将在“监视器”中看到分类输出
    • Classifier output in the Arduino Create Monitor
      Arduino Create 监视器中的分类器输出
    您还可以编辑 object_color_classifier.ino 草稿以输出表情符号(我们在代码中的注释中保留了 Unicode!),您可以在 Mac OS X 或 Linux 终端中通过关闭带有 Arduino Create 的 Web 浏览器选项卡、重置板,然后键入 cat /cu/usb.modem[n].  来查看它们。
    Output from Arduino serial to linux terminal using ANSI highlighting and unicode emojis
    使用 ANSI 高亮显示和 Unicode 表情符号,从 Arduino 串行端口输出到 Linux 终端

    了解更多

    围绕 Tiny ML 的资源还在不断涌现,但现在就抢先一步并与专家会面的机会已经到来。2019 年 12 月 2-3 日,在加利福尼亚州山景城的 Arm IoT Dev Summit 上,您将有机会与专家们会面。这包括来自 Arduino 的 on-device ML 技术负责人 Sandeep Mistry 以及谷歌的 Pete Warden 和 Daniel Situnayake 的研讨会,他们正是 TinyML 的著作作者。您还可以在那里的 TinyML 社区会议上与这些专家和其他人士交流。我们希望在那里见到您!

    结论

    我们已经看到了在 Arduino 上运行机器学习的快速端到端演示。相同的框架可用于对不同传感器进行采样并训练更复杂的模型。对于我们的颜色识别物体分类,我们可以通过在更多条件下采样更多示例来帮助模型泛化。在未来的工作中,我们还可能探索如何在设备上运行 CNN。与此同时,我们希望这将是一个有趣且令人兴奋的项目。玩得开心!


    下一篇文章
    Fruit Identification using Arduino and TensorFlow Lite Micro

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

    Arduino 的使命是让机器学习变得足够简单,任何人都可以使用。上周我们 宣布 TensorFlow Lite Micro 在 Arduino 库管理器中可用。有了它,一些很酷的现成的 ML 示例,比如语音识别、简单的机器视觉甚至端到端的姿态识别训练...