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

news2024/11/15 12:02:50

温馨提示:文末有 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-管理系统实战案例

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

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

相关文章

10.2学习

1.IOC控制反转 IoC(Inverse of Control:控制反转)是⼀种设计思想,就是将原本在程序中⼿动创建对象的控制权,交由Spring框架来管理。 IoC 在其他语⾔中也有应⽤,并⾮ Spring 特有。 ​ IoC 容器是 Spring⽤来实现 IoC …

IDEA 设置自动定位文件

一、场景分析 IDEA 在使用的过程中,发现有时候,打开一个类,它并不能自动帮我们在左侧 Project 树中定位出文件,需要自己手动点击 瞄准 图标。很不方便。 二、解决方法 1、点击 瞄准 图标旁边的 竖三点 2、将 Alwasy Select Opene…

[Linux][进程] 命令行参数

在我们学c 语言时经常会看到各种各样的代码,其中mian函数的参数有许多种,如: int main(){} int main(void){} int main(int argc,char* argv[]){} int main(int argc,char* argv[] , char* env[]){} int argc,char* argv[] 这两个就是命令行参…

10月2日笔记(内网资源探测篇)

内网资源探测 在内网渗透中,测试人员往往需要通过各种内网扫描技术来探测内网资源的情况,为后续的横向渗透做准备,通常需要发现内网存活的主机,并探测主机的操作系统、主机开放了哪些端口、端口上运行了哪些服务、服务的当前版本…

典型模拟滤波器

典型模拟滤波器的幅度函数描述了滤波器在不同频率下的幅度响应特性。 巴特沃斯滤波器(Butterworth Filter) 幅度平方函数: ∣ H ( j Ω ) ∣ 2 1 1 ( Ω Ω c ) 2 N |H(j\Omega)|^2 \frac{1}{1 \left(\frac{\Omega}{\Omega_c}\right)^{…

【leetcode】 45.跳跃游戏 ||

如果我们「贪心」地进行正向查找,每次找到可到达的最远位置,就可以在线性时间内得到最少的跳跃次数。 例如,对于数组 [2,3,1,2,4,2,3],初始位置是下标 0,从下标 0 出发,最远可到达下标 2。下标 0 可到达的…

Python(三)——列表

文章目录 创建列表访问下标遍历列表元素新增元素查找元素删除元素连接列表切片操作 创建列表 创建列表主要有两种方式 [ ]表示一个空的列表 a [] print(type(a)) # <class list> print(a) # []通过list()的方式来创建一个空列表 a list() print(type(a)) # …

Java中的switch分支结构

switch分支结构 switch分支结构1.基本语法2.说明3.流程图4.案例5.注意事项6.练习7.switch和if的比较 switch分支结构 1.基本语法 switch&#xff08;表达式&#xff09;{case 常量1: //当...语句块1;break;case 常量2: 语句块2;break;...case 常量n: 语句块n;break;defaul…

python之认识变量

1、变量 1.1、定义 字面意思来看&#xff0c;会发生改变的量称为变量。 相反的&#xff0c;如果有一个不会发生改变的量&#xff0c;它应该称为不变量&#xff0c;即常量。 1.2、引入变量的原因 主要是为了方便程序员动态的管理、操控数据。 1.3、变量的三要素 名称 类型…

20_Python的包和模块

包和模块 在Python中&#xff0c;包和模块是用来组织代码的一种方式。它们可以帮助开发者管理代码结构&#xff0c;使得代码更易于维护和复用。 内置的包和模块第三方包和模块自定义包和模块 模块(Module) 模块是包含Python定义和语句的文件。一个模块就是一个单独的Python…

GO网络编程(一):基础知识

1. 网络编程的基础概念 TCP/IP 协议栈 TCP/IP 是互联网通信的核心协议栈&#xff0c;分为以下四个层次&#xff1a; 应用层&#xff08;Application Layer&#xff09;&#xff1a;为应用程序提供网络服务的协议&#xff0c;比如 HTTP、FTP、SMTP 等。传输层&#xff08;Tra…

颠覆声音转换!Seed-VC零样本模仿技术揭秘

颠覆声音转换&#xff01;Seed-VC零样本模仿技术揭秘 Seed-VC是一款炫酷的AI声音转换工具&#x1f3a4;&#xff0c;能瞬间模仿明星和角色的声音✨&#xff01;它具备“零样本”学习能力&#xff0c;且支持变速&#xff0c;轻松带来自然流畅的音效&#x1f3b6;。绝对是声音创…

提升银行CRM系统安全性,实践指南

Zoho 银行CRM系统安全措施包括访问控制、数据加密、安全审计、防火墙、物理安全、应急响应和用户教育。这些措施保护客户信息和银行运营安全&#xff0c;需持续更新以应对安全挑战。 1、系统访问控制 系统访问控制是保障银行CRM系统安全的首要步骤。银行需要确保只有授权的用户…

fiddler抓包15_AutoResponder自动重定向 - 篡改响应

课程大纲 ① 抓取请求&#xff0c;保存response到本地 双击列表请求项查看详情 - 响应区“文本查看”&#xff0c;点击“用笔记本打开”&#xff0c;另存文件。 ② 修改保存的response文件 ③ 开启自动重定向&#xff0c;配置规则 拖拽录制的请求到右侧&#xff0c;选择本地已修…

Mysql 索引底层数据结构和算法

索引数据结构 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的一种有序数据结构。索引是存储到表空间中&#xff0c;当我们的 sql 中的where条件用到索引的时候&#xff0c;会在存储层就过滤出数据来&#xff0c;如果不走索引&#xff0c;则需要在server层过滤。 …

【YOLO目标检测电梯间电动车与人数据集】共4321张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式&#xff1a;YOLO格式 图片数量&#xff1a;4321 标注数量(txt文件个数)&#xff1a;4321 标注类别数&#xff1a;2 标注类别名称&#xff1a;person、electricBicycle 数据集下载&#xff1a;电梯间电动车与人数据集 图片示例 数据…

大厂进阶之CSS死磕牢记的7大知识点

本文主要讨论7大CSS知识点&#xff0c;个个都是金刚附体&#xff0c;干货满满&#xff1a; 1、移动端样式适配 2、回流和重绘 3、flex布局 4、BFC 5、CSS垂直居中方法 6、CSS两栏、三栏自适应布局 7、CSS单行、多行文本溢出省略号格式 一、如何做到移动端样式适配 1、媒体查询…

Python 从入门到实战32(数据库MySQL)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了数据库编程接口操作的相关知识。今天我们将学习…

Java Servlet 详解

Java Servlet 是 Java 企业级应用 中的一个核心组件&#xff0c;特别是在 Web 应用开发中&#xff0c;它为服务器端处理请求提供了基础。每次用户发出请求时&#xff0c;Servlet 都会动态生成响应&#xff0c;这在构建复杂、交互式的 Web 应用时尤为重要。 什么是 Servlet&am…

快餐时代读快书,十分钟左右就能读懂一本书

在这个快节奏的时代&#xff0c;时间似乎永远不够用。我们忙于工作、学习&#xff0c;往往连一本书都难以静下心来读完。不过&#xff0c;现在有了一个超级高效的读书网站&#xff0c;能让你在十分钟左右读懂一本书的精华&#xff0c;真是太棒了&#xff01; 发现高效阅读的网…