本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于 MPU6050 的无触摸手势计算器

发布时间:2021-11-18
分享到:

基于 MPU6050 的无触摸手势计算器

发布时间:2021-11-18
分享到:

为了在手机上做一些基本的算术而脱下手套似乎总是非常低效和烦人,因为一旦你脱下手套,之后立即戴上手套是一场噩梦。因此,我设计了这款手势计算器,让我可以进行所有这些基本计算,而无需脱下手套或担心污染我的手机。我现在也想深入研究 tinyML,所以感觉这是一个合适的项目,可以在 PocketBeagle 上实现我的第一个 TFLite 项目。

构建说明
从硬件的角度来看,这个项目非常简单,您只需要 PocketBeagle、MPU6050 IMU 和 OLED 屏幕。由于 PocketBeagle 对你们中的一些人来说可能是一个不熟悉的平台,我在这里附上它的引脚图。图表的顶部对应于微型 USB 端口。

  • 将电源轨连接到 P1_14 和/或 P2_23
  • 将接地轨连接到 P1_16 和/或 P2_21
  • 将 SCL 从 P1_28 连接到面包板
  • 将 SDA 从 P1_26 连接到面包板
  • OLED 屏幕和 MPU6050 都使用 I2C,因此请按照封装和图表中的指示连接 SCL 和 SDA
  • 将 MPU6050、PocketBeagle 和 Screen 装入 3D 打印机箱

最终产品应该看起来像这样(尽管您的电缆管理可能比我的要好)

代码
项目结束时链接的存储库中有 4 个主要文档,以及配置 PocketBeagle 引脚和运行脚本所需的 2 个附加文件。

Acquisition

acquisition.py从MPU6050收集原始加速度计和陀螺仪的数据。我设置了 2Gs 加速度的阈值来检测手势何时开始,然后我收集固定的 350 个样本,对应大约 2 秒,以使其一致且易于稍后输入到 TensorFlow 模型中。

VisualizationandWaveletTransform

来自 IMU 的原始数据由 350 个样本组成,因此它可以捕获整个运动,但是,我们实际上并不需要那么多样本来完全捕获运动的整体要点。这就是小波变换的用武之地。它所做的是保留信号的形状,同时改变其时间扩展,从本质上减少样本数量,而有用信号的损失很小。(cA1, cD1) 小波变换的结果是2个向量:一个是近似系数,一个是细节系数。通过将信号分成 2 个独立的信号,这使可用于分类的特征数量翻了一番。我们还可以通过使用不同的小波(cA2、cD2)来创建更多特征。

数据可视化.ipynb还生成为手势收集的整个数据的可视化,这使我能够分析不同的手势作为信号的样子并调整我的手部动作。

Training the Machine Learning Model

所有数据处理和模型训练都可以在repo 的Training Model.ipynb中找到。来自小波变换的数据帧包含 24 列,对应于 6 个原始数据列乘以每个小波变换乘以 2 次变换的 2 个结果。首先对数据集进行标准化,将值从 0 映射到 1,然后将每个手势的值展平为单个向量,以便更轻松地与 TensorFlow 集成。

之后,数据集被分为 3 部分:训练 (70%)、测试 (15%)、验证 (15%)。我使用了 Stratified Shuffle Split 而不是典型的 test_train split。由于我的训练数据集非常小,根据训练期间哪些手势更为普遍,存在很多可变性,因此分层 shuffle 确保所有部分的手势分布相同。

对于实际模型,我使用了来自 TensorFlow 的顺序 Keras 模型。经过一些参数优化,我得到了我当前的模型架构,它在精度和大小之间提供了很好的折衷(因为我们在 SoC 上运行,我们希望模型相对较小以获得良好的性能)。为每个隐藏神经元层添加了 Dropout 层,以防止在训练数据集上过度拟合。

尽管原始手势数据看起来相当嘈杂和复杂,但在处理数据和训练神经网络后,该模型在测试数据上仍然达到了 90% 以上的准确率。

要真正利用 TinyML 的强大功能,您需要使模型与 PocketBeagle 兼容。我将模型转换为 TensorFlowLite 模型。

Inference on the Go

存储库中的最后一个代码文件predict.py包含类似于我在上面所做的代码。它使用与获取相同的过程获取数据,然后执行小波变换和归一化,唯一的区别是我优化了代码,主要将 NumPy 用于 PocketBeagle。要运行实际推理,您首先需要从模型中分配张量。

然后,您可以将数据传递给解释器,它会生成一个具有每个预测置信度的数组。

操作说明
设备设置为在启动时运行推理代码,因此您只需插入 PocketBeagle,等待几分钟后,它应该已启动并准备好预测手势。计算器的流程如下:

  • 画出空中的第一个数字
  • 轻弹手腕(这会将计算器推进到操作员选择器)
  • 画一个数字 1 - 5 来选择你想要的运算符
  • 画出空中的第二个数字
  • 再次轻弹手腕计算结果

虽然在训练期间模型在测试数据上达到了 90% 以上的准确率,但在实际使用设备和执行手势时,准确率肯定较低,很可能是由于不同手势的执行方式和信号噪声的固有差异这是。从多个做手势的人那里收集更多的训练数据将使网络能够更好地将其学习推广到手势。在这个项目的未来迭代中,也可以为计算器实现更多的运算符和更好的选择它们的方法。在那之前,我认为最重要的补充是创造一个更好的外壳,允许更一致的读数并稳定 OLED 显示器。

由于该设备作为腕带佩戴,添加某种形式的生物测量设备(例如 PPG)将允许使用类似的设备通过在不同参数上训练模型来监控健康状态或身体活动。

本方案所用到的一些代码

如果您对此项目有任何想法、意见或问题,请在下方留言。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论