共计 2107 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
CHB-MIT 数据集是癫痫检测研究中最常用的公开脑电数据集之一,包含来自波士顿儿童医院 22 名患者的长期 EEG 记录。但在实际使用中,研究者常遇到以下问题:
- 下载困难:MIT 官网服务器在国外,国内下载速度常低于 100KB/s,且不支持断点续传
- 格式复杂:EDF 文件需要特殊解析工具,临床标注信息分散在多个.txt 文件中
- 数据异构:不同患者采样率不同(从 256Hz 到 2kHz),电极数量也存在差异
高效下载方案
多线程下载工具对比
-
wget 基础版:虽然简单但速度慢
wget -r -np -nH --cut-dirs=2 https://physionet.org/files/chbmit/1.0.0/ -
aria2 加速版:支持 16 线程和断点续传
aria2c -x 16 -s 16 -c https://physionet.org/files/chbmit/1.0.0/chb01.edf
Python 自动下载脚本
import requests
from tqdm import tqdm
BASE_URL = "https://physionet.org/files/chbmit/1.0.0/"
# 病例列表从 chb01 到 chb24(注意缺少 chb12)
patients = [f"chb{f'{i:02d}'}" for i in range(1,25) if i != 12]
def download_file(url, save_path):
try:
with requests.get(url, stream=True) as r:
r.raise_for_status()
total_size = int(r.headers.get('content-length', 0))
with open(save_path, 'wb') as f, tqdm(
unit='B', unit_scale=True,
total=total_size, desc=save_path
) as pbar:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
pbar.update(len(chunk))
except Exception as e:
print(f"下载失败 {url}: {e}")
# 可添加重试逻辑
# 下载所有 EDF 文件
for patient in patients:
download_file(f"{BASE_URL}{patient}.edf", f"./data/{patient}.edf")
数据处理实战
EDF 文件解析
使用 mne-python 库读取 EDF 文件:
import mne
# 加载 EDF 文件并自动转换单位
raw = mne.io.read_raw_edf('chb01.edf', preload=True)
# 查看通道信息
print(raw.info)
# 绘制原始信号
raw.plot(duration=5, n_channels=10)
关键预处理步骤
-
滤波处理:
# 带通滤波(0.5-70Hz) + 工频陷波(50/60Hz) raw.filter(0.5, 70, fir_design='firwin') raw.notch_filter([50, 60]) # 根据实际电源频率选择 -
重参考:
# 转换为平均参考 raw.set_eeg_reference(ref_channels='average') -
分段处理:
# 创建事件段(发作与非发作) events = mne.events_from_annotations(raw) epochs = mne.Epochs(raw, events, tmin=-1, tmax=4, baseline=(-1, 0))
典型问题解决方案
EDF 格式差异
- EDF+:支持不连续记录,需检查
raw.annotations中的间断标记 - 电极缺失 :使用
raw.drop_channels(['EEG X-Y'])移除无效通道
内存优化
# 使用 HDF5 保存预处理结果
raw.save('preprocessed_raw.fif', overwrite=True)
# 后续读取
raw = mne.io.read_raw_fif('preprocessed_raw.fif', preload=False)
进阶分析示例
时频分析
import matplotlib.pyplot as plt
# 计算并绘制时频图
frequencies = np.arange(5, 80, 2)
power = mne.time_frequency.tfr_morlet(epochs, frequencies, n_cycles=3, return_itc=False)
power.plot([0], baseline=(-1, 0), mode='logratio')

完整项目建议
- 数据增强 :对少数类(发作样本) 应用滑动窗口增广
- 特征工程:提取时域(如 Hjorth 参数)、频域(功率谱)、非线性特征(熵值)
- 模型设计:尝试 1D-CNN+LSTM 混合架构处理时序信号
资源获取
通过这套流程,我们团队将原本需要 3 天的数据处理时间缩短到 2 小时。特别提醒注意 EDF 文件头中的采样率信息,某些病例存在多采样率混合的情况,需要特殊处理。
正文完
发表至: 未分类
近两天内
