基于深度学习的乳腺癌分类识别与诊断系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 

1. 项目简介

        乳腺癌是全球最常见的癌症之一,早期诊断对于治疗效果至关重要。近年来,深度学习技术在医学图像分析领域取得了显著进展,能够从大量的医学影像数据中自动学习和提取特征,从而实现高效、准确的分类与诊断。本项目旨在开发一个基于深度学习的乳腺癌分类识别与诊断系统,利用卷积神经网络(CNN)对乳腺组织切片图像进行分类与诊断,测试集乳腺癌分类准确率达到 91.3%,AUC指标达到97%。

        B站系统演示视频:基于深度学习的乳腺癌分类识别与诊断系统_哔哩哔哩_bilibili

【系统演示视频】基于深度学习的乳腺癌分类识别与诊断系统

2. 乳腺癌图像数据集读取与预处理

        原始数据集包含了162张以40倍扫描的乳腺癌(BCa)标本的整装切片图像。从中提取了277,524个尺寸为50x50的图像块(其中198,738个为IDC阴性,78,786个为IDC阳性)。每个图像块的文件名格式为:u_xX_yY_classC.png —> 例如 10253_idx5_x1351_y1101_class0.png。其中,u 表示病人ID(10253_idx5),X 是该图像块被裁剪位置的X坐标,Y 是该图像块被裁剪位置的Y坐标,而C 则表示类别,其中0表示非IDC,1表示IDC。

# 初始化两个列表来分别存放没有侵袭性导管癌(IDC)和有侵袭性导管癌的图片路径
N_IDC = []  
P_IDC = []  # 遍历乳腺图片数据集,根据图片标识分类存储图片路径
for img in breast_img:if img[-5] == '0':N_IDC.append(img)elif img[-5] == '1':P_IDC.append(img)# 创建一个大小为15x15英寸的图像窗口,用于展示图片
plt.figure(figsize=(15, 15))# 分别从两个类别中随机选择18张图片的索引
some_non = np.random.randint(0, len(N_IDC), 18)
some_can = np.random.randint(0, len(P_IDC), 18)# 展示随机选取的无侵袭性导管癌的图片
s=0
for num in some_non:img = image.load_img(N_IDC[num], target_size=(100, 100))img = image.img_to_array(img)plt.subplot(6, 6, 2 * s + 1)plt.axis('off')plt.title('正常(Normal)')plt.imshow(img.astype('uint8'))s += 1# 展示随机选取的有侵袭性导管癌的图片
s = 1
for num in some_can:img = image.load_img(P_IDC[num], target_size=(100, 100))img = image.img_to_array(img)plt.subplot(6, 6, 2 * s)plt.axis('off')plt.title('浸润性导管癌(IDC)')plt.imshow(img.astype('uint8'))s += 1

        利用 opencv 读取乳腺癌影像的切片数据:

# 初始化两个列表来分别存放处理后的无癌症和有癌症的图片数组
X = []
Y = []# 处理无侵袭性导管癌的图片,读取并调整尺寸后存入列表
for img in tqdm(NewN_IDC):n_img = cv2.imread(img, cv2.IMREAD_COLOR)  # 使用OpenCV按颜色模式读取图片n_img = cv2.resize(n_img, (image_size, image_size), interpolation=cv2.INTER_LINEAR)  # 调整图片尺寸为50x50像素X.append(n_img)Y.append(0)# 处理有侵袭性导管癌的图片,读取并调整尺寸后存入列表
for img in tqdm(P_IDC):c_img = cv2.imread(img, cv2.IMREAD_COLOR)  # 使用OpenCV按颜色模式读取图片c_img = cv2.resize(c_img, (image_size, image_size), interpolation=cv2.INTER_LINEAR)  # 调整图片尺寸为50x50像素X.append(c_img)Y.append(1)

         读取的数据集进行训练集、验证集和测试集的切分:

X_train, X_valid, Y_train, Y_valid = train_test_split(X, Y, test_size=0.2)
X_train, X_test, Y_train, Y_test = train_test_split(X_train, Y_train, test_size=0.2)print("Train Data Shape:", X_train.shape)
print("valid Data Shape:", X_valid.shape)
print("Test Data Shape:", X_test.shape)
Train Data Shape: (100845, 75, 75, 3)
valid Data Shape: (31515, 75, 75, 3)
Test Data Shape: (25212, 75, 75, 3)

        可以看出,训练集 100845 张、验证集31515张,测试集 25212 张影像切片。

3. 深度卷积神经网络建模

3.1 卷积神经网络 CNN 模型构建

        卷积神经网络(Convolutional Neural Networks, CNN)是一种深度学习模型,它在处理具有网格结构的数据时特别有效,如图像识别、视频识别、语音识别等领域。CNN的设计灵感来源于对生物视觉系统的观察,特别是视觉皮层中负责处理不同部分图像的感受野(receptive fields)的概念。

        CNN的关键组件包括:

  1. 卷积层(Convolutional Layer)

    • 卷积层使用一组小的输入数据子集(称为滤波器或核)进行卷积操作,来检测输入中的有用模式。每个滤波器会滑过整个输入空间,计算与局部区域的点乘操作,从而得到特征图(Feature Map)。这些特征图代表了输入数据的不同特征。
  2. 激活函数(Activation Function)

    • 激活函数通常应用于卷积操作之后,目的是引入非线性因素,使得网络能够学习到更复杂的模式。常用的激活函数有ReLU(Rectified Linear Unit)、sigmoid、tanh等。
  3. 池化层(Pooling Layer)

    • 池化层的主要作用是降低特征图的空间维度,从而减少后续计算的复杂度,并帮助模型获得平移不变性。最常用的是最大池化(Max Pooling),它选择局部区域内最大的值作为输出;另一种常见的方法是平均池化(Average Pooling),即输出局部区域内的平均值。
  4. 全连接层(Fully Connected Layer)

    • 全连接层在CNN的末端较为常见,用于将前一层产生的特征向量映射到分类标签上。在全连接层中,每一个神经元都与前一层的所有激活值相连。
  5. 正则化(Regularization)

    • 正则化技术用于防止过拟合,Dropout是一种常用的正则化方法,通过随机关闭一部分神经元,减少模型对特定特征的依赖,提高模型的泛化能力。
  6. 损失函数(Loss Function)

    • 损失函数衡量模型预测值与实际值之间的差异,指导网络权重的调整。对于分类任务,交叉熵损失(Cross Entropy Loss)是一个常用的损失函数。
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(image_size, image_size, 3)))
model.add(BatchNormalization())
model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))......model.add(Flatten())
model.add(Dense(128, activation='relu', kernel_initializer='he_uniform'))
model.add(BatchNormalization())
model.add(Dense(64, activation='relu', kernel_initializer='he_uniform'))
model.add(BatchNormalization())
model.add(Dense(64, activation='relu', kernel_initializer='he_uniform'))
model.add(Dropout(0.3))
model.add(Dense(24, activation='relu', kernel_initializer='he_uniform'))
model.add(Dense(2, activation='softmax'))

3.2 模型训练

        训练一个深度学习模型时,加入两种策略来优化训练过程:

  1. ModelCheckpoint:这是一种在训练过程中自动保存模型权重的方法。它会根据设定的监控指标(在这里是验证集准确率 val_accuracy),在指标提升时保存模型。这样可以确保即使训练中断,也能保留效果最好的模型版本。

  2. EarlyStopping:这是一种避免过拟合的技术,通过监测验证集上的性能(在这里也是准确率 val_accuracy),如果在设定的轮数内(patience)性能没有显著提升(min_delta),则提前结束训练。这有助于节省计算资源,并防止模型过度拟合训练数据。

        结合这两种方法,可以有效地提高模型训练效率,并保证最终得到的模型具有较好的泛化能力。

# 导入TensorFlow Keras的ModelCheckpoint和EarlyStopping回调函数模块
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping# 设定训练轮数为100次
epochs = 100# 创建一个ModelCheckpoint实例,用于保存训练过程中表现最好的模型
# 'best_model.h5' 是保存模型的文件路径
# monitor='val_accuracy' 表示监控验证集上的准确率(val_accuracy),当这个指标提升时,模型就会被保存
# verbose=1 表示详细模式开启,在保存模型时会有详细的输出信息
# save_best_only=True 表示只在验证集上的准确率提升时才保存模型
checkpointer = ModelCheckpoint('best_model.h5',monitor='val_accuracy',verbose=1,save_best_only=True
)# 创建EarlyStopping实例,用于在训练过程中如果验证集上的准确率长时间没有改善,则提前停止训练
# monitor='val_accuracy' 同样表示监控验证集上的准确率
# min_delta=0.001 表示最小变化阈值,只有当准确率变化超过这个值时,才认为是有改善
# patience=5 表示在没有改善的情况下最多等待的epoch数,这里设置为5,意味着如果没有更好的准确率,则在5个epoch后停止训练
# verbose=1 表示详细模式开启,在停止训练时会有详细的输出信息
earlystopper = EarlyStopping(monitor='val_accuracy', min_delta=0.001,patience=5, verbose=1
)# 开始训练模型
# 使用model.fit()方法进行模型训练
# X_train 和 Y_train 分别是训练集的输入和标签
# batch_size 定义了每次更新梯度时使用的样本数量
# validation_data 提供了一组用于验证模型性能的数据(X_valid, Y_valid)
# epochs 定义了训练的最大轮数
# callbacks 参数指定了在训练过程中需要使用的回调函数列表(checkpointer和earlystopper)
history = model.fit(x=X_train, y=Y_train,batch_size=batch_size,validation_data=(X_valid, Y_valid),epochs=epochs,callbacks=[checkpointer, earlystopper]
)

3.3 绘制模型训练的损失函数

 

        从训练的损失函数和预测准确率的变化曲线可以看出,验证集的预测准确率接近90%,且训练集的损失函数并没有收敛,还有很大的训练空间,以此可以尝试调整参数以训练更多epoch,验证集的准确率可以进一步提高。

3.4 模型评估

train_result = model.evaluate(x=X_train, y=Y_train)
val_result = model.evaluate(x=X_valid, y=Y_valid)
test_result = model.evaluate(x=X_test, y=Y_test)eval_result = pd.DataFrame(zip(train_result,val_result, test_result),columns=['Train','Valid', 'Test'], index=['损失Loss','准确率Accuracy']
)
eval_result

3.5 测试集不同类别预测 AUC 得分 

from sklearn.metrics import roc_curve, aucfpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(2):fpr[i], tpr[i], _ = roc_curve(Y_test[:, i], pred_test[:, i])roc_auc[i] = auc(fpr[i], tpr[i])plt.figure()
colors = ['blue', 'red', 'green', 'orange', 'purple', 'brown', 'pink']
for i, color in zip(range(2), colors):plt.plot(fpr[i], tpr[i], color=color, lw=2, label='ROC curve of class {0} (area = {1:0.2f})'.format(emotions[i], roc_auc[i]))plt.plot([0, 1], [0, 1], color='gray', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('测试集的 ROC Score 分布')
plt.legend(loc="lower right")fig = plt.gcf()
fig.set_size_inches(15, 8)plt.show()

3.6 困惑矩阵 Confusionmatrix 绘制

from matplotlib.colors import LogNorm
import seaborn as snstrue_labels = np.argmax(Y_test, axis=1)
predictions = np.argmax(pred_test, axis=1)
conf_matrix = confusion_matrix(true_labels, predictions)plt.figure(figsize=(10, 8))
sns.heatmap(conf_matrix, annot=True, cmap='GnBu', fmt='g', xticklabels=[emotions[i] for i in range(len(conf_matrix))], yticklabels=[emotions[i] for i in range(len(conf_matrix))], norm=LogNorm())plt.title('Confusion Matrix')
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.show()

4. 乳腺癌分类识别与诊断系统

4.1 系统首页

4.2 卷积神经网络模型介绍

4.3 乳腺癌在线分类识别与诊断

        (1)浸润性导管癌(IDC)样本检测

        (2)正常(Normal)样本检测

5. 结论

        乳腺癌是全球最常见的癌症之一,早期诊断对于治疗效果至关重要。近年来,深度学习技术在医学图像分析领域取得了显著进展,能够从大量的医学影像数据中自动学习和提取特征,从而实现高效、准确的分类与诊断。本项目旨在开发一个基于深度学习的乳腺癌分类识别与诊断系统,利用卷积神经网络(CNN)对乳腺组织切片图像进行分类与诊断,测试集乳腺癌分类准确率达到 91.3%,AUC指标达到97%。

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。技术交流、源码获取认准下方 CSDN 官方提供的学长 QQ 名片 :)

精彩专栏推荐订阅:

1. Python-数据挖掘实战案例

2. Python-深度学习实战案例

3. Python-管理系统实战案例

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3.X + SpringBoot小程序 | AI大模型项目 | 饮食陪伴官

gitee平台源码 github平台源码 饮食陪伴师是一个管理饮食的原生大模型小程序,优势: 精确营养监控:用户记录饮食后,我们会计算出食用的营养成分与分量,并反馈给用户。饮食建议有效:大模型经过我们训练具备大…

Qt 中的 QListWidget、QTreeWidget 和 QTableWidget:简化的数据展示控件

Qt 中的 QListWidget、QTreeWidget 和 QTableWidget:简化的数据展示控件 在 Qt 的用户界面开发中,展示和管理数据是常见的需求。Qt 提供了丰富的控件供开发者选择,其中 QListWidget、QTreeWidget 和 QTableWidget 是三个高层封装控件&#x…

程计软考题2-编译、解释程序翻译阶段

(一) 编译器和解释器的工作阶段 1.编译和解释与源程序的区别 分析:编译和解释是语言处理的两种基本方式。 编译过程包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等阶段,以及符号表管理和出错处理模块。 解释过程在词法、语…

【Kubernetes】常见面试题汇总(四十三)

目录 98. kube-apiserver 和 kube-scheduler 的作用是什么? 99.您对云控制器管理器了解多少? 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)…

网络层——IP

IP地址 结构: 由32位二进制数组成,通常用点分的形式被分为四个部分,每个部分1byte,最大值为255。 从功能的角度看,ip地址由两部分组成,网络号和主机号。网络号标识了ip所在的网段,主机号标识了…

基于微信的乐室预约小程序+ssm(lw+演示+源码+运行)

摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

服务器使用frp做内网穿透详细教程,请码住

目录 1.内网穿透的定义 2.前提条件 3.frp下载地址 4.配置服务器端的frps.toml文件 5. 配置客户端,即物理服务器或者是电脑本机地址 6.添加服务端启动命令startServerFrp.sh 7.添加客户端启动命令startClientFrp.sh 8. 查看服务端启动日志 9.查看客户端启…

Java网络通信—UDP

0.小记 1.udp通信不需要建立socket管道,一边只管发,一边只管收 2.客户端:将数据(byte)打包成包裹(DatagramPacket),写上地址(IP端口),通过快递站&…

简站wordpress主题产品多图ACF插件设置方法

此教程仅适用于演示站有产品多图的主题,演示站没有产品多图的主题,就别往下看了,省得浪费时间。 1、给产品添加轮播图 简站wordpress主题有多个产品图的主题,添加产品轮播图的具体方法如下: 1.2、选择产品分类 添加…

IDEA服务启动时无法输出日志

起服务时,控制台啥日志也没有 解决方案:选择【启用调试输出】 SQL的日志无法打印 原来安装了一个Mybatis Log Free,用的好好的。 后来换了个项目,SQL执行日志就打印不出来了。 解决方案:换个插件,我换了…

安宝特案例 | 某知名日系汽车制造厂,借助AR实现智慧化转型

案例介绍 在全球制造业加速数字化的背景下,工厂的生产管理与设备维护效率愈发重要。 某知名日系汽车制造厂当前面临着设备的实时监控、故障维护,以及跨地域的管理协作等挑战,由于场地分散和突发状况的不可预知性,传统方式已无法…

M3u8视频由手机拷贝到电脑之后,通过potplayer播放报错找不到文件地址怎么解决?

该文章前面三节主要介绍M3u8视频是什么,视频播放错误(找不到地址)的解决方法在后面 M3U8是一种多媒体播放列表文件格式,主要用于流媒体播放。 一、文件格式特点 1. 文本文件:M3U8是一个采用 UTF-8 编码的文本文件,这意味着它可…

基于ssm的学生社团管理系统 社团分配系统 社团活动调度平台 学生社团管理 信息化社团管理开发项目 社团活动管理 社团预约系统(源码+文档+定制)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

【性能优化】低配starRocks常驻内存优化

背景说明 由于服务器的实际资源小于starRocks官方的配置,导致starRocks在无任务的情况下,常驻内存偏高,可用于查询的资源变小。 官方文档 实际部署的集群一般是4C8G和8C16G,be的配置不达标 为了解决单次查询内存不足的问题&…

MySQL高阶2020-无流量的账户数

目录 题目 准备数据 分析数据 总结 题目 编写SQL查询以报告在 2021 购买订阅但没有任何会话的帐 户数。 准备数据 Create table If Not Exists Subscriptions (account_id int, start_date date, end_date date) Create table If Not Exists Streams (session_id int, a…

wsl(1) -- win11环境配置

1.前言 本专栏主要记录了我配置wsl的过程,以便日后回忆。 2. 开启WSL可选功能 打开设置,点击应用,点击可选功能,点击更多Windows功能,查看是否开启了【适用于Linux的Windows子系统】和【虚拟机平台】 3. 更新wsl …

FPGA-Vivado-IP核-逻辑分析仪(ILA)

ILA IP核 背景介绍 在用FPGA做工程项目时,当Verilog代码写好,我们需要对代码里面的一些关键信号进行上板验证查看。首先,我们可以把需要查看的这些关键信号引出来,接好线通过示波器进行实时监测,但这会用到大量的线材…

“不关心⚠️Warning”的代价:http自动升级https导致免费的存储服务扣费

背景 7 月 12 日的时候我手机突然收到一条短信:显示我在 LeanCloud 平台的账户欠费了。虽然只是欠费 0.01 元,但还是有些疑惑,怎么免费的存储服务突然扣费了? 然而这只是个开始。起初我并没有很在意这扣费的 0.01 元(…

【微服务即时通讯系统】——brpc远程过程调用、百度开源的RPC框架、brpc的介绍、brpc的安装、brpc使用和功能测试

文章目录 brpc1. brpc的介绍1.1 rpc的介绍1.2 rpc的原理1.3 grpc和brpc 2. brpc的安装3. brpc使用3.1 brpc接口介绍 4. brpc使用测试4.1 brpc同步和异步调用 brpc 1. brpc的介绍 1.1 rpc的介绍 RPC(Remote Procedure Call)远程过程调用,是一…

指纹定位的原理与应用场景

目录 原理 1. 信号特征收集 2. 定位算法 推导公式 距离估算公式 定位算法公式 使用场景 发展前景 指纹定位是一种基于无线信号强度(如Wi-Fi、RFID、蓝牙等)来实现室内定位的技术。它借助于环境中多个基站的信号特征来推断用户的位置。以下是对指纹定位的详细讲解,包…