文章目录
- 前言
 - 1. 安装
 - 2. 训练与测试
 - 2.1. 数据处理
 - 2.1.1. 整理数据路径
 - 2.1.2. 设置 nnFormer 读取文件的路径
 - 2.1.3. 数据集预处理
 
- 2.2. 训练
 - 2.2.1. 训练代码
 - 2.2.2. 可能出现的问题及解决办法
 
- 2.3. 预测
 
- 总结
 
前言
本文主要记载 nnFormer 从安装到训练再到推理的过程。nnFormer 的环境十分难配,训练和推理都是 2 行代码搞定,要想成功训练 nnFormer,首先得确保自己的环境配置的没有问题。
1. 安装
- 官方系统版本 
  
- Ubuntu 18.01、Python 3.6、PyTorch 1.8.1 和 CUDA 10.1 。有关软件包和版本号的完整列表,请参阅 Conda 环境文件 environment.yml。
 
 - 安装步骤
 
- 在服务器上创建路径 
nnFormerFrame - 进入创建好的路径,克隆项目到服务器 
  
- 需要注意的是,可能需要使用国内一些加速的镜像网站才能比较流畅的 clone 到自己的服务器上
 
 
cd /root/nnFormerFrame
git clone https://github.com/282857341/nnFormer.git
 
- 进入 clone 好的文件路径
 
cd nnFormer
 
- 使用 
environment.yml创建作者所提供的虚拟环境 
conda env create -f environment.yml
 
- 需要注意的是,这里可能会出现如下错误
 
Collecting package metadata (repodata.json): failed
CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/linux-64/repodata.json>
Elapsed: -
An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.
 
- 修改 
.condarc文件内容如下即可正常下载 
channels:
  - defaults
show_channel_urls: true
channel_alias: http://mirrors.tuna.tsinghua.edu.cn/anaconda
default_channels:
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
 
- 进入虚拟环境
 
source activate nnFormer
 
- 执行安装指令
 
pip install -e .
 
2. 训练与测试
2.1. 数据处理
2.1.1. 整理数据路径
- 进入创建的 
nnFormerFrame文件路径 
cd /root/nnFormerFrame
 
- 创建一个名为 
DATASET的文件夹 - 进入创建好的 
DATASET文件夹- 依次创建 
    
nnFormer_preprocessed- 存放原始数据预处理之后的数据nnFormer_raw- 存放原始的训练的数据nnFormer_trained_models- 存放训练的结果
 
 - 依次创建 
    
 - 进入 
nnFormer_raw- 依次创建 
    
nnFormer_cropped_data- crop 以后的数据nnFormer_raw_data- 原始数据
 
 - 依次创建 
    
 - 最终的文件结构如图所示:

 
2.1.2. 设置 nnFormer 读取文件的路径
- 进入 
.bashrc文件,在文件末尾添加如下命令: 
export nnFormer_raw_data_base="/root/nnFormerFrame/DATASET/nnFormer_raw"
export nnFormer_preprocessed="/root/nnFormerFrame/DATASET/nnFormer_preprocessed"
export RESULTS_FOLDER="/root/nnFormerFrame/DATASET/nnFormer_trained_models"
 
- 更新资源:
 
source .bashrc
 
2.1.3. 数据集预处理
本实验使用的是医学图像十项全能 Task01_BrainTumour
- 为了符合 
nnFormer的设置,修改解压缩之后的文件的文件名 Task03_tumor - 转换数据集,让它可以被 
nnFormer识别: 
nnFormer_convert_decathlon_task -i /root/nnFormerFrame/DATASET/nnFormer_raw/nnFormer_raw_data/Task03_tumor
 
- 进行插值等操作
 
nnFormer_plan_and_preprocess -t 3
 
需要注意的是,这一步如果有提示有包没有安装成功,基本上可以确定是先前的环境没有配好,如果有出现报错请试着重新配一下环境
2.2. 训练
2.2.1. 训练代码
修改 train_inference.sh
- 训练的时候需要注释掉 predict
 - 修改路径为 clone 下来的代码的绝对路径
 
if ${train}
then
	cd /root/nnFormerFrame/nnFormer/nnformer/
	CUDA_VISIBLE_DEVICES=${cuda} nnFormer_train 3d_fullres nnFormerTrainerV2_${name} ${task} 0
fi
 
进入 train_inference.sh 所在的路径,并执行训练代码:
cd /root/autodl-tmp/model/nnFormerFrame/nnFormer
bash train_inference.sh -c 0 -n nnformer_tumor -t 3
 
- -c stands for the index of your cuda device
 - -n denotes the suffix of the trainer located at nnFormer/nnformer/training/network_training/
 - -t denotes the task index
 
训练结果
- 训练曲线 
  
- 仅供参考

 
 - 仅供参考
 - 训练 log
 
2022-12-26 03:34:09.397115: 
epoch:  499 
2022-12-26 03:38:00.715099: train loss : -0.7295 
2022-12-26 03:38:09.692853: validation loss: -0.6596 
2022-12-26 03:38:09.693858: Average global foreground Dice: [0.8460535474680709, 0.6899365868487455, 0.8608222877365227] 
2022-12-26 03:38:09.693989: (interpret this as an estimate for the Dice of the different classes. This is not exact.) 
2022-12-26 03:38:11.205323: lr: 0.0 
2022-12-26 03:38:11.205581: current best_val_eval_criterion_MA is 0.79020 
2022-12-26 03:38:11.205669: current val_eval_criterion_MA is 0.7898 
2022-12-26 03:38:11.205743: This epoch took 241.808557 s
 
2.2.2. 可能出现的问题及解决办法
- 从头开始训练,不使用预训练权重
 
- 修改 
/root/nnFormerFrame/nnFormer/nnformer/training/network_training/路径下的nnFormerTrainerV2_nnformer_tumor.py的文件 
self.load_pretrain_weight = False
 
- 同时,如果只是想要跑通 
nnFormer并获得一个可视化的结果的话,可以不用训练那么个 epochs- 我在训练的时候将 epochs 设置为了 500
 - 具体情况具体分析
 
 
self.max_num_epochs = 500
 
- 出现 
RunTimeError

 
- 检查以下两个文件: 
  
/root/nnFormerFrame/DATASET/nnFormer_preprocessed/Task003_tumor/nnFormerData_plans_v2.1_stage0/root/nnFormerFrame/DATASET/nnFormer_preprocessed/Task003_tumor/nnFormerData_plans_v2.1_2D_stage0
 - 发现存在 
.npy结尾的文件,根据 issue 中的解决办法,删除这些.npy结尾的文件即可 
- 出现 
EOFError 
- 我刚开始使用 RTX3090 服务器进行训练,在训练的最后一步会报如下错:
 
NVIDIA GeForce RTX 3090 with CUDA capability sm_86 is not compatible with the current PyTorch installation.
The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_70.
If you want to use the NVIDIA GeForce RTX 3090 GPU with PyTorch, please check the instructions at https://pytorch.org/get-started/locally/
 
- 可以确定的是,这是因为 torch 版本不匹配所导致的问题 
  
- 解决方案一:删除当前 nnFormer 虚拟环境下的 torch 并重装合适的 torch 版本(我尝试过这个方法,但并没有成功,重装的 torch 版本是 10.0.1)
 - 解决方案二:换一台服务器,再更换服务器为 RTX 2080Ti 之后就没有这个问题了
 
 
2.3. 预测
修改 train_inference.sh
- 注释掉 train 部分代码
 - 修改 predict 部分代码路径为自己的路径
 - 复制 
inference_tumor.py副本到路径/root/nnFormerFrame/DATASET/nnFormer_raw/nnFormer_raw_data/Task003_tumor 
执行如下指令:
bash train_inference.sh -c 0 -n nnformer_tumor -t 3
 
总结
按照上面的流程执行一遍后,就可以得到属于你自己的 nnFormer 了!
 参考资料



















