From 815bd40d40f711d29f29550d03dde11f351f5a2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AD=8F=E9=81=87=E5=8D=BF?= <358614401@qq.com> Date: Sat, 18 Mar 2023 15:35:28 +0800 Subject: [PATCH] add README.md --- .vscode/settings.json | 3 ++ README.md | 116 +++++++++++++++++++++++++++++++++++++++- pictureOfReadme/img.png | Bin 0 -> 9175 bytes 3 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 pictureOfReadme/img.png diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..51f8bd6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "maven.terminal.useJavaHome": false +} \ No newline at end of file diff --git a/README.md b/README.md index e3b5bda..1cd01c4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,114 @@ -# ECG_by_Diffenert_CNN_Test -毕业设计 +# ECG_by_Diffenert_CNN_Test(本科毕业设计:基于 CNN 的心电异常分类算法的设计与实现) +Created by: 魏遇卿 + +Created on: 2023.3.18 +# 毕业设计的内容和意义 + +## **毕业设计的内容** + +本课题将以python语言、MATLAB语言为基础,使用CNN(卷积神经网络)技术,针对MIT-BIT ECG(麻省理工学院关于心律失常的数据库)数据集进行模型训练,进而探求在不同的卷积层和池化层数加持下,卷积神经网络可能的具体表现如何,从而为日后的更深层次的研究建立相对应的基础。 + +本课题主要分为两个部分,第一部分ECG数据集预处理与第二部分CNN搭建、训练、验证。 + +在第一部分中,在MATLAB中对数据集进行降噪、去基线漂移操作后识别各波段。在第二部分中,在python环境下使用CNN工具针对数据集进行模型训练,统计模型检验结果,以此检验模型性能。 + +## **毕业设计的意义** + +健康问题向来不容小觑,伴随着疫情发展,我国国策也走向开放共存。在身边的老年人群体中,个体因为新冠去世、感染老年病的个例层出不穷,已经发展为普遍现象。在这种情况下,老年人的心态发生了较大转变,表现出的忧郁、焦虑等心理的对外表现、器官衰竭等导致的行为不畅或部分功能缺失,会像一座大山压在子女身心。针对心脏问题上,心脏的问题具有强实时性,部分问题在不犯病时无法及时检测出以预防,而在这方面上,专业设备的价格和专业性限制了使用环境。开发可穿戴式、适用于居家的专业仪器是一个新的发展方向,国际公司诸如苹果、华为等已经发布了具备ECG功能的智能穿戴设备,通过获取单导联心电图实现简易心脏类症状的识别,但受限于导联数与穿戴设备稳定性,能够识别的症状不多且无法提供诊断上的辅助。 + +本课题脱胎于以上实际问题,在专业领域中,技术层出不穷,CNN只是最基本、最简单的技术之一。一方面,本课题可探究CNN在ECG这种多导联、互相之间具备强相关性的数据上进行识别分类的大致性能,另一方面本课题更大的意义在于为研究者提供日后深入研究的原始技术积累,并了解算法开发的大致步骤。针对MIT-BIT这一ECG数据集的数据处理过程也有助于理解不同的数据集以及数据集的本质。 + +# 文献综述 + +## 研究背景 + +伴随着本次全球化的健康危机,即使是我国,死亡人数相较往年也有较大增长,这一结论来自于实际生活,具备真实性。随着毒株毒性下降,社会逐渐恢复开放的问题在前文已经提及。老年人的健康因此普遍面临着新一轮的挑战。而据《中国心血管健康与疾病报告2021》的数据研究表明,中国心血管疾病患者数逐年增长,且暂时无法到达下降转折点[1],且呈现出由中老年向年轻人扩散的趋势。文中亦指出,中国心血管病死亡占城乡居民总死亡原因的首位,农村为 46. 74%,城市为 44. 26%。目前,血压仪已经在中老年人家庭中基本普及,而ECG类仪器则因为需要专业能力以读图,故而在各式各样的家庭构成中普及率普遍并不高。而各式各样的智能穿戴设备都是单导联ECG,有论文指出其在严格受控条件下,成图与专业ECG机器对应导联的成图具备相同的可靠性[2]。但由于其导联数过于单一,且使用受使用环境影响过大致使实际使用时噪声过多,于业内其最终成图并不被做临床诊断使用,只能作为日常参考使用。 + +而随着计算机科学与人工智能领域的发展,各种各样的交叉学科逐渐出现,人工智能\*医学在国内外也开始有越来越多的学者涉足。通过数字图像处理相关技术,结合CNN,Res-Net等神经网络,针对ECG进行模型训练,通过模型判断进而识别不同的症状提供给医护,从而提高医护诊断的正确率并减轻医护工作量。或直接或间接提高患者存活率。而在机器学习领域,可选择支持向量机(support vector machine,SVM)、贝叶斯分类等算法进行分类[3],但训练模型性能有限,若通过增加集成学习,进行整合,则能够收获更好的性能。这一思路也被应用在通过ECG进行生物识别上[4]。随着深度学习的发展,具备更好的泛化性的深度学习相关算法逐渐被应用在了这一领域,相对于传统机器学习算法,深度学习算法具备更好的泛化性,其训练出的模型也具备更好的性能,但同时,因为其训练机制的特殊性也引发了过拟合问题。针对过拟合问题可通过具体应用环境设置激活函数进行修正。 + +## 国内外研究现状 + +ECG实质上是一种微弱的生物电信号,也因此,其对于噪声的表现会更加明显,ECG的主要干扰为以下三种:频率小于5Hz的基线漂移;频率固定为50Hz的工频干扰;频率范围较广的肌电干扰。在ECG的降噪方面,有通过小波变换进行降噪、心拍识别的处理方式[5]。这一方式也相较更为成熟。 + +在ECG识别上,李伟康等通过附加SE模块[6]的1D CNN、SE-CNN、CNN-GRU进行综合集成学习,进一步提升了ECG分类的准确率至99.12%[7]。也有学者利用深度学习,通过SSWPT算法、RDBR算法、MMD算法提取PPG信号中的心脏、呼吸信号并与ECG信号进行时域同步处理,将ECG与PPG(光电容积脉搏波描记法photoplethysmonraph)结合[8],于血压检测精度问题上取得了一定进展。有学者提出了CNN-FWS算法,将CNN与基于特征权重的递归特征消除算法(FW-RFE)进行结合[9]。作为较新的人工智能技术,RNN(递归神经网络)中的长短期记忆网络(Long short-term memory,LSTM)算法也在被引用进该类问题。Petmezas, Georgios等人使用CNN与LSTM结合,提出了CNN-LSTM算法[10],该算法CNN部分使用池化层选用了最大池化算法,以CNN的输出作为LSTM的输入。LSTM部分由一层LSTM层、一层扁平层、一个全连接层、一个dropout层和一个输出层构成。该算法灵敏度在各算法中较优,但其特异性达到了最优。 + +## 实际应用方面的价值 + +本课题面向ECG诊断问题,聚焦于ECG与基础深度学习算法。通过针对经典ECG数据集MIT-BIT数据集的模型训练,测试CNN在一维数据上的性能。通过调整CNN网络结构,测试不同层数结构下的CNN网络在MIB-BIT数据集上的性能,从而选择出在针对这一问题上所适宜的CNN网络层数。而本课题所验证的算法将作为更深一步研究的基础研究。为针对该问题进行进一步算法结构设计提供原始CNN网络结构支持。同样,由于ECG数据多导联的强时域相关性、保存格式的特殊性,本课题处理数据集时所使用的思想也可作为日后针对其他神经网络对ECG数据处理的参考经验。 + +# 相关技术与研发基础 + +## 相关技术 + +在本课题中,将使用matplotlib等python数学计算包通过小波变换针对原始数据集进行处理,基于tensorflow或pytorch平台进行CNN网络搭建。综上,有如下几个部分:小波变换、CNN、tensorflow、pytorch、MATLAB。 + +1. 小波变换是一种基于小波的变换分析方法,由于小波的时域性,相较傅里叶变换,小波变换具备更好的时域分析能力,同时,其窗口大小更为灵活,可提供随频率变换的“时间-频率”窗口。由于其在信号时域分析处理上的优势,小波变换很适合在ECG分析中作为降噪、信号提取的工具[5]。 +2. CNN,卷积神经网络,作为深度学习代表算法之一,主要结构为卷积层、池化层、全连接层三层结构[11]。于卷积层通过卷积核进行特征提取,随后传入池化层,经由池化函数进行特征选择、信息过滤等操作,最后传入全连接层向后传递进行后续操作。CNN具有过拟合问题,需要通过添加激励函数解决,常用激励函数有ReLU、sigmoid函数等。激励函数通常加在卷积层与池化层之间,也有算法如LeNet-5将激励函数添加在了池化层之后。 +3. Tensorflow是由Google Brain开发,提供了多种语言支持的开源机器学习平台,封装了大量机器学习通用功能。因此可通过tensorflow构建各式各样的人工智能算法,现行版本为tensorflow 2 。tensorflow 1与tensorflow 2的兼容性并不乐观。 +4. Pytorch是基于torch的开源python机器学习库,也提供了多种语言支持,现行版本为1.13。相较tensorflow具备更好的版本兼容性。本课题将在tensorflow、pytorch中选择一个作为开发环境支持。 +5. MATLAB作为首屈一指的数学处理平台,提供了多种语言的支持,python语言上包名为matplotlib。其专业性使得在人工智能领域得到了广泛应用。 + +## 研发基础 + +1. 开发者通过学习,积攒了一定的机器学习、数字图像处理基础理论知识储备。 +2. 开发者曾接触过人工智能类项目,对于基础函数、网络设计具备一定的了解与编程能力。 +3. 开发者个人PC配置为i7-11800H,RTX3070Laptop,32G DDR4,具备针对本课题的算法运行能力。 +4. 开发者可通过浙江图书馆、Google学术等平台,获取到相应的文献以针对本课题进行进一步的知识储备。 + +## 主要参考文献 + +[1] 《中国心血管健康与疾病报告2021》要点解读 [J]. 中国心血管杂志, 2022, 27(04): 305-18. + +[2] SAMOL A, BISCHOF K, LUANI B, et al. Single-Lead ECG Recordings Including Einthoven and Wilson Leads by a Smartwatch: A New Era of Patient Directed Early ECG Differential Diagnosis of Cardiac Diseases? [J]. Sensors, 2019, 19(20): 4377. + +[3] 张宁宁, 马金刚, 樊昭磊, et al. 基于机器学习的心电自动诊断算法综述 [J]. 医疗卫生装备, 2022, 43(05): 92-7. + +[4] 刘奇. 基于集成学习算法的ECG身份识别 [D]; 吉林大学, 2019. + +[5] 欧阳波. 基于小波分析的ECG信号处理技术研究 [D]; 湖南大学, 2014. + +[6] LOGESH R, SUBRAMANIYASWAMY V, MALATHI D, et al. Enhancing recommendation stability of collaborative filtering recommender system through bio-inspired clustering ensemble method [J]. Neural Computing and Applications, 2020, 32(7): 2141-64. + +[7] 李伟康. 基于混合深度学习算法的ECG心电信号分类研究 [D]; 江苏科技大学, 2022. + +[8] 胡军锋, 郑彬. 基于深度学习的ECG/PPG血压测量方法 [J]. 生物医学工程研究, 2022, 41(1): 46-54. + +[9] ZHU J, LV J, KONG D. CNN-FWS: A Model for the Diagnosis of Normal and Abnormal ECG with Feature Adaptive [J]. Entropy, 2022, 24(4): 471-. + +[10] PETMEZAS G, HARIS K, STEFANOPOULOS L, et al. Automated Atrial Fibrillation Detection using a Hybrid CNN-LSTM Network on Imbalanced ECG Datasets [J]. Biomedical Signal Processing and Control, 2021, 63: 102194. + +[11] 周飞燕, 金林鹏, 董军. 卷积神经网络研究综述 [J]. 计算机学报, 2017, 40(6): 1229-51. + +# 文件存储体系结构说明 + +## 文件夹结构说明 +![img.png](pictureOfReadme%2Fimg.png) +### Number-Of-CNN-Layers +表示本文件夹存储信息为:不同CNN模型的层数,并进行相应存储 + +#### one:表示本文件夹存储的为一层CNN网络(包含一个卷积层和一个池化层、一个全连接层) + +##### logs:对应的训练日志文件夹,存储训练日志 + +##### model:对应的CNN模型文件夹,存储CNN模型 + +##### picture:图片文件夹,存储生成的图片 +模型精度曲线(accuracy.png) + +![accuracy.png](Number-Of-CNN-Layers%2FOne%2Fpicture%2Faccuracy.png) + +模型损失函数曲线(loss.png) + +![loss.png](Number-Of-CNN-Layers%2FOne%2Fpicture%2Floss.png) + +模型最终分类效果矩阵(confusion_matrix.png) + +![confusion_matrix.png](Number-Of-CNN-Layers%2FOne%2Fpicture%2Fconfusion_matrix.png) + +### Number-Of-Conv: 设置卷积层的不同卷积核 + +内部文件夹结构同上 + +### Number-Of-Pool: 设置池化层的不同大小池化核 + +内部文件夹结构同上 \ No newline at end of file diff --git a/pictureOfReadme/img.png b/pictureOfReadme/img.png new file mode 100644 index 0000000000000000000000000000000000000000..880f015fcc5a43ec32ac1b0bcea017da5e54f2ea GIT binary patch literal 9175 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 LLA*lLFz`PBq)WCn literal 0 HcmV?d00001