nnunet实战-全流程使用nnunet模型跑自己的数据集

这个帖子仅用于学习使用,参考大佬的CSDN帖子。
nnU-Net 如何安装–傻瓜式安装教程
nnUNet实战一使用预训练nnUNet模型进行推理
不用写代码神器!教你用4行命令轻松使用nnUNet训练自己的医学图像分割模型
这篇文章介绍如何使用nnunet封装好的框架和命令跑自己的数据,不涉及后续代码的修改。

1 创建安装nnunet的环境

nnU-Net只在Linux上测试(ubuntu16、18和20;centOS, RHEL)

1.1使用AutoDL服务器 创建Ubuntu

(1)安装安装venv模块

该模块是标准Python 3库的一部分,以便我们可以创建虚拟环境(virtualenv)。
通过以下步骤安装:

  1. 更新python版本
sudo apt update && sudo apt upgrade
  1. 更新ubuntu版本
sudo apt upgrade python3
  1. 安装venv
sudo apt install python3-venv
(2)创建虚拟环境存放目录

让我们选择要将Python编程环境放入哪个目录,建议将环境和大型数据都放到服务器的数据盘/root/autodl-tmp,否则后续系统盘会直接爆满无法继续运行程序。

  1. 进入/root/autodl-tmp
cd /root/autodl-tmp
  1. 创建一个新目录mkdir
mkdir environments
cd environments
  1. 创建虚拟环境
    进入创建好的目录:/root/autodl-tmp/environments,就可以通过运行以下命令来创建环境:
python3 -m venv nnunet

nnunet是虚拟环境的名字

  1. 激活环境
    这里激活要先切换到nnunet的上一级文件夹environments
cd ../
source nnunet/bin/activate

  1. 退出该环境
    要离开环境,输入deactivate,回到原始目录。
deactivate
(3)安装nnunet

激活进入虚拟环境之后

pip install nnunet

安装好后可以查看下安装了的包

 pip list
(4)设置环境变量

这一步对于nnUNet来讲很重要,nnU-Net需要知道原始数据,预处理数据和训练好的的模型保存在何处。
必须设置一下三个环境变量:
在/root/autodl-tmp的路径下新建文件夹nnunet,在nnunet中再新建三个文件夹

nnUNet_raw/nnUNet_raw_data
nnUNet_preprocessed
nnUNet_trained_models
  1. nnUNet_raw_data_base:原始文件存放地址。
    位于nnUNet_raw_data_base的文件夹必须至少具有子文件夹nnUNet_raw_data,该子文件夹又为每个任务包含一个子文件夹。用户需要将原始数据转换为一下格式:
nnUNet_raw_data_base="/root/autodl-tmp/nnunet/nnUNet_raw/nnUNet_raw_data"
  1. nnUNet_preprocessed:这是将保存预处理数据的文件夹。训练期间还将从此文件夹中读取数据。因此,重要的是将其放置在访问延迟低且吞吐量高的驱动器上(常规sata或nvme SSD足够)
nnUNet_preprocessed="/root/autodl-tmp/nnunet/nnUNet_preprocessed"
  1. RESULTS_FOLDER:这指定nnU-Net将在其中保存模型权重的位置。如果下载了预训练的模型,则将在此处保存它们。
RESULTS_FOLDER="/root/autodl-tmp/nnunet/nnUNet_trained_models"

如何设置环境变量
是在主目录中的.bashrc文件中设置路径

  1. 回到主目录
  2. 因为该目录隐藏可能看不到,运行ls -al以确保看到它,
    在极少数情况下,它可能不存在,您可以使用创建它 touch /.bashrc
cd ~
ls
ls -al
  1. 直接在终端修改/.bashrc,将以下行添加到底部:
nnUNet_raw_data_base="/root/autodl-tmp/nnunet/nnUNet_raw/nnUNet_raw_data"
nnUNet_preprocessed="/root/autodl-tmp/nnunet/nnUNet_preprocessed"
RESULTS_FOLDER="/root/autodl-tmp/nnunet/nnUNet_trained_models"

修改方法:

  • vim ~/.bashrc 进入到文件;
  • 直接按 i 键可以对文件进行修改, Esc + :+ wq 退出并保存修改之后的文件
  • 命令 :source ~/.bashrc 更新 .bashrc

设置成功!
通过输入echo $RESULTS_FOLDER来验证路径设置正确,并且应该打印出正确的文件夹。

输入:echo $RESULTS_FOLDER
输出:/root/autodl-tmp/nnunet/nnUNet_trained_models

2 数据集格式转换

2.1 nnU-Net支持的数据格式

nnU-Net的所有数据集都存放在nnUNet_raw_data_base/nnUNet_raw_data 文件夹(nnUNet_raw_data_base安装nnU-Net时指定了该文件夹的地址!)。

nnUNet_raw_data_base="/root/autodl-tmp/nnunet/nnUNet_raw/nnUNet_raw_data"

每个数据集都存储为单独的“Task”。统一命名为( “Task”“ID”_“任务名称”), “ID”是三位数的整, 任务名称(您可以自由选择. 比如Task005_Prostate以’Prostate’作为任务名称任务ID为5。像这样存储在nnUNet_raw_data_base / nnUNet_raw_data文件夹中。
因为后续要进行格式转换,所以我的数据一开始命名为:

Task05_lacrima_sac

在每一个Task文件夹里,又包含以下文件夹:

Task05_lacrima_sac/
imagesTr:训练图像
imagesTs(可选):测试图像
labelTr:训练集标签。
dataset.json:包含数据集的元数据, 如任务名字,模态,标签含义,训练集包含的图像地址

imagesTr和labelTr中的图像名称有要求:
图像和标签是相同的名字。所有图像(包括标签)必须是3D nifti文件(.nii.gz)!
图像和标签统一命名格式:

lacrimal_01.nii.gz
lacrimal_02.nii.gz
....

注意:
保证自己的label中的值和json文件中写的一致!

"modality":
{
"0":background
"1":lacrima_sac
}
确保自己label的值由[0,1]构成 !

详细的json文件看之前在服务器跑的例子

dataset.json:

2.2 转换数据

具体步骤:
step1 :激活nnUNet
step2: 使用nnUNet_convert_decathlon_task命令自动转格式

nnUNet_convert_decathlon_task -i $nnUNet_raw_data_base/nnUNet_raw_data/Task05_lacrima_sac

-i 后面 接 Task05_lacrima_sac(原始数据)存放地址

转换成功后,Task05_lacrima_sac 会重新命名为Task005_lacrima_sac

3 用自己的数据训练模型

3.1 一行命令数据预处理

使用命令: nnUNet_plan_and_preprocess

nnUNet_plan_and_preprocess -t XXX --verify_dataset_integrity

作用: 它会自动读取 数据集的属性,例如图像大小、体素间距、强度信息等。并转换成模型需要的格式。

XXX是与任务名称相关联的整数标识符TaskXXX_MYTASK(如005, 就写5)。

nnUNet_plan_and_preprocess -t 5 --verify_dataset_integrity

–verify_dataset_integrity 对数据集执行一些检查以确保它与 nnU-Net 兼容。如果此检查已通过一次,则可以在以后的运行中省略。
目前遇到的问题:

  • 真实label标签与json文件中的标签不匹配(需要检查真实label中的标签的数值,有几个标签,标签的值为几,json文件中的标签必须是连续的:可以为[0,1,2],但不可以[0,2]
  • 这个过程会占大量的内存,确保内存充足

nnUNet_plan_and_preprocess完成后,结果保存在文件夹nnUNet_preprocessed /Task05_lacrima_sac

3.2 一行命令数据预处理

使用命令 nnUNet_train
该命令参数很多,可以使用nnUNet_train -h查看参数的含义
该命令的一般结构为:

nnUNet_train CONFIGURATION TRAINER_CLASS_NAME TASK_NAME_OR_ID FOLD (additional options)
  • CONFIGURATION: 模型架构,三种Unet: 2D U-Net, 3D U-Net and a U-Net Cascade(U-Net级联)。
  • TRAINER_CLASS_NAME: 使用的model trainer. 默认为nnUNetTrainerV2就可以
  • TASK_NAME_OR_ID: 任务全名TaskXXX_MYTASK或者是ID号
  • FOLD: 第几折交叉验证,可选 [0, 1, 2, 3, 4],一共五折。

使用:3D full resolution U-Net 训练5折

nnUNet_train 3d_fullres nnUNetTrainerV2 Task05_lacrima_sac 4

训练过程中,终端会输出以下信息:大致包括使用的模型,数据信息,损失函数,网络架构,每个epoch的输出。
将训练好的模型写入 RESULTS_FOLDER/nnUNet 文件夹。每次训练都会获得一个自动生成的输出文件夹名称:

nnUNet_preprocessed/CONFIGURATION/TaskXXX_MYTASKNAME/TRAINER_CLASS_NAME__PLANS_FILE_NAME/FOLD

文件树大致如下:
在这里插入图片描述
每一折里面,又有图上红框所示内容。大致包括

  • debug.json:包含用于训练此模型的蓝图和推断参数的摘要。不容易阅读,但对调试非常有用;-)
  • model_best.model / model_best.model.pkl:训练期间确定的最佳模型的检查点文件。暂时没用。
  • model_final_checkpoint.model / model_final_checkpoint.model.pkl:最终模型的检查点文件(训练结束后)。这是用于验证和推理的内容。
  • progress.png:训练过程中的训练(蓝色)和验证(红色)损失图。还显示了评估指标的近似值(绿色)。这个近似值是前景类的平均 Dice 分数。
  • validation_raw:在这个文件夹中是训练完成后预测的验证案例。
    在训练期间,观察进度通常很有用。因此,我们随时可以查看 progress.png。它将在每个epoch后进行更新。

3.3 一行命令进行预测

训练完成后,我们当然要看看在测试集上的表现啦。
使用命令 nnUNet_predict

nnUNet_predict -i INPUT_FOLDER -o OUTPUT_FOLDER -t TASK_NAME_OR_ID -m CONFIGURATION

INPUT_FOLDER: 测试数据地址
OUTPUT_FOLDER: 分割数据存放地址
CONFIGURATION: 使用的什么架构,2d or 3d_fullres or 3d_cascade_fullres等

nnUNet_predict -i /root/autodl-tmp/nnunet/nnUNet_raw/nnUNet_raw_data/imagesTs -o /root/autodl-tmp/nnunet/output -t 005 -m 3d_fullres -f 4

总结:目前只是成功的将自己的数据集放到nnunet中跑,对于一些参数的调整和预测的Dice得分的设定,后续会继续总结,我要先去写Review了,下期再见!

  • 42
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值