文章目录

  • 前言
  • 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,首先得确保自己的环境配置的没有问题。

有关 nnFormer 网络结构的讲解,可以看我的另一篇文章:MS-Model【2】:nnFormer


1. 安装

  • 官方系统版本

    • Ubuntu 18.01、Python 3.6、PyTorch 1.8.1 和 CUDA 10.1 。有关软件包和版本号的完整列表,请参阅 Conda 环境文件 environment.yml。
  • 安装步骤
  1. 在服务器上创建路径 nnFormerFrame
  2. 进入创建好的路径,克隆项目到服务器
    • 需要注意的是,可能需要使用国内一些加速的镜像网站才能比较流畅的 clone 到自己的服务器上
cd /root/nnFormerFramegit clone https://github.com/282857341/nnFormer.git
  1. 进入 clone 好的文件路径
cd nnFormer
  1. 使用 environment.yml 创建作者所提供的虚拟环境
conda env create -f environment.yml
  • 需要注意的是,这里可能会出现如下错误
Collecting package metadata (repodata.json): failedCondaHTTPError: 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/cloudmsys2: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudbioconda: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudmenpo: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudpytorch: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudsimpleitk: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  1. 进入虚拟环境
source activate nnFormer
  1. 执行安装指令
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}
thencd /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/nnFormerbash 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. 可能出现的问题及解决办法

  1. 从头开始训练,不使用预训练权重
  • 修改 /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
  1. 出现 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 结尾的文件即可
  1. 出现 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 了!
参考资料

MS-Train【2】:nnFormer相关推荐

  1. MS-Model【1】:nnU-Net

    文章目录 前言 1. Abstract & Introduction 1.1. Abstract 1.2. Introduction 2. Methods 2.1. Network archi ...

  2. 【TensorFlow】:Eager Mode(动态图模式)

    [TensorFlow]:Eager Mode(动态图模式) http://www.360doc.com/content/18/1207/16/7669533_800020620.shtml

  3. appium学习【二】:用try捕获异常后,用例的执行结果为pass

    appium学习[二]:用try捕获异常后,用例的执行结果为pass 参考文章: (1)appium学习[二]:用try捕获异常后,用例的执行结果为pass (2)https://www.cnblog ...

  4. 循序渐进学.Net Core Web Api开发系列【14】:异常处理

    循序渐进学.Net Core Web Api开发系列[14]:异常处理 参考文章: (1)循序渐进学.Net Core Web Api开发系列[14]:异常处理 (2)https://www.cnbl ...

  5. Java牛角尖【009】: 多线程中synchronized的锁定方式

    同一个对象中的一个synchronized方法如果已有一个线程进入,则其它的线程必须等该线程结束后才能进入该方法.那么,如果一个类中有多个synchronized方法,会有什么情况呢? 看下面一段代码 ...

  6. ubuntu安装portainer_Docker【二】:Docker管理工具Portainer

    本文目录:1.前言 2.Portainer介绍与安装 3.Portainer使用 4.配置拼音搜索 5.总结 1.前言: 系统环境: ubuntu16.04 docker版本:1.12.6 关于doc ...

  7. el-drawer点击的时候为什么有边框_剪映教学之视频拍摄加剪辑【一】:出视频上下黑色边框模糊效果,视频广告配音...

    抖音小视频已经成为风靡全国的一个app了,很多人都喜欢看抖音来打发时间,而经常看小视频的应该都见到过这种现象,就是有一些小视频我们在观看的时候,发现这个小视频的上下都有黑色边框或者模糊的效果,实际这都 ...

  8. Java牛角尖【003】:类初始化时的执行顺序

    在初始化一个类时,到底是先执行哪一部分,总体的执行顺序是什么样的呢,同样,当类被释放时,又是怎样一个顺序呢?先来看下面的代码好了. package net.moon.insignificant.com ...

  9. c语言的44种运算符,C语言重要知识点总结【9】:C语言运算符(详解)

    目录 一.前言 二.运算符分类 三.运算符的优先级 四.常用运算符 1. 算术运算符 2. 关系运算符 3. 逻辑运算符 4. 赋值运算符 5. 条件运算符 6. 逗号运算符 7. 强制类型转换运算符 ...

最新文章

  1. LoRDEC: accurate and efficient long read error correction LoRDEC:精确且高效的长read校正
  2. 记录一下水下相机标定
  3. 031_jQuery Ajax的post方法
  4. 王道考研 计算机网络1 计算机网络概念,组成,功能和分类
  5. 12款很酷的使用大头照的国外名片设计作品
  6. Linux下Tomcat性能优化--文件句柄数增大
  7. 渗透-N种反弹shell方法
  8. android 获取系统所有安装的应用程序
  9. 《终极算法--机器学习和人工智能如何重塑世界》
  10. Autodesk AutoCAD 2018 for mac
  11. linux硬盘速率测试,【Linux】测试硬盘读写速度
  12. 桌面计算机里没有桌面显示不出来怎么办,电脑桌面显示不出来图标 所有软件都可以正常工作 怎么解决?...
  13. 将个人文件夹挂载到服务器上,通过 WebDAV 将服务器全部或某个文件夹挂载到电脑上当网络硬盘 | 很文博客...
  14. php nette,php – Nette Framework – 自定义属性宏
  15. KY59 神奇的口袋
  16. 黑莓未死 出路在于保节操做精品/从贩卖祖屋到股价大涨黑莓回光返照?
  17. javase基础持续更新
  18. 每日三个笑话-20151008
  19. 李鬼见李逵——我用翟天临的论文做了分析
  20. Android 使用webview 打开浏览ppt文件

热门文章

  1. Arcgis更换布局模板_超详细的ArcGIS生成格网知识汇总
  2. 如何用scratch实现打色子的游戏
  3. 简单移动平均 指数移动平均
  4. 阴阳师ios和android,阴阳师:国际服已经可以IOS和安卓系统转换了,国服还遥遥无期...
  5. 缓存读写策略 Cache Aside Pattern,开发必备
  6. 鱼和熊掌可以兼得——矛盾在管理艺术下的和谐
  7. Python入门与各种系统安装部署应用
  8. macOS下载安装Java步骤
  9. Linux shellcode 编写入门 (转)
  10. Impinj 、NXP、Alien UHF芯片存储区划分