https://github.com/MIC-DKFZ/nnUNet/blob/master/documentation/dataset_conversion.md
Dataset conversion instructions
nnU-Net需要将数据转换成特定的格式,这种格式和Medical Segmentation Decathlon(MSD)很近似,但有不完全相同。
nnUNet_raw_data_base文件夹是nnUNet入口点(用户在安装nnunet时需要指定这个文件夹)。每个分割数据都指定一个‘task’,tasks管理一个task ID,三位数的整数(和MSD不同),task name可以随便取,例如Task005_Prostate中‘Prostate’是task name,‘5’是task id。 task存储在nnUNet_raw_data_base/nnUNet_raw_data:
nnUNet_raw_data_base/nnUNet_raw_data/
├── Task001_BrainTumour
├── Task002_Heart
├── Task003_Liver
├── Task004_Hippocampus
├── Task005_Prostate
├── ...
相应的每个task folder由于如下结构:
Task001_BrainTumour/
├── dataset.json
├── imagesTr
├── (imagesTs)
└── labelsTr
请将您的自定义任务id设置为100,以确保不会与下载的预训练模型发生冲突!!
imagesTr:训练数据。在该文件夹下,nnunet运行pipeline configuration,training with cross-validation,finding postprocesing和best ensemble。
imageTs(可选):测试数据。
labelsTr:训练数据的ground truth segmentation。
dataset.json:dataset的metadata。
每一个training case都有一个identifier也就是标识符,所有的images和labels都必须是3D的.nii.gz格式也就是nifti格式。
image的数据类型不限制。但是label文件必须是连续的整数,从0开始。0指的是背景。其他的连续非零数对应不同类别。数据集中数据可以是多模态的。图像的模态早mmU-Net中有四位整数的后缀来区分,也就是case_identifier_XXXX.nii.gz。这里的xxxx指的就是模态标识符。不同的模态标识符表示的含义在dataset.json文件中会说明。label文件也对于的表示为case_identifier.nii.gz
用户必须将数据修改为这样的命名方式。
Task of the MSD: BrainTumour目录示例,每个数据都有四种模态FLAIR (0000), T1w (0001), T1gd (0002) and T2w (0003). imagesTs 文件夹是可选的。
nnUNet_raw_data_base/nnUNet_raw_data/Task001_BrainTumour/
├── dataset.json
├── imagesTr
│ ├── BRATS_001_0000.nii.gz
│ ├── BRATS_001_0001.nii.gz
│ ├── BRATS_001_0002.nii.gz
│ ├── BRATS_001_0003.nii.gz
│ ├── BRATS_002_0000.nii.gz
│ ├── BRATS_002_0001.nii.gz
│ ├── BRATS_002_0002.nii.gz
│ ├── BRATS_002_0003.nii.gz
│ ├── BRATS_003_0000.nii.gz
│ ├── BRATS_003_0001.nii.gz
│ ├── BRATS_003_0002.nii.gz
│ ├── BRATS_003_0003.nii.gz
│ ├── BRATS_004_0000.nii.gz
│ ├── BRATS_004_0001.nii.gz
│ ├── BRATS_004_0002.nii.gz
│ ├── BRATS_004_0003.nii.gz
│ ├── ...
├── imagesTs
│ ├── BRATS_485_0000.nii.gz
│ ├── BRATS_485_0001.nii.gz
│ ├── BRATS_485_0002.nii.gz
│ ├── BRATS_485_0003.nii.gz
│ ├── BRATS_486_0000.nii.gz
│ ├── BRATS_486_0001.nii.gz
│ ├── BRATS_486_0002.nii.gz
│ ├── BRATS_486_0003.nii.gz
│ ├── BRATS_487_0000.nii.gz
│ ├── BRATS_487_0001.nii.gz
│ ├── BRATS_487_0002.nii.gz
│ ├── BRATS_487_0003.nii.gz
│ ├── BRATS_488_0000.nii.gz
│ ├── BRATS_488_0001.nii.gz
│ ├── BRATS_488_0002.nii.gz
│ ├── BRATS_488_0003.nii.gz
│ ├── BRATS_489_0000.nii.gz
│ ├── BRATS_489_0001.nii.gz
│ ├── BRATS_489_0002.nii.gz
│ ├── BRATS_489_0003.nii.gz
│ ├── ...
└── labelsTr
├── BRATS_001.nii.gz
├── BRATS_002.nii.gz
├── BRATS_003.nii.gz
├── BRATS_004.nii.gz
├── ...
MSD中单一模态的例子:
nnUNet_raw_data_base/nnUNet_raw_data/Task002_Heart/
├── dataset.json
├── imagesTr
│ ├── la_003_0000.nii.gz
│ ├── la_004_0000.nii.gz
│ ├── ...
├── imagesTs
│ ├── la_001_0000.nii.gz
│ ├── la_002_0000.nii.gz
│ ├── ...
└── labelsTr
├── la_003.nii.gz
├── la_004.nii.gz
├── ...
nnU-Net使用的dataset.json与MSD的一致,自定义task也需要创建并报市结构与原来的dataset.json一致,可以堆在MSD数据作参考。
现在有一个工具可以自动的生成dataset.json,也就是文本中的generate_dataset_json,Task120会交给你如何使用它。
Prostate task的dataset.json:
{
"name": "PROSTATE",
"description": "Prostate transitional zone and peripheral zone segmentation",
"reference": "Radboud University, Nijmegen Medical Centre",
"licence":"CC-BY-SA 4.0",
"relase":"1.0 04/05/2018",
"tensorImageSize": "4D",
"modality": {
"0": "T2",
"1": "ADC"
},
"labels": {
"0": "background",
"1": "PZ",
"2": "TZ"
},
"numTraining": 32,
"numTest": 16,
"training":[{"image":"./imagesTr/prostate_16.nii.gz","label":"./labelsTr/prostate_16.nii.gz"},{"image":"./imagesTr/prostate_04.nii.gz","label":"./labelsTr/prostate_04.nii.gz"},...],
"test": ["./imagesTs/prostate_08.nii.gz","./imagesTs/prostate_22.nii.gz","./imagesTs/prostate_30.nii.gz",...]
}
如果没有test数据,就直接使用"test": []
对应的数据集转换脚本在这里可以找到。
How to use decathlon datasets
nnU-Net的上一个版本允许用户从4D或3D niftis开始。使用专门的命令将MSD datasets转换为上面指定的数据格式:
nnUNet_convert_decathlon_task -i FOLDER_TO_TASK_AS_DOWNLOADED_FROM_MSD -p NUM_PROCESSES
FOLDER_TO_TASK_AS_DOWNLOADED_FROM_MSD 需要指向下载的任务文件夹(如Task05_Prostate,请注意这里的task id是两位数。)转换后的task会以相同的名称保存在nnUNet_raw_data_base/nnUNet_raw_data中,不过task id是三位数。可以使用可选的-output_task_id指定转换后的task id。
How to use 2D data with nnU-Net
非生物领域可能有一些nnU-Net不支持的预训练网络架构,可能需要用到2D的数据分割,在histopathological segmentation的细胞跟踪挑战赛上nnU-Net也取得了很好的乘积。本质上所有的2D数据都需要转换成伪3D图像,也就是将shape(x,y)数据转变为shape(1,x,y)形式,并且必须以nifti格式存储。以 massachusetts road segmentation dataset为例,脚本中包含了很多注释和有用信息,这里也有一个类似脚本。
How to convert other image formats to nifti
可以参照如下示例: