ToB企服应用市场:ToB评测及商务社交产业平台

标题: nnUNet保姆级使用教程!从情况配置到练习与推理(新手必看) [打印本页]

作者: 惊落一身雪    时间: 2024-6-22 12:58
标题: nnUNet保姆级使用教程!从情况配置到练习与推理(新手必看)

写在前面

本人开端接触深度学习与医学图像分割范畴,第一个项目就是运用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的使用,需要配置类似如下的情况:



二、安装nnUNet框架

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

根据readme文档,这里应该有两种方案可供选择
(1)用作标准化基线、开箱即用的分割算法或使用预练习模子进行推理:
  1. pip install nnunet
复制代码
(2)用作集成框架(这将在您的计算机上创建nnU-Net代码的副本,以便您可以根据需要对其进行修改)
你想把nnUNet的文件夹放在哪,就在哪个路径下运行这些命令!
  1. git clone https://github.com/MIC-DKFZ/nnUNet.git
  2. cd nnUNet
  3. pip install -e .#最后这个点也不能忽略
复制代码
对于我来说,由于我后续是要改网络代码的,以是我选择第二种方法,下面详细阐明一下这三行命令都是什么意思:
git clone着实就是把人家github上的代码克隆过来,这一步着实和直接复制粘贴代码文件是一样的,总共也就1Mb
cd nnUNet不用说了,就是进入文件夹
着实这个时候就已经有一个nnUNet完整的文件夹了,里面包含这些东西:

末了pip install -e .相称于python setup.py,也就是运行上图这个setup.py文件
这个文件是用来干什么的呢?
这一步我遇到的两个题目:

(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能够给出其天生的网络拓扑图(背面会细说),安装命令如下(这是一整行命令,请务必一起复制粘贴)
  1. pip install --upgrade git+https://github.com/FabianIsensee/hiddenlayer.git@more_plotted_details#egg=hiddenlayer
复制代码
这里我遇到的唯一题目就是上面说的pip命令速度太慢,也是根据上述办理方案来办理的。

三、数据集准备

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

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

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

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

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

第五步:进入右边文件夹nnUNet_raw_data,创建一个名为Task01_BrainTumour的文件夹(表明:这个Task01_BrainTumour是nnUNet的作者到场的一个十项全能竞赛的子任务名,也是我要实践的分割任务,类似的还有Task02_Heart,就是分割心脏的。假如你想分割自己的数据集,发起Task_id从500开始,如许以确保不会与nnUNet的预练习模子发生冲突(ID不能高出999))
第六步:将下载好的公开数据集或者自己的数据集放在上面创建好的任务文件夹下,下面还以Task01_BrainTumour竞赛为例,表明下数据应该怎么存放和编辑:


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

nnUNet是怎样知道你的文件存放在哪儿呢,当然要在情况中创建一个路径,这个路径你唯一需要更改的是/nnUNet之前的路径,由于背面的路径你和我是一样的。
第一步:在home目录下按ctrl + h,显示隐藏文件
第二步:找到.bashrc文件,打开
第三步:在文档末尾添加下面三行,保存文件。
  1. export nnUNet_raw_data_base="/home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_raw"
  2. export nnUNet_preprocessed="/home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_preprocessed"
  3. export RESULTS_FOLDER="/home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_trained_models"
复制代码
​ 第四步:在home下打开终端,输入source .bashrc来更新该文档
现在nnUNet已经知道怎么读取你的文件了。

五、数据集转换

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

nnUNet要求将原始数据转换成特定的格式,以便相识怎样读取和表明数据。
每个分割数据集存储为单独的“任务”。命名包括任务与任务ID,即三位整数和相关联的任务名称。
比如Task001_BrainTumour的任务名称为“脑瘤”,任务ID为1。
在每个任务文件夹中,预期的结构如下:
  1. Task001_BrainTumour/
  2. ├── dataset.json
  3. ├── imagesTr
  4. ├── (imagesTs)
  5. └── 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文件夹是可选的,不必存在。
  1. nnUNet_raw_data_base/nnUNet_raw_data/Task001_BrainTumour/
  2. ├── dataset.json
  3. ├── imagesTr
  4. │   ├── BRATS_001_0000.nii.gz
  5. │   ├── BRATS_001_0001.nii.gz
  6. │   ├── BRATS_001_0002.nii.gz
  7. │   ├── BRATS_001_0003.nii.gz
  8. │   ├── BRATS_002_0000.nii.gz
  9. │   ├── BRATS_002_0001.nii.gz
  10. │   ├── BRATS_002_0002.nii.gz
  11. │   ├── BRATS_002_0003.nii.gz
  12. │   ├── BRATS_003_0000.nii.gz
  13. │   ├── BRATS_003_0001.nii.gz
  14. │   ├── BRATS_003_0002.nii.gz
  15. │   ├── BRATS_003_0003.nii.gz
  16. │   ├── BRATS_004_0000.nii.gz
  17. │   ├── BRATS_004_0001.nii.gz
  18. │   ├── BRATS_004_0002.nii.gz
  19. │   ├── BRATS_004_0003.nii.gz
  20. │   ├── ...
  21. ├── imagesTs
  22. │   ├── BRATS_485_0000.nii.gz
  23. │   ├── BRATS_485_0001.nii.gz
  24. │   ├── BRATS_485_0002.nii.gz
  25. │   ├── BRATS_485_0003.nii.gz
  26. │   ├── BRATS_486_0000.nii.gz
  27. │   ├── BRATS_486_0001.nii.gz
  28. │   ├── BRATS_486_0002.nii.gz
  29. │   ├── BRATS_486_0003.nii.gz
  30. │   ├── BRATS_487_0000.nii.gz
  31. │   ├── BRATS_487_0001.nii.gz
  32. │   ├── BRATS_487_0002.nii.gz
  33. │   ├── BRATS_487_0003.nii.gz
  34. │   ├── BRATS_488_0000.nii.gz
  35. │   ├── BRATS_488_0001.nii.gz
  36. │   ├── BRATS_488_0002.nii.gz
  37. │   ├── BRATS_488_0003.nii.gz
  38. │   ├── BRATS_489_0000.nii.gz
  39. │   ├── BRATS_489_0001.nii.gz
  40. │   ├── BRATS_489_0002.nii.gz
  41. │   ├── BRATS_489_0003.nii.gz
  42. │   ├── ...
  43. └── labelsTr
  44.     ├── BRATS_001.nii.gz
  45.     ├── BRATS_002.nii.gz
  46.     ├── BRATS_003.nii.gz
  47.     ├── BRATS_004.nii.gz
  48.     ├── ...
复制代码
假如对于数据集转换这件事照旧不明白,打开你的nnUNet文件夹,在/nnUNet/documentation/文件夹下找到dataset_conversion这个文件来进一步学习。
2.运行数据集转换的命令

仍旧以Task01_BrainTumour为例:
  1. 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文件的,假如你有练习自己的数据集的需求,在我的另一篇博客里会有详细的阐明。


六、数据预处理

  1. 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读取(见下文)。请留意,预处理的数据文件夹仅包含练习案例。测试图像没有经过预处理。测试集的预处理将会在推理过程中实时进行。

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

七、模子练习

1.写在练习前:更改epoch

nnUNet默认原始的epoch是1000,这太久了,我们打开nnUNet/nnunet/training/network_training/nnUNetTrainerV2.py
第48行的max_epoch来修改epoch

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”命令完成。命令的一般结构为
  1. nnUNet_train CONFIGURATION TRAINER_CLASS_NAME TASK_NAME_OR_ID FOLD  --npz (additional options)
复制代码
对于我们的Task01来说,应该运行的命令如下

  1. nnUNet_train 3d_fullres nnUNetTrainerV2 1 0 --npz
复制代码

下面给出各种配置的nnUNet网络需要的练习命令

2D U-Net
For FOLD in [0, 1, 2, 3, 4], run:
  1. 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:
  1. nnUNet_train 3d_fullres nnUNetTrainerV2 TaskXXX_MYTASK FOLD --npz
复制代码
3D U-Net cascade 3D U-net级联
①3D low resolution U-Net
For FOLD in [0, 1, 2, 3, 4], run:
  1. nnUNet_train 3d_lowres nnUNetTrainerV2 TaskXXX_MYTASK FOLD --npz
复制代码
②3D full resolution U-Net
For FOLD in [0, 1, 2, 3, 4], run:
  1. nnUNet_train 3d_cascade_fullres nnUNetTrainerV2CascadeFullRes TaskXXX_MYTASK FOLD --npz
复制代码
留意,级联的3D全分辨率U-Net需要预先完成低分辨率U-Net的five folds!
3.练习结果

练习后的模子将写入RESULTS_FOLDER/nnUNet文件夹。对于我们的项目来说,就是会存在/home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_trained_models/nnUNet这个路径下。
每次练习都会获得一个自动天生的输出文件夹名称,根据我们的练习配置,我们会得到3d_fullres/Task001_BrainTumour这个文件夹。关于它的树状图如下(为简便起见,有些文件仅在一个文件夹下详细展开):
  1. RESULTS_FOLDER/nnUNet/
  2. ├── 2d
  3. │   └── Task001_BrainTumour
  4. │       └── nnUNetTrainerV2__nnUNetPlansv2.1
  5. │           ├── fold_0
  6. │           ├── fold_1
  7. │           ├── fold_2
  8. │           ├── fold_3
  9. │           └── fold_4
  10. ├── 3d_cascade_fullres
  11. ├── 3d_fullres
  12. │   └── Task001_BrainTumour
  13. │       └── nnUNetTrainerV2__nnUNetPlansv2.1
  14. │           ├── fold_0
  15. │           │   ├── debug.json
  16. │           │   ├── model_best.model
  17. │           │   ├── model_best.model.pkl
  18. │           │   ├── model_final_checkpoint.model
  19. │           │   ├── model_final_checkpoint.model.pkl
  20. │           │   ├── network_architecture.pdf
  21. │           │   ├── progress.png
  22. │           │   └── validation_raw
  23. │           │       ├── BRATS_010.nii.gz
  24. │           │       ├── BRATS_010.pkl
  25. │           │       ├── BRATS_018.nii.gz
  26. │           │       ├── BRATS_018.pkl
  27. │           │       ├── summary.json
  28. │           │       └── validation_args.json
  29. │           ├── fold_1
  30. │           ├── fold_2
  31. │           ├── fold_3
  32. │           └── fold_4
  33. └── 3d_lowres
复制代码
假如你的练习成功了,应该会得到和我下图一样的结果

下面详细讲讲这些练习后得到的文件都是什么


现在我们想看看我们练习的结果怎么样,有两种方法:

第一种是打开progress.png来从图像上直观的感受一下,它大概长如许:
第二种是打开validation_raw/summary.json,从里面我们不仅可以看到对每一个验证数据的评价,更可以在最末尾看到它们的平均值。
这里我们主要关注这个Dice分数,之前说到了脑瘤数据集分为四个模态,而labels的数量也是4(拜见dataset.json):
  1. "labels": {
  2. "0": "background",
  3. "1": "edema",
  4. "2": "non-enhancing tumor",
  5. "3": "enhancing tumour"
复制代码
包含配景在内的4个标签,分别是配景、坏疽(NET,non-enhancing tumor)、浮肿区域(ED,peritumoral edema)、增强肿瘤区域(ET,enhancing tumor),如下图,它们的平均dice分数约为0.9994,0.8770,0.7780,0.8728


八、确定最佳U-Net配置

本文只阐明了3d_fullres的练习,完整的nnUNet流程还需要跑2d和3d级联的,然后进行三种的择优。不外从实际性能来说,一般3d级联≥3d>2d,是否跑其他两种需要自己考虑。
练习完所有模子后,使用以下命令自动确定用于测试集预测的U-Net配置:
  1. nnUNet_find_best_configuration -m 2d 3d_fullres 3d_lowres 3d_cascade_fullres -t 1
复制代码
以是说,假如你练习完所有模子,才可以使用这一步,假如没有,那可以直接推理

九、运行推理

1.准备测试集

让我们回到你刚刚做好数据集转换的那个数据集:/home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task001_BrainTumour,在里面创建inferTs这个文件夹,用于存放待推理测试集的推理结果。然后,我会选择将本来的imagesTs重命名为imagesTs0,它是我们下载数据集时给我们的几十个测试集,然后新建一个imagesTs,里面只放一个测试集。(表明:这个道理着实很明显,推理太多数据集太久了,先用一个试试)

这个时候我们在imagesTs里存放的待推理的测试集,它的格式应该是经过数据集转换那一步的格式,忘记了的话可以翻上去看一下,如下图所示,四个模态都要有,且重命名过:

2.运行推理的最简单方法是简单地使用下面这一条命令:

  1. nnUNet_predict -i 要预测数据的文件夹路径 -o 输出文件夹路径 -t 1 -m 3d_fullres -f 0
复制代码
对于我们这个项目,它就应该是:
  1. nnUNet_predict -i /home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task001_BrainTumour/imagesTs/ -o /home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task001_BrainTumour/inferTs -t 1 -m 3d_fullres -f 0
复制代码
你会在inferTs里得到模子天生的预测结果

3.假如你想集成多个模子的推理结果

假如你已经练习出了多个模子,而且像上一步一样进行了推理,现在你想集成它们的推理结果,首先需要在上面的命令背面加入“–save_npz”。`–save_npz”将任务令保存softmax概率以及需要大量磁盘空间的预测分割掩码。
然后请为每个配置选择单独的“OUTPUT_FOLDER”!
末了使用以下命令聚集来自多个配置的预测:
  1. nnUNet_ensemble -f FOLDER1 FOLDER2 ... -o OUTPUT_FOLDER -pp POSTPROCESSING_FILE
复制代码
您可以指定恣意数量的文件夹,但请记着,每个文件夹都需要包含由“nnUNet_predict”天生的npz文件。对于集成,还可以指定一个文件,告诉命令怎样进行后处理。
这些文件是在运行“nnUNet_find_best_configuration”时创建的,位于相应的练习模子目录中(RESULTS_FOLDER/nnUNet/CONFIGURATION/TaskXXX_MYTASK/TRAINER_CLASS_NAMEPLANS_FILE_IDENTIFIER/postprocessing.json or
RESULTS_FOLDER/nnUNet/ensembles/TaskXXX_MYTASK/ensemble_XYZ–XY__Z/postprocessing.json).
您也可以选择不提供文件(只需省略-pp),nnU-Net将不会运行后处理。
因此,在运行集成推理之前,必须对所有5个折进行练习。在推理开始时,将打印找到的可用的nnU-Net folds列表。

十、评估推理结果

仍旧是一行命令完成
  1. nnUNet_evaluate_folder -ref 金标准文件夹 -pred 预测结果文件夹 -l 1 2 3
复制代码
-l 表示要计算的label的类别,正常就是配景-0肿瘤-1,以是设置1,假如有两类就是 -l 1 2,以此类推,以是我们这里是1 2 3
这个是nnUNet自带的评估命令,计算分割DSC,可以不用这个,另写代码去算需要的评估指标即可
我在相应路径下创建了seg_0文件夹和seg_p文件夹,分别用来存放金标准和预测结果

运行如下命令
  1. nnUNet_evaluate_folder -ref /home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task001_BrainTumour/seg_0 -pred /home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task001_BrainTumour/seg_p -l 1 2 3
复制代码
在seg_p文件夹中,我们会得到和练习结果文件夹里validation_raw/summary.json一样格式的summary.json文件,它包含了每一个评估数据的指标,文档末尾是其平均值。

参考资料

https://blog.csdn.net/u014264373/article/details/116792649
(四:2020.07.28)nnUNet最舒服的练习教程(让我的奶奶也会用nnUNet(上))(21.04.20更新)_花卷汤圆的博客-CSDN博客_nnuet
(五:2020.07.31)nnUNet最简单的推理教程(让我的奶奶也会用nnUNet(下))_花卷汤圆的博客-CSDN博客_nnunet推理
医学图像分割 3D nnUNet全流程快速实现_打南边来了个阿楠的博客-CSDN博客
论文解读- nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation(附实现教程)_Tina姐的博客-CSDN博客
医学图像分割 3D nnUNet全流程快速实现_打南边来了个阿楠的博客-CSDN博客
论文解读- nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation(附实现教程)_Tina姐的博客-CSDN博客

码字不易,您的点赞是对我最好的支持,假如有题目也接待在评论区或私信与我交流!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4