如何在ESP32上使用代码运行TensorFlow模型?

描述

该项目使用在ESP32上运行的TensorFlow Lite创建一个语音控制的机器人。它可以响应简单的单字命令:“左”,“右”,“前进”和“后退”。

硬件部件:

乐鑫ESP32S× 1个

伺服模块(通用)× 2

通用车轮× 2

Gerneric USB移动电源× 1个

I2S麦克风板× 1个

软件应用程序和在线服务:

PlatformIO IDE

我在Google的Commands数据集上使用TensorFlow训练了一个模型。其中包含大约20个单词,我选择了一个很小的单词子集-足以控制机器人的单词,但数量不多,以至于模型变得难以管理。

为了生成训练数据,我们将WAV文件加载到其中,并从每个文件中提取频谱图。

为了获得足够的数据用于命令词,我已经多次重复这些词,以改变音频的位置并添加随机噪声-这为我们的神经网络提供了更多训练数据,并应该有助于其推广。

几个单词-前进和后退的示例更少,因此我更经常重复这些示例。

我最后得到了一个相当简单的卷积神经网络,其中包含2个卷积层,然后是一个完全连接的层,然后是一个输出层。

当我们试图识别多个不同的单词时,我们使用“ softmax”激活函数,并使用“ CategoricalCrossentropy”作为我们的损失函数。

训练模型后,我得到的训练数据准确度不到92%,而验证数据的准确度则超过92%。测试数据集为我们提供了类似的性能水平。

查看混淆矩阵,我们可以看到它主要是将单词误分类为无效单词。这对于我们的用例来说是相当不错的,因为这应该意味着机器人会误判误报而不是误报。

由于模型似乎不适合,我已经在完整的数据集上对其进行了训练。这给了我们大约94%的最终精度,而在混淆矩阵上我们看到了更好的结果。但是,可能会有些过度拟合。

对于实际的机器人,我构建了一个非常简单的两轮机器人。为了驱动车轮,我使用了两个连续的伺服系统和小型动力单元。它具有相当宽的轴距,因为带有ESP32的面包板非常大。

为了在ESP32上运行TensorFlow模型,我使用了TensorFlow Lite。我将其包装在自己的代码中,使其更易于使用。

要读取音频,我们使用I2S-它可以从模拟麦克风的内置ADC读取,也可以直接从I2S数字麦克风读取。

命令检测器由一个任务运行,该任务等待音频样本可用,然后为命令检测器提供服务。

我们的命令检测器将音频数据后退一秒钟,获取频谱图,然后运行预测。

为了提高检测的鲁棒性,我们在多个音频片段上对预测进行了采样,并且还拒绝了在先前检测的一秒钟内发生的任何检测。

如果我们检测到命令,则将其排队等待命令处理器处理。

我们的命令处理器运行一个任务,该任务侦听此队列中的命令。

当命令到达时,它将更改发送到电动机的PWM信号,以停止电动机或设置所需的方向。

为了向前移动,我们将两个电机都向前驱动,对于向后,我们将两个电机都向后驱动。对于左,我们反转左电动机并向前驱动右电动机,而对于右,我们进行相反的,右电动机反向,左电动机向前。

对于我们的连续伺服器,1500us的占空比将使它们停止,低于此值应使它们反向,而高于此值将使它们向前驱动。

我略微调整了右马达正向值的值,因为它的旋转速度不如左马达快,这导致机器人转向一侧。

请注意,因为我们有正确的电机上下颠倒驱动它,所以我们将其反向运行,而将其向后驱动,则我们将其向前驱动。

您可能需要校准自己的电动机才能使机器人直线运动。

它运作良好!

它偶尔会混淆单词并左右混合。
       责任编辑:pj

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分