MS 训练笔记【2】:nnFormer

news2024/11/24 5:32:04

文章目录

  • 前言
  • 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。
  • 安装步骤
  1. 在服务器上创建路径 nnFormerFrame
  2. 进入创建好的路径,克隆项目到服务器
    • 需要注意的是,可能需要使用国内一些加速的镜像网站才能比较流畅的 clone 到自己的服务器上
cd /root/nnFormerFrame

git 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): 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
  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}
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. 可能出现的问题及解决办法

  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 了!
参考资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

invokeBeanFactoryPostProcessors的理解

invokeBeanFactoryPostProcessors的理解 Spring中有两个非常重要的扩展点&#xff1a; BeanFactoryPostProcessorBeanPostProcessor 其中第一个是可以对BeanDefinition注册时进行扩展&#xff0c;而第二个是对spring中IOC容器中的对象进行实例化的时候进行扩展。 今天主要谈一…

【安全漏洞】水平权限漏洞和垂直权限漏洞

前言 权限校验非常重要。如果不对水平、垂直权限做校验&#xff0c;就会发生泄漏用户数据的事故&#xff0c;造成P0故障。 一、水平权限漏洞 1、水平权限漏洞基本概念 什么是水平权限漏洞呢&#xff1f; 简单来说&#xff0c;水平权限漏洞是用户CURD了本不属于他的资源。以上图…

复活天若OCR的谷歌翻译接口

文章目录1. 资源2. 效果3. 前言4. 网络相关4.1. 网络判断4.2. 网络设置5. 修改5.1. 代码修改原理5.2. 代码修改1. 资源 这里直接放出来我已经修改编译好的天若OCR&#xff0c;开箱即用&#xff1a;https://www.lanzoui.com/ifT8t0jfv1gd 访问码&#xff1a;24647 不过需要说明…

性能优化系列之如何为不同格式的图片选择合适的应用场景?

文章の目录一、JPEG&#xff08;Joint Photographic Experts Group&#xff09;1、介绍2、不适合情形3、非常适合的情形二、PNG&#xff08;Portable Network Graphics&#xff09;1、介绍2、不适合的情形3、非常适合的情形三、GIF&#xff08;Graphics Interchange Format&…

【nowcoder】笔试强训Day9

目录 一、选择题 二、编程题 2.1另类加法 2.2走方格的方案数 一、选择题 1.下面程序的输出是:() String x"fmn"; x.toUpperCase(); String yx.replace(f,F); yy"wxy"; System.out.println(y); A FmNwxy B fmnwxy C wxyfmn D Fmnwxy String x “…

决胜「年货时代」:一场关于零食的品质突围

“都说冰糖葫芦儿酸&#xff0c;酸里面它裹着甜&#xff1b;都说冰糖葫芦儿甜&#xff0c;可甜里面它透着那酸。” 1995年春节&#xff0c;伴随着《冰糖葫芦》唱响大街小巷&#xff0c;小贩骑着自行车&#xff0c;后车座的草靶子上插满冰糖葫芦&#xff0c;或摆在集市上&#…

大数据系列——什么是hive?hive用来干什么的?hive常见问题是啥?

目录 一、什么是hive 二、为什么要使用Hive 三、Hive与Hadoop的关系 四、Hive与HDFS的关系 五、Hive与传统数据库区别 六、Hive中的数据存储是怎样的 七、对hive进行增删改查 八、排序逻辑 九、hive不支持update数据的解决方案 十、Hive中支持的分区类型有两种 十…

Linux部署前端Vue项目

Linux部署前端Vue项目 1 部署到tomcat上 1.1 部署Vue项目 打包项目 在命令行终端&#xff0c;输入命令&#xff0c;打包项目&#xff1a; npm run build将生成的dist文件夹下的所有内容复制到tomcat的webapps下 "推荐":在webapps下新建一个文件夹&#xff0c;例…

【互信息驱动:可逆神经网络】

Mutual Information-driven Pan-sharpening &#xff08;互信息驱动的全色锐化&#xff09; 全色锐化的目的是综合纹理丰富的全色图像和多光谱图像的互补信息&#xff0c;生成纹理丰富的多光谱图像。尽管已有的全色锐化方法取得了显著的进步&#xff0c;但它们并没有明确地加…

动态圣诞树-HTML

<!DOCTYPE HTML PUBLIC> <html> <head> <title>圣诞树</title> <meta charset"utf-8" > <style> html, body { width: 100%; height: 100%; margin: 0; padding: 0; border: 0; } div { margin: 0; padding: 0; border: 0…

docker高级篇:实战-自己开发的微服务怎么在docker上面运行?

通过前面的一系列学习,我们已经知道怎么制作dockerfile了。那么,本篇文章,咱们就把自己写的spring boot的demo项目,部署在docker上面。 案例目标: 我们自己开发的微服务怎么在docker上面运行呢? 1:通过IDEA新建一个普通的微服务模块 2:通过dockerfile发布微服务部署…

通过 api 和 keycloak 理解OIDC认证

参考资料 通过Keycloak API理解OAuth2与OpenID Connect 什么是keycloak如何在nodejs中使用它 如何通过 OIDC 协议实现单点登录&#xff1f; https://jwt.io/#encoded-jwt OIDC认证的简单demo 单点登录&#xff08;Single Sign On&#xff09;是目前比较流行的企业业务整合…

cut与分层抽样(Stratified Sampling)

个人觉得&#xff0c; 把分层抽样称为“分类采样”会更贴切一些。通常最基本的采样手段是&#xff1a;随机抽样&#xff0c;但是在很多场景下&#xff0c;随机抽样是有问题的&#xff0c;举一个简单的例子&#xff1a;如果现在要发起一个啤酒品牌知名度的调查问卷&#xff0c;我…

二、let进阶、const、全部变量与顶层对象

二、let进阶、const、全部变量与顶层对象 一、let进阶 let创建了块级作用域&#xff0c;每次循环时内部的块级作用域都会去访问外层块级作用域中的变量i&#xff0c;而外层块级作用域中的变量i都不同&#xff0c;所以打印0-9&#xff1b;类似于闭包&#xff1a;内部函数返回到…

MySQL【Primary key】主键约束

关键字: [ primary key ] 作用&#xff1a;用来唯一标识表中的一行记录 特点&#xff1a;1.唯一性约束非空约束 唯一且为空 唯一性约束&#xff1a;不允许出现重复值 非空约束&#xff1a;不允许出现空值&#xff0c;但不是 NULL 2.一个表最多只能有一个主键约束&#x…

35岁之后软件测试工程师靠什么养家?我还能继续做测试。

35岁真是一个焦虑的年龄&#xff0c;我一个在北京软件测试的朋友从一个大公司裸辞以后&#xff0c;年前应聘到了一家小公司做技术总监&#xff0c;因为疫情的爆发&#xff0c;公司倒闭了&#xff0c;他失业了。为了养家我这个朋友不得不冒着被病毒感染的危险开始送外卖。作为一…

Springboot整合Liquibase初始化数据库

一、前言 liquibase是一个数据库变更的版本控制工具。项目中通过liquibase解析用户编写的liquibase的配置文件,生成sql语句&#xff0c;并执行和记录。执行是根据记录确定sql语句是否曾经执行过&#xff0c;和配置文件里的预判断语句确定sql是否执行。 本篇文章给大家介绍spr…

RabbitMQ浏览器UI插件

Awesome RabbitMQ Management 该插件中文意思是"很棒的 RabbitMQ 管理",是对原生RabbitMQ的UI图形界面进行增强的一款插件。 可在Google Chrome商店中下载安装 概述 原文介绍 Awesome RabbitMQ Management RabbitMQ queues view can become unusable with many qu…

微服务 Spring Boot Mybatis-Plus 整合 EasyPOI 实现 Excel 一对多 导入

文章目录⛄引言一、EasyPOI 实现Excel 的一对多导入 -- 代码实现⛅需求说明⚡核心源码实现二、Easy POI 实现一对多导入 -- 测试三、效果图展示⛵小结⛄引言 Excel导入 是 开发中 很常用的 功能 &#xff0c;本篇讲解 如何使用 Spring Boot MyBatis -Plus 整合 EasyPOI 实现E…

2023年淘宝天猫年货节超级红包哪里领?

2023年淘宝天猫年货节超级红包哪里领? 姐妹们在淘宝年货节活动就就就要开始预热模式了&#xff0c;时间是12月27日中午12点&#xff0c;大家最爱的项目一定是领取超级红包了。这不&#xff0c;2023年的年货节就要开启了。但是&#xff0c;很多小伙伴还不知道&#xff0c;淘宝…