|
a/README.md |
|
b/README.md |
1 |
# Volumetric Brain Tumor Segmentation |
1 |
# Volumetric Brain Tumor Segmentation
|
2 |
This repository experiments with best techniques to improve dense, volumetric semantic segmentation. Specifically, the model is of U-net architectural style and includes variational autoencoder (for regularization), residual blocks, spatial and channel squeeze-excitation layers, and dense connections. |
2 |
This repository experiments with best techniques to improve dense, volumetric semantic segmentation. Specifically, the model is of U-net architectural style and includes variational autoencoder (for regularization), residual blocks, spatial and channel squeeze-excitation layers, and dense connections. |
3 |
|
3 |
|
4 |
## Model |
4 |
## Model
|
5 |
This is a variation of the [U-net](https://arxiv.org/pdf/1606.06650.pdf) architecture with [variational autoencoder regularization](https://arxiv.org/pdf/1810.11654.pdf). There are several architectural enhancements, including |
5 |
This is a variation of the [U-net](https://arxiv.org/pdf/1606.06650.pdf) architecture with [variational autoencoder regularization](https://arxiv.org/pdf/1810.11654.pdf). There are several architectural enhancements, including
|
6 |
- [Spatial and channel squeeze-excitation layers](https://arxiv.org/abs/1803.02579) in the ResNet blocks. |
6 |
- [Spatial and channel squeeze-excitation layers](https://arxiv.org/abs/1803.02579) in the ResNet blocks.
|
7 |
- [Dense connections](https://arxiv.org/pdf/1608.06993.pdf) between encoder ResNet blocks at the same spatial resolution level. |
7 |
- [Dense connections](https://arxiv.org/pdf/1608.06993.pdf) between encoder ResNet blocks at the same spatial resolution level.
|
8 |
- Convolutional layers to consist of order `[Conv3D, GroupNorm, ReLU]`, except for all pointwise and output layers. |
8 |
- Convolutional layers to consist of order `[Conv3D, GroupNorm, ReLU]`, except for all pointwise and output layers.
|
9 |
- He normal initialization for *all* layer kernels except those with sigmoid activations, which are initialized with Glorot normal. |
9 |
- He normal initialization for *all* layer kernels except those with sigmoid activations, which are initialized with Glorot normal.
|
10 |
- Convolutional downsampling and upsampling operations. |
10 |
- Convolutional downsampling and upsampling operations. |
11 |
|
11 |
|
12 |
## Usage |
12 |
## Usage
|
13 |
Dependencies are only supported for Python3 and can be found in `requirements.txt` (`numpy==1.15` for preprocessing and `tensorflow==2.0.0-alpha0` for model architecture, utilizing `tf.keras.Model` and `tf.keras.Layer` subclassing). |
13 |
Dependencies are only supported for Python3 and can be found in `requirements.txt` (`numpy==1.15` for preprocessing and `tensorflow==2.0.0-alpha0` for model architecture, utilizing `tf.keras.Model` and `tf.keras.Layer` subclassing). |
14 |
|
14 |
|
15 |
The model can be found in `model/model.py` and contains an `inference` mode in addition to the `training` mode that `tf.Keras.Model` supports. |
15 |
The model can be found in `model/model.py` and contains an `inference` mode in addition to the `training` mode that `tf.Keras.Model` supports.
|
16 |
- Specify `training=False, inference=True` to only receive the decoder output, as desired in test time. |
16 |
- Specify `training=False, inference=True` to only receive the decoder output, as desired in test time.
|
17 |
- Specify `training=False, inference=False` to receive both the decoder and variational autoencoder output to be able to run loss and metrics, as desired in validation time. |
17 |
- Specify `training=False, inference=False` to receive both the decoder and variational autoencoder output to be able to run loss and metrics, as desired in validation time. |
18 |
|
18 |
|
19 |
### BraTS Data |
19 |
### BraTS Data
|
20 |
The BraTS 2017/2018 dataset is not publicly available, so download scripts for those are not available. Once downloaded, run preprocessing on the original data format, which should look something like this: |
20 |
The BraTS 2017/2018 dataset is not publicly available, so download scripts for those are not available. Once downloaded, run preprocessing on the original data format, which should look something like this:
|
21 |
``` |
21 |
```
|
22 |
BraTS17TrainingData/*/*/*[t1,t1ce,t2,flair,seg].nii.gz |
22 |
BraTS17TrainingData/*/*/*[t1,t1ce,t2,flair,seg].nii.gz
|
23 |
``` |
23 |
``` |
24 |
|
24 |
|
25 |
### Preprocessing |
25 |
### Preprocessing
|
26 |
For each example, there are 4 modalities and 1 label, each of shape `240 x 240 x 155`. Preprocessing steps consist of: |
26 |
For each example, there are 4 modalities and 1 label, each of shape `240 x 240 x 155`. Preprocessing steps consist of:
|
27 |
- Concatenate the `t1ce` and `flair` modalities along the channel dimension. |
27 |
- Concatenate the `t1ce` and `flair` modalities along the channel dimension.
|
28 |
- Compute per-channel image-wise `mean` and `std` and normalize per channel *for the training set*. |
28 |
- Compute per-channel image-wise `mean` and `std` and normalize per channel *for the training set*.
|
29 |
- Crop as much background as possible across all images. Final image sizes are `155 x 190 x 147`. |
29 |
- Crop as much background as possible across all images. Final image sizes are `155 x 190 x 147`.
|
30 |
- Serialize to `tf.TFRecord` format for convenience in training. |
30 |
- Serialize to `tf.TFRecord` format for convenience in training. |
31 |
|
31 |
|
32 |
``` |
32 |
```
|
33 |
python preprocess.py \ |
33 |
python preprocess.py \
|
34 |
--in_locs /path/to/BraTS17TrainingData \ |
34 |
--in_locs /path/to/BraTS17TrainingData \
|
35 |
--modalities t1ce,flair \ |
35 |
--modalities t1ce,flair \
|
36 |
--truth seg \ |
36 |
--truth seg \
|
37 |
--create_val |
37 |
--create_val
|
38 |
``` |
38 |
``` |
39 |
|
39 |
|
40 |
> All command-line arguments can be found in `args.py`. |
40 |
All command-line arguments can be found in `args.py`. |
41 |
|
41 |
|
42 |
> There are 285 training examples in the BraTS 2017/2018 training sets, but for lack of validation set, the `--create_val` flag creates a 10:1 split, resulting in 260 and 25 training and validation examples, respectively. |
42 |
There are 285 training examples in the BraTS 2017/2018 training sets, but for lack of validation set, the `--create_val` flag creates a 10:1 split, resulting in 260 and 25 training and validation examples, respectively. |
43 |
|
43 |
|
44 |
### Training |
44 |
### Training
|
45 |
Most hyperparameters proposed in the paper are used in training. The input is randomly flipped across spatial axes with probability 0.5 and cropped to `128 x 128 x 128` per example in training (making the training data stochastic). The validation set is dynamically created each epoch in a similar fashion. |
45 |
Most hyperparameters proposed in the paper are used in training. The input is randomly flipped across spatial axes with probability 0.5 and cropped to `128 x 128 x 128` per example in training (making the training data stochastic). The validation set is dynamically created each epoch in a similar fashion.
|
46 |
``` |
46 |
```
|
47 |
python train.py \ |
47 |
python train.py \
|
48 |
--train_loc /path/to/train \ |
48 |
--train_loc /path/to/train \
|
49 |
--val_loc /path/to/val \ |
49 |
--val_loc /path/to/val \
|
50 |
--prepro_file /path/to/prepro/prepro.npy \ |
50 |
--prepro_file /path/to/prepro/prepro.npy \
|
51 |
--save_folder checkpoint \ |
51 |
--save_folder checkpoint \
|
52 |
--crop_size 128,128,128 |
52 |
--crop_size 128,128,128
|
53 |
``` |
53 |
``` |
54 |
|
54 |
|
55 |
> Use the `--gpu` flag to run on GPU. |
55 |
Use the `--gpu` flag to run on GPU. |
56 |
|
56 |
|
57 |
### Testing: Generating Segmentation Masks |
57 |
### Testing: Generating Segmentation Masks
|
58 |
The testing script `test.py` runs inference on unlabeled data provided as input by generating sample labels on the whole image, padded to a size that is compatible with downsampling. The VAE is not run in inference so the model is actually fully convolutional. |
58 |
The testing script `test.py` runs inference on unlabeled data provided as input by generating sample labels on the whole image, padded to a size that is compatible with downsampling. The VAE is not run in inference so the model is actually fully convolutional.
|
59 |
``` |
59 |
```
|
60 |
python test.py \ |
60 |
python test.py \
|
61 |
--in_locs /path/to/test \ |
61 |
--in_locs /path/to/test \
|
62 |
--modalities t1ce,flair \ |
62 |
--modalities t1ce,flair \
|
63 |
--prepro_loc /path/to/prepro/prepro.npy \ |
63 |
--prepro_loc /path/to/prepro/prepro.npy \
|
64 |
--tumor_model checkpoint |
64 |
--tumor_model checkpoint
|
65 |
``` |
65 |
```
|
66 |
*Training arguments are saved in the checkpoint folder. This bypasses the need for manual model initialization.* |
66 |
*Training arguments are saved in the checkpoint folder. This bypasses the need for manual model initialization.* |
67 |
|
67 |
|
68 |
> The `Interpolator` class is used to interpolate voxel sizes in rescaling so that all inputs can be resized to 1 mm^3. |
68 |
The `Interpolator` class is used to interpolate voxel sizes in rescaling so that all inputs can be resized to 1 mm^3. |
69 |
|
69 |
|
70 |
> NOTE: `test.py` is not fully debugged and functional. If needed please open an issue. |
70 |
NOTE: `test.py` is not fully debugged and functional. If needed please open an issue. |
71 |
|
71 |
|
72 |
|
72 |
|
73 |
### Skull Stripping |
73 |
### Skull Stripping
|
74 |
Because BraTS contains skull-stripped images which are uncommon in actual applications, we support training and inference of skull stripping models. The same pipeline can be generalized, but using the NFBS skull-stripping dataset [here](http://preprocessed-connectomes-project.org/NFB_skullstripped/). Note that in model initialization and training, the number of output channels `--out_ch` would be different for these tasks. |
74 |
Because BraTS contains skull-stripped images which are uncommon in actual applications, we support training and inference of skull stripping models. The same pipeline can be generalized, but using the NFBS skull-stripping dataset [here](http://preprocessed-connectomes-project.org/NFB_skullstripped/). Note that in model initialization and training, the number of output channels `--out_ch` would be different for these tasks. |
75 |
|
75 |
|
76 |
> If the testing data contains skull bits, run skull stripping and tumor segmentation sequentially in inference time by specifying the `--skull_model` flag. All preprocessing and training should work for both tasks as is. |
76 |
If the testing data contains skull bits, run skull stripping and tumor segmentation sequentially in inference time by specifying the `--skull_model` flag. All preprocessing and training should work for both tasks as is. |
77 |
|
77 |
|
78 |
### Results |
78 |
### Results
|
79 |
We run training on a V100 32GB GPU with a batch size of 1. Each epoch takes around ~12 minutes to run. Below is a sample training curve, using all default model parameters. |
79 |
We run training on a V100 32GB GPU with a batch size of 1. Each epoch takes around ~12 minutes to run. Below is a sample training curve, using all default model parameters. |
80 |
|
80 |
|
81 |
|Epoch|Training Loss|Training Dice Score|Validation Loss|Validation Dice Score| |
81 |
|Epoch|Training Loss|Training Dice Score|Validation Loss|Validation Dice Score|
|
82 |
|:---:|:-----------:|:-----------------:|:-------------:|:-------------------:| |
82 |
|:---:|:-----------:|:-----------------:|:-------------:|:-------------------:|
|
83 |
|0 |1.000 |0.134 |0.732 |0.248 | |
83 |
|0 |1.000 |0.134 |0.732 |0.248 |
|
84 |
|50 |0.433 |0.598 |0.413 |0.580 | |
84 |
|50 |0.433 |0.598 |0.413 |0.580 |
|
85 |
|100 |0.386 |0.651 |0.421 |0.575 | |
85 |
|100 |0.386 |0.651 |0.421 |0.575 |
|
86 |
|150 |0.356 |0.676 |0.393 |0.594 | |
86 |
|150 |0.356 |0.676 |0.393 |0.594 |
|
87 |
|200 |0.324 |0.692 |0.349 |0.642 | |
87 |
|200 |0.324 |0.692 |0.349 |0.642 |
|
88 |
|250 |0.295 |0.716 |0.361 |0.630 | |
88 |
|250 |0.295 |0.716 |0.361 |0.630 |
|
89 |
|300 |0.282 |0.729 |0.352 |0.644 | |
89 |
|300 |0.282 |0.729 |0.352 |0.644 |
|