共计 1921 个字符,预计需要花费 5 分钟才能阅读完成。
BRATS2020 数据集概述
BRATS2020 是脑肿瘤分割领域的权威数据集,包含多模态 MRI 扫描(T1、T1c、T2、FLAIR)和专家标注的肿瘤子区域(坏死 / 非增强、水肿、增强肿瘤)。数据集特点包括:

- 来自不同医疗机构的 365 例胶质瘤患者数据
- 每个病例包含 4 种模态的 3D NIfTI 格式图像(240×240×155 分辨率)
- 标注包含 3 类肿瘤子区域的体素级 mask
数据加载与预处理
NIfTI 文件处理
使用 nibabel 库加载数据时需注意:
import nibabel as nib
# 加载单个模态数据
def load_nii(filepath):
img = nib.load(filepath)
data = img.get_fdata()
return np.asarray(data)
# 处理缺失模态(用零矩阵替代)def load_modalities(case_path):
modalities = ['t1', 't1ce', 't2', 'flair']
data = []
for mod in modalities:
try:
vol = load_nii(f"{case_path}/{mod}.nii.gz")
data.append(vol)
except:
data.append(np.zeros((240,240,155)))
return np.stack(data, axis=-1) # 形状 (H,W,D,C)
预处理流程
-
强度归一化 :
def normalize(volume): non_zero = volume[volume > 0] mean, std = non_zero.mean(), non_zero.std() return (volume - mean) / (std + 1e-8) -
脑部区域裁剪 :
def crop_brain_region(volume, margin=5): non_zero_coords = np.where(volume > 0) min_coords = np.maximum(np.array([np.min(c) for c in non_zero_coords]) - margin, 0) max_coords = np.minimum(np.array([np.max(c) for c in non_zero_coords]) + margin, volume.shape) return volume[min_coords[0]:max_coords[0], min_coords[1]:max_coords[1], min_coords[2]:max_coords[2]] -
数据增强 (3D 版本):
import torchio as tio transforms = tio.Compose([tio.RandomFlip(axes=(0,1,2)), tio.RandomAffine(scales=(0.9,1.1), degrees=10), tio.RandomBlur(std=(0,1)) ])
3D U-Net 模型实现
关键组件实现要点:
import torch.nn as nn
class DoubleConv(nn.Module):
def __init__(self, in_ch, out_ch):
super().__init__()
self.conv = nn.Sequential(nn.Conv3d(in_ch, out_ch, kernel_size=3, padding=1),
nn.BatchNorm3d(out_ch),
nn.ReLU(inplace=True),
nn.Conv3d(out_ch, out_ch, kernel_size=3, padding=1),
nn.BatchNorm3d(out_ch),
nn.ReLU(inplace=True)
)
def forward(self, x):
return self.conv(x)
# 完整 UNet 结构包含下采样和上采样路径
# 输入形状:(batch_size, 4, D, H, W)
# 输出形状:(batch_size, 3, D, H, W)
避坑指南
- 数据划分 :必须按患者 ID 划分,防止同一患者数据出现在训练 / 验证集
- 测试集 :官方测试集标签不可见,需通过在线平台提交预测结果
- 显存优化 :
- 使用 128×128×128 的 patch 训练
- 采用梯度累积技术
- 使用混合精度训练
延伸思考
- 如何应对肿瘤区域与非肿瘤区域的极端类别不平衡?
- 能否利用半监督学习处理标注数据稀缺问题?
- 多模态数据中不同模态的特征重要性如何量化评估?
实战建议
建议先从官方提供的验证集(有标签)开始实验,待流程稳定后再尝试在测试集上提交结果。训练时推荐使用 Dice Loss + CrossEntropy 的组合损失函数,初始学习率设为 1e- 4 并配合 ReduceLROnPlateau 调度器。
正文完
