nnU-Net在服务器上训练自己数据(小白记录版)

avatar
作者
猴君
阅读量:1

前言:

是根据github上面文档记录的和两个站内大佬的帖子跑成功的,全程在服务器终端进行操作,蓝字是我自己写的,黑字是readme上面的
nnU-Netv2在服务器上使用全流程(小白边踩坑边学习的记录)-CSDN博客
nnU-Net v2的环境配置到训练自己的数据集(详细步骤)_nnunetv2-CSDN博客

一、硬件要求

GPU:需要至少拥有10 GB的GPU(我电脑的8g不行)

CPU:6核(12线程)

例:

1、用于训练的示例工作站配置:

CPU:Ryzen 5800X - 5900X或7900X将更好!

GPU:RTX 3090或RTX 4090(我用的是AutoDL上租的4090)

RAM:64GB

存储:SSD(M.2 PCIe Gen 3或更好!)

2、用于训练的示例服务器配置:

CPU:2x AMD EPYC7763,总共128C/256T。对于像A100这样的快速GPU,强烈推荐16C/GPU!

GPU:8xA100 PCIe(价格/性能优于SXM变体+它们的功耗更低)

RAM:1 TB

存储:本地SSD存储(PCIe Gen 3或更好)或超快速网络存储 (nnU-net默认使用每个训练一个GPU。服务器配置可以同时运行多达8个模型训练)

二、环境配置

建议在虚拟环境中安装nnU-Net!我自己创建了一个叫nnunet_env的虚拟环境,以后的几乎每一步操作都要先激活环境

conda create -n nnunet_env python=3.9
1、安装按PyTorch(在虚拟环境下)

安装支持硬件的最新版本(cuda、mps、cpu)。可以输入nvidia-smi查看配置,去pytorch官网下载。PyTorch

2、安装nnU-Net

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

pip install nnunetv2

(2) 用作综合框架(我用这个,因为可以改代码,建议用这个,下面几行是依次输入,不是一起)

git clone https://github.com/MIC-DKFZ/nnUNet.git
cd nnUNet
pip install -e .

3、安装hiddenlayer

hiddenlayer使nnU-net能够生成其生成的网络拓扑的图表(请参阅模型训练)。要安装hiddenlayer,请运行以下命令:

pip install --upgrade git+https://github.com/FabianIsensee/hiddenlayer.git

三、数据转换

将数据导入nnU-Net的唯一方法是将其存储在特定格式中。数据集包括三个组件:原始图像、对应的分割地图和一个指定一些元数据的dataset.json文件。

1、命名格式

nnU-Net通过其文件末尾的四位数字来识别输入通道:一个四位数的整数。因此,图像文件必须遵循以下命名约定:{CASE_IDENTIFIER}_{XXXX}.{FILE_ENDING}。FILE_ENDING是图像格式使用的文件扩展名(.png,.nii.gz,...)。dataset.json文件将通道名称与'channel_names'键中的通道标识符连接起来。不要使用.jpg之类的文件格式!

2、数据文件结构

(1、先在nnUNet下新建一个文件夹DATASET

2、再在DATASET下新建三个文件夹,nnUNet_rawnnUNet_preprocessed 和 nnUNet_trained_models,

3、接着在nnUNet_raw里面新建数据集文件,注意命名格式

4、在数据集文件中新建imagesTr和labelsTr,并上传文件,还要json文件)

数据集必须位于nnUNet_raw文件夹中(您在安装nnU-Net时定义的,或者每次打算运行nnU-Net命令时导出/设置的!)。每个分割数据集都存储为单独的“Dataset”。数据集与数据集ID(三位整数)和数据集名称(您可以自由选择)相关联

nnUNet_raw/
├── Dataset001_BrainTumour
├── Dataset002_Heart
├── Dataset003_Liver
├── Dataset004_Hippocampus
├── Dataset005_Prostate
├── ...

在每个数据集文件夹中,期望以下结构:

 Dataset001_BrainTumour/
├── dataset.json
├── imagesTr
├── imagesTs  # optional
└── labelsTr

  • imagesTr:包含属于训练案例的图像。nnU-Net将使用此数据执行管道配置、交叉验证训练以及查找后处理和最佳集成。
  • imagesTs(可选):包含属于测试案例的图像。nnU-Net不会使用它们!这只是一个方便您存储这些图像的地方。医学分割十项全能赛文件夹结构的剩余部分。
  • labelsTr:包含训练案例的地面真实分割地图的图像。
  • dataset.json:包含数据集的元数据。
3、dataset.json文件

(我直接就用示例改了下, "numTraining"是样本数量)

dataset.json文件包含nnU-Net训练所需的元数据,以下是Dataset005_Prostate的示例,展示了dataset.json应该是什么样子:


 "channel_names": {  # formerly modalities
   "0": "T2", 
   "1": "ADC"
 }, 
 "labels": {  # THIS IS DIFFERENT NOW!
   "background": 0,
   "PZ": 1,
   "TZ": 2
 }, 
 "numTraining": 32, 
 "file_ending": ".nii.gz",
 "overwrite_image_reader_writer": "SimpleITKIO"  # optional! If not provided nnU-Net will automatically determine the ReaderWriter
 }
 

有一个工具可以自动生成dataset.json。您可以在这里找到它。请参考我们的示例dataset_conversion中如何使用它。并阅读其文档! 

四、实现

在实现之前有个很重要的环境变量改变,去shell里加上DATSET下三个子文件的路径,

1、终端输入:vi ~/.bashrc

2、按E进入编辑

3、拉到最下面,按i进入编辑模式,粘贴自己的路径,最后按esc退出到终端

4、终端输入:source ~/.bashrc  才能保存。

export nnUNet_preprocessed="autodl-tmp/nnUNet/DATASET/nnUNet_preprocessed"   export nnUNet_results="autodl-tmp/nnUNet/DATASET/nnUNet_trained_models"   export nnUNet_raw="autodl-tmp/nnUNet/DATASET/nnUNet_raw"
1、运行指纹提取、实验规划和预处理

给定一个新的数据集,nnU-Net将提取数据集指纹(一组数据集特定属性,如图像尺寸、体素间距、强度信息等)。

运行指纹提取、实验规划和预处理的最简单方法是使用:

nnUNetv2_plan_and_preprocess -d DATASET_ID --verify_dataset_integrity

nnUNetv2_plan_and_preprocess 将在您的 nnUNet_preprocessed 文件夹中创建一个名为数据集的新子文件夹。一旦命令完成,您将看到一个 dataset_fingerprint.json 文件和一个 nnUNetPlans.json 文件(如果您感兴趣的话)。此外,还将创建包含您的UNet配置预处理数据的子文件夹。 

我的就是029,因为029是我的数据集id

nnUNetv2_plan_and_preprocess -d 029 --verify_dataset_integrity

但我这个出现了问题,显示labelsTr路径重复。出现这个错误的就去verify_dataset_integrity.py把代码改了(nnUNet/nnunetv2/experiment_planning/verify_dataset_integrity.py,204行附近)

改之后代码:

result = p.starmap(             verify_labels,             zip(labelfiles, [reader_writer_class] * len(labelfiles),[expected_labels] * len(labelfiles))             )


 

2、模型训练

我是一行一行训练的,依次输入,训练完一个了再输入下一个,我是2d数据

如果想停止就按ctrl+c,想继续训练就原始代码后面加上--c,注意跟原始代码直接有空格

想改变训练次数就去nnUNet/nnunetv2/training/nnUNetTrainer/nnUNetTrainer.py里修改,145行

nnUNetv2_train 029 2d 0 nnUNetv2_train 029 2d 1 nnUNetv2_train 029 2d 2 nnUNetv2_train 029 2d 3 nnUNetv2_train 029 2d 4

nnU-Net 在训练案例的 5 折交叉验证中训练所有配置。这一步骤是必要的,因此 nnU-Net 可以估计每个配置的性能,并告诉您哪个应该用于您的分割问题,并且 2) 获得一个良好的模型集成(对这 5 个模型的输出进行平均预测)以提高性能。

5折交叉验证:是一种常用的模型评估技术,通常用于评估机器学习模型的性能。在5折交叉验证中,数据集被随机分成5个相等的子集,其中的4个子集被用作训练数据,而剩余的一个子集被用作验证数据。模型会被训练5次,每次使用其中一个子集作为验证集,而其他4个子集作为训练集。然后,对这5次训练的结果进行平均,以得到最终的性能评估指标。

模型训练是使用 nnUNetv2_train 命令完成的。该命令的一般结构如下:

nnUNetv2_train DATASET_NAME_OR_ID UNET_CONFIGURATION FOLD [additional options, see -h]

UNET_CONFIGURATION 是一个字符串,用于标识请求的 U-Net 配置(默认值:2d、3d_fullres、3d_lowres、3d_cascade_lowres)。DATASET_NAME_OR_ID 指定应该在其上进行训练的数据集,FOLD 指定进行训练的 5 折交叉验证的哪一折。 

2D U-Net 对于每个FOLD在[0, 1, 2, 3, 4]中,运行以下命令:

nnUNetv2_train DATASET_NAME_OR_ID 2d FOLD [--npz]

3D全分辨率U-Net 对于每个FOLD在[0, 1, 2, 3, 4]中,运行以下命令:

nnUNetv2_train DATASET_NAME_OR_ID 3d_fullres FOLD [--npz]

3D U-Net级联 对于每个FOLD在[0, 1, 2, 3, 4]中,运行以下命令:

 nnUNetv2_train DATASET_NAME_OR_ID 3d_cascade_fullres FOLD [--npz]

每个模型训练的输出文件夹中(每个fold_x文件夹中),将创建以下文件:

  • debug.json:包含用于训练该模型的蓝图和推断参数的摘要,以及一堆其他信息。难以阅读,但对于调试非常有用 ;-)
  • checkpoint_best.pth:在训练过程中识别出的最佳模型的检查点文件。目前未使用,除非您明确告诉nnU-Net要使用它。
  • checkpoint_final.pth:最终模型的检查点文件(在训练结束后)。这用于验证和推理。
  • network_architecture.pdf(仅在安装了hiddenlayer时!):一个包含网络架构图的pdf文档。
  • progress.png:显示了训练过程中的损失、伪Dice、学习率和epoch时间。在顶部是训练(蓝色)和验证(红色)损失在训练过程中的绘图。还显示了Dice的近似值(绿色),以及它的移动平均值(虚线绿色线)。这个近似值是前景类的平均Dice分数。需要注意的是,这是根据训练过程中从验证数据中随机抽取的补丁计算的,而不是针对每个验证案例计算并平均的Dice,而是假装只有一个验证案例从中抽取补丁。这样做的原因是'全局Dice'在训练期间易于计算,并且仍然非常有用,可以评估模型是否在训练过程中。真正的验证需要太长时间才能在每个epoch中完成。它是在训练结束时运行的。
  • validation_raw:在训练结束后,此文件夹中包含预测的验证案例。此处的summary.json文件包含验证指标(在文件开头提供了所有案例的平均值)。如果设置了--npz,则这里还会有压缩的softmax输出(保存为.npz文件)。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!