[OTO–HNS2024] A Deep Learning Framework for Analysis of the Eustachian Tube and the Internal Carotid Artery
Ameen Amanian, Aseem Jain, Yuliang Xiao, Chanha Kim, Andy S. Ding, Manish Sahu, Russell Taylor, Mathias Unberath, Bryan K. Ward, Deepa Galaiya, Masaru Ishii, Francis X. Creighton
News | Abstract | Installation | Train | Inference | Evaluation
2024.04.30 - The data preprocessing , training, inference, and evaluation code are released.
2024.04.05 - Our paper is accepted to American Academy of Otolaryngology–Head and Neck Surgery 2024 (OTO-HNS2024).
-
Objective: Obtaining automated, objective 3-dimensional (3D) models of the Eustachian tube (ET) and the internal carotid artery (ICA) from computed tomography (CT) scans could provide useful navigational and diagnostic information for ET pathologies and interventions. We aim to develop a deep learning (DL) pipeline to automatically segment the ET and ICA and use these segmentations to compute distances between these structures.
-
Methods: From a database of 30 CT scans, 60 ET and ICA pairs were manually segmented and used to train an nnU-Net model, a DL segmentation framework. These segmentations were also used to develop a quantitative tool to capture the magnitude and location of the minimum distance point (MDP) between ET and ICA. Performance metrics for the nnU-Net automated segmentations were calculated via the average Hausdorff distance (AHD) and dice similarity coefficient (DSC).
-
Results: The AHD for the ETand ICA were 0.922 and 0.246 mm, respectively. Similarly, the DSC values for the ET and ICA were 0.578 and 0.884. The mean MDP from ET to ICA in the cartilaginous region was 2.6 mm (0.7-5.3 mm) and was located on average 1.9 mm caudal from the bony cartilaginous junction.
-
Conclusion: This study describes the first end-to-end DL pipeline for automated ET and ICA segmentation and analyzes distances between these structures. In addition to helping to ensure the safe selection of patients for ET dilation, this method can facilitate large-scale studies exploring the relationship between ET pathologies and the 3D shape of the ET.
Figure 1: Overview of Workflow
git clone https://github.com/mikami520/AutoSeg4ETICA.git && cd AutoSeg4ETICA
pip install -r requirements.txt
source /path/to/VIRTUAL_ENVIRONMENT/bin/activate
cd <path to repo>/preprocessing
Register data to template (can be used for multiple segmentations propagation)
python registration.py -bp <full path of base dir> -ip <relative path to nifti images dir> -sp <relative path to segmentations dir>
If you want to make sure correspondence of the name and value of segmentations, you can add the following commands after above command
-sl LabelValue1 LabelName1 LabelValue2 LabelName2 LabelValue3 LabelName3 ...
For example, if I have two labels for maxillary sinus named L-MS and R-MS
python registration.py -bp /Users/mikamixiao/Desktop -ip images -sp labels -sl 1 L-MS 2 R-MS
Final output of registered images and segmentations will be saved in
imagesRS/ && labelsRS/
Step 2: Create Datasplit for Training/Testing. Validation will be chosen automatically by nnUNet (filename format should be taskname_xxx.nii.gz)
python split_data.py -bp <full path of base dir> -ip <relative path to nifti images dir (imagesRS)> -sp <relative path to nifti segmentations dir (labelsRS)> -sl <a list of label name and corresponding label value> -ti <task id for nnUNet preprocessing> -tn <name of task>
For example
python split_data.py -bp /Users/mikamixiao/Desktop -ip imagesRS -sp labelsRS -sl 1 L-MS 2 R-MS -ti 001 -tn Sinus
Edit your ~/.bashrc
file with gedit ~/.bashrc
or nano ~/.bashrc
. At the end of the file, add the following lines:
export nnUNet_raw_data_base="<ABSOLUTE PATH TO BASE_DIR>/nnUnet/nnUNet_raw_data_base"
export nnUNet_preprocessed="<ABSOLUTE PATH TO BASE_DIR>/nnUNet_preprocessed"
export RESULTS_FOLDER="<ABSOLUTE PATH TO BASE_DIR>/nnUnet/nnUNet_trained_models"
After updating this you will need to source your ~/.bashrc
file.
source ~/.bashrc
This will deactivate your current conda environment.
Activate nnUNet environment
source /path/to/VIRTUAL_ENVIRONMENT/bin/activate
Run nnUNet preprocessing script.
nnUNet_plan_and_preprocess -t <task_id> --verify_dataset_integrity
Potential Error: You may need to edit the dataset.json file so that the labels are sequential. If you have at least 10 labels, then labels 10, 11, 12,...
will be arranged before labels 2, 3, 4, ...
. Doing this in a text editor is completely fine!
To train the model:
nnUNet_train 3d_fullres nnUNetTrainerV2 Task<task_num>_TemporalBone Y --npz
Y
refers to the number of folds for cross-validation. If Y
is set to all
then all of the data will be used for training. If you want to try 5-folds cross validation, you should define Y as 0, 1, 2, 3, 4
for five times.
--npz
makes the models save the softmax outputs (uncompressed, large files) during the final validation. It should only be used if you are training multiple configurations, which requires nnUNet_find_best_configuration
to find the best model. We omit this by default.
To run inference on trained checkpoints and obtain evaluation results:
nnUNet_find_best_configuration
will print a string to the terminal with the inference commands you need to use.
The easiest way to run inference is to simply use these commands.
If you wish to manually specify the configuration(s) used for inference, use the following commands:
For each of the desired configurations, run:
nnUNet_predict -i INPUT_FOLDER -o OUTPUT_FOLDER -t TASK_NAME_OR_ID -m CONFIGURATION --save_npz
Only specify --save_npz
if you intend to use ensembling. --save_npz
will make the command save the softmax
probabilities alongside of the predicted segmentation masks requiring a lot of disk space.
Please select a separate OUTPUT_FOLDER
for each configuration!
If you wish to run ensembling, you can ensemble the predictions from several configurations with the following command:
nnUNet_ensemble -f FOLDER1 FOLDER2 ... -o OUTPUT_FOLDER -pp POSTPROCESSING_FILE
You can specify an arbitrary number of folders, but remember that each folder needs to contain npz files that were
generated by nnUNet_predict
. For ensembling you can also specify a file that tells the command how to postprocess.
These files are created when running nnUNet_find_best_configuration
and are located in the respective trained model directory (RESULTS_FOLDER/nnUNet/CONFIGURATION/TaskXXX_MYTASK/TRAINER_CLASS_NAME__PLANS_FILE_IDENTIFIER/postprocessing.json or RESULTS_FOLDER/nnUNet/ensembles/TaskXXX_MYTASK/ensemble_X__Y__Z--X__Y__Z/postprocessing.json)
. You can also choose to not provide a file (simply omit -pp) and nnU-Net will not run postprocessing.
Note that per default, inference will be done with all available folds. We very strongly recommend you use all 5 folds. Thus, all 5 folds must have been trained prior to running inference. The list of available folds nnU-Net found will be printed at the start of the inference.
To compute the dice score, average hausdorff distance and weighted hausdorff distance:
cd <path to repo>/metrics
Run the metrics.py to output a CSV file that contain the dice score and hausdorff distance for each segmentation:
python metrics.py -bp <full path of base dir> -gp <relative path of ground truth dir> -pp <relative path of predicted segmentations dir> -sp <save dir> -vt <Validation type: 'dsc', 'ahd', 'whd'>
Users can choose any combinations of evaluation types among these three choices.
dsc: Dice Score
ahd: Average Hausdorff Distance
whd: Weighted Hausdorff Distance
If choosing whd
and you do not have a probability map, you can use get_probability_map.py
to obtain one. Here is the way to use:
python get_probability_map.py -bp <full path of base dir> -pp <relative path of predicted segmentations dir> -rr <ratio to split skeleton> -ps <probability sequences>
Currently, we split the skeleton alongside the x axis and from ear end to nasal. Please make sure the probability sequences are matched to the splitted regions. The output probability map which is a text file will be stored in output/
under the base directory
. Once obtaining the probability map, you can import your customized probability map by adding following command when using metrics.py
:
-pm <relative path of probability map>
python distanceVertex2Mesh.py -bp <full path of base dir> -gp <relative path of ground truth dir> -pp <relative path of predicted segmentations dir>
Once you get the closest distance (save in output/
under base directory
) from prediction to ground truth, you can easily draw the heat map and use the color bar to show the change of differences (ParaView
is recommended)
If you find this paper helpful, please consider citing:
@article{amanian2024deep,
title={A Deep Learning Framework for Analysis of the Eustachian Tube and the Internal Carotid Artery},
author={Amanian, Ameen and Jain, Aseem and Xiao, Yuliang and Kim, Chanha and Ding, Andy S and Sahu, Manish and Taylor, Russell and Unberath, Mathias and Ward, Bryan K and Galaiya, Deepa and others},
journal={Otolaryngology--Head and Neck Surgery},
publisher={Wiley Online Library}
}