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

### nnUNetv2 预处理步骤及配置教程 #### 1. 数据准备 在使用 `nnUNetv2` 进行医学图像分割之前,需要准备好数据并按照特定的目录结构存储。通常情况下,原始数据会被放置在个指定的路径下,并通过环境变量指向该路径[^1]。 ```bash set nnUNet_raw=D:/DeepLearning/nnUNet/nnUNet_raw ``` 对于 Linux 用户,则可以通过以下方式设置环境变量: ```bash export nnUNet_raw=/path/to/raw/data ``` 这步是为了让框架能够找到输入的数据集位置。 --- #### 2. 创建任务 创建个新的任务涉及将数据转换为 `nnUNet` 的标准格式。具体操作包括编写个脚本或将现有数据手动调整到符合要求的形式。每项任务都需要有对应的文件夹名称,例如 `TaskXXX_Name`,其中 XXX 是三位数的任务编号,Name 是描述性的字符串。 --- #### 3. 启动预处理流程 数据被正确命名和分类,可以运行官方提供的 Python 脚本来启动整个预处理过程。此阶段的主要目的是标准化不同模态间的分辨率差异以及重新采样至统的空间维度。 执行命令如下所示: ```bash nnUNet_plan_and_preprocess -t TaskID --verify_dataset_integrity ``` 这里 `-t` 参数指定了目标任务 ID;而附加选项 `--verify_dataset_integrity` 则用于检测是否存在任何潜在错误或不致之处[^1]。 --- #### 4. 修改预处理参数 (可选) 如果默认设定无法满足项目需求,还可以进步自定义某些超参。比如更改卷积核大小、池化层策略或者加入注意力机制等高级特性。这些都可以通过对相应 JSON 文件中的字段进行编辑实现——就像前面提到过的那样,在实验过程中可能涉及到更新某个具体的 network class name 来适配新的架构设计[^2]: ```json { ... "network_class_name": "dynamic_network_architectures.architectures.skattention.SKAttPlainConvUNet", ... } ``` 上述例子展示了如何引入 SKAttention 模块作为增强功能的部分[^3]。 --- #### 5. 开始训练 当所有的前期准备工作都完成后,最后就是调用实际的训练接口啦! ```bash nnUNet_train 3d_fullres nnFormerTrainerV2 Task004_Hippocampus_plans.nnUNetPlans.json fold_0 ``` 注意这里的各个组成部分分别代表不同的含义:第个参数表示所采用的空间维度模式(此处为三维全分辨率),第二个则是选定好的 trainer 类型名,第三个即为目标 task id 加上规划方案 json 名字组合而成的整体表述形式,最后个则表明当前交叉验证折次序号。 --- ### 总结 综上所述,从基础安装到最后成功部署套完整的基于 nnUNet v2 版本的工作流包含了多个重要环节,每个细节都不容忽视。只有严格遵循既定指南才能确保最终成果达到预期效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

开栈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值