最新nnUNet保姆级使用教程!从环境配置到训练与推理(新手必看),读完我这份《大数据开发开发核心源码精编解析》面试至少多要3K

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

+ - * [nnUNet对于你要训练的数据是有严格要求的,这第一点就体现在我们保存数据的路径上,请初学者务必按照我下面的样式来创建相应的文件夹并存入数据!!!](#nnUNet_100)
+ [四、设置nnUNet读取文件的路径](#nnUNet_128)
+ [五、数据集转换](#_147)
+ - [1.数据集转换是什么,为什么要进行数据集转换?](#1_149)
	- [2.运行数据集转换的命令](#2_232)
	- [3.关于dataset.json文件](#3datasetjson_242)
+ [六、数据预处理](#_250)
+ [七、模型训练](#_270)
+ - [1.写在训练前:更改epoch](#1epoch_272)
	- [2.关于训练的运行命令](#2_280)
	- * [对于我们的Task01来说,应该运行的命令如下](#Task01_300)
		* [下面给出各种配置的nnUNet网络需要的训练命令](#nnUNet_311)
	- [3.训练结果](#3_349)
	- * [下面详细讲讲这些训练后得到的文件都是什么](#_395)
		* [现在我们想看看我们训练的结果怎么样,有两种方法:](#_411)
+ [八、确定最佳U-Net配置](#UNet_434)
+ [九、运行推理](#_450)
+ - [1.准备测试集](#1_452)
	- [2.运行推理的最简单方法是简单地使用下面这一条命令:](#2_462)
	- [3.如果你想集成多个模型的推理结果](#3_478)
+ [十、评估推理结果](#_498)
+ [参考资料](#_522)
+ [码字不易,您的点赞是对我最好的支持,如果有问题也欢迎在评论区或私信与我交流!](#_540)

写在前面

本人初步接触深度学习与医学图像分割领域,第一个项目就是运用nnUNet网络对BrainTumour的数据集进行分割,在学习的过程中,学了很多资料,踩了很多坑,也解决了很多bug,在此把自己的学习经验分享出来,希望有需要的同学可以少走一些弯路。

本篇博客的操作均在服务器的linux系统(Ubuntu)上进行。作者的建议也是使用linux系统。

本篇文章使用的数据集为Medical Segmentation Decathlon比赛的Task01_BrainTumour数据集如果你想训练自己的数据集,请参考我的另一篇博客。
抱歉,今年一直忙着竞赛和保研,现在有时间写了,但是nnUNet v2已经发布,关于v1的教程就有些没必要了,大家可以自行研究v2,欢迎在评论区或私信交流!

才疏学浅,如有错误,欢迎批评指正!!


nnUNet是什么?

nnU-Net是由德国癌症研究中心、海德堡大学以及海德堡大学医院研究人员(Fabian Isensee, Jens Petersen, Andre Klein)提出来的一个自适应任何新数据集的医学影像分割框架,该框架能根据给定数据集的属性自动调整所有超参数,整个过程无需人工干预。仅仅依赖于朴素的U-Net结构(就是原始U-Net)和鲁棒的训练方案,nnU-Net在六个得到公认的分割挑战中实现了最先进的性能。


一、配置虚拟环境

首先,我们想实现nnUNet的使用,需要配置类似如下的环境:

image-20230204135640450


二、安装nnUNet框架

此时,你应该已经配置好了自己的虚拟环境并且可以打印出类似上图的环境版本(可以更高,但最好不要太低),注意,后续的操作均要在你激活你想要使用的那个虚拟环境的前提下进行!!!!

1.安装nnUNet

根据readme文档,这里应该有两种方案可供选择

(1)用作标准化基线、开箱即用的分割算法或使用预训练模型进行推理:

pip install nnunet

(2)用作集成框架(这将在您的计算机上创建nnU-Net代码的副本,以便您可以根据需要对其进行修改)

你想把nnUNet的文件夹放在哪,就在哪个路径下运行这些命令!

git clone https://github.com/MIC-DKFZ/nnUNet.git
cd nnUNet
pip install -e .#最后这个点也不能忽略

对于我来说,因为我后续是要改网络代码的,所以我选择第二种方法,下面详细说明一下这三行命令都是什么意思:

git clone其实就是把人家github上的代码克隆过来,这一步其实和直接复制粘贴代码文件是一样的,总共也就1Mb

cd nnUNet不用说了,就是进入文件夹

其实这个时候就已经有一个nnUNet完整的文件夹了,里面包含这些东西:

image-20230204140026924

最后pip install -e .相当于python setup.py,也就是运行上图这个setup.py文件

这个文件是用来干什么的呢?

  1. 安装nnUNet需要的python包
  2. 向终端添加几个新命令。这些命令用于运行整个nnU-Net pipeline。您可以从系统上的任何位置执行它们。所有nnU-Net命令都带有前缀“nnUNet_”,以便于识别。
这一步我遇到的两个问题:

(1)从github上git clone代码的时候速度慢的离谱(20kb/s),这个问题主要是github的域名在国内被限制了,网上有很多方法解决,比如下面这个网址可以参考https://www.jianshu.com/p/d58ab49ba98b/

(2)运行pip命令的时候速度很慢,这个问题导致我运行pip install -e .的时候超时报错了,同样给出解决方法的链接解决Linux,Ubuntu下使用python包管理工具pip命令安装和下载包速度很慢、失败或者connection timeout等问题_一点儿也不萌的萌萌的博客-CSDN博客_linux 下载python failed: connection timed out.

2.安装隐藏层hiddenlayer(可选)

隐藏层使nnU-net能够给出其生成的网络拓扑图(后面会细说),安装命令如下(这是一整行命令,请务必一起复制粘贴)

pip install --upgrade git+https://github.com/FabianIsensee/hiddenlayer.git@more_plotted_details#egg=hiddenlayer

这里我遇到的唯一问题就是上面说的pip命令速度太慢,也是根据上述解决方案来解决的。


三、数据集准备

nnUNet对于你要训练的数据是有严格要求的,这第一点就体现在我们保存数据的路径上,请初学者务必按照我下面的样式来创建相应的文件夹并存入数据!!!

第一步:你现在应该有一个名为nnUNet的文件夹(上面有图),进入它,在里面创建一个名为nnUNetFrame的文件夹

image-20230204143045892

第二步:在nnUNetFrame文件夹中创建一个名为DATASET的文件夹,后面我们会用它来存放数据

image-20230204143146660

第三步:在DATASET文件夹中创建三个文件夹,它们分别是nnUNet_raw,nnUNet_preprocessed,nnUNet_trained_models

image-20230204143353743

第四步:进入上面第二个文件夹nnUNet_raw,创建nnUNet_cropped_data文件夹和nnUNet_raw_data文件夹,右边存放原始数据,左边存放crop以后的数据。

image-20230204143553859

第五步:进入右边文件夹nnUNet_raw_data,创建一个名为Task01_BrainTumour的文件夹(解释:这个Task01_BrainTumour是nnUNet的作者参加的一个十项全能竞赛的子任务名,也是我要实践的分割任务,类似的还有Task02_Heart,就是分割心脏的。如果你想分割自己的数据集,建议Task_id从500开始,这样以确保不会与nnUNet的预训练模型发生冲突(ID不能超过999))

第六步:将下载好的公开数据集或者自己的数据集放在上面创建好的任务文件夹下,下面还以Task01_BrainTumour竞赛为例,解释下数据应该怎么存放和编辑:

  1. 进入这个网站http://medicaldecathlon.com/.下载对应的数据集(<–网上学科议建<–),取代上面你自己创建的Task01_BrainTumour文件夹。
  2. 你会发现目录是这个样子的:json文件是对三个文件夹内容的字典呈现(关乎你的训练),imagesTr是你的训练数据集,打开后你会发现很多的有序的nii.gz的训练文件,而labelsTr里时对应这个imagesTr的标签文件,同样为nii.gz。目前只能是nii.gz文件,nii文件都不行。训练阶段的imageTs文件夹先不管,其实这个文件夹出现在任何位置都可以。(解释:nnUNet使用的是五折交叉验证,并没有验证集)

2


四、设置nnUNet读取文件的路径

nnUNet是如何知道你的文件存放在哪儿呢,当然要在环境中创建一个路径,这个路径你唯一需要更改的是/nnUNet之前的路径,因为后面的路径你和我是一样的。
第一步:在home目录下按ctrl + h,显示隐藏文件
第二步:找到.bashrc文件,打开
第三步:在文档末尾添加下面三行,保存文件。

export nnUNet_raw_data_base="/home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_raw"
export nnUNet_preprocessed="/home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_preprocessed"
export RESULTS_FOLDER="/home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_trained_models"

​ 第四步:在home下打开终端,输入source .bashrc来更新该文档

现在nnUNet已经知道怎么读取你的文件了。


五、数据集转换

1.数据集转换是什么,为什么要进行数据集转换?

nnUNet要求将原始数据转换成特定的格式,以便了解如何读取和解释数据。

每个分割数据集存储为单独的“任务”。命名包括任务与任务ID,即三位整数和相关联的任务名称。

比如Task001_BrainTumour的任务名称为“脑瘤”,任务ID为1。

在每个任务文件夹中,预期的结构如下:

Task001_BrainTumour/
├── dataset.json
├── imagesTr
├── (imagesTs)
└── labelsTr

图像可能具有多种模态,这对于医学图像来说尤其常见。

nnU-Net通过其后缀(文件名末尾的四位整数)识别成像模态。因此,图像文件必须遵循以下命名约定:case_identifier_XXXX.nii.gz。

这里,XXXX是模态标识符。dataset.json文件中指定了这些标识符所属的模态。

标签文件保存为case_identifier.nii.gz

此命名方案产生以下文件夹结构。用户有责任将其数据转换为这种格式!

下面是MSD的第一个任务的示例:BrainTumor。每个图像有四种模态:FLAIR(0000)、T1w(0001)、T1gd(0002)和T2w(0003)。请注意,imagesTs文件夹是可选的,不必存在。

nnUNet_raw_data_base/nnUNet_raw_data/Task001_BrainTumour/
├── dataset.json
├── imagesTr
│   ├── BRATS_001_0000.nii.gz
│   ├── BRATS_001_0001.nii.gz
│   ├── BRATS_001_0002.nii.gz
│   ├── BRATS_001_0003.nii.gz
│   ├── BRATS_002_0000.nii.gz
│   ├── BRATS_002_0001.nii.gz
│   ├── BRATS_002_0002.nii.gz
│   ├── BRATS_002_0003.nii.gz
│   ├── BRATS_003_0000.nii.gz
│   ├── BRATS_003_0001.nii.gz
│   ├── BRATS_003_0002.nii.gz
│   ├── BRATS_003_0003.nii.gz
│   ├── BRATS_004_0000.nii.gz
│   ├── BRATS_004_0001.nii.gz
│   ├── BRATS_004_0002.nii.gz
│   ├── BRATS_004_0003.nii.gz
│   ├── ...
├── imagesTs
│   ├── BRATS_485_0000.nii.gz
│   ├── BRATS_485_0001.nii.gz
│   ├── BRATS_485_0002.nii.gz
│   ├── BRATS_485_0003.nii.gz
│   ├── BRATS_486_0000.nii.gz
│   ├── BRATS_486_0001.nii.gz
│   ├── BRATS_486_0002.nii.gz
│   ├── BRATS_486_0003.nii.gz
│   ├── BRATS_487_0000.nii.gz
│   ├── BRATS_487_0001.nii.gz
│   ├── BRATS_487_0002.nii.gz
│   ├── BRATS_487_0003.nii.gz
│   ├── BRATS_488_0000.nii.gz
│   ├── BRATS_488_0001.nii.gz
│   ├── BRATS_488_0002.nii.gz
│   ├── BRATS_488_0003.nii.gz
│   ├── BRATS_489_0000.nii.gz
│   ├── BRATS_489_0001.nii.gz
│   ├── BRATS_489_0002.nii.gz
│   ├── BRATS_489_0003.nii.gz
│   ├── ...
└── labelsTr
    ├── BRATS_001.nii.gz
    ├── BRATS_002.nii.gz
    ├── BRATS_003.nii.gz
    ├── BRATS_004.nii.gz
    ├── ...

如果对于数据集转换这件事还是不明白,打开你的nnUNet文件夹,在/nnUNet/documentation/文件夹下找到dataset_conversion这个文件来进一步学习。

2.运行数据集转换的命令

依旧以Task01_BrainTumour为例:

nnUNet_convert_decathlon_task -i /home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task01_BrainTumour

转换操作完成以后,你会发现在你的Task01_BrainTumour文件夹旁边,出现了一个Task001_BrainTumour文件夹,打开看一下,里面的格式应该和我上面展示的一样。

3.关于dataset.json文件

这个文件包含你的训练数据信息和任务信息,如果你按照我的建议下载了Task01的数据集,那里面是包含dataset.json文件的,如果你有训练自己的数据集的需求,在我的另一篇博客里会有详细的说明。

image-20230204150409185


六、数据预处理

nnUNet_plan_and_preprocess -t 1 --verify_dataset_integrity

只需要一行命令,因为我们的Task_id是1,所以这里的数字就是1。这个过程会消耗很多的时间,速度慢的原因在于对要进行插值等各种操作。

根据nnUNet框架,三维医学图像分割的通用预处理可以分为四步,分别是数据格式的转换,裁剪crop,重采样resample以及标准化normalization。如果你想进一步学习,推荐学习这篇文章如何针对三维医学图像分割任务进行通用数据预处理:nnUNet中预处理流程总结及代码分析 - 知乎 (zhihu.com)

运行“nnUNet_plan_and_preprocess”将使用预处理数据填充文件夹。

我们将在nnUNet_preprocessed/Task001_BrainTumour中找到这条命令的输出结果。使用2D U-Net以及所有适用的3D U-Net的预处理数据创建子文件夹。它还将为2D和3D配置创建“plans”文件(结尾为.pkl)。这些文件包含生成的分割 pipeline 配置,将由nnUNetTrainer读取(见下文)。请注意,预处理的数据文件夹仅包含训练案例。测试图像没有经过预处理。测试集的预处理将会在推理过程中实时进行。

image-20230204151403253

另外,`–verify_dataset_integrity”应至少在给定数据集上首次运行命令时运行。这将对数据集执行一些检查,以确保其与nnU-Net兼容。如果此检查通过一次,则可以在以后的运行中省略。如果您遵守数据集转换指南(请参见上文),那么这条命令一定会通过的。


七、模型训练

1.写在训练前:更改epoch

nnUNet默认原始的epoch是1000,这太久了,我们打开nnUNet/nnunet/training/network_training/nnUNetTrainerV2.py

第48行的max_epoch来修改epoch

image-20230204154948501

2.关于训练的运行命令

nnU-Net在5倍交叉验证中训练所有U-Net配置。这使nnU-Net能够确定训练数据集的后处理和集合(参见下文)。

如果你不清楚什么是K折交叉验证,可以学习这篇博客【技术分享】什么是K折交叉验证?_AISec盐究员的博客-CSDN博客_k折交叉验证

我们在数据预处理那一步的时候创建了三个U-Net配置:2D U-Net、对全分辨率图像进行操作的3D U-Net以及3D U-Net级联,其中级联的第一个U-Net在下采样图像中创建粗分割图,然后由第二个U-Net进行细化。我们在训练的时候可以自由选用它们。

训练模型使用“nnUNet_train”命令完成。命令的一般结构为

nnUNet_train CONFIGURATION TRAINER_CLASS_NAME TASK_NAME_OR_ID FOLD  --npz (additional options)

  1. CONFIGURATION是一个字符串,用于标识所请求的U-Net配置。
  2. TRAINER_CLASS_NAME是model trainer的名称。如果您实施定制trainers(nnU-Net作为一个框架),您可以在此处指定您的定制trainers。
  3. TASK_NAME_OR_ID指定应训练的数据集,FOLD指定训练的是5倍交叉验证的哪一倍。
  4. “–npz”使模型在最终验证期间保存softmax输出。它仅适用于计划在之后运行“nnUNet_find_best_configuration”的训练
    (这是nnU Nets自动选择最佳性能(集合)配置,见下文)。
对于我们的Task01来说,应该运行的命令如下
nnUNet_train 3d_fullres nnUNetTrainerV2 1 0 --npz

  • 3d_fullres代表我们选用对全分辨率图像进行操作的3D U-Net
  • nnUNetTrainerV2是我们选用的训练器
  • 1代表你的任务ID
  • 0代表五折交叉验证中的第0折
下面给出各种配置的nnUNet网络需要的训练命令

2D U-Net

For FOLD in [0, 1, 2, 3, 4], run:

nnUNet_train 2d nnUNetTrainerV2 TaskXXX_MYTASK FOLD --npz

3D full resolution U-Net 3D全分辨率U-Net

For FOLD in [0, 1, 2, 3, 4], run:

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

[0, 1, 2, 3, 4], run:

nnUNet_train 2d nnUNetTrainerV2 TaskXXX_MYTASK FOLD --npz

3D full resolution U-Net 3D全分辨率U-Net

For FOLD in [0, 1, 2, 3, 4], run:

[外链图片转存中…(img-z0HuPFcg-1715812258912)]
[外链图片转存中…(img-HodouPbr-1715812258913)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于nnUNet使用教程,我可以为你提供一些基本的指导。nnUNet是一个用于医学图像分割的开源框架,旨在简化深度学习模型在医学图像上的训练推理过程。 以下是一个简单的nnUNet使用教程的大纲: 1. 安装nnUNet:首先,你需要安装nnUNet框架。你可以在nnUNet的GitHub页面找到安装说明。 2. 数据准备:准备你的医学图像数据集。确保你的数据集包含正确的标签,并将其划分为训练集、验证集和测试集。 3. 数据预处理:nnUNet要求对数据进行预处理,包括将图像和标签裁剪为相同大小、进行数据增强等。你可以使用nnUNet提供的预处理脚本来完成这些操作。 4. 配置实验:创建一个配置文件来定义你的实验设置。在配置文件中,你需要指定数据路径、模型架构、训练参数等。 5. 训练模型:使用nnUNet提供的训练脚本开始训练模型。根据你的配置文件,nnUNet将自动加载数据并开始训练。 6. 模型评估:在训练完成后,你可以使用nnUNet提供的评估脚本评估模型在测试集上的性能。 7. 模型推理:使用已经训练好的模型进行推理nnUNet提供了推理脚本,你可以使用它来对新的医学图像进行分割。 请注意,这只是一个简要的教程大纲。如果你需要更详细的教程或遇到特定问题,请参考nnUNet的文档或在相关论坛上寻求帮助。祝你成功使用nnUNet进行医学图像分割!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值