文章目录
- 前言
- 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 了!
参考资料