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

温馨提示:文末有 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, auc

fpr = 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 sns

true_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-管理系统实战案例

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

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

相关文章

【Android 14源码分析】WMS-窗口显示-第一步:addWindow

忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

网络安全概述:从认知到实践

一、定义 网络安全,即致力于保护网络系统所涵盖的硬件、软件以及各类数据,切实保障其免遭破坏、泄露或者篡改等不良情形的发生。 二、重要性 个人层面:着重于守护个人隐私以及财产安全,为个人在网络世界中的各项活动提供坚实的保…

Redis篇(Redis原理 - 数据结构)(持续更新迭代)

目录 一、动态字符串 二、intset 三、Dict 1. 简介 2. Dict的扩容 3. Dict的rehash 4. 知识小结 四、ZipList 1. 简介 2. ZipListEntry 3. Encoding编码 五、ZipList的连锁更新问题 六、QuickList 七、SkipList 八、RedisObject 1. 什么是 redisObject 2. Redi…

使用JavaScript写一个网页端的四则运算器

目录 style(内联样式表部分) body部分 html script 总的代码 网页演示 style(内联样式表部分) <style>body {font-family: Arial, sans-serif;display: flex;justify-content: center;align-items: center;height: 100vh;background-color: #f0f0f0;}.calculator {…

Python开发环境配置(mac M2)

1. 前言 作为一名程序员&#xff0c;工作中需要使用Python进行编程&#xff0c;甚至因为项目需要还得是不同版本的Python如何手动管理多个版本的Python&#xff0c;如何给Pycharm&#xff08;IDE&#xff09;配置对应的interpreter等&#xff0c;都成为一个 “不熟练工” 的难…

使用百度文心智能体创建多风格表情包设计助手

文章目录 一、智能定制&#xff0c;个性飞扬二、多元风格&#xff0c;创意无限 百度文心智能体平台为你开启。百度文心智能体平台&#xff0c;创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台&#xff0c;集成了先进的自然语言处理技术和人工智能技术&…

基于SpringBoot实现QQ邮箱发送短信功能 | 免费短信服务

开发学习过程中有个短信发送功能&#xff0c;阿里云腾讯云等等都要money&#xff0c;听说qq邮箱可以实现免费发送邮箱的功能&#xff08;短信发送的平替&#xff09;&#xff0c;就用这个来实现&#xff01;&#xff01;&#xff01;【找了好多好多方法才成功的啊啊啊啊&#x…

【Linux】进程第三弹(虚拟地址空间)

目录 现象 底层原因 数据不发生修改 数据修改 小总结 地址空间本质 为什么要有地址空间 现象 来看代码&#xff1a; #include <stdio.h> #include <unistd.h> #include <sys/types.h>int val 50;int main() {printf("father process is running…

标准正态分布的数据 tensorflow 实现正态分布图,python 编程,数据分析和人工智能

import tensorflow as tf import matplotlib.pyplot as plt # 设置随机种子以获得可重复的结果 tf.random.set_seed(42) # 生成正态分布的数据 # mean0 和 stddev1 表示生成标准正态分布的数据 # shape(1000,) 表示生成1000个数据点 data tf.random.normal(mean0, stddev1, …

【python】追加写入excel

输出文件运行前&#xff08;有两张表&#xff0c;“表1”和“Sheet1”&#xff09;&#xff1a; 目录 一&#xff1a;写入单表&#xff08;删除所有旧工作表&#xff0c;写入新表&#xff09;二&#xff1a;写入多表&#xff08;删除所有旧工作表&#xff0c;写入新表&#x…

HTML5实现唐朝服饰网站模板源码

文章目录 1.设计来源1.1 网站首页-界面效果1.2 唐装演变-界面效果1.3 唐装配色-界面效果1.4 唐装花纹-界面效果1.5 唐装文化-界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcL…

[C++][第三方库][Websocket]详细讲解

目录 1.Websocket 协议1.介绍2.原理简介 2.Websocketpp1.介绍2.安装 3.常用接口4.使用 1.Websocket 协议 1.介绍 WebSocket是从HTML5开始支持的一种网页端和服务端保持长连接的消息推送机制产生原因&#xff1a; 传统的web程序都是属于"一问一答"的形式 即客户端给…

Python 语言学习——应用1.2 数字图像处理(第二节,变换)

目录 1.基础知识 1.图像几何变换概念 2.图像几何变换方式 3.插值运算 4.几何变换步骤 2.各类变换 1.位置变换 2.形状变换 3.代数运算 3.实战演练 1.基础知识 1.图像几何变换概念 在图像处理过程中&#xff0c;为了观测需要&#xff0c;常常需要对 图像进行几何变换&am…

如何创建免费版本的ABP分离模块?

由于ABP最近官方大改革&#xff0c;我们打开ABP.IO 官方会发现通过Cli创建模板的时候不能创建Trered类型的了 就是创建一个分层的解决方案&#xff0c;其中Web和Http API层在物理上是分开的。如果不勾选&#xff0c;则创建一个分层的解决方案&#xff0c;它不那么复杂&#xf…

PasteForm最佳CRUD实践,实际案例PasteTemplate详解之3000问(三)

作为“贴代码”力推的一个CRUD实践项目PasteTemplate,在对现有的3个项目进行实战后效果非常舒服&#xff01;下面就针对PasteForm为啥我愿称为最佳CRUD做一些回答: 哪里可以下载这个PasteForm的项目案例 目前“贴代码”对外使用PasteForm的项目有"贴Builder(PasteSpide…

【Android 13源码分析】Activity生命周期之onCreate,onStart,onResume-2

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

微服务Sleuth解析部署使用全流程

目录 1、Sleuth链路追踪 1、添加依赖 2、修改日志配置文件 3、测试 2、zipkin可视化界面 1、docker安装 2、添加依赖 3、修改配置文件 4、查看页面 5、ribbon配置 1、Sleuth链路追踪 sleuth是链路追踪框架&#xff0c;用于在微服务架构下开发&#xff0c;各个微服务之…

[水墨:创作周年纪念] 特别篇!

本篇是特别篇&#xff01;&#xff01; 个人主页水墨不写bug // _ooOoo_ // // o8888888o // // 88" . "88 …

GO网络编程(二):客户端与服务端通信【重要】

本节是新知识&#xff0c;偏应用&#xff0c;需要反复练习才能掌握。 目录 1.C/S通信示意图2.服务端通信3.客户端通信4.通信测试5.进阶练习&#xff1a;客户端之间通信 1.C/S通信示意图 客户端与服务端通信的模式也称作C/S模式&#xff0c;流程图如下 其中P是协程调度器。可…