使用小波分析和深度学习对心电图 (ECG) 进行分类 mcu-ai低成本方案 mcu-ai低成本方案

ecg,mcu,ai · 浏览次数 : 0

小编点评

## Soft-Hardware Implementation of ECG Signal Classification with CWT and CNN This document describes the implementation of ECG signal classification using a pre-trained deep neural network. **Overview:** * The project focuses on using a pre-trained GoogLeNet deep CNN for ECG signal classification. * The network is initialized and trained on PhysioNet databases containing ECG recordings from individuals with different heart conditions (ARR, CHF, NSR). * Data preparation involves loading ECG signals, generating time-frequency representations called scaleograms, and splitting them into training and validation sets. * The pre-trained GoogLeNet is used, and its layers are replaced with appropriate ones for ECG classification. * The network is trained with a focus on optimizing the last layers for the specific classification task. **Steps:** 1. **Data Preparation:** * Load ECG recordings from PhysioNet databases. * Generate time-frequency representations (scaleograms) for each recording. * Split the data into training and validation sets based on their labels. * Prepare the data for training by normalizing the scaleograms and padding the sequences. 2. **Model Loading:** * Load the pre-trained GoogLeNet model. * Replace the original layers with corresponding ones for ECG classification. 3. **Model Training:** * Train the network using a gradient-based optimizer. * Use a validation set to monitor the training process and prevent overfitting. * Adjust the learning rate and other optimization parameters for optimal performance. 4. **Model Evaluation:** * Evaluate the trained model on the validation set to determine its accuracy. * Print the accuracy to the console. 5. **Model Summary:** * Summarize the training process, including the chosen model, optimization parameters, and evaluation results. **Key Points:** * The project utilizes a pre-trained GoogLeNet model for efficient and effective ECG classification. * The network is customized for the specific problem by replacing original layers with appropriate ones. * The training focuses on optimizing the last layers for optimized performance on the ECG data. * The evaluation process ensures the model's accuracy andgeneralizability. **Additional Notes:** * The specific details of the model architecture and training settings may vary depending on the implementation. * This is a high-level overview, and the actual implementation would require detailed code and specific libraries.

正文

具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能
此示例说明如何使用连续小波变换 (CWT) 和深度卷积神经网络 (CNN) 对人体心电图 (ECG) 信号进行分类。

从头开始训练深度 CNN 的计算成本很高,并且需要大量的训练数据。在很多应用中,并没有足够数量的训练数据可用,并且人工新建符合实际情况的训练数据也不可行。在这些情况下,利用已基于大型数据集训练的现有神经网络来完成概念相似的任务是可取的。这种对现有神经网络的利用称为迁移学习。在本示例中,采用预训练深度神经网络GoogLeNet(GoogLeNet针对图像识别进行过预训练).

GoogLeNet 是深度 CNN,最初是用于将图像分类至 1000 个类别。我们可重用 CNN 的网络架构,以基于时间序列数据的 CWT 图像对 ECG 信号进行分类。本示例中使用的数据可从 PhysioNet 公开获取。

在本示例中,使用从三组人获得的 ECG 数据:心律失常者 (ARR)、充血性心力衰竭者 (CHF) 和正常窦性心律者 (NSR)。总共使用来自三个 PhysioNet 数据库的 162 份 ECG 录音:MIT-BIH Arrhythmia 数据库 [3][7]、MIT-BIH Normal Sinus Rhythm 数据库 [3] 和 BIDMC Congestive Heart Failure 数据库 [1][3]。更具体地说,使用了心律失常者的 96 份录音、充血性心力衰竭者的 30 份录音和正常窦性心率者的 36 份录音。目标是训练一个分类器来区分 ARR、CHF 和 NSR。实例为MATLAB语言。

从 GitHub® 仓库下载数据,将文件解压缩到临时目录中。

unzip(fullfile(tempdir,"physionet_ECG_data-main.zip"),tempdir)
解压缩会在您的临时目录中创建文件夹 physionet-ECG_data-main。此文件夹包含文本文件README.md和ECGData.zip。ECGData.zip文件包含ECGData.mat Modified_physionet_data.txt License.txt

ECGData.mat保存本示例中使用的数据,文本文件Modified_physionet_data.txt提供数据的来源说明以及对应用于每份 ECG 录音的预处理步骤的说明。解压缩 physionet-ECG_data-main 中的 ECGData.zip。将数据文件加载到您的 MATLAB 工作区中。

unzip(fullfile(tempdir,"physionet_ECG_data-main","ECGData.zip"), ...

fullfile(tempdir,"physionet_ECG_data-main"))
load(fullfile(tempdir,"physionet_ECG_data-main","ECGData.mat"))

ECGData 是包含两个字段的结构体数组:Data 和 Labels,标签分别为:'ARR'、'CHF' 和 'NSR'。

绘制每个 ECG 类别的表示图。

在创建文件夹后,创建 ECG 信号的时频表示。这些表示称为尺度图。尺度图是信号的 CWT 系数的绝对值。要创建尺度图,请预先计算一个 CWT 滤波器组。当要使用相同的参数获取众多信号的 CWT 时,建议预先计算 CWT 滤波器组。我们先尝试生成一个尺度图。使用 cwtfilterbank (Wavelet Toolbox) 为具有 1000 个采样的信号创建一个 CWT 滤波器组。使用滤波器组获取信号的前 1000 个采样的 CWT,并基于系数获得尺度图。

Fs = 128;

fb = cwtfilterbank(SignalLength=1000, ...

SamplingFrequency=Fs, ...

VoicesPerOctave=12);
sig = ECGData.Data(1,1:1000);

[cfs,frq] = wt(fb,sig);

t = (0:999)/Fs;

figure

pcolor(t,frq,abs(cfs))

set(gca,"yscale","log")

shading interp

axis tight

title("Scalogram")

xlabel("Time (s)")

ylabel("Frequency (Hz)")

将尺度图转化为 RGB 图像,并将其写入 dataDir 中的适当子目录。每个 RGB 图像是大小为 224×224×3 的数组。

将图像随机分成两组,一组用于训练,另一组用于验证。使用 80% 的图像进行训练,其余的用于验证。

加载预训练的 GoogLeNet 神经网络,绘制结构图。

net = googlenet;
lgraph = layerGraph(net);
numberOfLayers = numel(lgraph.Layers);
figure("Units","normalized","Position",[0.1 0.1 0.8 0.8])
plot(lgraph)
title("GoogLeNet Layer Graph: "+num2str(numberOfLayers)+" Layers")

网络架构中的每层都可以视为一个滤波器。较浅的层识别图像的更常见特征,如斑点、边缘和颜色。后续层侧重于更具体的特征,以便区分类别。GoogLeNet 经训练可将图像分类至 1000 个目标类别。对于我们的 ECG 分类问题,必须重新训练 GoogLeNet。

检查网络的最后五层。

lgraph.Layers(end-4:end)

ans =

5×1 Layer array with layers:

1 'pool5-7x7_s1' 2-D Global Average Pooling 2-D global average pooling

2 'pool5-drop_7x7_s1' Dropout 40% dropout

3 'loss3-classifier' Fully Connected 1000 fully connected layer

4 'prob' Softmax softmax

5 'output' Classification Output crossentropyex with 'tench' and 999 other classes
为防止过拟合,使用了丢弃层。丢弃层以给定的概率将输入元素随机设置为零。默认概率为 0.5。将网络中的最终丢弃层 pool5-drop_7x7_s1 替换为概率为 0.6 的丢弃层。

newDropoutLayer = dropoutLayer(0.6,"Name","new_Dropout");
lgraph = replaceLayer(lgraph,"pool5-drop_7x7_s1",newDropoutLayer);

网络的卷积层会提取最后一个可学习层和最终分类层用来对输入图像进行分类的图像特征。GoogLeNet 中的 loss3-classifier
和 output 这两个层包含有关如何将网络提取的特征合并为类概率、损失值和预测标签的信息。要重新训练 GoogLeNet 以对 RGB 图像
进行分类,请将这两个层替换为适合数据的新层。将全连接层 loss3-classifier 替换为新的全连接层,其中滤波器的数量等于类的
数量。要使新层中的学习速度快于迁移的层,请增大全连接层的学习率因子。

numClasses = numel(categories(imgsTrain.Labels));
newConnectedLayer = fullyConnectedLayer(numClasses,"Name","new_fc", ...
"WeightLearnRateFactor",5,"BiasLearnRateFactor",5);
lgraph = replaceLayer(lgraph,"loss3-classifier",newConnectedLayer);

分类层指定网络的输出类。将分类层替换为没有类标签的新分类层。trainNetwork 会在训练时自动设置层的输出类。

newClassLayer = classificationLayer("Name","new_classoutput");
lgraph = replaceLayer(lgraph,"output",newClassLayer);

训练神经网络是一个使损失函数最小的迭代过程。要使损失函数最小,使用梯度下降算法。在每次迭代中,会评估损失函数的梯度
并更新下降算法权重。

options = trainingOptions("sgdm", ...
MiniBatchSize=15, ...
MaxEpochs=20, ...
InitialLearnRate=1e-4, ...
ValidationData=imgsValidation, ...
ValidationFrequency=10, ...
Verbose=1, ...
Plots="training-progress");

使用验证数据评估网络。

[YPred,~] = classify(trainedGN,imgsValidation);
accuracy = mean(YPred==imgsValidation.Labels);
disp("GoogLeNet Accuracy: "+num2str(100*accuracy)+"%")

GoogLeNet Accuracy: 93.75%

与使用小波分析和深度学习对心电图 (ECG) 进行分类 mcu-ai低成本方案 mcu-ai低成本方案相似的内容:

使用小波分析和深度学习对心电图 (ECG) 进行分类 mcu-ai低成本方案 mcu-ai低成本方案

具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 此示例说明如何使用连续小波变换 (CWT) 和深度卷积神经网络 (CNN) 对人体心电图 (ECG) 信号进行分类。 从头开始训练深度 CNN 的计算成本很高,并且需要大量的训练数据。在很多应用中

ChatGPT与码农的机会

之前一篇博客已经写了有关AI在博客编写方面的优势与对未来博客的编写方面的思考。这篇文档我继续分享我在开发中的一个案例和相关的感想。 事件还原 我发现ChatGPT也可以帮助我编写OData,于是我也利用GPT帮助我编程。 OData如何将filter与apply字段联合使用?答案如下: GET /o

魔改editormd组件,优化ToC渲染效果

前言 我的StarBlog博客目前使用 editor.md 组件在前端渲染markdown文章,但这个组件自动生成的ToC(内容目录)不是很美观,我之前魔改过一个树形组件 BootStrap-TreeView,所以就想要用这个树形组件来展示ToC。 原本的效果是这样的 我魔改完的效果 先分析一波 首

外键拆分手记

我习惯性使用OData,它的$expand与层级查询非常好用,这个功能非常依赖于数据库的导航属性,也就是外键结构。最近想着把一个单体的系统拆分为多个小系统,首先需要处理外键依赖的问题。 多个服务各自有各自的数据库,数据库层面并不互通,也就无法使用外键约束。 我使用EF Core来描述数据库的结构,有

武装你的WEBAPI-OData聚合查询

本文属于OData系列 Introduction ODATA v4提出了新的聚合查询功能,这对于ODATA的基本查询能力($expand等)是一个非常大的补充。ODATA支持的聚合查询功能,可以对数据进行统计分析,例如求和、平均值、最大/最小值、分组等。 聚合查询是通过$apply关键字实现的。使用

使用策略模式优化你的代码

策略模式简介 策略模式(Strategy Pattern:Define a family of algorithms,encapsulate each one,and make them interchangeable.)中文解释为:定义一组算法,然后将这些算法封装起来,以便它们之间可以互换,属于一

Java中Comparable与Comparator的区别

Java 中的 Comparable 和 Comparator 都是比较有用的集合排序接口,但是这俩接口使用却有着明显区别,具体使用哪一个接口,今天我们来一起了解下。 Comparable 接口 Comparable 是一个排序接口,位于 java.lang 包下面,实现该接口的类就可以进行自然排序

Podman与docker兼容性问题

使用Podman最好的地方就是支持rootless,也就是说用户不需要为root权限即可进行容器的管理操作。因此现在在CentOS 8及以后的版本中,默认使用Podman替代Docker,如果使用docker命令,会重定向到podman。 rootless很好,但是也带来了一些问题: 多余的提示 运

Postgresql使用触发器实现同步插入两张表

在有一个陈旧的系统的情况下,如果升级API可以优先使用微服务的形式,将数据库进行独立拆分,将原来的数据库原原本本地固定在旧系统中,然后在独立的微服务中运行与部署新系统。 如果原有的数据需要在更换结构的前提下在不同的版本的系统下进行共享,那可以使用数据库的卷影复制等功能。如果两个数据表的结构不完全一样

迁移现有用户数据到ABP vNext

## 前言 使用 ABP vNext(下文简称 ABP)时,通常都是从 cli 开始新建模板,从一个空项目开始。对已经存续的项目来说,现有的数据,特别是用户等核心数据需要进行迁移。 老的项目,随着规模越来越大,每次修改都需要更改非常多地方,最重要的是,共用数据库使得维护起来需要小心翼翼。为了后续维护