diff --git a/README.md b/README.md index 1cd01c4..8fedcbc 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,9 @@ -# ECG_by_Diffenert_CNN_Test(本科毕业设计:基于 CNN 的心电异常分类算法的设计与实现) +# ECG_by_Diffenert_CNN_Test(本科毕业设计:基于 CNN 的心电异常分类算法的设计与实现) Created by: 魏遇卿 Created on: 2023.3.18 -# 毕业设计的内容和意义 - -## **毕业设计的内容** +# 1 毕业设计的内容和意义 +## **1.1 毕业设计的内容** 本课题将以python语言、MATLAB语言为基础,使用CNN(卷积神经网络)技术,针对MIT-BIT ECG(麻省理工学院关于心律失常的数据库)数据集进行模型训练,进而探求在不同的卷积层和池化层数加持下,卷积神经网络可能的具体表现如何,从而为日后的更深层次的研究建立相对应的基础。 @@ -12,33 +11,33 @@ Created on: 2023.3.18 在第一部分中,在MATLAB中对数据集进行降噪、去基线漂移操作后识别各波段。在第二部分中,在python环境下使用CNN工具针对数据集进行模型训练,统计模型检验结果,以此检验模型性能。 -## **毕业设计的意义** +## **1.2 毕业设计的意义** 健康问题向来不容小觑,伴随着疫情发展,我国国策也走向开放共存。在身边的老年人群体中,个体因为新冠去世、感染老年病的个例层出不穷,已经发展为普遍现象。在这种情况下,老年人的心态发生了较大转变,表现出的忧郁、焦虑等心理的对外表现、器官衰竭等导致的行为不畅或部分功能缺失,会像一座大山压在子女身心。针对心脏问题上,心脏的问题具有强实时性,部分问题在不犯病时无法及时检测出以预防,而在这方面上,专业设备的价格和专业性限制了使用环境。开发可穿戴式、适用于居家的专业仪器是一个新的发展方向,国际公司诸如苹果、华为等已经发布了具备ECG功能的智能穿戴设备,通过获取单导联心电图实现简易心脏类症状的识别,但受限于导联数与穿戴设备稳定性,能够识别的症状不多且无法提供诊断上的辅助。 本课题脱胎于以上实际问题,在专业领域中,技术层出不穷,CNN只是最基本、最简单的技术之一。一方面,本课题可探究CNN在ECG这种多导联、互相之间具备强相关性的数据上进行识别分类的大致性能,另一方面本课题更大的意义在于为研究者提供日后深入研究的原始技术积累,并了解算法开发的大致步骤。针对MIT-BIT这一ECG数据集的数据处理过程也有助于理解不同的数据集以及数据集的本质。 -# 文献综述 +# 2 文献综述 -## 研究背景 +## 2.1 研究背景 伴随着本次全球化的健康危机,即使是我国,死亡人数相较往年也有较大增长,这一结论来自于实际生活,具备真实性。随着毒株毒性下降,社会逐渐恢复开放的问题在前文已经提及。老年人的健康因此普遍面临着新一轮的挑战。而据《中国心血管健康与疾病报告2021》的数据研究表明,中国心血管疾病患者数逐年增长,且暂时无法到达下降转折点[1],且呈现出由中老年向年轻人扩散的趋势。文中亦指出,中国心血管病死亡占城乡居民总死亡原因的首位,农村为 46. 74%,城市为 44. 26%。目前,血压仪已经在中老年人家庭中基本普及,而ECG类仪器则因为需要专业能力以读图,故而在各式各样的家庭构成中普及率普遍并不高。而各式各样的智能穿戴设备都是单导联ECG,有论文指出其在严格受控条件下,成图与专业ECG机器对应导联的成图具备相同的可靠性[2]。但由于其导联数过于单一,且使用受使用环境影响过大致使实际使用时噪声过多,于业内其最终成图并不被做临床诊断使用,只能作为日常参考使用。 而随着计算机科学与人工智能领域的发展,各种各样的交叉学科逐渐出现,人工智能\*医学在国内外也开始有越来越多的学者涉足。通过数字图像处理相关技术,结合CNN,Res-Net等神经网络,针对ECG进行模型训练,通过模型判断进而识别不同的症状提供给医护,从而提高医护诊断的正确率并减轻医护工作量。或直接或间接提高患者存活率。而在机器学习领域,可选择支持向量机(support vector machine,SVM)、贝叶斯分类等算法进行分类[3],但训练模型性能有限,若通过增加集成学习,进行整合,则能够收获更好的性能。这一思路也被应用在通过ECG进行生物识别上[4]。随着深度学习的发展,具备更好的泛化性的深度学习相关算法逐渐被应用在了这一领域,相对于传统机器学习算法,深度学习算法具备更好的泛化性,其训练出的模型也具备更好的性能,但同时,因为其训练机制的特殊性也引发了过拟合问题。针对过拟合问题可通过具体应用环境设置激活函数进行修正。 -## 国内外研究现状 +## 2.2 国内外研究现状 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层和一个输出层构成。该算法灵敏度在各算法中较优,但其特异性达到了最优。 -## 实际应用方面的价值 +## 2.3 实际应用方面的价值 本课题面向ECG诊断问题,聚焦于ECG与基础深度学习算法。通过针对经典ECG数据集MIT-BIT数据集的模型训练,测试CNN在一维数据上的性能。通过调整CNN网络结构,测试不同层数结构下的CNN网络在MIB-BIT数据集上的性能,从而选择出在针对这一问题上所适宜的CNN网络层数。而本课题所验证的算法将作为更深一步研究的基础研究。为针对该问题进行进一步算法结构设计提供原始CNN网络结构支持。同样,由于ECG数据多导联的强时域相关性、保存格式的特殊性,本课题处理数据集时所使用的思想也可作为日后针对其他神经网络对ECG数据处理的参考经验。 -# 相关技术与研发基础 +# 3:相关技术与研发基础 -## 相关技术 +## 3.1 相关技术 在本课题中,将使用matplotlib等python数学计算包通过小波变换针对原始数据集进行处理,基于tensorflow或pytorch平台进行CNN网络搭建。综上,有如下几个部分:小波变换、CNN、tensorflow、pytorch、MATLAB。 @@ -48,14 +47,14 @@ ECG实质上是一种微弱的生物电信号,也因此,其对于噪声的 4. Pytorch是基于torch的开源python机器学习库,也提供了多种语言支持,现行版本为1.13。相较tensorflow具备更好的版本兼容性。本课题将在tensorflow、pytorch中选择一个作为开发环境支持。 5. MATLAB作为首屈一指的数学处理平台,提供了多种语言的支持,python语言上包名为matplotlib。其专业性使得在人工智能领域得到了广泛应用。 -## 研发基础 +## 3.2 研发基础 1. 开发者通过学习,积攒了一定的机器学习、数字图像处理基础理论知识储备。 2. 开发者曾接触过人工智能类项目,对于基础函数、网络设计具备一定的了解与编程能力。 3. 开发者个人PC配置为i7-11800H,RTX3070Laptop,32G DDR4,具备针对本课题的算法运行能力。 4. 开发者可通过浙江图书馆、Google学术等平台,获取到相应的文献以针对本课题进行进一步的知识储备。 -## 主要参考文献 +## 3.3 主要参考文献 [1] 《中国心血管健康与疾病报告2021》要点解读 [J]. 中国心血管杂志, 2022, 27(04): 305-18. @@ -79,36 +78,113 @@ ECG实质上是一种微弱的生物电信号,也因此,其对于噪声的 [11] 周飞燕, 金林鹏, 董军. 卷积神经网络研究综述 [J]. 计算机学报, 2017, 40(6): 1229-51. -# 文件存储体系结构说明 +# 4 代码文件说明 +## 4.1 _main_tensorflow_oneLayerCNN.py -## 文件夹结构说明 +本文件为CNN模型搭建文件,代码部分包括: +### 4.1.1 PATH声明 + + #from ECG_read_weiyuqing_without_wfdb import ECGDATAPATH + #PATH of this test + Project_PATH = "../Number-Of-CNN-Layers/One/" + #PICTUREPATH= Project_PATH + "picture/" + log_dir = Project_PATH + "logs/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S") + model_Path_one = Project_PATH + "model/ecg_model_one_layer.h5" + #model_Path_one = Project_PATH + "ecg_model_one_layer.h5" + +### 4.1.2 CNN参数说明 + + RATIO = 0.3 + RANDOM_SEED = 42 + BATCH_SIZE = 128 + NUM_EPOCHS = 30 +### 4.1.3 CNN模型构建 + def CNN_model_level_one(): + leavlOneModel = tf.keras.models.Sequential([ + #take test for one CNN layers model + + tf.keras.layers.InputLayer(input_shape=(300, 1)), + + # ECG data cant add 0 in edge, will broken data ,take false answer. So we need padding same data in edge. + + # take four 21*1 conv excitation function used RElu + tf.keras.layers.Conv1D(filters=4, kernel_size=21, strides=1, padding='same', activation='relu'), + # take four 3*1 pool,take strids 2. + + tf.keras.layers.MaxPool1D(pool_size=3, strides=2, padding='same'), + + # tf.keras.layers.Conv1D(filters=4, kernel_size=21, strides=1, padding='same', activation='relu'), + # tf.keras.layers.MaxPool1D(pool_size=3, strides=2, padding='same'), + + tf.keras.layers.Flatten(), + tf.keras.layers.Dense(128, activation='relu'), + tf.keras.layers.Dropout(rate=0.2), + tf.keras.layers.Dense(5, activation='softmax') + ]) + return leavlOneModel +### 4.1.4 顶层设计 + def main(): + # get traxin test + X_train, X_test, y_train, y_test = loadData(RATIO, RANDOM_SEED) + + # get model or create model + if os.path.exists(model_Path_one): + print(' get model in h5 file') + model = tf.keras.models.load_model(filepath=model_Path_one) + else: + # create new model(if model unexists) + model = CNN_model_level_one() + model.compile(optimizer='adam', + loss='sparse_categorical_crossentropy', + metrics=['accuracy']) + model.summary() + # TB make + tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, + histogram_freq=1, + ) + # Training and validation + history = model.fit(X_train, y_train, epochs=NUM_EPOCHS, + batch_size=BATCH_SIZE, + validation_data=(X_test, y_test), + callbacks=[tensorboard_callback]) + # validation_split=RATIO, + model.save(filepath=model_Path_one) + plot_history_tf(history) + + y_pred = np.argmax(model.predict(X_test), axis=-1) + plot_heat_map(y_test, y_pred) + + +# 5 文件存储体系结构说明 + +## 5.1 文件夹结构说明 ![img.png](pictureOfReadme%2Fimg.png) -### Number-Of-CNN-Layers +### 5.2 Number-Of-CNN-Layers 表示本文件夹存储信息为:不同CNN模型的层数,并进行相应存储 -#### one:表示本文件夹存储的为一层CNN网络(包含一个卷积层和一个池化层、一个全连接层) +#### 5.2.1 one:表示本文件夹存储的为一层CNN网络(包含一个卷积层和一个池化层、一个全连接层) -##### logs:对应的训练日志文件夹,存储训练日志 +##### 5.2.2 logs:对应的训练日志文件夹,存储训练日志 -##### model:对应的CNN模型文件夹,存储CNN模型 +##### 5.2.3 model:对应的CNN模型文件夹,存储CNN模型 -##### picture:图片文件夹,存储生成的图片 -模型精度曲线(accuracy.png) +##### 5.2.4 picture:图片文件夹,存储生成的图片 +5.2.4.1 模型精度曲线(accuracy.png) ![accuracy.png](Number-Of-CNN-Layers%2FOne%2Fpicture%2Faccuracy.png) -模型损失函数曲线(loss.png) +5.2.4.2 模型损失函数曲线(loss.png) ![loss.png](Number-Of-CNN-Layers%2FOne%2Fpicture%2Floss.png) -模型最终分类效果矩阵(confusion_matrix.png) +5.2.4.3 模型最终分类效果矩阵(confusion_matrix.png) ![confusion_matrix.png](Number-Of-CNN-Layers%2FOne%2Fpicture%2Fconfusion_matrix.png) -### Number-Of-Conv: 设置卷积层的不同卷积核 +### 5.3 Number-Of-Conv -内部文件夹结构同上 +设置卷积层的不同卷积核进行测试,内部文件夹结构同上。 -### Number-Of-Pool: 设置池化层的不同大小池化核 +### 5.4 Number-Of-Pool: 设置池化层的不同大小池化核 -内部文件夹结构同上 \ No newline at end of file +设置池化层的不同大小池化核进行测试,内部文件夹结构同上。 \ No newline at end of file diff --git a/some-test/pycharm_test.py b/some-test/pycharm_test.py new file mode 100644 index 0000000..e69de29 diff --git a/some-test/pynvml_test.py b/some-test/pynvml_test.py index 770915d..24d33c0 100644 --- a/some-test/pynvml_test.py +++ b/some-test/pynvml_test.py @@ -32,4 +32,6 @@ print(gpu_Used / NUM_EXPAND) # 可以通过这个获取显存的使用情况 -pynvml.nvmlShutdown() \ No newline at end of file +pynvml.nvmlShutdown() + +#get ecg data \ No newline at end of file