nnU-Net + HD-BET · 体验报告 · 2026 / 06

脑 MRI 分割
实战两件事

Track AnnU-Net · 海马体分割
Track BHD-BET · 颅骨剥离
ComputeCPU only
DatasetMSD Task04 · 260 cases
体验报告 · 双线叙事Hippocampus pipeline
00 · 总览
02 / 15
总览

这次做了两件事

Track A

nnU-Net · 海马体分割

医学图像分割框架。完整流水线:下载 → 预处理 → 训练 → 推理。

下载 MSD Task04 数据集(260 训练 + 130 测试)
转换为 v2 格式 + 自动生成训练计划
训练:跳过(需要 GPU)
下载 DKFZ 预训练权重(Zenodo · 271 MB)
CPU 推理 6 例 · Dice ≥ 0.948
Track B

HD-BET · 颅骨剥离

脑 MRI 预处理工具。一行命令把头骨剥掉,只留脑实质。

下载 HD-BET 预训练模型(首次运行自动拉,~400 MB)
对 ICBM152 标准脑模板做推理
输出脑实质 + 二值 mask
和 nnU-Net 是独立工具,不是分割海马体
真实流水线里通常作为分割前预处理
01 · 技术栈
03 / 15
环境与依赖

技术栈 · 三大组件

组件版本 / 来源用途规模
nnU-Net v2 pip install nnunetv2 数据预处理、自动 plan 生成
nnU-Net v1 pip install nnunet 预训练权重推理(兼容性需要)
HD-BET pip install hd-bet 颅骨剥离 / 脑提取推理 ~400 MB 权重
PyTorch 2.x · CPU build 底层张量运算 · 自动求导
nibabel + numpy < 2 NIfTI 读写 + 数组运算
Python
3.11.15
CPython · Linux 6.17
推理设备
CPU only
无 GPU 加速
venv 数量
2
v1 / v2 隔离
权重总量
671 MB
Task04 271 + HD-BET 400
02 · 数据集
04 / 15
MSD Task04 Hippocampus

数据集 · 海马体 T1 MRI

Medical Segmentation Decathlon 第 04 号任务,Vanderbilt University Medical Center 提供。 目标:对 T1 加权脑 MRI 中的 前海马 (Anterior, label=1)后海马 (Posterior, label=2) 做体素级分割。

训练例数
260
单模态 T1 MRI · 带金标准
测试例数
130
无标注
体素 spacing
1.0 mm³
各向同性 isotropic
中位形状
36×50×35
~63K voxel · 极小数据集

前景体素强度统计 · 全部 260 例

统计量统计量含义
min0.00median362.88典型 T1 信号水平
max486,420.22mean22,360.46极大值 → 必须归一化
std60,654.62P0.5 / P99.528.0 / 277,682裁剪边界(plan 用)
Track A · nnU-Net
05 / 15
A

海马体分割

从下载数据,到用预训练权重在 CPU 上跑出真分割结果。
训练这一步需要 GPU,本次跳过——但完成了所有训练前的准备工作。

A · 步骤 01 · 数据准备
06 / 15
A · STEP 01 耗时 · ~5 分钟 (CPU) 脚本 · 01-03

下载 → 转格式 → 预处理

MSD AWS bucket 下 27 MB tar / 56 MB 解压。 nnUNetv2_convert_MSD_dataset 把每个图像加 _0000 后缀,dataset.json 改写成 v2 schema。 预处理时 nnU-Net 自动分析数据集 → 生成训练菜谱 nnUNetPlans.json

# 1. 下载 $ wget https://msd-for-monai.s3.amazonaws.com/Task04_Hippocampus.tar $ tar -xf Task04_Hippocampus.tar -C downloads/ # 2. 转 v2 格式 $ nnUNetv2_convert_MSD_dataset -i downloads/Task04_Hippocampus -overwrite_id 4 # 3. 预处理 + 自动 plan(dataset_fingerprint + nnUNetPlans) $ nnUNetv2_plan_and_preprocess -d 4 --verify_dataset_integrity
→ 输入
  • (无) 从公网下载
↓ 输出(三个目录)
  • downloads/ 原始 · 56 MB
  • nnUNet_raw/ v2 格式 · 29 MB
  • nnUNet_preprocessed/ 备好的料 · 71 MB
  • nnUNetPlans.json 自动训练菜谱
A · 步骤 02 · 自动 Plan
07 / 15
nnUNetPlans.json · 核心创新

自动训练计划 · 不调参

根据数据指纹自动推导出网络架构、patch size、batch size、池化次数,全程只用规则(不依赖梯度搜索),CPU 上几秒完成。同时生成 2D 和 3D 两套配置。

超参2d3d_fullres来源 / 说明
preprocessorDefaultPreprocessorDefaultPreprocessor统一处理流水线
归一化Z-ScoreZ-Score(x-μ)/σ · per-image
spacing[1.0, 1.0][1.0, 1.0, 1.0]已是各向同性 · 无需重采样
patch_size[56, 40][40, 56, 40]稍大于 median image
batch_size36692D 因 patch 小,可堆很多
median image[50, 35][36, 50, 35]来自 fingerprint

网络架构 (3d_fullres)

network_class_namePlainConvUNet (dynamic_network_architectures)
n_stages4 编码器 4 级下采样
features_per_stage[32, 64, 128, 256] 翻倍递增
conv_op / kerneltorch.nn.Conv3d, all 3×3×3
stridesstage 0 = 1×1×1, stages 1-3 = 2×2×2
norm / activationInstanceNorm3d / LeakyReLU(0.01) · no dropout
A · Plan 可视化
08 / 15
nnUNetPlans.json 关键超参可视化

数据指纹 → 网络架构 → patch / batch

nnUNet plan visualization
A · 步骤 03 · 训练(跳过)+ 取权重
09 / 15
A · STEP 03 本步跳过训练 · 改用 预训练权重

跳过训练 · 用 DKFZ 公开权重

训练 nnU-Net 需要 GPU,CPU 上完整 5 折交叉验证不现实。
DKFZ 团队 2020 年发论文时把 MSD 全套训好的权重打包上传到 Zenodo(CC-BY 4.0)。直接下来用。

# 训练命令(本次未执行 · 供参考) $ nnUNetv2_train 4 2d 0 --npz # GPU · 5 折交叉验证 × 1000 epoch # 替代方案:从 Zenodo 下预训练权重 $ wget https://zenodo.org/records/4003545/files/Task004_Hippocampus.zip $ nnUNet_install_pretrained_model_from_zip Task004_Hippocampus.zip
Zenodo record
4003545
nnU-Net pretrained · MSD 全套
权重大小
271 MB
5 fold × (2D + 3D) · zip
训练版本
nnUNetTrainerV2
v1 时代 · 2020 年训练
许可证
CC-BY 4.0
允许商用 · 需署名
A · 步骤 04 · CPU 推理
10 / 15
A · STEP 04 推理总耗时 · 5.57 秒 · 6 例 单例 · 0.93 秒

CPU 推理 · 6 例 hippocampus

训练集 3 例(带金标准 → 可算 Dice)+ 测试集 3 例(无标注 → 仅展示)。 用 fold 0 单模型,--disable_tta 关闭 test-time augmentation 提速 4×。

# 关键环境变量(v1 风格命名) export RESULTS_FOLDER=/tmp/v1_workspace/RESULTS_FOLDER # 推理(fold 0 单模型) $ nnUNet_predict -i input/ -o output/ \ -t Task004_Hippocampus -m 3d_fullres -f 0 --disable_tta
批次例数Cases总耗时单例平均
训练集(带 GT)3001 / 003 / 0042.84 s0.95 s
测试集(无 GT)3002 / 005 / 0092.73 s0.91 s
A · 步骤 05 · 评估
11 / 15
Dice 评估 · 训练集 3 例

推理结果定量分析

Dice = 2|A∩B| / (|A|+|B|) · 衡量模型预测与金标准的体素重叠率,1.0 = 完美重叠。

case前海马 (label=1)后海马 (label=2)评级
hippocampus_0010.97330.9720excellent
hippocampus_0030.95450.9531excellent
hippocampus_0040.96300.9483excellent
本次 · 训练集 3 例(数据泄漏) ≈ 0.964 ≈ 0.958 仅验证流水线
原作者 · 5-fold CV(公正评估) 0.8975 0.8807 真实泛化性能

Caveat — 本次推理的 3 例 (001/003/004) 都在训练集里,模型见过它们的标注,Dice 自然高。这只能证明权重和命令链路跑通了,不能用作模型泛化性能的衡量。MSD challenge leaderboard 上的真实水平 ≈ 0.89 / 0.88。

A · 推理结果可视化
12 / 15
AI 分割 vs 医生金标准

DKFZ 预训练权重 · 三例对照

推理速度
5.57 s
6 例总耗时(CPU)
AI prediction vs ground truth
Track B · HD-BET
13 / 15
Track B · 单步 耗时 · 3-5 分钟 (CPU · 单例) 权重 · ~400 MB · 自动下载

HD-BET · 颅骨剥离

DKFZ 团队基于 nnU-Net 训的脑提取专用模型(HBM 2019 论文)。 网络架构是 3D U-Net,训练在 1568 例多中心 MRI 上,论文报告 Dice ≈ 0.96。 第一次运行会自动从作者服务器下载权重到 ~/.cache/torch/

$ pip install hd-bet # 一行命令做颅骨剥离推理 $ hd-bet -i hdbet_test/test_brain.nii.gz -o output/brain.nii.gz \ -device cpu --disable_tta --save_bet_mask # 注意:参数是 -device(单短横线),不是 --device · 这是常见踩坑 # --disable_tta 关闭 8 次镜像增强 ensemble,CPU 上快 4×,Dice 损失 < 0.005
输入 shape
197×233×189
ICBM152 标准脑模板
总 voxel 数
8.68 M
8,675,289
脑实质 voxel
1.89 M
1,894,992
占比
21.8%
符合典型脑头比例
B · 推理结果可视化
14 / 15
HD-BET 颅骨剥离前后对比

原始 MRI(带头骨) → 脑实质(剥离后)

HD-BET result
总结
15 / 15
两条线,两个推理结果

两件事做完了。

Track A · 完成

nnU-Net 海马体分割

完整流水线走通到推理,跳过训练直接用预训练权重。

数据准备 + 自动训练计划生成
下载 DKFZ 公开权重 → CPU 推理 6 例
Dice ≥ 0.948 · AI 与医生标注几乎重叠
Track B · 完成

HD-BET 颅骨剥离

下载预训练模型,对一张 MRI 做了真实推理。

一行 hd-bet 命令完成
输出脑实质 + 二值 mask
作为分割前预处理的标准工具
2
完成的推理任务
0.95+
海马体训练集 Dice
5.57s
海马体推理 · 6 例
671 MB
两个预训练权重
01 / 15