nnUNet是一个自适应的深度学习框架,专为医学图像分割任务设计。以下是关于nnUNet的详细解释和特点:
自适应框架:nnUNet能够根据具体的医学图像分割任务自动调整模型结构、训练参数等,从而避免了繁琐的手工调参过程。
自动化流程:nnUNet包含了从数据预处理到模型训练、验证及测试的全流程自动化工具,大大简化了使用深度学习进行医学图像分割的复杂度。
自适应网络结构调整:根据输入数据集的特点,nnUNet能够自动选择和配置合适的网络深度、宽度等超参数,确保模型在复杂性和性能之间取得平衡。
Patch-Based Training and Inference:nnUNet使用基于patch级别的训练方法,通过滑窗的方式遍历整个图像进行训练。在推理阶段,也采用类似的方法来生成整个图像的分割结果。这种方法对于处理大尺寸图像或有限显存的情况非常有效。
集成学习与交叉验证:nnUNet还采用了交叉验证策略以最大程度利用有限的数据集,并结合集成学习技术来提高模型预测的稳定性和准确性。
此外,nnUNet还提供了丰富的文档和示例,帮助用户更好地了解和使用该框架。要使用nnUNet,用户需要安装Python和相应的深度学习框架,然后按照官方文档提供的步骤进行操作即可。总的来说,nnUNet是一个功能强大、易于使用的深度学习框架,特别适用于医学图像分割任务。它的自适应特性、自动化流程和先进的训练策略使得用户能够更高效地构建和训练模型,同时获得更好的性能表现。
本文介绍nnunetv2的使用方法,快速学会nnunet的使用。
请确保您已经完成:【nnUNetv2实践】一、nnUNetv2安装
一、准备数据
1、下载数据集
本文使用MSD挑战赛的Task04_Hippocampus数据集作为测试,该数据集较小,非常适合做学习只用,首先下载Task04_Hippocampus数据集到本地并解压,如下图(我这里把数据集放到了nnUNet_raw里面,可以随意放置,记住路径)。
2、转换数据格式
接下来开始转换数据格式(路径更改为自己的数据集路径):
nnUNetv2_convert_MSD_dataset -i D:\DeepLearning\nnUNet\nnUNet_raw\Task04_Hippocampus
报以下错误说明环境变量未设置,这是因为【nnUNetv2实践】一、nnUNetv2安装中设置的环境变量是临时的:
设置环境变量(路径更改为自己的,我的是windows环境,如果是linux环境可以参考 【nnUNetv2实践】一、nnUNetv2安装):
set nnUNet_raw=D:/DeepLearning/nnUNet/nnUNet_raw
set nnUNet_preprocessed=D:/DeepLearning/nnUNet/nnUNet_preprocessed
set nnUNet_results=D:/DeepLearning/nnUNet/nnUNet_results
设置完成环境变量后重新运行本小结的数据格式转换代码,可以在nnUNet_raw下找到处理后的数据集:
处理后的图片会有0000后缀,如下图:
数据格式转换完成。
3、预处理并生成plan
完成数据格式转换后,使用如下命令进行预处理并生成plan:
nnUNetv2_plan_and_preprocess -d 4 --verify_dataset_integrity
过程如下,生成了2d和3d_fullres的plan,但是没有cascade unet的plan,这是因为这个数据集比较小,不需要生成级联网络:
可以在nnUNet_preprocessed文件夹下查看处理好的数据集:
可以看到该文件夹中有3个json文件,其中的nnUNetPlans.json是网络结构相关的配置文件,可自行查阅。
至此数据准备完成。
二、训练
完成以上步骤准备好数据集之后,就准备训练模型。
请注意:
1、对于本文的数据集来说nnunet有2d和3d_fullres共两个模型,且nnunet默认使用五折交叉验证的方式训练模型,既对2d和3d_fullres来说,各自训练五次。(对于部分数据集来说,还有3d_lowres, 3d_cascade_fullres模型)
2、本文的数据没有验证集,因为MSD挑战赛都是把测试集结果提交到官网进行评估的。
下面开始训练模型:
首先训练2d模型(4表示数据集编号,最后面的数字0,1,2,3,4表示五折的编号):
nnUNetv2_train 4 2d 0
nnUNetv2_train 4 2d 1
nnUNetv2_train 4 2d 2
nnUNetv2_train 4 2d 3
nnUNetv2_train 4 2d 4
然后训练3d_fullres模型:
nnUNetv2_train 4 3d_fullres 0
nnUNetv2_train 4 3d_fullres 1
nnUNetv2_train 4 3d_fullres 2
nnUNetv2_train 4 3d_fullres 3
nnUNetv2_train 4 3d_fullres 4
训练好之后,在nnUNet_results文件夹下有了以下内容,分别对应着2d和3d_fullres两个模型的训练结果:
打开2d文件夹,可以看到五折的训练结果:
打开任意一个文件夹,里面有权重和日志以及其他的训练结果:
三、验证并推理
训练好模型之后,可以使用nnunet的自动寻找最优模型的功能。其原理如下:
训练好2d\3d_fullres\3d_lowres\3d_cascade_fullres之后,每个模型都是五折,可以将模型的预测结果相加求平均作为新的预测结果(叫做ensemble),然后得到多个预测结果,选择精度最高的模型作为最终的推理模型。
注意:精度验证时,是把每折的验证集保存下来,5折得到的预测结果和训练集完全一致,直接和训练集一起计算相关指标。
nnunet的原理可以参考:nnunet原理讲解_哔哩哔哩_bilibili
1、验证
由于有ensemble的策略,所有需要模型预测的概率图(属于某个类别的概率,在0到1之间)而不是分割结果(0,1,2。。。),先每折生成npz文件(每个模型都要,本文只有2d和3d_fullres):
nnUNetv2_train 4 2d 0 --val --npz
nnUNetv2_train 4 2d 1 --val --npz
nnUNetv2_train 4 2d 2 --val --npz
nnUNetv2_train 4 2d 3 --val --npz
nnUNetv2_train 4 2d 4 --val --npz
nnUNetv2_train 4 3d_fullres 0 --val --npz
nnUNetv2_train 4 3d_fullres 1 --val --npz
nnUNetv2_train 4 3d_fullres 2 --val --npz
nnUNetv2_train 4 3d_fullres 3 --val --npz
nnUNetv2_train 4 3d_fullres 4 --val --npz
运行以上命令后,nnUNet_results文件夹的每折validation文件夹出现npz文件:
2、推理
nnunet可以自己找寻最优模型并给出推理命令,使用如下命令自动寻优:
nnUNetv2_find_best_configuration 4 -c 2d 3d_fullres -f 0 1 2 3 4
稍等等片刻,出现如下结果,我这里显示ensemble的结果比较好,提示我运行以下的命令(下面所有的命令都参考下图):
首先运行两个推理命令(-i指向的是转换格式后的文件夹目录,既文件名以0000结尾的,-o指向推理结果保存的位置):
nnUNetv2_predict -d Dataset004_Hippocampus -i nnUNet_raw\Dataset004_Hippocampus\imagesTs -o hippocampus_2d_predict -f 0 1 2 3 4 -tr nnUNetTrainer -c 2d -p nnUNetPlans --save_probabilities
nnUNetv2_predict -d Dataset004_Hippocampus -i nnUNet_raw\Dataset004_Hippocampus\imagesTs -o hippocampus_3d_fullres_predict -f 0 1 2 3 4 -tr nnUNetTrainer -c 3d_fullres -p nnUNetPlans --save_probabilities
因为要五折推理,可以看到每个图片推理都进行了5次:
2个模型各自推理完成后,进行ensemble(-i是上面推理的保存路径,-o指向输出的保存位置):
nnUNetv2_ensemble -i hippocampus_2d_predict hippocampus_3d_fullres_predict -o hippocampus_ensemble -np 8
等待运行完成后,进入最后一步:后处理,命令和上面那个图中的一致(-i是ensemble的保存位置,-o指向后处理结果的保存位置):
nnUNetv2_apply_postprocessing -i hippocampus_ensemble -o hippocampus_ensemble_pp -pp_pkl_file D:/DeepLearning/nnUNet/nnUNet_results\Dataset004_Hippocampus\ensembles\ensemble___nnUNetTrainer__nnUNetPlans__2d___nnUNetTrainer__nnUNetPlans__3d_fullres___0_1_2_3_4\postprocessing.pkl -np 8 -plans_json D:/DeepLearning/nnUNet/nnUNet_results\Dataset004_Hippocampus\ensembles\ensemble___nnUNetTrainer__nnUNetPlans__2d___nnUNetTrainer__nnUNetPlans__3d_fullres___0_1_2_3_4\plans.json
至此,完成了Task04_Hippocampus测试集的预测,可以提交到官网验证精度。
nnunet入门教程到此结束,后续可能会出高阶教程,如何修改网络结构和损失函数,如有疑问可私聊解答。