【免费下载链接】sleepfm-clinical
SleepFM-Clinical 是发表在 Nature Medicine 上的多模态睡眠基础模型 SleepFM 的开源实现。它把多导睡眠图(Polysomnography,PSG)中的生理信号统一组织成 BAS、RESP、EKG、EMG 四大模态,并从中学习可预测疾病风险的睡眠表征。这篇文章带你快速搞懂:这四个缩写分别对应 PSG 里的哪些通道、为什么这样分组,以及它们在代码中是如何落地的 🧭
PSG 多导睡眠图:睡眠分析的"金标准"数据源
PSG 是睡眠医学中的金标准检测手段,一晚上会同时记录脑电、心电、呼吸、肌电等多路信号。不同医院、不同设备的电极摆放方式(montage)和通道命名千差万别——有的叫 EEG F3-A2,有的叫 C3-M2,有的干脆只写 EEG。
这正是 SleepFM 设计四大模态的原因:
- 统一命名混乱:把成百上千种通道写法归类到 4 个模态,屏蔽设备差异;
- 容错处理:某台设备缺某一类信号时,模型依然可以训练(对比学习 leave-one-out 模式);
- 下游灵活:睡眠分期主要看 BAS,呼吸暂停主要看 RESP,疾病预测则四路信号一起上。
预训练数据规模:超过 585,000 小时 PSG 记录、约 65,000 名受试者(见 README.md)。
BAS 脑电模态:睡眠分期的"主角"
BAS = Basic(脑/眼信号组),对应 PSG 中的脑电(EEG)与眼电(EOG)通道,是判定睡眠阶段的核心依据。
| 信号类型 | 典型通道名(channel_groups.json 中的写法) | 临床意义 |
|---|---|---|
| 脑电 EEG | F3、C4、O1:M2、EEG F3-A2 | 区分 Wake / N1 / N2 / N3 / REM |
| 眼电 EOG | EOG(L)、EOG(R)、LOC、ROC、E1、E2 | 识别 REM 期快动眼与清醒期眼动 |
| 参考电极 | A1、A2、M1、M2 | 耳垂/乳突参考,用于导联命名 |
睡眠分期的标签体系就在 sleepfm/preprocessing/preprocessing.py 中:{'Wake': 0, 'Rem': 1, 'N1': 2, 'N2': 3, 'N3': 4, 'Artifact': 5}。
RESP 呼吸模态:发现睡眠呼吸暂停的关键
RESP = Respiratory(呼吸信号组),覆盖呼吸努力、气流、血氧和鼾声,是判断睡眠呼吸暂停综合征(OSA)的核心模态。
- 呼吸努力带:
Chest、Thorax、Abd、RIP Thorax、ABDOMEN—— 胸/腹带,判断"有努力但无气流"的阻塞性事件; - 气流信号:
Nasal Pressure、NASAL P、AIRFLOW、NasalAC—— 鼻压/热敏气流; - 血氧与脉搏:
SpO2、SaO2、TcSpO2、Pulse、PPG、Heart Rate—— 捕捉夜间血氧下降(AHI 评分依赖它); - 鼾声与温度:
Snore、MIC、Oral Therm—— 辅助标记鼾声事件。
预处理脚本中定义了呼吸事件编码(sleepfm/preprocessing/preprocessing.py):
flow_events = {'Central Apnea': 1, 'Mixed Apnea': 2,
'Obstructive Apnea': 3, 'Hypopnea': 4, 'RERA': 5}
EKG 心电模态:通往心血管风险的窗口
EKG = Electrocardiogram(心电组),对应 PSG 中的 ECG 通道,如 ECG、ECG II、ECG I、ECG L 等。
心电看似"与睡眠无关",但夜间心律失常、心率变异性与全因死亡、心梗、心衰、房颤等风险高度相关。论文中 SleepFM 在 130 种疾病上取得 C-Index ≥ 0.75,其中心梗 0.81、心衰 0.80、房颤 0.78,EKG 模态功不可没。疾病预测的 PheCode 标签映射见 sleepfm/configs/label_mapping.csv。
EMG 肌电模态:捕捉睡眠中的身体活动
EMG = Electromyography(肌电组),包括颌肌、腿部和肢体肌电:
| 子类 | 典型通道名 | 用途 |
|---|---|---|
| 下颌肌电 | Chin、CHIN、Chin:Chin2、LChin | REM 期肌张力消失的判据之一 |
| 腿部肌电 | LEG(L)、LEG(R)、LLEG、RLEGEMG | 周期性肢体运动(PLM)检测 |
| 肢体肌电 | Arms-L、Arm-R、Foot-L | 体动与异常运动监测 |
腿肌电事件在预处理中被编码为 {'P-Marker': 1, 'I-Marker': 2, 'LM Body position': 3, 'LM Resp': 4},用于区分周期性肢体运动与觉醒反应。
代码落地:channel_groups.json 通道字典
四大模态的"名字词典"集中在 sleepfm/configs/channel_groups.json:
- BAS:517 个通道名条目(约 345 个去重后)
- RESP:149 个条目
- EKG:52 个条目
- EMG:249 个条目
数据加载时,sleepfm/models/dataset.py 会逐一比对 HDF5 文件中的通道名,把匹配到的通道划入对应模态;若某模态一个通道都没匹配到,该文件会被剔除,保证四模态齐全。
采样与通道数在预训练配置 sleepfm/configs/config_set_transformer_contrastive.yaml 中定义:
BAS_CHANNELS: 10
RESP_CHANNELS: 7
EKG_CHANNELS: 2
EMG_CHANNELS: 4
sampling_duration: 5 # 分钟
sampling_freq: 128 # Hz
patch_size: 640
modality_types: ["BAS", "RESP", "EKG", "EMG"]
也就是说,每条训练样本 = 4 个模态 ×(各自的通道数)× 5 分钟 @ 128Hz 的信号块。不同文件通道数不同怎么办?collate_fn 用零填充 + mask 对齐到同一 batch,让模型天然适应各种 montage。
数据流转:从 .EDF 原始文件到模型输入
完整的数据管道是三步:
- 预处理:sleepfm/preprocessing/preprocessing.py 把 .EDF 文件重采样、低通滤波、标准化后写入 .HDF5(可用
preprocessing/preprocessing.sh一键执行); - 对比预训练:sleepfm/pipeline/pretrain.py 用 leave-one-out 对比学习(随机遮挡一个模态,让其余模态互相学习)训练 SetTransformer,得到 sleepfm/checkpoints/model_base/best.pt;
- 微调/评估:睡眠分期(
finetune_sleep_staging.py)与疾病预测(finetune_diagnosis_coxph.py)分别复用该表征,微调权重在 sleepfm/checkpoints/model_sleep_staging/ 与 sleepfm/checkpoints/model_diagnosis/。
快速上手:仓库自带的 Demo 数据
想亲手看看数据长什么样,可以直接打开 notebooks/demo.ipynb,配套数据都在 notebooks/demo_data/:
- demo_psg.edf:一条完整 PSG 原始记录;
- demo_psg.csv:5 秒一个时间片的标注格式(
Start,Stop,StageName,StageNumber); - is_event.csv 与 time_to_event.csv:疾病预测任务的"是否发生事件 / 距事件时间"标签;
- demo_age_gender.csv:年龄、性别等人口学特征。
数据集划分文件为 sleepfm/configs/dataset_split.json,训练时按 train/validation/test 三组 HDF5 路径取数。
总结:一张图看懂 PSG 数据四模态
| 模态 | 全称 | 核心信号 | 主要服务任务 |
|---|---|---|---|
| 🧠 BAS | Brain/Eye | EEG、EOG | 睡眠分期(Wake/REM/N1/N2/N3) |
| 🫁 RESP | Respiratory | 胸腹带、鼻气流、SpO2、鼾声 | 呼吸暂停与低通气事件 |
| ❤️ EKG | ECG | 心电导联 | 心血管与全因死亡风险预测 |
| 💪 EMG | Electromyography | 颌/腿/肢体肌电 | REM 判定、PLM、体动 |
一句话记忆:BAS 管"睡没睡熟",RESP 管"呼吸顺不顺",EKG 管"心脏扛不扛得住",EMG 管"身体动没动"。四大模态经 channel_groups.json 统一命名、填充对齐后进入 SetTransformer,最终让 SleepFM 成为横跨睡眠分期与疾病预测的基础模型 ✅
【免费下载链接】sleepfm-clinical
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



