用深度学习自动生成心肺运动测试

189 阅读5分钟

心肺运动测试(CPET)是评估一个人对不断增加的运动强度的反应能力的重要工具。在一个典型的测试中,将测量以下变量:吸氧量(VO2)、呼出二氧化碳(VCO2)、通气量(VE)、呼吸频率(Rf)、潮气末梢氧(PetO2)和二氧化碳(PetCO2)以及心率(HR)。

测试期间CPET变量的变化模式可用于识别重要的生理标记,如第一和第二运动阈值,尽管正确识别这些断点的过程可能很复杂,并导致专家之间的分歧。

已经开发了许多自动和视觉方法来帮助识别运动阈值,但由于阈值的真实位置未知,这些方法的准确性很难评估。模拟数据可以为这个问题提供一个解决方案,通常涉及使用多线性模型生成CPET变量的连续曲线,然后加入高斯噪声来模拟面罩中的呼吸行为。然而,目前的模拟数据与真实数据并不密切相关。

最近,一种能够产生无限数量的真实但虚假的CPET的生成模型开发出来,为模拟数据的局限性提供了一个潜在的解决方案。在之前的一篇报道中,我谈到了当涉及到自动解释CPET时,深度学习是如何改变游戏的。在这个故事中,我将深入研究使用Python软件包创建虚假但真实的CPET数据的问题 pyoxynet.

为了提供进一步的细节,pyoxynet利用条件生成对抗性神经网络(cGAN)来产生对应于特定标签的合成数据(因此它具有条件性质)。产生的数据与CPET有关(包括VO2、VCO2和前面列出的其他参数),而标签代表参考运动强度范围。在CPET期间,运动阈值定义了不同强度域之间的界限,这意味着仅仅生成任何CPET数据是不够的;相反,你必须生成与自定义运动强度范围相一致的数据。

实践例子

在一个非常快速的例子中,我们要生成一个假的CPET测试。第一步是安装 pyoxynetPython软件包*。*有很多方法可以做到这一点,下面是终端的命令。请注意,pyoxynet需要Python 3.8

pip install pyoxynet

现在,在实际的Python脚本中想要导入复制这个简短练习所需的包。

from pyoxynet import *generator = load_tf_generator()df_gen, dict_gen = generate_CPET(generator)

你得到的打印出来的东西是这样的:

Data generated for a  FEMALE  individual with  MEDIUM  fitness capacity.Weight:  75  kgHeight:  1.87 mAge:  20 yNoise factor:  2.0VT1:  267VT2:  454VO2VT2:  1895VO2VT2:  2634Resting: False

所以你基本上可以读到你刚刚生成的CPET的最重要的特征。该函数 generate_CPET返回一个Pandas数据框和一个字典。数据框中的CPET数据是以一秒为单位插值的(它更适合于将数据保存在csv文件中或用Pandas功能进一步处理数据),而字典中的数据是逐次呼吸的,它更适合于直接从字典中以json格式转储数据。你会注意到,阈值(我们用VT1和VT2来缩写阈值)既是以测试开始后的时间来表示的,也是以VO2(mlO2/min)来表示的。此外,在词典中,你还可以读到其他信息,如:

'Age': '20', 'Height': '1.87', 'Weight': '75', 'Gender': 'FEMALE', 'Aerobic_fitness_level': 'MEDIUM', 'VT1': '267', 'VT2': '454', 'VO2VT1': '1895', 'VO2VT2': '2634', 'VO2max': '3010',...,'data': {...}

其中大部分都是不言自明的,但应着重强调VT1和VT2(测试开始后检测运动阈值的时间值)以及它们与最大耗氧量(VO2max)的关系。请注意,pyoxynet功能允许你定义这些阈值,测试的持续时间,或你试图生成CPET的人的健康水平。

请注意:垃圾进来⇒垃圾出去。因此,如果你要求某人具有不合理的运动阈值,该函数将不会提供任何合理/可用的结果。如果你不确定将阈值放在哪里,但你只是想定义这个人的健康水平,那么你可以直接输入:

df_gen, dict_gen = generate_CPET(generator, fitness_group=1, noise_factor=None)

现在,你可以轻松地绘制数据,并检查它们对你是否有意义。让我们从VCO2与VO2的关系图开始,专家们通常用它来检测VT1(在VCO2与VO2的关系图上应该有一个断点,你能看到吗?)

import matplotlib.pyplot as pltplt.scatter(df_fake.VO2_I, df_fake.VCO2_I)plt.vlines(int(data_dict_fake['VO2VT1']), 500, 3000)plt.vlines(int(data_dict_fake['VO2VT2']), 1000, 4000, linestyles='dashed')plt.xlabel('Time (sec)')plt.ylabel('VO2 (ml/min)')

image.png

竖线是以VO2(摄氧量)为单位放置VT1和VT2的。然后你可以绘制VE vs VO2,这是专家们通常用来检测VT2的方法(在VE vs VO2图中应该有一个断点,划分出VE vs VO2的不成比例的增长,你能看到吗?)

image.png

竖线是用于运动阈值(VT2是虚线)。其他图表,如PetO2 vs VO2和PetCO2 vs VO2可以帮助你识别VT1和VT2。看看它们吧!

祝贺你!你刚刚生成了一个虚假但真实的例子,即对一名20岁的女性进行CPET,她身高1.87米,体重75公斤,
,中等有氧健身水平,VO2max为3010 mlO2/min(40.1 mlO2/min/kg),VT1的VO2为1895 mlO2/min,VT2为2634 mlO2/min。

对伦理的考虑

在分析CPET数据时,深度学习算法可以改变我们的决策方式。然而,这项新的研究发现了以前不知道的放大的伦理问题。在过去,深度学习算法只被提议作为决策工具。但现在,随着cGAN技术的发展,这些算法已经变得活跃和生成--这一发展在自然语言处理领域引起了激烈的辩论。危害的可能性比以往任何时候都大,因为合成数据可能被生成,以歪曲临床生命体征测试的结果或掩盖有缺陷的设备。

这项研究的第一个目标是解决从心肺测试数据中检测和解释生理标志物的分歧问题--这种分歧可能对个人的健康产生严重影响。然而,很明显,这些伦理方面的考虑需要尽早解决。你怎么看?