CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
Path: blob/main/seminar3/mri_3DUnet_2022.ipynb
Views: 63
MRI segmentation with 3D U-net
1. Introduction
In this section we will segment gray matter and subcortical nuclei from preprocessed MRI image.
Proceeding with this Notebook you confirm your personal acess to the data. And your agreement on data terms and conditions.
|████████████████████████████████| 394 kB 5.2 MB/s eta 0:00:01
|████████████████████████████████| 54 kB 1.5 MB/s
|████████████████████████████████| 158 kB 58.4 MB/s
|████████████████████████████████| 495 kB 69.3 MB/s
|████████████████████████████████| 54 kB 3.2 MB/s
|████████████████████████████████| 140 kB 75.0 MB/s
|████████████████████████████████| 127 kB 68.5 MB/s
|████████████████████████████████| 157 kB 74.2 MB/s
|████████████████████████████████| 157 kB 75.8 MB/s
|████████████████████████████████| 157 kB 77.7 MB/s
|████████████████████████████████| 157 kB 76.1 MB/s
|████████████████████████████████| 157 kB 78.9 MB/s
|████████████████████████████████| 157 kB 74.2 MB/s
|████████████████████████████████| 157 kB 73.7 MB/s
|████████████████████████████████| 156 kB 74.4 MB/s
Building wheel for configobj (setup.py) ... done
The code is adopted from Torchio
library tutorials:
https://colab.research.google.com/drive/112NTL8uJXzcMw4PQbUvMQN-WHlVwQS3i
2. Mounting Google drive
Mounting Google Drive to Collab Notebook. You should go with the link and enter your personal authorization code:
Add a shortcut to your drive:
https://drive.google.com/drive/folders/1GCIXnK6ly5l_LADanpLmvtZ6YbqPUamQ?usp=sharing
3. Defining the dataset
Defining the working dataset, there:
norm
- normalisedT1
image processed with Freesurfer 6.0,aparc+aseg
segmentation mask for gray matter and subcortical nuclei from Freesufer 6.0recon all
pipeline.
And U-net model will treat norm
image as input and aparc+aseg
as target model.
Defining new pd.Dataframe()
with Subject
, norm
and target
files:
Iterating through files and Subjects
in ID list:
Let's have a closer look on the data:
|████████████████████████████████| 9.6 MB 5.0 MB/s
Any suggestions on these numbers?
Structure | Seg ID |
---|---|
Left-Lateral-Ventricle | 4 |
Left-Inf-Lat-Vent | 5 |
3rd-Ventricle | 14 |
4th-Ventricle | 15 |
Brain Stem | 16 |
Left Hippocampus | 17 |
Left Amygdala | 18 |
Right-Lateral-Ventricle | 43 |
Right-Inf-Lat-Vent | 44 |
Right Hippocampus | 53 |
Right Amygdala | 54 |
5th-Ventricle | 72 |
4. Writing dataloader
We will use TorchIO
library: https://torchio.readthedocs.io/
|████████████████████████████████| 172 kB 5.0 MB/s
|████████████████████████████████| 52.8 MB 66.2 MB/s
3. Writing visualization tools for torch tensors
The class dataset
inherits from torch.utils.data.Dataset.
It receives as input a list of torchio.Subject instances and an optional torchio.transforms.Transform.
The inputs to the subject class are instances of torchio.Image, such as torchio.ScalarImage or torchio.LabelMap. The image class will be used by the transforms to decide whether or not to perform the operation. For example, spatial transforms must apply to both, but intensity transforms must apply to scalar images only.
2. Whole brain segmentation
Let's define the experiment for whole brain segmentation:
The data is really heavy, so lets try to start with 1 subject/ batch:
Defining the model and optimizer for training
At first check if we have GPU onborad:
0%| | 0/20 [00:00<?, ?it/s]/usr/local/lib/python3.7/dist-packages/torchio/data/image.py:143: UserWarning: Not specifying the image type is deprecated and will be mandatory in the future. You can probably use tio.ScalarImage or tio.LabelMap instead
'Not specifying the image type is deprecated and will be'
/usr/local/lib/python3.7/dist-packages/torchio/data/image.py:143: UserWarning: Not specifying the image type is deprecated and will be mandatory in the future. You can probably use tio.ScalarImage or tio.LabelMap instead
'Not specifying the image type is deprecated and will be'
100%|██████████| 20/20 [01:23<00:00, 4.16s/it]
0%| | 0/20 [00:00<?, ?it/s]/usr/local/lib/python3.7/dist-packages/torchio/data/image.py:143: UserWarning: Not specifying the image type is deprecated and will be mandatory in the future. You can probably use tio.ScalarImage or tio.LabelMap instead
'Not specifying the image type is deprecated and will be'
/usr/local/lib/python3.7/dist-packages/torchio/data/image.py:143: UserWarning: Not specifying the image type is deprecated and will be mandatory in the future. You can probably use tio.ScalarImage or tio.LabelMap instead
'Not specifying the image type is deprecated and will be'
80%|████████ | 16/20 [00:22<00:04, 1.25s/it]
We expect to get DICE > 0.9
on validation after 40 epochs on the whole sample.
3. Patch-based segmentation
Let's fedine another experiment within the same workspace in COMET ML
:
We expect to see loss < 0.7 after 40 epochs.
4. What else?
Crop unnesessary parts of all images, be sure you are using only relevant for segmentation brain parts. Avoid empty corners.
Batch size and patch size - the bigger the better, and patch size of 128x128x128 is the best strategy (yet watch your time and memory, it is limited).
U-net: is it deep enough or wide enough? Watch your memory 😃
Augmentations for patch based segmentation it is a must. Be sure, you have enough time to train model, augmentation with rotation, smothing with double training time
Advanced loss: CrossEntropy + DICE are your best friends.
Do not you forget about adjusting learning rate with training.
Dont waste your time:
Adding patch localization to a model input.
Focal loss.
Training on non-zero patches.