https://github.com/MIC-DKFZ/nnUNet/blob/master/documentation/tutorials/custom_preprocessing.md
当你想要调整预处理preprocessing过程中resampling重采样的方式,或者你想要实现一个自定义归一化方案custom normalization scheme时,你需要创建一个新的自定义预处理类custom preprocessor class,以及一个实验规划器ExperimentPlanner来配合它。虽然这可能看起来很麻烦,但这种方法的优点是,同样的代码也可以用于推理inference,从而保证图像得到正确的预处理preprocessed(即模型所期望的方式)。
在本教程中,我们将为Task120 Massachusetts Road Segmentation实现一个自定义规范化方案custom normalization scheme。确保下载了数据集并在本教程之前运行Task120_Massachusetts_RoadSegm.py中的代码。
数据集中图像为RGB,取值范围为[0,255]。nnU-nets的默认归一化方案将每个颜色通道独立归一化,使其均值为0,标准偏差为1。理论上这样操作没毛病,但可能导致颜色通道之间的影响,从而干扰模型的表现。为了解决这个问题,新的归一化方法将把值范围从[0,255]重新缩放到[0,1],也就是直接除以255。因此,颜色通道之间将不再有变化。
新的预处理器类位于 preprocessor_scale_RGB_to_0_1.py.中。要真正使用它,我们需要告诉ExperimentPlanner它的名字。为此,最好创建一个新的ExperimentPlanner类。我创建了一个,并将其放在中xperiment_planner_2DUNet_v21_RGB_scaleto_0_1.py.
要运行新的预处理器,您需要在运行nnUNet_plan_and_preprocess时指定它附带的ExperimentPlanner:
nnUNet_plan_and_preprocess -t 120 -pl3d None -pl2d ExperimentPlanner2D_v21_RGB_scaleTo_0_1
然后在开启训练:
nnUNet_train 2d nnUNetTrainerV2 120 FOLD -p nnUNet_RGB_scaleTo_0_1
请注意,nnUNet_RGB_scaleTo_0_1是在我们的自定义ExperimentPlanner中定义的计划标识符plans identifier 。每当您要使用此训练产生的模型时,都为所有nnUNet_ *命令指定它。
现在,让所有的all 5 folds都在原始的nnU-Net以及使用新定义的规范化方案 normalization scheme的nnU-Net中运行。为了比较结果,你可以使用nnUNet_determine_postprocessing来获取必要的指标,例如:
nnUNet_determine_postprocessing -t 120 -tr nnUNetTrainerV2 -p nnUNet_RGB_scaleTo_0_1
这将在训练输出目录中创建一个cv_niftis_raw和cv_niftis_postprocessed子文件夹。在每个文件夹中都有一个summary.json文件,你可以用一个普通的文本编辑器打开。在这个文件中,每个训练示例的数据集中都有表示 5-fold cross-validation的metrics。在文件的最底部,通过平均(字段“mean”)来汇总metrics,这是您应该用来进行实验比较的东西。我建议使用不经过后期处理的summary.json(位于cv_niftis_raw中),因为确定后处理实际上可能会在训练集上过拟合。以下是我获得的结果:
Vanilla nnU-Net: 0.7720
new normalization scheme: 0.7711
(没有进步,但是值得一试!)
记住始终将custom ExperimentPlanner放在nnunet.experiment_planning(任何文件或子模块)和nnunet.preprocessing预处理程序(任何文件或子模块)。确保使用唯一的名称!
本教程中的示例类仅适用于2D。你需要为3D数据生成一套单独的计划器planner和预处理器preprocessor。