悠悠楠杉
网站页面
正文:
在医疗影像分析领域,自动检测异常区域(如肿瘤、出血点等)是提高诊断效率的关键。U-Net凭借其独特的编码器-解码器结构和跳跃连接(Skip Connection),成为解决这一问题的经典方案。本文将手把手教你用Python实现这一过程。
医疗影像通常以DICOM或NIfTI格式存储,需先转换为NumPy数组。以下代码演示如何加载并标准化数据:
import numpy as np
import pydicom
def load_dicom(path):
dicom = pydicom.dcmread(path)
img = dicom.pixel_array
img = (img - np.min(img)) / (np.max(img) - np.min(img)) # 归一化
return img
# 示例:加载CT扫描
ct_scan = load_dicom("data/patient1.dcm")
U-Net的核心是对称的编码器(下采样)和解码器(上采样)。使用TensorFlow/Keras实现:
from tensorflow.keras.layers import Conv2D, MaxPooling2D, UpSampling2D, Concatenate
def unet(input_size=(256, 256, 1)):
inputs = Input(input_size)
# 编码器
conv1 = Conv2D(64, 3, activation='relu', padding='same')(inputs)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
# 解码器
up1 = UpSampling2D(size=(2, 2))(pool1)
merge1 = Concatenate()([conv1, up1]) # 跳跃连接
# 输出层
outputs = Conv2D(1, 1, activation='sigmoid')(merge1)
model = Model(inputs=inputs, outputs=outputs)
return model
model = unet()
model.compile(optimizer='adam', loss='binary_crossentropy')
医疗影像数据通常需标注掩膜(Mask),训练时使用Dice系数作为评估指标:
def dice_coeff(y_true, y_pred):
smooth = 1.0
intersection = np.sum(y_true * y_pred)
return (2. * intersection + smooth) / (np.sum(y_true) + np.sum(y_pred) + smooth)
model.fit(X_train, y_train, epochs=50, validation_data=(X_val, y_val))
使用Matplotlib对比原始影像与预测结果:
import matplotlib.pyplot as plt
pred = model.predict(np.expand_dims(ct_scan, axis=0))
plt.figure()
plt.subplot(1, 2, 1)
plt.title("Original Image")
plt.imshow(ct_scan, cmap='gray')
plt.subplot(1, 2, 2)
plt.title("Predicted Anomaly")
plt.imshow(pred[0, :, :, 0], cmap='Reds')
通过上述步骤,即使是小型数据集(如BraTS),U-Net也能达到90%以上的Dice分数。实际应用中需根据具体场景调整网络深度和损失函数。