nnU-Net · 复盘报告 · 2026 / 06

从零跑通
脑 MRI 分割
数据流水线

FrameworknnU-Net v2 + HD-BET
ComputeCPU only · 0 GPU
DatasetMSD Task04 · 260 cases
Range下载 → 预处理 + HD-BET 推理
体验报告 · 全 17 页2026 · Hippocampus pipeline
00 · 项目目标
02 / 18
我们要做什么

在没有 GPU 的笔记本上,
把医学图像分割流水线走通到能走的那一步

不依赖云服务、不租 GPU。我们能做哪些事 · 不能做哪些事 · 一开始就讲清楚边界。

01 · 范围

nnU-Net 数据准备

下载 → 转 v2 格式 → 自动 plan + 预处理。把流水线走到"训练前夜",验证 plan 自动生成机制能跑通。

CPU 可完成
02 · 范围

HD-BET 颅骨剥离

用 HD-BET 团队已经训好挂在网上的预训练权重,对一张脑部 MRI 跑一次脑提取推理(不是分割)。

CPU 可完成
03 · 范围

用预训练权重做真分割

从 Zenodo 下载 DKFZ 团队已经训好的 nnU-Net 权重,在 hippocampus 数据上跑 CPU 推理,跟金标准做对比。真正的端到端 AI 分割

CPU 可完成
01 · 技术栈
03 / 18
用到的工具

三个开源工具 · 各司其职

框架 · DKFZ

nnU-Net v2

医学图像分割框架,2021 Nature Methods。核心:根据数据自动推导网络架构 + patch + batch,不用调参

$ pip install nnunetv2
推理 · DKFZ

HD-BET

同团队基于 nnU-Net 训好的脑提取专用模型。一行命令做颅骨剥离,CPU 可跑,~400 MB 权重。

$ pip install hd-bet
数据 · MSD

Task04 Hippocampus

Medical Segmentation Decathlon 中最小的数据集。
压缩包 27 MB · 解压 56 MB · 260 训练 + 130 测试。

# MSD AWS bucket
02 · 流程总览
04 / 18
7 个阶段 · 6 个跑了 · 1 个跳过

从空目录到 HTML 报告,
一条命令跑通完整流水线

01

下载数据

MSD Task04 + ICBM152

02

转格式

MSD → nnU-Net v2

03

预处理 + Plan

auto plan · 数据指纹

04

HD-BET 推理

脑提取 · CPU

05

分割推理

预训练权重 · CPU

06

可视化 + 报告

4 张 PNG · HTML

6/7
跑通的阶段
0.95+
AI 分割 Dice 分数
0
需要的 GPU 数量
幂等
已完成步骤自动跳过
03 · 步骤 01
05 / 18
STEP 01 耗时 · ~1 分钟 脚本 · 01_download.py

下载数据 + 标准脑模板

从 MSD AWS bucket 抓 Task04 Hippocampus 数据集(带金标准),再下一张 ICBM152 标准脑模板留给后面 HD-BET 用。

# MSD Task04 · 海马体分割 $ wget https://msd-for-monai.s3.amazonaws.com/Task04_Hippocampus.tar $ tar -xf Task04_Hippocampus.tar -C downloads/ # ICBM152 标准脑模板(HD-BET 推理输入) $ wget https://...icbm152_t1.nii.gz -O hdbet_test/test_brain.nii.gz
→ 输入
  • (无) 从公网下载
↓ 输出
  • downloads/Task04_Hippocampus/ tar 27 MB / 解压 56 MB
  • ├── imagesTr/ 260 个 .nii.gz
  • ├── labelsTr/ 260 个金标准
  • └── imagesTs/ 130 个测试
  • hdbet_test/test_brain.nii.gz ~5 MB
04 · 步骤 02
06 / 18
STEP 02 耗时 · ~30 秒 脚本 · 02_convert.py

转格式 · MSD → nnU-Net v2

只动文件名和元数据,不改图像内容。每个图像加 _0000 后缀("第 0 个模态"),dataset.json 改写成 v2 schema。

$ nnUNetv2_convert_MSD_dataset -i downloads/Task04_Hippocampus -overwrite_id 4 # 三件事: # ① imagesTr/hippocampus_001.nii.gz → hippocampus_001_0000.nii.gz # ② dataset.json 旧 schema → v2 schema (channel_names / dict labels) # ③ Task04_Hippocampus → Dataset004_Hippocampus
→ 输入
  • downloads/Task04_Hippocampus/
  • ├── imagesTr/hippocampus_001.nii.gz
  • ├── labelsTr/hippocampus_001.nii.gz
  • └── dataset.json 旧版 MSD
↓ 输出
  • nnUNet_raw/Dataset004_Hippocampus/ 29 MB
  • ├── imagesTr/hippocampus_001_0000.nii.gz
  • ├── labelsTr/hippocampus_001.nii.gz
  • └── dataset.json v2 schema
05 · 步骤 03
07 / 18
STEP 03 耗时 · ~3 分钟 (CPU) 脚本 · 03_plan.py

自动备料 + 生成训练计划

nnU-Net 最聪明的一步——不用人调参。它自己看数据 → 写"指纹" → 决定网络架构、patch、batch_size → 写成菜谱 plans.json。

$ nnUNetv2_plan_and_preprocess -d 4 --verify_dataset_integrity # 内部 5 件事: # ① 校验:所有 image / label 一一对应 # ② 体检:spacing / 强度分布 / 形状 → dataset_fingerprint.json # ③ 制定 plan:网络架构 + patch_size + batch_size → nnUNetPlans.json # ④ 重采样 + 强度归一化 + 裁剪 # ⑤ 压缩存盘 (.b2nd Blosc2 格式)
→ 输入
  • nnUNet_raw/Dataset004_Hippocampus/
  • v2 schema 数据
↓ 输出 · 71 MB
  • nnUNet_preprocessed/Dataset004_Hippocampus/
  • ├── nnUNetPlans.json 训练菜谱
  • ├── dataset_fingerprint.json
  • ├── nnUNetPlans_2d/*.b2nd 备好的料
  • └── gt_segmentations/ 原尺寸金标准
06 · 中间洞察
08 / 18
"
3 分钟之后,
它把训练菜谱
自己写出来了

  nnUNetPlans.json 里写好了网络深度、patch 大小、batch_size、池化次数。整个机制只用规则推导,不调参、不依赖梯度。
注意:这只能说明 plan 机制本身跑通了。是不是真的能训出好模型,要等 GPU 跑完才知道。

07 · 步骤 04
09 / 18
STEP 04 耗时 · 3-5 分钟 (CPU) 脚本 · 04_hdbet.py

HD-BET · 颅骨剥离推理

注意:HD-BET 做的是 brain extraction(脑提取 / 剥头骨)——把头骨、皮肤、眼球去掉,只留脑实质。不是海马体分割那种语义分割。它是真实图像处理流水线的第一步,权重作者已训好。

$ hd-bet -i test_brain.nii.gz -o brain.nii.gz \ -device cpu --disable_tta --save_bet_mask # 参数: # -device cpu 注意是单短横线,不是 --device(常见踩坑) # --disable_tta 关 test-time augmentation,CPU 上快 4× # --save_bet_mask 同时输出二值 mask,便于可视化叠加
→ 输入
  • hdbet_test/test_brain.nii.gz
  • ICBM152 T1 · 197×233×189
  • 带头骨的标准脑模板
↓ 输出 · 脑提取结果
  • output/test_brain_bet.nii.gz
  • 仅脑实质(头骨已剥离)
  • output/test_brain_bet_bet.nii.gz
  • 二值 mask · 哪些 voxel 是脑
08 · 步骤 04 · 可视化
10 / 18
脑提取前后对比 · ICBM152 标准脑模板

原始 MRI 带头骨 → HD-BET 输出仅脑实质

HD-BET result
09 · 数据集预览
11 / 18
海马体数据集样本 · 金标准(医生标注)
数据剖面

医生手工标注
叠加在 MRI 上

来自 nnUNet_raw/labelsTr/ 的人工标注。
Anterior 前海马(label=1)· 工作记忆相关
Posterior 后海马(label=2)· 长时记忆相关

→ 这是"目标"。
下一页是 AI 跑出来的"答案"。
目标和答案重叠率 = Dice 分数
  • • shape ≈ 35×51×35 voxel · 1mm 各向同性
  • • 260 训练 / 130 测试 · 单模态 T1 MRI
Hippocampus sample
三视图 · 红 = 前海马 · 绿 = 后海马
10 · AI 真分割 ✓
12 / 18
⭐ 端到端 AI 分割 · 跑通了 · CPU 推理

DKFZ 预训练权重 · hippocampus 真分割

Dice 分数
0.95+
AI ↔ 医生 体素重叠率
AI prediction vs ground truth
10 · Plan 可视化
13 / 18
nnUNetPlans.json · 自动生成的训练菜谱
Auto-config

没人调参,
所有超参都决定好了

nnU-Net 把数据集体检结果(spacing / 强度分布 / shape)喂进一组规则,推出网络架构。

  • • Patch size: 从最大 batch=2 反推
  • • Batch size: ≥2 但不爆显存
  • • 池化次数: 每轴独立 直到 patch≤4
  • • 配置: 2d / 3d_fullres 两套

注意:能不能训出好模型要 GPU 跑完才知道。
这次只验证了 plan 机制本身能跑出合理数字

nnUNet plan
数据指纹 → 网络架构 → patch / batch
11 · 边界
14 / 18
关键区分 · 不要混淆

这次跑了什么,
没跑什么

需要 GPU · 跳过

训练 nnU-Net

  • 需要带标注数据集 · 有 ✓
  • 需要 GPU · 10 GB+ 显存 ·
  • 本次只跑到 预处理 + plan 生成 就停
  • 命令在脚本里:
    nnUNetv2_train 4 2d 0 (需 GPU · 几小时)
  • 这次没自己训模型
CPU 能跑 · 完成

预训练权重 + 推理

  • HD-BET · 颅骨剥离 · CPU 推理 ✓
  • nnU-Net Hippocampus · 从 Zenodo 下 271 MB 权重 ✓
  • 3 例 hippocampus 跑完 Dice > 0.94 ✓
  • 说明:不会训不等于不会推
  • 临床/科研常态:用别人训好的权重
12 · 产物清单
15 / 18
跑完后磁盘上长什么样

所有产物 · 留在磁盘可查证

nnunet_repro/ ├── scripts/ # 5 个步骤脚本 ├── downloads/Task04_Hippocampus/ # MSD 原始 · tar 27 MB / 解压 56 MB │ ├── imagesTr/ # 260 训练 .nii.gz │ ├── labelsTr/ # 260 真值标注 │ └── imagesTs/ # 130 测试 ├── hdbet_test/ │ ├── test_brain.nii.gz # ICBM152 输入 │ └── output/test_brain_bet*.nii.gz HD-BET 脑提取输出(剥头骨) ├── nnUNet_raw/Dataset004_Hippocampus/ # 转格式后 · 29 MB ├── nnUNet_preprocessed/Dataset004_Hippocampus/ # 71 MB │ ├── nnUNetPlans.json 自动生成的训练计划 │ └── dataset_fingerprint.json 数据指纹 ├── nnUNet_results/ # 空目录 · 训练才会写入 └── outputs/ ├── nnunet_report.html ⭐⭐ 最终报告 ├── nnunet_slides.html # 这份演示稿 └── *.png # 3 张可视化
13 · 复现步骤
16 / 18
他人 4 步在自己电脑上复现

解压 → 装环境 → 跑 → 看报告

01

解压 + 进入目录

tar -xzf nnunet_repro_full.tar.gz && cd nnunet_repro

耗时~10 秒
02

装环境(Python 3.10+ · 锁 numpy<2)

bash setup.sh # 自动建 venv + 装 nnunetv2 / hd-bet / numpy<2 / torchvision

耗时~5 分钟
03

跑全流水线(幂等:已完成步骤跳过)

bash run.sh # 5 个脚本依次跑

耗时~15-30 分钟
04

开报告

open outputs/nnunet_report.html # 自动浏览器打开

耗时即时
14 · 结论
17 / 18
三条诚实的结论

没 GPU 也能
完成端到端 AI 分割

学到什么 · 01

预训练权重 = CPU 推理可行

Zenodo 上 DKFZ 团队公开了 MSD 全套权重(v1 时代)。CPU 跑 hippocampus 单例 2 秒出结果,Dice > 0.94

学到什么 · 02

HD-BET 也是 CPU 友好

3-5 分钟一例脑提取,加 --disable_tta 还能再快 4×。作为临床/科研 MRI 处理的第一步够用

下一步 · 03

训自己的模型仍要 GPU

想在自己数据上做训练(不是推理),还是要 GPU。但框架已经准备好——把 nnUNet_preprocessed/ 拷到 GPU 机器跑 nnUNetv2_train 即可。

15 · 完
18 / 18

谢谢

nnU-Net + HD-BET · 体验报告 · 2026 · Hippocampus
01 / 18