2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

设计脑机接口的实践指南

  • 2022-04-07
  • 本文字数:2302 字

    阅读完需:约 8 分钟

设计脑机接口的实践指南

背景:BCI 是什么意思?

脑机接口(BCI)指的是将大脑与计算机连接起来的工具。过去十年间,业界对 BCI 的关注度迅速增长——一个典型例子就是,埃隆·马斯克名下主要研发脑机接口技术的初创企业 Neuralink 每次开新发布会都会引发舆论热议[1]。Neuralink 可以在大脑中植入人造物来完成多种任务,诸如用思维来控制动作或直接在大脑中播放音乐等。


你会感到恐惧吗?没关系,这是很正常的。但在这篇文章中,我们将只关注一个简单的 BCI 实现,具体来说是用一个娱乐设备[2]记录脑电波活动,即脑电图(EEG)。这个实现不需要对人体做任何手术(也不会有疼痛或死亡风险)。虽然你(很遗憾)不能用它来收听你最喜欢的乐曲列表,但可以实时观看 BCI 佩戴者的情绪波动(只不过是以代码的形式)。

一个用例:用 EEG Unicorn 估测情绪

如前所述,在本教程中我们将从想法一路走到具体的实现,完成所有必要的步骤来设计一个处理具体任务的 BCI。作为示例,我们要做的 BCI 属于情绪估测领域。这个应用旨在估计参与者的情绪状态。



情绪 BCI 图解。


如图所示,这个管道的目的是将参与者的 EEG 信号作为输入,并返回相应的 V-A 情感坐标图。V-A 图是一种应用于生物心理学的情绪坐标,其中 Valence(横轴)代表愉快和不愉快(即积极和消极)的程度,而 Arousal(纵轴)代表兴奋和平静的水平。基于这种表示,任何情感状态均可表示为 VA 坐标平面上的一个点。

设计情绪识别 BCI 的关键步骤

具体而言,为设计和部署 BCI,我们必须遵循几个关键步骤。

范式定义和信号记录

首先我们要定义 BCI 的范式:我想对什么事物建模?或者想要估计哪些信息?我的应用程序的目的是什么?我是否想通过 BCI 来控制机械手/脚?我是要评估驾驶任务中驾驶员/成员的警觉性吗?是要预测疾病的发作几率?还是检测癫痫发作状态?科学界对一些可以插入 BCI 的研究项目存在巨大兴趣。


在本文的案例中,我们决定关注之前的一项研究工作,就是估计参与者观看一些视频时的情绪状态[3]。这篇论文还提出了一个可以促进特定情绪状态的视频列表(我们对此非常感兴趣!)。这些视频的列表和对应的情绪都可以在 youtube 上找到,并列在注[4]中。


因此我们设计了一个实验基准测试,包括在参与者观看宣传特定情绪的视频时记录他们的 EEG 信号。在我们的存储库中,脚本registration_pipeline.py给出了一段完成这一任务的代码,用户只需将他想要处理的视频放在专用目录中(或改变路径)即可。

概要分析

有了上述基准测试,我们就可以完成脑电波信号的记录工作了。这些信号最后将构成训练 ML 模型(甚至是 DL)所必要的数据集。


我们来做这个模型吧......等一下!在建成一个能够从 EEG 信号中估计情绪的管道之前,我们必须提取信息来帮助模型处理数据。如果你有大量信号和/或可用的计算资源,跳过这一步也是可以的。但为了保持简洁,我们考虑采用更自然简单的模型来简化复杂性。一种可能的提取信息的方法是基于脑电图信号的频率特性,也就是说“这个脑电图片段是在高频率还是低频率范围内振荡?”。过去,科学家们发现,一些脑电图信号是由几个频段组成的,每个频段在特定的任务或行为中都会增强/减弱[4]。


  • δ为深度睡眠,[0-4Hz]。

  • θ表示昏昏欲睡,[4-7Hz]。

  • α代表放松和闭目思考,[8-15Hz]。

  • β代表积极思考和与专注相关的状态[16-31Hz]。

  • γ代表感受到更多压力的状态[32-50Hz]。特征提取的图示。



按照这个过程,我们从每个 EEG 片段中提取了一个信息向量。这个过程的目的是提取信息,以便更好地处理生物医学信号。这个步骤可以使用脚本outline_analysis.py的第一部分来处理。


最后(如果你还跟得上的话),你应该知道剩下的步骤是创建一个模型,用它从上面预计算的特征向量中估计情绪状态(是快乐还是悲伤?)。这里为了让我们的方法简单易懂,我们考虑一个由决策树组成的简单模型。这种简单方法背后的想法是寻找动态阈值来区分信息向量,例如第 i 个电极的高α贡献对应于低 arousal,第 j 个电极的中等γ贡献对应于高 valence,等等。


给出特征向量 X 和它的标签 y,就可以创建一个名为 clf 的分类器(对应于决策树)。该分类器可以通过以下几行代码轻松训练。


from sklearn import treeclf = tree.DecisionTreeClassifier() # definition of the modelclf.fit(X, y) # training of the model...
复制代码


在 outline_analysis.py 的第二部分给出了一个更完整的解释,包括整个模型描述和训练。训练完这个简单的决策树后,可以用 joblib 库来保存它。


...from joblib import dumpdump(clf, 'classifier_file_name')
复制代码

实时实现

在训练和保存模型之后,剩下的步骤是将各个部分合并在一起。


两个联合脚本必须并行工作:第一个脚本旨在记录、处理和估计来自 EEG 的情绪状态pylsl_emotion.py;第二个脚本会在图形上显示相应的情绪和对应的笑脸,如play_emotion.py所述。

尝试一下

最后提一句:自己尝试一下吧!上述代码和自述文件都放到了Github上。你可以自己尝试,或者为不同的模型或 EEG 耳机改编代码。


以上就是全部内容了,感谢大家阅读!我并没有说我的代码是完美的,但如果你有意见、问题或想了解更多内容,请不要犹豫,立刻与我联系吧!😊

参考文献

[1] Rolfe Winkler:埃隆·马斯克创办了,旨在将人脑与计算机连接起来。华尔街日报,2017(链接


[2] Unicorn Hybrid Black——脑机接口(链接


[3] Katsigiannis, S 和 Ramzan, N:通过无线低成本货架设备收集到的 EEG 与 ECG 信号情感识别数据库。IEEE 生物医学和健康信息学(2017——链接)。


[4] Gabert-Quillen, Crystal A:情感视频片段打分。行为研究方法(2015——链接)。


[5] William O Tatum:Ellen R.Grass Lecture: extraordinary EEG。2014(链接)。


原文链接:https://towardsdatascience.com/hands-on-guide-to-design-brain-computer-interface-b99bcc198428

2022-04-07 12:092105
用户头像
刘燕 InfoQ高级技术编辑

发布了 1112 篇内容, 共 568.2 次阅读, 收获喜欢 1978 次。

关注

评论

发布
暂无评论
发现更多内容

一次线上服务高 CPU 占用优化实践

挖坑的张师傅

性能优化 JVM cpu

C++线程池的实现

泰伦卢

c++ C# 线程池

Redis 6.0 新特性-多线程连环13问!

牧码哥

redis 多线程 io

从一道面试题来看计算机基础知识的重要性

周三不加班

数组 堆栈 函数栈 函数栈调用

聊聊苹果账号的那些事儿

不要艾特我

iphone

css常见问题总结

靖仙

CSS css3

各大公司面试题分类整理

是小毛吖

面试 后端

写作的意义到底是什么

董一凡

写作

浅谈SpringCloud之服务注册中心Eureka

北漂码农有话说

写字工具更新史

Bonaparte

学习 读书笔记

金融「中台」十宗罪

FinClip

中台 企业中台 业务中台

《TCP/IP详解》概述

网瘾少年SEC

TCP 网络协议 IP

笔记:《如何系统思考》之如何做到系统思考

wiflish

思维方式

开始每周写作计划

M1racle

C++定时器的实现

泰伦卢

c c++ C#

从删库到跑路?

芦苇

产品 职业 产品经理 职业素养 职业道德

开源商业模式促进金融业科技生态的发展

FinClip

开源 金融科技

Python3.6.1官方文档练习——初入江湖(一)

小匚

Python python3.x 入门

DDD 实践手册(4. Aggregate — 聚合)

Joshua

设计模式 领域驱动设计 架构模式

当我们谈到ThreadLocal的时候,我们在谈什么?

Jason

Java 多线程 ThreadLocal

centos7 maven私服自动启动

kcnf

内存对齐

泰伦卢

c c++ C#

MySQL中 int(11)和 int(10) 到底有没有区别?

周三不加班

MySQL 字符宽度 数据库数据类型

【译】【UX】一个页面可以有多个面包屑导航吗?

Yukun

用户研究 UX 面包屑导航

机会是留给不停寻找他们的人,而不是原地等待的人

非著名程序员

程序员 提升认知 机会 行动派

一个平凡程序员的年度总结

小智

程序员 人生

面试指南 | 终于要跟大家见面了,我有点紧张。

Apache Flink

大数据 flink 流计算 实时计算

翻译和产品本地化的区别是什么?

葛仲君

翻译 本地化 全球化 产品开发

关于GDB你需要知道的技巧

泰伦卢

c c++ C#

业务代码的救星——Java 对象转换框架 MapStruct 妙用

周三不加班

MapStruct 对象转换

Clickhouse 性能测试

久吾尔岂

设计脑机接口的实践指南_AI&大模型_Victor Delvigne_InfoQ精选文章