赞
踩
目录
最近在使用nnUNet做医学影像分割,为大家提供参考。
官方使用说明地址:
https://github.com/MIC-DKFZ/nnUNet/blob/master/documentation/how_to_use_nnunet.md
1. 创建虚拟环境(anaconda 3)
- conda create -n nnUnet python=3.9
- conda activate nnUnet
2. 配置nnUNet_v2
(1)安装nnUNet
- git clone https://github.com/MIC-DKFZ/nnUNet.git
- cd nnUNet
- 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文件,在文件末端输入:
- export nnUNet_raw="/home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data"
- export nnUNet_preprocessed="/home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_preprocessed"
- 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文件。
- """
- 位置:/home/suian/nnUNet/nnUNetFrame/create_data_json.py
- 创建数据集的json
- """
- import os
- import json
- from collections import OrderedDict
-
- path_originalData = r"/home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/"
- Task_name = 'Task200_ctrmyy'
- train_real_image = os.listdir((path_originalData + Task_name + "/imagesTr"))
- train_real_label = os.listdir((path_originalData + Task_name + "/labelsTr"))
- test_real_image = os.listdir((path_originalData + Task_name + "/imagesTs"))
- print(train_real_image)
- for idx in range(len(train_real_image)):
- print({'image': "./imagesTr/%s" % train_real_image[idx],
- "label": "./labelsTr/%s" % train_real_label[idx]})
-
- # # -------下面是创建json文件的内容--------------------------
- # # 可以根据你的数据集,修改里面的描述
- json_dict = OrderedDict()
- json_dict['name'] = "ct_rmyy" # 任务名
- json_dict['description'] = " Segmentation"
- json_dict['tensorImageSize'] = "3D"
- json_dict['reference'] = "see challenge website"
- json_dict['licence'] = "see challenge website"
- json_dict['release'] = "0.0"
- # 这里填入模态信息,0表示只有一个模态,还可以加入“1”:“MRI”之类的描述,详情请参考官方源码给出的示例
- json_dict['modality'] = {"0": "CT"}
-
- # 这里为label文件中的标签,名字可以按需要命名
- ########下面一行在参考的基础上做了修改######
- json_dict['labels'] = {'0': 'background',
- '1': "LV",
- '2': "RV",
- '3': "LA",
- '4': "RA",
- '5': "Aorta",
- '6': "PA",
- '7': "myo",
- '8': "SVC",
- '9': "IVC",
- '10': "PV"}
-
- # 下面部分不需要修改
- json_dict['numTraining'] = len(train_real_image)
- json_dict['numTest'] = len(test_real_image)
- json_dict['file_ending'] = '.nii.gz'
-
- json_dict['training'] = []
- for idx in range(len(train_real_image)):
- json_dict['training'].append({'image': "./imagesTr/%s" % train_real_image[idx],
- "label": "./labelsTr/%s" % train_real_label[idx]})
-
- json_dict['test'] = ["./imagesTs/%s" % i for i in test_real_image]
- with open(os.path.join(path_originalData + Task_name, "dataset.json"), 'w') as f:
- json.dump(json_dict, f, indent=4, sort_keys=True)
- # 输出文件夹: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编号:
- export CUDA_VISIBLE_DEVICES=0
- echo $CUDA_VISIBLE_DEVICES
修改训练文件中的num_epochs(原先代码中是1000,训练起来太久了)
(位于/home/user/nnUNet/nnunetv2/training/nnUNetTrainer下nnUNetTrainer.py文件内)
使用脚本训练:
source /home/suian/nnUNet/scripts/train.sh
train.sh脚本内容:
- export CUDA_VISIBLE_DEVICES=0
- echo $CUDA_VISIBLE_DEVICES
- for fold in {0..4}
- do
- nnUNetv2_train 300 3d_fullres $fold
- done
如果训练意外中断,使用--c恢复训练(需要指定第几折,如第1折):
nnUNetv2_train 300 3d_fullres 0 --c
(如果想要确定最佳配置后再测试,可以使用nnUNetv2_find_best_configuration,详见七。)
首先设定GPU编号:
- export CUDA_VISIBLE_DEVICES=1
- echo $CUDA_VISIBLE_DEVICES
模板:
nnUNetv2_predict -i INPUT_FOLDER -o OUTPUT_FOLDER -d DATASET_NAME_OR_ID -c CONFIGURATION -npp 1
例子:
- export CUDA_VISIBLE_DEVICES=1
- echo $CUDA_VISIBLE_DEVICES
- # 1. rmyy
- 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
- # 2. rmyy_on_cq:
- 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
- # 3. cq
- 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
- # 4. FullWholeHeart
- 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
寻找最优配置后,会在命令行输出后处理所使用的代码,复制粘贴即可。
例子:
- nnUNetv2_apply_postprocessing
- -i /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_results/prediction_results/Dataset201_ctcq
- -o /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_results/prediction_results/ Dataset201_ctcq/ Dataset201_ctcq_pp
- -pp_pkl_file /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_results/Dataset201_ctcq/nnUNetTrainer__nnUNetPlans__2d/crossval_results_folds_5/postprocessing.pkl
- -np 1 -plans_json /home/suian/nnUNet/nnUNetFrame/DATASET/nnUNet_results/Dataset201_ctctcq/nnUNetTrainer__nnUNetPlans__2d/plans.json
也可以在相应文件夹找到:
1. 命令:
- screen -S <session_name> # 启动一个screen会话
-
- screen -ls # 列出所有的screen会话
-
- screen -r <session_name or id> # 恢复一个Detached会话
-
- screen -d <session_name or id> # 分离一个Attached会话
-
- screen -S <session_name or id> -X quit # 关闭整个screen会话
2. 在一个screen会话中,使用以下命令:
- Ctrl+a+d # 分离当前会话
-
- Ctrl+a+c # 在当前screen会话中创建一个新的窗口
-
- Ctrl+a+n # 切换到下一个窗口
-
- Ctrl+a+p # 切换到上一个窗口
-
- exit # 退出并关闭screen
参考博客:
[1] 服务器中的screen 命令_screen关闭会话-CSDN博客
[2] nnUNet保姆级使用教程!从环境配置到训练与推理(新手必看)-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。