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

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

python 复制代码
# 初始化两个列表来分别存放没有侵袭性导管癌(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 读取乳腺癌影像的切片数据:

python 复制代码
# 初始化两个列表来分别存放处理后的无癌症和有癌症的图片数组
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)

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

python 复制代码
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)是一个常用的损失函数。
python 复制代码
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),则提前结束训练。这有助于节省计算资源,并防止模型过度拟合训练数据。

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

python 复制代码
# 导入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 模型评估

python 复制代码
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 得分

python 复制代码
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 绘制

python 复制代码
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-管理系统实战案例

相关推荐
TaoYuan__33 分钟前
机器学习【激活函数】
人工智能·机器学习
TaoYuan__34 分钟前
机器学习的常用算法
人工智能·算法·机器学习
正义的彬彬侠38 分钟前
协方差矩阵及其计算方法
人工智能·机器学习·协方差·协方差矩阵
致Great1 小时前
Invar-RAG:基于不变性对齐的LLM检索方法提升生成质量
人工智能·大模型·rag
华奥系科技1 小时前
智慧安防丨以科技之力,筑起防范人贩的铜墙铁壁
人工智能·科技·安全·生活
ZPC82101 小时前
OpenCV—颜色识别
人工智能·opencv·计算机视觉
Mr.简锋1 小时前
vs2022搭建opencv开发环境
人工智能·opencv·计算机视觉
m0_743106462 小时前
论文笔记:no pose,no problem-基于dust3r输出GS参数实现unpose稀疏重建
论文阅读·深度学习·计算机视觉·3d·几何学
weixin_443290692 小时前
【论文阅读】InstructPix2Pix: Learning to Follow Image Editing Instructions
论文阅读·人工智能·计算机视觉
ai产品老杨2 小时前
部署神经网络时计算图的优化方法
人工智能·深度学习·神经网络·安全·机器学习·开源