共计 2927 个字符,预计需要花费 8 分钟才能阅读完成。
背景介绍
Brats2020 是脑肿瘤分割领域最具影响力的基准数据集之一,包含多模态 MRI 扫描和专家标注的肿瘤分割标签。该数据集对于开发自动脑肿瘤分割算法至关重要,广泛应用于学术研究和工业界。数据集涵盖了胶质瘤(最常见且侵袭性的原发性脑肿瘤)的四种 MRI 序列:T1、T1ce、T2 和 FLAIR,以及对应的 ground truth 分割标签。

下载指南
- 访问Brats2020 官方网站
- 点击 ”Register” 按钮填写注册表单(需提供学术邮箱)
- 在邮箱中查收确认链接并激活账户
- 登录后进入 ”Data” 页面,仔细阅读数据使用协议
- 选择 ”Training Data” 和 ”Validation Data” 进行下载(总大小约 40GB)
重要提示:
– 确保网络稳定,推荐使用下载管理器
– 准备至少 100GB 的可用磁盘空间
– 下载完成后验证文件完整性(官方提供 MD5 校验码)
数据解析
数据集目录结构示例:
Brats2020_TrainingData/
├── BraTS20_Training_001/
│ ├── BraTS20_Training_001_flair.nii.gz
│ ├── BraTS20_Training_001_t1.nii.gz
│ ├── BraTS20_Training_001_t1ce.nii.gz
│ ├── BraTS20_Training_001_t2.nii.gz
│ └── BraTS20_Training_001_seg.nii.gz
└── ...(其他病例类似)
使用 nibabel 加载.nii.gz 文件的 Python 示例:
import nibabel as nib
import numpy as np
# 加载单个 MRI 序列
def load_nii(filepath):
img = nib.load(filepath)
data = img.get_fdata()
affine = img.affine
header = img.header
return data, affine, header
# 示例:加载 FLAIR 序列
flair_path = "BraTS20_Training_001/BraTS20_Training_001_flair.nii.gz"
flair_data, _, _ = load_nii(flair_path)
print(f"FLAIR 数据维度: {flair_data.shape}")
print(f"像素值范围: {np.min(flair_data)} - {np.max(flair_data)}")
预处理流程
完整预处理代码示例:
import numpy as np
from sklearn.preprocessing import MinMaxScaler
def preprocess_volume(volume):
"""标准化单个体积数据"""
# 去除极值(0.5% 和 99.5% 分位数)lower = np.percentile(volume, 0.5)
upper = np.percentile(volume, 99.5)
volume = np.clip(volume, lower, upper)
# 归一化到[0,1]
scaler = MinMaxScaler()
original_shape = volume.shape
volume = scaler.fit_transform(volume.reshape(-1, 1)).reshape(original_shape)
return volume
def extract_patches(volume, patch_size=(128, 128, 32), stride=64):
"""从 3D 体积中提取重叠 patches"""
patches = []
depth, height, width = volume.shape
for z in range(0, depth - patch_size[2] + 1, stride):
for y in range(0, height - patch_size[1] + 1, stride):
for x in range(0, width - patch_size[0] + 1, stride):
patch = volume[z:z+patch_size[2],
y:y+patch_size[1],
x:x+patch_size[0]]
patches.append(patch)
return np.array(patches)
# 完整预处理流程
def full_preprocessing(patient_dir):
modalities = []
for seq in ['flair', 't1', 't1ce', 't2']:
path = f"{patient_dir}/BraTS20_Training_001_{seq}.nii.gz"
data, _, _ = load_nii(path)
modalities.append(preprocess_volume(data))
# 合并多模态数据 (H x W x D x C)
multimodal = np.stack(modalities, axis=-1)
# 提取 patches
patches = extract_patches(multimodal)
return patches
避坑指南
常见问题及解决方案:
- 路径错误
- 问题:Windows 系统路径分隔符与 Linux 不同
-
解决:使用
os.path.join()构建跨平台路径 -
内存溢出
- 问题:一次性加载所有数据导致 OOM
-
解决:逐病例处理或使用生成器
-
文件格式混淆
- 问题:将.nii.gz 文件当作普通压缩包解压
-
解决:直接使用 nibabel 加载,不要手动解压
-
数据泄露
- 问题:在预处理前划分训练 / 验证集
- 解决:先完成所有预处理再划分数据集
性能优化
处理大型医学影像的高效技巧:
-
内存映射
img = nib.load(filepath, mmap=True) -
并行处理
from joblib import Parallel, delayed def process_case(case_path): # 处理单个病例 return full_preprocessing(case_path) case_paths = [...] # 所有病例路径列表 results = Parallel(n_jobs=4)(delayed(process_case)(p) for p in case_paths) -
增量处理
- 将预处理结果立即保存为.npy 文件
-
使用 HDF5 格式存储中间结果
-
GPU 加速
- 使用 cupy 替代 numpy
- 在预处理 pipeline 中集成 PyTorch DataLoader
延伸学习
推荐进一步探索的方向:
- 数据增强
- 医学影像特定的增强技术(弹性变形、伽马校正)
-
使用 albumentations 或 torchio 库
-
高级预处理
- 颅骨剥离(Skull Stripping)
- 配准(Registration)
-
偏置场校正(Bias Field Correction)
-
实战练习
- 尝试在预处理中实现 Z -score 标准化
- 修改 patch 提取策略实现非重叠采样
- 使用 PCA 可视化不同模态的特征分布
通过本指南,你应该已经掌握了 Brats2020 数据集从下载到预处理的完整流程。医学影像分析虽然门槛较高,但通过系统性的学习和实践,完全可以逐步掌握。建议从简单的 2D 切片分析开始,逐步过渡到 3D 体积处理,最终实现端到端的肿瘤分割系统。
正文完
