仿生数据科学:机器学习和人类学习

正如罗伯特·格林(Robert Greene)在精通中所写:要达到真正的精通,您应该抵制自己的耐心。

如果您是第一次阅读我们的项目; 我们正在仿生手,机器学习和社会企业家精神方面冒险! 看看我们如何到达这里:

  • 项目开始
  • 1个月后的项目
  • 2个月后项目
  • 我们现在是第三个月!

现在回到我们的耐心。 到目前为止,我们一直在积极参与寻找合作伙伴,向专家学习以及获得关于我们自己对项目方向的想法的反馈。 尽管到目前为止取得了不错的成绩,但我们认为是时候暂停与利益相关者/客户的互动,并专注于生物识别控制算法技术了。 这样,我们有点不耐烦,因为作为工程师,我们喜欢专注于技术而不是过程(太多等等)。

由于我们还没有一个功能齐全的生物识别设备,因此我们要求建立肌电传感器臂带OYMotion的初创公司提供原始数据样本,以开始进行数据分析,并说服自己和合作伙伴这是一项很好的技术。

上个月,我没有花半熟的脚本就获得最终结果(我的首选策略),而是花了很长时间慢慢地编写了一个Python包,其中包含我们的数据处理,可视化和学习知识,同时教给项目成员Python和机器学习概念。

我的第一个工作流程如下:

  • 我从Jupyter笔记本开始,以了解数据和所需的代码。
  • 然后,我转到Pycharm并创建更体面的面向对象的代码。 (嗯……应该先写测试,TDD)
  • 将其提交到github并向PyPi添加新的发行版。
  • 通知团队,并使用笔记本中的打包Python代码再次让他们和我自己。
  • 重复

希望其他成员也可以进入类似的周期,现在为代码库做出贡献。 我并不总是很擅长委派……更多在这里学习。

迄今为止的发展

创建了一个Python包 。 如果其他人想使用我们的源代码并为我们的源代码做贡献,那应该很容易。 所以很明显,我们必须创建一个包。 源代码存储在github上。 您可以通过pip安装它,然后将其导入Python。 也许这还不令人印象深刻,但是我为此感到非常自豪,因为这是我有史以来第一个Python软件包:

 进口共生 

加载原始传感器数据 。 OYMotion以二进制格式存储其原始信号。 我将它们转换为Python Pandas数据框,以方便数据可视化和分析。 对于每个加载的手势,训练数据包含每个传感器大约30秒的EMG信号。 目前,您一次只能加载1个文件。 如果您想这样做,请稍等一下,直到我们收集允许共享的数据为止:

  emg_data = symbionic.EmgData() 
emg_data.load('filename.hex',手势='g1')
emg_data.load('filename2.hex',手势='g2')

可视化数据。 在进行任何机器学习之前,了解您的数据很重要。 最好的方法是使用性能出色的人类视觉模式识别系统。 经过数十亿年的发展(使用进化算法):

  emg_data.plot() 
OYMotion臂带的8个通道/传感器的所有手势的原始数据样本(如上图所示)。 不同的手势显示出明显不同的行为,可以用来对它们进行分类(已经由您的人脑)。

标记数据。 我们将选择监督式机器学习,换句话说,就是从数据中学习的算法,告诉他们要寻找什么。 因此,需要对以上数据进行标记,以便我们知道手势在哪里,以及哪里只有噪音。 在下面,您会看到一种尝试在手势上自动执行此操作的方法,方法是计算总体样式(包络函数),并对跨通道的这些样式的总和取一个阈值。 可能有人可以提出更好的方法,如果我们转向肌肉信号较弱的截肢者,这肯定会有所帮助。

  emg_data.label_patterns() 
emg_data.plot(show_envelope = True)
使用信封功能(蓝线)在原始数据中标记手势。 标记的数据在浅蓝色阴影区域中指示。 我不保证它做得完美。

机器学习

我目前正在忙于在Jupyter笔记本中编写机器学习代码,以及对结果进行深入分析的可视化。 最初的结果令人鼓舞,现在我们需要考虑如何将其添加到代码库中。 我不会介绍算法的所有细节,但是我可以分享一些初步结果。

首先,了解算法在做什么很重要,这样您就可以进一步改进它。 用于分析预测的一件大事是所谓的混淆矩阵 。 一个奇妙的名字,它告诉您算法有多么混乱。 理想情况下,每个手势都可以正确分类(不要混淆),但是算法经常会出错。 在我们的案例中,最糟糕的部分是当它认为确实存在噪音时就会发出信号(因此,仿生手会意外地张开或合上)。 但是,我仍然应该检查它是否确实不正确,因为也许我将数据标记为错误。

针对EMG数据样本的随机森林算法的第一分类结果。 总准确度为68%。 您会看到手势经常与噪点混淆,但不像其他手势那样经常被混淆。

您可以在混淆矩阵中看到,当前算法经常将手势归类为噪声。 但这也是因为您需要足够的信号才能做出正确的预测。 我的假设是,随着算法从手势中看到更多信号,分类应该变得更加准确。 为此,我制作了下图,证实了我的假设。 从该领域的专家那里我们听说,理想情况下,您应该在200毫秒(0.2秒)后对手势进行分类,这样用户就不会遇到很大的时间延迟。 从结果来看,这对我来说似乎是可行的。

分类会及时得出结果。 在时间= 0时,手势实际上开始,但是尚无可用信号,因此任何算法都需要一段时间才能检测到它。

现在,我们可以开始考虑如何将这样的模型和见解添加到我们的Python包中。

一旦我们收集了真实的传感器数据,便可以将其开源,并且外部数据科学家可能会在需要的时候开始提供帮助(请问?)。

持续的人类学习

我们已经学习并且正在学习很多东西。 我将在这里总结主要内容:

  • 了解仿生手使用者真正需要什么
  • 了解EMG信号的外观
  • 了解如何使用Python处理和可视化它们
  • 了解如何创建开源Python包
  • 了解如何进行多元,多项式时间序列分类(根据来自多个传感器的EMG信号预测多个手势)
  • 了解如何说服我们的经理进一步资助我们的项目
  • 了解如何激发他人加入我们的事业
  • 了解如何保持团队运作
  • 了解如何教授编码和机器学习
  • 了解如何在Python中可视化实时数据流
  • 了解如何使用Arduino
  • 了解如何与其他项目进行全球合作
  • 了解在线协作工具(Trello,Slack,Google文档等)

现在的计划

我们的经理可以购买肌电袖标。 我们确实收到了反馈,以写下所需的技术架构和更详细的项目时间表。 就我个人而言,我不相信详细的计划,我们打算采用这种漂亮的敏捷方法,但是明确我们的愿景和体系结构当然不会受到伤害。

获得臂章后,第一步就是与之一起收集数据 ,因此我们可以实时从信号中学习,并允许外部人员为我们的软件和算法做出贡献。 我想开始如下:

  • 从我们自己收集数据
  • 从一些志愿截肢者那里收集数据
  • 在更恶劣的情况下(例如出汗)收集数据

有了所有人可用的此类数据,我们就可以开始创建一个简单的开源人与机器学习环境 。 理想情况下,非专家应该易于使用。

之后,我们应该关注手势的鲁棒性 ,不仅要准确,快速地分类,还要在手势之间进行切换时增加一些滞后/罚分。 这样,当我们确定某个手势时,我们就很难切换到另一个手势,从而不会意外地掉下例如被抓住的物体。 与不需要时不执行手势相比,在不需要时不执行手势会更糟。 在第一种情况下,您可以丢东西,而在第二种情况下,您只需重试即可。 这也可能需要使用不同的指标进行优化。

同时,我们必须转而以某种方式运行算法,以处理来自袖标的流数据 ,因此我们实际上可以实时对手势进行分类。 现在,我真的可以聘用一些高级(Python)软件开发人员。

理想情况下,我们还希望该软件能够与任何设备接口 。 无论是OYMotion还是Myo,甚至是用于读取信号的EEG传感器。 同时能够驱动仿生手臂中的任何电机系统。 这将需要一个复杂的模块化体系结构,而我现在尚无法预见其确切的轮廓。

同时,我仍然想找时间记录和分享我们的知识。 我在傍晚的宝贵时间写这些博客文章,在那里我可以编写代码。 这是保持耐心的重要部分。 紧接着,我们还在公司活动中首次展示了我们的想法和结果。 到目前为止,反馈是非常积极的!

最后,为了保持耐心,我们应该记住上述所有都是工具。 机器学习,软件或管理技能,仅是达到目的的工具。 也许目标是制造仿生手,但那仅仅是一个工具。 对我而言,重要的是不断学习,创造和分享的过程,并使其他人也能做到这一点。 仿生手可以帮助其他人做到这一点。

如果您想了解我们的进展,请随时在Medium,Github或Linkedin上关注我。 如果您想提供帮助,需要自助或有什么好主意可以分享; 请与我联系!