
我们的目标是为发展中国家提供适当的心脏护理。早期发现这些病症对于有效治疗至关重要。 ![]() 这个项目中使用的东西 硬件组件 SparkFun单引线心率监测仪 - AD8232 心电放大器 × 1 Raspberry Pi 3型号B. 用于可视化 × 1 Nucleo 144 STM32F7 ST STM32L4,STM32F7 Nucleo144 STM32F7 它是STM32F407G-DISC1,但它不在列表中 × 1 Nextion NX8048T070 - 通用7.0“HMI TFT LCD触摸显示器 Itead Nextion NX8048T070 - 通用7.0“HMI TFT LCD触摸显示器 × 1 Arduino Mini USB串行适配器 × 1 问题 根据世界卫生组织的报告,中低收入国家的主要死亡原因与心脏病有关,即使在中高收入国家,也处于前三位。 虽然高收入国家可以获得医疗,控制和治疗,但在发展中国家,这种接入是有限且昂贵的。在这些情况下,如果在疾病的早期阶段没有得到适当的治疗,人们会出现心脏病,这可能是致命的。 该项目的目的是做一个功能和成本效益设备的第一个原型,可以检测不同的心脏病。该设备将允许初步诊断的人。即使是医生也可以提高他们在低收入国家的时间效率,因为每一分钟都很重要。 此外,在中高收入国家,这种装置将有助于人们获得初步诊断并鼓励在一些检测的情况下去看医生,以防止一些可避免的死亡。 我们的方案 为了解决这个问题,我们正在构建一个基于低成本部件的小型便携式设备。该设备将包含具有处理能力的主板(如STM32F407G-DISC1),用于读取ECG信号的电子设备和用于显示分析结果的小屏幕。 目前,真正的ECG设备很重且很昂贵。这些设备设计为高可靠,信号干净。由于我们的设备专为初步诊断而设计,并且数据将通过软件进行分析,因此数据不需要人类所需的所有细节和信号清洁度。降低细节水平和过滤,设备变得轻便,便宜和有用。 由于其低功耗,这将允许容易地递送到远程陆地并且使用电池或甚至可再生能源(太阳能,风能)供电。 它将如何运作 该装置具有一些连接到患者身体的引线。这导致测量与心脏行为相关的身体电压变化。我们收到的信号通过STM32F407G-DISC1的模数转换器进行放大和测量。 然后由具有项目主要处理能力的微控制器处理数据。微控制器将具有先前使用广泛数据集训练的神经网络,其将对心脏信号进行分析和分类,并尝试检测可能的病理。 我们计划对接收的数据加上神经网络的输出进行直观表示,以便通知患者/医生分析结果。 第一个设计 第一个设计可以在下图中找到。第一部分用于获取和放大ECG的信号,以便微控制器可以读取它。一旦数据已经是数字化,微控制器就会将其发送到Raspberry Pi 3,在那里神经网络将提取参数并生成结果。 ![]() rPi将不断地将数据发送到TFT,其中包括ECG的当前测量值和神经网络分类的结果。 理论:心电图 心电图(ECG / EKG)是心脏跳动时产生的电压信号。每个节拍是一系列收缩和放松,需要以特定顺序流过自动收报机肌肉的电信号。这种信号在皮肤上传播,可以测量正确的传感器。它们是根据身体两点之间的电压差来计算的。 这些信号可以在我们身体的几个点之间测量,产生不同的波。在我们的例子中,我们专注于展示更常见的称为QRS模式的模式,前面是P波,后面是Q波。该信号使用3个电极测量,两个靠近肩部,一个靠近髋部。 QRS复合波的形状可用于确定几种病理和心率。健康心脏与病理心脏之间的心电图差异从细微变化到完全不同的信号不等。此外,一些病理症状可能随机出现或在医生没有测量时出现。如果可以实时测量和分析ECG信号,而无需人为干预,则可以更早地诊断出许多病变。 在其他方面,为了完成ECG信号的表征和早期诊断,可以使用许多AI算法。在我们的例子中,为了简单和易于实现,我们选择神经网络分类器。这些网络的输入是参数阵列,并且基于该网络生成输出,即基于参数和学习过程的信号分类。 理论:神经网络 神经网络由分层排列的几个神经元组成。每个层从前一层获得输入并计算下一层使用的输出,直到输出的最后一层是信号的分类。 为了使神经网络工作,我们需要训练它。我们需要一组信号,从中我们知道神经网络的预期输出。例如,如果我们想知道信号是否健康或者是否有AV阻滞,我们需要医生已经分类的两种病例的样本信号。然后我们训练神经网络,直到它知道什么是常规心电图或不健康的心电图。然后我们可以传递真实数据并获得输出。 总而言之,为了使用神经网络,我们需要: 定义网络,即每层有多少输入参数,多少输出,层,神经元...... 使用已知的数据集训练网络。 使用具有列车阶段参数的网络。 这是对神经网络的一个非常简单的解释,对其操作的深入了解以及不同的类型将需要更复杂的介绍,远离该项目的范围。 技术 由于语言的可靠性,代码的核心主要是在ADA中编写,这在处理与患者健康相关的项目时是必不可少的。 实施:神经网络 第一步是在ADA中实现神经网络,这是该项目的核心。寻找相关信息,我们发现使用这种语言的神经网络几乎没有做过。因此,我们发现在ADA中为神经网络开发通用库非常有用,因此可以在其他项目中使用它。该库包含创建神经网络,训练和执行它的必要工具,对网络的训练阶段和生产阶段都很有用。 对于网络的训练,必须有一个具有适当配置的“input.dat”文件,其中包含神经网络的输入以及预期的输出。在代码中,必须在“config.adb”文件中配置必要的参数,例如网络的层数,所需的输入和输出数量,每层的大小或学习速度。作为输出,它生成一个“weights.dat”文件,其中包含为每个神经元生成的权重,这对于在生产阶段执行是必需的。 我们为神经元体和神经元致动器,求和和S形函数提供了一些基本功能。系统已经规划好,因此可以轻松地为网络包含和配置更多功能。 完整的库位于“neural-network-lib”文件夹中。网络培训,作为使用和操作的一个例子,已经在“神经学习”文件夹内的项目中开发出来。神经网络生产模式的示例可以在文件夹“example-run-net”中找到,该文件夹还包括从http://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 这是以20ms的实时延迟完成的 实现:Python 为了在屏幕上显示数据,选择了一个python脚本。该脚本将从串口获取数据,使用scipy过滤它,然后使用matplotlib绘图。 我们正在使用低通滤波器以消除噪声,主要来自主电源(50 Hz波)。我们可以在下面的图像中看到信号和光谱的影响。 ![]() 未经过滤的信号 在上图中,我们可以直接从ADC到绘图仪看到信号。由于不完美的采样时间,频谱的频率在X轴上具有偏移。但是,为了消除高频,我们可以使用一个整数。使用BW为30-40Hz的低通滤波器进行滤波,我们得到一个干净的信号。 ![]() 过滤后的信号 结果 结果很有希望,本项目提供了信号捕获,以及实现,训练和使用神经网络的几种工具。然而,为了完成这个项目,需要一个真正的医生,有真实的信号和适当的反馈。 在这个阶段,我们需要一些已经表征的数据和一些现实生活测试,如果无法访问医院或医疗数据,就无法进行测试。 8 Q7 m1 i2 a1 Y* E( a |
看起来好像很牛逼的样子!!!![]() ![]() ![]() |
已收藏 |