本文介绍了关于脑机接口技术(Brain-Computer Interface)的基本概念以及 Muse 头环的 Python 开发基础,并分享了几个我开发的应用场景。

一、BCI 技术综述

BCI 技术(Brain-Computer Interface Science, 脑机接口)是一种用于在人脑和外部设备间发送和接受信号的技术。BCI 的基本原理是捕获并解释人脑的信号,然后传输到与人脑相连接的机器上,这个机器可以进一步对人脑的信号进行处理,输出相应指令。

BCI 技术有着非常广泛的应用前景,例如帮助残疾、老年或者行动不便的人士控制轮椅、智能家居以及机器人。BCI 的通信还可以是双工的:除了能将脑部信号传输到外部设备外,还能反向将外部设备的信号传输回脑部。这种能主动传回脑部的 BCI 称为主动 BCI(Active BCI),而只支持脑部到外部设备单向信号传输的 BCI 称为被动 BCI (Passive BCI)。

BCI 的主要挑战在于从信噪比匮乏的脑部信号中精确识别出人类的意图。较低的分类准确度以及较差的泛化能力都制约着 BCI 技术的应用和普及。为了解决以上的问题,最近几年深度学习开始被用在大脑信息处理上。

一个常见的 BCI 流程如图 1 所示 [1],该流程包含几个重要部分:脑部信号采集、信号预处理、特征工程、分类,以及智能设备。具体步骤如下:

  1. 脑部信号被采集并发送给预处理模块进行降噪和增强。
  2. 这些信号被进行分类,识别成控制指令。
  3. 这些控制指令被发送给外部智能设备,从而实现控制外部设备的目的。

图1:常见的 BCI 流程示意图
图1:常见的 BCI 流程示意图

1.1 脑部信号采集

在步骤1,针对不同的信号,采集方法则分为侵入式和非侵入式两大类。其中,侵入式的方法是在大脑皮层或皮层表面下方采集;而非侵入式信号则是借助外部传感器来采集。图 2 概括了两大类方法下各自包括的常见脑部信号 [1:1]

图2:BCI 常用的生物学信号
图2:BCI 常用的生物学信号

图 3 概括了几种代表信号所采集的信号源位置。

图3:几种脑部信号的信号源位置示意
图3:几种脑部信号的信号源位置示意

这些信号的特点和差异见表 1 [1:2]

表1:各类脑部信号的特点和差异
表1:各类脑部信号的特点和差异

从表 1 可见,侵入式方法由于更靠近脑神经,所以具备较高的脑部信号时间、空间分辨率和信噪比。然而,侵入式的方法有两个挑战:1. 需要一个外科手术过程,价格昂贵且有很高风险。2. 植入的探测器是固定的,因此只能够识别固定位置的信号。因此,侵入式方法目前只用于动物研究(例如猴子、老鼠)以及特定疾病患者(例如 ALS 病患)上。 最近 Elon Musk 所带领提出的 Neuralink 技术也是一种侵入式的方法,其亮点在于通过一套称为“neural dust”的微型机器人来实现植入柔性电极。这套方法解决了以上两个挑战,值得后续关注。不过该技术目前最大的争议在于电极的植入位置无法同时覆盖全脑,且非消费级。附图 1 最近 Elon Musk 所带领提出的 Neuralink 技术也是一种侵入式的方法,其亮点在于通过一套称为“neural dust”的微型机器人来实现植入柔性电极。这套方法解决了以上两个挑战,值得后续关注。不过该技术目前最大的争议在于电极的植入位置无法同时覆盖全脑,且非消费级。

相比之下,非侵入式的方法可以在无需植入探测器的情况下采集人类的脑部信息。这种方案更加安全、快捷。然而,非侵入式的方法能读取到的信号类型和信噪比都很有限。

其中,EEG (Electroencephalogram,脑电波)信号是 BCI 系统中最常用的一种非侵入式信号。EEG 记录大脑活动时的电波变化,是脑神经细胞的电生理活动在大脑皮层或头皮表面的总体反映。如图 4 所示,EEG 的探测位置通常遵循国际的 10-20 系统或中间 10% 探测位置(the intermediate 10% electrode positions)。其中,国际 10-20 系统将头皮按照 10% 和 20% 的间隔精度进行划分,总共包含 21 个探测点;而中间 10% 则是统一使用 10% 的间隔精度进行划分,因此包含 75 个探测点。目前工业采用的 EEG 采集系统通常不会达到 75 个探测点。例如,BCI 2000 拥有 64 个探测点,openBCI 头盔拥有 32 个探测点,Emotiv EpPOC+ 拥有 14 个探测点,Emotiv insight 头盔拥有 5 个探测点。

图4:(A) 和 (B) 为国际 10-20 系统的左视图和顶视图;(C) 是中间 10% 探测位置
图4:(A) 和 (B) 为国际 10-20 系统的左视图和顶视图;(C) 是中间 10% 探测位置

EEG 信号包含了多种信息不重复的频率基带,这些频率基带各自的特点和与人脑活动的对应关系如表 2 [2] 所示:

表2:EEG 信号包含的脑波种类
表2:EEG 信号包含的脑波种类

实际上,如前面的图 2 所示,EEG 信号还可以细分为很多种子分类:

  1. Spontaneous EEG,顾名思义就是身体自然产生的 EEG 。当我们谈论 “EEG” 这个词的时候,我们通常指的就是 spontaneous EEG ,即在不给任何刺激的自然情况下,记录大脑在某个特定状态下的信号情况。例如,spontaneous EEG 可以记录受观察者在睡眠时、展开某个脑力任务时(例如算数)、疲劳时、受扰乱时等情况下的 EEG 信号。
  2. 诱发电位(Evoked Potential,EP),表示的是通过事件刺激所诱发的 EEG 信号。根据刺激方法不同,EP 又可进一步细分为事件相关电位(Event-Related Potential, ERP)和稳态视觉诱发电位(Steady State Evoked Potential,SSEP)。其中,ERP 记录大脑在一个短时、特定事件下的 EEG 信号(例如让受观察者看电脑屏幕上变换的棋盘);而 SSEP 则指的是周期性的表层刺激下的 EEG 信号(例如让受观察者接受固定频率的闪烁灯光刺激)。
  3. Event-related Desynchronization/Synchronization (ERD/ERS),用于记录大脑在某个特定状态下的信号幅度/频率变化的分布。其中,ERD 用于分析 EEG 信号的衰弱分布,而 ERS 则用于分析 EEG 信号的增强。ERD/ERS 的优点在于同样也是一种自然产生的信号,无需额外刺激。并且还能记录信号增强/衰弱的现象。不过,要采集高质量的 ERD/ERS ,需要被观察者接受可能长达数周的训练。并且,不同的用户的 ERD/ERS 表现可能有巨大的差异,且准确度并不是很高。所以,这种信号在 BCI 技术中并不常用。

与其他几种非侵入式信号相比,EEG 有几个非常显著的优势:

  1. 采集器容易做成头盔的形式,便携性更强,安装更为方便,且造价低廉;
  2. 时间分辨率高(毫秒级);
  3. EEG 对受观察目标移动等动作有较高容忍度;4. 受观察目标不需要暴露在强磁场下。

EEG 主要有 3 个问题:

  1. 记录的是整个大脑神经活动产生电信号的叠加,因此难以区分不同部位的神经活动;
  2. 探测器数量比较有限,所以空间分辨率低;
  3. 跟其他非侵入式的信号一样,经过头皮衰减导致信噪比很差。因此无创脑机通常用在消费电子领域较多,实现一些较简单的功能,例如情绪检测,简单的人机交互等。

由于传感器和脑部之间的障碍物(例如头骨)会对检测到的 EEG 信号质量造成很大影响(信噪比约 5%),所以,在进行特征工程之前,通常需要对脑部信号进行诸如信号降噪、信号正规化、信号增强、信号简化/降维等预处理。

1.2 特征工程

在步骤2,特征工程指的是对识别到的特征通过领域知识进行处理。传统的特征包括了时域特征(例如方差、均值、峰态),频域特征(例如快速傅里叶变换)以及时频特征(例如离散小波变换)。传统的特征工程非常依赖领域知识。例如,要研究癫痫病发作时的脑部信号就非常依赖医学知识。此外,人工提取这些特征也非常耗时和困难。而深度学习则提供了一种能自动识别特征的更好选择。

文献 [1:3] 针对 BCI 领域的深度学习模型做了一个总结如图 4 所示。

图5:深度学习模型
图5:深度学习模型

可以将深度学习模型分为如下四大类:

  1. 判别模型(discriminative models),用于将输入数据按照已知的标签分类。判别算法能利用非线性变换学习出有差异的特征,并依据概率来预测分类。因此相关的算法能够用于特征工程和分类。判别模型主要包括多层感知器(Multi-Layer Perceptron,MLP),循环神经网络(Recurrent Neural Networks,RNN),卷积神经网络(Convolutional Neural Networks,CNN)以及它们的变种。
  2. 表示模型(representative models),用于从输入数据中提取出纯粹(pure)和可表示(representative)的特征。这些算法只能用于特征工程,但不能用于分类。常用的表示模型有自动编码器(Autoencoder,AE),受限玻尔兹曼机(Restricted Boltzmann Machine,RBM),深度置信网络(Deep Belief Networks,DBN),以及它们的变种。
  3. 生成模型(generative models),用于学习输入数据及给定标签的相邻概率分布。在 BCI 领域,生成模型常用于重建或生成一批脑信号样本,以增强训练集。常用的生成模型包括变分编码器(Variational Autoencoder,VAE),生成式对抗网络(Generative Adversarial Networks,GAN),等等。
  4. 混合模型(hybrid models),顾名思义就是将两种以上的深度学习网络进行结合的模型。例如,典型的混合深度学习模型采用一个表示模型用作特征提取,再采用一个判别模型用作分类。

目前用于基于 EEG 信号的 BCI 技术 state-of-art 的深度学习主要用在两类 EEG 信号上:EEG 振荡(EEG oscillations,实际上就是指 Spontaneous EEG)以及 ERP。

1.2.1 EEG 振荡

EEG 振荡其实就是前面提的 Spontaneous EEG 。实际上,Spontaneous EEG 包括了睡眠 EEG、运动想象 EEG(MI EEG) 、情绪 EEG、心理疾病 EEG 等。 以睡眠 EEG 为例,典型的应用场景就是根据 EEG 来识别睡眠状态。美国睡眠医学学会(the American Academy of Sleep Medicine,AASM)推荐将睡眠分为五个等级:清醒、非快速眼动1、非快速眼动2、慢波睡眠(Slow Wave Sleep,SWS)、快速眼动。

  1. 判别模型:很多文献使用 CNN ,并基于单通道 EEG 信号进行睡眠等级分类。
  2. 表示模型:例如使用 DBM-RBM 来进行睡眠特征提取以及结合传统分类方法(如 SVM) 进行分类。
  3. 混合模型:例如结合 CNN 和 MLP 来构造一个混合模型以估算睡眠等级。

1.2.2 ERP

ERP 信号最重要的成分叫做 P300 (又称为 P3),与其他成分(P1,P2,N1,N2)相比,P3 用于最强的振幅,更容易被检测。因此在 ERP 中应用最普遍。ERP 又可以进一步细分为视觉诱发电位(Visual Evoked Potentials,VEP)、听觉诱发电位(Auditory Evoked Potentials,AEP)、体觉诱发电位(Somatosensory Evoked Potentials,SEP)等。

例如,VEP 是其中一种最受关注的子分类。Ma et al. [7] 基于运动 VEP (mVEP)使用深度学习提取出了运动时的表达特征。在初始阶段使用遗传算法来压缩原始的 mVEP EEG 信号,然后将该信号交给 DBN-RBM 算法来捕捉更抽象的高阶特征。另外,大量的 P300 相关研究是基于文献 [3] 提出的 P300 speller,该技术可以帮助用户拼写字母。目前该类技术的最高精确度达到了 95.5% ,则是结合了 CNN 的变种 [4]

二、消费级非侵入式脑机产品对比

图6:三款消费级非侵入式脑机产品
图6:三款消费级非侵入式脑机产品

目前市面上所能购买的消费级脑机越来越多。基于 EEG 的非侵入式脑机最出名的有如下三种:

  1. NeuroSky 出品的 EEG 感应头盔。价格便宜(售价 99.99 刀),也有非常丰富的应用。不过据说 NeuroSky 的 EEG 信噪比较低,因此更适合用于开发玩具性质的产品。
  2. Muse 头环,常规售价为 120 刀。它有着最为专业的冥想引导工具,能够较为准确地判断出大脑是否处于放松状态,还能提取出眨眼、咬牙等操作。同时,它提供了完全免费的导出 EEG 数据的接口。因此可以用来进行其他开发研究。
  3. Emotive Insight 头盔,常规售价为 299 刀。Emotive Insight 拥有 5 个 EEG 感应通道,相比前两者,它还提供了训练最多 4 个 mental commmands 的功能,能提取的情绪和表情更丰富。不过,Emotive Insight 并不免费提供 EEG 数据 —— 你需要另外购买 Emotive Pro 软件才能获取 EEG 数据。而这个软件的价格死贵死贵,商业版需要月付 199 刀(几乎都可以买下其他两个设备了);即使是最便宜的学生版方案,也要月付 29 刀(Emotive 你咋不上天?)

关于三款产品的详细比较,可以观看 Cody Rall MD 的分析(需自备梯子)

出于信噪比和性价比(贫穷)的考虑,我选择先购入了 Muse 。下面将介绍如何使用 Python 语言开发 Muse 应用,以及我所开发的一个 python-muse 脚手架项目。

三、Muse 头环开发基础

图7:Muse头环
图7:Muse头环

坑爹的 Muse 官方在 2019 年 7 月份就停止了对开发者的支持。现在要基于 Muse 进行开发,有两种方式:

  1. 使用第三方 App Muse Monitor ,将 EEG 数据通过 OSC 协议发送到终端设备进行处理(推荐)。Muse Monitor 的价格只有 15 刀,且在 iOS 和 Android 两个平台都有上架对应的版本。相比官方的 Muse Direct ,还额外预置了关注程度(concentration)估算的算法实现,这价格算是业界良心了。
  2. 使用官方提供的 Muse Direct iOS 应用,将 EEG 数据通过 OSC 协议发送到终端设备进行处理。Muse Direct 只有 iOS 版本,而且价格是月付或年付制的,每月最低要 4 刀。

不管使用哪个工具,流程都大同小异:

Muse Direct的工作流示例
Muse Direct的工作流示例

下面主要介绍基于 Muse Monitor 的 Python 开发方案。需要准备的东西包括:

  1. Muse 头环,支持 2014 版 Muse Model MU-01、2016 版 Muse Model MU-02 及 2018 “Muse 2” Model MU-03 全系列 Muse 头环;
  2. 一台能够使用官方 Muse 应用连接 Muse 头环的手机。注意国内的 Android 手机可能无法正常运行 Muse 应用,所以建议使用 iPhone 或带有 GMS 的 Android 手机。
  3. Muse Monitor。将其安装到与 Muse 连接的那台手机上。
  4. MuseLab。用于调试和可视化 Muse Monitor 传过来的 OSC 数据(非必须)。
  5. 一台装有 Python 环境的电脑。

3.1 安装 python-muse

Muse 开发的关键在于识别 Muse Monitor 通过蓝牙传输过来的 OSC 数据。为了便于开发,我开源了一个项目 python-muse

在使用之前,先将其克隆到本地:

1
2
git clone https://github.com/wzpan/python-muse.git
cd python-muse

然后安装依赖:

1
pip install -r requirements.txt

3.2 使用 python-muse

  1. 确保你的 Muse 头环已经通过手机的 Muse 官方应用与手机完成了连接。
  2. 获取你的电脑的局域网 IP 地址。
  3. 启动 Muse Monitor,点击 按钮进入 settings 页面,在里头可以找到 OSC Stream Target IPOSC Stream Port 两个输入区域,分别填入你的电脑的局域网 IP 地址及一个用于 OSC 通信的端口号(选择一个未被占用的端口号即可),然后回到主界面,点击一个有点像 AirDrop 的图标 即可开启 OSC 传输。
  4. 在你的电脑中,执行:
1
python demo.py --ip 电脑局域网IP --port 端口号

此时可以试试眨一下眼睛,看看屏幕中是否打印 blink 信息。如果有打印,说明 python-muse 就执行成功了!

3.3 python-muse 实现解析

python-muse 的实现非常简单,就是基于 python-osc 实现了对 Muse Monitor 传过来的 OSC 数据的解析和处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--ip",
default="127.0.0.1",
help="The ip to listen on")
parser.add_argument("--port",
type=int,
default=5000,
help="The port to listen on")
args = parser.parse_args()

dispatcher = dispatcher.Dispatcher()
dispatcher.map("/muse/elements/alpha_absolute", alpha_handler, "EEG")
dispatcher.map("/muse/elements/beta_absolute", beta_handler, "EEG")
dispatcher.map("/muse/elements/delta_absolute", delta_handler, "EEG")
dispatcher.map("/muse/elements/theta_absolute", theta_handler, "EEG")
dispatcher.map("/muse/elements/gamma_absolute", gamma_handler, "EEG")
dispatcher.map("/muse/elements/blink", blink_handler, "EEG")
dispatcher.map("/muse/elements/jaw_clench", jaw_clench_handler, "EEG")
dispatcher.map("/muse/algorithm/concentration", concen_handler, "EEG")

server = osc_server.ThreadingOSCUDPServer(
(args.ip, args.port), dispatcher)
print("Serving on {}".format(server.server_address))
server.serve_forever()

从上面的代码可见,在 python-osc 的 dispatcher 设置了对 alpha_absolutebelta_absolutedelta_absolutetheta_absolutegamma_absolute 五类脑波以及眨眼动作 blink 、咬牙动作 jaw_clench 还有关注度算法 concentration 等类型数据的分发处理。每种数据类型各指定了一个 handler 方法来进行处理,例如 blink_handler 是在屏幕中打印 blink 字样:

1
2
3
def blink_handler(unused_addr, args, blink):
if blink:
print("blink")

这样,当用户眨眼时,屏幕中就会打印出 blink 信息。

python-muse 提取到的 `blink` 信息
python-muse 提取到的 `blink` 信息

这些数据类型的分发操作可以根据需要开启或禁用(注释掉即可)。Muse Monitor 总共支持提取和传输的数据类型可以在其官网的 FAQ 页面 中查看。这里解释其中几个名词,帮助读者理解:

  • Horseshoe:Muse 的几个感应器分布在头环的四周,形成一个独特的马蹄状。这个马蹄形状的图可以表示每个感应器是否正确连接。如果展示的是实心的色块,表示连接良好;如果展示的是空心的形状,表示连接很弱;而如果没有颜色,则表示没有连接。

    Muse 特有的马蹄图
    Muse 特有的马蹄图

  • Blink:表示眨眼动作。

  • Jaw Clench:表示咬牙动作。

  • Markers:Muse Monitor 的 App 里额外设计的几个 UI 按钮事件,实际上和 Muse 头环本身无关,用处不大。

另外,如果希望能够识别当前大脑关注程度(concentration),则需要在 Muse 的设置页面里滑到最底部,在版本号上点击 10 次,启用算法功能,然后在 ALGORITHMS 区域里的 Concentration 选项。不过,如 Muse Monitor 的作者所述,作者对 Concentration 的识别算法效果并不是 100% 满意,仅仅只是提供一个实验性质的实现。我在实际使用过程中,也发现这个算法需要使用者保持相对静止的情况下训练十几秒时间,成本的确比较高。

3.4 如何诊断或调试 Muse 的 EEG 数据

如果电脑端无法正确获取 EEG 数据,或者希望可视化 EEG 数据,可以借助几种手段来进行:

3.4.1 检查 IP 地址是否正确以及端口号是否被占用

首先检查局域网 IP 地址是否填写正确,对于 Linux/Mac 等 *nix 系统,可以使用 ifconfig 命令来打印出 Wi-Fi 网络获取到的 ip 地址;对于 Windows 系统,则可以使用 ipconfig 命令。

而如果要检查端口号是否被占用,Linux/Mac 等 *nix 系统可以使用 lsof -i:端口号 命令来打印出 Wi-Fi 网络获取到的 ip 地址;对于 Windows 系统,则可以使用 netstat -aon|findstr "端口号" 命令。

如果端口号被占用,改成其他端口即可。

3.4.2 可视化 Muse 的 EEG 数据

MuseLab 提供了方便的工具,可以可视化 Muse 的 EEG 数据。

在 Muse Monitor 开启 OSC 数据流传输后,启动 MuseLab ,在左侧面板中,输入端口号,传输方式改为 UDP ,然后点击【Open Port】按钮,即可开始抓取 Muse Monitor 传输过来的 OSC 流数据。此时,左侧面板将会出现非常丰富的 EEG 数据类型:

使用 MuseLab 解析 OSC 流 EEG 数据
使用 MuseLab 解析 OSC 流 EEG 数据

这些数据类型与 Muse Monitor 的 FAQ 页面列举的 OSC Specification 一致。

之后,点击上方的下拉框,切换到 Visualizers 面板:

切换到 Visualizers 面板
切换到 Visualizers 面板

点击【New…】按钮,在弹出来的新建窗口中选择 “Scrolling Line Graph” ,创建一个时域的可视化器。此时左侧的面板将会出现所有可供可视化的数据类型,将感兴趣的数据类型勾上即可对该类型进行可视化:

使用 MuseLab 可视化 EEG 数据
使用 MuseLab 可视化 EEG 数据

频域信息的可视化也大同小异,区别是新建可视化器时选择 “Stationary Line Graph” 即可。

3.5 Muse 应用示例

3.5.1 脑机 IoT

拿到脑机的前几天非常兴奋,很快我就写出了几个 IoT 应用。分别使用眨眼、咬牙、关注度来打开家里的灯。

3.5.2 脑机智能音箱

之后我对我的智能音箱项目 wukong-robot 进行了改造,支持了 Muse 脑机唤醒:

3.5.3 脑控游戏

脑控游戏也是一个有趣的应用方向。例如我魔改的一个眨眼控制的 FlappyBird 游戏 MuseFlappyBird

如下是一个稍微粗糙一点的早期版本演示视频:

四、后续计划

玩了几天 Muse 后,我就已经把目前 Muse 所提供的现成能力都“榨干”了。后面就需要开始往更加困难的目标前进:真正识别意图。但如 Muse Direct 所述:

It is important to note that this raw data can be difficult to interpret and you may want to consider getting in touch with an experienced EEG Researcher for your project as we are unable to provide further support with the analysis and processing of the EEG data you collect.

仅靠 Muse 所提供的几个通道的 EEG 要准确识别出意图是非常困难的。不过,当我凝视深渊的时候,深渊不也正在凝视着我吗?

我与 BCI 的故事,才刚刚开始。

参考文献


  1. A Survey on Deep Learning based Brain Computer Interface: Recent Advances and New Frontiers ↩︎ ↩︎ ↩︎ ↩︎

  2. 脑电图-维基百科:https://zh.wikipedia.org/wiki/腦電圖 ↩︎

  3. Ajay Shanbhag, Aman Prabhu Kholkar, Saish Sawant, Allister Vicente, Sparsh Martires, and Supriya Patil. 2017. P300 analysis using deep neural network. In 2017 International Conference on Energy, Communication, Data Analytics and So‡Computing (ICECDS). IEEE, 3142–3147. ↩︎

  4. Mingfei Liu, Wei Wu, Zhenghui Gu, Zhuliang Yu, FeiFei Qi, and Yuanqing Li. 2018. Deep learning based on Batch Normalization for P300 signal detection. Neurocomputing 275 (2018), 288–297 ↩︎

Comments