diff --git a/docs/replication-guide/baselines.md b/docs/replication-guide/baselines.md index 99d08f0..60678ef 100644 --- a/docs/replication-guide/baselines.md +++ b/docs/replication-guide/baselines.md @@ -1,2 +1,46 @@ # Reproduce Baselines -:hourglass_flowing_sand: Coming soon! :hourglass_flowing_sand: + +Reproducing baselines used in this study is very similar to the adaptation of the FM as essentially we are just using the FM weights for adaptation. + +## Randomly initialized + +We provide the YAML configuration to train the random init baseline at `experiments/baselines/supervised_training/supervised_random_init.yaml` + +By default, we configure this for Task 1. You can adapt this for Task 2 and Task 3 by searching for `Note: ` comments in the YAML that outline what must be changed. + +You can start training by running this in the root code folder, +```bash +lighter fit --config_file ./experiments/baselines/supervised_training/supervised_random_init.yaml +``` + +## Transfer learning +We provide the YAML configuration to train the transfer learning baseline at `experiments/baselines/supervised_training/supervised_finetune.yaml` + +This baseline is only used for Task 2 and Task 3 as we use the random init baseline from Task 1 for the transfer. Follow the `Note: ` comments to switch between Task 2 and Task 3 configurations. + +You can start training by running this in the root code folder, +```bash +lighter fit --config_file ./experiments/baselines/supervised_training/supervised_finetune.yaml +``` + +## Med3D / MedicalNet +Original repo: https://github.com/Tencent/MedicalNet + +We have provided re-implementations of Med3D to fit into our YAML workflows at `experiments/baselines/med3d/finetune.yaml`. Again, the `Note: ` comments help adapt for different tasks. + + +You can start training by running this in the root code folder, +```bash +lighter fit --config_file ./experiments/baselines/med3d/finetune.yaml +``` + +## Models Genesis +Original repo: https://github.com/MrGiovanni/ModelsGenesis + +We have provided re-implementations of Models Genesis to fit into our YAML workflows at `experiments/baselines/models_genesis/finetune.yaml`. Again, the `Note: ` comments help adapt for different tasks. + + +You can start training by running this in the root code folder, +```bash +lighter fit --config_file ./experiments/baselines/models_genesis/finetune.yaml +``` diff --git a/docs/replication-guide/fm_adaptation.md b/docs/replication-guide/fm_adaptation.md index 593225c..ba24c36 100644 --- a/docs/replication-guide/fm_adaptation.md +++ b/docs/replication-guide/fm_adaptation.md @@ -6,7 +6,7 @@ The FM was adapted by either fine-tuning all its weights or by freezing its weig We provide the YAML configuration for this at `experiments/adaptation/fmcib_finetune.yaml`. -By default, we configure this for Task 1. You can adapt this for Task 2 and Task 3 by searching for 'Note: ' comments in the YAML that outline what must be changed. Make sure you download the weights for the pre-trained foundation model before attempting to reproduce this training. +By default, we configure this for Task 1. You can adapt this for Task 2 and Task 3 by searching for `Note: ` comments in the YAML that outline what must be changed. Make sure you download the weights for the pre-trained foundation model before attempting to reproduce this training. You can start training by running this in the root code folder, diff --git a/docs/replication-guide/inference.md b/docs/replication-guide/inference.md index 54bc25e..9566e84 100644 --- a/docs/replication-guide/inference.md +++ b/docs/replication-guide/inference.md @@ -12,10 +12,10 @@ lighter predict --config_file ./experiments/inference/extract_features.yaml !!! note While the above pipeline will allow you to extract features, we provide an easier and simpler, recommended API to do this. Please refer to [Quick Start](../getting-started/quick-start.md) or [Cloud Quick Start](../getting-started/cloud-quick-start.md) -However, this method might be preferred when features need to be extracted from different models (used as baselines in our study). Follow the `Note:` in the corresponding config file to change model paths. -## Running predictions from our supervised models (Finetuned FM/ Baselines) +However, this method might be preferred when features need to be extracted from different models (used as baselines in our study). Follow the `Note:` in the corresponding config file to change model paths and use different baselines tested. +## Running predictions from our supervised models (Finetuned FM/ Baselines) To run predictions from our models (both supervised and self-supervised), we provide YAML files that can be run with the lighter interface. These are found in `experiments/inference`, namely `get_predictions.yaml` for getting the predictions. @@ -37,3 +37,5 @@ lighter predict --config_file ./experiments/inference/get_predictions.yaml ``` As with the previous YAMLS, please follow the 'Note:' tags to place appropriate data paths and change relevant parameters. This YAML is to be used if you want to get target predictions from the models. +!!! note + The predictions can be extracted for different tasks as well as different baselines by following the `Note:` comments. diff --git a/experiments/baselines/med3d/extract_features.yaml b/experiments/baselines/med3d/extract_features.yaml deleted file mode 100644 index b71a547..0000000 --- a/experiments/baselines/med3d/extract_features.yaml +++ /dev/null @@ -1,60 +0,0 @@ -trainer: - _target_: pytorch_lightning.Trainer - benchmark: True - max_epochs: 100 - check_val_every_n_epoch: 4 - accelerator: gpu - devices: 1 - log_every_n_steps: 50 - logger: False - callbacks: - - _target_: fmcib.callbacks.SavePredictions - path: "out.csv" # Note: Change path to the CSV file to save predictions to. - save_preview_samples: 5 -system: - _target_: lighter.LighterSystem - batch_size: 32 - pin_memory: True - num_workers: 6 - model: - _target_: fmcib.models.LoadModel - trunk: - _target_: monai.networks.nets.resnet50 - widen_factor: 1 - bias_downsample: False - n_input_channels: 1 - conv1_t_stride: 1 - feed_forward: False - pretrained: False - weights_path: "./models/pretrained/med3d/resnet_50.pth" - - criterion: null - optimizers: null - schedulers: null - train_dataset: null - val_dataset: null - test_dataset: null - - predict_dataset: - _target_: fmcib.datasets.SSLRadiomicsDataset - path: "./data/preprocessing/deeplesion/annotations/task1_test.csv" # Note: Change path to the CSV file to extract features from. - label: "survival" # Note: Change the label to "malignancy" for task 2 and "survival" for task 3 - radius: 25 - orient: False # Note: Set orient to False for task 2 and task 3 - resample_spacing: [1, 1, 1] - enable_negatives: False - transform: - _target_: monai.transforms.Compose - transforms: - # - _target_: fmcib.transforms.IntensityNormalizeOneVolume ## Only for Med3D, MR only? - - _target_: monai.transforms.ScaleIntensityRange - a_min: -1000 - a_max: 1000 - b_min: 0.0 - b_max: 1.0 - clip: True - - _target_: monai.transforms.ToTensor - - _target_: monai.transforms.AddChannel - - _target_: monai.transforms.SpatialPad - spatial_size: [50, 50, 50] - diff --git a/experiments/baselines/med3d/supervised_training/finetune.yaml b/experiments/baselines/med3d/finetune.yaml similarity index 94% rename from experiments/baselines/med3d/supervised_training/finetune.yaml rename to experiments/baselines/med3d/finetune.yaml index 64c2f23..c504517 100644 --- a/experiments/baselines/med3d/supervised_training/finetune.yaml +++ b/experiments/baselines/med3d/finetune.yaml @@ -57,21 +57,20 @@ system: criterion: _target_: torch.nn.CrossEntropyLoss # Note: Change to torch.nn.BCEWithLogitsLoss for Task 2 and Task 3 - optimizers: + optimizer: _target_: torch.optim.Adam params: "$@system#model.parameters()" # lr: 0.001 # Compute L R dynamically for different batch sizes # weight_decay: 0.0 # momentum: 0.9 - schedulers: - scheduler: + scheduler: _target_: torch.optim.lr_scheduler.StepLR optimizer: "@system#optimizers" step_size: 30 - strict: True - train_metrics: + metrics: + train: - _target_: torchmetrics.AveragePrecision task: binary # Note: Change to `binary` for Task 2 and Task 3 and remove num_classes below # num_classes: 8 @@ -79,12 +78,11 @@ system: - _target_: torchmetrics.AUROC task: binary # Note: Change to `binary` for Task 2 and Task 3 and remove num_classes below # num_classes: 8 + val: "%#train" + test: "%#train" - - val_metrics: "%system#train_metrics" - test_metrics: "%system#train_metrics" - - train_dataset: + datasets: + train: _target_: fmcib.datasets.SSLRadiomicsDataset path: null # Note: Change path label: "survival" # Note: Change to "malignancy" for Task 2 and "survival" for Task 3 @@ -118,7 +116,7 @@ system: # subtrahend: -1024 # divisor: 3072 - val_dataset: + val: _target_: fmcib.datasets.SSLRadiomicsDataset path: null # Note: Change path label: "@system#train_dataset#label" @@ -141,6 +139,4 @@ system: - _target_: monai.transforms.SpatialPad spatial_size: [50, 50, 50] - - test_dataset: null - predict_dataset: null \ No newline at end of file + test: null \ No newline at end of file diff --git a/experiments/baselines/med3d/supervised_training/get_predictions_task1.yaml b/experiments/baselines/med3d/supervised_training/get_predictions_task1.yaml deleted file mode 100644 index 6518a1f..0000000 --- a/experiments/baselines/med3d/supervised_training/get_predictions_task1.yaml +++ /dev/null @@ -1,64 +0,0 @@ -trainer: - _target_: pytorch_lightning.Trainer - benchmark: True - max_epochs: 100 - check_val_every_n_epoch: 4 - accelerator: gpu - devices: 1 - log_every_n_steps: 50 - logger: False - callbacks: - - _target_: fmcib.callbacks.SavePredictions - path: "out.csv" # Note: Change path to the CSV file to save predictions to. - save_preview_samples: 5 -system: - _target_: lighter.LighterSystem - batch_size: 32 - pin_memory: True - num_workers: 3 - model: - _target_: fmcib.models.LoadModel - trunk: - _target_: monai.networks.nets.resnet50 - widen_factor: 1 - bias_downsample: False - n_input_channels: 1 - conv1_t_stride: 1 - feed_forward: False - pretrained: False - heads: [2048, 1024, 8] # Note: Change to [4096, 2048, 1] for Task 2 and Task 3 - weights_path: null - - post_criterion_activation: "$torch.nn.functional.softmax" # Note: Change to $torch.sigmoid for Task 2 and Task 3 - cast_target_dtype_to: "$torch.float32" # Note: Uncomment for Task 2 and Task 3 - - criterion: null - optimizers: null - schedulers: null - train_dataset: null - val_dataset: null - test_dataset: null - - predict_dataset: - _target_: fmcib.datasets.SSLRadiomicsDataset - path: "./data/preprocessing/deeplesion/annotations/task1_test.csv" # Note: Change path to the CSV file to extract features from. - label: "Coarse_lesion_type" # Note: Change the label to "malignancy" for task 2 and "survival" for task 3 - radius: 25 - orient: True # Note: Set orient to False for task 2 and task 3 - resample_spacing: [1, 1, 1] - enable_negatives: False - transform: - _target_: monai.transforms.Compose - transforms: - # - _target_: fmcib.transforms.IntensityNormalizeOneVolume ## Only for Med3D, MR only? - - _target_: monai.transforms.ScaleIntensityRange - a_min: -1000 - a_max: 1000 - b_min: 0.0 - b_max: 1.0 - clip: True - - _target_: monai.transforms.ToTensor - - _target_: monai.transforms.AddChannel - - _target_: monai.transforms.SpatialPad - spatial_size: [50, 50, 50] - diff --git a/experiments/baselines/med3d/supervised_training/get_predictions_task2.yaml b/experiments/baselines/med3d/supervised_training/get_predictions_task2.yaml deleted file mode 100644 index 1a3d3b5..0000000 --- a/experiments/baselines/med3d/supervised_training/get_predictions_task2.yaml +++ /dev/null @@ -1,62 +0,0 @@ -trainer: - _target_: pytorch_lightning.Trainer - benchmark: True - max_epochs: 100 - check_val_every_n_epoch: 4 - accelerator: gpu - devices: 1 - log_every_n_steps: 50 - logger: False - callbacks: - - _target_: fmcib.callbacks.SavePredictions - path: "out.csv" # Note: Change path to the CSV file to save predictions to. - save_preview_samples: 5 -system: - _target_: lighter.LighterSystem - batch_size: 8 - pin_memory: True - num_workers: 3 - model: - _target_: fmcib.models.LoadModel - trunk: - _target_: monai.networks.nets.resnet50 - widen_factor: 1 - bias_downsample: False - n_input_channels: 1 - conv1_t_stride: 1 - feed_forward: False - pretrained: False - heads: [2048, 1024, 1] # Note: Change to [4096, 2048, 1] for Task 2 and Task 3 - weights_path: null - post_criterion_activation: "$torch.sigmoid" # Note: Change to $torch.sigmoid for Task 2 and Task 3 - # cast_target_dtype_to: "$torch.float32" # Note: Uncomment for Task 2 and Task 3 - criterion: null - optimizers: null - schedulers: null - train_dataset: null - val_dataset: null - test_dataset: null - - predict_dataset: - _target_: fmcib.datasets.SSLRadiomicsDataset - path: "/home/suraj/Repositories/foundation-cancer-image-biomarker/data/csvs/luna16/luna16/test.csv" # Note: Change path to the CSV file to extract features from. - label: "malignancy" # Note: Change the label to "malignancy" for task 2 and "survival" for task 3 - radius: 25 - orient: False # Note: Set orient to False for task 2 and task 3 - resample_spacing: [1, 1, 1] - enable_negatives: False - transform: - _target_: monai.transforms.Compose - transforms: - # - _target_: fmcib.transforms.IntensityNormalizeOneVolume ## Only for Med3D, MR only? - - _target_: monai.transforms.ScaleIntensityRange - a_min: -1000 - a_max: 1000 - b_min: 0.0 - b_max: 1.0 - clip: True - - _target_: monai.transforms.ToTensor - - _target_: monai.transforms.AddChannel - - _target_: monai.transforms.SpatialPad - spatial_size: [50, 50, 50] - diff --git a/experiments/baselines/med3d/supervised_training/get_predictions_task3.yaml b/experiments/baselines/med3d/supervised_training/get_predictions_task3.yaml deleted file mode 100644 index a831ebc..0000000 --- a/experiments/baselines/med3d/supervised_training/get_predictions_task3.yaml +++ /dev/null @@ -1,61 +0,0 @@ -trainer: - _target_: pytorch_lightning.Trainer - benchmark: True - max_epochs: 100 - check_val_every_n_epoch: 4 - accelerator: gpu - devices: 1 - log_every_n_steps: 50 - logger: False - callbacks: - - _target_: fmcib.callbacks.SavePredictions - path: "out.csv" # Note: Change path to the CSV file to save predictions to. - save_preview_samples: 5 -system: - _target_: lighter.LighterSystem - batch_size: 8 - pin_memory: True - num_workers: 2 - model: - _target_: fmcib.models.LoadModel - trunk: - _target_: monai.networks.nets.resnet50 - widen_factor: 1 - bias_downsample: False - n_input_channels: 1 - conv1_t_stride: 1 - feed_forward: False - pretrained: False - heads: [2048, 1024, 512, 256, 1] # Note: Change to [4096, 2048, 1] for Task 2 and [4096, 2048, 512, 256, 1] Task 3 - weights_path: null - post_criterion_activation: "$torch.sigmoid" # Note: Change to $torch.sigmoid for Task 2 and Task 3 - # cast_target_dtype_to: "$torch.float32" # Note: Uncomment for Task 2 and Task 3 - criterion: null - optimizers: null - schedulers: null - train_dataset: null - val_dataset: null - test_dataset: null - - predict_dataset: - _target_: fmcib.datasets.SSLRadiomicsDataset - path: "/home/suraj/Repositories/foundation-cancer-image-biomarker/data/preprocessing/lung1/annotations.csv" # Note: Change path to the CSV file to extract features from. - label: "survival" # Note: Change the label to "malignancy" for task 2 and "survival" for task 3 - radius: 25 - orient: False # Note: Set orient to False for task 2 and task 3 - resample_spacing: [1, 1, 1] - enable_negatives: False - transform: - _target_: monai.transforms.Compose - transforms: - # - _target_: fmcib.transforms.IntensityNormalizeOneVolume ## Only for Med3D, MR only? - - _target_: monai.transforms.ScaleIntensityRange - a_min: -1000 - a_max: 1000 - b_min: 0.0 - b_max: 1.0 - clip: True - - _target_: monai.transforms.ToTensor - - _target_: monai.transforms.AddChannel - - _target_: monai.transforms.SpatialPad - spatial_size: [50, 50, 50] diff --git a/experiments/baselines/models_genesis/extract_features.yaml b/experiments/baselines/models_genesis/extract_features.yaml deleted file mode 100644 index 3d7559a..0000000 --- a/experiments/baselines/models_genesis/extract_features.yaml +++ /dev/null @@ -1,55 +0,0 @@ -trainer: - _target_: pytorch_lightning.Trainer - benchmark: True - max_epochs: 100 - check_val_every_n_epoch: 4 - accelerator: gpu - devices: 1 - log_every_n_steps: 50 - logger: False - callbacks: - - _target_: fmcib.callbacks.SavePredictions - path: "out.csv" # Note: Change path to the CSV file to save predictions to. - save_preview_samples: 5 - -system: - _target_: lighter.LighterSystem - batch_size: 32 - pin_memory: True - num_workers: 6 - model: - _target_: fmcib.models.LoadModel - trunk: - _target_: fmcib.models.ModelsGenesisUNet3D - decoder: False - weights_path: ./models/pretrained/models_genesis/Genesis_Chest_CT.pt - criterion: null - optimizers: null - schedulers: null - train_dataset: null - val_dataset: null - test_dataset: null - - predict_dataset: - _target_: fmcib.datasets.SSLRadiomicsDataset - path: "./data/preprocessing/deeplesion/annotations/task1_test.csv" # Note: Change path to the CSV file to extract features from. - label: "survival" # Note: Change the label to "malignancy" for task 2 and "survival" for task 3 - radius: 24 - orient: False # Note: Set orient to False for task 2 and task 3 - resample_spacing: [1, 1, 1] - enable_negatives: False - transform: - _target_: monai.transforms.Compose - transforms: - - _target_: monai.transforms.Transpose ## Only for Models Genesis - indices: [2, 1, 0] - - _target_: monai.transforms.ToTensor - - _target_: monai.transforms.AddChannel - - _target_: monai.transforms.SpatialPad - spatial_size: [48, 48, 48] - - _target_: monai.transforms.ScaleIntensityRange - a_min: -1000 - a_max: 1000 - b_min: 0.0 - b_max: 1.0 - clip: True \ No newline at end of file diff --git a/experiments/baselines/models_genesis/supervised_training/finetune.yaml b/experiments/baselines/models_genesis/finetune.yaml similarity index 88% rename from experiments/baselines/models_genesis/supervised_training/finetune.yaml rename to experiments/baselines/models_genesis/finetune.yaml index aebc8de..ab31c40 100644 --- a/experiments/baselines/models_genesis/supervised_training/finetune.yaml +++ b/experiments/baselines/models_genesis/finetune.yaml @@ -40,28 +40,32 @@ system: decoder: False weights_path: ./models/pretrained/models_genesis/Genesis_Chest_CT.pt heads: [4096, 2048, 512, 256, 8] # Note: Change to [4096, 2048, 1] for Task 2 and [4096, 2048, 512, 256, 1] Task 3 - - post_criterion_activation: "$torch.sigmoid" # Note: Change to $torch.sigmoid for Task 2 and Task 3 - cast_target_dtype_to: "$torch.float32" # Note: Uncomment for Task 2 and Task 3 + + postprocessing: + metrics: + pred: + - "$lambda x: torch.softmax(x, 1)" # Note: Change to $lambda x: torch.sigmoid(x) for Task 2 and Task 3 + # criterion: + # target: # Note: Uncomment for Task 2 and Task 3 + # - "$lambda x: x.float()" criterion: _target_: torch.nn.CrossEntropyLoss # Note: Change to torch.nn.BCEWithLogitsLoss for Task 2 and Task 3 - optimizers: + optimizer: _target_: torch.optim.Adam params: "$@system#model.parameters()" # lr: "$((@system#batch_size * @trainer#devices)/256) * 0.1" # Compute LR dynamically for different batch sizes # weight_decay: 0.0 # momentum: 0.9 - schedulers: - scheduler: - _target_: torch.optim.lr_scheduler.StepLR - optimizer: "@system#optimizers" - step_size: 30 - strict: True + scheduler: + _target_: torch.optim.lr_scheduler.StepLR + optimizer: "@system#optimizers" + step_size: 30 - train_metrics: + metrics: + train: - _target_: torchmetrics.AveragePrecision task: binary # Note: Change to `multiclass` for Task 2 and Task 3 and remove num_classes below # num_classes: 8 @@ -69,12 +73,11 @@ system: - _target_: torchmetrics.AUROC task: binary # Note: Change to `binary` for Task 2 and Task 3 and remove num_classes below # num_classes: 8 + val: "%#train" + test: "%#train" - - val_metrics: "%system#train_metrics" - test_metrics: "%system#train_metrics" - - train_dataset: + datasets: + train: _target_: fmcib.datasets.SSLRadiomicsDataset path: null # Note: Change path label: "survival" # Note: Change to "malignancy" for Task 2 and "survival" for Task 3 @@ -107,7 +110,7 @@ system: b_max: 1.0 clip: True - val_dataset: + val: _target_: fmcib.datasets.SSLRadiomicsDataset path: null # Note: Change path label: "@system#train_dataset#label" @@ -131,5 +134,4 @@ system: b_max: 1.0 clip: True - test_dataset: null - predict_dataset: null \ No newline at end of file + test: null \ No newline at end of file diff --git a/experiments/baselines/models_genesis/supervised_training/get_predictions_task1.yaml b/experiments/baselines/models_genesis/supervised_training/get_predictions_task1.yaml deleted file mode 100644 index 313a236..0000000 --- a/experiments/baselines/models_genesis/supervised_training/get_predictions_task1.yaml +++ /dev/null @@ -1,59 +0,0 @@ -trainer: - _target_: pytorch_lightning.Trainer - benchmark: True - max_epochs: 100 - check_val_every_n_epoch: 4 - accelerator: gpu - devices: 1 - log_every_n_steps: 50 - logger: False - callbacks: - - _target_: fmcib.callbacks.SavePredictions - path: "out.csv" # Note: Change path to the CSV file to save predictions to. - save_preview_samples: 5 -system: - _target_: lighter.LighterSystem - batch_size: 8 - pin_memory: True - num_workers: 2 - model: - _target_: fmcib.models.LoadModel - trunk: - _target_: fmcib.models.ModelsGenesisUNet3D - decoder: False - heads: [4096, 2048, 8] # Note: Change to [4096, 2048, 1] for Task 2 and Task 3 - weights_path: null - - post_criterion_activation: "$torch.nn.functional.softmax" # Note: Change to $torch.sigmoid for Task 2 and Task 3 - cast_target_dtype_to: "$torch.float32" # Note: Uncomment for Task 2 and Task 3 - - criterion: null - optimizers: null - schedulers: null - train_dataset: null - val_dataset: null - test_dataset: null - - predict_dataset: - _target_: fmcib.datasets.SSLRadiomicsDataset - path: "./data/preprocessing/deeplesion/annotations/task1_test.csv" # Note: Change path to the CSV file to extract features from. - label: "Coarse_lesion_type" # Note: Change the label to "malignancy" for task 2 and "survival" for task 3 - radius: 24 - orient: True # Note: Set orient to False for task 2 and task 3 - resample_spacing: [1, 1, 1] - enable_negatives: False - transform: - _target_: monai.transforms.Compose - transforms: - - _target_: monai.transforms.Transpose ## Only for Models Genesis - indices: [2, 1, 0] - - _target_: monai.transforms.ToTensor - - _target_: monai.transforms.AddChannel - - _target_: monai.transforms.SpatialPad - spatial_size: [48, 48, 48] - - _target_: monai.transforms.ScaleIntensityRange - a_min: -1000 - a_max: 1000 - b_min: 0.0 - b_max: 1.0 - clip: True \ No newline at end of file diff --git a/experiments/baselines/models_genesis/supervised_training/get_predictions_task2.yaml b/experiments/baselines/models_genesis/supervised_training/get_predictions_task2.yaml deleted file mode 100644 index 137e410..0000000 --- a/experiments/baselines/models_genesis/supervised_training/get_predictions_task2.yaml +++ /dev/null @@ -1,57 +0,0 @@ -trainer: - _target_: pytorch_lightning.Trainer - benchmark: True - max_epochs: 100 - check_val_every_n_epoch: 4 - accelerator: gpu - devices: 1 - log_every_n_steps: 50 - logger: False - callbacks: - - _target_: fmcib.callbacks.SavePredictions - path: "out.csv" # Note: Change path to the CSV file to save predictions to. - save_preview_samples: 5 -system: - _target_: lighter.LighterSystem - batch_size: 8 - pin_memory: True - num_workers: 2 - model: - _target_: fmcib.models.LoadModel - trunk: - _target_: fmcib.models.ModelsGenesisUNet3D - decoder: False - heads: [4096, 2048, 1] # Note: Change to [4096, 2048, 1] for Task 2 and Task 3 - weights_path: null - post_criterion_activation: "$torch.sigmoid" # Note: Change to $torch.sigmoid for Task 2 and Task 3 - # cast_target_dtype_to: "$torch.float32" # Note: Uncomment for Task 2 and Task 3 - criterion: null - optimizers: null - schedulers: null - train_dataset: null - val_dataset: null - test_dataset: null - - predict_dataset: - _target_: fmcib.datasets.SSLRadiomicsDataset - path: "/home/suraj/Repositories/foundation-cancer-image-biomarker/data/csvs/luna16/luna16/test.csv" # Note: Change path to the CSV file to extract features from. - label: "malignancy" # Note: Change the label to "malignancy" for task 2 and "survival" for task 3 - radius: 24 - orient: False # Note: Set orient to False for task 2 and task 3 - resample_spacing: [1, 1, 1] - enable_negatives: False - transform: - _target_: monai.transforms.Compose - transforms: - - _target_: monai.transforms.Transpose ## Only for Models Genesis - indices: [2, 1, 0] - - _target_: monai.transforms.ToTensor - - _target_: monai.transforms.AddChannel - - _target_: monai.transforms.SpatialPad - spatial_size: [48, 48, 48] - - _target_: monai.transforms.ScaleIntensityRange - a_min: -1000 - a_max: 1000 - b_min: 0.0 - b_max: 1.0 - clip: True \ No newline at end of file diff --git a/experiments/baselines/models_genesis/supervised_training/get_predictions_task3.yaml b/experiments/baselines/models_genesis/supervised_training/get_predictions_task3.yaml deleted file mode 100644 index 1422b99..0000000 --- a/experiments/baselines/models_genesis/supervised_training/get_predictions_task3.yaml +++ /dev/null @@ -1,57 +0,0 @@ -trainer: - _target_: pytorch_lightning.Trainer - benchmark: True - max_epochs: 100 - check_val_every_n_epoch: 4 - accelerator: gpu - devices: 1 - log_every_n_steps: 50 - logger: False - callbacks: - - _target_: fmcib.callbacks.SavePredictions - path: "out.csv" # Note: Change path to the CSV file to save predictions to. - save_preview_samples: 5 -system: - _target_: lighter.LighterSystem - batch_size: 8 - pin_memory: True - num_workers: 2 - model: - _target_: fmcib.models.LoadModel - trunk: - _target_: fmcib.models.ModelsGenesisUNet3D - decoder: False - heads: [4096, 2048, 512, 256, 1] # Note: Change to [4096, 2048, 1] for Task 2 and Task 3 - weights_path: null - post_criterion_activation: "$torch.sigmoid" # Note: Change to $torch.sigmoid for Task 2 and Task 3 - # cast_target_dtype_to: "$torch.float32" # Note: Uncomment for Task 2 and Task 3 - criterion: null - optimizers: null - schedulers: null - train_dataset: null - val_dataset: null - test_dataset: null - - predict_dataset: - _target_: fmcib.datasets.SSLRadiomicsDataset - path: "/home/suraj/Repositories/foundation-cancer-image-biomarker/data/preprocessing/lung1/annotations.csv" # Note: Change path to the CSV file to extract features from. - label: "survival" # Note: Change the label to "malignancy" for task 2 and "survival" for task 3 - radius: 24 - orient: False # Note: Set orient to False for task 2 and task 3 - resample_spacing: [1, 1, 1] - enable_negatives: False - transform: - _target_: monai.transforms.Compose - transforms: - - _target_: monai.transforms.Transpose ## Only for Models Genesis - indices: [2, 1, 0] - - _target_: monai.transforms.ToTensor - - _target_: monai.transforms.AddChannel - - _target_: monai.transforms.SpatialPad - spatial_size: [48, 48, 48] - - _target_: monai.transforms.ScaleIntensityRange - a_min: -1000 - a_max: 1000 - b_min: 0.0 - b_max: 1.0 - clip: True \ No newline at end of file diff --git a/experiments/baselines/supervised_training/supervised_finetune.yaml b/experiments/baselines/supervised_training/supervised_finetune.yaml index 5d0f073..8240b83 100644 --- a/experiments/baselines/supervised_training/supervised_finetune.yaml +++ b/experiments/baselines/supervised_training/supervised_finetune.yaml @@ -43,37 +43,45 @@ system: weights_path: "./models/supervised/task1_supervised.torch" heads: [4096, 2048, 1] # Note: Change to [4096, 2048, 512, 256, 1] for Task 3 - post_criterion_activation: "$torch.sigmoid" - cast_target_dtype_to: "$torch.float32" + postprocessing: + metrics: + pred: + - "$lambda x: torch.softmax(x, 1)" # Note: Change to $lambda x: torch.sigmoid(x) for Task 2 and Task 3 + criterion: + target: # Note: Uncomment for Task 2 and Task 3 + - "$lambda x: x.float()" + + criterion: _target_: torch.nn.BCEWithLogitsLoss - optimizers: - _target_: torch.optim.SGD + optimizer: + _target_: torch.optim.Adam params: "$@system#model.parameters()" - lr: "$((@system#batch_size * @trainer#devices)/256) * 0.1" # Compute LR dynamically for different batch sizes - weight_decay: 0.0 - momentum: 0.9 + # lr: "$((@system#batch_size * @trainer#devices)/256) * 0.1" # Compute LR dynamically for different batch sizes + # weight_decay: 0.0 + # momentum: 0.9 - schedulers: - scheduler: - _target_: torch.optim.lr_scheduler.StepLR - optimizer: "@system#optimizers" - step_size: 30 - strict: True + scheduler: + _target_: torch.optim.lr_scheduler.StepLR + optimizer: "@system#optimizer" + step_size: 30 - train_metrics: + metrics: + train: - _target_: torchmetrics.AveragePrecision - task: binary - + task: multiclass # Note: Change to `binary` for Task 2 and Task 3 and remove num_classes below + num_classes: 8 - _target_: torchmetrics.AUROC - task: binary + task: multiclass # Note: Change to `binary` for Task 2 and Task 3 and remove num_classes below + num_classes: 8 + val: "%#train" + test: "%#train" - val_metrics: "%system#train_metrics" - test_metrics: "%system#train_metrics" - train_dataset: + datasets: + train: _target_: fmcib.datasets.SSLRadiomicsDataset path: "./data/preprocessing/luna16/annotations/task2_train.csv" # Note: Change path label: "malignancy" # Note: Change to appropriate label column, e.g. "survival" for Task 3 @@ -101,7 +109,7 @@ system: subtrahend: -1024 divisor: 3072 - val_dataset: + val: _target_: fmcib.datasets.SSLRadiomicsDataset path: "./data/preprocessing/luna16/annotations/task2_val.csv" # Note: Change path label: "@system#train_dataset#label" @@ -120,40 +128,5 @@ system: subtrahend: -1024 divisor: 3072 - test_dataset: - _target_: fmcib.datasets.SSLRadiomicsDataset - path: "./data/preprocessing/luna16/annotations/task2_test.csv" # Note: Change path - label: "@system#train_dataset#label" - radius: "@system#train_dataset#radius" - orient: "@system#train_dataset#orient" - resample_spacing: "@system#train_dataset#resample_spacing" - enable_negatives: "@system#train_dataset#enable_negatives" - transform: - _target_: monai.transforms.Compose - transforms: - - _target_: monai.transforms.ToTensor - - _target_: monai.transforms.AddChannel - - _target_: monai.transforms.SpatialPad - spatial_size: [50, 50, 50] - - _target_: monai.transforms.NormalizeIntensity - subtrahend: -1024 - divisor: 3072 - - predict_dataset: - _target_: fmcib.datasets.SSLRadiomicsDataset - path: "./data/preprocessing/luna16/annotations/task2_test.csv" # Note: Change path - label: "@system#train_dataset#label" - radius: "@system#train_dataset#radius" - orient: "@system#train_dataset#orient" - resample_spacing: "@system#train_dataset#resample_spacing" - enable_negatives: "@system#train_dataset#enable_negatives" - transform: - _target_: monai.transforms.Compose - transforms: - - _target_: monai.transforms.ToTensor - - _target_: monai.transforms.AddChannel - - _target_: monai.transforms.SpatialPad - spatial_size: [50, 50, 50] - - _target_: monai.transforms.NormalizeIntensity - subtrahend: -1024 - divisor: 3072 \ No newline at end of file + test: null + \ No newline at end of file diff --git a/experiments/baselines/supervised_training/supervised_random_init.yaml b/experiments/baselines/supervised_training/supervised_random_init.yaml index f766fed..1f7e4d2 100644 --- a/experiments/baselines/supervised_training/supervised_random_init.yaml +++ b/experiments/baselines/supervised_training/supervised_random_init.yaml @@ -42,39 +42,44 @@ system: feed_forward: False heads: [4096, 2048, 8] # Note: Change to [4096, 2048, 1] for Task 2 and [4096, 2048, 512, 256, 1] for Task 3 - post_criterion_activation: "$torch.nn.functional.softmax" # Note: Change to $torch.sigmoid for Task 2 and Task 3 - # cast_target_dtype_to: "$torch.float32" # Note: Uncomment for Task 2 and Task 3 + + postprocessing: + metrics: + pred: + - "$lambda x: torch.softmax(x, 1)" # Note: Change to $lambda x: torch.sigmoid(x) for Task 2 and Task 3 + # criterion: + # target: # Note: Uncomment for Task 2 and Task 3 + # - "$lambda x: x.float()" + criterion: _target_: torch.nn.CrossEntropyLoss # Note: Change to torch.nn.BCEWithLogitsLoss for Task 2 and Task 3 - - optimizers: - _target_: torch.optim.SGD + + optimizer: + _target_: torch.optim.Adam params: "$@system#model.parameters()" - lr: "$((@system#batch_size * @trainer#devices)/256) * 0.1" # Compute LR dynamically for different batch sizes - weight_decay: 0.0 - momentum: 0.9 + # lr: "$((@system#batch_size * @trainer#devices)/256) * 0.1" # Compute LR dynamically for different batch sizes + # weight_decay: 0.0 + # momentum: 0.9 - schedulers: - scheduler: - _target_: torch.optim.lr_scheduler.StepLR - optimizer: "@system#optimizers" - step_size: 30 - strict: True + scheduler: + _target_: torch.optim.lr_scheduler.StepLR + optimizer: "@system#optimizer" + step_size: 30 - train_metrics: + metrics: + train: - _target_: torchmetrics.AveragePrecision - task: multiclass - num_classes: 8 # Note: Change to `binary` for Task 2 and Task 3 and remove num_classes below - - - _target_: torchmetrics.AUROC task: multiclass # Note: Change to `binary` for Task 2 and Task 3 and remove num_classes below num_classes: 8 + - _target_: torchmetrics.AUROC + task: multiclass # Note: Change to `binary` for Task 2 and Task 3 and remove num_classes below + num_classes: 8 + val: "%#train" + test: "%#train" - val_metrics: "%system#train_metrics" - test_metrics: "%system#train_metrics" - - train_dataset: + datasets: + train: _target_: fmcib.datasets.SSLRadiomicsDataset path: "./data/preprocessing/deeplesion/annotations/task1_train.csv" # Note: Change path label: "Coarse_lesion_type" # Note: Change to appropriate label column, e.g. "malignancy" for Task 2 and "survival" for Task 3 @@ -102,59 +107,25 @@ system: subtrahend: -1024 divisor: 3072 - val_dataset: + val: _target_: fmcib.datasets.SSLRadiomicsDataset - path: "./data/preprocessing/deeplesion/annotations/task1_val.csv" # Note: Change path - label: "@system#train_dataset#label" - radius: "@system#train_dataset#radius" - orient: "@system#train_dataset#orient" - resample_spacing: "@system#train_dataset#resample_spacing" - enable_negatives: "@system#train_dataset#enable_negatives" + path: null # Note: Change path + label: "@system#datasets#train#label" + radius: "@system#datasets#train#radius" + orient: "@system#datasets#train#orient" + resample_spacing: "@system#datasets#train#resample_spacing" + enable_negatives: "@system#datasets#train#enable_negatives" transform: _target_: monai.transforms.Compose transforms: - - _target_: monai.transforms.ToTensor - - _target_: monai.transforms.AddChannel - - _target_: monai.transforms.SpatialPad - spatial_size: [50, 50, 50] - _target_: monai.transforms.NormalizeIntensity subtrahend: -1024 - divisor: 3072 - - test_dataset: - _target_: fmcib.datasets.SSLRadiomicsDataset - path: "./data/preprocessing/deeplesion/annotations/task1_test.csv" # Note: Change path - label: "@system#train_dataset#label" - radius: "@system#train_dataset#radius" - orient: "@system#train_dataset#orient" - resample_spacing: "@system#train_dataset#resample_spacing" - enable_negatives: "@system#train_dataset#enable_negatives" - transform: - _target_: monai.transforms.Compose - transforms: + divisor: 3072 - _target_: monai.transforms.ToTensor - - _target_: monai.transforms.AddChannel + - _target_: monai.transforms.EnsureChannelFirst + channel_dim: no_channel - _target_: monai.transforms.SpatialPad spatial_size: [50, 50, 50] - - _target_: monai.transforms.NormalizeIntensity - subtrahend: -1024 - divisor: 3072 - - predict_dataset: - _target_: fmcib.datasets.SSLRadiomicsDataset - path: "./data/preprocessing/deeplesion/annotations/task1_test.csv" # Note: Change path - label: "@system#train_dataset#label" - radius: "@system#train_dataset#radius" - orient: "@system#train_dataset#orient" - resample_spacing: "@system#train_dataset#resample_spacing" - enable_negatives: "@system#train_dataset#enable_negatives" - transform: - _target_: monai.transforms.Compose - transforms: - - _target_: monai.transforms.ToTensor - - _target_: monai.transforms.AddChannel - - _target_: monai.transforms.SpatialPad - spatial_size: [50, 50, 50] - - _target_: monai.transforms.NormalizeIntensity - subtrahend: -1024 - divisor: 3072 \ No newline at end of file + + + test: null \ No newline at end of file diff --git a/experiments/inference/extract_features.yaml b/experiments/inference/extract_features.yaml index c6d61d7..4526673 100644 --- a/experiments/inference/extract_features.yaml +++ b/experiments/inference/extract_features.yaml @@ -25,6 +25,26 @@ system: feed_forward: False weights_path: "./model_weights.torch" # Note: Change path to the model weights file. + #### Note: Use the below config for Med3D + # trunk: + # _target_: monai.networks.nets.resnet50 + # widen_factor: 1 + # bias_downsample: False + # n_input_channels: 1 + # conv1_t_stride: 1 + # feed_forward: False + # pretrained: False + # weights_path: "./models/pretrained/med3d/resnet_50.pth" + + + #### Note: Use the below config for Models Genesis + # trunk: + # _target_: fmcib.models.ModelsGenesisUNet3D + # decoder: False + # weights_path: ./models/pretrained/models_genesis/Genesis_Chest_CT.pt + + + criterion: null optimizer: null scheduler: null @@ -36,7 +56,7 @@ system: _target_: fmcib.datasets.SSLRadiomicsDataset path: "./data/preprocessing/deeplesion/annotations/task1_test.csv" # Note: Change path to the CSV file to extract features from. label: "Coarse_lesion_type" # Note: Change the label to "malignancy" for task 2 and "survival" for task 3 - radius: 25 + radius: 25 # Note: Change to 24 for Models Genesis orient: True # Note: Set orient to False for task 2 and task 3 resample_spacing: [1, 1, 1] enable_negatives: False @@ -50,4 +70,30 @@ system: subtrahend: -1024 divisor: 3072 - _target_: monai.transforms.SpatialPad - spatial_size: [50, 50, 50] \ No newline at end of file + spatial_size: [50, 50, 50] + + # transforms: #### Note: Uncomment this `transforms` and comment the above `transforms` for Med3D + # - _target_: monai.transforms.ScaleIntensityRange + # a_min: -1000 + # a_max: 1000 + # b_min: 0.0 + # b_max: 1.0 + # clip: True + # - _target_: monai.transforms.ToTensor + # - _target_: monai.transforms.AddChannel + # - _target_: monai.transforms.SpatialPad + # spatial_size: [50, 50, 50] + + # transforms: #### Note: Uncomment this `transforms` and comment the above `transforms` for Models Genesis + # - _target_: monai.transforms.Transpose ## Only for Models Genesis + # indices: [2, 1, 0] + # - _target_: monai.transforms.ToTensor + # - _target_: monai.transforms.AddChannel + # - _target_: monai.transforms.SpatialPad + # spatial_size: [48, 48, 48] + # - _target_: monai.transforms.ScaleIntensityRange + # a_min: -1000 + # a_max: 1000 + # b_min: 0.0 + # b_max: 1.0 + # clip: True \ No newline at end of file diff --git a/experiments/inference/get_predictions.yaml b/experiments/inference/get_predictions.yaml index ee4189e..c32f871 100644 --- a/experiments/inference/get_predictions.yaml +++ b/experiments/inference/get_predictions.yaml @@ -23,6 +23,25 @@ system: widen_factor: 2 n_input_channels: 1 feed_forward: False + + + #### Note: Use the below config for Med3D + # trunk: + # _target_: monai.networks.nets.resnet50 + # widen_factor: 1 + # bias_downsample: False + # n_input_channels: 1 + # conv1_t_stride: 1 + # feed_forward: False + # pretrained: False + # heads: [4096, 2048, 8] # Note: Change to [4096, 2048, 1] for Task 2 and [4096, 2048, 512, 256, 1] for Task 3 + + + #### Note: Use the below config for Models Genesis + # _target_: fmcib.models.ModelsGenesisUNet3D + # decoder: False + # heads: [4096, 2048, 8] # Note: Change to [4096, 2048, 1] for Task 2 and [4096, 2048, 512, 256, 1] for Task 3 + weights_path: "./models/baselines/task1/supervised.torch" # Download the models folder from HF heads: [4096, 2048, 8] # Note: Change to [4096, 2048, 2] for Task 2 and [4096, 2048, 512, 256, 2] for Task 3 @@ -46,7 +65,7 @@ system: _target_: fmcib.datasets.SSLRadiomicsDataset path: "./data/preprocessing/deeplesion/annotations/task1_test.csv" # Note: Change path to the CSV file to extract features from. label: "Coarse_lesion_type" # Note: Change the label to "malignancy" for task 2 and "survival" for task 3 - radius: 25 + radius: 25 # Note: Change to 24 for Models Genesis orient: True # Note: Set orient to False for task 2 and task 3 resample_spacing: [1, 1, 1] enable_negatives: False @@ -60,4 +79,30 @@ system: subtrahend: -1024 divisor: 3072 - _target_: monai.transforms.SpatialPad - spatial_size: [50, 50, 50] \ No newline at end of file + spatial_size: [50, 50, 50] + + # transforms: #### Note: Uncomment this `transforms` and comment the above `transforms` for Med3D + # - _target_: monai.transforms.ScaleIntensityRange + # a_min: -1000 + # a_max: 1000 + # b_min: 0.0 + # b_max: 1.0 + # clip: True + # - _target_: monai.transforms.ToTensor + # - _target_: monai.transforms.AddChannel + # - _target_: monai.transforms.SpatialPad + # spatial_size: [50, 50, 50] + + # transforms: #### Note: Uncomment this `transforms` and comment the above `transforms` for Models Genesis + # - _target_: monai.transforms.Transpose ## Only for Models Genesis + # indices: [2, 1, 0] + # - _target_: monai.transforms.ToTensor + # - _target_: monai.transforms.AddChannel + # - _target_: monai.transforms.SpatialPad + # spatial_size: [48, 48, 48] + # - _target_: monai.transforms.ScaleIntensityRange + # a_min: -1000 + # a_max: 1000 + # b_min: 0.0 + # b_max: 1.0 + # clip: True \ No newline at end of file