温馨提示:文末有 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的关键组件包括:
-
卷积层(Convolutional Layer):
- 卷积层使用一组小的输入数据子集(称为滤波器或核)进行卷积操作,来检测输入中的有用模式。每个滤波器会滑过整个输入空间,计算与局部区域的点乘操作,从而得到特征图(Feature Map)。这些特征图代表了输入数据的不同特征。
-
激活函数(Activation Function):
- 激活函数通常应用于卷积操作之后,目的是引入非线性因素,使得网络能够学习到更复杂的模式。常用的激活函数有ReLU(Rectified Linear Unit)、sigmoid、tanh等。
-
池化层(Pooling Layer):
- 池化层的主要作用是降低特征图的空间维度,从而减少后续计算的复杂度,并帮助模型获得平移不变性。最常用的是最大池化(Max Pooling),它选择局部区域内最大的值作为输出;另一种常见的方法是平均池化(Average Pooling),即输出局部区域内的平均值。
-
全连接层(Fully Connected Layer):
- 全连接层在CNN的末端较为常见,用于将前一层产生的特征向量映射到分类标签上。在全连接层中,每一个神经元都与前一层的所有激活值相连。
-
正则化(Regularization):
- 正则化技术用于防止过拟合,Dropout是一种常用的正则化方法,通过随机关闭一部分神经元,减少模型对特定特征的依赖,提高模型的泛化能力。
-
损失函数(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 模型训练
训练一个深度学习模型时,加入两种策略来优化训练过程:
-
ModelCheckpoint:这是一种在训练过程中自动保存模型权重的方法。它会根据设定的监控指标(在这里是验证集准确率
val_accuracy
),在指标提升时保存模型。这样可以确保即使训练中断,也能保留效果最好的模型版本。 -
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-管理系统实战案例