nnUnet使用
MedicalSeg/nnUnet组件介绍
- 组件结构
-
使用流程
-
- 准备工作:
#1.1获取PaddleSeg组件 #cd ~表示进入用户主目录 %cd ~/ !git clone https://gitee.com/PaddlePaddle/PaddleSeg.git !git pull %cd ~/PaddleSeg/ !git checkout develop
%cd ~/进入用户根目录,该指令不论当前工作目录是什么,均会返回根目录
%cd ~/data/进入根目录下的data目录
%cd data进入当前文件夹下的data目录,注意与~/data区别
%cd …/返回上一根目录
#1.2解压数据集 %cd ~/ !mkdir ~/PaddleSeg/contrib/MedicalSeg/msd_lung !tar -xf ~/data/data125872/Task06_Lung.tar -C ~/PaddleSeg/contrib/MedicalSeg/msd_lung
#1.3安装依赖 %cd ~/PaddleSeg/contrib/MedicalSeg !pip install -r requirements.txt !pip install medpy
#1.4(可选)解压2D-UNet和Cascade UNet-lowres训练好的权重 %cd ~/ !mkdir ~/PaddleSeg/contrib/MedicalSeg/output !unzip -oq ~/data/data169512/2d_and_cascade_lowres.zip -d ~/PaddleSeg/contrib/MedicalSeg/output/
-
- 开始训练
# 2D-UNet 训练————5折训练 %cd ~/PaddleSeg/contrib/MedicalSeg/ !python train.py --config configs/nnunet/msd_lung/nnunet_2d_msd_lung_fold0.yml --log_iters 20 --precision fp16 --nnunet --save_dir output/2d_unet/fold0 --save_interval 1000 --use_vdl ''' 修改fold1/2/3/4分别训练即可 考虑到内存问题,可增大save_interval --precison fp16表示Use AMP (Auto mixed precision)自动混合精度训练 '''
# 3D-UNet训练 %cd ~/PaddleSeg/contrib/MedicalSeg/ !python train.py --config configs/nnunet/msd_lung/nnunet_3d_fullres_msd_lung_fold0.yml --log_iters 20 --precision fp16 --nnunet --save_dir output/3d_unet/fold0 --save_interval 1000 --use_vdl ''' 同样分别修改fold1/2/3/4进行5折训练 '''
train.py的可设置参数,具体查看train.py脚本
—— log_iters记录训练的loss、cost等参数的轮数
—— use_vdl记录训练参数,结束后可用于可视化
—— resume_model=‘path’中断训练和恢复重新训练
—— save_interval保存训练模型的轮数
-
- 验证——由于分为5折训练,故验证时5个模型分别在各自验证集验证,之后整合验证,即6次验证
# 2D UNet验证-提供权重 %cd ~/PaddleSeg/contrib/MedicalSeg/ !python nnunet/single_fold_eval.py --config configs/nnunet/msd_lung/nnunet_2d_msd_lung_fold0.yml --model_path output/2d_unet/fold0/iter_30000/model.pdparams --val_save_folder output/2d_val --precision fp16 ''' single_fold_eval需进行5次 ''' !python nnunet/all_folds_eval.py --gt_dir output/2d_val/gt_niftis --val_pred_dir output/2d_val
# 3D UNet 验证 %cd ~/PaddleSeg/contrib/MedicalSeg/ !python nnunet/single_fold_eval.py --config configs/nnunet/msd_lung/nnunet_3d_fullres_msd_lung_fold0.yml --model_path output/3d_unet/fold0/iter_30000/model.pdparams --val_save_folder output/3dfullres_val --precision fp16 ''' single_fold_eval需进行5次 ''' !python nnunet/all_folds_eval.py --gt_dir output/3dfullres_val/gt_niftis --val_pred_dir output/3dfullres_val
-
- Cascade UNet训练、验证
# Cascade UNet lowres 训练 %cd ~/PaddleSeg/contrib/MedicalSeg/ !python train.py --config configs/nnunet/msd_lung/nnunet_3dcascade_lowres_msd_lung_fold0.yml --log_iters 20 --precision fp16 --nnunet --save_dir output/cascade_lowres/fold0 --save_interval 1000 --use_vdl ''' 同样是5折训练 '''
# Cascade UNet lowres验证,并进行推理,得到下一阶段的输入-提供权重 %cd ~/PaddleSeg/contrib/MedicalSeg/ !python nnunet/single_fold_eval.py --config configs/nnunet/msd_lung/nnunet_3dcascade_lowres_msd_lung_fold0.yml --model_path output/cascade_lowres/fold0/iter_30000/model.pdparams --val_save_folder output/cascade_lowres_val --precision fp16 -- '''5折预测''' !python nnunet/all_folds_eval.py --gt_dir output/cascade_lowres_val/gt_niftis --val_pred_dir output/cascade_lowres_val
cascade unet二阶段一定会涨点吗?
不一定!二阶段数据处理将数据的体素间距统一成数据集中最小的体素间距,最小的体素间距并不一定是最优的,一阶段可能效果比二阶段好,这个需要选手自己尝试。# Cascade UNet fullres 训练 %cd ~/PaddleSeg/contrib/MedicalSeg/ !python train.py --config configs/nnunet/msd_lung/nnunet_3dcascade_fullres_msd_lung_fold0.yml --log_iters 20 --precision fp16 --nnunet --save_dir output/cascade_fullres/fold0 --save_interval 1000 --use_vdl '''5折训练''' 1 2 3 4
# Cascade UNet fullres 验证 %cd ~/PaddleSeg/contrib/MedicalSeg/ !python nnunet/single_fold_eval.py --config configs/nnunet/msd_lung/nnunet_3dcascade_fullres_msd_lung_fold0.yml --model_path output/cascade_fullres/fold0/iter_30000/model.pdparams --val_save_folder output/cascade_fullres_val --precision fp16 '''5折预测完成后,需要整合''' !python nnunet/all_folds_eval.py --gt_dir output/cascade_fullres_val/gt_niftis --val_pred_dir output/cascade_fullres_val
-
- Ensemble整合模型
- def:nnUNet最后会评以下7个策略的精度,挑选精度最高的提交
- 2D-UNet
3D-UNet
Cascade-UNet-lowres
Cascade-UNet-fullres
2D-UNet + 3D-UNet
2D-UNet + Cascade-UNet-fullres
3D-UNet + Cascade-UNet-fullres
%cd ~/PaddleSeg/contrib/MedicalSeg/ #注意修改路径 !python nnunet/ensemble.py --ensemble_folds \ output/3dfullres_val\ output/cascade_lowres_val\ output/2d_val \ --gt_dir output/cascade_lowres_val/gt_niftis \ --plan_path msd_lung/preprocessed/Task006_Lung/nnUNetPlansv2.1_plans_2D.pkl \ --output_folder output/ensemble
-
-
训练完成后
-
预测——预测的结果同样支持模型间Ensemble。如果预测的结果需要Ensemble,加上**–save_npz参数**。
比如想要:2D-UNet + 3D-UNet 的预测,就分别得到2个模型的预测结果,使用上述Ensemble命令集成。#2D预测 %cd ~/PaddleSeg/contrib/MedicalSeg/ !python nnunet/predict.py --image_folder msd_lung/Task006_Lung/imagesTs\ --output_folder output/nnunet_predict/2d_unet \ --plan_path msd_lung/preprocessed/Task006_Lung/nnUNetPlansv2.1_plans_2D.pkl \ --model_paths output/2d_unet/fold0/iter_30000/model.pdparams output/2d_unet/fold1/iter_30000/model.pdparams output/2d_unet/fold2/iter_30000/model.pdparams output/2d_unet/fold3/iter_30000/model.pdparams output/2d_unet/fold4/iter_30000/model.pdparams \ --postprocessing_json_path output/2d_val/postprocessing.json \ --model_type 2d \ --save_npz
# 3D UNet 预测 %cd ~/PaddleSeg/contrib/MedicalSeg/ !python nnunet/predict.py --image_folder msd_lung/Task006_Lung/imagesTs\ --output_folder output/nnunet_predict/3d_unet \ --plan_path msd_lung/preprocessed/Task006_Lung/nnUNetPlansv2.1_plans_3D.pkl \ --model_paths output/3d_unet/fold0/iter_30000/model.pdparams output/3d_unet/fold1/iter_30000/model.pdparams output/3d_unet/fold2/iter_30000/model.pdparams output/3d_unet/fold3/iter_30000/model.pdparams output/3d_unet/fold4/iter_30000/model.pdparams \ --postprocessing_json_path output/3d_unet/postprocessing.json \ --model_type 3d \ --save_npz
# Cascade UNet 预测,先使用lowres预测,在fullres预测 %cd ~/PaddleSeg/contrib/MedicalSeg/ !python nnunet/predict.py--image_folder msd_lung/Task006_Lung/imagesTs\ --output_folder output/nnunet_predict/lowres_pred \ --plan_path msd_lung/preprocessed/Task006_Lung/nnUNetPlansv2.1_plans_3D.pkl \ --model_paths output/cascade_lowres/fold0/iter_30000/model.pdparams output/cascade_lowres/fold1/iter_30000/model.pdparams output/cascade_lowres/fold2/iter_30000/model.pdparams output/cascade_lowres/fold3/iter_30000/model.pdparams output/cascade_lowres/fold4/iter_30000/model.pdparams \ --postprocessing_json_path output/cascade_lowres_val/postprocessing.json \ --model_type cascade_lowres #使用2阶段 !python nnunet/predict.py --image_folder msd_lung/Task006_Lung/imagesTs\ --output_folder output/nnunet_predict/fullres_pred \ --plan_path msd_lung/preprocessed/Task006_Lung/nnUNetPlansv2.1_plans_3D.pkl \ --model_paths output/cascade_fullres/fold0/iter_30000/model.pdparams output/cascade_fullres/fold1/iter_30000/model.pdparams output/cascade_fullres/fold2/iter_30000/model.pdparams output/cascade_fullres/fold3/iter_30000/model.pdparams output/cascade_fullres/fold4/iter_30000/model.pdparams \ --postprocessing_json_path output/cascade_lowres_val/postprocessing.json\ --model_type cascade_fullres \ --save_npz \ --lowres_segmentations output/nnunet_predict/lowres_pred
-
部署
-
仅以2D UNet为示例,演示模型的部署过程。
-
导出静态图模型(五折训练对应五个模型);
-
静态图推理(五折训练就对应五折推理)。
PS:静态图推理的模型也支持Ensemble,需要在推理时加上–save_npz参数,Ensemble命令和5一致。# 静态图导出 %cd ~/PaddleSeg/contrib/MedicalSeg/ '''导出5个模型''' !python nnunet/export.py --config configs/nnunet/msd_lung/nnunet_2d_msd_lung_fold0.yml \ --save_dir output/static/2d_unet/fold0 \ --model_path output/2d_unet/fold0/iter_30000/model.pdparams #fold1 2 3 4
# 静态图多折推理 %cd ~/PaddleSeg/contrib/MedicalSeg/ !python nnunet/infer.py --image_folder msd_lung/Task006_Lung/imagesTs \ --output_folder output/nnunet_static/2d_unet \ --plan_path msd_lung/preprocessed/Task006_Lung/nnUNetPlansv2.1_plans_2D.pkl \ --model_paths output/static/2d_unet/fold0/model.pdmodel output/static/2d_unet/fold1/model.pdmodel output/static/2d_unet/fold2/model.pdmodel output/static/2d_unet/fold3/model.pdmodel output/static/2d_unet/fold4/model.pdmodel \ --param_paths output/static/2d_unet/fold0/model.pdiparams output/static/2d_unet/fold1/model.pdiparams output/static/2d_unet/fold2/model.pdiparams output/static/2d_unet/fold3/model.pdiparams output/static/2d_unet/fold4/model.pdiparams \ --postprocessing_json_path output/2d_unet_val/postprocessing.json \ --model_type 2d \ --disable_postprocessing \ --save_npz
-