通过对TinyML领域基础概念的坚实理解,我们将把我们的知识应用到现实生活中的项目中。nbsp;
在深入研究这个项目之前,我想说明一下,这个项目将使用现有的数据集,Google Colabs和由Pete Warden和哈佛大学TinyML团队开发的Arduino代码。为了在我们的微控制器单元(MCU)上部署,他们的资源将为我们提供:
访问数据集
模型架构
培训脚本
量化脚本
评价工具
Arduino代码
作为免责声明,我们没有开发绝大多数代码,我们不拥有它的权利。nbsp;
所有的说和做,这个项目假设编程和电子的基本理解。
TinyML项目-构建语音命令机器人子系统
在这个项目中,我们将构建一个简单的机器人子系统,使用机器学习来响应语音命令。微控制器将收集来自麦克风的输入,使用ML来监听唤醒词,如“向前”和“向后”,然后在命令的方向上驱动一个小型直流电机。
由于已经有很多关于用微控制器控制电机的好信息,本文将主要集中在演示如何:
使用现有资源使用TensorFlow Lite for Microcontrollers训练ML模型
量化并将模型部署到Arduino Nano 33 BLE Sense
在Arduino上运行本地推理,并让它控制由标准电池电源(AA或9 V)供电的电机
带声控电机的TinyML机器人子系统的BOM
在下面的表1中,您将找到此项目的物料清单(BOM)。
表1.
BOM例如TInyML声控电机项目。整个项目将花费不到30美元。
部分 | 例如 | 费用 * 美元 | 注意到 |
---|---|---|---|
Arduino Nano 33 BLE Sense | 链路 | 二十二块五 | 这是一个标准的TinyML开发设备。 |
L293D Dual H-Bridge Motor Driver |
链路 | 四元五角 | 我用这个IC,因为我已经有它躺在周围。在您的项目中,这可以由您选择的H桥代替。 |
直流电机L | 链路 | 一块九毛五 | 我使用的是Elegoo Uno R3入门套件中的直流电机。任何便宜的5 VDC电机将为这个项目工作。 |
3x 1k电阻器 | 0.30美元 | ||
4x AA电池和连接器 | 链路 | 0.58美元 | 这个项目的输入电压范围可以从4.5到21 V。在我的项目中,我使用了4节AA电池(~6 V),因为我有它们,但在这个范围内的9V或其他电源将工作。 |
(* 注:所有费用均自2021年9月起计算)
对于这个特定的项目,我从手头已有的部件中选择了大部分部件,如图1所示。
图1.
我在这个项目中使用的部件
在这个项目中,你将有很大的自由选择其他类似的部分来复制这个项目。nbsp;
设置TinyML软件Arduino纳米33 BLE感
要在我们的Arduino Nano 33 BLE Sense上运行TinyML脚本,我们需要安装一些包和依赖项。如果您的
安装完成后,我们需要安装Arduino Nano 33 BLE Sense的板文件。要执行此操作,请从IDE中转到Tools → Board → Boards Manager。在这里,搜索“mbed nano”并安装“Arduino Mbed OS Nano Boards.“
如下图2所示。
图2.
我们需要安装Nano 33 BLE Sense的板文件
在此之后,我们需要安装此项目所需的库。要执行此操作,请转到工具→管理库。从那里,搜索并下载以下库:
Arduino_TensorFlowLite
哈佛_TinyMLx
完成了这些,我们就可以开始这个项目了!
步骤1:使用TensorFlow Lite训练机器学习模型
一般来说,ML工作流将从收集和标记数据集开始开始,然后从头开始设计模型架构。 为了时间和简单起见,我们将通过利用一些现成的数据集和预先训练的关键字识别模型来“作弊”,这两个模型都是由Pete Warden开发的。 为了利用这些资源并训练我们的模型,我们将使用哈佛大学TinyML团队开发的Google Colab中的脚本。nbsp;
Google Colab可以在这里找到。
首先,确保您在Colab中使用图形处理单元(GPU)运行时(如图3所示),因为这将显著加快训练时间。一旦你这样做了,所有的代码都可以按原样使用了。nbsp;只需点击每个单元格左上角的黑色"运行"按钮,按顺序运行每个单元格。& nbsp;
图3.
您必须确保在Colab中使用GPU运行时
我们使用的模型架构是tiny_conv,我们将总共训练15,000步。前12,000个将使用0.001的学习率,最后3,000个将使用0.0001的学习率。此外,我们还将训练模型来理解“forwards”和“backwards”这两个词,Warden的关键字定位(KWS)数据集已经包含了这两个词。 这可以在图4中看到。
图4
.这是Colab中的一部分,我们在这里定义要训练的单词、训练参数和模型架构
请记住,培训可能需要几个小时才能完成,因此请确保您的计算机已插入电源,并且您的互联网连接稳定。
步骤2:量化和评估ML模型
训练完成后,您将到达Colab中标记为步骤2的点。这里是量化开始的地方。
首先,我们冻结我们的模型,这是将所有相关的训练结果(图,权重等)组合到一个文件中进行推理的过程。一旦我们有了一个冻结的模型,我们将把模型转换成一个TFLite模型。哈佛建立的脚本使这个过程相对容易,输出的TFLite模型应该是完全量化的。最终的模型大小应该在20 kB以下。
当完全转换后,Colab有脚本可用于比较量化和非量化模型之间的准确性。如果一切正常,准确度应该几乎相同。
步骤3:将机器学习模型部署到Arduino
在继续之前,我想让你知道你可以在这里找到我的完整代码作为参考。
一旦我们有了一个完全量化和转换的TensorFlow Lite模型,我们需要将其部署到Arduino。我们将修改哈佛预先存在的micro_speech示例,您可以在Arduino IDE中找到:文件→示例→不兼容→哈佛_TinyMLx → micro_speech。nbsp;
您可能会有点不知所措,因为这段代码中有很多内容;但是,出于本项目的目的,我们不需要关注其中的大部分内容。
首先,我们必须输入新的TFLite Micro模型来代替当前在micro_speech示例中使用的模型。nbsp;在Colab的最后一个单元格中,我们应该输出一个十六进制字符的大矩阵,如图5所示。这是我们的TensorFlow Lite for Microcontrollers模型,将用于我们的Arduino代码。nbsp;
图5.
Google Colab输出的TensorFlow Lite Micro模型片段
在micro_features_model.CPP文件中,仅复制并粘贴Colab中的十六进制字符,以取代文件中已有的字符。在Colab代码的最底部,应该有一行写着unsigned int g_model_len,后面跟着一个数字。最后一件事是从Colab复制这个数字,并将其插入Arduino代码文件底部当前用于const int g_model_len的数字。
在此之后,与模型相关的唯一更改是在micro_features_micro_model_settings.CPP文件中。如图6所示,将类别标签"yes"和"no"更改为"forwards"和"backward"。确保你不碰"沉默"或"未知"的标签。
图6.
我们必须改变我们的新单词的预期类别标签
步骤4:解释推理并编写电机驱动程序代码
此时,TFLite Micro模型应该按预期运行,现在我们需要驱动电机以响应TinyML推理输出。为此,我们将修改arduino_command_responder. CPP文件。
如图7所示,在文件的顶部,我们将添加几个#define语句来定义Arduino上的哪些引脚将连接到电机驱动器上的哪些引脚。对于我们的项目,我们将使用D2作为ENABLE信号,D3作为Driver1A输入,D4作为Driver2A输入。请确保还将这些引脚设置为RespondToCommand()函数中的pinMode()函数的输出。
图7.
我们需要定义引脚,将其设置为输出,并编写简单的motorCTRL函数。
从那里我们可以定义我们的运动控制功能。这个函数接受一个速度(我们不会为了这个项目的目的而改变它),以及一个Driver1A和Driver2A的逻辑值。基本上,如果驱动程序1A是高,驱动程序2A是低,电机将在一个方向旋转。如果反过来,我们的马达就会朝相反的方向旋转。
现在剩下的唯一事情就是更改代码中已经存在的命令响应。如图8所示,我们将更改命令响应,以便如果找到的命令的第一个字符是"f"(即找到的命令是"Forward"),它将使电机向前旋转。我们对"后退"命令执行相同的操作。
图8.
我们将根据ML模型找到的命令控制电机向前或向后移动。
步骤5:构建电机电路-电机驱动器电路
有了所有的软件的方式,我们现在可以建立我们的电机驱动器电路。上面列出了BOM,示意图如下图9所示。
图9.
我们的马达驱动电路。
我们使用4.5到21 V的电压源为Arduino和L293D供电。接线中的D4连接到电机驱动器2A输入端,D3连接到电机驱动器1A输入端,D2连接到EN 1,2。我们在每个信号上都有一个1 k Ω下拉电阻,以确保始终定义我们的状态,为了安全起见,我们还有一个0.1 μ F电容用于去耦。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !