Assessment of non-invasive blood pressure prediction from PPG and rPPG signals using deep learning
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 4 年前 | ||
| 3 年前 | ||
| 4 年前 | ||
| 4 年前 | ||
| 4 年前 | ||
| 4 年前 | ||
| 4 年前 | ||
| 4 年前 | ||
| 3 年前 | ||
| 4 年前 | ||
| 3 年前 | ||
| 4 年前 | ||
| 4 年前 | ||
| 4 年前 |
非侵入性血压预测评估:基于深度学习的PPG和rPPG信号
引言
本存储库中的代码旨在重现论文“Assessment of non-invasive blood pressure prediction from PPG and rPPG signals using deep learning”的结果,该论文可通过Sensors 特别专题“无接触医疗传感器”[1]访问。这里包含从MIMC-II数据库下载数据、预处理以及训练用于(r)PPG基础血压预测神经网络的脚本。
训练使用Tensorflow 2.4.1和Python 3.8进行,可从命令行执行。
如果您发现此存储库对您的研究有所帮助,请考虑引用我们的论文:
@inproceedings{schrumpf2021assessment,
title={Assessment of deep learning based blood pressure prediction from PPG and rPPG signals},
author={Schrumpf, Fabian and Frenzel, Patrick and Aust, Christoph and Osterhoff, Georg and Fuchs, Mirco},
booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
pages={3820--3830},
year={2021}
}
安装
要使用Python 3.8作为解释器创建虚拟环境,需要virtualenv包。可以使用以下命令安装:
pip install virtualenv
然后使用以下命令创建虚拟环境:
virtualenv --python=/usr/bin/python3.8 venv/
激活虚拟环境的命令是:
source venv/bin/activate
必要的Python包可以通过以下命令安装:
pip install -r requirements.txt
使用脚本
概览
本存储库包含脚本,以再现基于MIMIC-B数据集的BP预测以及基于相机的BP预测的结果。基于MIMIC-A数据集的分析不在此存储库中涵盖。
要复制论文的结果,需要按照特定顺序执行以下脚本。下表总结了每个脚本的目的。
| 脚本名称 | 描述 | |
|---|---|---|
| 1 | download_mimic_iii_records.py |
从MIMIC-III数据库下载数据。 |
| 2 | prepare_MIMIC_dataset.py |
用于:
|
| 3 | h5_to_tfrecord.py |
将数据分为训练、验证和测试集,并将其转换为.tfrecord格式,用于训练过程。 |
| 4 | ppg_train_mimic_iii.py |
使用PPG数据训练血压预测神经网络;保存模型以便后续使用(r)PPG数据进行微调和个性化。 |
| 5 | ppg_personalization_mimic_iii.py |
使用预先训练的神经网络并使用MIMIC-III数据库测试集中的PPG数据对其进行最后层的微调。 |
| 6 | retrain_rppg_personalization.py |
使用预先训练的神经网络并使用rPPG数据进行微调。 |
数据集和训练模型
用作神经架构训练的数据集以及训练模型本身可以在Zenodo上找到。
从MIMIC-III数据库下载数据
download_mimic_iii_records.py脚本可用于下载用于PPG基础训练的记录。具体的记录名在文件MIMIC-III_ppg_dataset_records.txt中提供。可以通过以下命令从命令行运行脚本:
python3 download_mimic_iii_records.py [-h] input output
positional arguments:
input 包含从MIMIC-III数据库下载的记录名称的文件
output 存储下载的MIMIC-III记录的文件夹
脚本运行时间较长,所有记录所需磁盘空间约为1.5TB。
准备PPG数据集
prepare_MIMIC_dataset.py脚本对download_mimic_iii_records.py下载的数据进行预处理。从每条记录中提取PPG和ABP信号,然后根据定义的长度和重叠进行分窗。预处理步骤包括滤波PPG信号。通过峰值检测从ABP信号中提取SBP/DBP值。多种启发式方法排除不适合的血压值及其对应的PPG信号,例如检查:
- SBP和DBP是否在合理的范围内
- ABP和PPG信号没有缺失值
- 基于ABP/PPG计算的心率是否在合理范围
可以为每个主题和整个数据集定义最大样本数。数据集被保存到.h5文件以供进一步处理。
或者,也可以直接从Zenodo(32GB)下载数据集。
usage: prepare_MIMIC_dataset.py [-h] [--win_len WIN_LEN] [--win_overlap WIN_OVERLAP] [--maxsampsubject MAXSAMPSUBJECT]
[--maxsamp MAXSAMP] [--save_bp_data SAVE_BP_DATA]
datapath output
positional arguments:
datapath 包含从MIMIC-III数据库下载的数据记录的路径
output 目标.h5文件
optional arguments:
-h, --help 显示帮助信息并退出
--win_len WIN_LEN PPG窗口长度(单位:秒)
--win_overlap WIN_OVERLAP
窗口之间重叠量占窗口长度的比例(0...1)
--maxsampsubject MAXSAMPSUBJECT
主题的最大样本数
--maxsamp MAXSAMP 数据集中最大总样本数
--save_ppg_data SAVE_PPG_DATA
0:仅保存血压数据;1:保存PPG和血压数据
创建用于训练的tfrecord数据集
为了训练神经网络,需要用prepare_MIMIC_dataset.py脚本创建的数据集分为训练、验证和测试集。h5_to_tfrecord.py脚本根据用户选择进行划分,(a)基于主题的分割或(b)随机分配样本。数据将分别以.tfrecord文件的形式存储在训练、验证和测试集中,以供训练使用。
usage: h5_to_tfrecord.py [-h] [--ntrain NTRAIN] [--nval NVAL] [--ntest NTEST] [--divbysubj DIVBYSUBJ] input output
positional arguments:
input 包含数据集的.h5文件路径
output .tfrecord文件的目标文件夹
optional arguments:
-h, --help 显示帮助信息并退出
--ntrain NTRAIN 训练集的样本数量(默认:1e6)
--nval NVAL 验证集的样本数量(默认:2.5e5)
--ntest NTEST 测试集的样本数量(默认:2.5e5)
--divbysubj DIVBYSUBJ
根据主题(1)或样本(0)对数据集进行分割
使用PPG信号训练神经网络
脚本ppg_train_mimic_iii.py利用由脚本h5_to_tfrecord.py创建的tfrecord数据来训练神经网络。可用的神经架构包括AlexNet[2],ResNet[3],Slapnicar等人发表的一种架构[4]以及LSTM网络。训练使用早停策略,并保存验证损失最低时的网络权重,用于在测试集上估计血压值。测试结果被存储为.csv文件以供后续分析。模型检查点也被保存,以便日后进行微调和个性化。论文中使用的训练模型可以在Zenodo找到。
用法: ppg_training_mimic_iii.py [-h] [--arch ARCH] [--lr LR] [--batch_size BATCH_SIZE]
[--winlen WINLEN] [--epochs EPOCHS] [--gpuid GPUID]
ExpName datadir resultsdir chkptdir
位置参数:
ExpName 训练的独特名称
datadir 包含train、val和test子文件夹(包含tfrecord文件)的文件夹
resultsdir 存储结果的目录
chkptdir 用于存储模型检查点的目录
可选参数:
-h, --help 显示此帮助消息并退出
--arch ARCH 训练所用的神经网络架构(默认:alexnet,resnet,slapnicar,lstm)
--lr LR 初始学习率(默认:0.003)
--batch_size BATCH_SIZE
训练使用的批大小(默认:32)
--winlen WINLEN PPG窗口长度,单位为样本(默认:875)
--epochs EPOCHS 训练的最大轮次数(默认:60)
--gpuid GPUID 多GPU环境下的GPU ID(默认:None)
基于PPG数据微调预训练神经网络
脚本ppg_personalization_mimic_iii.py采用一组测试受试者,对基于PPG数据训练的神经网络进行微调,目的是通过使用每个测试受试者20%的数据重新训练,来改善这些受试者的均方误差。这20%可以是随机选取或系统地(前20%)。剩余的80%用于验证。脚本会在个性化前后,使用验证数据进行血压预测以进行比较。结果被存储为.csv文件,供后续分析。
用法: ppg_personalization_mimic_iii.py [-h] [--lr LR] [--batch_size BATCH_SIZE] [--winlen WINLEN] [--epochs EPOCHS]
[--nsubj NSUBJ] [--randompick RANDOMPICK]
ExpName DataDir ResultsDir ModelPath chkptdir
位置参数:
ExpName 训练名称,前面加上相应的日期格式为MM-DD-YYYY
DataDir 包含train、val和test子文件夹(包含tfrecord文件)的文件夹
ResultsDir 存储结果的目录
ModelPath 用于个性化的模型文件所在的路径
chkptdir 存储模型检查点的目录
可选参数:
-h, --help 显示此帮助消息并退出
--lr LR 初始学习率(默认:0.003)
--batch_size BATCH_SIZE
训练使用的批大小(默认:32)
--winlen WINLEN PPG窗口长度,单位为样本(默认:875)
--epochs EPOCHS 训练的最大轮次数(默认:60)
--nsubj NSUBJ 用于个性化的受试者数量(默认:20)
--randompick RANDOMPICK
定义个性化数据是否随机抽取(1)或者取测试受试者数据的前20%(0)(默认:0)
利用迁移学习进行rPPG为基础的血压预测
脚本retrain_rppg_personalization.py微调一个预训练的神经网络(使用pg_train_mimic_iii.py脚本训练),以实现基于相机的血压预测。rPPG数据由data子文件夹中的hdf5文件提供,这些数据是在莱比锡大学医院的一项研究中收集的,通过标准RGB摄像头拍摄受试者,然后使用Wang等人发表的平面正交皮肤算法从面部皮肤区域提取rPPG信号[5]。
如果您在自己的研究中使用这些数据,请引用我们的论文:
@inproceedings{schrumpf2021assessment,
title={评估基于深度学习的PPG和rPPG信号血压预测},
author={Schrumpf, Fabian 和 Frenzel, Patrick 等人},
booktitle={IEEE/CVF计算机视觉与模式识别会议论文集},
pages={3820--3830},
year={2021}
}
预训练网络通过留一受试者交叉验证方案进行微调,可以通过使用测试受试者的一部分数据进行个性化。在微调前后,都使用测试受试者的数据评估网络性能。结果被保存到csv文件中以便分析。
用法: retrain_rppg_personalization.py [-h] [--pers PERS] [--randompick RANDOMPICK] ExpName DataFile ResultsDir ModelPath chkptdir
位置参数:
ExpName 由相应日期(格式MM-DD-YYYY)前缀的训练名称
DataFile 包含rPPG信号的hdf文件路径
ResultsDir 存储结果的目录
ModelPath rPPG个性化所用模型文件的路径
chkptdir 存储模型检查点的目录
可选参数:
-h, --help 显示此帮助消息并退出
--pers PERS 若为0,则使用来自测试受试者的数据进行个性化
--randompick RANDOMPICK
若为0,则使用测试受试者数据的前20%,否则随机选择(仅当--pers == 1时适用)
使用预训练模型
trained_models子文件夹包含.h5文件,其中包含模型定义和权重。这些模型使用如[1]所述的非混合数据集进行训练。要将网络用于预测或微调,输入和输出数据需满足以下要求:
- 输入数据必须具有875个样本长度(对应于125Hz采样频率下的7秒)
- 收缩压(SBP)和舒张压(DBP)必须分别提供,因为每个值有一个输出节点
模型可以按如下方式导入:
import tensorflow.keras as ks
from kapre import STFT, Magnitude, MagnitudeToDecibel
dependencies = {
'ReLU': ks.layers.ReLU,
'STFT': STFT,
'Magnitude': Magnitude,
'MagnitudeToDecibel': MagnitudeToDecibel
}
model = ks.load_model(<PathToModelFile>, custom_objects=dependencies)
随后,可以使用model.predict()函数进行预测。
参考文献
[1] Schrumpf, F.; Frenzel, P.; Aust, C.; Osterhoff, G.; Fuchs, M. 基于深度学习的无创血压预测:从PPG和rPPG信号的研究。《传感器》2021, 21, 6022. https://doi.org/10.3390/s21186022
[2] Krizhevsky, A.; Sutskever, I.; Hinton, G. E. 使用深层卷积神经网络的ImageNet分类。《ACM通讯》2017年5月, 60(6), 84-90. doi: 10.1145/3065386.
[3] He, K.; Zhang, X.; Ren, S.; Sun, J. 深度残差学习用于图像识别。在2016 IEEE计算机视觉与模式识别会议(CVPR)中, 美国拉斯维加斯, 2016年6月, 770-778页。doi: 10.1109/CVPR.2016.90.
[4] Slapničar, G.; Mlakar, N.; Luštrek, M. 利用光体积描记图的谱时域深度神经网络进行血压估计。《传感器》2019年8月, 19(15), 3420. doi: 10.3390/s19153420.
[5] Wang, W.; den Brinker, A. C.; Stuijk, S.; de Haan, G. 远程PPG的算法原理。《生物医学工程学报》2017年7月, 64(7), 1479-1491. doi: 10.1109/TBME.2016.2609282.