给定某个数据集,nnU-Net完全自动执行整个分割过程,包括数据预处理
到模型配置
、模型训练
、后处理
到集成
的整个过程,而不需要人为干预。此外,训练好的模型还可以应用到测试集中进行推理。
博主强烈建议:做医学图像分割的任何人,都必须要会使用nnU-Net
理由2个:
论文解读- nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation(附实现教程)
nnU-Net 如何安装–傻瓜式安装教程
nnU-Net实战一使用预训练nnU-Net模型进行推理
nnU-Net 需要结构化格式的数据集。并将原始数据存放在文件夹
nnUNet_raw_data_base/nnUNet_raw_data/TaskXXX_MYTASK
在nnU-Net实战一使用预训练nnU-Net模型进行推理 ,3.1 nnU-Net支持的数据格式这一小节已经讲了你需要把数据转换的格式。主要包含以下文件夹和文件。
imagesTr
: 训练图像。imagesTs
(可选): 测试图像labelTr
: 训练集标签。dataset.json
: 包含数据集的元数据, 如任务名字,模态,标签含义,训练集包含的图像地址。这里讲一下,dataset.json
这个文件怎么弄。一个合格的文件应该包含如下信息:
当然,代码能力强的可以自己写一个~
使用命令: nnUNet_plan_and_preprocess
nnUNet_plan_and_preprocess -t XXX --verify_dataset_integrity
作用: 它会自动读取 数据集的属性,例如图像大小、体素间距、强度信息等。并转换成模型需要的格式。
XXX是与您的任务名称相关联的整数标识符TaskXXX_MYTASK(如005, 就写5)。您可以一次传递多个任务 ID。
–verify_dataset_integrity 对数据集执行一些检查以确保它与 nnU-Net 兼容。如果此检查已通过一次,则可以在以后的运行中省略。如果您遵守数据集转换指南(见上文),那么这应该毫无问题地通过:-)
nnUNet_plan_and_preprocess
完成后,结果保存在文件夹
nnUNet_preprocessed / TaskXXX_MYTASK。
使用命令 nnUNet_train
该命令参数很多,可以使用nnUNet_train -h
查看参数的含义
该命令的一般结构为:
nnUNet_train CONFIGURATION TRAINER_CLASS_NAME TASK_NAME_OR_ID FOLD (additional options)
2D U-Net
, 3D U-Net
and a U-Net Cascade
(U-Net级联)。举例一: 2D U-Net 训练第三折
nnUNet_train 2d nnUNetTrainerV2 Task100_adrenal 3
或者
nnUNet_train 2d nnUNetTrainerV2 100 3
举例二: 3D full resolution U-Net 训练第二折
nnUNet_train 3d_fullres nnUNetTrainerV2 Task100_adrenal 2
举例三: 3D U-Net cascade 训练第二折
分为两步
step1 : 3D low resolution U-Net 训练
nnUNet_train 3d_lowres nnUNetTrainerV2 TaskXXX_MYTASK FOLD
step2: 3D full resolution U-Net 训练
nnUNet_train 3d_cascade_fullres nnUNetTrainerV2CascadeFullRes TaskXXX_MYTASK FOLD
tips
: 3D full resolution U-Net 训练需要使用nnUNetTrainerV2CascadeFullRes
训练过程中,终端会输出以下信息:大致包括使用的模型,数据信息,损失函数,网络架构,每个epoch的输出。
我们将训练好的模型写入 RESULTS_FOLDER/nnUNet 文件夹。每次训练都会获得一个自动生成的输出文件夹名称:
nnUNet_preprocessed/CONFIGURATION/TaskXXX_MYTASKNAME/TRAINER_CLASS_NAME__PLANS_FILE_NAME/FOLD
在训练期间,观察进度通常很有用。因此,我们随时可以查看 progress.png。它将在每个epoch后进行更新。
nnU-Net训练时间还是比较久的,毕竟默认跑1000epochs, 假如突然断电了怎么办,难道要重新来吗?
当然不是, nnU-Net 每 50 个 epoch 存储一个检查点。如果您需要继续之前的训练,只需在训练命令中添加一个==-c==即可。如:
nnUNet_train 2d nnUNetTrainerV2 100 3 -c
训练完成后,我们当然要看看在测试集上的表现啦。
使用命令 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 /home/.../nnunet_file/nnUNet_raw/nnUNet_raw_data/Task100_adrenal/imagesTs -o /home/.../nnunet_file/output -t 100 -m 2d -f 2
分割结果保存在OUTPUT_FOLDER,自行打开查看吧~
总结: 虽然写了这么多,其实也就4行命令就搞定了,每个步骤一行命令。nnUNet有一个不好的地方是,他的预测是没有Dice得分的,因为他不接收测试集的标签。
到这里,nnUNet的使用就分享结束了呀,欢迎评论区交流~
文章持续更新,可以关注微信公众号【医学图像人工智能实战营】获取最新动态,一个关注于医学图像处理领域前沿科技的公众号。坚持已实践为主,手把手带你做项目,打比赛,写论文。凡原创文章皆提供理论讲解,实验代码,实验数据。只有实践才能成长的更快,关注我们,一起学习进步~
我是Tina, 我们下篇博客见~