本文介绍了关于脑机接口技术(Brain-Computer Interface)的基本概念以及 Muse 头环的 Python 开发基础,并分享了几个我开发的应用场景。
BCI 技术(Brain-Computer Interface Science, 脑机接口)是一种用于在人脑和外部设备间发送和接受信号的技术。BCI 的基本原理是捕获并解释人脑的信号,然后传输到与人脑相连接的机器上,这个机器可以进一步对人脑的信号进行处理,输出相应指令。
BCI 技术有着非常广泛的应用前景,例如帮助残疾、老年或者行动不便的人士控制轮椅、智能家居以及机器人。BCI 的通信还可以是双工的:除了能将脑部信号传输到外部设备外,还能反向将外部设备的信号传输回脑部。这种能主动传回脑部的 BCI 称为主动 BCI(Active BCI),而只支持脑部到外部设备单向信号传输的 BCI 称为被动 BCI (Passive BCI)。
BCI 的主要挑战在于从信噪比匮乏的脑部信号中精确识别出人类的意图。较低的分类准确度以及较差的泛化能力都制约着 BCI 技术的应用和普及。为了解决以上的问题,最近几年深度学习开始被用在大脑信息处理上。
一个常见的 BCI 流程如图 1 所示 [1],该流程包含几个重要部分:脑部信号采集、信号预处理、特征工程、分类,以及智能设备。具体步骤如下:
在步骤1,针对不同的信号,采集方法则分为侵入式和非侵入式两大类。其中,侵入式的方法是在大脑皮层或皮层表面下方采集;而非侵入式信号则是借助外部传感器来采集。图 2 概括了两大类方法下各自包括的常见脑部信号 [1:1] 。
图 3 概括了几种代表信号所采集的信号源位置。
这些信号的特点和差异见表 1 [1:2]。
从表 1 可见,侵入式方法由于更靠近脑神经,所以具备较高的脑部信号时间、空间分辨率和信噪比。然而,侵入式的方法有两个挑战:1. 需要一个外科手术过程,价格昂贵且有很高风险。2. 植入的探测器是固定的,因此只能够识别固定位置的信号。因此,侵入式方法目前只用于动物研究(例如猴子、老鼠)以及特定疾病患者(例如 ALS 病患)上。附图 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 个探测点。
EEG 信号包含了多种信息不重复的频率基带,这些频率基带各自的特点和与人脑活动的对应关系如表 2 [2] 所示:
实际上,如前面的图 2 所示,EEG 信号还可以细分为很多种子分类:
与其他几种非侵入式信号相比,EEG 有几个非常显著的优势:
EEG 主要有 3 个问题:
由于传感器和脑部之间的障碍物(例如头骨)会对检测到的 EEG 信号质量造成很大影响(信噪比约 5%),所以,在进行特征工程之前,通常需要对脑部信号进行诸如信号降噪、信号正规化、信号增强、信号简化/降维等预处理。
在步骤2,特征工程指的是对识别到的特征通过领域知识进行处理。传统的特征包括了时域特征(例如方差、均值、峰态),频域特征(例如快速傅里叶变换)以及时频特征(例如离散小波变换)。传统的特征工程非常依赖领域知识。例如,要研究癫痫病发作时的脑部信号就非常依赖医学知识。此外,人工提取这些特征也非常耗时和困难。而深度学习则提供了一种能自动识别特征的更好选择。
文献 [1:3] 针对 BCI 领域的深度学习模型做了一个总结如图 4 所示。
可以将深度学习模型分为如下四大类:
目前用于基于 EEG 信号的 BCI 技术 state-of-art 的深度学习主要用在两类 EEG 信号上:EEG 振荡(EEG oscillations,实际上就是指 Spontaneous EEG)以及 ERP。
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)、快速眼动。
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]。
目前市面上所能购买的消费级脑机越来越多。基于 EEG 的非侵入式脑机最出名的有如下三种:
关于三款产品的详细比较,可以观看 Cody Rall MD 的分析(需自备梯子)。
出于信噪比和性价比(贫穷)的考虑,我选择先购入了 Muse 。下面将介绍如何使用 Python 语言开发 Muse 应用,以及我所开发的一个 python-muse 脚手架项目。
坑爹的 Muse 官方在 2019 年 7 月份就停止了对开发者的支持。现在要基于 Muse 进行开发,有两种方式:
不管使用哪个工具,流程都大同小异:
下面主要介绍基于 Muse Monitor 的 Python 开发方案。需要准备的东西包括:
Muse 开发的关键在于识别 Muse Monitor 通过蓝牙传输过来的 OSC 数据。为了便于开发,我开源了一个项目 python-muse 。
在使用之前,先将其克隆到本地:
1 | git clone https://github.com/wzpan/python-muse.git |
然后安装依赖:
1 | pip install -r requirements.txt |
OSC Stream Target IP
和 OSC Stream Port
两个输入区域,分别填入你的电脑的局域网 IP 地址及一个用于 OSC 通信的端口号(选择一个未被占用的端口号即可),然后回到主界面,点击一个有点像 AirDrop 的图标 即可开启 OSC 传输。1 | python demo.py --ip 电脑局域网IP --port 端口号 |
此时可以试试眨一下眼睛,看看屏幕中是否打印 blink
信息。如果有打印,说明 python-muse 就执行成功了!
python-muse 的实现非常简单,就是基于 python-osc 实现了对 Muse Monitor 传过来的 OSC 数据的解析和处理。
1 | if __name__ == "__main__": |
从上面的代码可见,在 python-osc 的 dispatcher 设置了对 alpha_absolute
、belta_absolute
、delta_absolute
、theta_absolute
、gamma_absolute
五类脑波以及眨眼动作 blink
、咬牙动作 jaw_clench
还有关注度算法 concentration
等类型数据的分发处理。每种数据类型各指定了一个 handler
方法来进行处理,例如 blink_handler
是在屏幕中打印 blink
字样:
1 | def blink_handler(unused_addr, args, blink): |
这样,当用户眨眼时,屏幕中就会打印出 blink
信息。
这些数据类型的分发操作可以根据需要开启或禁用(注释掉即可)。Muse Monitor 总共支持提取和传输的数据类型可以在其官网的 FAQ 页面 中查看。这里解释其中几个名词,帮助读者理解:
Horseshoe:Muse 的几个感应器分布在头环的四周,形成一个独特的马蹄状。这个马蹄形状的图可以表示每个感应器是否正确连接。如果展示的是实心的色块,表示连接良好;如果展示的是空心的形状,表示连接很弱;而如果没有颜色,则表示没有连接。
Blink:表示眨眼动作。
Jaw Clench:表示咬牙动作。
Markers:Muse Monitor 的 App 里额外设计的几个 UI 按钮事件,实际上和 Muse 头环本身无关,用处不大。
另外,如果希望能够识别当前大脑关注程度(concentration),则需要在 Muse 的设置页面里滑到最底部,在版本号上点击 10 次,启用算法功能,然后在 ALGORITHMS
区域里的 Concentration
选项。不过,如 Muse Monitor 的作者所述,作者对 Concentration 的识别算法效果并不是 100% 满意,仅仅只是提供一个实验性质的实现。我在实际使用过程中,也发现这个算法需要使用者保持相对静止的情况下训练十几秒时间,成本的确比较高。
如果电脑端无法正确获取 EEG 数据,或者希望可视化 EEG 数据,可以借助几种手段来进行:
首先检查局域网 IP 地址是否填写正确,对于 Linux/Mac 等 *nix 系统,可以使用 ifconfig
命令来打印出 Wi-Fi 网络获取到的 ip 地址;对于 Windows 系统,则可以使用 ipconfig
命令。
而如果要检查端口号是否被占用,Linux/Mac 等 *nix 系统可以使用 lsof -i:端口号
命令来打印出 Wi-Fi 网络获取到的 ip 地址;对于 Windows 系统,则可以使用 netstat -aon|findstr "端口号"
命令。
如果端口号被占用,改成其他端口即可。
MuseLab 提供了方便的工具,可以可视化 Muse 的 EEG 数据。
在 Muse Monitor 开启 OSC 数据流传输后,启动 MuseLab ,在左侧面板中,输入端口号,传输方式改为 UDP
,然后点击【Open Port】按钮,即可开始抓取 Muse Monitor 传输过来的 OSC 流数据。此时,左侧面板将会出现非常丰富的 EEG 数据类型:
这些数据类型与 Muse Monitor 的 FAQ 页面列举的 OSC Specification 一致。
之后,点击上方的下拉框,切换到 Visualizers 面板:
点击【New…】按钮,在弹出来的新建窗口中选择 “Scrolling Line Graph” ,创建一个时域的可视化器。此时左侧的面板将会出现所有可供可视化的数据类型,将感兴趣的数据类型勾上即可对该类型进行可视化:
频域信息的可视化也大同小异,区别是新建可视化器时选择 “Stationary Line Graph” 即可。
拿到脑机的前几天非常兴奋,很快我就写出了几个 IoT 应用。分别使用眨眼、咬牙、关注度来打开家里的灯。
之后我对我的智能音箱项目 wukong-robot 进行了改造,支持了 Muse 脑机唤醒:
脑控游戏也是一个有趣的应用方向。例如我魔改的一个眨眼控制的 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 的故事,才刚刚开始。
A Survey on Deep Learning based Brain Computer Interface: Recent Advances and New Frontiers ↩︎ ↩︎ ↩︎ ↩︎
脑电图-维基百科:https://zh.wikipedia.org/wiki/腦電圖 ↩︎
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 SoComputing (ICECDS). IEEE, 3142–3147. ↩︎
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 ↩︎