基于深度学习和卷积神经网络的乳腺癌影像自动化诊断系统(PyQt5界面+数据集+训练代码)

乳腺癌是全球女性中最常见的恶性肿瘤之一,早期准确诊断对于提高生存率具有至关重要的意义。传统的乳腺癌诊断方法依赖于放射科医生的经验,然而,由于影像分析的复杂性和人类判断的局限性,准确率和一致性仍存在挑战。近年来,卷积神经网络(CNN)等深度学习技术在医学影像分析中的应用取得了显著突破,尤其在乳腺癌影像的自动化诊断领域,展现出了优异的性能。

本文设计并实现了一个基于深度学习和卷积神经网络(CNN)的乳腺癌影像自动化诊断系统。通过采用经典的卷积神经网络模型(如VGG16和ResNet-50),对乳腺癌的影像数据进行训练与分类,自动判别乳腺癌影像中的良性和恶性肿瘤。首先,构建了一个包含大量乳腺癌影像的标注数据集,经过数据预处理和增强处理,提升了模型的训练效果和泛化能力。然后,针对卷积神经网络进行网络结构的优化与超参数的调节,以提高模型的分类精度。

实验结果表明,所设计的系统在乳腺癌影像分类中取得了较高的准确率。VGG16和ResNet-50在训练集和验证集上的表现均优异,尤其在恶性肿瘤的识别上,模型表现出较高的敏感性和准确度。此外,本研究还分析了卷积神经网络在乳腺癌影像诊断中的优势与局限,并讨论了深度学习技术在医疗影像分析中的未来发展方向。

本研究表明,基于卷积神经网络的深度学习方法在乳腺癌影像自动化诊断中具有巨大的潜力。通过不断优化网络模型和数据集,深度学习技术有望在乳腺癌的早期筛查和诊断中提供更加高效、准确的支持,为临床医学提供强有力的辅助工具。

算法流程

项目数据

传统的机器学习算法对图像进行识别等研究工作时,只需要很少的图像数据就可以开展工作。而在使用卷积神经网络解决研究的十二生肖识别问题的关键其一在于搭建合适的神经网络,其二更需要具备大量优质的训练数据集,在大量的有标签数据不断反复对模型进行训练下,神经网络才具备我们所需要的分类能力,达到理想的分类效果。因此有一个质量较好的图像数据集至关重要。

数据集介绍:
本研究使用的乳腺癌图像数据集是专门为乳腺癌早期诊断任务设计的,包含了良性(benign)和恶性(malignant)乳腺癌肿瘤的组织切片图像。数据集中的图像是从临床病人样本中获取,经过专业的病理学家标注,确保数据的准确性和可靠性。每一张图像代表了乳腺癌肿瘤的不同病理特征,包括细胞密度、肿瘤大小、形状不规则性等,能够为深度学习模型提供丰富的特征信息。

数据集已被预先标注,每个类别的图像数量基本均衡,为训练和验证提供了稳定的基准。数据集被划分为训练集和测试集,其中每类生肖图像的数量分别如下:
(1)训练集:良性类2222张图像,恶性类486张图像,共7084张图像。

(2)测试集:良性类247张图像,恶性类557张图像,共804张图像。

这种划分方式保证了数据的多样性和代表性,同时通过验证集和测试集的独立性,能够有效评估模型的泛化能力。

数据预处理
为了提高模型的泛化能力并防止过拟合,我们对数据集进行了数据预处理。具体步骤如下:
(1)尺寸标准化:所有图像被调整为统一的224×224像素,以适配VGG16和ResNet50等模型的输入要求。
(2)归一化:对图像进行归一化处理,标准化RGB通道的像素值,使其均值为[0.485, 0.456, 0.406],标准差为[0.229, 0.224, 0.225]。这些参数是基于ImageNet数据集计算得出的,适用于VGG16和ResNet50的预训练模型。

数据增强
1.训练集增强:
(1)随机裁剪:随机裁剪图像并调整为224×224的尺寸,增加数据的多样性,帮助模型更好地学习到不同的尺度和视角。
(2)随机水平翻转:随机对训练图像进行水平翻转,进一步增加数据集的变异性,提高模型的鲁棒性。

2.验证集增强:
(1)Resize和CenterCrop:将验证图像的长边调整为256像素,然后从中心裁剪224×224区域,确保数据统一性。

通过数据增强和标准化处理,能有效提高模型对各种变换的适应能力,从而提升其在不同场景下的分类效果。

数据集划分
数据集已预先划分为两个部分:训练集和测试集,具体如下:
(1)训练集:每类600张图像,共7200张图像,用于模型训练,通过最小化损失函数优化参数。
(2)测试集:每类55张图像,共660张图像,用于评估模型在未见数据上的表现

这种数据集划分方式有助于保证模型训练和评估的可靠性,确保各数据集独立,避免数据泄露和过拟合。

实验硬件
本实验的硬件环境设置如下:
(1)计算平台:NNVIDIA GeForce RTX 3070 Ti。(8GB显存),支持CUDA加速
(2)CPU:12th Gen Intel(R) Core(TM) i9-12900H 2.50 GHz 14核处理器
(3)内存:32GB RAM
(4)存储:1TB SSD,用于存储数据集和模型权重

该硬件环境提供了足够的计算资源,能够支持大规模图像数据的训练和高效计算,尤其在使用GPU进行加速时,训练时间得到了显著缩短。

实验超参数设置
本实验中的主要超参数设置如下:
(1)学习率:0.0001,使用Adam优化器,能够自适应调整学习率,表现较好。
(2)批次大小:训练时为32,验证时为64,较小的批次大小有助于稳定训练并提高计算效率。
(3)优化器:使用Adam优化器,适用于稀疏数据和非凸问题。
(4)损失函数:采用交叉熵损失函数(CrossEntropyLoss),适用于多分类任务。
(5)训练轮数:设定为15轮,帮助模型逐渐收敛。
(6)权重初始化:使用预训练的VGG16和ResNet50权重进行迁移学习,加速收敛并提高分类性能。

这些超参数设置经过反复调试,以确保模型在验证集上表现良好。

实验过程与结果分析

分析VGG16和ResNet50两种模型在乳腺癌分类任务中的实验结果。包括训练过程中的损失与准确率变化、模型性能对比、混淆矩阵(热力图)分析、过拟合与欠拟合的讨论,以及计算效率的分析。

训练过程中的损失与准确率变化
为了评估模型在训练过程中的表现,我们记录了每个epoch的训练损失、训练准确率以及验证损失、验证准确率。通过这些指标,我们可以观察到模型是否能够有效收敛,以及是否存在过拟合或欠拟合的情况。

1.1 VGG16模型训练过程
VGG16模型在训练过程中的损失和准确率曲线如下所示:
 


(1)训练损失:显示出良好的下降趋势,训练损失在后期趋于稳定,说明模型逐渐收敛并且拟合训练数据。
(2)训练准确率:训练准确率持续提高,逐步接近97%,最终表现非常好,表明模型在训练数据上的拟合能力较强。
(3)验证损失与验证准确率:验证损失的波动较小,说明模型的泛化能力很强;验证准确率虽然在第12轮有所下降,但最后恢复至98%左右,说明模型在实际应用中的预测能力非常稳定。

1.2 ResNet50模型训练过程
ResNet50模型在训练过程中的损失和准确率曲线如下所示:
 


(1)训练损失:训练损失在训练过程中呈现快速下降趋势,特别是在初期阶段,随着训练的深入,下降速度逐渐放缓,最终稳定在一个较低的水平(0.05-0.07之间)。
(2)训练准确率:训练准确率从92%快速上升,并在训练后期稳步提高至98%左右,最终保持在该水平,波动幅度非常小。
(3)验证损失与验证准确率:验证损失从0.225迅速下降,并在训练中期稳定在0.075附近,最终保持在0.05-0.07之间。这表明模型在验证集上的预测误差较小且趋于稳定。

从损失和准确率的曲线来看,ResNet50在训练过程中的收敛速度和稳定性都优于VGG16,表明其更适合处理复杂的分类任务。

模型性能对比
1.VGG16与ResNet50的准确率比较
在训练和验证过程中,ResNet50模型表现出了更高的准确率,尤其是在验证集上的表现更为突出。VGG16的最终训练准确率为0.97,验证准确率为0.98,而ResNet50的训练准确率为0.98,验证准确率为0.98。
(1)训练准确率:ResNet50的训练准确率更稳定,并且在处理复杂任务时具有更强的学习能力和稳定性,而VGG16的表现则相对较为波动。
(2)验证准确率:ResNet50在验证准确率上的稳定性和最终表现优于VGG16,其更能有效地避免过拟合,并展现出较强的泛化能力,适合处理复杂的分类任务。

虽然两者在训练集和验证集上的最终准确率都很接近(ResNet50和VGG16的验证准确率都是98%),ResNet50在训练准确率上稍有优势,且其表现更加稳定,特别是在验证集上的波动较小,说明其泛化能力和稳定性更强。

2.损失函数与准确率曲线分析
(1)ResNet50的损失和准确率曲线显示出更加平稳的下降和上升趋势,验证集上的性能波动较小,说明其在训练过程中的学习能力更强且泛化性较好,适合处理复杂的分类任务。
(2)VGG16虽然表现不错,但在训练过程中存在一定的不稳定性,尤其是在后期的几轮训练中,训练和验证准确率出现波动,这可能表明模型对数据的学习过程受到了干扰或局部最优解的影响。

混淆矩阵分析(热力图)
为了更全面地分析模型的分类性能,我们生成了混淆矩阵并将其可视化为热力图,帮助我们直观地了解模型在哪些类别上表现较好,在哪些类别上存在误分类。

1.VGG16的热力图:VGG16表现出色,特别是在恶性肿瘤的诊断中几乎没有错误,并且在良性肿瘤的识别上也非常精准。虽然存在少量误诊,但整体精度非常高,足以在实际医疗应用中发挥重要作用。继续优化模型后,VGG16有潜力达到更高的准确率。

2.ResNet50的热力图:ResNet50在乳腺癌良恶性分类任务中表现优秀,尤其在减少漏诊恶性肿瘤的方面,给出了非常可靠的结果。在实际应用中,只有很小的几率出现错误,模型已经接近临床诊断的要求。

通过混淆矩阵的分析,ResNet50在混淆矩阵中展示了非常高的诊断准确性,能够有效地区分良性和恶性肿瘤,尤其在恶性肿瘤的识别上具有显著优势。

过拟合与欠拟合分析
(1)过拟合:存在轻微的过拟合现象,尤其是在训练过程中出现波动,可能是模型过于依赖训练数据的某些特定特征。欠拟合的风险较小,模型有足够的学习能力来处理任务,但在泛化方面还有提升空间。
(2)欠拟合:表现出较好的平衡,训练和验证准确率都呈现平稳上升的趋势,过拟合和欠拟合的现象较轻。ResNet50在处理复杂任务时通常能够更好地避免过拟合,同时也不容易发生欠拟合。

ResNet50能够有效避免过拟合问题,并在多次训练中保持较高的验证准确率,而VGG16则需要进一步优化,可能通过增加正则化(如Dropout)来缓解过拟合问题。

计算效率分析
(1)ResNet50 在计算效率上表现更优,尤其是在训练速度和每个epoch的训练时间上,适合处理大规模数据集和更快速的训练需求。
(2)VGG16 虽然在准确率和模型表现上有其优势,但其训练速度相对较慢,计算资源消耗较大,可能需要更长时间来完成相同规模的训练任务。

如果计算效率是项目的关键考虑因素,ResNet50 更适合用于大规模训练任务,尤其是在时间有限的情况下。

运行效果

– 运行 MainProgram.py
1.ResNet50模型运行:
(1)主界面

(2)乳腺癌良性

(3)乳腺癌恶性

2.VGG16模型运行:
(1)主界面

(2)乳腺癌良性

(3)乳腺癌恶性

– 运行 train_resnet50.py
这段代码的主要目的是在直接运行该脚本时,加载指定路径下的训练集和测试集,初始化一个 MainProcess 实例并训练模型(ResNet50),设置训练的轮数为 15 轮。

数据集路径设置:
(1)train_dir = r”D:\Dataset\train”:设置训练集数据的路径。
(2)test_dir = r”D:\Dataset\test”:设置测试集数据的路径。

模型路径设置:
(1)model_name0 = r”models/resnet50.pth”:指定训练模型的文件路径,这里是 resnet50.pth 模型的路径,用于加载预训练的 ResNet50 权重或保存训练后的模型。

实例化MainProcess类:
(1)cnn = MainProcess(train_dir, test_dir, model_name0):通过传入训练集路径、测试集路径和模型路径,创建 MainProcess 类的实例 cnn,这个类负责数据加载、模型训练、验证等操作。

调用主函数main进行训练:
(1)cnn.main(epochs=15):调用 cnn 对象的 main 方法,开始训练模型。epochs=15 表示模型训练将进行 15 轮(每轮遍历整个训练集一次)。该方法将包括模型的训练过程、损失计算、验证等步骤

训练日志结果
ResNet50日志结果

这张图展示了使用ResNet50进行模型训练的详细过程和结果。

配置信息:
(1)模型在训练了15轮后,总共耗时19分钟。
(2)本次训练使用了GPU设备,具体是CUDA设备0。

训练过程:
训练过程记录了15个 epoch,每个 epoch 的训练损失和验证准确率都有输出:
(1)训练损失(train_loss)在每个epoch结束时有所下降(从0.234下降到0.059)。
(2)验证准确率(val_accuracy)从0.92提升到0.986,说明模型的性能在不断提高。

训练速度:
训练的速度在3.91it/s到4.26it/s之间,表示每秒钟处理大约4个批次。
(1)每个epoch的训练时间约为53秒到56秒。
(2)每个验证批次的处理时间大约是20秒到30秒。

完成信息:
(1)Process finished with exit code 0:表示整个验证过程顺利完成,没有报错。

总结:
ResNet50模型表现出色,在训练过程中,损失逐步下降且验证准确率持续上升,表明它具有较强的学习能力和较好的泛化能力。训练时间合理,且计算效率较高。尽管在某些轮次(如epoch 9-12)验证准确率有所波动,最终模型能够达到98.6%的验证准确率,显示了其优异的分类性能。

– 运行 train_vgg16.py
这段代码的主要目的是在直接运行该脚本时,加载指定路径下的训练集和测试集,初始化一个 MainProcess 实例并训练模型(VGG16),设置训练的轮数为 15 轮。

数据集路径设置:
(1)train_dir = r”D:\ZodiacDataset\train”:设置训练集数据的路径。
(2)test_dir = r”D:\ZodiacDataset\test”:设置测试集数据的路径。

模型路径设置:
(1)model_name0 = r”models/vgg16.pth”:指定训练模型的文件路径,这里是 vgg16.pth 模型的路径,用于加载预训练的 VGG16 权重或保存训练后的模型。

实例化 MainProcess 类:
(1)cnn = MainProcess(train_dir, test_dir, model_name0):通过传入训练集路径、测试集路径和模型路径,创建 MainProcess 类的实例 cnn,这个类负责数据加载、模型训练、验证等操作。

调用主函数main进行训练:
(1)cnn.main(epochs=15):调用 cnn 对象的 main 方法,开始训练模型。epochs=15 表示模型训练将进行 15 轮(每轮遍历整个训练集一次)。该方法将包括模型的训练过程、损失计算、验证等步骤

训练日志结果
VGG16日志结果

这张图展示了使用VGG16进行模型训练的详细过程和结果。

配置信息:
(1)模型在训练了15轮后,总共耗时28分钟。
(2)本次训练使用了GPU设备,具体是CUDA设备0。

训练过程:
训练过程记录了15个epoch,每个epoch的训练损失和验证准确率都有输出:
(1)训练损失(train_loss)在每个epoch结束时有所下降(从0.342下降到0.081)。
(2)验证准确率(val_accuracy)从0.917提升到0.979,说明模型的性能在不断提高。

训练速度:
训练的速度在2.40it/s到2.63it/s之间,表示每秒钟处理大约2.40到2.63个批次。
(1)每个epoch的训练时间约为1分24秒到1分32秒。
(2)每个验证批次的处理时间大约是21秒到27秒。

完成信息:
(1)Process finished with exit code 0:表示整个验证过程顺利完成,没有报错。

总结:
VGG16模型在15个epoch的训练过程中表现出了稳定的学习曲线,尽管验证准确率没有达到ResNet50的高水平,但模型的训练效果和准确性逐步提高。未来可以考虑通过调整模型结构、优化器或增加正则化(如Dropout)来进一步提升模型性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/926811.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【热门主题】000074 深度学习模型:探索与应用

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…

MacOS使用VSCode编写C++程序如何配置clang编译环境

前言 这段时间在练习写C和Python,用vscode这个开发工具,调试的时候遇到一些麻烦,浪费了很多时间,因此整理了这个文档。将详细的细节描述清楚,避免与我遇到同样问题的人踩坑。 1.开发环境的配置 vscode的开发环境配置…

Scala关于成绩的常规操作

score.txt中的数据: 姓名,语文,数学,英语 张伟,87,92,88 李娜,90,85,95 王强,78,90,82 赵敏,92,8…

【实战】在Koa.js中实现文件上传的接口 (本地存储)

目录 环境准备 使用 koa-body 中间件获取上传的文件 使用 Postman 测试 使用 koa-static 中间件生成图片链接 编写前端页面上传文件 文件上传是一个基本的功能,每个系统几乎都会有,比如上传图片、上传Excel等。那么在Node Koa应用中如何实现一个支持…

使用html语言完成拼多多移动端导航栏的设计-大连东软信息学院计算机科学与技术专业高级网页设计基础课题

目录 前言 一、效果图 二、图标的使用 三、代码的编写 四、运行效果 五、文档编写 前言 1.本文所讲内容来自辽宁大连东软信息学院计算机与技术专业高级网页设计(专升本)课程期中四级项目课题之一,题目要求是自主选择相应的APP移动端&…

从语法、功能、社区和使用场景来比较 Sass 和 LESS

一:可以从语法、功能、社区和使用场景来比较 Sass 和 LESS: 1:语法 原始的 Sass 采用的是缩进而不是大括号,后续的 Sass 版本与 LESS 一样使用与 CSS 类似的语法: address {.fa.fa-mobile-phone {margin: 0 3px 0 2…

7. 现代卷积神经网络

文章目录 7.1. 深度卷积神经网络(AlexNet)7.2. 使用块的网络(VGG)7.3. 网络中的网络(NiN)7.4. 含并行连结的网络(GoogLeNet)7.5. 批量规范化7.5.1. 训练深层网络7.5.2. 批量规范化层…

sqlmap详细使用

SQLmap使用详解 SQLmap(常规)使用步骤 1、查询注入点 python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id12、查询所有数据库 python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id1 --dbs3、查询当前数据库 python sqlmap.py -u htt…

React+TS+css in js 练习

今天分享的内容是动态规划的经典问题--0-1 背包问题 0-1背包问题的描述如下:给定一组物品,每种物品都有自己的重量和价值,背包的总容量是固定的。我们需要从这些物品中挑选一部分,使得背包内物品的总价值最大,同时不超过背包的总容量。 举个例子:假设这组物品的质量…

刷题日常(找到字符串中所有字母异位词,​ 和为 K 的子数组​,​ 滑动窗口最大值​,全排列)

找到字符串中所有字母异位词 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 题目分析: 1.将p里面的字符先丢进一个hash1中,只需要在S字符里面找到多少个和他相同的has…

《C++ Primer Plus》学习笔记|第8章 函数探幽 (24-11-30更新)

文章目录 8.1 内联函数8.2 引用变量8.2.1 创建引用变量8.2.2 将引用用作函数参数8.2.3 引用的属性和特别之处特点1:在计算过程中,传入的形参的值也被改变了。特点2:使用引用的函数参数只接受变量,而不接受变量与数值的运算左值引用…

[2024年1月28日]第15届蓝桥杯青少组stema选拔赛C++中高级(第二子卷、编程题(1))

参考程序&#xff1a; #include <iostream> #include <algorithm> // 用于 std::sortusing namespace std;int main() {int a, b, c;cin >> a >> b >> c;// 将三个数放入一个数组中int arr[3] {a, b, c};// 对数组进行排序sort(arr, arr 3);…

基于hexo框架的博客搭建流程

这篇博文讲一讲hexo博客的搭建及文章管理&#xff0c;也算是我对于暑假的一个交代 &#xff01;&#xff01;&#xff01;注意&#xff1a;下面的操作是基于你已经安装了node.js和git的前提下进行的&#xff0c;并且拥有github账号 创建一个blog目录 在磁盘任意位置创建一个…

基于Java Springboot传统戏曲推广微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

数据结构--树二叉树顺序结构存储的二叉树(堆)

前言 前面我们学习了顺序表、链表、栈和队列&#xff0c;这些都是线性的数据结构。今天我们要来学习一种非线性的数据结构——树。 树的概念及结构 树的概念 树是一种非线性的数据结构&#xff0c;是由n&#xff08;n≥0&#xff09;个有效结点组成的一个具有层次关系的集合…

网络安全运行与维护 加固练习题

1. 提交用户密码的最小长度要求。 输入代码: cat /etc/pam.d/common-password 提交答案: flag{20} 2.提交iptables配置以允许10.0.0.0/24网段访问22端口的命令。 输入代码: iptables -A INPUT -p tcp -s 10.0.0.0/24 --dport 22 -j ACCEPT 提交答案: flag{iptables -A I…

【汇编语言】call 和 ret 指令(三) —— 深度解析汇编语言中的批量数据传递与寄存器冲突

文章目录 前言1. 批量数据的传递1.1 存在的问题1.2 如何解决这个问题1.3 示例演示1.3.1 问题说明1.3.2 程序实现 2. 寄存器冲突问题的引入2.1 问题引入2.2 分析与解决问题2.2.1 字符串定义方式2.2.2 分析子程序功能2.2.3 得到子程序代码 2.3 子程序的应用2.3.1 示例12.3.2 示例…

Java 泛型详细解析

泛型的定义 泛型类的定义 下面定义了一个泛型类 Pair&#xff0c;它有一个泛型参数 T。 public class Pair<T> {private T start;private T end; }实际使用的时候就可以给这个 T 指定任何实际的类型&#xff0c;比如下面所示&#xff0c;就指定了实际类型为 LocalDate…

Python语法基础(四)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 高阶函数之map 高阶函数就是说&#xff0c;A函数作为B函数的参数&#xff0c;B函数就是高阶函数 map&#xff1a;映射 map(func,iterable) 这个是map的基本语法&#xff0c;…

【JavaEE初阶】应是天仙狂醉,乱把白云揉碎 - (重点)线程

本篇博客给大家带来的是线程的知识点, 由于内容较多分几天来写. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ⭐欢迎大家点赞 评论 收藏 分享 ❤❤❤ 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 1. 认识线程 1.1 概念 )1 …