共计 2385 个字符,预计需要花费 6 分钟才能阅读完成。
背景介绍
Brats2020 是脑肿瘤分割领域最权威的基准数据集之一,包含多模态 MRI 扫描和专家标注的肿瘤区域。该数据集对于研究胶质瘤(最常见且最具侵袭性的脑肿瘤)分割算法至关重要。数据集特点包括:

- 包含 369 例训练数据和 125 例测试数据
- 每例提供 T1、T1ce、T2、FLAIR 四种模态的扫描
- 专家标注了水肿、增强肿瘤、坏死等子区域
- 数据以 NIfTI 格式(.nii.gz)存储,这是医学影像常用格式
下载指南
- 访问官方注册页面:https://www.med.upenn.edu/cbica/brats2020/registration.html
- 填写学术机构邮箱(不接受个人邮箱如 Gmail)和基本信息
- 等待 1 - 2 个工作日获取下载权限邮件
- 登录后选择 ”BraTS2020 Training Data” 和 ”BraTS2020 Validation Data” 下载
注意事项:
- 总数据量约 60GB,确保有足够存储空间
- 推荐使用 wget 或 aria2 等支持断点续传的工具
- 下载后校验 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 加载 NIfTI 文件的 Python 示例:
import nibabel as nib
import numpy as np
# 加载单个模态数据
img_path = "BraTS20_Training_001/BraTS20_Training_001_flair.nii.gz"
img = nib.load(img_path)
data = img.get_fdata() # 获取 numpy 数组
print(f"数据维度: {data.shape}") # 通常为(240, 240, 155)
print(f"数据类型: {data.dtype}") # 通常为 float32
预处理流程
完整预处理代码示例:
import numpy as np
from skimage.transform import resize
def preprocess_volume(volume, target_shape=(128, 128, 128)):
"""标准化和重采样"""
# 1. 归一化到[0,1]
volume = (volume - volume.min()) / (volume.max() - volume.min())
# 2. 重采样到目标尺寸
volume = resize(volume, target_shape, mode='constant', preserve_range=True)
# 3. 添加通道维度
return volume[np.newaxis, ...]
# 处理所有模态
modalities = ['flair', 't1', 't1ce', 't2']
processed_data = []
for mod in modalities:
img = nib.load(f"BraTS20_Training_001/BraTS20_Training_001_{mod}.nii.gz")
processed = preprocess_volume(img.get_fdata())
processed_data.append(processed)
# 堆叠多模态数据 (4, 128, 128, 128)
final_data = np.concatenate(processed_data, axis=0)
避坑指南
- 路径问题:
- 使用
os.path.join()代替硬编码路径 -
示例:
import os case_folder = os.path.join("Brats2020_TrainingData", "BraTS20_Training_001") -
内存溢出:
- 处理前检查数据大小:
data.nbytes / (1024**3)GB -
使用生成器分批加载数据
-
维度混淆:
- 医学影像通常是(height, width, depth)
- 深度学习框架通常要求(channel, height, width, depth)
性能优化
-
内存映射 :对大型文件使用 nibabel 的
mmap模式img = nib.load(img_path, mmap=True) -
并行处理:
from joblib import Parallel, delayed def process_case(case_path): # 处理单个病例 return preprocessed_data all_cases = [...] # 所有病例路径列表 results = Parallel(n_jobs=4)(delayed(process_case)(case) for case in all_cases) -
缓存中间结果:将预处理后的数据保存为 HDF5 格式
延伸学习
- 推荐工具:
- ITK-SNAP:可视化 3D 医学影像
-
MONAI:医学影像深度学习框架
-
进阶练习:
- 实现滑动窗口 patch 提取
- 添加数据增强(旋转、弹性变形等)
-
尝试不同的归一化策略(如 z -score)
-
相关资源:
- BraTS 官方论文:https://arxiv.org/abs/2107.02314
- NIfTI 格式规范:https://nifti.nimh.nih.gov/
结语
处理医学影像数据确实比常规图像更复杂,但掌握了这些基础流程后,就能为后续的模型训练打下坚实基础。建议先从少量数据开始实验,逐步扩展到完整数据集。遇到问题时,多查阅官方文档和社区讨论(如 GitHub Issues),医学影像领域有很多热心研究者会分享经验。
正文完
