Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimize data augmentation for 3D kernel #57

Open
1 of 3 tasks
jcohenadad opened this issue Dec 17, 2022 · 8 comments
Open
1 of 3 tasks

Optimize data augmentation for 3D kernel #57

jcohenadad opened this issue Dec 17, 2022 · 8 comments
Labels

Comments

@jcohenadad
Copy link
Member

jcohenadad commented Dec 17, 2022

Useful syntax

To look at predictions with GT. Run under the data_seg_mp2rage_20221220_124553/data_processed_lesionseg folder:

for i in 017 025 058 079 082 098 103 111 114 115; do fsleyes -S sub-P${i}/anat/sub-P${i}_UNIT1 derivatives/labels/sub-P${i}/anat/sub-P${i}_UNIT1_lesion-manualHaris -cm yellow ../../model_seg_lesion_mp2rage_xxx/pred_masks/sub-P${i}_UNIT1_pred -cm red -a 50; done

TODO:

  • Use less conservative cropping during preprocessing, to avoid the 'black edge', which could limit the performance of training (ie: model would focus on edge detection).
  • Use softseg
  • Looks like only one lesion is segmented. Maybe check post-processing (keep only one object).

image

config file
{
    "command": "train",
    "gpu_ids": [4],
    "path_output": "/home/GRAMES.POLYMTL.CA/p101317/data_nvme_p101317/model_seg_lesion_mp2rage_",
    "model_name": "model_seg_lesion_mp2rage",
    "debugging": true,
    "object_detection_params": {
        "object_detection_path": null,
        "safety_factor": [1.0, 1.0, 1.0]
    },
    "wandb": {
        "wandb_api_key": "9095e2bc9e4ab445d478c9c8a81759ae908be8c6",
        "project_name": "basel-mp2rage-lesion",
        "group_name": "3D",
        "run_name": "run-1",
        "log_grads_every": 100
    },
    "loader_parameters": {
        "path_data": ["/home/GRAMES.POLYMTL.CA/p101317/data_nvme_p101317/data_seg_mp2rage_20221217_170634/data_processed_lesionseg"],
        "subject_selection": {"n": [], "metadata": [], "value": []},
        "target_suffix": ["_lesion-manualHaris"],
        "extensions": [".nii.gz"],
        "roi_params": {
            "suffix": null,
            "slice_filter_roi": null
        },
        "contrast_params": {
            "training_validation": ["UNIT1"],
            "testing": ["UNIT1"],
            "balance": {}
        },
        "slice_filter_params": {
            "filter_empty_mask": true,
            "filter_empty_input": true
        },
        "slice_axis": "axial",
        "multichannel": false,
        "soft_gt": false,
        "bids_validate": true
    },
    "split_dataset": {
        "fname_split": null,
        "random_seed": 42,
        "split_method" : "participant_id",
        "data_testing": {"data_type": null, "data_value":[]},
        "balance": null,
        "train_fraction": 0.6,
        "test_fraction": 0.2
    },
    "training_parameters": {
        "batch_size": 16,
        "loss": {
            "name": "DiceLoss"
        },
        "training_time": {
            "num_epochs": 50,
            "early_stopping_patience": 50,
            "early_stopping_epsilon": 0.001
        },
        "scheduler": {
            "initial_lr": 0.001,
            "lr_scheduler": {
                "name": "CosineAnnealingLR",
                "base_lr": 1e-5,
                "max_lr": 1e-3
            }
        },
        "balance_samples": {
            "applied": false,
            "type": "gt"
        },
        "mixup_alpha": null,
        "transfer_learning": {
            "retrain_model": null,
            "retrain_fraction": 1.0,
            "reset": true
        }
    },
    "default_model": {
        "name": "Unet",
        "dropout_rate": 0.3,
        "bn_momentum": 0.1,
        "final_activation": "sigmoid",
        "depth": 3
    },
    "FiLMedUnet": {
        "applied": false,
        "metadata": "contrasts",
        "film_layers": [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
    },
    "Modified3DUNet": {
        "applied": true,
        "length_3D": [32, 32, 64],
        "stride_3D": [32, 32, 64],
        "attention": false,
        "n_filters": 8
    },
    "uncertainty": {
        "epistemic": false,
        "aleatoric": false,
        "n_it": 0
    },
    "postprocessing": {
        "remove_noise": {"thr": -1},
        "keep_largest": {},
        "binarize_prediction": {"thr": 0.5},
        "uncertainty": {"thr": -1, "suffix": "_unc-vox.nii.gz"},
        "fill_holes": {},
        "remove_small": {"unit": "vox", "thr": 3}
    },
    "evaluation_parameters": {
        "target_size": {"unit": "vox", "thr": [20, 100]},
        "overlap": {"unit": "vox", "thr": 3}
    },
    "transformation": {
        "Resample":
        {
            "hspace": 0.75,
            "wspace": 0.75,
            "dspace": 0.75
        },
        "CenterCrop": {
            "size": [64, 64, 128]},

        "RandomAffine": {
            "degrees": 5,
            "scale": [0.1, 0.1],
            "translate": [0.1, 0.1],
            "applied_to": ["im", "gt"],
            "dataset_type": ["training"]
        },
        "ElasticTransform": {
            "alpha_range": [28.0, 30.0],
            "sigma_range":  [3.5, 4.5],
            "p": 0.1,
            "applied_to": ["im", "gt"],
            "dataset_type": ["training"]
	},		    
	"NormalizeInstance": {"applied_to": ["im"]}
    }
}
@jcohenadad
Copy link
Member Author

jcohenadad commented Dec 17, 2022

image

Terminal output
{
    "command": "train",
    "gpu_ids": [4],
    "path_output": "/home/GRAMES.POLYMTL.CA/p101317/data_nvme_p101317/model_seg_lesion_mp2rage_",
    "model_name": "model_seg_lesion_mp2rage",
    "debugging": true,
    "object_detection_params": {
        "object_detection_path": null,
        "safety_factor": [1.0, 1.0, 1.0]
    },
    "wandb": {
        "wandb_api_key": "9095e2bc9e4ab445d478c9c8a81759ae908be8c6",
        "project_name": "basel-mp2rage-lesion",
        "group_name": "3D",
        "run_name": "run-1",
        "log_grads_every": 100
    },
    "loader_parameters": {
        "path_data": ["/home/GRAMES.POLYMTL.CA/p101317/data_nvme_p101317/data_seg_mp2rage_20221217_170634/data_processed_lesionseg"],
        "subject_selection": {"n": [], "metadata": [], "value": []},
        "target_suffix": ["_lesion-manualHaris"],
        "extensions": [".nii.gz"],
        "roi_params": {
            "suffix": null,
            "slice_filter_roi": null
        },
        "contrast_params": {
            "training_validation": ["UNIT1"],
            "testing": ["UNIT1"],
            "balance": {}
        },
        "slice_filter_params": {
            "filter_empty_mask": true,
            "filter_empty_input": true
        },
        "slice_axis": "axial",
        "multichannel": false,
        "soft_gt": false,
        "bids_validate": true
    },
    "split_dataset": {
        "fname_split": null,
        "random_seed": 42,
        "split_method" : "participant_id",
        "data_testing": {"data_type": null, "data_value":[]},
        "balance": null,
        "train_fraction": 0.6,
        "test_fraction": 0.2
    },
    "training_parameters": {
        "batch_size": 16,
        "loss": {
            "name": "DiceLoss"
        },
        "training_time": {
            "num_epochs": 50,
            "early_stopping_patience": 50,
            "early_stopping_epsilon": 0.001
        },
        "scheduler": {
            "initial_lr": 0.001,
            "lr_scheduler": {
                "name": "CosineAnnealingLR",
                "base_lr": 1e-5,
                "max_lr": 1e-3
            }
        },
        "balance_samples": {
            "applied": false,
            "type": "gt"
        },
        "mixup_alpha": null,
        "transfer_learning": {
            "retrain_model": null,
            "retrain_fraction": 1.0,
            "reset": true
        }
    },
    "default_model": {
        "name": "Unet",
        "dropout_rate": 0.3,
        "bn_momentum": 0.1,
        "final_activation": "sigmoid",
        "depth": 3
    },
    "FiLMedUnet": {
        "applied": false,
        "metadata": "contrasts",
        "film_layers": [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
    },
    "Modified3DUNet": {
        "applied": true,
        "length_3D": [32, 32, 64],
        "stride_3D": [32, 32, 64],
        "attention": false,
        "n_filters": 8
    },
    "uncertainty": {
        "epistemic": false,
        "aleatoric": false,
        "n_it": 0
    },
    "postprocessing": {
        "remove_noise": {"thr": -1},
        "keep_largest": {},
        "binarize_prediction": {"thr": 0.5},
        "uncertainty": {"thr": -1, "suffix": "_unc-vox.nii.gz"},
        "fill_holes": {},
        "remove_small": {"unit": "vox", "thr": 3}
    },
    "evaluation_parameters": {
        "target_size": {"unit": "vox", "thr": [20, 100]},
        "overlap": {"unit": "vox", "thr": 3}
    },
    "transformation": {
        "Resample":
        {
            "hspace": 0.75,
            "wspace": 0.75,
            "dspace": 0.75
        },
        "CenterCrop": {
            "size": [128, 128, 128]},
	"NormalizeInstance": {"applied_to": ["im"]}
    }
}

@jcohenadad
Copy link
Member Author

image

Change:

        {
            "hspace": 1,
            "wspace": 1,
            "dspace": 1
        },
        "CenterCrop": {
            "size": [64, 64, 64]},

@jcohenadad
Copy link
Member Author

jcohenadad commented Jan 4, 2023

Investigating the orientation and kernel size. With the following config:

        "slice_axis": "axial",
...
    "Modified3DUNet": {
        "applied": true,
        "length_3D": [
            32,
            32,
            16
        ],

Here is a patch:

imgplot = plt.imshow(img[4, 0, :, :, 8])

Screen Shot 2023-01-04 at 2 33 10 PM

So, it seems like the orientation is consistent, ie: the superior-inferior direction is along the 3rd dim (the "8").

@jcohenadad
Copy link
Member Author

jcohenadad commented Jan 5, 2023

Now, let's look whether a modified CenterCrop enables to reach the entire SI axis:

        "CenterCrop": {"size": [32, 32, 128]},

Provides the proper coverage. Below are one image corresponding to the center of each patch (16 vox in SI direction), using stride of 14 along the SI direction (hence, there are 9 batches to cover 128):
Screen Shot 2023-01-04 at 8 05 12 PM
Screen Shot 2023-01-04 at 8 06 03 PM
Screen Shot 2023-01-04 at 8 06 17 PM
Screen Shot 2023-01-04 at 8 06 31 PM
Screen Shot 2023-01-04 at 8 06 41 PM
Screen Shot 2023-01-04 at 8 06 49 PM
Screen Shot 2023-01-04 at 8 06 58 PM
Screen Shot 2023-01-04 at 8 07 17 PM

One thing to note, though, is that the centercrop along the AP direction might be too aggressive.

@jcohenadad
Copy link
Member Author

This is how a CenterCrop below look like:

        "CenterCrop": {"size": [64, 32, 128]},

Screen Shot 2023-01-04 at 8 35 59 PM

So we need to go with 32x64x128.

@jcohenadad
Copy link
Member Author

OK well, 64x128x96 is not appropriate:
image

@jcohenadad
Copy link
Member Author

that seems more appropriate, but I don't like the cropping in the AP direction with:

        "length_3D": [32, 32, 64],
        "stride_3D": [1, 2, 2],
        "CenterCrop": {"size": [32, 64, 128]},

image

@jcohenadad
Copy link
Member Author

jcohenadad commented Jan 5, 2023

Changing for:

        "length_3D": [32, 64, 64],
        "stride_3D": [1, 1, 2],
        "CenterCrop": {"size": [32, 64, 128]},

Looks much better:
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant