全网都在用的nnUNet V2版本改进了啥,怎么安装?(一)

nnUNet,这个医学领域的分割巨无霸!在论文和比赛中随处可见他的身影。大家对于nnUNet v1版本的教程都赞不绝口,因为它简单易懂、详细全面,让很多朋友都轻松掌握了使用方法。

最近,我也抽出时间仔细研究了nnUNet v2,并全程走过一遍流程。我努力将使用教程变得更加通俗易懂,希望能提高大家的学习效率。如果你正在进行分割任务,或者还没有尝试过nnUNet v2,那么现在是时候跟着我一起学习啦!

我们将一步步解析nnUNet v2的改进之处和操作步骤,用简洁明快的语言让你轻松理解。无论你是医学专业背景还是计算机科学领域的新手,都能够轻松上手,掌握这个强大的工具。

内容稍长,我把它分为三个章节,拆解难点

  • nnUNet v2的不同之处,安装以及环境变量设置(这次内容)
  • nnUNet v2的数据准备(下一篇)
  • nnUNet v2的训练及推理(下下篇)

nnUNet v2版本与V1版有什么不同?

  • 支持层次标签 ‘hierarchical labels’(在nnUNet中称为 ‘regions’)。例如,在 BraTS 这个数据集中,给定的 label 是“水肿”、“坏死”和“增强肿瘤”。但是对于临床应用而言,他们关注的不是这三个 label,而是整个肿瘤、肿瘤核心和增强肿瘤。 那么,这里的整个肿瘤就是 水肿+坏死+增强肿瘤; 肿瘤核心是 坏死+增强肿瘤。如果想按临床的这个进行分割,他的 label 是有重叠的。如下图:

    适用于某些有重叠任务的分割,具体详见 github

  • 支持跨平台, Cuda, mps (Apple M1/M2) and CPU

  • 支持更多的输入/输出数据格式。

  • 通过基于 BaseReaderWriter 实现新的适配器,可以扩展I/O格式。

  • nnUNet_raw_cropped 文件夹不再存在,这样可以节省磁盘空间,而且没有性能损失

  • 在解压缩时,预处理数据和分割结果存储在不同的文件中。分割结果以int8的格式存储,因此每个像素占用的磁盘空间(和I/O吞吐量)只有v1版本的四分之一。

  • 原生支持多GPU(DDP)训练。但是,多GPU推断仍然需要使用 CUDA_VISIBLE_DEVICES=X nnUNetv2_predict [...] -num_parts Y -part_id X 来运行。在推断过程中,没有跨GPU的通信,所以增加DDP会增加额外的复杂性是没有意义的。

  • 所有nnU-Net的功能现在也可以通过API进行访问。请查看 setup.py 中对应的入口点,以了解需要调用哪些函数。

  • 数据集指纹现在明确地创建并保存在一个json文件中(参见nnUNet_preprocessed文件夹)。

其实大改动不多,如果你只是一个初级用户,很多改进功能根本用不到。

如何安装

虽然 官方说 nnunet 的两个版本可以同时使用,但我还是建议将两个版本分开,放在不同的虚拟环境中。

安装需求

  • 操作系统:nnU-Net 已在 Linux(Ubuntu 18.04、20.04、22.04;centOS、RHEL)、Windows 和 MacOS 上进行了测试!它应该开箱即用!
  • 硬件要求:GPU(推荐)、CPU 和 Apple M1/M2 作为设备(目前 Apple mps 不实现 3D 卷积,因此您可能必须在这些设备上使用 CPU)。
  • Python 3.9 或更高版本
    在第一版本中,nnunet v1 安装教程介绍了如何在虚拟环境中安装 nnUNet, 但是略显复杂。这一次直接用 conda 安装

安装步骤

  1. 首先新建一个 conda 环境,命名为 nnunet2(名字由你决定)
conda create -n nnunet2 python==3.9
  1. 激活该环境,并安装 nnunetv2
conda activate nnunet2
pip install nnunetv2

设置环境变量/路径

nnU-Net 依靠环境变量来了解原始数据、预处理数据和训练模型权重的存储位置。要使用 nnU-Net 的完整功能,必须设置以下三个环境变量:

V1,v2 版本中路径有所不同。如果你已经装了 V1 版本,那么 V2 版本的路径最好和 V1不同,以防打架。

具体地,V2 应该包含以下三个路径:

  1. nnUNet_raw:这是放置原始数据集的地方。该文件夹将为每个数据集名称创建一个子文件夹
    DatasetXXX_YYY,其中 XXX 是 3 位标识符(例如 001、002、043、999…),YYY 是(唯一)
    数据集名称。数据集必须采用 nnU-Net 格式

    树结构示例:

    nnUNet_raw/Dataset001_NAME1
    ├── dataset.json
    ├── imagesTr
    │   ├── ...
    ├── imagesTs
    │   ├── ...
    └── labelsTr
        ├── ...
    nnUNet_raw/Dataset002_NAME2
    ├── dataset.json
    ├── imagesTr
    │   ├── ...
    ├── imagesTs
    │   ├── ...
    └── labelsTr
        ├── ...
    
  2. nnUNet_preprocessed:这是保存预处理数据的文件夹。数据也将从中读取
    训练期间使用此文件夹。重要的是,该文件夹位于访问延迟低且高的驱动器上
    吞吐量

  3. nnUNet_results:指定 nnU-Net 保存模型权重的位置。如果下载了预训练模型,则此
    就是保存他们的地方。

V1 版本的路径设置见之前的文章:给出了永久设置环境变量的方法
nnU-Net v1 如何安装–傻瓜式安装教程

注意:如果设置永久变量的话,V1和V2版本都安装了的话,其实有一个文件夹命名是相同的(nnUNet_preprocessed),那你调用的时候就分不清 V1和V2的文件夹了。

这里,再给一种更方便的临时路径设置办法

  • step1: 创建一个 setPath.sh 文件,里面包含如下内容,
#!/bin/bash

export nnUNet_raw="/media/nunet2_folder/nnUNet_raw"
export nnUNet_preprocessed="/media/nnunet2_folder/nnUNet_preprocessed"
export nnUNet_results="/media/nnunet2_folder/nnUNet_results"

tips:怎么创建一个setPath.sh文件
要创建一个名为"setPath.sh"的文件,你可以按照以下步骤进行操作:

  1. 打开一个文本编辑器,例如记事本或者终端上的文本编辑器。

  2. 创建一个新的空白文件。

  3. 在文件中输入上述内容

  4. 保存并关闭文件。

当然,前提是,你要手动创建这个三个文件夹,再把地址告诉环境变量

  • step2: 每次运行 nnunetv2 之前运行一下此文件
source setPath.sh
  • step3: 检验是否起效
echo $nnUNet_results

如果返回的是我们设置的地址,则起效

V1和V2路径对比如下

好了,炼丹炉已就位。带上你的数据,下一篇进行数据预处理。

文章持续更新,可以关注微信公众号【医学图像人工智能实战营】获取最新动态,一个关注于医学图像处理领域前沿科技的公众号。坚持已实践为主,手把手带你做项目,打比赛,写论文。凡原创文章皆提供理论讲解,实验代码,实验数据。只有实践才能成长的更快,关注我们,一起学习进步~

我是Tina, 我们下篇博客见~

白天工作晚上写文,呕心沥血

觉得写的不错的话最后,求点赞,评论,收藏。或者一键三连
在这里插入图片描述

<think>好的,用户想要优化和改进nnUNet的性能。首先,我需要回顾nnUNet的基本结构和特点。根据引用[4],nnUNet是基于传统的U-Net框架,没有引入复杂的结构设计,而是通过自适应数据配置和参数调优来提升性能。因此,优化方向可能集中在数据预处理、训练策略、后处理等方面。 接下来,用户提供的引用中提到了几个关键点。引用[1]和[4]都强调了调参的重要性,所以调优超参数是必须考虑的。比如学习率、损失函数的选择,或者数据增强策略的优化。引用[2]提到nnUNet使用交叉验证选择最佳配置,这可能意味着集成学习或交叉验证策略的调整可以带来提升。 然后,引用[3]讨论了UpKern结合大内核提升性能,说明网络结构的微小调整可能有帮助。虽然nnUNet本身不引入新结构,但或许可以尝试不同的卷积核大小或上采样方法。不过需要注意,引用[3]提到单纯增加训练次数并不有效,所以结构改动需谨慎。 另外,引用[2]提到后处理步骤中的“non-largest component suppression”,改进后处理可能也是个方向。例如,采用更复杂的形态学操作或基于区域的后处理算法。 还要考虑数据方面的问题。nnUNet的自适应预处理是其优势,但针对特定数据集是否有特殊处理需求?比如调整patch大小或数据归化方法。此外,数据增强的多样性是否足够,是否需要添加新的增强方式? 训练策略方面,引用[4]指出模型之外的参数常被忽视,因此优化训练时的优化器设置、学习率调度、正则化方法(如权重衰减、Dropout)可能有效。另外,混合精度训练或分布式训练可以加速训练,从而允许更多实验迭代。 模型集成方面,引用[2]提到nnUNet会集成不同配置的模型,所以尝试不同的U-Net变体(如2D、3D、级联)的集成,或者结合其他模型的预测结果,可能提升性能。 最后,结合最新的研究进展,比如引入轻量级的注意力机制或动态卷积,可能在不显著增加计算量的情况下提升效果。但需要测试这些改动是否适合特定任务,避免负面影响。 总结可能的优化点:数据增强、超参数调优、后处理改进、训练策略优化、模型集成、结构微调。需要逐验证这些方向的有效性,确保改动确实带来提升而不破坏nnUNet的自适应优势。</think>### nnUNet性能优化与改进方法 #### 1. **数据预处理与增强优化** - **自适应数据标准化**:根据引用[4],nnUNet会根据数据特性自动配置预处理参数。可针对特定任务调整归化范围或标准化方法,例如对MRI数据采用特定序列的强度归化。 - **增强策略扩展**:在默认的空间变换(旋转、缩放)基础上,可添加医学影像特有的增强方式,如模拟病灶形态变化的弹性变形或噪声注入[^4]。 #### 2. **网络结构微调** - **卷积核尺寸调整**:引用[3]指出大内核卷积(如5×5)能提升性能,可在下采样路径中尝试增大卷积核,但需平衡计算开销。例如将默认的3×3卷积改为5×5与3×3的组合。 - **上采样优化**:在解码器部分测试转置卷积、线性插值或PixelShuffle等不同上采样方式,结合引用[3]提到的UpKern(上采样+卷积)策略。 #### 3. **训练策略改进** - **动态学习率调度**:在默认的“poly”学习率衰减基础上,尝试余弦退火或OneCycle策略,例如: ```python scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=0.01, steps_per_epoch=len(dataloader), epochs=100) ``` - **混合损失函数**:在Dice损失基础上添加Focal Loss或边界敏感损失: $$L_{total} = \alpha L_{Dice} + \beta L_{Focal} + \gamma L_{Boundary}$$ 需通过交叉验证确定系数组合[^1]。 #### 4. **后处理强化** - **多模态融合**:对级联模型(引用[2]提到的全分辨率U-Net)的输出进行概率图加权融合,例如: $$P_{final} = 0.6P_{low-res} + 0.4P_{high-res}$$ - **形态学优化**:在默认的non-largest component suppression基础上,添加基于连通域大小的过滤或空洞填充操作。 #### 5. **模型集成与选择** - **交叉验证策略**:根据引用[2],可通过增加交叉验证折数(如从5折到10折)提升模型选择可靠性。 - **异构模型集成**:同时训练2D、3D和级联U-Net变体,并通过投票机制集成预测结果。 #### 6. **计算效率优化** - **动态Patch采样**:根据GPU显存自动调整输入块大小,例如: ```python patch_size = [min(192, GPU_mem//1000), min(192, GPU_mem//1000), min(80, GPU_mem//2000)] ``` - **梯度累积**:在显存不足时使用梯度累积技术,保持等效batch size稳定。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Tina姐

我就看看有没有会打赏我

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

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

打赏作者

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

抵扣说明:

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

余额充值