Please add another interpolation mode for NiftiSaver to avoid ziazag pattern caused by 'nearest'
See original GitHub issueIs your feature request related to a problem? Please describe. In the current NiftiSaver, there are only two interpolation modes: “nereast” and “bilinear”. It is not enough. Detailed explanication as follows.
If I have an lung CT image with shape (1024, 512, 512). To do lung or lobe segmentation, I need to down sample the original CT image to a smaller size (256, 256, 256). So the resample factors are (0.25, 0.5, 0.5). After I finish the model training, the predicted lung or lobe segmentation needs to be up-sampled to the original shape during inference. If I use “bilinear” mode for NiftiSaver, some zigzag pattern would appear along the edge of lung or lobe.
Describe the solution you’d like Using current MONAI, I came up with several possible solutions to avoid the zigzag pattern in NiftiSaver :
- Use “bilinear” mode in NiftiSaver at first, and then use a threshold of 0.5 to binarize the results. However this method only applies to binary segmentation tasks, like lung segmentation. In multi-label segmentation, there is not a proper threshold for the whole image.
- I can use “nearest” mode at first to get the output with zigzag pattern. Then use some smooth algorithms to remove the zigzag pattern.
I do not have a satisfied solution in current MONAI. I hope NiftiSaver can have a mode “bilinear2nearest”. In this mode, the NiftiSaver will:
# In a n-label image segmentation
1. apply `argmax` to prediction, get the discreted masks.
2. apply `on_hot_encode` to the discreted masks, to get `n` channels of binary masks.
3. apply `bilinear` interpolation mode to eac channel of binary mask, get `n` channels of masks of original size.
4. apply `threshold=0.5` to all channels, get `n` channels of binary masks.
5. apply `on_hot_decode` to get the final n-label mask.
I have implementated this workflow in my own code, and it works well. I hope MONAI can also add this feature to NiftiSaver.
Note: The zigzag pattern matters especially when the interpolation factor is far from 1.
Note: this initial idea was implementated by myself these days and this idea can not remove zigzag pattern. So I followed [#3178 ], changed his Gaussian filter to Mean filter, and then got satisfied results. More details were shown bellow.
Issue Analytics
- State:
- Created 2 years ago
- Comments:7 (3 by maintainers)
Top GitHub Comments
However, now I am not sure if we should add this feature to MONAI. Because it is not easy to select a good smooth hyper parameter or threshold for different masks with different resolutions.
closing this in favour of https://github.com/Project-MONAI/MONAI/issues/3333 and https://github.com/Project-MONAI/MONAI/issues/5264
NiftiSaver
is also deprecated, the current preferred way is to have a postprocessing transform sequence:https://github.com/Project-MONAI/tutorials/blob/8abcbc62c704af0bb22bedba617ae914c7802b97/modules/engines/unet_evaluation_dict.py#L89-L96