引言
脑电图(EEG)是一种非侵入性地记录大脑皮层电活动的方法。通过在头皮上放置多个电极,我们可以获取毫秒级别的神经活动数据。运动想象(Motor Imagery)EEG 是 BCI(脑机接口)领域最经典的研究范式之一——被试想象自己左侧或右侧肢体运动时,大脑的感觉运动皮层会产生特定的节律变化。
EEG 信号的三大挑战
EEG 信号有三个致命问题:
- 信噪比极低。脑电信号在微伏级(μV),而眨眼(EOG)、肌肉活动(EMG)、电源线干扰(50Hz)的幅度可能数倍于此。
- 非平稳性。同一个被试在不同时间的脑电特征可能完全不同,甚至同一次实验内的信号也会随时间漂移。
- 空间分辨率低。电极之间的信号存在容量传导效应(volume conduction),单个电极记录的信号实际上是多个脑区的混合。
预处理流程
带通滤波
运动想象相关的大脑节律主要集中在 μ 节律(8-12Hz)和 β 节律(13-30Hz)。我们使用 Butterworth 带通滤波器:
from scipy.signal import butter, filtfilt
def bandpass_filter(data, lowcut, highcut, fs, order=5):
nyq = 0.5 * fs
low = lowcut / nyq
high = highcut / nyq
b, a = butter(order, [low, high], btype='band')
return filtfilt(b, a, data)
filtered_data = bandpass_filter(raw_eeg, 8, 30, fs=250)
ICA 去除伪迹
ICA(独立成分分析)可以将混合信号分解为统计独立的成分,从而识别并去除眨眼、肌肉活动等伪迹:
from sklearn.decomposition import FastICA
ica = FastICA(n_components=n_channels, random_state=42)
sources = ica.fit_transform(filtered_data.T).T
# 识别并置零眼电成分(通常位于额头电极权重最高的成分)
# 重构信号 = mixing_matrix × cleaned_sources
cleaned_data = ica.mixing_ @ cleaned_sources
特征提取:CSP
共空间模式(CSP)是运动想象 BCI 中最经典的特征提取方法。它的核心思想是寻找一组空间滤波器,最大化两类信号的方差差异。
from sklearn.covariance import EmpiricalCovariance
# 计算两类试验的协方差矩阵均值
R1 = np.mean([np.cov(trial1) for trial1 in class1_trials], axis=0)
R2 = np.mean([np.cov(trial2) for trial2 in class2_trials], axis=0)
# 广义特征分解
eigvals, eigvecs = scipy.linalg.eigh(R1, R1 + R2)
# 取最大和最小特征值对应的特征向量
W_csp = np.hstack([eigvecs[:, :m], eigvecs[:, -m:]])
# 特征:滤波后信号的 log-variance
features = np.log(np.var(W_csp.T @ trial, axis=1))
CSP 提取的特征具有良好的可分性,尤其适合二分类运动想象任务。
分类方法对比
在 PhysioNet EEG Motor Movement/Imagery 数据集上的实验结果:
| 方法 | 特征 | 分类器 | 准确率 |
|---|---|---|---|
| 基线 | 功率谱密度 | SVM | 62.3% |
| 改进 | CSP(3对滤波器) | SVM | 78.1% |
| 深度 | 原始信号 | EEGNet | 83.5% |
| SOTA | FBCSP(滤波器组CSP) | SVM | 85.2% |
深度学习:EEGNet
EEGNet 是专门为 EEG 设计的轻量级 CNN,包含深度可分离卷积和逐点卷积:
class EEGNet(nn.Module):
def __init__(self, n_channels, n_classes):
super().__init__()
# 时间卷积 + 空间卷积
self.block1 = nn.Sequential(
nn.Conv2d(1, F1, (1, kernel_size), padding='same'),
nn.Conv2d(F1, F1 * D, (n_channels, 1), groups=F1),
nn.BatchNorm2d(F1 * D),
nn.ELU(),
nn.AvgPool2d((1, 4))
)
# 可分离卷积
self.block2 = nn.Sequential(
nn.Conv2d(F1 * D, F2, (1, 16), groups=F1 * D),
nn.Conv2d(F2, F2, (1, 1)),
nn.BatchNorm2d(F2),
nn.ELU(),
nn.AvgPool2d((1, 8))
)
self.classifier = nn.Linear(F2 * t, n_classes)
EEGNet 之所以有效,是因为它的设计充分利用了 EEG 信号的两个结构先验:时间维度的卷积可以捕获节律信息,空间维度的深度可分离卷积可以学习通道之间的相关性。
前景与挑战
肌肉信号识别已经非常成熟(肌电假肢的准确率可达 95%+),但脑电的准确率天花板仍在 80%-90% 之间。这是因为头骨和硬脑膜就像一道厚重的雾,大脑皮层发出的微弱电信号传到头皮时已经高度模糊。
但随着新型传感器(干电极、微针阵列)和算法的进步,以及 Transformer 在时序建模上的强大能力,BCI 领域正处在一个令人兴奋的拐点。
