我们的目标是为人类带来适当的心脏护理。及早发现这些病变对于有效治疗至关重要。
背景
根据世界卫生组织的数据,中低收入国家的主要死因与心脏病有关,即使在中高收入国家,也位居前三。
尽管高收入国家可以获得医疗保健、控制和治疗,但在发展中国家,这种获得是有限且昂贵的。在这些情况下,人们会患上心脏病,如果在疾病的早期阶段没有得到适当的治疗,可能会致命。
该项目的目的是制作出能够检测不同心脏疾病的功能性且具有成本效益的设备的第一个原型。该设备将允许人们进行初步诊断。在每一分钟都很重要的低收入国家,即使是医生也可以提高他们的时间效率。
此外,在中高收入国家,该设备将有助于人们获得初步诊断并鼓励在发现某些情况时去看医生,从而避免一些可避免的死亡。
解决方案
为了解决这个问题,我们正在构建一种基于低成本部件的小型便携式设备。该设备将包含一个具有处理能力的主板(如 STM32F407G-DISC1),用于读取 ECG 信号的电子设备和一个显示分析结果的小屏幕。
目前,真正的心电图设备既重又昂贵。这些设备设计为高度可靠且信号清晰。由于我们的设备是为初步诊断而设计的,并且数据将通过软件进行分析,因此数据不需要人体需要的所有细节和信号清洁度。降低细节和过滤级别,该设备变得轻巧、便宜且实用。
由于其低功耗的特性,这将允许很容易地运送到偏远的土地并使用电池甚至可再生能源(太阳能、风能)供电。
如何工作
该设备有一些连接到患者身体的导线。这导致测量与心脏行为相关的体内电压变化。我们收到的这个信号通过 STM32F407G-DISC1 的模数转换器进行放大和测量。
然后数据由具有项目主要处理能力的微控制器处理。微控制器将有一个神经网络,该网络之前使用大量数据集进行训练,将分析和分类心脏信号,并尝试检测可能的病变。
我们计划对接收到的数据加上神经网络的输出进行可视化表示,以便将分析结果告知患者/医生。
第一部分
第一部分旨在获取和放大心电图的信号,以便微控制器可以读取它。一旦数据已经数字化,微控制器会将其发送到 Raspberry Pi 3,神经网络将在其中提取参数并生成结果。
rPi 将不断地将数据发送到 TFT,其中包含 ECG 的当前测量值和神经网络分类的结果。
理论:心电图
心电图 (ECG/EKG) 是我们的心脏在跳动时产生的电压信号。每个节拍都是一系列的收缩和放松,需要电信号以特定的顺序流过肌肉。该信号在皮肤上传播,可以使用正确的传感器进行测量。它们是用身体两点之间的电压差来计算的。
这些信号可以在我们身体的几个点之间测量,产生不同的波。在我们的例子中,我们专注于展示更常见的模式,称为 QRS 模式,前面是 P 波,然后是 Q 波。这个信号是使用 3 个电极测量的,两个在肩膀附近,一个在臀部。
QRS 复合波的形状可用于确定几种病理和心率。心电图中显示的健康心脏和病变心脏之间的差异从细微的变化到完全不同的信号不等。此外,一些病理症状可能会随机出现或在医生未测量时出现。如果可以在没有人为干预的情况下实时测量和分析 ECG 信号,则可以更早地诊断出许多疾病。
在其他方面,可以使用许多 AI 算法来完成心电图信号的表征和早期诊断。在我们的例子中,为了简单和易于实现,我们选择神经网络分类器。这些网络的输入是一组参数,并基于此网络生成输出,即基于参数和学习过程的信号分类。
理论:神经网络
一个神经网络是由多个分层排列的神经元组成的。每一层从上一层获取输入并计算其输出,供下一层使用,直到最后一层输出为信号的分类。
为了让神经网络正常工作,我们需要对其进行训练。我们需要一组信号,从中我们可以知道神经网络的预期输出。例如,如果我们想判断一个信号是健康的还是它有 AV 块,我们需要医生已经分类的两种情况的样本信号。然后我们训练神经网络,直到它知道什么是常规心电图或不健康心电图。然后我们可以传递真实的数据并得到输出。
总而言之,为了使用神经网络,我们需要:
定义网络,即每层有多少输入参数,多少输出,层数,神经元
使用已知数据集训练网络。
使用带有训练阶段参数的网络。
这是对神经网络的一个非常简单的解释,深入了解其操作和不同类型需要更复杂的介绍,这与本项目的范围相去甚远。
技术
由于语言的可靠性,代码的核心主要用 ADA 编写,这在处理与患者健康相关的项目时至关重要。
实现:神经网络
第一步是在 ADA 中实现神经网络,这是该项目的核心。寻找相关信息,我们发现使用这种语言的神经网络做得很少。所以我们发现在 ADA 中为神经网络开发一个通用库非常有用,这样它就可以在其他项目中使用。该库包含创建神经网络、训练和执行它的必要工具,对网络的训练阶段和生产阶段都很有用。
对于网络的训练,需要有一个具有适当配置的“input.dat”文件,其中包含神经网络的输入以及预期的输出。在代码中,必须在“config.adb”文件中配置必要的参数,例如网络的层数、所需的输入和输出的数量、每层的大小或学习速度。作为输出,它生成一个“weights.dat”文件,其中包含为每个神经元生成的权重,这对于在生产阶段执行是必需的。
我们提供了神经元体和神经元执行器的一些基本函数、求和函数和 sigmoid 函数。该系统经过规划,因此可以轻松地为网络包含和配置更多功能。
完整的库位于“neural-network-lib”文件夹中。网络的训练,作为使用和操作的例子,已经在“neural-learning”文件夹内的项目中开发。神经网络的生产模式示例可以在“example-run-net”文件夹中找到,其中还包括快速傅里叶变换的实现,从 https://rosettacode.org/wiki/Fast_Fourier_transform#Ada 获得,我们发现这对于处理神经网络的输入信号非常有用。
STM32
该项目位于“STM32”文件夹中。对于STM32板子,我们不得不对神经网络进行修改,因为代码不兼容,主要是屏幕输出和文件处理。由于这个原因,这个版本的STM32库只适合生产,不适合训练网络,神经元的权重必须通过“.ads”文件引入。
此外,由于返回不受约束的元素和大量使用递归的问题,必须对快速傅里叶变换代码进行修改。
使用开发板的 USART 开发了一个控制台模块,以便能够使用开发板的 PA2 和 PA3 引脚在屏幕上查看结果并将它们发送到 Raspberry Pi 模块。USART 阅读也通过中断发展。它可以在文件“console.adb”中找到。
另一个必要的部分是使用 ADC,获取心跳信息,分析它们并将它们发送到神经网络。为此,板上的 ADC 器件已配置在引脚 PA4 上,分辨率为 12 位,将输入转换为 0V 到 3.3V 之间的值。它在文件“ecgreader.adb”中。
ECG 数据处理的主要部分在文件“ecgprocess.adb”中。一旦接收到 0v 和 3.3V 之间的原始输入,它会对信号执行快速傅里叶变换,然后是模块。从这个结果中,它从信号中提取一些参数,这些参数稍后将用作神经网络的输入。这些参数是:
最大
最低限度
意思是
方差
HaPo(将频谱分成同一区域的两个部分的频率)
程序执行的主要顺序是:
控制台、ADC 和神经网络的初始化。
读取心电图数据
数据处理
神经网络的执行
将神经网络输出和 ECG 数据发送到 Raspberry Pi
这是通过 20 毫秒的实时延迟完成的
实现:Python
为了在屏幕上显示数据,选择了一个 python 脚本。该脚本将从串口获取数据,使用 scipy 对其进行过滤,然后使用 matplotlib 进行绘图。
我们正在应用低通滤波器以消除主要来自主电源(50 Hz 波)的噪声。我们可以在下图中看到信号和频谱的影响。
在上图中,我们可以看到直接从 ADC 到绘图仪的信号。由于不完美的采样时间,频谱的频率在 X 轴上有偏移。但是,为了去除高频,我们可以使用整数。使用 BW 为 30-40Hz 的低通滤波器进行滤波,我们得到一个干净的信号。
结果
结果是有希望的,并且该项目提供了信号捕获以及用于实现、训练和使用神经网络的几个工具。然而,为了完成这个项目,需要一位真正的医生,有真实的信号和适当的反馈。
在这个阶段,我们需要一些已经表征的数据和一些现实生活中的测试,如果没有医院或医疗数据,就不可能进行测试。
评论
查看更多