Brats2018数据集下载与预处理全指南:从获取到实战应用

1次阅读
没有评论

共计 3804 个字符,预计需要花费 10 分钟才能阅读完成。

image.webp

背景介绍

Brats2018(Brain Tumor Segmentation Challenge 2018)是医学影像分析领域的重要基准数据集,专注于脑胶质瘤(最常见且具有侵袭性的原发性脑肿瘤)的自动分割任务。该数据集包含多模态 MRI 扫描(T1、T1ce、T2、FLAIR),由 285 位患者的影像组成(210 例高级别胶质瘤 HGG 和 75 例低级别胶质瘤 LGG),所有数据均经过专家手动标注(包括水肿、增强肿瘤、坏死等子区域)。

Brats2018 数据集下载与预处理全指南:从获取到实战应用

在学术研究中,Brats2018 具有三大核心价值:

  • 提供标准化的评估平台,使不同算法能在相同条件下对比性能
  • 多模态数据能验证模型对复杂病理特征的表征能力
  • 丰富的临床标注支持细分区域分析(如区分活跃肿瘤与周围水肿)

下载指南

官方下载(需注册)

  1. 访问 Multimodal Brain Tumor Segmentation Challenge 2018 页面
  2. 点击 ”Registration” 填写申请表(需提供机构邮箱)
  3. 收到下载链接后,使用 wget 批量下载:
wget -i brats2018_links.txt --user=your_email --password=your_password

镜像下载(推荐)

为避免官方服务器的限速问题,可使用以下镜像源:

# 使用清华镜像源下载 HGG 数据
wget -c https://mirrors.tuna.tsinghua.edu.cn/brats2018/HGG.tar.gz

# 使用 axel 多线程加速下载 LGG 数据
axel -n 8 https://mirrors.tuna.tsinghua.edu.cn/brats2018/LGG.tar.gz

数据结构解析

解压后的目录结构如下:

Brats2018
├── HGG
│   ├── Brats18_2013_10_1
│   │   ├── Brats18_2013_10_1_t1.nii.gz
│   │   ├── Brats18_2013_10_1_t1ce.nii.gz
│   │   ├── Brats18_2013_10_1_t2.nii.gz
│   │   ├── Brats18_2013_10_1_flair.nii.gz
│   │   └── Brats18_2013_10_1_seg.nii.gz
└── LGG
    └── ...

各模态的临床意义:

  • T1(原生):显示解剖结构,肿瘤区域通常呈低信号
  • T1ce(对比增强):造影剂使血脑屏障破坏区域显影,用于识别活跃肿瘤
  • T2:对水肿敏感,表现为高信号区域
  • FLAIR:抑制脑脊液信号,突出病灶周围水肿

预处理实战

环境准备

!pip install SimpleITK antspyx nibabel

N4 偏置场校正

import ants

def n4_bias_correction(input_path, output_path):
    """
    使用 ANTs 进行 N4 偏置场校正
    :param input_path: 输入 nii 文件路径
    :param output_path: 输出 nii 文件路径
    """
    img = ants.image_read(input_path)
    # 设置迭代参数(可针对不同模态调整)corrected = ants.n4_bias_field_correction(
        img,
        shrink_factor=4,
        convergence={'iters': [50,50,50,50], 'tol': 1e-7}
    )
    ants.image_write(corrected, output_path)

标准化与重采样

import SimpleITK as sitk

def normalize_resample(input_path, output_path, target_spacing=[1.0, 1.0, 1.0]):
    """
    标准化(Z-score)与各向同性重采样
    :param target_spacing: 目标体素间距(mm)"""
    img = sitk.ReadImage(input_path)

    # 重采样
    original_spacing = img.GetSpacing()
    original_size = img.GetSize()
    new_size = [int(round(osz*osp/nsp)) for osz,osp,nsp in 
                zip(original_size, original_spacing, target_spacing)]
    resampler = sitk.ResampleImageFilter()
    resampler.SetSize(new_size)
    resampler.SetOutputSpacing(target_spacing)
    resampler.SetTransform(sitk.Transform())
    resampler.SetInterpolator(sitk.sitkLinear)
    resampled_img = resampler.Execute(img)

    # Z-score 标准化
    array = sitk.GetArrayFromImage(resampled_img)
    normalized = (array - np.mean(array)) / np.std(array)
    result = sitk.GetImageFromArray(normalized)
    result.CopyInformation(resampled_img)

    sitk.WriteImage(result, output_path)

数据增强

def random_3d_augmentation(image, label):
    """3D 随机增强(旋转 + 翻转 + 弹性变形)"""
    # 组合变换
    transform = A.Compose([A.Rotate(limit=15, p=0.5),
        A.Flip(p=0.5),
        A.ElasticTransform(
            alpha=1, 
            sigma=50, 
            alpha_affine=10, 
            p=0.3
        )
    ], additional_targets={'label': 'mask'})

    augmented = transform(image=image.numpy(), 
        label=label.numpy())
    return augmented['image'], augmented['label']

避坑指南

常见问题解决方案

  1. DICOM 转换错误
  2. 现象:部分医院数据使用私有 DICOM 标签
  3. 解决:使用 dcm2niix 时添加 -i y 忽略不一致标签

    dcm2niix -i y -o output_dir input_dicom

  4. 内存不足

  5. 对策:分块处理大体积数据

    reader = sitk.ImageFileReader()
    reader.SetFileName(large_file)
    reader.ReadImageInformation()
    chunk_size = [256,256,64]  # 根据内存调整
    for z in range(0, size[2], chunk_size[2]):
        reader.SetExtractIndex([0,0,z])
        reader.SetExtractSize(chunk_size)
        chunk = reader.Execute()

  6. 模态对齐问题

  7. 检查:使用 SimpleITK.CheckImage() 验证各模态几何信息一致性
  8. 校正:对移动模态执行刚性配准
    fixed = sitk.ReadImage('t1ce.nii.gz')
    moving = sitk.ReadImage('flair.nii.gz')
    elastix_filter = sitk.ElastixImageFilter()
    elastix_filter.SetFixedImage(fixed)
    elastix_filter.SetMovingImage(moving)
    elastix_filter.Execute()

性能优化

多线程下载

使用 aria2 实现分片下载加速:

aria2c -x 16 -s 16 -j 4 \
    https://mirror.example.com/brats2018/HGG.tar.gz

并行预处理

利用 Python 的 multiprocessing 模块:

from multiprocessing import Pool

def process_case(case_path):
    # 预处理单个病例
    ...

if __name__ == '__main__':
    cases = glob.glob('Brats2018/*/*')
    with Pool(processes=8) as pool:
        pool.map(process_case, cases)

缓存机制

使用 joblib 缓存中间结果:

from joblib import Memory
memory = Memory("./cachedir")

@memory.cache
def heavy_computation(input):
    # 耗时计算
    return result

结语

通过本文的完整流程,开发者可获得标准化的 Brats2018 数据处理 pipeline。在实际应用中,建议:

  1. 对 HGG 和 LGG 分别建立预处理参数(如 LGG 可能需要更强的偏置场校正)
  2. 根据 GPU 显存调整重采样分辨率(通常 1mm³各向同性适合大多数 3D CNN)
  3. 使用 nnUNet 等框架时,需转换为它们要求的目录结构

完整的代码示例已开源在 GitHub 仓库(虚构地址):

git clone https://github.com/example/brats2018-preprocessing.git

正文完
 0
评论(没有评论)