首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐
2025年6月6日 星期五 5:51pm

nnUNet_v2(Linux)

  • 25-03-04 19:01
  • 4567
  • 7439
blog.csdn.net

目录

一、环境配置

二、数据集准备

三、数据转化

四、数据预处理

五、训练

六、测试

七、寻找最优配置

八、后处理

九、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 # 启动一个screen会话
  2. screen -ls # 列出所有的screen会话
  3. screen -r or id> # 恢复一个Detached会话
  4. screen -d or id> # 分离一个Attached会话
  5. screen -S 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博客

文章知识点与官方知识档案匹配,可进一步学习相关知识
OpenCV技能树OpenCV中的深度学习图像分类26629 人正在系统学习中
注:本文转载自blog.csdn.net的exploreandconquer的文章"https://blog.csdn.net/Rad1ant_up/article/details/134896729"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top