深度学习

理解和使用深度学习网络

使用深度学习构建High Five计数器

这篇文章来自布莱恩·道格拉斯,YouTube内容创建者,用于控制系统和深度学习应用程序

大约十年来,我一直想实现一个愚蠢的想法,即测量一个人的手的加速度,以计算他们一天中击掌的次数。我不确定如何使用我熟悉的基于规则的算法开发方法来实现这一点,因此项目被搁置。那只是在我做决定的时候关于深入学习的MATLAB技术谈话视频系列我意识到深度学习对于解决这个问题是完美的!

击掌!

本系列第4期视频的主题是迁移学习,结果证明这是我需要的关键概念,让我快速建立并运行击掌计数算法。在这篇博文中,我将介绍我编写的代码的细节,以及我用来让我的击掌计数器工作的工具。希望你们可以用这个作为起点来解决那些困难的分类问题这些问题你们也在过去10年里一直在研究。

本文分为以下几部分:

  • 硬件概述
  • 用MATLAB读取加速度计
  • 数据预处理与标度图
  • 创建培训数据
  • 迁移学习与谷歌网
  • 培训网络
  • 测试击掌计数器
  • 那么,让我们开始吧!

    硬件概述

    硬件设置非常简单。我有一个加速计,它连接到微控制器通过I2C总线。然后Arduino通过USB连接到我的电脑。

    略图的

    为了感知加速度,我用的是MPU-9250. 这是TDK InvenSense的一个9自由度惯性测量单元。我没有将芯片集成到我自己的定制电路设计中,而是使用了分接板暴露电源、接地和I2C通信引脚。我使用这种特殊芯片的唯一原因是因为我已经有一个放在周围了,但是任何加速度计都可以工作,只要它足够小,可以用手快速移动。

    你可以看到,我的硬件设置是相当粗略的,用一个面包板和一些跳线,但我认为这是一种不错的,你不需要设置任何太花哨的东西,以使它工作。

    Arduino设置

    用MATLAB读取加速度计

    要通过Arduino读取MPU-9250的加速度,我使用Arduino万博1manbetx硬件的MATLAB支持包. 该软件包允许您与Arduino通信,而无需为其编译代码。另外,还有一个内置的mpu9250允许您使用单行命令读取传感器的功能。

    连接Arduino、实例化MPU9250对象和读取加速计只需要三行代码。

    读取MPU9250

    数据预处理与标度图

    如果您观看了关于深度学习的技术讲座系列的第四个视频,您就会知道我选择将三轴加速度数据转换为图像以利用GoogLeNet-经过训练以识别图像的网络。特别是,我使用了连续小波变换创建比例图.

    标度图是一种适用于存在于多个标度的信号的时频表示。也就是说,信号频率低且变化缓慢,但偶尔会因高频瞬态而中断。事实证明,它们对于可视化缓慢移动的手内偶尔出现的高频五点加速数据非常有用。

    高五加速度

    下面的可折叠块是我用来制作上述图的MATLAB代码的一个清理版本。

    请注意,此代码使用一个名为cwtfilterbank要创建比例图,该比例图是小波工具箱. 如果您无法访问此工具箱,并且不想自己编写代码,请尝试尝试使用另一种类型的时频可视化。也许是光谱图或者你想出的其他算法。无论你选择什么,这里的想法是,我们试图创建一个图像,使high five图案的独特和可识别特征变得明显。我已经证明了比例图是可行的,但其他方法也可以。

    创建培训数据

    为了训练人际网络识别击掌,我们需要多个击掌的例子来说明击掌是什么样子,击掌不是什么样子。因为我们将从一个预先培训过的网络开始,所以我们不需要像从头开始培训网络那样多的培训示例。我不知道到底需要多少培训数据才能完全捕获所有可能的击掌游戏的解决方案空间,但是,我收集了100个击掌游戏和100个非击掌游戏的数据,这似乎效果很好。我怀疑我制作的视频可以少一些,但我想如果我真的在制作一个产品,我会用更多的例子。您可以处理标记的训练数据量,并查看其对结果的影响。

    收集200张图像似乎需要很多工作,但我编写了一个脚本,一个接一个地循环浏览,并将图像保存在适当的文件夹中。我运行了以下脚本两次;一旦使用“high_five”标签,图像将保存到数据/高_五文件夹一旦有了'no_high_five'标签图像被保存到数据/无高5文件夹

    运行脚本后,我手动检查了培训数据并删除了我认为会破坏培训的图像。这些图片是高五不在框架或图像中间,我知道我做了一个可怜的高五运动。在下面的gif中,我删除了high five image 49,因为它不在帧的中心。

    删除不好的图片

    迁移学习与谷歌网

    我的所有培训数据都在相应的文件夹中,下一步就是建立网络。对于这一部分,我将跟随MATLAB示例基于小波分析和深度学习的时间序列分类,但是,我发现使用MATLAB脚本设置和训练网络更容易,而不是通过MATLAB脚本运行所有内容深度网络设计器应用程序。

    我从预先训练好的GoogLeNet开始,利用这个网络在识别图像中物体方面的所有知识。GoogLeNet受过训练,能够识别图像中的鱼和热狗之类的东西——显然不是我要找的东西——但这正是迁移学习有用的地方。通过迁移学习,我可以保留大部分现有网络,并且只替换网络末端的两层,这两层将这些通用特性结合到我正在寻找的特定模式中。然后,当我对网络进行再培训时,几乎只需要对这两个层次进行培训,这就是为什么转移学习的培训速度要快得多。

    替换GoogLeNet中的图层

    如果你想确切地知道我是如何替换图层的,以及我使用了什么样的训练参数,我建议你跟随我使用的MATLAB示例,或者观看技术讲座。然而,这里还是一个很好的地方,可以让你尝试一些不同的东西。您可以尝试从一个不同的预训练网络开始,如SqueezeNet,也可以在GoogLeNet中替换更多层,或者更改训练参数。这里有很多选择,我认为偏离我所做的可以帮助你对所有这些变量如何影响结果产生一些直觉。

    培训网络

    网络已经准备就绪,在深度网络设计师应用程序中的培训非常简单。在data选项卡中,我通过选择保存击掌和不击掌图像集的文件夹导入训练数据。我还留出20%的图像用于训练过程中的验证。

    替换GoogLeNet中的图层

    然后在“培训”选项卡中,我设置了培训选项。在这里,我使用的选项与下面的MATLAB示例中使用的选项相同,但是,我再次鼓励您使用其中一些值,看看它们如何影响结果。

    在我的单个CPU上,培训只花了4分钟多,验证准确率达到了97%左右。对几个小时的工作来说还不错!

    测试高五计数器

    现在我有了一个训练有素的网络,我使用了这个函数分类从深度学习工具箱中,在每次采样时传入比例图,并让网络返回标签。如果返回的标签是“high_five”,我将增加一个计数器。为了避免在加速度数据在整个缓冲区中划过时多次计算同一个high five,我添加了一个超时,该超时不会计算新的high five,除非它距离上一个high five至少2秒。

    下面是我用来击掌的代码的清理版本。

    现在它开始行动了!

    击掌

    |
    • 打印
    • 发送电子邮件

    评论

    如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。