nnUNet V2代码——数据预处理(一)

前文请看nnUNetv2_plan_and_preprocess命令

阅读nnUNet\nnunetv2\utilities\plans_handling\plans_handler.py文件

文件包含ConfigurationManager类和PlansManager类。

数据预处理共两篇:

nnUNet V2代码——数据预处理(一)

nnUNet V2代码——数据预处理(二)

ConfigurationManager类

1. __init__函数

参数

  • configuration_dict:字典类型,内容是之前生成的nnUNetPlans.json文件

过程

定义类内变量self.configuration;接下来判断architecture键值是否在configuration_dict中。

如果不在nnUNet作者提示“检测到旧的 nnU-Net 计划格式。正在尝试重建网络架构参数。如果失败,请重新运行 nnUNetv2_plan_experiment 为您的数据集。如果您使用的是自定义架构,请将 nnU-Net 降级到您实现该架构的版本,或者更新您的实现和计划。”(机翻的)。

过程是将V1版本的nnUNetPlans.json转换为V2版本。代码不再粘贴

2. 其余函数

参数

过程

按照configuration_dict存储的相应数据函数名称函数参数返回对应的值,过程是查询。代码里可能会有一两个函数比较陌生,没关系,它服务于查询,知道这点就足够了。结构较为清晰,不再粘贴代码。


PlansManager类

本类的作用nnUNet作者在__init__函数里说明了,机翻如下:

我们为什么需要这个?

  1. 解决配置中的继承问题
  2. 暴露那些从字符串中获取标签管理器或 IO 类等烦人的事情
  3. 清晰地暴露计划中的事物,而不是将它们隐藏在字典中
  4. 缓存这些内容

这个类不会阻止你随意使用。如果你愿意,你仍然可以直接使用计划 (PlansHandler.plans[‘key’])

1. __init__函数

参数

  • plans_file_or_dict:例如nnUNetPlan.json

过程

将之前生成的nnUNetPlan.json存入类变量self.plans,用于后续查询

2. __repr__函数

参数

过程

返回self.plans的字符串形式,方便打印

3. _internal_resolve_configuration_inheritance函数

参数

  • configuration_name:配置名称,例如2d

过程

首先检查configuration_name是否存在于self.plans[‘configurations’]中,如果不存在则抛出ValueError。

接下来根据configuration_name获取对应配置(在self.plans[‘configurations’]查询里获取),因为接下来可能会修改获取的配置,为了不改变原有文件(nnUNetPlans.json),要copy一份配置,存入configuration变量。

依照给定的配置类型获取配置后,需要判断是否有inherits_from字段,该字段是3D级联使用的,详见这篇文章的3D级联内容

有inherits_from字段,说明当前配置继承自其他配置,本函数会递归解析父配置,父配置会覆盖当前配置。返回最终更新后的configuration。

4. get_configuration函数

参数

  • configuration_name:配置名称,例如2d

过程

根据configuration_name调用self._internal_resolve_configuration_inheritance函数获取正确的配置,根据此配置实例化ConfigurationManager对象并返回它。

另外,本函数使用了装饰器lru_cache,该装饰器缓存最多10个配置结果,提高性能。

5. 其他函数

参数

过程

按照self.plans存储的相应数据函数名称函数参数返回对应的值,过程是查询代码里可能会有一两个函数比较陌生,没关系,它服务于查询,知道这点就足够了。结构较为清晰,不再粘贴代码。

<think>嗯,用户想了解nnUNet预处理方法和流程,并提供了四个相关引用。从引用内容看,信息主要集中在裁剪、重采样、标准化等核心步骤,还涉及版本兼容性问题(V2)和预测结果处理。 用户可能是医学影像领域的研究者或工程师,需要具体的技术细节而非概念性介绍。ta特意强调"不是用户真正需求",暗示希望跳过引用中的冗余信息,直接获取结构化流程。考虑到医学图像预处理直接影响分割效果,用户可能需要实操指导。 梳理引用中的关键点:引用[1][3][4]形成了完整流程链——格式转换→裁剪→重采样→标准化,引用[2]补充了环境配置要求,引用[4]特别强调了归化必须在重采样前执行的顺序约束。需要重点解释这些环节的物理意义,比如裁剪为什么用非零像素而非固定尺寸。 验证环节的缺失值得注意。引用提到可视化预测结果但未说明训练过程中如何验证预处理效果,可能需要补充数据校验机制。另外引用[3]的版本警告提示用户需注意代码兼容性,这点在回答中应强调。 三维医学图像的特殊性需突出:比如各向异性分辨率处理(引用[4]的original_spacing)、多模态配准问题(引用未提及但nnUNet实际支持)。最后要关联到分割性能,说明预处理如何解决医学图像常见噪声、形变等问题。 </think>nnUNet预处理流程是其自动化医学图像分割框架的核心环节,主要围绕**三维医学图像的特性**进行优化。核心流程如下: --- ### 📊 1. **数据格式标准化** - **目的**: 统不同来源数据的格式(如DICOM→NIfTI) - **操作**: - 转换图像为`*.nii.gz`格式 - 检查图像与标签的空间对齐 - 提取元数据(分辨率、方向矩阵) - *引用[1]明确提到需先完成基础格式转换[^1]* --- ### ✂️ 2. **智能裁剪(Crop)** - **策略**: 基于 **非零像素区域** 动态裁剪 - **优势**: - 去除无效背景(如CT图像的黑色边缘) - 减少显存占用,加速训练 - *引用[1][3]强调裁剪是降低计算资源消耗的关键步骤[^1][^3]* --- ### 🔄 3. **重采样(Resample)** - **目标分辨率**: 由nnUNet自动分析数据集决定 - **执行顺序**: ```mermaid graph LR A[原始图像] --> B[归化] --> C[重采样] ``` - **注意事项**: - 图像与分割标签**同步重采样**(标签用最近邻插值) - **归化必须优先于重采样**(引用[4]特别警告顺序不可颠倒[^4]) --- ### 📏 4. **强度归化(Normalization)** - **常用方法**: - **CT图像**: `Z-score标准化` 或 `裁剪到特定百分位(如0.5%-99.5%)` - **MRI图像**: `均值方差归化` 或 `直方图匹配` - **特性**: - 自适应选择归化策略(依赖图像模态) - 通道独立处理(多模态数据) --- ### ⚙️ 5. **实验计划生成(`nnUNet_plan_experiment`)** - **自动化决策**: - 分析数据集统计量(分辨率分布、类别比例) - 确定最优网络结构(2D/3D全卷积或级联模型) - 生成配置文件`nnUNetPlans.json` - **版本兼容性**: - V2版本需重新生成计划文件(引用[3]提示旧版本兼容问题[^3]) --- ### 💡 预处理设计思想 1. **数据驱动**:所有参数(如目标分辨率、裁剪尺寸)由数据集统计特征自动推导 2. **流程标准化**:强制固定执行顺序确保可复现性 3. **模态无关性**:通过归化策略自适应支持CT/MRI/PET等多模态数据 > ⚠️ **关键提示**:预处理流程被封装在`nnUNetv2_plan_and_preprocess`命令中,需在训练前**完整执行次**以生成预处理结果和实验计划[^2][^3]。 --- ### ❓相关问题 1. nnUNet如何自动确定重采样的目标分辨率? 2. 处理多模态医学图像(如CT+MRI融合)时归化策略有何特殊设计? 3. 若数据集包含各向异性分辨率(如0.5×0.5×2mm³),nnUNet预处理如何优化? 4. 如何扩展nnUNet预处理流程以支持自定义模态的医学图像? [^1]: 聚焦裁剪策略的核心价值 [^2]: 环境配置与基础命令 [^3]: 新版计划文件的重要性 [^4]: 归化与重采样的强制顺序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十凯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值