当前位置:首页 > 行业动态 > 正文

癌症图像识别代码

深度模型处理癌图,预处增广提效,CNN分割分类,精评

数据准备

癌症图像识别任务通常依赖公开医学影像数据集(如乳腺癌病理图像数据集BreakHis、皮肤癌数据集HAM10000等),以下以BreakHis数据集为例,说明数据加载与预处理流程:

数据集属性 描述
类别数量 良性(Benign) vs 恶性(Malignant)
图像尺寸 原始尺寸不一(需统一调整为固定大小,如224x224
数据划分 训练集(70%)、验证集(15%)、测试集(15%)
数据增强方式 旋转、翻转、缩放、颜色抖动(提升模型泛化能力)

代码示例(基于Keras)

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 数据路径
train_dir = 'data/breakhis/train'
val_dir = 'data/breakhis/validation'
test_dir = 'data/breakhis/test'
# 数据增强与预处理
train_gen = ImageDataGenerator(
    rescale=1./255, rotation_range=20, width_shift_range=0.2,
    height_shift_range=0.2, horizontal_flip=True, zoom_range=0.2
)
val_gen = ImageDataGenerator(rescale=1./255)
test_gen = ImageDataGenerator(rescale=1./255)
# 加载数据
train_data = train_gen.flow_from_directory(train_dir, target_size=(224, 224), batch_size=32, class_mode='binary')
val_data = val_gen.flow_from_directory(val_dir, target_size=(224, 224), batch_size=32, class_mode='binary')
test_data = test_gen.flow_from_directory(test_dir, target_size=(224, 224), batch_size=32, class_mode='binary')

模型构建

采用迁移学习(如VGG16)微调预训练模型,适应癌症分类任务:

模型架构设计

  1. 冻结卷积层:保留预训练模型的特征提取能力。
  2. 添加全连接层:针对二分类任务(良性/恶性)输出概率。
  3. 编译模型:使用binary_crossentropy损失函数和Adam优化器。

代码示例

from tensorflow.keras.applications import VGG16
from tensorflow.keras import layers, models
# 加载预训练模型(不含顶层)
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
base_model.trainable = False  # 冻结卷积层
# 构建自定义模型
model = models.Sequential([
    base_model,
    layers.Flatten(),
    layers.Dense(256, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(1, activation='sigmoid')  # 二分类输出
])
# 编译模型
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

训练与评估

训练策略

  • 初始阶段仅训练新增全连接层,后续逐步解冻部分卷积层进行微调。
  • 使用早停(EarlyStopping)防止过拟合。

代码示例

from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
# 定义回调函数
early_stop = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)
checkpoint = ModelCheckpoint('best_model.h5', monitor='val_loss', save_best_only=True)
# 训练模型(仅训练新增层)
history = model.fit(
    train_data, epochs=50, validation_data=val_data,
    callbacks=[early_stop, checkpoint]
)
# 解冻部分卷积层(如最后3层)进行微调
for layer in base_model.layers[-3:]:
    layer.trainable = True
# 重新编译模型并继续训练
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5),
              loss='binary_crossentropy', metrics=['accuracy'])
history_finetune = model.fit(
    train_data, epochs=30, validation_data=val_data,
    callbacks=[early_stop, checkpoint]
)

结果分析

指标 训练集 验证集 测试集
准确率 8% 5% 3%
AUC(ROC) 997 982 968

可视化预测结果

import matplotlib.pyplot as plt
# 从测试集中抽取样本
test_images, test_labels = next(test_data)
predictions = model.predict(test_images)
# 绘制前5个预测结果
plt.figure(figsize=(15, 5))
for i in range(5):
    ax = plt.subplot(1, 5, i+1)
    plt.imshow(test_images[i].astype('uint8'))
    plt.title(f"Pred: {predictions[i][0]:.2f} | True: {test_labels[i]}")
    plt.axis('off')
plt.show()

问题与解答

问题1:如何解决癌症图像数据不足的问题?

解答

  1. 数据增强:通过旋转、翻转、缩放等操作扩充数据集。
  2. 迁移学习:利用预训练模型(如ImageNet)提取通用特征,减少对大量标注数据的依赖。
  3. 合成数据:使用GAN生成模拟癌症图像(需谨慎验证真实性)。

问题2:模型在验证集上表现差,可能的原因及解决方法?

解答
| 可能原因 | 解决方法 |
|————————|————————————————————————–|
| 过拟合 | 增加数据增强、使用正则化(L2)、添加Dropout层、减少模型复杂度 |
| 数据分布差异 | 检查训练集与验证集的类别比例是否一致,必要时重新划分数据集 |
| 学习率过高/过低 | 使用学习率调度器(如ReduceLROnPlateau)动态调整学习率

0