当前位置:   article > 正文

nnUNet_v2(Linux)_nnunetv2

nnunetv2

目录

一、环境配置

二、数据集准备

三、数据转化

四、数据预处理

五、训练

六、测试

七、寻找最优配置

八、后处理

九、screen的用法


最近在使用nnUNet做医学影像分割,为大家提供参考。

官方使用说明地址:

https://github.com/MIC-DKFZ/nnUNet/blob/master/documentation/how_to_use_nnunet.md

一、环境配置

1. 创建虚拟环境(anaconda 3)

  1. conda create -n nnUnet python=3.9
  2. conda activate nnUnet

2. 配置nnUNet_v2

(1)安装nnUNet

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

(2)安装hiddenlayer(可选,为了输出网络结构示意图)

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

如果在实际使用中发现graphviz库报错:"failed to execute PosixPath('dot'), make sure the Graphviz executables are on your systems' PATH"

请使用以下命令安装dot:

conda install -c conda-forge graphviz

3. 配置环境变量

修改位于/home/user路径下的.barshrc文件,在文件末端输入:

  1. export nnUNet_raw="/home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data"
  2. export nnUNet_preprocessed="/home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_preprocessed"
  3. export nnUNet_results="/home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_results"

4. 更新配置(位于/home/user路径下)

source .bashrc

二、数据集准备

nnUnet有严格的数据集结构要求,按照以下步骤制作自定义数据集:

1. 安装好nnUNet后,在home/user/nnUNet/目录下创建文件夹,命名为nnUNetFrame

2. 在nnUNetFrame下创建DATASET文件夹

3. 在DATASET文件夹下创建三个文件夹,分别为nnUNet_results、nnUNet_raw、nnUNet_preprocessed

如图:

4. 在nnUNet_raw下创建nnUNet_raw_data与nnUNet_cropped_data(后者为可选项)文件夹

5. 在nnUNet_raw_data下创建Task对应的文件夹,以rmyy数据为例,Task200_ctrmyy

注:每一个Task都有唯一的ID,最好从200开始,以免与原有数据集发生冲突。

6. 在Task200_ctrmyy下存放训练、测试数据及标签,并且创建一个dataset.json文件

可以运行脚本自动生成dataset.json文件。

  1. """
  2. 位置:/home/suian/nnUNet/nnUNetFrame/create_data_json.py
  3. 创建数据集的json
  4. """
  5. import os
  6. import json
  7. from collections import OrderedDict
  8. path_originalData = r"/home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/"
  9. Task_name = 'Task200_ctrmyy'
  10. train_real_image = os.listdir((path_originalData + Task_name + "/imagesTr"))
  11. train_real_label = os.listdir((path_originalData + Task_name + "/labelsTr"))
  12. test_real_image = os.listdir((path_originalData + Task_name + "/imagesTs"))
  13. print(train_real_image)
  14. for idx in range(len(train_real_image)):
  15. print({'image': "./imagesTr/%s" % train_real_image[idx],
  16. "label": "./labelsTr/%s" % train_real_label[idx]})
  17. # # -------下面是创建json文件的内容--------------------------
  18. # # 可以根据你的数据集,修改里面的描述
  19. json_dict = OrderedDict()
  20. json_dict['name'] = "ct_rmyy" # 任务名
  21. json_dict['description'] = " Segmentation"
  22. json_dict['tensorImageSize'] = "3D"
  23. json_dict['reference'] = "see challenge website"
  24. json_dict['licence'] = "see challenge website"
  25. json_dict['release'] = "0.0"
  26. # 这里填入模态信息,0表示只有一个模态,还可以加入“1”:“MRI”之类的描述,详情请参考官方源码给出的示例
  27. json_dict['modality'] = {"0": "CT"}
  28. # 这里为label文件中的标签,名字可以按需要命名
  29. ########下面一行在参考的基础上做了修改######
  30. json_dict['labels'] = {'0': 'background',
  31. '1': "LV",
  32. '2': "RV",
  33. '3': "LA",
  34. '4': "RA",
  35. '5': "Aorta",
  36. '6': "PA",
  37. '7': "myo",
  38. '8': "SVC",
  39. '9': "IVC",
  40. '10': "PV"}
  41. # 下面部分不需要修改
  42. json_dict['numTraining'] = len(train_real_image)
  43. json_dict['numTest'] = len(test_real_image)
  44. json_dict['file_ending'] = '.nii.gz'
  45. json_dict['training'] = []
  46. for idx in range(len(train_real_image)):
  47. json_dict['training'].append({'image': "./imagesTr/%s" % train_real_image[idx],
  48. "label": "./labelsTr/%s" % train_real_label[idx]})
  49. json_dict['test'] = ["./imagesTs/%s" % i for i in test_real_image]
  50. with open(os.path.join(path_originalData + Task_name, "dataset.json"), 'w') as f:
  51. json.dump(json_dict, f, indent=4, sort_keys=True)
  52. # 输出文件夹:path_originalData

三、数据转化

准备好数据和dataset.json文件后,进行数据转化

nnUNetv2_convert_MSD_dataset -i /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task300_FullWholeHeart -overwrite_id 300

命令完成后会在同级文件夹下生成新的Dataset200_ctrmyy文件夹,内部包含转化后的数据(实际上就是把文件重命名以说明当前模态)

会生成新的dataset.json(内容和刚刚自己创建的没什么不同,只是v2相对于v1有些区别,不用管)以及重命名后的数据:

注:Task_x下的dataset.json中label键值对为"0": "background"(b区分大小写);Dataset_x下为”background”: 0。(数据转化命令会自动实现)

四、数据预处理

nnUNetv2_plan_and_preprocess -d 300 --verify_dataset_integrity

结果存放在../DATASET/nnUNet_preprocessed目录下,会生成2d/3d_lowres/3d_fullres三种配置的预处理结果。(Default: 2d 3d_fullres 3d_lowres)

可以通过 -c CONFIGURATIONS设定需要生成的预处理文件,比如:

nnUNetv2_plan_and_preprocess -d 300 -c 3d_fullres --verify_dataset_integrity

五、训练

首先设定GPU编号:

  1. export CUDA_VISIBLE_DEVICES=0
  2. echo $CUDA_VISIBLE_DEVICES

修改训练文件中的num_epochs(原先代码中是1000,训练起来太久了)

(位于/home/user/nnUNet/nnunetv2/training/nnUNetTrainer下nnUNetTrainer.py文件内)

使用脚本训练:

source /home/suian/nnUNet/scripts/train.sh

train.sh脚本内容:

  1. export CUDA_VISIBLE_DEVICES=0
  2. echo $CUDA_VISIBLE_DEVICES
  1. for fold in {0..4}
  2. do
  3.     nnUNetv2_train 300 3d_fullres $fold
  4. done

如果训练意外中断,使用--c恢复训练(需要指定第几折,如第1折):

nnUNetv2_train 300 3d_fullres 0 --c

六、测试

(如果想要确定最佳配置后再测试,可以使用nnUNetv2_find_best_configuration,详见七。)

首先设定GPU编号:

  1. export CUDA_VISIBLE_DEVICES=1
  2. echo $CUDA_VISIBLE_DEVICES

模板:

nnUNetv2_predict -i INPUT_FOLDER -o OUTPUT_FOLDER -d DATASET_NAME_OR_ID -c CONFIGURATION -npp 1

例子:

  1. export CUDA_VISIBLE_DEVICES=1
  2. echo $CUDA_VISIBLE_DEVICES
  3. # 1. rmyy
  4. nnUNetv2_predict -i /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Dataset200_ctrmyy/imagesTs -o /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_results/test_results/Dataset200_ctrmyy -d 200 -c 3d_fullres -npp 1
  5. # 2. rmyy_on_cq:
  6. nnUNetv2_predict -i /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Dataset201_ctcq/imagesTs -o /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_results/test_results/rmyy_on_cq -d 200 -c 3d_fullres -npp 1
  7. # 3. cq
  8. nnUNetv2_predict -i /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Dataset201_ctcq/imagesTs -o /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_results/test_results/Dataset201_ctcq -d 201 -c 3d_fullres -npp 1
  9. # 4. FullWholeHeart
  10. nnUNetv2_predict -i /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Dataset300_FullWholeHeart/imagesTs -o /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_results/test_results/Dataset300_FullWholeHeart -d 300 -c 3d_fullres -npp 1

七、寻找最优配置

前提是训练了2d、3d_lowres、3d_fullres中的多个配置。

模板:

nnUNetv2_find_best_configuration DATASET_NAME_OR_ID -c CONFIGURATIONS

例子:

nnUNetv2_find_best_configuration 300 -c 2d 3d_fullres --disable_ensembling

八、后处理

寻找最优配置后,会在命令行输出后处理所使用的代码,复制粘贴即可。

例子:

  1. nnUNetv2_apply_postprocessing
  2. -i /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_results/prediction_results/Dataset201_ctcq
  3. -o /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_results/prediction_results/ Dataset201_ctcq/ Dataset201_ctcq_pp
  4. -pp_pkl_file /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_results/Dataset201_ctcq/nnUNetTrainer__nnUNetPlans__2d/crossval_results_folds_5/postprocessing.pkl
  5. -np 1 -plans_json /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_results/Dataset201_ctctcq/nnUNetTrainer__nnUNetPlans__2d/plans.json

也可以在相应文件夹找到:

九、screen的用法

1. 命令:

  1. screen -S <session_name> # 启动一个screen会话
  2. screen -ls # 列出所有的screen会话
  3. screen -r <session_name or id> # 恢复一个Detached会话
  4. screen -d <session_name or id> # 分离一个Attached会话
  5. screen -S <session_name or id> -X quit # 关闭整个screen会话

2. 在一个screen会话中,使用以下命令:

  1. Ctrl+a+d # 分离当前会话
  2. Ctrl+a+c # 在当前screen会话中创建一个新的窗口
  3. Ctrl+a+n # 切换到下一个窗口
  4. Ctrl+a+p # 切换到上一个窗口
  5. exit # 退出并关闭screen

参考博客:

[1] 服务器中的screen 命令_screen关闭会话-CSDN博客

[2] nnUNet保姆级使用教程!从环境配置到训练与推理(新手必看)-CSDN博客

[3] nnUNet详细笔记教程(Linux下,只有实验没有原理)-CSDN博客

[4] 医学图像分割 3D nnUNet全流程快速实现-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/670144
推荐阅读
相关标签
  

闽ICP备14008679号