| # Template Segmentation Bundle | |
| This bundle is meant to be an example of segmentation in 3D which you can copy and modify to create your own bundle. | |
| It is only roughly trained for the synthetic data you can generate with [this notebook](./generate_data.ipynb) | |
| so doesn't do anything useful on its own. The purpose is to demonstrate the base line for segmentation network | |
| bundles compatible with MONAILabel amongst other things. | |
| To use this bundle, copy the contents of the whole directory and change the definitions for network, data, transforms, | |
| or whatever else you want for your own new segmentation bundle. Some of the names are critical for MONAILable but | |
| otherwise you're free to change just about whatever else is defined here to suit your network. | |
| This bundle should also demonstrate good practice and design, however there is one caveat about definitions being | |
| copied between config files. Ideally there should be a `common.yaml` file for all the definitions used by every other | |
| config file which is then included with that file. MONAILabel doesn't support this yet so this bundle will be updated | |
| once it does to exemplify this better practice. | |
| ## Generating Demo Data | |
| Run all the cells of [this notebook](./generate_data.ipynb) to generate training and test data. These will be 3D | |
| nifti files containing volumes with randomly generated spheres of varying intensities and some noise for fun. The | |
| segmentation task is very easy so your network will train in minutes with the default configuration of values. A test | |
| data directory will separately be created since the test and inference configs are configured to apply the network to | |
| every nifti file in a given directory with a certain pattern. | |
| ## Training | |
| To train a new network the `train.yaml` script can be used alone with no other arguments (assume `BUNDLE` is the root | |
| directory of the bundle): | |
| ```sh | |
| python -m monai.bundle run \ | |
| --meta_file "$BUNDLE/configs/metadata.json" \ | |
| --config_file "$BUNDLE/configs/train.yaml" \ | |
| --bundle_root "$BUNDLE" | |
| ``` | |
| A `train.sh` script is also provided in `docs` which implements this invocation with some helper commands. It | |
| relies on a Conda environment called `monai` so comment or modify those lines if you're not using such an environment. | |
| See MONAI installation information about what environment to create for the features you want. | |
| The training config includes a number of hyperparameters like `learning_rate` and `num_workers`. These control aspects | |
| of how training operates in terms of how many processes to use, when to perform validation, when to save checkpoints, | |
| and other things. Other aspects of the script can be modified on the command line so these aren't exhaustive but are a | |
| guide to the kind of parameterisation that make sense for a bundle. | |
| ## Testing and Inference | |
| Two configs are provided (`test.yaml` and `inference.yaml`) for doing post-training inference with the model. The first | |
| requires image and segmentation pairs which are used with network outputs to assess performance using metrics. This is | |
| very similar to training validation but is done on separate images. This config can be set to save predicted segmentations | |
| by setting `save_pred` to true but by default it will just run metrics and print their results. | |
| The inference config is for generating new segmentations from images which don't have ground truths, so this is used for | |
| actually applying the network in practice. This will apply the network to every image in an input directory matching a | |
| pattern and save the predicted segmentations to an output directory. | |
| Using inference on the command line is demonstrated in [this notebook](./visualise_inference.ipynb) with visualisation. | |
| Some explanation of some command line choices are given in the notebook as well, similar command line invocations can | |
| also be done with the included `inference.sh` script file. | |
| ## Other Considerations | |
| There is no `scripts` directory containing a valid Python module to be imported in your configs. This wasn't necessary | |
| for this bundle but if you want to include custom code in a bundle please follow the bundle tutorials on how to do this. | |
| The `multi_gpu_train.yaml` config is defined as a "mixin" to implement DDP based multi-gpu training. The script | |
| `train_multigpu.sh` illustrates an example of how to invoke these configs together with `torchrun`. | |
| The `inference.yaml` config is compatible with MONAILabel such that you can load one of the synthetic images and perform | |
| inference through a label server. This doesn't permit active learning however, that is a later enhancement for this | |
| bundle. If you're changing definitions in the `inference.yaml` config file be careful about changing names and consult | |
| the MONAILabel documentation about required definition names. An example script to start a server is given in | |
| `run_monailabel.sh` which will download the bundle application and "install" this bundle using a symlink then start | |
| the server. Future updates to MONAILabel will improve this process. | |