MS 训练笔记【1】:nnUNet

news/2025/1/15 5:20:29/

文章目录

  • 前言
  • 1. 安装
  • 2. 训练与测试
    • 2.1. 数据处理
      • 2.1.1. 整理数据路径
      • 2.1.2. 设置 nnFormer 读取文件的路径
      • 2.1.3. 数据集预处理
    • 2.2. 训练
      • 2.2.1. 训练代码
    • 2.2. 预测
  • 总结


前言

nnUNet是德国癌症研究中心的工程师编写的框架,迄今为止依旧在维护和更新。本文主要记载 nnUNet 从安装到训练再到推理的过程。

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


1. 安装

  • 官方系统版本
    • nnU-Net需要GPU!为了推断,GPU应该有4 GB的VRAM。对于培训nnU-Net模型,GPU应至少具有10 GB
    • 对于培训,我们建议使用强大的CPU与GPU配合使用。建议至少6个CPU内核(12个线程)。CPU要求主要与数据增强和输入通道数量的扩展有关。
  • 安装步骤
  1. 安装 hiddenlayer,hiddenlayer 使 nnU-net 能够生成其生成的网络拓扑图
pip install --upgrade git+https://github.com/FabianIsensee/hiddenlayer.git@more_plotted_details#egg=hiddenlayer
  1. 在服务器上创建路径 nnUNetFrame
  2. 进入创建好的路径,克隆项目到服务器
    • 需要注意的是,可能需要使用国内一些加速的镜像网站才能比较流畅的 clone 到自己的服务器上
cd /root/nnUNetFramegit clone https://github.com/MIC-DKFZ/nnUNet.git
  1. 进入 clone 好的文件路径
cd nnUNet
  1. 执行安装指令
pip install -e .

安装完成这些以后,每一次对 nnUNet 的操作,都会在命令行里以 nnUNet_ 开头,代表着你的 nnUNet 开始工作的指令


2. 训练与测试

2.1. 数据处理

2.1.1. 整理数据路径

  • 进入创建的 nnFormerFrame 文件路径
cd /root/nnUNetFrame
  • 创建一个名为 DATASET 的文件夹
  • 进入创建好的 DATASET 文件夹
    • 依次创建
      • nnUNet_preprocessed - 存放原始数据预处理之后的数据
      • nnUNet_raw - 存放原始的训练的数据
      • nnUNet_trained_models - 存放训练的结果
  • 进入 nnUNet_raw
    • 依次创建
      • nnUNet_cropped_data - crop 以后的数据
      • nnUNet_raw_data - 原始数据
  • 最终的文件结构如图所示:
    在这里插入图片描述

2.1.2. 设置 nnFormer 读取文件的路径

  • 进入 .bashrc 文件,在文件末尾添加如下命令:
export nnUNet_raw_data_base="/root/nnUNetFrame/DATASET/nnUNet_raw"
export nnUNet_preprocessed="/root/nnUNetFrame/DATASET/nnUNet_preprocessed"
export RESULTS_FOLDER="/root/nnUNetFrame/DATASET/nnUNet_trained_models"
  • 更新资源:
source .bashrc

2.1.3. 数据集预处理

本实验使用的是医学图像十项全能 Task05_Prostate

  • 转换数据集,让它可以被 nnUNet 识别:
nnUNet_convert_decathlon_task -i /root/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task05_Prostate
  • 进行插值等操作
nnUNet_plan_and_preprocess -t 5

需要注意的是,这一步如果有提示有包没有安装成功,基本上可以确定是先前的环境没有配好,如果有出现报错请试着重新配一下环境

2.2. 训练

2.2.1. 训练代码

  • 找到路径 /root/nnUNetFrame/nnUNet/nnunet/training/network_training/ 下的 nnUNetTrainerV2.py,修改 epochs
    • 如果只是想得到一个训练结果,可以不用训练那么多轮 epochs(差不多200个epochs就收敛了)
    • 修改:
self.max_num_epochs = 400
  • 训练
    • 5 代表你的任务ID,4代表五折交叉验证中的第4折(0代表分成五折后的第一折)
nnUNet_train 3d_fullres nnUNetTrainerV2 5 4

训练结果

  • 训练曲线

    • 仅供参考
      在这里插入图片描述
  • 训练 log

2022-12-27 10:31:42.129562: 
epoch:  399 
2022-12-27 10:34:45.765983: train loss : -0.9746 
2022-12-27 10:35:06.985032: validation loss: -0.9035 
2022-12-27 10:35:06.985926: Average global foreground Dice: [0.9274] 
2022-12-27 10:35:06.986063: (interpret this as an estimate for the Dice of the different classes. This is not exact.) 
2022-12-27 10:35:13.525987: lr: 0.002349 
2022-12-27 10:35:13.526254: saving scheduled checkpoint file... 
2022-12-27 10:35:13.607831: saving checkpoint... 
2022-12-27 10:35:14.533169: done, saving took 1.01 seconds 
2022-12-27 10:35:14.534369: done 
2022-12-27 10:35:14.567537: saving checkpoint... 
2022-12-27 10:35:15.225455: done, saving took 0.69 seconds 
2022-12-27 10:35:15.226438: This epoch took 213.096802 s

2.2. 预测

nnUNet_predict -i /root/autodl-tmp/model/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task002_Heart/imagesTs/ -o /root/autodl-tmp/model/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task002_Heart/inferTs -t 2 -m 3d_fullres -f 4
nnUNet_predict -i /root/autodl-tmp/model/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task005_Prostate/imagesTs/ -o /root/autodl-tmp/model/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task005_Prostate/inferTs -t 5 -m 3d_fullres -f 4

各项参数含义:

  • nnUNet_predict:执行预测的命令;
  • -i: 输入(你的待推理测试集);
  • -o: 输出(测试集的推理结果);
  • -t: 你的任务对应的数字ID;
  • -m: 对应的训练时使用的网络架构;
  • -f: 数字4代表使用五折交叉验证训练出的模型;

总结

按照上面的流程执行一遍后,就可以得到属于你自己的 nnUNet 了!

训练参考
推理参考


http://www.ppmy.cn/news/7090.html

相关文章

SpringBoot重复读取HttpServletRequest中的内容

目录 0 问题的提出 1 调查 2 解决 2.1 添加Filter 2.2 将HttpServletRequest转换为ContentCachingRequestWrapper 2.3 获取缓存的内容 3 ContentCachingRequestWrapper源码解读 要点1:使用ByteArrayOutputStream保存缓存的内容 要点2:两个构造方法,区别是是否限制缓…

【BP靶场-服务端】SQL注入-17个实验

目录 一、SQL意义 1、目的: 2、示例: 二、检索隐藏数据 实验1:隐藏商品 三、颠覆应用程序逻辑 实验2:登陆逻辑 四、从其他数据库表中检索数据 实验3:判断列 实验4:判断字段对应位置 实验5&#…

工厂模式简单介绍

CSDN是我用过的最垃圾的东西 工厂方法模式 - 应用最广泛的模式 ###1.介绍:工厂方法模式(Factory Pattern)是创建型设计模式之一。工厂方法模式是一种 结构简单的模式。 ###2.定义:定义一个用于创建 对象的接口,让子类…

【unity3D】DoTween动画插件(上)

💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于游戏开发的学习笔记 🈶本篇是unity的DoTween动画插件 DoTween动画插件(上)基础知识一些常用方法DOMove和DoLocalMovefrom TerrnsDOText打字机…

【数学】三角函数小题

∣三角函数小题NightguardSeries.∣\begin{vmatrix}\huge{\textsf{ 三角函数小题 }}\\\texttt{Nightguard Series.}\end{vmatrix}​ 三角函数小题 Nightguard Series.​​ 以下是一些废话 不愿意看的可以跳过 最近守夜人更新得很慢,守夜人拖更主要有三个原因&#…

open-local部署之后k8s的kube-scheduler挂掉问题

搭建一套k8s集群之后,本地存储化方案选择了阿里巴巴的open-local,没部署open-local,k8s 的kube-scheduler一切正常,只要按照官方文档部署了open-local,k8s的kube-scheduler就会挂掉,不是被kill掉&#xff…

【C++】string类常用函数接口

在使用库函数中的string类时,需要包含头文件#include 。 1.构造函数和拷贝构造 string s1;string s2("hello world");string s3(s2);下面通过VS调试的监视窗口看一下初始化之后的内容: 还有一种构造函数,是拷贝一个字符串的一部分…

VLAN、动态路由协议和RIP

一、VLAN(交换机):虚拟局域网 (附:同一广播域内部,网络安全防御度最低) 1.作用:交换机和路由器协同工作后,将一个广播域可以逻辑的分割为多个广播域。 2.配置思路&…