From 65e02cbfe0c5d23cbda2ca0fdcd7a79359c446f7 Mon Sep 17 00:00:00 2001 From: Alena Ulla Uus Date: Mon, 11 Sep 2023 17:37:26 +0100 Subject: [PATCH 01/11] monai auto-proc-svrtk update --- app/Dockerfile | 16 +- app/docker-recon-brain-auto.bash | 1014 ++++++++++------ app/operators/docker-recon-brain-auto.bash | 1015 +++++++++++------ .../fetal_mri_3d_brain_recon_operator.py | 24 +- app/operators/nii2dcm_operator.py | 2 +- 5 files changed, 1407 insertions(+), 664 deletions(-) diff --git a/app/Dockerfile b/app/Dockerfile index b5be450..32b72bb 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -49,20 +49,20 @@ ENV PATH="$PATH:/home/MIRTK/build/bin:/home/MIRTK/build/lib/tools" WORKDIR /var/monai -# Add 3D UNet model weights & execution script +# Add MONAI 3D UNet model weights & execution script WORKDIR /home # Setup 3D UNet models -RUN git clone https://github.com/SVRTK/Segmentation_FetalMRI.git --branch svrtk-docker-gpu-0.10 --single-branch /home/Segmentation_FetalMRI +RUN git clone https://github.com/SVRTK/auto-proc-svrtk.git /home/auto-proc-svrtk -RUN wget https://gin.g-node.org/SVRTK/fetal_mri_network_weights/raw/master/checkpoints-brain-loc-2-labels/latest.ckpt -P /home/Segmentation_FetalMRI/trained-models/checkpoints-brain-loc-labels \ - && wget https://gin.g-node.org/SVRTK/fetal_mri_network_weights/raw/master/checkpoints-brain-loc-2-labels-cropped/latest.ckpt -P /home/Segmentation_FetalMRI/trained-models/checkpoints-brain-loc-labels-cropped \ - && wget https://gin.g-node.org/SVRTK/fetal_mri_network_weights/raw/master/checkpoints-brain-reo-5-labels/latest.ckpt -P /home/Segmentation_FetalMRI/trained-models/checkpoints-brain-reorientation \ - && wget https://gin.g-node.org/SVRTK/fetal_mri_network_weights/raw/master/checkpoints-brain-reo-5-labels-raw-stacks/latest.ckpt -P /home/Segmentation_FetalMRI/trained-models/checkpoints-brain-reorientation-stacks +RUN wget https://gin.g-node.org/SVRTK/fetal_mri_network_weights/raw/master/monai-checkpoints-atunet-brain_bet_all_degree_raw_stacks-1-lab/best_metric_model.pth -P /home/auto-proc-svrtk/trained-models/monai-checkpoints-atunet-brain_bet_all_degree_raw_stacks-1-lab \ + && wget https://gin.g-node.org/SVRTK/fetal_mri_network_weights/raw/master/monai-checkpoints-unet-global-loc-2-lab/best_metric_model.pth -P /home/auto-proc-svrtk/trained-models/monai-checkpoints-unet-global-loc-2-lab \ + && wget https://gin.g-node.org/SVRTK/fetal_mri_network_weights/raw/master/monai-checkpoints-unet-svr-brain-reo-5-lab/best_metric_model.pth -P /home/auto-proc-svrtk/trained-models/monai-checkpoints-unet-svr-brain-reo-5-lab \ + && wget https://gin.g-node.org/SVRTK/fetal_mri_network_weights/raw/master/monai-checkpoints-unet-svr-brain-reo-raw-stacks-5-lab/best_metric_model.pth -P /home/auto-proc-svrtk/trained-models/monai-checkpoints-unet-svr-brain-reo-raw-stacks-5-lab # Install Python packages -RUN python -m pip install -r /home/Segmentation_FetalMRI/requirements.txt +RUN python -m pip install -r /home/auto-proc-svrtk/config/requirements.txt # Bugfix: without below, cannot import torch within Python # Error: OSError: /opt/hpcx/ompi/lib/libmpi.so.40: undefined symbol: opal_hwloc201_hwloc_get_type_depth @@ -70,7 +70,7 @@ RUN python -m pip install -r /home/Segmentation_FetalMRI/requirements.txt ENV PATH="${PATH}:/opt/hpcx/ompi/bin" ENV LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/opt/hpcx/ompi/lib" -COPY docker-recon-brain-auto.bash /home/scripts/docker-recon-brain-auto.bash +COPY /home/auto-proc-svrtk/scripts/auto-brain-reconstruction-aide.sh /home/scripts/auto-brain-reconstruction.sh RUN mkdir -p /home/recon \ && mkdir -p /home/output \ && chmod +x /home/scripts/* diff --git a/app/docker-recon-brain-auto.bash b/app/docker-recon-brain-auto.bash index 51d012c..81f8828 100644 --- a/app/docker-recon-brain-auto.bash +++ b/app/docker-recon-brain-auto.bash @@ -1,493 +1,865 @@ -#!/bin/bash - - -########################################################################################################################## -###### SCRIPT FOR AUTOMATED SVR RECONSTRUCTION (incl. optional GPU-acceleration): docker-recon-brain-auto.bash -###### King's College London 2021 -###### https://github.com/SVRTK/svrtk-docker-gpu -########################################################################################################################## +#!/usr/bin/env bash -l + +# +# SVRTK : SVR reconstruction based on MIRTK +# +# Copyright 2018- King's College London +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# echo echo "-----------------------------------------------------------------------------" -echo "RUNNING AUTOMATED SVR RECONSTRUCTION" echo "-----------------------------------------------------------------------------" echo -########################################################################################################################## -###### INPUTS -########################################################################################################################## +#echo "Setting environment ... " +#echo -#folder with input files -default_recon_dir=$1 -#output path -output_path=$2 +source ~/.bashrc -#cnn mode: -1 cpu, 1 gpu -cnn_mode=$3 +#source /root/.bashrc +# +#eval "$(conda shell.bash hook)" +# +#conda init bash +# +#conda activate FetalMRI_MONAI -#severity of motion mode: -1 minor, 1 severe -motion_correction_mode=$4 +# +#echo "NOTE: UPDATE SOFTWARE PAHTS AS REQUIRED BEFORE RUNNING " +#echo "NOTE: DOWNLOAD MONAI WEIGHTS INTO auto-proc-svrtk/trained_models FOLDER FROM https://gin.g-node.org/SVRTK/fetal_mri_network_weights" +# +#exit -source ~/.bashrc -cd ${default_recon_dir} +software_path=/home -########################################################################################################################## -###### DEFAULT PARAMETERS AND PATHS -########################################################################################################################## +default_run_dir=/home/tmp_proc +segm_path=${software_path}/auto-proc-svrtk -# software and network weight paths -mirtk_path=/home/MIRTK/build/bin -segm_path=/home/Segmentation_FetalMRI -template_path=/home/Segmentation_FetalMRI/reference-templates -check_path_brain=/home/Segmentation_FetalMRI/trained-models/checkpoints-brain-loc-labels -check_path_brain_cropped=/home/Segmentation_FetalMRI/trained-models/checkpoints-brain-loc-labels-cropped -check_path_roi_reo_4lab=/home/Segmentation_FetalMRI/trained-models/checkpoints-brain-reorientation -check_path_roi_reo_4lab_stacks=/home/Segmentation_FetalMRI/trained-models/checkpoints-brain-reorientation-stacks +dcm2niix_path=${software_path}/dcm2niix/build/bin -# CNN parameters -res=128 -all_num_lab=1 -all_num_lab_reo=4 -current_lab=1 +mirtk_path=${software_path}/MIRTK/build/bin -# NOTE: 1 package is acceptable for low motion datasets / -1 for severe cases for automated detection -if [ $motion_correction_mode -gt 0 ]; then - num_packages=-1 -else - num_packages=1 +template_path=${segm_path}/templates + +model_path=${segm_path}/trained_models + + + + +test_dir=${software_path}/MIRTK +if [ ! -d $test_dir ];then + echo "ERROR: COULD NOT FIND MIRTK INSTALLED IN : " ${software_path} + echo "PLEASE INSTALL OR UPDATE THE PATH software_path VARIABLE IN THE SCRIPT" + exit +fi + +test_dir=${segm_path}/trained_models +if [ ! -d $test_dir ];then + echo "ERROR: COULD NOT FIND SEGMENTATION MODULE INSTALLED IN : " ${software_path} + echo "PLEASE INSTALL OR UPDATE THE PATH software_path VARIABLE IN THE SCRIPT" + exit fi -# TODO: implement check in case slice thickness inconsistent across stacks -if [[ -f "${default_recon_dir}/log_slice_thickness.txt" ]]; then - default_thickness=`cat "${default_recon_dir}/log_slice_thickness.txt" | awk -F' ' '{print $1}'` + + + +test_dir=${default_run_dir} +if [ ! -d $test_dir ];then + mkdir ${default_run_dir} else - echo "WARNING: Setting default_thickness = 2.5" - default_thickness=2.5 + rm -r ${default_run_dir}/* fi -echo -# NOTE: change output resolution to 0.75 - 0.8 ? -output_resolution=0.85 +test_dir=${default_run_dir} +if [ ! -d $test_dir ];then + echo "ERROR: COULD NOT CREATE THE PROCESSING FOLDER : " ${default_run_dir} + echo "PLEASE CHECK THE PERMISSIONS OR UPDATE THE PATH default_run_dir VARIABLE IN THE SCRIPT" + exit +fi + + -# Reconstruction ROI names -roi_recon=("SVR") -roi_names=("brain") -roi_ids=(1) -selected_recon_roi=0 -selected_recon_roi=0 +echo +echo "-----------------------------------------------------------------------------" +echo "-----------------------------------------------------------------------------" +echo +echo "SVRTK for fetal MRI (KCL): auto brain SVR reconstruction for SSTSE / HASTE T2w fetal MRI" +echo "Source code: https://github.com/SVRTK/auto-proc-svrtk" +echo +echo "-----------------------------------------------------------------------------" +echo "-----------------------------------------------------------------------------" +echo -########################################################################################################################## -###### COPY INPUT .NII FILES TO THE PROCESSING FOLDER -########################################################################################################################## +if [ $# -ne 2 ] ; then -# navigate to the processing folder and remove any files left from previous processing sessions -test_dir=${default_recon_dir}/svr_processing_files -if [[ -d ${test_dir} ]];then -rm -r ${default_recon_dir}/svr_processing_files/* + if [ $# -ne 6 ] ; then + echo "Usage: bash /home/auto-proc-svrtk/auto-brain-reconstruction.sh" + echo " [FULL path to the folder with raw T2w stacks in .nii or .dcm, e.g., /home/data/test]" + echo " [FULL path to the folder for recon results, e.g., /home/data/out-test]" + echo " (optional) [motion correction mode (0 or 1): 0 - minor, 1 - >180 degree rotations] - default: 1" + echo " (optional) [slice thickness] - default: 3.0" + echo " (optional) [output recon resolution] - default: 0.8" + echo " (optional) [number of packages] - default: 1" + echo + exit + else + input_main_folder=$1 + output_main_folder=$2 + motion_correction_mode=$3 + default_thickness=$4 + recon_resolution=$5 + num_packages=$6 + fi + else -mkdir ${default_recon_dir}/svr_processing_files + input_main_folder=$1 + output_main_folder=$2 + motion_correction_mode=1 + default_thickness=3.0 + recon_resolution=0.8 + num_packages=1 +fi + + +echo " - input folder : " ${input_main_folder} +echo " - output folder : " ${output_main_folder} +echo " - motion correction mode : " ${motion_correction_mode} +echo " - slice thickness : " ${default_thickness} +echo " - output resolution : " ${recon_resolution} + + +recon_roi=brain + + +test_dir=${input_main_folder} +if [ ! -d $test_dir ];then + echo + echo "ERROR: NO FOLDER WITH THE INPUT FILES FOUND !!!!" + exit fi -test_file=${default_recon_dir}/error.txt -if [[ -f ${test_file} ]];then -rm ${default_recon_dir}/error.txt + +test_dir=${output_main_folder} +if [ ! -d $test_dir ];then + mkdir ${output_main_folder} + chmod 1777 -R ${output_main_folder}/ fi -test_file=${default_recon_dir}/SVR-output.nii.gz -if [[ -f ${test_file} ]];then -rm ${default_recon_dir}/SVR-output* + + +cd ${default_run_dir} +main_dir=$(pwd) + + + +number_of_stacks=$(find ${input_main_folder}/ -name "*.dcm" | wc -l) +if [ $number_of_stacks -gt 0 ];then + echo + echo "-----------------------------------------------------------------------------" + echo "FOUND .dcm FILES - CONVERTING TO .nii.gz !!!!" + echo "-----------------------------------------------------------------------------" + echo + cd ${input_main_folder}/ + ${dcm2niix_path}/dcm2niix -z y . + cd ${main_dir}/ fi -# check the total number of available .nii files -num_stacks=$(find . -name "*.nii*" | wc -l) -if [ $num_stacks -gt 1 ]; then - echo " - found " ${num_stacks} ".nii files" -else + + +number_of_stacks=$(find ${input_main_folder}/ -name "*.nii*" | wc -l) +if [ $number_of_stacks -eq 0 ];then + + chmod 1777 -R ${output_main_folder}/ + echo echo "-----------------------------------------------------------------------------" - echo "ERROR : NO .NII FILES FOUND - EXIT ..." + echo "ERROR: NO INPUT .nii / .nii.gz FILES FOUND !!!!" echo "-----------------------------------------------------------------------------" echo - echo "ERROR: NO INPUT FILLES. " > ${default_recon_dir}/error.txt exit fi -main_dir=${default_recon_dir}/svr_processing_files -mkdir ${default_recon_dir}/svr_processing_files/cnn-recon-org-files -#find ${default_recon_dir}/ -name "*.nii*" -exec cp {} ${main_dir}/cnn-recon-org-files \; -cp ${default_recon_dir}/*.nii* ${main_dir}/cnn-recon-org-files/ -cd ${default_recon_dir}/svr_processing_files +mkdir ${default_run_dir}/org-files +find ${input_main_folder}/ -name "*.nii*" -exec cp {} ${default_run_dir}/org-files \; -mkdir cnn-recon-org-files-packages -cp cnn-recon-org-files/* cnn-recon-org-files-packages +number_of_stacks=$(find ${default_run_dir}/org-files -name "*SVR-output*.nii*" | wc -l) +if [ $number_of_stacks -gt 0 ];then + echo + echo "-----------------------------------------------------------------------------" + echo "WARNING: FOUND ALREADY EXISTING *SVR-output* FILES IN THE DATA FOLDER !!!!" + echo "-----------------------------------------------------------------------------" + echo "note: they won't be used in reconstruction" + echo + rm ${default_run_dir}/org-files/"*SVR-output*.nii*" +fi + +number_of_stacks=$(find ${default_run_dir}/org-files -name "*mask*.nii*" | wc -l) +if [ $number_of_stacks -gt 0 ];then -# split into packages only if the default parameter number is not 1 -if [ $num_packages -ne 1 ]; then echo echo "-----------------------------------------------------------------------------" - echo "SPLITTING INTO PACKAGES ..." + echo "WARNING: FOUND *mask* FILES IN THE DATA FOLDER !!!!" echo "-----------------------------------------------------------------------------" + echo "note: they won't be used in reconstruction" echo + rm ${default_run_dir}/org-files/"*mask*.nii*" +fi - cd ${main_dir} - cd cnn-recon-org-files-packages +echo +echo "-----------------------------------------------------------------------------" +echo "-----------------------------------------------------------------------------" +echo +echo "PREPROCESSING ..." +echo - stack_names=$(ls *.nii*) - IFS=$'\n' read -rd '' -a all_stacks <<<"$stack_names" +cd ${default_run_dir} + + +mkdir org-files-preproc +cp org-files/* org-files-preproc + +cd org-files-preproc + +stack_names=$(ls *.nii*) +read -rd '' -a all_stacks <<<"$stack_names" + +echo +echo "-----------------------------------------------------------------------------" +echo "REMOVING NAN & NEGATIVE/EXTREME VALUES & SPLITTING INTO DYNAMICS ..." +echo "-----------------------------------------------------------------------------" +echo + +for ((i=0;i<${#all_stacks[@]};i++)); +do + echo " - " ${i} " : " ${all_stacks[$i]} + + st=${all_stacks[$i]} + st=$(echo ${st//.nii.gz\//\.nii.gz}) + st=$(echo ${st//.nii\//\.nii}) + + ${mirtk_path}/mirtk nan ${st} 100000 + ${mirtk_path}/mirtk extract-image-region ${st} ${st} -split t + rm ${st} +done + + +stack_names=$(ls *.nii*) +read -rd '' -a all_stacks <<<"$stack_names" + + +if [ $num_packages -ne 1 ]; then + echo + echo "-----------------------------------------------------------------------------" + echo "SPLITTING INTO PACKAGES ..." + echo "-----------------------------------------------------------------------------" + echo - echo "folder : " ${in_file_dir} for ((i=0;i<${#all_stacks[@]};i++)); do - ${mirtk_path}/mirtk extract-packages ${all_stacks[$i]} ${num_packages} - rm ${all_stacks[$i]} + echo " - " ${i} " : " ${all_stacks[$i]} + + st=${all_stacks[$i]} + st=$(echo ${st//.nii.gz\//\.nii.gz}) + st=$(echo ${st//.nii\//\.nii}) + + ${mirtk_path}/mirtk extract-packages ${st} ${num_packages} + + rm ${st} rm package-template.nii.gz - echo " - " ${all_stacks[$i]} + done fi -#final input files -cd ${main_dir} -stack_names=$(ls cnn-recon-org-files-packages/*.nii*) -IFS=$'\n' read -rd '' -a all_stacks <<<"$stack_names" -########################################################################################################################## -###### 3D UNET-BASED GLOBAL BRAIN LOCALISATION + LOCAL MASK REFINEMENT + REORIENTATION (FOR SEVERE MOTION CASES) -########################################################################################################################## + mkdir ${default_run_dir}/tmp-res-global + + stack_names=$(ls *.nii*) + read -rd '' -a all_stacks <<<"$stack_names" + + echo + echo "-----------------------------------------------------------------------------" + echo "PREPROCESSING FOR LOCALISATION ..." + echo "-----------------------------------------------------------------------------" + echo + + for ((i=0;i<${#all_stacks[@]};i++)); + do + echo " - " ${i} " : " ${all_stacks[$i]} + + st=${all_stacks[$i]} + st=$(echo ${st//.nii.gz\//\.nii.gz}) + st=$(echo ${st//.nii\//\.nii}) + + jj=$((${i}+1000)) + + ${mirtk_path}/mirtk resample-image ${st} ${main_dir}/tmp-res-global/stack-${jj}.nii.gz -size 1.5 1.5 1.5 + + done + echo echo "-----------------------------------------------------------------------------" -echo "3D UNET SEGMENTATION ..." echo "-----------------------------------------------------------------------------" echo +echo "GLOBAL LOCALISATION SEGMENTATION..." +echo cd ${main_dir} -mkdir cnn-out-files echo -echo "RUNNING GLOBAL LOCALISATION ..." +echo "-----------------------------------------------------------------------------" +echo "RUNNING GLOBAL BODY+BRAIN LOCALISATION ..." +echo "-----------------------------------------------------------------------------" echo -# 3D UNet global localisaton of the brain in the original stacks/packages -number_of_stacks=$(ls cnn-recon-org-files-packages/*.nii* | wc -l) -stack_names=$(ls cnn-recon-org-files-packages/*.nii*) -all_num_lab=1 -${mirtk_path}/mirtk prepare-for-cnn cnn-recon-res-files stack-files run.csv run-info-summary.csv ${res} ${number_of_stacks} $(echo $stack_names) ${all_num_lab} 0 -main_dir=$(pwd) -PYTHONIOENCODING=utf-8 python ${segm_path}/run_cnn_loc_gpu_cpu.py ${segm_path}/ ${check_path_brain}/ ${main_dir}/ ${main_dir}/cnn-out-files/ run.csv ${res} ${all_num_lab} ${cnn_mode} -out_mask_names=$(ls cnn-out-files/*seg_pr*.nii*) -out_stack_names=$(ls stack-files/*.nii*) -IFS=$'\n' read -rd '' -a all_masks <<<"$out_mask_names" -IFS=$'\n' read -rd '' -a all_stacks <<<"$out_stack_names" - -test_file=cnn-out-files/cnn-recon-res-files_in-res-stack-1000_img-0.nii.gz -if [[ ! -f ${test_file} ]];then +number_of_stacks=$(ls org-files-preproc/*.nii* | wc -l) +stack_names=$(ls org-files-preproc/*.nii*) + +echo " ... " + +res=128 +monai_lab_num=2 +number_of_stacks=$(find tmp-res-global/ -name "*.nii*" | wc -l) +${mirtk_path}/mirtk prepare-for-monai res-global-files/ global-files/ stack-info.json stack-info.csv ${res} ${number_of_stacks} tmp-res-global/*nii* > tmp.log + +current_monai_check_path=${model_path}/monai-checkpoints-unet-global-loc-2-lab + +mkdir monai-segmentation-results-global +python ${segm_path}/src/run_monai_unet_segmentation-2022.py ${main_dir}/ ${current_monai_check_path}/ stack-info.json ${main_dir}/monai-segmentation-results-global ${res} ${monai_lab_num} + + +number_of_stacks=$(find monai-segmentation-results-global/ -name "*.nii*" | wc -l) +if [ ${number_of_stacks} -eq 0 ];then + + chmod 1777 -R ${output_main_folder}/ + echo echo "-----------------------------------------------------------------------------" - echo "ERROR : GLOBAL 3D UNET LOCALISATION FAILED ..." + echo "ERROR: GLOBAL CNN LOCALISATION DID NOT WORK !!!!" echo "-----------------------------------------------------------------------------" echo - echo "ERROR : GLOBAL 3D UNET LOCALISATION FAILED. " > ${default_recon_dir}/error.txt exit fi echo -echo "RUNNING CROPPED REFINEMENT ..." +echo "-----------------------------------------------------------------------------" +echo "EXTRACTING LABELS ..." +echo "-----------------------------------------------------------------------------" echo -mkdir cropped-files -mkdir cropped-cnn-out-files -mkdir tmp-masks-global +out_mask_names=$(ls monai-segmentation-results-global/cnn-*.nii*) +read -rd '' -a all_masks <<<"$out_mask_names" -# cropping all stacks based on the global brain ROI masks -for ((i=0;i<${#all_stacks[@]};i++)); +org_stack_names=$(ls org-files-preproc/*.nii*) +read -rd '' -a all_org_stacks <<<"$org_stack_names" + + +mkdir out-global-masks +mkdir cropped-stacks-brain +#mkdir cropped-stacks-body +mkdir recon-stacks-brain +#mkdir recon-stacks-body +mkdir masked-cropped-stacks-brain + + +for ((i=0;i<${#all_org_stacks[@]};i++)); do + echo " - " ${i} " : " ${all_org_stacks[$i]} ${all_masks[$i]} + jj=$((${i}+1000)) - ${mirtk_path}/mirtk extract-label cnn-out-files/*-${jj}_seg_pr*.nii* tmp-org-m.nii.gz 1 1 - ${mirtk_path}/mirtk extract-connected-components tmp-org-m.nii.gz tmp-org-m.nii.gz -max-size 1000000 - ${mirtk_path}/mirtk dilate-image tmp-org-m.nii.gz dl-m.nii.gz -iterations 6 - ${mirtk_path}/mirtk crop-image stack-files/stack-${jj}.nii.gz dl-m.nii.gz cropped-files/cropped-stack-${jj}.nii.gz + + ${mirtk_path}/mirtk extract-label ${all_masks[$i]} out-global-masks/mask-body-${jj}.nii.gz 1 1 + ${mirtk_path}/mirtk extract-label ${all_masks[$i]} out-global-masks/mask-brain-${jj}.nii.gz 2 2 + + ${mirtk_path}/mirtk erode-image out-global-masks/mask-brain-${jj}.nii.gz out-global-masks/mask-brain-${jj}.nii.gz -iterations 1 + +# ${mirtk_path}/mirtk extract-connected-components out-global-masks/mask-body-${jj}.nii.gz out-global-masks/mask-body-${jj}.nii.gz -n 1 + ${mirtk_path}/mirtk extract-connected-components out-global-masks/mask-brain-${jj}.nii.gz out-global-masks/mask-brain-${jj}.nii.gz -max-size 950000 -n 1 + + roi=brain +# ${mirtk_path}/mirtk erode-image out-global-masks/mask-${roi}-${jj}.nii.gz out-global-masks/mask-${roi}-${jj}.nii.gz -iterations 2 +# ${mirtk_path}/mirtk dilate-image out-global-masks/mask-brain-${jj}.nii.gz out-global-masks/mask-${roi}-${jj}.nii.gz -iterations 2 + ${mirtk_path}/mirtk dilate-image out-global-masks/mask-${roi}-${jj}.nii.gz dl-m.nii.gz -iterations 3 + ${mirtk_path}/mirtk crop-image ${all_org_stacks[$i]} dl-m.nii.gz cropped-stacks-${roi}/stack-${jj}.nii.gz + cp cropped-stacks-${roi}/stack-${jj}.nii.gz recon-stacks-${roi}/ +# ${mirtk_path}/mirtk mask-image cropped-stacks-${roi}/stack-${jj}.nii.gz dl-m.nii.gz masked-cropped-stacks-${roi}/stack-${jj}.nii.gz + cp cropped-stacks-${roi}/stack-${jj}.nii.gz masked-cropped-stacks-${roi}/stack-${jj}.nii.gz + ${mirtk_path}/mirtk resample-image masked-cropped-stacks-${roi}/stack-${jj}.nii.gz masked-cropped-stacks-${roi}/stack-${jj}.nii.gz -size 1.5 1.5 1.5 + + done -# 3D UNet segmentation of the brain in the cropped stacks -number_of_stacks=$(ls cropped-files/*.nii* | wc -l) -stack_names=$(ls cropped-files/*.nii*) -all_num_lab=1 -${mirtk_path}/mirtk prepare-for-cnn cropped-cnn-recon-res-files cropped-cnn-recon-stack-files cropped-run.csv cropped-run-info-summary.csv ${res} ${number_of_stacks} $(echo $stack_names) ${all_num_lab} 0 -PYTHONIOENCODING=utf-8 python ${segm_path}/run_cnn_loc_gpu_cpu.py ${segm_path}/ ${check_path_brain_cropped}/ ${main_dir}/ ${main_dir}/cropped-cnn-out-files/ cropped-run.csv ${res} ${all_num_lab} ${cnn_mode} -test_file=cropped-cnn-out-files/cropped-cnn-recon-res-files_in-res-stack-1000_img-0.nii.gz -if [[ ! -f ${test_file} ]];then +echo +echo "-----------------------------------------------------------------------------" +echo "-----------------------------------------------------------------------------" +echo +echo "LOCAL ROI SEGMENTATION ..." +echo + +cd ${main_dir} + +mkdir recon-masks-brain/ + + +echo +echo "-----------------------------------------------------------------------------" +echo "RUNNING BRAIN SEGMENTATION ..." +echo "-----------------------------------------------------------------------------" +echo + +number_of_stacks=$(ls masked-cropped-stacks-${roi}/*.nii* | wc -l) +stack_names=$(ls masked-cropped-stacks-${roi}/*.nii*) + +echo " ... " + +roi=brain +res=128 +monai_lab_num=1 +${mirtk_path}/mirtk prepare-for-monai res-cropped-files/ again-cropped-files/ cropped-stack-info.json cropped-stack-info.csv ${res} ${number_of_stacks} masked-cropped-stacks-${roi}/*nii* > tmp.log + +current_monai_check_path=${model_path}/monai-checkpoints-atunet-brain_bet_all_degree_raw_stacks-1-lab + +mkdir monai-segmentation-results-stack-brain +python ${segm_path}/src/run_monai_atunet_segmentation-2022.py ${main_dir}/ ${current_monai_check_path}/ cropped-stack-info.json ${main_dir}/monai-segmentation-results-stack-brain ${res} ${monai_lab_num} + +number_of_stacks=$(find monai-segmentation-results-stack-brain/ -name "*.nii*" | wc -l) +if [ ${number_of_stacks} -eq 0 ];then + + chmod 1777 -R ${output_main_folder}/ + echo echo "-----------------------------------------------------------------------------" - echo "ERROR : CROPPED 3D UNET LOCALISATION FAILED ..." + echo "ERROR: brain CNN LOCALISATION DID NOT WORK !!!!" echo "-----------------------------------------------------------------------------" + echo "note: check whether FetalMRI_MONAI was activated" + echo "conda init bash" + echo "conda activate FetalMRI_MONAI" echo - echo "ERROR : CROPPED 3D UNET LOCALISATION FAILED. " > ${default_recon_dir}/error.txt exit fi echo -echo "EXTRACTING ROI-SPECIFIC MASKS ..." +echo "-----------------------------------------------------------------------------" +echo "EXTRACTING LABELS ..." +echo "-----------------------------------------------------------------------------" echo -cd ${main_dir} -out_mask_names=$(ls cropped-cnn-out-files/*seg_pr*.nii*) -out_stack_names=$(ls stack-files/*.nii*) -IFS=$'\n' read -rd '' -a all_masks <<<"$out_mask_names" -IFS=$'\n' read -rd '' -a all_stacks <<<"$out_stack_names" - -cd ${main_dir} - -mkdir mask-files-${roi_ids[${selected_recon_roi}]} -current_lab=1 +out_mask_names=$(ls monai-segmentation-results-stack-brain/cnn-*.nii*) +read -rd '' -a all_masks <<<"$out_mask_names" + +org_stack_names=$(ls cropped-stacks-${roi}/*.nii*) +read -rd '' -a all_org_stacks <<<"$org_stack_names" -for ((i=0;i<${#all_masks[@]};i++)); +mkdir masked-cropped-files-brain + +for ((i=0;i<${#all_org_stacks[@]};i++)); do + echo " - " ${i} " : " ${all_org_stacks[$i]} ${all_masks[$i]} + jj=$((${i}+1000)) - # extraction of brain masks - ${mirtk_path}/mirtk transform-image cropped-cnn-out-files/*-${jj}_seg_pr*.nii* mask-files-${roi_ids[${selected_recon_roi}]}/mask-${jj}.nii.gz -target cropped-files/*-${jj}.nii.gz -interp NN - ${mirtk_path}/mirtk extract-label mask-files-${roi_ids[${selected_recon_roi}]}/mask-${jj}.nii.gz mask-files-${roi_ids[${selected_recon_roi}]}/mask-${jj}.nii.gz ${current_lab} ${current_lab} - ${mirtk_path}/mirtk extract-connected-components mask-files-${roi_ids[${selected_recon_roi}]}/mask-${jj}.nii.gz mask-files-${roi_ids[${selected_recon_roi}]}/mask-${jj}.nii.gz -max-size 800000 - - # centering stacks vs. brain centre for severe motion cases - #if [ $motion_correction_mode -gt 0 ]; then + + ${mirtk_path}/mirtk extract-label ${all_masks[$i]} recon-masks-brain/mask-${jj}.nii.gz 1 1 + ${mirtk_path}/mirtk erode-image recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -iterations 2 + ${mirtk_path}/mirtk extract-connected-components recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -n 1 -max-size 700000 + ${mirtk_path}/mirtk dilate-image recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -iterations 2 - ${mirtk_path}/mirtk transform-image mask-files-${roi_ids[$selected_recon_roi]}/mask-${jj}.nii.gz mask-files-${roi_ids[$selected_recon_roi]}/mask-${jj}.nii.gz -target cropped-files/cropped-stack-${jj}.nii.gz -interp NN - ${mirtk_path}/mirtk centre-volume cropped-files/cropped-stack-${jj}.nii.gz mask-files-${roi_ids[$selected_recon_roi]}/mask-${jj}.nii.gz cropped-files/cropped-stack-${jj}.nii.gz - ${mirtk_path}/mirtk centre-volume mask-files-${roi_ids[$selected_recon_roi]}/mask-${jj}.nii.gz mask-files-${roi_ids[$selected_recon_roi]}/mask-${jj}.nii.gz mask-files-${roi_ids[$selected_recon_roi]}/mask-${jj}.nii.gz + ${mirtk_path}/mirtk transform-image recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -target recon-stacks-brain/stack-${jj}.nii.gz -labels - #fi - - echo stack-files/stack-${jj}.nii.gz " - " cropped-cnn-out-files/*-${jj}_seg_pr*.nii* " - " mask-files-${roi_ids[${selected_recon_roi}]}/mask-${jj}.nii.gz + ${mirtk_path}/mirtk centre-volume recon-stacks-brain/stack-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz recon-stacks-brain/stack-${jj}.nii.gz + ${mirtk_path}/mirtk centre-volume recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz + + if [ $motion_correction_mode -eq 1 ]; then + + ${mirtk_path}/mirtk dilate-image recon-masks-brain/mask-${jj}.nii.gz dl.nii.gz -iterations 4 + + ${mirtk_path}/mirtk crop-image recon-stacks-brain/stack-${jj}.nii.gz dl.nii.gz masked-cropped-files-brain/stack-${jj}.nii.gz + ${mirtk_path}/mirtk mask-image masked-cropped-files-brain/stack-${jj}.nii.gz dl.nii.gz masked-cropped-files-brain/stack-${jj}.nii.gz + + ${mirtk_path}/mirtk resample-image masked-cropped-files-brain/stack-${jj}.nii.gz masked-cropped-files-brain/stack-${jj}.nii.gz -size 1 1 1 -interp Linear + fi done -# CNN landmark-based reorientation of stacks to the standard space for severe motion cases -if [ $motion_correction_mode -gt 0 ]; then - mkdir cropped-cnn-out-files-4reo - mkdir stack-dofs-to-atl - mkdir stack-reo-mask-files +if [ $motion_correction_mode -eq 1 ]; then - number_of_stacks=$(ls cropped-files/*.nii* | wc -l) - stack_names=$(ls cropped-files/*.nii*) + echo + echo "-----------------------------------------------------------------------------" + echo "RUNNING BRAIN ROI REORIENTATION ..." + echo "-----------------------------------------------------------------------------" + echo + + number_of_stacks=$(ls masked-cropped-files-brain/*.nii* | wc -l) + stack_names=$(ls masked-cropped-files-brain/*.nii*) + + echo " ... " + + roi=brain + res=128 + monai_lab_num=5 + ${mirtk_path}/mirtk prepare-for-monai res-cropped-files/ again-cropped-files/ reo-cropped-stack-info.json reo-cropped-stack-info.csv ${res} ${number_of_stacks} masked-cropped-files-brain/*nii* > tmp.log + + current_monai_check_path=${model_path}/monai-checkpoints-unet-svr-brain-reo-raw-stacks-5-lab - # 3D UNet segmentation of 4 brain landmark labels - all_num_lab_reo=4 - ${mirtk_path}/mirtk prepare-for-cnn cropped-res-files cropped-stack-files cropped-run-4reo.csv cropped-run-info-summary.csv ${res} ${number_of_stacks} $(echo $stack_names) ${all_num_lab_reo} 0 - PYTHONIOENCODING=utf-8 python ${segm_path}/run_cnn_loc_gpu_cpu.py ${segm_path}/ ${check_path_roi_reo_4lab_stacks}/ ${main_dir}/ ${main_dir}/cropped-cnn-out-files-4reo/ cropped-run-4reo.csv ${res} ${all_num_lab_reo} ${cnn_mode} +# current_monai_check_path=${model_path}/monai-checkpoints-unet-brain-raw-reo-5-lab-055t + + mkdir monai-segmentation-results-stack-reo + python ${segm_path}/src/run_monai_unet_segmentation-2022.py ${main_dir}/ ${current_monai_check_path}/ reo-cropped-stack-info.json ${main_dir}/monai-segmentation-results-stack-reo ${res} ${monai_lab_num} + + + number_of_stacks=$(find monai-segmentation-results-stack-reo/ -name "*.nii*" | wc -l) + if [ ${number_of_stacks} -eq 0 ];then - reo_roi_ids=(1 2 3 4) - lab_start=(1 2 1 4) - lab_stop=(1 2 4 4) - lab_cc=(2 2 1 1) + chmod 1777 -R ${output_main_folder}/ - # 1 - front WM, 2 - back WM, 3 - bet, 4 - cerebellum - test_file=cropped-cnn-out-files-4reo/cropped-res-files_in-res-stack-1000_img-0.nii.gz - if [[ ! -f ${test_file} ]];then echo echo "-----------------------------------------------------------------------------" - echo "ERROR : CROPPED 3D UNET REORIENTATION FAILED ..." + echo "ERROR: REO CNN LOCALISATION DID NOT WORK !!!!" echo "-----------------------------------------------------------------------------" echo - echo "ERROR : CROPPED 3D UNET REORIENTATION FAILED. " > ${default_recon_dir}/error.txt exit fi - out_mask_names=$(ls cropped-cnn-out-files-4reo/*seg_pr*.nii*) - IFS=$'\n' read -rd '' -a all_masks <<<"$out_mask_names" + echo + echo "-----------------------------------------------------------------------------" + echo "EXTRACTING REO LABELS AND REORIENTING ..." + echo "-----------------------------------------------------------------------------" + echo + + out_mask_names=$(ls monai-segmentation-results-stack-reo/cnn-*.nii*) + read -rd '' -a all_masks <<<"$out_mask_names" + + org_stack_names=$(ls cropped-stacks-${roi}/*.nii*) + read -rd '' -a all_org_stacks <<<"$org_stack_names" + + mkdir out-stack-reo-masks + mkdir out-dofs-to-templates + + ${mirtk_path}/mirtk init-dof init.dof + + # mkdir test-org + - for ((i=0;i<${#all_masks[@]};i++)); - do + for ((i=0;i<${#all_org_stacks[@]};i++)); + do + echo " - " ${i} " : " ${all_org_stacks[$i]} ${all_masks[$i]} + jj=$((${i}+1000)) - echo " - " ${jj} " ... " - # extracting landmark masks - for ((w=0;w<${#reo_roi_ids[@]};w++)); + + for ((q=1;q<6;q++)); do - current_lab=${reo_roi_ids[$w]} - s1=${lab_start[$w]} - s2=${lab_stop[$w]} - currenct_cc=${lab_cc[$w]} - ${mirtk_path}/mirtk extract-label ${main_dir}/cropped-cnn-out-files-4reo/*-${jj}_seg_pr*.nii* tmp-org-m.nii.gz ${s1} ${s2} - ${mirtk_path}/mirtk extract-connected-components tmp-org-m.nii.gz tmp-org-m.nii.gz -n ${currenct_cc} - cp tmp-org-m.nii.gz stack-reo-mask-files/mask-${jj}-${current_lab}.nii.gz + ${mirtk_path}/mirtk extract-label ${all_masks[$i]} out-stack-reo-masks/mask-${jj}-${q}.nii.gz ${q} ${q} + ${mirtk_path}/mirtk dilate-image out-stack-reo-masks/mask-${jj}-${q}.nii.gz out-stack-reo-masks/mask-${jj}-${q}.nii.gz + ${mirtk_path}/mirtk erode-image out-stack-reo-masks/mask-${jj}-${q}.nii.gz out-stack-reo-masks/mask-${jj}-${q}.nii.gz + ${mirtk_path}/mirtk extract-connected-components out-stack-reo-masks/mask-${jj}-${q}.nii.gz out-stack-reo-masks/mask-${jj}-${q}.nii.gz + # ${mirtk_path}/mirtk transform-image out-stack-reo-masks/mask-${jj}-${q}.nii.gz out-stack-reo-masks/mask-${jj}-${q}.nii.gz -target ${all_org_stacks[$i]} -labels done - ${mirtk_path}/mirtk init-dof init.dof - z1=1; z2=2; z3=3; z4=4 ; - # running landmark-based reorientation - ${mirtk_path}/mirtk register-landmarks ${template_path}/brain-ref-atlas-2021/new-brain-templ.nii.gz stack-reo-mask-files/mask-${jj}-0.nii.gz init.dof stack-dofs-to-atl/dof-to-atl-${jj}.dof 4 4 ${template_path}/brain-ref-atlas-2021/mask-${z1}.nii.gz ${template_path}/brain-ref-atlas-2021/mask-${z2}.nii.gz ${template_path}/brain-ref-atlas-2021/mask-${z3}.nii.gz ${template_path}/brain-ref-atlas-2021/mask-${z4}.nii.gz stack-reo-mask-files/mask-${jj}-${z1}.nii.gz stack-reo-mask-files/mask-${jj}-${z2}.nii.gz stack-reo-mask-files/mask-${jj}-${z3}.nii.gz stack-reo-mask-files/mask-${jj}-${z4}.nii.gz > tmp.txt - # changing stack header orientation based on the transformations - ${mirtk_path}/mirtk edit-image cropped-files/cropped-stack-${jj}.nii.gz cropped-files/cropped-stack-${jj}.nii.gz -dofin_i stack-dofs-to-atl/dof-to-atl-${jj}.dof - ${mirtk_path}/mirtk edit-image mask-files-${roi_ids[$selected_recon_roi]}/mask-${jj}.nii.gz mask-files-${roi_ids[$selected_recon_roi]}/mask-${jj}.nii.gz -dofin_i stack-dofs-to-atl/dof-to-atl-${jj}.dof + n_roi=4; z1=1; z2=2; z3=3; z4=4; + current_template_path=${template_path}/brain-ref-atlas-2022 + ${mirtk_path}/mirtk register-landmarks mask-${z1}.nii.gz out-stack-reo-masks/mask-${jj}-${z1}.nii.gz init.dof out-dofs-to-templates/dof-to-atl-${jj}.dof 4 4 ${current_template_path}/mask-${z1}.nii.gz ${current_template_path}/mask-${z2}.nii.gz ${current_template_path}/mask-${z3}.nii.gz ${current_template_path}/mask-${z4}.nii.gz out-stack-reo-masks/mask-${jj}-${z1}.nii.gz out-stack-reo-masks/mask-${jj}-${z2}.nii.gz out-stack-reo-masks/mask-${jj}-${z3}.nii.gz out-stack-reo-masks/mask-${jj}-${z4}.nii.gz > tmp.log + + cp out-dofs-to-templates/dof-to-atl-${jj}.dof init.dof + + test_file=out-dofs-to-templates/dof-to-atl-${jj}.dof + if [ ! -f ${test_file} ];then + + chmod 1777 -R ${output_main_folder}/ + + echo + echo "-----------------------------------------------------------------------------" + echo "ERROR: REORIENTATION DID NOT WORK !!!!" + echo "-----------------------------------------------------------------------------" + echo + exit + fi + + ${mirtk_path}/mirtk info out-dofs-to-templates/dof-to-atl-${jj}.dof + + ${mirtk_path}/mirtk edit-image recon-stacks-brain/stack-${jj}.nii.gz recon-stacks-brain/stack-${jj}.nii.gz -dofin_i out-dofs-to-templates/dof-to-atl-${jj}.dof + ${mirtk_path}/mirtk edit-image recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -dofin_i out-dofs-to-templates/dof-to-atl-${jj}.dof + + # ${mirtk_path}/mirtk centre-volume recon-stacks-brain/stack-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz recon-stacks-brain/stack-${jj}.nii.gz + # ${mirtk_path}/mirtk centre-volume recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz done + + fi -########################################################################################################################## -###### STACK SELECTION + SVR RECONSTRUCTION -########################################################################################################################## + echo echo "-----------------------------------------------------------------------------" -echo "RUNNING STACK SELECTION ..." echo "-----------------------------------------------------------------------------" echo +echo "RUNNING RECONSTRUCTION ..." +echo cd ${main_dir} -mkdir out-proc-${roi_names[${selected_recon_roi}]} -cd out-proc-${roi_names[${selected_recon_roi}]} - -number_of_stacks=$(ls ../cropped-files/*.nii* | wc -l) -stack_names=$(ls ../cropped-files/*.nii*) -mask_names=$(ls ../mask-files-${roi_ids[$selected_recon_roi]}/*.nii*) -# selection/exclusion of stacks based on similarity metrics and generation of the average mask -mkdir proc-stacks -${mirtk_path}/mirtk stacks-and-masks-selection ${number_of_stacks} $(echo $stack_names) $(echo $mask_names) proc-stacks 15 1 +if [ $recon_roi = "brain" ]; then -test_file=average_mask_cnn.nii.gz -if [[ ! -f ${test_file} ]];then echo echo "-----------------------------------------------------------------------------" - echo "ERROR : STACK SELECTION FAILED ..." + echo "SELECTING STACKS / GENERATING TEMPLATE ..." echo "-----------------------------------------------------------------------------" echo - echo "ERROR: STACK SELECTION FAILED. " > ${default_recon_dir}/error.txt - exit -fi + + cd ${main_dir} + + recon_roi_global=brain + + number_of_stacks=$(ls recon-stacks-${recon_roi_global}/*.nii* | wc -l) + stack_names=$(ls recon-stacks-${recon_roi_global}/*.nii*) + mask_names=$(ls recon-masks-${recon_roi}/*.nii*) + + + mkdir proc-stacks-${recon_roi} -# generation of the average template -${mirtk_path}/mirtk average-images average_volume.nii.gz proc-stacks/*nii* -${mirtk_path}/mirtk resample-image average_volume.nii.gz average_volume.nii.gz -size 1 1 1 -${mirtk_path}/mirtk average-images average_volume.nii.gz proc-stacks/*nii* -target average_volume.nii.gz -${mirtk_path}/mirtk transform-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -target average_volume.nii.gz -interp NN -${mirtk_path}/mirtk erode-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz + echo " ... " -echo -echo "-----------------------------------------------------------------------------" -echo "RUNNING RECONSTRUCTION ..." -echo "-----------------------------------------------------------------------------" -echo + mkdir proc-stacks-${recon_roi} + + ${mirtk_path}/mirtk stacks-and-masks-selection ${number_of_stacks} $(echo $stack_names) $(echo $mask_names) proc-stacks-${recon_roi} 15 1 + + + test_file=selected_template.nii.gz + if [ ! -f ${test_file} ];then + echo + echo "-----------------------------------------------------------------------------" + echo "COMPUTING GLOBAL AVERAGE - THE AUTO-SELECTION FAILED ..." + echo "-----------------------------------------------------------------------------" + echo + + ${mirtk_path}/mirtk average-images selected_template.nii.gz recon-stacks-${recon_roi_global}/*.nii* + ${mirtk_path}/mirtk resample-image selected_template.nii.gz selected_template.nii.gz -size 1 1 1 + ${mirtk_path}/mirtk average-images selected_template.nii.gz recon-stacks-${recon_roi_global}/*.nii* -target selected_template.nii.gz + ${mirtk_path}/mirtk average-images average_mask_cnn.nii.gz recon-masks-${recon_roi}/*.nii* -target selected_template.nii.gz + ${mirtk_path}/mirtk convert-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -short + cp recon-stacks-${recon_roi_global}/*.nii* proc-stacks-${recon_roi}/ + + ${mirtk_path}/mirtk mask-image selected_template.nii.gz average_mask_cnn.nii.gz masked-selected_template.nii.gz + + out_mask_names=$(ls recon-masks-${recon_roi}/*.nii*) + read -rd '' -a all_masks <<<"$out_mask_names" + + org_stack_names=$(ls recon-stacks-${recon_roi_global}/*.nii*) + read -rd '' -a all_org_stacks <<<"$org_stack_names" + + ${mirtk_path}/mirtk init-dof init.dof + + for ((i=0;i<${#all_org_stacks[@]};i++)); + do + echo " - " ${i} " ... " + + ${mirtk_path}/mirtk mask-image ${all_org_stacks[$i]} ${all_masks[$i]} tmp-stack.nii.gz + ${mirtk_path}/mirtk register masked-selected_template.nii.gz tmp-stack.nii.gz -model Rigid -dofin init.dof -dofout d.dof -v 0 + ${mirtk_path}/mirtk edit-image ${all_org_stacks[$i]} ${all_org_stacks[$i]} -dofin_i d.dof + ${mirtk_path}/mirtk edit-image ${all_masks[$i]} ${all_masks[$i]} -dofin_i d.dof + done + + ${mirtk_path}/mirtk average-images selected_template.nii.gz recon-stacks-${recon_roi_global}/*.nii* -target selected_template.nii.gz + ${mirtk_path}/mirtk average-images average_mask_cnn.nii.gz recon-masks-${recon_roi}/*.nii* -target selected_template.nii.gz + ${mirtk_path}/mirtk nan selected_template.nii.gz 1000000 + ${mirtk_path}/mirtk convert-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -short + + else + + ${mirtk_path}/mirtk average-images selected_template.nii.gz proc-stacks-${recon_roi}/*nii* + ${mirtk_path}/mirtk resample-image selected_template.nii.gz ref.nii.gz -size 1 1 1 + + ${mirtk_path}/mirtk edit-image ref.nii.gz ref.nii.gz -dx 1.5 -dy 1.5 -dz 1.5 + ${mirtk_path}/mirtk resample-image ref.nii.gz ref.nii.gz -size 1 1 1 -# SVR reconstruction -nStacks=$(ls proc-stacks/*.nii* | wc -l) -${mirtk_path}/mirtk reconstruct ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz ${nStacks} proc-stacks/*.nii* -mask average_mask_cnn.nii.gz -template average_volume.nii.gz -default_thickness ${default_thickness} -svr_only -iterations 3 -structural -resolution ${output_resolution} + ${mirtk_path}/mirtk average-images selected_template.nii.gz proc-stacks-${recon_roi}/*nii* -target ref.nii.gz + ${mirtk_path}/mirtk transform-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -target ref.nii.gz -labels + + fi + + current_template_path=${template_path}/brain-stack-reo-template + if [ $motion_correction_mode -eq 1 ]; then + ${mirtk_path}/mirtk resample-image ${template_path}/brain-ref-atlas-2022/ref-space-brain.nii.gz ref.nii.gz -size 1 1 1 + ${mirtk_path}/mirtk transform-image selected_template.nii.gz transf-selected_template.nii.gz -target ref.nii.gz -interp Linear + ${mirtk_path}/mirtk crop-image transf-selected_template.nii.gz transf-selected_template.nii.gz transf-selected_template.nii.gz + else + cp selected_template.nii.gz transf-selected_template.nii.gz + fi + + ${mirtk_path}/mirtk dilate-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -iterations 2 + ${mirtk_path}/mirtk erode-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -iterations 2 -test_file=${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz -if [[ ! -f ${test_file} ]];then echo echo "-----------------------------------------------------------------------------" - echo "ERROR : SVR RECONSTRUCTION FAILED ..." + echo "SVR RECONSTRUCTION ..." echo "-----------------------------------------------------------------------------" echo - echo "ERROR: SVR RECONSTRUCTION FAILED. " > ${default_recon_dir}/error.txt - exit -fi - -########################################################################################################################## -###### CNN-BASED REORIENTATION -########################################################################################################################## -echo -echo "-----------------------------------------------------------------------------" -echo "RUNNING LANDMARK-BASED REORIENTATION ..." -echo "-----------------------------------------------------------------------------" -echo - -cd ${main_dir} - -# 1 - front WM, 2 - back WM, 3 - bet, 4 - cerebellum -reo_roi_ids=(1 2 3 4); lab_start=(1 2 1 4); lab_stop=(1 2 4 4); lab_cc=(2 2 1 1); + mkdir out-recon-files-${recon_roi} + cd out-recon-files-${recon_roi} + number_of_stacks=$(ls ../proc-stacks-${recon_roi}/*.nii* | wc -l) + + + ${mirtk_path}/mirtk reconstruct tmp-output.nii.gz ${number_of_stacks} ../proc-stacks-${recon_roi}/*.nii* -mask ../average_mask_cnn.nii.gz -template ../transf-selected_template.nii.gz -default_thickness ${default_thickness} -svr_only -iterations 1 -resolution 1.6 -with_background + -mkdir dofs-to-atl -mkdir in-recon-file -mkdir final-reo-mask-files + if [ $motion_correction_mode -eq 1 ]; then + + ${mirtk_path}/mirtk reconstruct ../SVR-output-${recon_roi}.nii.gz ${number_of_stacks} ../proc-stacks-${recon_roi}/*.nii* -mask ../average_mask_cnn.nii.gz -template tmp-output.nii.gz -default_thickness ${default_thickness} -iterations 3 -resolution ${recon_resolution} -structural -svr_only -with_background + + else + + ${mirtk_path}/mirtk reconstruct ../SVR-output-${recon_roi}.nii.gz ${number_of_stacks} ../proc-stacks-${recon_roi}/*.nii* -mask ../average_mask_cnn.nii.gz -template tmp-output.nii.gz -default_thickness ${default_thickness} -iterations 3 -resolution ${recon_resolution} -svr_only -with_background + + fi + + +# -delta 110 -lambda 0.018 -lastIter 0.008 ; + + test_file=../SVR-output-${recon_roi}.nii.gz + if [ ! -f ${test_file} ];then -cp ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz in-recon-file + chmod 1777 -R ${output_main_folder}/ -# 3D UNet 4 landmark label localisation for the reconstructed image -res=128 -all_num_lab_reo=4 -cnn_out_mode=1234 -${mirtk_path}/mirtk prepare-for-cnn recon-res-files recon-stack-files run.csv run-info-summary.csv ${res} 1 in-recon-file/*nii* ${all_num_lab_reo} 0 -mkdir ${main_dir}/reo-${cnn_out_mode}-cnn-out-files -PYTHONIOENCODING=utf-8 python ${segm_path}/run_cnn_loc_gpu_cpu.py ${segm_path}/ ${check_path_roi_reo_4lab} ${main_dir}/ ${main_dir}/reo-${cnn_out_mode}-cnn-out-files/ run.csv ${res} ${all_num_lab_reo} ${cnn_mode} - -test_file=${main_dir}/reo-${cnn_out_mode}-cnn-out-files/recon-res-files_in-res-stack-1000_img-0.nii.gz -if [[ ! -f ${test_file} ]];then + echo + echo "-----------------------------------------------------------------------------" + echo "ERROR: SVR RECONSTRUCTION DID NOT WORK !!!!" + echo "-----------------------------------------------------------------------------" + echo + exit + fi + + + ${mirtk_path}/mirtk dilate-image ../average_mask_cnn.nii.gz dl.nii.gz -iterations 6 + ${mirtk_path}/mirtk mask-image ../SVR-output-${recon_roi}.nii.gz dl.nii.gz ../SVR-output-${recon_roi}.nii.gz + + ${mirtk_path}/mirtk dilate-image ../average_mask_cnn.nii.gz dl.nii.gz -iterations 2 + ${mirtk_path}/mirtk mask-image ../SVR-output-${recon_roi}.nii.gz dl.nii.gz ../masked-SVR-output-${recon_roi}.nii.gz + + echo echo "-----------------------------------------------------------------------------" - echo "ERROR : 3D UNET REORIENTATION OF THE SVR-RECONSTRUCTED IMAGE FAILED ..." + echo "REORIENTATION TO THE STANDARD SPACE ..." echo "-----------------------------------------------------------------------------" echo - echo "ERROR : 3D UNET REORIENTATION OF THE SVR-RECONSTRUCTED IMAGE FAILED. " > ${default_recon_dir}/error.txt - exit -fi + + cd ${main_dir} + -# extration of landmark labels -jj=1000 -for ((w=0;w<${#reo_roi_ids[@]};w++)); -do - current_lab=${reo_roi_ids[$w]} - s1=${lab_start[$w]} - s2=${lab_stop[$w]} - currenct_cc=${lab_cc[$w]} - ${mirtk_path}/mirtk extract-label ${main_dir}/reo-${cnn_out_mode}-cnn-out-files/*-${jj}_seg_pr*.nii* tmp-org-m.nii.gz ${s1} ${s2} - ${mirtk_path}/mirtk extract-connected-components tmp-org-m.nii.gz tmp-org-m.nii.gz -n ${currenct_cc} - cp tmp-org-m.nii.gz final-reo-mask-files/mask-${jj}-${current_lab}.nii.gz -done + number_of_stacks=1 + roi=brain + res=128 + monai_lab_num=5 + + echo " ... " + + # ${mirtk_path}/mirtk mask-image SVR-output-${recon_roi}.nii.gz average_mask_cnn.nii.gz masked-SVR-output-${recon_roi}.nii.gz + + ${mirtk_path}/mirtk prepare-for-monai res-svr-files/ svr-files/ reo-svr-info.json reo-svr-info.csv ${res} ${number_of_stacks} masked-SVR-output-${recon_roi}.nii.gz > tmp.log + + current_monai_check_path=${model_path}/monai-checkpoints-unet-svr-brain-reo-5-lab + + mkdir monai-segmentation-results-svr-reo + python ${segm_path}/src/run_monai_unet_segmentation-2022.py ${main_dir}/ ${current_monai_check_path}/ reo-svr-info.json ${main_dir}/monai-segmentation-results-svr-reo ${res} ${monai_lab_num} + + + number_of_stacks=$(find monai-segmentation-results-svr-reo/ -name "*.nii*" | wc -l) + if [ ${number_of_stacks} -eq 0 ];then + echo + echo "-----------------------------------------------------------------------------" + echo "ERROR: REO CNN LOCALISATION DID NOT WORK !!!!" + echo "-----------------------------------------------------------------------------" + echo + exit + fi + + mkdir out-svr-reo-masks + for ((q=1;q<6;q++)); + do + ${mirtk_path}/mirtk extract-label monai-segmentation-results-svr-reo/cnn* out-svr-reo-masks/mask-${q}.nii.gz ${q} ${q} + ${mirtk_path}/mirtk dilate-image out-svr-reo-masks/mask-${q}.nii.gz out-svr-reo-masks/mask-${q}.nii.gz -iterations 2 + ${mirtk_path}/mirtk erode-image out-svr-reo-masks/mask-${q}.nii.gz out-svr-reo-masks/mask-${q}.nii.gz -iterations 2 + ${mirtk_path}/mirtk extract-connected-components out-svr-reo-masks/mask-${q}.nii.gz out-svr-reo-masks/mask-${q}.nii.gz -n 1 + + done -${mirtk_path}/mirtk init-dof init.dof -z1=1; z2=2; z3=3; z4=4; + z1=1; z2=2; z3=3; z4=4; n_roi=4; + ${mirtk_path}/mirtk init-dof init.dof + ${mirtk_path}/mirtk register-landmarks ${template_path}/brain-ref-atlas-2022/mask-${z1}.nii.gz ${all_org_stacks[$j]} init.dof dof-to-atl-${recon_roi}.dof ${n_roi} ${n_roi} ${template_path}/brain-ref-atlas-2022/mask-${z1}.nii.gz ${template_path}/brain-ref-atlas-2022/mask-${z2}.nii.gz ${template_path}/brain-ref-atlas-2022/mask-${z3}.nii.gz ${template_path}/brain-ref-atlas-2022/mask-${z4}.nii.gz out-svr-reo-masks/mask-${z1}.nii.gz out-svr-reo-masks/mask-${z2}.nii.gz out-svr-reo-masks/mask-${z3}.nii.gz out-svr-reo-masks/mask-${z4}.nii.gz > tmp.log -# landmark-based registration to the atlas space -${mirtk_path}/mirtk register-landmarks ${template_path}/brain-ref-atlas-2021/new-brain-templ.nii.gz final-reo-mask-files/mask-${jj}-0.nii.gz init.dof dofs-to-atl/dof-to-atl-${jj}.dof 4 4 ${template_path}/brain-ref-atlas-2021/mask-${z1}.nii.gz ${template_path}/brain-ref-atlas-2021/mask-${z2}.nii.gz ${template_path}/brain-ref-atlas-2021/mask-${z3}.nii.gz ${template_path}/brain-ref-atlas-2021/mask-${z4}.nii.gz final-reo-mask-files/mask-${jj}-${z1}.nii.gz final-reo-mask-files/mask-${jj}-${z2}.nii.gz final-reo-mask-files/mask-${jj}-${z3}.nii.gz final-reo-mask-files/mask-${jj}-${z4}.nii.gz > tmp.txt + ${mirtk_path}/mirtk info dof-to-atl-${recon_roi}.dof + + ${mirtk_path}/mirtk resample-image ${template_path}/brain-ref-atlas-2022/ref-space-brain.nii.gz ref.nii.gz -size ${recon_resolution} ${recon_resolution} ${recon_resolution} -# transformation to the atlas space -${mirtk_path}/mirtk transform-image ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz ${main_dir}/reo-${roi_recon[${selected_recon_roi}]}-output.nii.gz -dofin dofs-to-atl/dof-to-atl-${jj}.dof -target ${template_path}/brain-ref-atlas-2021/ref-space-brain.nii.gz -interp BSpline + ${mirtk_path}/mirtk transform-image SVR-output-${recon_roi}.nii.gz reo-SVR-output-${recon_roi}.nii.gz -target ref.nii.gz -dofin dof-to-atl-${recon_roi}.dof -interp BSpline + ${mirtk_path}/mirtk threshold-image reo-SVR-output-${recon_roi}.nii.gz tmp-m.nii.gz 0.01 + ${mirtk_path}/mirtk crop-image reo-SVR-output-${recon_roi}.nii.gz tmp-m.nii.gz reo-SVR-output-${recon_roi}.nii.gz + ${mirtk_path}/mirtk nan reo-SVR-output-${recon_roi}.nii.gz 100000 -# cropping any remaining black background -${mirtk_path}/mirtk crop-image ${main_dir}/reo-${roi_recon[${selected_recon_roi}]}-output.nii.gz ${main_dir}/reo-${roi_recon[${selected_recon_roi}]}-output.nii.gz ${main_dir}/reo-${roi_recon[${selected_recon_roi}]}-output.nii.gz -echo -echo "-----------------------------------------------------------------------------" -echo "ADJUSTING & RENAMING FINAL FILES" -echo "-----------------------------------------------------------------------------" -echo + test_file=reo-SVR-output-${recon_roi}.nii.gz + if [ ! -f ${test_file} ];then -test_file=${main_dir}/reo-${roi_recon[${selected_recon_roi}]}-output.nii.gz -if [[ -f ${test_file} ]];then + chmod 1777 -R ${output_main_folder}/ - # TAR - rename files - mv ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz ${main_dir}/${roi_recon[${selected_recon_roi}]}-output-withoutReorientation.nii.gz - cp ${main_dir}/reo-${roi_recon[${selected_recon_roi}]}-output.nii.gz ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz - - # TAR - pad in-plane so square FOV - ${mirtk_path}/mirtk resample-to-iso-grid ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz 2 + echo + echo "-----------------------------------------------------------------------------" + echo "ERROR: REORIENTATION OF RECONSTRUCTED IMAGE DID NOT WORK !!!!" + echo "-----------------------------------------------------------------------------" + echo + exit + fi + + number_of_final_recons=$(ls *SVR-output*.nii* | wc -l) + if [ ${number_of_final_recons} -ne 0 ];then - # TAR - move final files to /recon dir - cp ${main_dir}/${roi_recon[${selected_recon_roi}]}-output-withoutReorientation.nii.gz ${default_recon_dir}/${roi_recon[${selected_recon_roi}]}-output-withoutReorientation.nii.gz - cp ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz ${default_recon_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz + cp -r *SVR-output*nii* ${output_main_folder}/ + cp -r average_mask_cnn.nii.gz ${output_main_folder}/ - cp ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz ${output_path}/${roi_recon[${selected_recon_roi}]}-output.nii.gz + chmod 1777 -R ${output_main_folder}/ - echo "Reconstruction was successful: " ${output_path}/${roi_recon[${selected_recon_roi}]}-output.nii.gz + echo "-----------------------------------------------------------------------------" + echo "Reconstructed SVR results are in the output folder : " ${output_main_folder} + echo "-----------------------------------------------------------------------------" + + else -else - echo "Reconstruction failed ... " - echo "ERROR : RECONSTRUCTION PIPELINE FAILED (REORIENTATION OR SAVING STEP). " > ${default_recon_dir}/error.txt -fi + chmod 1777 -R ${output_main_folder}/ + + echo + echo "-----------------------------------------------------------------------------" + echo "ERROR: COULD NOT COPY THE FILES TO THE OUTPUT FOLDER : " ${output_main_folder} + echo "PLEASE CHECK THE WRITE PERMISSIONS / LOCATION !!!" + echo + echo "note: you can still find the recon files in : " ${main_dir} + echo "-----------------------------------------------------------------------------" + echo + exit + fi +fi echo diff --git a/app/operators/docker-recon-brain-auto.bash b/app/operators/docker-recon-brain-auto.bash index 51d012c..3a40617 100644 --- a/app/operators/docker-recon-brain-auto.bash +++ b/app/operators/docker-recon-brain-auto.bash @@ -1,493 +1,865 @@ -#!/bin/bash - - -########################################################################################################################## -###### SCRIPT FOR AUTOMATED SVR RECONSTRUCTION (incl. optional GPU-acceleration): docker-recon-brain-auto.bash -###### King's College London 2021 -###### https://github.com/SVRTK/svrtk-docker-gpu -########################################################################################################################## +#!/usr/bin/env bash -l + +# +# SVRTK : SVR reconstruction based on MIRTK +# +# Copyright 2018- King's College London +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# echo echo "-----------------------------------------------------------------------------" -echo "RUNNING AUTOMATED SVR RECONSTRUCTION" echo "-----------------------------------------------------------------------------" echo -########################################################################################################################## -###### INPUTS -########################################################################################################################## +#echo "Setting environment ... " +#echo -#folder with input files -default_recon_dir=$1 -#output path -output_path=$2 +source ~/.bashrc -#cnn mode: -1 cpu, 1 gpu -cnn_mode=$3 +#source /root/.bashrc +# +#eval "$(conda shell.bash hook)" +# +#conda init bash +# +#conda activate FetalMRI_MONAI -#severity of motion mode: -1 minor, 1 severe -motion_correction_mode=$4 +# +#echo "NOTE: UPDATE SOFTWARE PAHTS AS REQUIRED BEFORE RUNNING " +#echo "NOTE: DOWNLOAD MONAI WEIGHTS INTO auto-proc-svrtk/trained_models FOLDER FROM https://gin.g-node.org/SVRTK/fetal_mri_network_weights" +# +#exit -source ~/.bashrc -cd ${default_recon_dir} +software_path=/home -########################################################################################################################## -###### DEFAULT PARAMETERS AND PATHS -########################################################################################################################## +default_run_dir=/home/tmp_proc +segm_path=${software_path}/auto-proc-svrtk -# software and network weight paths -mirtk_path=/home/MIRTK/build/bin -segm_path=/home/Segmentation_FetalMRI -template_path=/home/Segmentation_FetalMRI/reference-templates -check_path_brain=/home/Segmentation_FetalMRI/trained-models/checkpoints-brain-loc-labels -check_path_brain_cropped=/home/Segmentation_FetalMRI/trained-models/checkpoints-brain-loc-labels-cropped -check_path_roi_reo_4lab=/home/Segmentation_FetalMRI/trained-models/checkpoints-brain-reorientation -check_path_roi_reo_4lab_stacks=/home/Segmentation_FetalMRI/trained-models/checkpoints-brain-reorientation-stacks +dcm2niix_path=${software_path}/dcm2niix/build/bin -# CNN parameters -res=128 -all_num_lab=1 -all_num_lab_reo=4 -current_lab=1 +mirtk_path=${software_path}/MIRTK/build/bin -# NOTE: 1 package is acceptable for low motion datasets / -1 for severe cases for automated detection -if [ $motion_correction_mode -gt 0 ]; then - num_packages=-1 -else - num_packages=1 +template_path=${segm_path}/templates + +model_path=${segm_path}/trained_models + + + + +test_dir=${software_path}/MIRTK +if [ ! -d $test_dir ];then + echo "ERROR: COULD NOT FIND MIRTK INSTALLED IN : " ${software_path} + echo "PLEASE INSTALL OR UPDATE THE PATH software_path VARIABLE IN THE SCRIPT" + exit +fi + +test_dir=${segm_path}/trained_models +if [ ! -d $test_dir ];then + echo "ERROR: COULD NOT FIND SEGMENTATION MODULE INSTALLED IN : " ${software_path} + echo "PLEASE INSTALL OR UPDATE THE PATH software_path VARIABLE IN THE SCRIPT" + exit fi -# TODO: implement check in case slice thickness inconsistent across stacks -if [[ -f "${default_recon_dir}/log_slice_thickness.txt" ]]; then - default_thickness=`cat "${default_recon_dir}/log_slice_thickness.txt" | awk -F' ' '{print $1}'` + + + +test_dir=${default_run_dir} +if [ ! -d $test_dir ];then + mkdir ${default_run_dir} else - echo "WARNING: Setting default_thickness = 2.5" - default_thickness=2.5 + rm -r ${default_run_dir}/* fi -echo -# NOTE: change output resolution to 0.75 - 0.8 ? -output_resolution=0.85 +test_dir=${default_run_dir} +if [ ! -d $test_dir ];then + echo "ERROR: COULD NOT CREATE THE PROCESSING FOLDER : " ${default_run_dir} + echo "PLEASE CHECK THE PERMISSIONS OR UPDATE THE PATH default_run_dir VARIABLE IN THE SCRIPT" + exit +fi + + -# Reconstruction ROI names -roi_recon=("SVR") -roi_names=("brain") -roi_ids=(1) -selected_recon_roi=0 -selected_recon_roi=0 +echo +echo "-----------------------------------------------------------------------------" +echo "-----------------------------------------------------------------------------" +echo +echo "SVRTK for fetal MRI (KCL): auto brain SVR reconstruction for SSTSE / HASTE T2w fetal MRI" +echo "Source code: https://github.com/SVRTK/auto-proc-svrtk" +echo +echo "-----------------------------------------------------------------------------" +echo "-----------------------------------------------------------------------------" +echo -########################################################################################################################## -###### COPY INPUT .NII FILES TO THE PROCESSING FOLDER -########################################################################################################################## +if [ $# -ne 2 ] ; then -# navigate to the processing folder and remove any files left from previous processing sessions -test_dir=${default_recon_dir}/svr_processing_files -if [[ -d ${test_dir} ]];then -rm -r ${default_recon_dir}/svr_processing_files/* + if [ $# -ne 6 ] ; then + echo "Usage: bash /home/auto-proc-svrtk/auto-brain-reconstruction.sh" + echo " [FULL path to the folder with raw T2w stacks in .nii or .dcm, e.g., /home/data/test]" + echo " [FULL path to the folder for recon results, e.g., /home/data/out-test]" + echo " (optional) [motion correction mode (0 or 1): 0 - minor, 1 - >180 degree rotations] - default: 1" + echo " (optional) [slice thickness] - default: 3.0" + echo " (optional) [output recon resolution] - default: 0.8" + echo " (optional) [number of packages] - default: 1" + echo + exit + else + input_main_folder=$1 + output_main_folder=$2 + motion_correction_mode=$3 + default_thickness=$4 + recon_resolution=$5 + num_packages=$6 + fi + else -mkdir ${default_recon_dir}/svr_processing_files + input_main_folder=$1 + output_main_folder=$2 + motion_correction_mode=1 + default_thickness=3.0 + recon_resolution=0.8 + num_packages=1 +fi + + +echo " - input folder : " ${input_main_folder} +echo " - output folder : " ${output_main_folder} +echo " - motion correction mode : " ${motion_correction_mode} +echo " - slice thickness : " ${default_thickness} +echo " - output resolution : " ${recon_resolution} + + +recon_roi=brain + + +test_dir=${input_main_folder} +if [ ! -d $test_dir ];then + echo + echo "ERROR: NO FOLDER WITH THE INPUT FILES FOUND !!!!" + exit fi -test_file=${default_recon_dir}/error.txt -if [[ -f ${test_file} ]];then -rm ${default_recon_dir}/error.txt + +test_dir=${output_main_folder} +if [ ! -d $test_dir ];then + mkdir ${output_main_folder} + chmod 1777 -R ${output_main_folder}/ fi -test_file=${default_recon_dir}/SVR-output.nii.gz -if [[ -f ${test_file} ]];then -rm ${default_recon_dir}/SVR-output* + + +cd ${default_run_dir} +main_dir=$(pwd) + + + +number_of_stacks=$(find ${input_main_folder}/ -name "*.dcm" | wc -l) +if [ $number_of_stacks -gt 0 ];then + echo + echo "-----------------------------------------------------------------------------" + echo "FOUND .dcm FILES - CONVERTING TO .nii.gz !!!!" + echo "-----------------------------------------------------------------------------" + echo + cd ${input_main_folder}/ + ${dcm2niix_path}/dcm2niix -z y . + cd ${main_dir}/ fi -# check the total number of available .nii files -num_stacks=$(find . -name "*.nii*" | wc -l) -if [ $num_stacks -gt 1 ]; then - echo " - found " ${num_stacks} ".nii files" -else + + +number_of_stacks=$(find ${input_main_folder}/ -name "*.nii*" | wc -l) +if [ $number_of_stacks -eq 0 ];then + + chmod 1777 -R ${output_main_folder}/ + echo echo "-----------------------------------------------------------------------------" - echo "ERROR : NO .NII FILES FOUND - EXIT ..." + echo "ERROR: NO INPUT .nii / .nii.gz FILES FOUND !!!!" echo "-----------------------------------------------------------------------------" echo - echo "ERROR: NO INPUT FILLES. " > ${default_recon_dir}/error.txt exit fi -main_dir=${default_recon_dir}/svr_processing_files -mkdir ${default_recon_dir}/svr_processing_files/cnn-recon-org-files -#find ${default_recon_dir}/ -name "*.nii*" -exec cp {} ${main_dir}/cnn-recon-org-files \; -cp ${default_recon_dir}/*.nii* ${main_dir}/cnn-recon-org-files/ -cd ${default_recon_dir}/svr_processing_files +mkdir ${default_run_dir}/org-files +find ${input_main_folder}/ -name "*.nii*" -exec cp {} ${default_run_dir}/org-files \; -mkdir cnn-recon-org-files-packages -cp cnn-recon-org-files/* cnn-recon-org-files-packages +number_of_stacks=$(find ${default_run_dir}/org-files -name "*SVR-output*.nii*" | wc -l) +if [ $number_of_stacks -gt 0 ];then + echo + echo "-----------------------------------------------------------------------------" + echo "WARNING: FOUND ALREADY EXISTING *SVR-output* FILES IN THE DATA FOLDER !!!!" + echo "-----------------------------------------------------------------------------" + echo "note: they won't be used in reconstruction" + echo + rm ${default_run_dir}/org-files/"*SVR-output*.nii*" +fi + +number_of_stacks=$(find ${default_run_dir}/org-files -name "*mask*.nii*" | wc -l) +if [ $number_of_stacks -gt 0 ];then -# split into packages only if the default parameter number is not 1 -if [ $num_packages -ne 1 ]; then echo echo "-----------------------------------------------------------------------------" - echo "SPLITTING INTO PACKAGES ..." + echo "WARNING: FOUND *mask* FILES IN THE DATA FOLDER !!!!" echo "-----------------------------------------------------------------------------" + echo "note: they won't be used in reconstruction" echo + rm ${default_run_dir}/org-files/"*mask*.nii*" +fi - cd ${main_dir} - cd cnn-recon-org-files-packages +echo +echo "-----------------------------------------------------------------------------" +echo "-----------------------------------------------------------------------------" +echo +echo "PREPROCESSING ..." +echo - stack_names=$(ls *.nii*) - IFS=$'\n' read -rd '' -a all_stacks <<<"$stack_names" +cd ${default_run_dir} + + +mkdir org-files-preproc +cp org-files/* org-files-preproc + +cd org-files-preproc + +stack_names=$(ls *.nii*) +read -rd '' -a all_stacks <<<"$stack_names" + +echo +echo "-----------------------------------------------------------------------------" +echo "REMOVING NAN & NEGATIVE/EXTREME VALUES & SPLITTING INTO DYNAMICS ..." +echo "-----------------------------------------------------------------------------" +echo + +for ((i=0;i<${#all_stacks[@]};i++)); +do + echo " - " ${i} " : " ${all_stacks[$i]} + + st=${all_stacks[$i]} + st=$(echo ${st//.nii.gz\//\.nii.gz}) + st=$(echo ${st//.nii\//\.nii}) + + ${mirtk_path}/mirtk nan ${st} 100000 + ${mirtk_path}/mirtk extract-image-region ${st} ${st} -split t + rm ${st} +done + + +stack_names=$(ls *.nii*) +read -rd '' -a all_stacks <<<"$stack_names" + + +if [ $num_packages -ne 1 ]; then + echo + echo "-----------------------------------------------------------------------------" + echo "SPLITTING INTO PACKAGES ..." + echo "-----------------------------------------------------------------------------" + echo - echo "folder : " ${in_file_dir} for ((i=0;i<${#all_stacks[@]};i++)); do - ${mirtk_path}/mirtk extract-packages ${all_stacks[$i]} ${num_packages} - rm ${all_stacks[$i]} + echo " - " ${i} " : " ${all_stacks[$i]} + + st=${all_stacks[$i]} + st=$(echo ${st//.nii.gz\//\.nii.gz}) + st=$(echo ${st//.nii\//\.nii}) + + ${mirtk_path}/mirtk extract-packages ${st} ${num_packages} + + rm ${st} rm package-template.nii.gz - echo " - " ${all_stacks[$i]} + done fi -#final input files -cd ${main_dir} -stack_names=$(ls cnn-recon-org-files-packages/*.nii*) -IFS=$'\n' read -rd '' -a all_stacks <<<"$stack_names" -########################################################################################################################## -###### 3D UNET-BASED GLOBAL BRAIN LOCALISATION + LOCAL MASK REFINEMENT + REORIENTATION (FOR SEVERE MOTION CASES) -########################################################################################################################## + mkdir ${default_run_dir}/tmp-res-global + + stack_names=$(ls *.nii*) + read -rd '' -a all_stacks <<<"$stack_names" + + echo + echo "-----------------------------------------------------------------------------" + echo "PREPROCESSING FOR LOCALISATION ..." + echo "-----------------------------------------------------------------------------" + echo + + for ((i=0;i<${#all_stacks[@]};i++)); + do + echo " - " ${i} " : " ${all_stacks[$i]} + + st=${all_stacks[$i]} + st=$(echo ${st//.nii.gz\//\.nii.gz}) + st=$(echo ${st//.nii\//\.nii}) + + jj=$((${i}+1000)) + + ${mirtk_path}/mirtk resample-image ${st} ${main_dir}/tmp-res-global/stack-${jj}.nii.gz -size 1.5 1.5 1.5 + + done + echo echo "-----------------------------------------------------------------------------" -echo "3D UNET SEGMENTATION ..." echo "-----------------------------------------------------------------------------" echo +echo "GLOBAL LOCALISATION SEGMENTATION..." +echo cd ${main_dir} -mkdir cnn-out-files echo -echo "RUNNING GLOBAL LOCALISATION ..." +echo "-----------------------------------------------------------------------------" +echo "RUNNING GLOBAL BODY+BRAIN LOCALISATION ..." +echo "-----------------------------------------------------------------------------" echo -# 3D UNet global localisaton of the brain in the original stacks/packages -number_of_stacks=$(ls cnn-recon-org-files-packages/*.nii* | wc -l) -stack_names=$(ls cnn-recon-org-files-packages/*.nii*) -all_num_lab=1 -${mirtk_path}/mirtk prepare-for-cnn cnn-recon-res-files stack-files run.csv run-info-summary.csv ${res} ${number_of_stacks} $(echo $stack_names) ${all_num_lab} 0 -main_dir=$(pwd) -PYTHONIOENCODING=utf-8 python ${segm_path}/run_cnn_loc_gpu_cpu.py ${segm_path}/ ${check_path_brain}/ ${main_dir}/ ${main_dir}/cnn-out-files/ run.csv ${res} ${all_num_lab} ${cnn_mode} -out_mask_names=$(ls cnn-out-files/*seg_pr*.nii*) -out_stack_names=$(ls stack-files/*.nii*) -IFS=$'\n' read -rd '' -a all_masks <<<"$out_mask_names" -IFS=$'\n' read -rd '' -a all_stacks <<<"$out_stack_names" - -test_file=cnn-out-files/cnn-recon-res-files_in-res-stack-1000_img-0.nii.gz -if [[ ! -f ${test_file} ]];then +number_of_stacks=$(ls org-files-preproc/*.nii* | wc -l) +stack_names=$(ls org-files-preproc/*.nii*) + +echo " ... " + +res=128 +monai_lab_num=2 +number_of_stacks=$(find tmp-res-global/ -name "*.nii*" | wc -l) +${mirtk_path}/mirtk prepare-for-monai res-global-files/ global-files/ stack-info.json stack-info.csv ${res} ${number_of_stacks} tmp-res-global/*nii* > tmp.log + +current_monai_check_path=${model_path}/monai-checkpoints-unet-global-loc-2-lab + +mkdir monai-segmentation-results-global +python ${segm_path}/src/run_monai_unet_segmentation-2022.py ${main_dir}/ ${current_monai_check_path}/ stack-info.json ${main_dir}/monai-segmentation-results-global ${res} ${monai_lab_num} + + +number_of_stacks=$(find monai-segmentation-results-global/ -name "*.nii*" | wc -l) +if [ ${number_of_stacks} -eq 0 ];then + + chmod 1777 -R ${output_main_folder}/ + echo echo "-----------------------------------------------------------------------------" - echo "ERROR : GLOBAL 3D UNET LOCALISATION FAILED ..." + echo "ERROR: GLOBAL CNN LOCALISATION DID NOT WORK !!!!" echo "-----------------------------------------------------------------------------" echo - echo "ERROR : GLOBAL 3D UNET LOCALISATION FAILED. " > ${default_recon_dir}/error.txt exit fi echo -echo "RUNNING CROPPED REFINEMENT ..." +echo "-----------------------------------------------------------------------------" +echo "EXTRACTING LABELS ..." +echo "-----------------------------------------------------------------------------" echo -mkdir cropped-files -mkdir cropped-cnn-out-files -mkdir tmp-masks-global +out_mask_names=$(ls monai-segmentation-results-global/cnn-*.nii*) +read -rd '' -a all_masks <<<"$out_mask_names" -# cropping all stacks based on the global brain ROI masks -for ((i=0;i<${#all_stacks[@]};i++)); +org_stack_names=$(ls org-files-preproc/*.nii*) +read -rd '' -a all_org_stacks <<<"$org_stack_names" + + +mkdir out-global-masks +mkdir cropped-stacks-brain +#mkdir cropped-stacks-body +mkdir recon-stacks-brain +#mkdir recon-stacks-body +mkdir masked-cropped-stacks-brain + + +for ((i=0;i<${#all_org_stacks[@]};i++)); do + echo " - " ${i} " : " ${all_org_stacks[$i]} ${all_masks[$i]} + jj=$((${i}+1000)) - ${mirtk_path}/mirtk extract-label cnn-out-files/*-${jj}_seg_pr*.nii* tmp-org-m.nii.gz 1 1 - ${mirtk_path}/mirtk extract-connected-components tmp-org-m.nii.gz tmp-org-m.nii.gz -max-size 1000000 - ${mirtk_path}/mirtk dilate-image tmp-org-m.nii.gz dl-m.nii.gz -iterations 6 - ${mirtk_path}/mirtk crop-image stack-files/stack-${jj}.nii.gz dl-m.nii.gz cropped-files/cropped-stack-${jj}.nii.gz + + ${mirtk_path}/mirtk extract-label ${all_masks[$i]} out-global-masks/mask-body-${jj}.nii.gz 1 1 + ${mirtk_path}/mirtk extract-label ${all_masks[$i]} out-global-masks/mask-brain-${jj}.nii.gz 2 2 + + ${mirtk_path}/mirtk erode-image out-global-masks/mask-brain-${jj}.nii.gz out-global-masks/mask-brain-${jj}.nii.gz -iterations 1 + +# ${mirtk_path}/mirtk extract-connected-components out-global-masks/mask-body-${jj}.nii.gz out-global-masks/mask-body-${jj}.nii.gz -n 1 + ${mirtk_path}/mirtk extract-connected-components out-global-masks/mask-brain-${jj}.nii.gz out-global-masks/mask-brain-${jj}.nii.gz -max-size 950000 -n 1 + + roi=brain +# ${mirtk_path}/mirtk erode-image out-global-masks/mask-${roi}-${jj}.nii.gz out-global-masks/mask-${roi}-${jj}.nii.gz -iterations 2 +# ${mirtk_path}/mirtk dilate-image out-global-masks/mask-brain-${jj}.nii.gz out-global-masks/mask-${roi}-${jj}.nii.gz -iterations 2 + ${mirtk_path}/mirtk dilate-image out-global-masks/mask-${roi}-${jj}.nii.gz dl-m.nii.gz -iterations 3 + ${mirtk_path}/mirtk crop-image ${all_org_stacks[$i]} dl-m.nii.gz cropped-stacks-${roi}/stack-${jj}.nii.gz + cp cropped-stacks-${roi}/stack-${jj}.nii.gz recon-stacks-${roi}/ +# ${mirtk_path}/mirtk mask-image cropped-stacks-${roi}/stack-${jj}.nii.gz dl-m.nii.gz masked-cropped-stacks-${roi}/stack-${jj}.nii.gz + cp cropped-stacks-${roi}/stack-${jj}.nii.gz masked-cropped-stacks-${roi}/stack-${jj}.nii.gz + ${mirtk_path}/mirtk resample-image masked-cropped-stacks-${roi}/stack-${jj}.nii.gz masked-cropped-stacks-${roi}/stack-${jj}.nii.gz -size 1.5 1.5 1.5 + + done -# 3D UNet segmentation of the brain in the cropped stacks -number_of_stacks=$(ls cropped-files/*.nii* | wc -l) -stack_names=$(ls cropped-files/*.nii*) -all_num_lab=1 -${mirtk_path}/mirtk prepare-for-cnn cropped-cnn-recon-res-files cropped-cnn-recon-stack-files cropped-run.csv cropped-run-info-summary.csv ${res} ${number_of_stacks} $(echo $stack_names) ${all_num_lab} 0 -PYTHONIOENCODING=utf-8 python ${segm_path}/run_cnn_loc_gpu_cpu.py ${segm_path}/ ${check_path_brain_cropped}/ ${main_dir}/ ${main_dir}/cropped-cnn-out-files/ cropped-run.csv ${res} ${all_num_lab} ${cnn_mode} -test_file=cropped-cnn-out-files/cropped-cnn-recon-res-files_in-res-stack-1000_img-0.nii.gz -if [[ ! -f ${test_file} ]];then +echo +echo "-----------------------------------------------------------------------------" +echo "-----------------------------------------------------------------------------" +echo +echo "LOCAL ROI SEGMENTATION ..." +echo + +cd ${main_dir} + +mkdir recon-masks-brain/ + + +echo +echo "-----------------------------------------------------------------------------" +echo "RUNNING BRAIN SEGMENTATION ..." +echo "-----------------------------------------------------------------------------" +echo + +number_of_stacks=$(ls masked-cropped-stacks-${roi}/*.nii* | wc -l) +stack_names=$(ls masked-cropped-stacks-${roi}/*.nii*) + +echo " ... " + +roi=brain +res=128 +monai_lab_num=1 +${mirtk_path}/mirtk prepare-for-monai res-cropped-files/ again-cropped-files/ cropped-stack-info.json cropped-stack-info.csv ${res} ${number_of_stacks} masked-cropped-stacks-${roi}/*nii* > tmp.log + +current_monai_check_path=${model_path}/monai-checkpoints-atunet-brain_bet_all_degree_raw_stacks-1-lab + +mkdir monai-segmentation-results-stack-brain +python ${segm_path}/src/run_monai_atunet_segmentation-2022.py ${main_dir}/ ${current_monai_check_path}/ cropped-stack-info.json ${main_dir}/monai-segmentation-results-stack-brain ${res} ${monai_lab_num} + +number_of_stacks=$(find monai-segmentation-results-stack-brain/ -name "*.nii*" | wc -l) +if [ ${number_of_stacks} -eq 0 ];then + + chmod 1777 -R ${output_main_folder}/ + echo echo "-----------------------------------------------------------------------------" - echo "ERROR : CROPPED 3D UNET LOCALISATION FAILED ..." + echo "ERROR: brain CNN LOCALISATION DID NOT WORK !!!!" echo "-----------------------------------------------------------------------------" + echo "note: check whether FetalMRI_MONAI was activated" + echo "conda init bash" + echo "conda activate FetalMRI_MONAI" echo - echo "ERROR : CROPPED 3D UNET LOCALISATION FAILED. " > ${default_recon_dir}/error.txt exit fi echo -echo "EXTRACTING ROI-SPECIFIC MASKS ..." +echo "-----------------------------------------------------------------------------" +echo "EXTRACTING LABELS ..." +echo "-----------------------------------------------------------------------------" echo -cd ${main_dir} -out_mask_names=$(ls cropped-cnn-out-files/*seg_pr*.nii*) -out_stack_names=$(ls stack-files/*.nii*) -IFS=$'\n' read -rd '' -a all_masks <<<"$out_mask_names" -IFS=$'\n' read -rd '' -a all_stacks <<<"$out_stack_names" - -cd ${main_dir} - -mkdir mask-files-${roi_ids[${selected_recon_roi}]} -current_lab=1 +out_mask_names=$(ls monai-segmentation-results-stack-brain/cnn-*.nii*) +read -rd '' -a all_masks <<<"$out_mask_names" + +org_stack_names=$(ls cropped-stacks-${roi}/*.nii*) +read -rd '' -a all_org_stacks <<<"$org_stack_names" -for ((i=0;i<${#all_masks[@]};i++)); +mkdir masked-cropped-files-brain + +for ((i=0;i<${#all_org_stacks[@]};i++)); do + echo " - " ${i} " : " ${all_org_stacks[$i]} ${all_masks[$i]} + jj=$((${i}+1000)) - # extraction of brain masks - ${mirtk_path}/mirtk transform-image cropped-cnn-out-files/*-${jj}_seg_pr*.nii* mask-files-${roi_ids[${selected_recon_roi}]}/mask-${jj}.nii.gz -target cropped-files/*-${jj}.nii.gz -interp NN - ${mirtk_path}/mirtk extract-label mask-files-${roi_ids[${selected_recon_roi}]}/mask-${jj}.nii.gz mask-files-${roi_ids[${selected_recon_roi}]}/mask-${jj}.nii.gz ${current_lab} ${current_lab} - ${mirtk_path}/mirtk extract-connected-components mask-files-${roi_ids[${selected_recon_roi}]}/mask-${jj}.nii.gz mask-files-${roi_ids[${selected_recon_roi}]}/mask-${jj}.nii.gz -max-size 800000 - - # centering stacks vs. brain centre for severe motion cases - #if [ $motion_correction_mode -gt 0 ]; then + + ${mirtk_path}/mirtk extract-label ${all_masks[$i]} recon-masks-brain/mask-${jj}.nii.gz 1 1 + ${mirtk_path}/mirtk erode-image recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -iterations 2 + ${mirtk_path}/mirtk extract-connected-components recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -n 1 -max-size 700000 + ${mirtk_path}/mirtk dilate-image recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -iterations 2 - ${mirtk_path}/mirtk transform-image mask-files-${roi_ids[$selected_recon_roi]}/mask-${jj}.nii.gz mask-files-${roi_ids[$selected_recon_roi]}/mask-${jj}.nii.gz -target cropped-files/cropped-stack-${jj}.nii.gz -interp NN - ${mirtk_path}/mirtk centre-volume cropped-files/cropped-stack-${jj}.nii.gz mask-files-${roi_ids[$selected_recon_roi]}/mask-${jj}.nii.gz cropped-files/cropped-stack-${jj}.nii.gz - ${mirtk_path}/mirtk centre-volume mask-files-${roi_ids[$selected_recon_roi]}/mask-${jj}.nii.gz mask-files-${roi_ids[$selected_recon_roi]}/mask-${jj}.nii.gz mask-files-${roi_ids[$selected_recon_roi]}/mask-${jj}.nii.gz + ${mirtk_path}/mirtk transform-image recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -target recon-stacks-brain/stack-${jj}.nii.gz -labels - #fi - - echo stack-files/stack-${jj}.nii.gz " - " cropped-cnn-out-files/*-${jj}_seg_pr*.nii* " - " mask-files-${roi_ids[${selected_recon_roi}]}/mask-${jj}.nii.gz + ${mirtk_path}/mirtk centre-volume recon-stacks-brain/stack-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz recon-stacks-brain/stack-${jj}.nii.gz + ${mirtk_path}/mirtk centre-volume recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz + + if [ $motion_correction_mode -eq 1 ]; then + + ${mirtk_path}/mirtk dilate-image recon-masks-brain/mask-${jj}.nii.gz dl.nii.gz -iterations 4 + + ${mirtk_path}/mirtk crop-image recon-stacks-brain/stack-${jj}.nii.gz dl.nii.gz masked-cropped-files-brain/stack-${jj}.nii.gz + ${mirtk_path}/mirtk mask-image masked-cropped-files-brain/stack-${jj}.nii.gz dl.nii.gz masked-cropped-files-brain/stack-${jj}.nii.gz + + ${mirtk_path}/mirtk resample-image masked-cropped-files-brain/stack-${jj}.nii.gz masked-cropped-files-brain/stack-${jj}.nii.gz -size 1 1 1 -interp Linear + fi done -# CNN landmark-based reorientation of stacks to the standard space for severe motion cases -if [ $motion_correction_mode -gt 0 ]; then - mkdir cropped-cnn-out-files-4reo - mkdir stack-dofs-to-atl - mkdir stack-reo-mask-files +if [ $motion_correction_mode -eq 1 ]; then - number_of_stacks=$(ls cropped-files/*.nii* | wc -l) - stack_names=$(ls cropped-files/*.nii*) + echo + echo "-----------------------------------------------------------------------------" + echo "RUNNING BRAIN ROI REORIENTATION ..." + echo "-----------------------------------------------------------------------------" + echo + + number_of_stacks=$(ls masked-cropped-files-brain/*.nii* | wc -l) + stack_names=$(ls masked-cropped-files-brain/*.nii*) + + echo " ... " + + roi=brain + res=128 + monai_lab_num=5 + ${mirtk_path}/mirtk prepare-for-monai res-cropped-files/ again-cropped-files/ reo-cropped-stack-info.json reo-cropped-stack-info.csv ${res} ${number_of_stacks} masked-cropped-files-brain/*nii* > tmp.log + + current_monai_check_path=${model_path}/monai-checkpoints-unet-svr-brain-reo-raw-stacks-5-lab - # 3D UNet segmentation of 4 brain landmark labels - all_num_lab_reo=4 - ${mirtk_path}/mirtk prepare-for-cnn cropped-res-files cropped-stack-files cropped-run-4reo.csv cropped-run-info-summary.csv ${res} ${number_of_stacks} $(echo $stack_names) ${all_num_lab_reo} 0 - PYTHONIOENCODING=utf-8 python ${segm_path}/run_cnn_loc_gpu_cpu.py ${segm_path}/ ${check_path_roi_reo_4lab_stacks}/ ${main_dir}/ ${main_dir}/cropped-cnn-out-files-4reo/ cropped-run-4reo.csv ${res} ${all_num_lab_reo} ${cnn_mode} +# current_monai_check_path=${model_path}/monai-checkpoints-unet-brain-raw-reo-5-lab-055t + + mkdir monai-segmentation-results-stack-reo + python ${segm_path}/src/run_monai_unet_segmentation-2022.py ${main_dir}/ ${current_monai_check_path}/ reo-cropped-stack-info.json ${main_dir}/monai-segmentation-results-stack-reo ${res} ${monai_lab_num} + + + number_of_stacks=$(find monai-segmentation-results-stack-reo/ -name "*.nii*" | wc -l) + if [ ${number_of_stacks} -eq 0 ];then - reo_roi_ids=(1 2 3 4) - lab_start=(1 2 1 4) - lab_stop=(1 2 4 4) - lab_cc=(2 2 1 1) + chmod 1777 -R ${output_main_folder}/ - # 1 - front WM, 2 - back WM, 3 - bet, 4 - cerebellum - test_file=cropped-cnn-out-files-4reo/cropped-res-files_in-res-stack-1000_img-0.nii.gz - if [[ ! -f ${test_file} ]];then echo echo "-----------------------------------------------------------------------------" - echo "ERROR : CROPPED 3D UNET REORIENTATION FAILED ..." + echo "ERROR: REO CNN LOCALISATION DID NOT WORK !!!!" echo "-----------------------------------------------------------------------------" echo - echo "ERROR : CROPPED 3D UNET REORIENTATION FAILED. " > ${default_recon_dir}/error.txt exit fi - out_mask_names=$(ls cropped-cnn-out-files-4reo/*seg_pr*.nii*) - IFS=$'\n' read -rd '' -a all_masks <<<"$out_mask_names" + echo + echo "-----------------------------------------------------------------------------" + echo "EXTRACTING REO LABELS AND REORIENTING ..." + echo "-----------------------------------------------------------------------------" + echo + + out_mask_names=$(ls monai-segmentation-results-stack-reo/cnn-*.nii*) + read -rd '' -a all_masks <<<"$out_mask_names" + + org_stack_names=$(ls cropped-stacks-${roi}/*.nii*) + read -rd '' -a all_org_stacks <<<"$org_stack_names" + + mkdir out-stack-reo-masks + mkdir out-dofs-to-templates + + ${mirtk_path}/mirtk init-dof init.dof + + # mkdir test-org + - for ((i=0;i<${#all_masks[@]};i++)); - do + for ((i=0;i<${#all_org_stacks[@]};i++)); + do + echo " - " ${i} " : " ${all_org_stacks[$i]} ${all_masks[$i]} + jj=$((${i}+1000)) - echo " - " ${jj} " ... " - # extracting landmark masks - for ((w=0;w<${#reo_roi_ids[@]};w++)); + + for ((q=1;q<6;q++)); do - current_lab=${reo_roi_ids[$w]} - s1=${lab_start[$w]} - s2=${lab_stop[$w]} - currenct_cc=${lab_cc[$w]} - ${mirtk_path}/mirtk extract-label ${main_dir}/cropped-cnn-out-files-4reo/*-${jj}_seg_pr*.nii* tmp-org-m.nii.gz ${s1} ${s2} - ${mirtk_path}/mirtk extract-connected-components tmp-org-m.nii.gz tmp-org-m.nii.gz -n ${currenct_cc} - cp tmp-org-m.nii.gz stack-reo-mask-files/mask-${jj}-${current_lab}.nii.gz + ${mirtk_path}/mirtk extract-label ${all_masks[$i]} out-stack-reo-masks/mask-${jj}-${q}.nii.gz ${q} ${q} + ${mirtk_path}/mirtk dilate-image out-stack-reo-masks/mask-${jj}-${q}.nii.gz out-stack-reo-masks/mask-${jj}-${q}.nii.gz + ${mirtk_path}/mirtk erode-image out-stack-reo-masks/mask-${jj}-${q}.nii.gz out-stack-reo-masks/mask-${jj}-${q}.nii.gz + ${mirtk_path}/mirtk extract-connected-components out-stack-reo-masks/mask-${jj}-${q}.nii.gz out-stack-reo-masks/mask-${jj}-${q}.nii.gz + # ${mirtk_path}/mirtk transform-image out-stack-reo-masks/mask-${jj}-${q}.nii.gz out-stack-reo-masks/mask-${jj}-${q}.nii.gz -target ${all_org_stacks[$i]} -labels done - ${mirtk_path}/mirtk init-dof init.dof - z1=1; z2=2; z3=3; z4=4 ; - # running landmark-based reorientation - ${mirtk_path}/mirtk register-landmarks ${template_path}/brain-ref-atlas-2021/new-brain-templ.nii.gz stack-reo-mask-files/mask-${jj}-0.nii.gz init.dof stack-dofs-to-atl/dof-to-atl-${jj}.dof 4 4 ${template_path}/brain-ref-atlas-2021/mask-${z1}.nii.gz ${template_path}/brain-ref-atlas-2021/mask-${z2}.nii.gz ${template_path}/brain-ref-atlas-2021/mask-${z3}.nii.gz ${template_path}/brain-ref-atlas-2021/mask-${z4}.nii.gz stack-reo-mask-files/mask-${jj}-${z1}.nii.gz stack-reo-mask-files/mask-${jj}-${z2}.nii.gz stack-reo-mask-files/mask-${jj}-${z3}.nii.gz stack-reo-mask-files/mask-${jj}-${z4}.nii.gz > tmp.txt - # changing stack header orientation based on the transformations - ${mirtk_path}/mirtk edit-image cropped-files/cropped-stack-${jj}.nii.gz cropped-files/cropped-stack-${jj}.nii.gz -dofin_i stack-dofs-to-atl/dof-to-atl-${jj}.dof - ${mirtk_path}/mirtk edit-image mask-files-${roi_ids[$selected_recon_roi]}/mask-${jj}.nii.gz mask-files-${roi_ids[$selected_recon_roi]}/mask-${jj}.nii.gz -dofin_i stack-dofs-to-atl/dof-to-atl-${jj}.dof + n_roi=4; z1=1; z2=2; z3=3; z4=4; + current_template_path=${template_path}/brain-ref-atlas-2022 + ${mirtk_path}/mirtk register-landmarks mask-${z1}.nii.gz out-stack-reo-masks/mask-${jj}-${z1}.nii.gz init.dof out-dofs-to-templates/dof-to-atl-${jj}.dof 4 4 ${current_template_path}/mask-${z1}.nii.gz ${current_template_path}/mask-${z2}.nii.gz ${current_template_path}/mask-${z3}.nii.gz ${current_template_path}/mask-${z4}.nii.gz out-stack-reo-masks/mask-${jj}-${z1}.nii.gz out-stack-reo-masks/mask-${jj}-${z2}.nii.gz out-stack-reo-masks/mask-${jj}-${z3}.nii.gz out-stack-reo-masks/mask-${jj}-${z4}.nii.gz > tmp.log + + cp out-dofs-to-templates/dof-to-atl-${jj}.dof init.dof + + test_file=out-dofs-to-templates/dof-to-atl-${jj}.dof + if [ ! -f ${test_file} ];then + + chmod 1777 -R ${output_main_folder}/ + + echo + echo "-----------------------------------------------------------------------------" + echo "ERROR: REORIENTATION DID NOT WORK !!!!" + echo "-----------------------------------------------------------------------------" + echo + exit + fi + + ${mirtk_path}/mirtk info out-dofs-to-templates/dof-to-atl-${jj}.dof + + ${mirtk_path}/mirtk edit-image recon-stacks-brain/stack-${jj}.nii.gz recon-stacks-brain/stack-${jj}.nii.gz -dofin_i out-dofs-to-templates/dof-to-atl-${jj}.dof + ${mirtk_path}/mirtk edit-image recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -dofin_i out-dofs-to-templates/dof-to-atl-${jj}.dof + + # ${mirtk_path}/mirtk centre-volume recon-stacks-brain/stack-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz recon-stacks-brain/stack-${jj}.nii.gz + # ${mirtk_path}/mirtk centre-volume recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz done + + fi -########################################################################################################################## -###### STACK SELECTION + SVR RECONSTRUCTION -########################################################################################################################## + echo echo "-----------------------------------------------------------------------------" -echo "RUNNING STACK SELECTION ..." echo "-----------------------------------------------------------------------------" echo +echo "RUNNING RECONSTRUCTION ..." +echo cd ${main_dir} -mkdir out-proc-${roi_names[${selected_recon_roi}]} -cd out-proc-${roi_names[${selected_recon_roi}]} -number_of_stacks=$(ls ../cropped-files/*.nii* | wc -l) -stack_names=$(ls ../cropped-files/*.nii*) -mask_names=$(ls ../mask-files-${roi_ids[$selected_recon_roi]}/*.nii*) +if [ $recon_roi = "brain" ]; then -# selection/exclusion of stacks based on similarity metrics and generation of the average mask -mkdir proc-stacks -${mirtk_path}/mirtk stacks-and-masks-selection ${number_of_stacks} $(echo $stack_names) $(echo $mask_names) proc-stacks 15 1 - -test_file=average_mask_cnn.nii.gz -if [[ ! -f ${test_file} ]];then echo echo "-----------------------------------------------------------------------------" - echo "ERROR : STACK SELECTION FAILED ..." + echo "SELECTING STACKS / GENERATING TEMPLATE ..." echo "-----------------------------------------------------------------------------" echo - echo "ERROR: STACK SELECTION FAILED. " > ${default_recon_dir}/error.txt - exit -fi + + cd ${main_dir} + + recon_roi_global=brain + + number_of_stacks=$(ls recon-stacks-${recon_roi_global}/*.nii* | wc -l) + stack_names=$(ls recon-stacks-${recon_roi_global}/*.nii*) + mask_names=$(ls recon-masks-${recon_roi}/*.nii*) + + + mkdir proc-stacks-${recon_roi} -# generation of the average template -${mirtk_path}/mirtk average-images average_volume.nii.gz proc-stacks/*nii* -${mirtk_path}/mirtk resample-image average_volume.nii.gz average_volume.nii.gz -size 1 1 1 -${mirtk_path}/mirtk average-images average_volume.nii.gz proc-stacks/*nii* -target average_volume.nii.gz -${mirtk_path}/mirtk transform-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -target average_volume.nii.gz -interp NN -${mirtk_path}/mirtk erode-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz + echo " ... " -echo -echo "-----------------------------------------------------------------------------" -echo "RUNNING RECONSTRUCTION ..." -echo "-----------------------------------------------------------------------------" -echo + mkdir proc-stacks-${recon_roi} + + ${mirtk_path}/mirtk stacks-and-masks-selection ${number_of_stacks} $(echo $stack_names) $(echo $mask_names) proc-stacks-${recon_roi} 15 1 + + + test_file=selected_template.nii.gz + if [ ! -f ${test_file} ];then + echo + echo "-----------------------------------------------------------------------------" + echo "COMPUTING GLOBAL AVERAGE - THE AUTO-SELECTION FAILED ..." + echo "-----------------------------------------------------------------------------" + echo + + ${mirtk_path}/mirtk average-images selected_template.nii.gz recon-stacks-${recon_roi_global}/*.nii* + ${mirtk_path}/mirtk resample-image selected_template.nii.gz selected_template.nii.gz -size 1 1 1 + ${mirtk_path}/mirtk average-images selected_template.nii.gz recon-stacks-${recon_roi_global}/*.nii* -target selected_template.nii.gz + ${mirtk_path}/mirtk average-images average_mask_cnn.nii.gz recon-masks-${recon_roi}/*.nii* -target selected_template.nii.gz + ${mirtk_path}/mirtk convert-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -short + cp recon-stacks-${recon_roi_global}/*.nii* proc-stacks-${recon_roi}/ + + ${mirtk_path}/mirtk mask-image selected_template.nii.gz average_mask_cnn.nii.gz masked-selected_template.nii.gz + + out_mask_names=$(ls recon-masks-${recon_roi}/*.nii*) + read -rd '' -a all_masks <<<"$out_mask_names" + + org_stack_names=$(ls recon-stacks-${recon_roi_global}/*.nii*) + read -rd '' -a all_org_stacks <<<"$org_stack_names" + + ${mirtk_path}/mirtk init-dof init.dof + + for ((i=0;i<${#all_org_stacks[@]};i++)); + do + echo " - " ${i} " ... " + + ${mirtk_path}/mirtk mask-image ${all_org_stacks[$i]} ${all_masks[$i]} tmp-stack.nii.gz + ${mirtk_path}/mirtk register masked-selected_template.nii.gz tmp-stack.nii.gz -model Rigid -dofin init.dof -dofout d.dof -v 0 + ${mirtk_path}/mirtk edit-image ${all_org_stacks[$i]} ${all_org_stacks[$i]} -dofin_i d.dof + ${mirtk_path}/mirtk edit-image ${all_masks[$i]} ${all_masks[$i]} -dofin_i d.dof + done + + ${mirtk_path}/mirtk average-images selected_template.nii.gz recon-stacks-${recon_roi_global}/*.nii* -target selected_template.nii.gz + ${mirtk_path}/mirtk average-images average_mask_cnn.nii.gz recon-masks-${recon_roi}/*.nii* -target selected_template.nii.gz + ${mirtk_path}/mirtk nan selected_template.nii.gz 1000000 + ${mirtk_path}/mirtk convert-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -short + + else -# SVR reconstruction -nStacks=$(ls proc-stacks/*.nii* | wc -l) -${mirtk_path}/mirtk reconstruct ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz ${nStacks} proc-stacks/*.nii* -mask average_mask_cnn.nii.gz -template average_volume.nii.gz -default_thickness ${default_thickness} -svr_only -iterations 3 -structural -resolution ${output_resolution} + ${mirtk_path}/mirtk average-images selected_template.nii.gz proc-stacks-${recon_roi}/*nii* + ${mirtk_path}/mirtk resample-image selected_template.nii.gz ref.nii.gz -size 1 1 1 + + ${mirtk_path}/mirtk edit-image ref.nii.gz ref.nii.gz -dx 1.5 -dy 1.5 -dz 1.5 + ${mirtk_path}/mirtk resample-image ref.nii.gz ref.nii.gz -size 1 1 1 + + ${mirtk_path}/mirtk average-images selected_template.nii.gz proc-stacks-${recon_roi}/*nii* -target ref.nii.gz + ${mirtk_path}/mirtk transform-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -target ref.nii.gz -labels + + fi + + current_template_path=${template_path}/brain-stack-reo-template + if [ $motion_correction_mode -eq 1 ]; then + ${mirtk_path}/mirtk resample-image ${template_path}/brain-ref-atlas-2022/ref-space-brain.nii.gz ref.nii.gz -size 1 1 1 + ${mirtk_path}/mirtk transform-image selected_template.nii.gz transf-selected_template.nii.gz -target ref.nii.gz -interp Linear + ${mirtk_path}/mirtk crop-image transf-selected_template.nii.gz transf-selected_template.nii.gz transf-selected_template.nii.gz + else + cp selected_template.nii.gz transf-selected_template.nii.gz + fi + + ${mirtk_path}/mirtk dilate-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -iterations 2 + ${mirtk_path}/mirtk erode-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -iterations 2 -test_file=${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz -if [[ ! -f ${test_file} ]];then echo echo "-----------------------------------------------------------------------------" - echo "ERROR : SVR RECONSTRUCTION FAILED ..." + echo "SVR RECONSTRUCTION ..." echo "-----------------------------------------------------------------------------" echo - echo "ERROR: SVR RECONSTRUCTION FAILED. " > ${default_recon_dir}/error.txt - exit -fi - -########################################################################################################################## -###### CNN-BASED REORIENTATION -########################################################################################################################## - -echo -echo "-----------------------------------------------------------------------------" -echo "RUNNING LANDMARK-BASED REORIENTATION ..." -echo "-----------------------------------------------------------------------------" -echo - -cd ${main_dir} -# 1 - front WM, 2 - back WM, 3 - bet, 4 - cerebellum -reo_roi_ids=(1 2 3 4); lab_start=(1 2 1 4); lab_stop=(1 2 4 4); lab_cc=(2 2 1 1); + mkdir out-recon-files-${recon_roi} + cd out-recon-files-${recon_roi} + number_of_stacks=$(ls ../proc-stacks-${recon_roi}/*.nii* | wc -l) + + + ${mirtk_path}/mirtk reconstruct tmp-output.nii.gz ${number_of_stacks} ../proc-stacks-${recon_roi}/*.nii* -mask ../average_mask_cnn.nii.gz -template ../transf-selected_template.nii.gz -default_thickness ${default_thickness} -svr_only -iterations 1 -resolution 1.6 -with_background + -mkdir dofs-to-atl -mkdir in-recon-file -mkdir final-reo-mask-files + if [ $motion_correction_mode -eq 1 ]; then + + ${mirtk_path}/mirtk reconstruct ../SVR-output-${recon_roi}.nii.gz ${number_of_stacks} ../proc-stacks-${recon_roi}/*.nii* -mask ../average_mask_cnn.nii.gz -template tmp-output.nii.gz -default_thickness ${default_thickness} -iterations 3 -resolution ${recon_resolution} -structural -svr_only -with_background + + else + + ${mirtk_path}/mirtk reconstruct ../SVR-output-${recon_roi}.nii.gz ${number_of_stacks} ../proc-stacks-${recon_roi}/*.nii* -mask ../average_mask_cnn.nii.gz -template tmp-output.nii.gz -default_thickness ${default_thickness} -iterations 3 -resolution ${recon_resolution} -svr_only -with_background + + fi + + +# -delta 110 -lambda 0.018 -lastIter 0.008 ; + + test_file=../SVR-output-${recon_roi}.nii.gz + if [ ! -f ${test_file} ];then -cp ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz in-recon-file + chmod 1777 -R ${output_main_folder}/ -# 3D UNet 4 landmark label localisation for the reconstructed image -res=128 -all_num_lab_reo=4 -cnn_out_mode=1234 -${mirtk_path}/mirtk prepare-for-cnn recon-res-files recon-stack-files run.csv run-info-summary.csv ${res} 1 in-recon-file/*nii* ${all_num_lab_reo} 0 -mkdir ${main_dir}/reo-${cnn_out_mode}-cnn-out-files -PYTHONIOENCODING=utf-8 python ${segm_path}/run_cnn_loc_gpu_cpu.py ${segm_path}/ ${check_path_roi_reo_4lab} ${main_dir}/ ${main_dir}/reo-${cnn_out_mode}-cnn-out-files/ run.csv ${res} ${all_num_lab_reo} ${cnn_mode} - -test_file=${main_dir}/reo-${cnn_out_mode}-cnn-out-files/recon-res-files_in-res-stack-1000_img-0.nii.gz -if [[ ! -f ${test_file} ]];then + echo + echo "-----------------------------------------------------------------------------" + echo "ERROR: SVR RECONSTRUCTION DID NOT WORK !!!!" + echo "-----------------------------------------------------------------------------" + echo + exit + fi + + + ${mirtk_path}/mirtk dilate-image ../average_mask_cnn.nii.gz dl.nii.gz -iterations 6 + ${mirtk_path}/mirtk mask-image ../SVR-output-${recon_roi}.nii.gz dl.nii.gz ../SVR-output-${recon_roi}.nii.gz + + ${mirtk_path}/mirtk dilate-image ../average_mask_cnn.nii.gz dl.nii.gz -iterations 2 + ${mirtk_path}/mirtk mask-image ../SVR-output-${recon_roi}.nii.gz dl.nii.gz ../masked-SVR-output-${recon_roi}.nii.gz + + echo echo "-----------------------------------------------------------------------------" - echo "ERROR : 3D UNET REORIENTATION OF THE SVR-RECONSTRUCTED IMAGE FAILED ..." + echo "REORIENTATION TO THE STANDARD SPACE ..." echo "-----------------------------------------------------------------------------" echo - echo "ERROR : 3D UNET REORIENTATION OF THE SVR-RECONSTRUCTED IMAGE FAILED. " > ${default_recon_dir}/error.txt - exit -fi + + cd ${main_dir} + -# extration of landmark labels -jj=1000 -for ((w=0;w<${#reo_roi_ids[@]};w++)); -do - current_lab=${reo_roi_ids[$w]} - s1=${lab_start[$w]} - s2=${lab_stop[$w]} - currenct_cc=${lab_cc[$w]} - ${mirtk_path}/mirtk extract-label ${main_dir}/reo-${cnn_out_mode}-cnn-out-files/*-${jj}_seg_pr*.nii* tmp-org-m.nii.gz ${s1} ${s2} - ${mirtk_path}/mirtk extract-connected-components tmp-org-m.nii.gz tmp-org-m.nii.gz -n ${currenct_cc} - cp tmp-org-m.nii.gz final-reo-mask-files/mask-${jj}-${current_lab}.nii.gz -done + number_of_stacks=1 + roi=brain + res=128 + monai_lab_num=5 + + echo " ... " + + # ${mirtk_path}/mirtk mask-image SVR-output-${recon_roi}.nii.gz average_mask_cnn.nii.gz masked-SVR-output-${recon_roi}.nii.gz + + ${mirtk_path}/mirtk prepare-for-monai res-svr-files/ svr-files/ reo-svr-info.json reo-svr-info.csv ${res} ${number_of_stacks} masked-SVR-output-${recon_roi}.nii.gz > tmp.log -${mirtk_path}/mirtk init-dof init.dof -z1=1; z2=2; z3=3; z4=4; + current_monai_check_path=${model_path}/monai-checkpoints-unet-svr-brain-reo-5-lab + + mkdir monai-segmentation-results-svr-reo + python ${segm_path}/src/run_monai_unet_segmentation-2022.py ${main_dir}/ ${current_monai_check_path}/ reo-svr-info.json ${main_dir}/monai-segmentation-results-svr-reo ${res} ${monai_lab_num} + + + number_of_stacks=$(find monai-segmentation-results-svr-reo/ -name "*.nii*" | wc -l) + if [ ${number_of_stacks} -eq 0 ];then + echo + echo "-----------------------------------------------------------------------------" + echo "ERROR: REO CNN LOCALISATION DID NOT WORK !!!!" + echo "-----------------------------------------------------------------------------" + echo + exit + fi + + mkdir out-svr-reo-masks + for ((q=1;q<6;q++)); + do + ${mirtk_path}/mirtk extract-label monai-segmentation-results-svr-reo/cnn* out-svr-reo-masks/mask-${q}.nii.gz ${q} ${q} + ${mirtk_path}/mirtk dilate-image out-svr-reo-masks/mask-${q}.nii.gz out-svr-reo-masks/mask-${q}.nii.gz -iterations 2 + ${mirtk_path}/mirtk erode-image out-svr-reo-masks/mask-${q}.nii.gz out-svr-reo-masks/mask-${q}.nii.gz -iterations 2 + ${mirtk_path}/mirtk extract-connected-components out-svr-reo-masks/mask-${q}.nii.gz out-svr-reo-masks/mask-${q}.nii.gz -n 1 -# landmark-based registration to the atlas space -${mirtk_path}/mirtk register-landmarks ${template_path}/brain-ref-atlas-2021/new-brain-templ.nii.gz final-reo-mask-files/mask-${jj}-0.nii.gz init.dof dofs-to-atl/dof-to-atl-${jj}.dof 4 4 ${template_path}/brain-ref-atlas-2021/mask-${z1}.nii.gz ${template_path}/brain-ref-atlas-2021/mask-${z2}.nii.gz ${template_path}/brain-ref-atlas-2021/mask-${z3}.nii.gz ${template_path}/brain-ref-atlas-2021/mask-${z4}.nii.gz final-reo-mask-files/mask-${jj}-${z1}.nii.gz final-reo-mask-files/mask-${jj}-${z2}.nii.gz final-reo-mask-files/mask-${jj}-${z3}.nii.gz final-reo-mask-files/mask-${jj}-${z4}.nii.gz > tmp.txt + done -# transformation to the atlas space -${mirtk_path}/mirtk transform-image ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz ${main_dir}/reo-${roi_recon[${selected_recon_roi}]}-output.nii.gz -dofin dofs-to-atl/dof-to-atl-${jj}.dof -target ${template_path}/brain-ref-atlas-2021/ref-space-brain.nii.gz -interp BSpline + z1=1; z2=2; z3=3; z4=4; n_roi=4; + ${mirtk_path}/mirtk init-dof init.dof + ${mirtk_path}/mirtk register-landmarks ${template_path}/brain-ref-atlas-2022/mask-${z1}.nii.gz ${all_org_stacks[$j]} init.dof dof-to-atl-${recon_roi}.dof ${n_roi} ${n_roi} ${template_path}/brain-ref-atlas-2022/mask-${z1}.nii.gz ${template_path}/brain-ref-atlas-2022/mask-${z2}.nii.gz ${template_path}/brain-ref-atlas-2022/mask-${z3}.nii.gz ${template_path}/brain-ref-atlas-2022/mask-${z4}.nii.gz out-svr-reo-masks/mask-${z1}.nii.gz out-svr-reo-masks/mask-${z2}.nii.gz out-svr-reo-masks/mask-${z3}.nii.gz out-svr-reo-masks/mask-${z4}.nii.gz > tmp.log -# cropping any remaining black background -${mirtk_path}/mirtk crop-image ${main_dir}/reo-${roi_recon[${selected_recon_roi}]}-output.nii.gz ${main_dir}/reo-${roi_recon[${selected_recon_roi}]}-output.nii.gz ${main_dir}/reo-${roi_recon[${selected_recon_roi}]}-output.nii.gz + ${mirtk_path}/mirtk info dof-to-atl-${recon_roi}.dof + + ${mirtk_path}/mirtk resample-image ${template_path}/brain-ref-atlas-2022/ref-space-brain.nii.gz ref.nii.gz -size ${recon_resolution} ${recon_resolution} ${recon_resolution} -echo -echo "-----------------------------------------------------------------------------" -echo "ADJUSTING & RENAMING FINAL FILES" -echo "-----------------------------------------------------------------------------" -echo + ${mirtk_path}/mirtk transform-image SVR-output-${recon_roi}.nii.gz reo-SVR-output-${recon_roi}.nii.gz -target ref.nii.gz -dofin dof-to-atl-${recon_roi}.dof -interp BSpline + ${mirtk_path}/mirtk threshold-image reo-SVR-output-${recon_roi}.nii.gz tmp-m.nii.gz 0.01 + ${mirtk_path}/mirtk crop-image reo-SVR-output-${recon_roi}.nii.gz tmp-m.nii.gz reo-SVR-output-${recon_roi}.nii.gz + ${mirtk_path}/mirtk nan reo-SVR-output-${recon_roi}.nii.gz 100000 + + + test_file=reo-SVR-output-${recon_roi}.nii.gz + if [ ! -f ${test_file} ];then + + chmod 1777 -R ${output_main_folder}/ -test_file=${main_dir}/reo-${roi_recon[${selected_recon_roi}]}-output.nii.gz -if [[ -f ${test_file} ]];then + echo + echo "-----------------------------------------------------------------------------" + echo "ERROR: REORIENTATION OF RECONSTRUCTED IMAGE DID NOT WORK !!!!" + echo "-----------------------------------------------------------------------------" + echo + exit + fi + + number_of_final_recons=$(ls *SVR-output*.nii* | wc -l) + if [ ${number_of_final_recons} -ne 0 ];then - # TAR - rename files - mv ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz ${main_dir}/${roi_recon[${selected_recon_roi}]}-output-withoutReorientation.nii.gz - cp ${main_dir}/reo-${roi_recon[${selected_recon_roi}]}-output.nii.gz ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz - - # TAR - pad in-plane so square FOV - ${mirtk_path}/mirtk resample-to-iso-grid ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz 2 + cp -r *SVR-output*nii* ${output_main_folder}/ + cp -r average_mask_cnn.nii.gz ${output_main_folder}/ - # TAR - move final files to /recon dir - cp ${main_dir}/${roi_recon[${selected_recon_roi}]}-output-withoutReorientation.nii.gz ${default_recon_dir}/${roi_recon[${selected_recon_roi}]}-output-withoutReorientation.nii.gz - cp ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz ${default_recon_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz + chmod 1777 -R ${output_main_folder}/ - cp ${main_dir}/${roi_recon[${selected_recon_roi}]}-output.nii.gz ${output_path}/${roi_recon[${selected_recon_roi}]}-output.nii.gz + echo "-----------------------------------------------------------------------------" + echo "Reconstructed SVR results are in the output folder : " ${output_main_folder} + echo "-----------------------------------------------------------------------------" + + else - echo "Reconstruction was successful: " ${output_path}/${roi_recon[${selected_recon_roi}]}-output.nii.gz + chmod 1777 -R ${output_main_folder}/ -else - echo "Reconstruction failed ... " - echo "ERROR : RECONSTRUCTION PIPELINE FAILED (REORIENTATION OR SAVING STEP). " > ${default_recon_dir}/error.txt -fi + echo + echo "-----------------------------------------------------------------------------" + echo "ERROR: COULD NOT COPY THE FILES TO THE OUTPUT FOLDER : " ${output_main_folder} + echo "PLEASE CHECK THE WRITE PERMISSIONS / LOCATION !!!" + echo + echo "note: you can still find the recon files in : " ${main_dir} + echo "-----------------------------------------------------------------------------" + echo + exit + fi +fi echo @@ -495,3 +867,4 @@ echo "-------------------------------------------------------------------------- echo "-----------------------------------------------------------------------------" echo + diff --git a/app/operators/fetal_mri_3d_brain_recon_operator.py b/app/operators/fetal_mri_3d_brain_recon_operator.py index 6af3a1b..4336b48 100644 --- a/app/operators/fetal_mri_3d_brain_recon_operator.py +++ b/app/operators/fetal_mri_3d_brain_recon_operator.py @@ -33,28 +33,26 @@ def compute(self, op_input: InputContext, op_output: OutputContext, context: Exe # Run motion corrected reconstruction if not is_local_testing: - if torch.cuda.is_available(): - cnn_mode = "1" - logging.info("SVRTK reconstruction using GPU mode ...") - if not torch.cuda.is_available(): - cnn_mode = "-1" - logging.info("SVRTK reconstruction using CPU mode ...") - - motion_correction_mode = "-1" # -1 minor, 1 severe - logging.info("SVRTK reconstruction using Minor motion correction mode ...") +# if torch.cuda.is_available(): +# cnn_mode = "1" +# logging.info("SVRTK reconstruction using GPU mode ...") +# if not torch.cuda.is_available(): +# cnn_mode = "-1" +# logging.info("SVRTK reconstruction using CPU mode ...") +# +# motion_correction_mode = "-1" # -1 minor, 1 severe + logging.info("SVRTK reconstruction ...") subprocess.run([ "/home/scripts/docker-recon-brain-auto.bash", nii_stacks_path, - operator_workdir, - cnn_mode, - motion_correction_mode + operator_workdir ]) # Local testing: # create dummy SVR-output.nii.gz file in same location as output from docker-recon-brain-auto.bash if is_local_testing: - subprocess.run(["cp", "/path/to/local/SVR-output.nii.gz", operator_workdir]) + subprocess.run(["cp", "/path/to/local/reo-SVR-output-brain.nii.gz", operator_workdir]) logging.info("Completed SVRTK reconstruction ...") diff --git a/app/operators/nii2dcm_operator.py b/app/operators/nii2dcm_operator.py index 4719a7a..d11feed 100644 --- a/app/operators/nii2dcm_operator.py +++ b/app/operators/nii2dcm_operator.py @@ -55,7 +55,7 @@ def compute(self, op_input: InputContext, op_output: OutputContext, context: Exe dcm_output_path = op_output.get().path # SVRTK output - svrtk_output_filename = 'SVR-output.nii.gz' + svrtk_output_filename = 'reo-SVR-output-brain.nii.gz' svrtk_output_path = op_input.get("svrtk_output").path svrtk_nii_path = Path(svrtk_output_path / svrtk_output_filename) logging.info(f"SVRTK output NIfTI found: {svrtk_nii_path}") From 4b90fb9db5aa3ce713eda0afd885f6ba797e0dd1 Mon Sep 17 00:00:00 2001 From: Alena Ulla Uus Date: Mon, 11 Sep 2023 17:40:13 +0100 Subject: [PATCH 02/11] monai auto-proc-svrtk update --- app/operators/docker-recon-brain-auto.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/operators/docker-recon-brain-auto.bash b/app/operators/docker-recon-brain-auto.bash index 3a40617..dbcd2d2 100644 --- a/app/operators/docker-recon-brain-auto.bash +++ b/app/operators/docker-recon-brain-auto.bash @@ -108,7 +108,7 @@ echo if [ $# -ne 2 ] ; then if [ $# -ne 6 ] ; then - echo "Usage: bash /home/auto-proc-svrtk/auto-brain-reconstruction.sh" + echo "Usage: bash /home/auto-proc-svrtk/scripts/auto-brain-reconstruction.sh" echo " [FULL path to the folder with raw T2w stacks in .nii or .dcm, e.g., /home/data/test]" echo " [FULL path to the folder for recon results, e.g., /home/data/out-test]" echo " (optional) [motion correction mode (0 or 1): 0 - minor, 1 - >180 degree rotations] - default: 1" From 5572cf475aa425bd45fc494d84a0820bc358b4ce Mon Sep 17 00:00:00 2001 From: Alena Ulla Uus Date: Tue, 12 Sep 2023 08:18:23 +0100 Subject: [PATCH 03/11] log message update --- app/operators/fetal_mri_3d_brain_recon_operator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/operators/fetal_mri_3d_brain_recon_operator.py b/app/operators/fetal_mri_3d_brain_recon_operator.py index 4336b48..72736ab 100644 --- a/app/operators/fetal_mri_3d_brain_recon_operator.py +++ b/app/operators/fetal_mri_3d_brain_recon_operator.py @@ -41,7 +41,7 @@ def compute(self, op_input: InputContext, op_output: OutputContext, context: Exe # logging.info("SVRTK reconstruction using CPU mode ...") # # motion_correction_mode = "-1" # -1 minor, 1 severe - logging.info("SVRTK reconstruction ...") +# logging.info("SVRTK reconstruction ...") subprocess.run([ "/home/scripts/docker-recon-brain-auto.bash", From 628a93c9d7efc097d597dded9fda981bf52b9ccf Mon Sep 17 00:00:00 2001 From: Alena Ulla Uus Date: Tue, 12 Sep 2023 20:44:12 +0100 Subject: [PATCH 04/11] bash script update --- app/docker-recon-brain-auto.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/docker-recon-brain-auto.bash b/app/docker-recon-brain-auto.bash index 81f8828..7a89888 100644 --- a/app/docker-recon-brain-auto.bash +++ b/app/docker-recon-brain-auto.bash @@ -1,4 +1,4 @@ -#!/usr/bin/env bash -l +#!/bin/bash # # SVRTK : SVR reconstruction based on MIRTK From 1c8d3f747e381c08a3d44e3b3a21120db7f9d863 Mon Sep 17 00:00:00 2001 From: Alena Ulla Uus Date: Fri, 22 Sep 2023 10:49:23 +0100 Subject: [PATCH 05/11] updated docker files with software paths --- app/Dockerfile | 12 +- app/docker-recon-brain-auto.bash | 869 -------------------- app/operators/docker-recon-brain-auto.bash | 870 --------------------- 3 files changed, 6 insertions(+), 1745 deletions(-) delete mode 100644 app/docker-recon-brain-auto.bash delete mode 100644 app/operators/docker-recon-brain-auto.bash diff --git a/app/Dockerfile b/app/Dockerfile index 32b72bb..8c216ad 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -19,7 +19,7 @@ WORKDIR /var/monai # Add SVRTK to MAP -WORKDIR /home +WORKDIR /bin # Install general libraries RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -y \ @@ -37,14 +37,14 @@ RUN apt-get install -y \ # Install MIRTK/SVRTK RUN git clone https://github.com/SVRTK/MIRTK.git \ - && mkdir -p /home/MIRTK/Packages/SVRTK -RUN git clone https://github.com/SVRTK/SVRTK.git /home/MIRTK/Packages/SVRTK \ - && mkdir -p /home/MIRTK/build \ - && cd /home/MIRTK/build \ + && mkdir -p /bin/MIRTK/Packages/SVRTK +RUN git clone https://github.com/SVRTK/SVRTK.git /bin/MIRTK/Packages/SVRTK \ + && mkdir -p /bin/MIRTK/build \ + && cd /bin/MIRTK/build \ && cmake -D WITH_TBB="ON" -D MODULE_SVRTK="ON" .. \ && make -j -ENV PATH="$PATH:/home/MIRTK/build/bin:/home/MIRTK/build/lib/tools" +ENV PATH="$PATH:/bin/MIRTK/build/bin:/bin/MIRTK/build/lib/tools" WORKDIR /var/monai diff --git a/app/docker-recon-brain-auto.bash b/app/docker-recon-brain-auto.bash deleted file mode 100644 index 7a89888..0000000 --- a/app/docker-recon-brain-auto.bash +++ /dev/null @@ -1,869 +0,0 @@ -#!/bin/bash - -# -# SVRTK : SVR reconstruction based on MIRTK -# -# Copyright 2018- King's College London -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -echo -echo "-----------------------------------------------------------------------------" -echo "-----------------------------------------------------------------------------" -echo - -#echo "Setting environment ... " -#echo - - -source ~/.bashrc - -#source /root/.bashrc -# -#eval "$(conda shell.bash hook)" -# -#conda init bash -# -#conda activate FetalMRI_MONAI - -# -#echo "NOTE: UPDATE SOFTWARE PAHTS AS REQUIRED BEFORE RUNNING " -#echo "NOTE: DOWNLOAD MONAI WEIGHTS INTO auto-proc-svrtk/trained_models FOLDER FROM https://gin.g-node.org/SVRTK/fetal_mri_network_weights" -# -#exit - - -software_path=/home - -default_run_dir=/home/tmp_proc - -segm_path=${software_path}/auto-proc-svrtk - -dcm2niix_path=${software_path}/dcm2niix/build/bin - -mirtk_path=${software_path}/MIRTK/build/bin - -template_path=${segm_path}/templates - -model_path=${segm_path}/trained_models - - - - -test_dir=${software_path}/MIRTK -if [ ! -d $test_dir ];then - echo "ERROR: COULD NOT FIND MIRTK INSTALLED IN : " ${software_path} - echo "PLEASE INSTALL OR UPDATE THE PATH software_path VARIABLE IN THE SCRIPT" - exit -fi - -test_dir=${segm_path}/trained_models -if [ ! -d $test_dir ];then - echo "ERROR: COULD NOT FIND SEGMENTATION MODULE INSTALLED IN : " ${software_path} - echo "PLEASE INSTALL OR UPDATE THE PATH software_path VARIABLE IN THE SCRIPT" - exit -fi - - - - -test_dir=${default_run_dir} -if [ ! -d $test_dir ];then - mkdir ${default_run_dir} -else - rm -r ${default_run_dir}/* -fi - -test_dir=${default_run_dir} -if [ ! -d $test_dir ];then - echo "ERROR: COULD NOT CREATE THE PROCESSING FOLDER : " ${default_run_dir} - echo "PLEASE CHECK THE PERMISSIONS OR UPDATE THE PATH default_run_dir VARIABLE IN THE SCRIPT" - exit -fi - - - -echo -echo "-----------------------------------------------------------------------------" -echo "-----------------------------------------------------------------------------" -echo -echo "SVRTK for fetal MRI (KCL): auto brain SVR reconstruction for SSTSE / HASTE T2w fetal MRI" -echo "Source code: https://github.com/SVRTK/auto-proc-svrtk" -echo -echo "-----------------------------------------------------------------------------" -echo "-----------------------------------------------------------------------------" -echo - -if [ $# -ne 2 ] ; then - - if [ $# -ne 6 ] ; then - echo "Usage: bash /home/auto-proc-svrtk/auto-brain-reconstruction.sh" - echo " [FULL path to the folder with raw T2w stacks in .nii or .dcm, e.g., /home/data/test]" - echo " [FULL path to the folder for recon results, e.g., /home/data/out-test]" - echo " (optional) [motion correction mode (0 or 1): 0 - minor, 1 - >180 degree rotations] - default: 1" - echo " (optional) [slice thickness] - default: 3.0" - echo " (optional) [output recon resolution] - default: 0.8" - echo " (optional) [number of packages] - default: 1" - echo - exit - else - input_main_folder=$1 - output_main_folder=$2 - motion_correction_mode=$3 - default_thickness=$4 - recon_resolution=$5 - num_packages=$6 - fi - -else - input_main_folder=$1 - output_main_folder=$2 - motion_correction_mode=1 - default_thickness=3.0 - recon_resolution=0.8 - num_packages=1 -fi - - -echo " - input folder : " ${input_main_folder} -echo " - output folder : " ${output_main_folder} -echo " - motion correction mode : " ${motion_correction_mode} -echo " - slice thickness : " ${default_thickness} -echo " - output resolution : " ${recon_resolution} - - -recon_roi=brain - - -test_dir=${input_main_folder} -if [ ! -d $test_dir ];then - echo - echo "ERROR: NO FOLDER WITH THE INPUT FILES FOUND !!!!" - exit -fi - - -test_dir=${output_main_folder} -if [ ! -d $test_dir ];then - mkdir ${output_main_folder} - chmod 1777 -R ${output_main_folder}/ -fi - - - -cd ${default_run_dir} -main_dir=$(pwd) - - - -number_of_stacks=$(find ${input_main_folder}/ -name "*.dcm" | wc -l) -if [ $number_of_stacks -gt 0 ];then - echo - echo "-----------------------------------------------------------------------------" - echo "FOUND .dcm FILES - CONVERTING TO .nii.gz !!!!" - echo "-----------------------------------------------------------------------------" - echo - cd ${input_main_folder}/ - ${dcm2niix_path}/dcm2niix -z y . - cd ${main_dir}/ -fi - - - -number_of_stacks=$(find ${input_main_folder}/ -name "*.nii*" | wc -l) -if [ $number_of_stacks -eq 0 ];then - - chmod 1777 -R ${output_main_folder}/ - - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: NO INPUT .nii / .nii.gz FILES FOUND !!!!" - echo "-----------------------------------------------------------------------------" - echo - exit -fi - -mkdir ${default_run_dir}/org-files -find ${input_main_folder}/ -name "*.nii*" -exec cp {} ${default_run_dir}/org-files \; - - -number_of_stacks=$(find ${default_run_dir}/org-files -name "*SVR-output*.nii*" | wc -l) -if [ $number_of_stacks -gt 0 ];then - echo - echo "-----------------------------------------------------------------------------" - echo "WARNING: FOUND ALREADY EXISTING *SVR-output* FILES IN THE DATA FOLDER !!!!" - echo "-----------------------------------------------------------------------------" - echo "note: they won't be used in reconstruction" - echo - rm ${default_run_dir}/org-files/"*SVR-output*.nii*" -fi - -number_of_stacks=$(find ${default_run_dir}/org-files -name "*mask*.nii*" | wc -l) -if [ $number_of_stacks -gt 0 ];then - - echo - echo "-----------------------------------------------------------------------------" - echo "WARNING: FOUND *mask* FILES IN THE DATA FOLDER !!!!" - echo "-----------------------------------------------------------------------------" - echo "note: they won't be used in reconstruction" - echo - rm ${default_run_dir}/org-files/"*mask*.nii*" -fi - -echo -echo "-----------------------------------------------------------------------------" -echo "-----------------------------------------------------------------------------" -echo -echo "PREPROCESSING ..." -echo - -cd ${default_run_dir} - - -mkdir org-files-preproc -cp org-files/* org-files-preproc - -cd org-files-preproc - -stack_names=$(ls *.nii*) -read -rd '' -a all_stacks <<<"$stack_names" - -echo -echo "-----------------------------------------------------------------------------" -echo "REMOVING NAN & NEGATIVE/EXTREME VALUES & SPLITTING INTO DYNAMICS ..." -echo "-----------------------------------------------------------------------------" -echo - -for ((i=0;i<${#all_stacks[@]};i++)); -do - echo " - " ${i} " : " ${all_stacks[$i]} - - st=${all_stacks[$i]} - st=$(echo ${st//.nii.gz\//\.nii.gz}) - st=$(echo ${st//.nii\//\.nii}) - - ${mirtk_path}/mirtk nan ${st} 100000 - ${mirtk_path}/mirtk extract-image-region ${st} ${st} -split t - rm ${st} -done - - -stack_names=$(ls *.nii*) -read -rd '' -a all_stacks <<<"$stack_names" - - -if [ $num_packages -ne 1 ]; then - echo - echo "-----------------------------------------------------------------------------" - echo "SPLITTING INTO PACKAGES ..." - echo "-----------------------------------------------------------------------------" - echo - - for ((i=0;i<${#all_stacks[@]};i++)); - do - echo " - " ${i} " : " ${all_stacks[$i]} - - st=${all_stacks[$i]} - st=$(echo ${st//.nii.gz\//\.nii.gz}) - st=$(echo ${st//.nii\//\.nii}) - - ${mirtk_path}/mirtk extract-packages ${st} ${num_packages} - - rm ${st} - rm package-template.nii.gz - - done -fi - - - mkdir ${default_run_dir}/tmp-res-global - - stack_names=$(ls *.nii*) - read -rd '' -a all_stacks <<<"$stack_names" - - echo - echo "-----------------------------------------------------------------------------" - echo "PREPROCESSING FOR LOCALISATION ..." - echo "-----------------------------------------------------------------------------" - echo - - for ((i=0;i<${#all_stacks[@]};i++)); - do - echo " - " ${i} " : " ${all_stacks[$i]} - - st=${all_stacks[$i]} - st=$(echo ${st//.nii.gz\//\.nii.gz}) - st=$(echo ${st//.nii\//\.nii}) - - jj=$((${i}+1000)) - - ${mirtk_path}/mirtk resample-image ${st} ${main_dir}/tmp-res-global/stack-${jj}.nii.gz -size 1.5 1.5 1.5 - - done - - -echo -echo "-----------------------------------------------------------------------------" -echo "-----------------------------------------------------------------------------" -echo -echo "GLOBAL LOCALISATION SEGMENTATION..." -echo - -cd ${main_dir} - -echo -echo "-----------------------------------------------------------------------------" -echo "RUNNING GLOBAL BODY+BRAIN LOCALISATION ..." -echo "-----------------------------------------------------------------------------" -echo - -number_of_stacks=$(ls org-files-preproc/*.nii* | wc -l) -stack_names=$(ls org-files-preproc/*.nii*) - -echo " ... " - -res=128 -monai_lab_num=2 -number_of_stacks=$(find tmp-res-global/ -name "*.nii*" | wc -l) -${mirtk_path}/mirtk prepare-for-monai res-global-files/ global-files/ stack-info.json stack-info.csv ${res} ${number_of_stacks} tmp-res-global/*nii* > tmp.log - -current_monai_check_path=${model_path}/monai-checkpoints-unet-global-loc-2-lab - -mkdir monai-segmentation-results-global -python ${segm_path}/src/run_monai_unet_segmentation-2022.py ${main_dir}/ ${current_monai_check_path}/ stack-info.json ${main_dir}/monai-segmentation-results-global ${res} ${monai_lab_num} - - -number_of_stacks=$(find monai-segmentation-results-global/ -name "*.nii*" | wc -l) -if [ ${number_of_stacks} -eq 0 ];then - - chmod 1777 -R ${output_main_folder}/ - - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: GLOBAL CNN LOCALISATION DID NOT WORK !!!!" - echo "-----------------------------------------------------------------------------" - echo - exit -fi - -echo -echo "-----------------------------------------------------------------------------" -echo "EXTRACTING LABELS ..." -echo "-----------------------------------------------------------------------------" -echo - -out_mask_names=$(ls monai-segmentation-results-global/cnn-*.nii*) -read -rd '' -a all_masks <<<"$out_mask_names" - -org_stack_names=$(ls org-files-preproc/*.nii*) -read -rd '' -a all_org_stacks <<<"$org_stack_names" - - -mkdir out-global-masks -mkdir cropped-stacks-brain -#mkdir cropped-stacks-body -mkdir recon-stacks-brain -#mkdir recon-stacks-body -mkdir masked-cropped-stacks-brain - - -for ((i=0;i<${#all_org_stacks[@]};i++)); -do - echo " - " ${i} " : " ${all_org_stacks[$i]} ${all_masks[$i]} - - jj=$((${i}+1000)) - - ${mirtk_path}/mirtk extract-label ${all_masks[$i]} out-global-masks/mask-body-${jj}.nii.gz 1 1 - ${mirtk_path}/mirtk extract-label ${all_masks[$i]} out-global-masks/mask-brain-${jj}.nii.gz 2 2 - - ${mirtk_path}/mirtk erode-image out-global-masks/mask-brain-${jj}.nii.gz out-global-masks/mask-brain-${jj}.nii.gz -iterations 1 - -# ${mirtk_path}/mirtk extract-connected-components out-global-masks/mask-body-${jj}.nii.gz out-global-masks/mask-body-${jj}.nii.gz -n 1 - ${mirtk_path}/mirtk extract-connected-components out-global-masks/mask-brain-${jj}.nii.gz out-global-masks/mask-brain-${jj}.nii.gz -max-size 950000 -n 1 - - roi=brain -# ${mirtk_path}/mirtk erode-image out-global-masks/mask-${roi}-${jj}.nii.gz out-global-masks/mask-${roi}-${jj}.nii.gz -iterations 2 -# ${mirtk_path}/mirtk dilate-image out-global-masks/mask-brain-${jj}.nii.gz out-global-masks/mask-${roi}-${jj}.nii.gz -iterations 2 - ${mirtk_path}/mirtk dilate-image out-global-masks/mask-${roi}-${jj}.nii.gz dl-m.nii.gz -iterations 3 - ${mirtk_path}/mirtk crop-image ${all_org_stacks[$i]} dl-m.nii.gz cropped-stacks-${roi}/stack-${jj}.nii.gz - cp cropped-stacks-${roi}/stack-${jj}.nii.gz recon-stacks-${roi}/ -# ${mirtk_path}/mirtk mask-image cropped-stacks-${roi}/stack-${jj}.nii.gz dl-m.nii.gz masked-cropped-stacks-${roi}/stack-${jj}.nii.gz - cp cropped-stacks-${roi}/stack-${jj}.nii.gz masked-cropped-stacks-${roi}/stack-${jj}.nii.gz - ${mirtk_path}/mirtk resample-image masked-cropped-stacks-${roi}/stack-${jj}.nii.gz masked-cropped-stacks-${roi}/stack-${jj}.nii.gz -size 1.5 1.5 1.5 - - -done - - -echo -echo "-----------------------------------------------------------------------------" -echo "-----------------------------------------------------------------------------" -echo -echo "LOCAL ROI SEGMENTATION ..." -echo - -cd ${main_dir} - -mkdir recon-masks-brain/ - - -echo -echo "-----------------------------------------------------------------------------" -echo "RUNNING BRAIN SEGMENTATION ..." -echo "-----------------------------------------------------------------------------" -echo - -number_of_stacks=$(ls masked-cropped-stacks-${roi}/*.nii* | wc -l) -stack_names=$(ls masked-cropped-stacks-${roi}/*.nii*) - -echo " ... " - -roi=brain -res=128 -monai_lab_num=1 -${mirtk_path}/mirtk prepare-for-monai res-cropped-files/ again-cropped-files/ cropped-stack-info.json cropped-stack-info.csv ${res} ${number_of_stacks} masked-cropped-stacks-${roi}/*nii* > tmp.log - -current_monai_check_path=${model_path}/monai-checkpoints-atunet-brain_bet_all_degree_raw_stacks-1-lab - -mkdir monai-segmentation-results-stack-brain -python ${segm_path}/src/run_monai_atunet_segmentation-2022.py ${main_dir}/ ${current_monai_check_path}/ cropped-stack-info.json ${main_dir}/monai-segmentation-results-stack-brain ${res} ${monai_lab_num} - -number_of_stacks=$(find monai-segmentation-results-stack-brain/ -name "*.nii*" | wc -l) -if [ ${number_of_stacks} -eq 0 ];then - - chmod 1777 -R ${output_main_folder}/ - - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: brain CNN LOCALISATION DID NOT WORK !!!!" - echo "-----------------------------------------------------------------------------" - echo "note: check whether FetalMRI_MONAI was activated" - echo "conda init bash" - echo "conda activate FetalMRI_MONAI" - echo - exit -fi - -echo -echo "-----------------------------------------------------------------------------" -echo "EXTRACTING LABELS ..." -echo "-----------------------------------------------------------------------------" -echo - -out_mask_names=$(ls monai-segmentation-results-stack-brain/cnn-*.nii*) -read -rd '' -a all_masks <<<"$out_mask_names" - -org_stack_names=$(ls cropped-stacks-${roi}/*.nii*) -read -rd '' -a all_org_stacks <<<"$org_stack_names" - -mkdir masked-cropped-files-brain - -for ((i=0;i<${#all_org_stacks[@]};i++)); -do - echo " - " ${i} " : " ${all_org_stacks[$i]} ${all_masks[$i]} - - jj=$((${i}+1000)) - - ${mirtk_path}/mirtk extract-label ${all_masks[$i]} recon-masks-brain/mask-${jj}.nii.gz 1 1 - ${mirtk_path}/mirtk erode-image recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -iterations 2 - ${mirtk_path}/mirtk extract-connected-components recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -n 1 -max-size 700000 - ${mirtk_path}/mirtk dilate-image recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -iterations 2 - - ${mirtk_path}/mirtk transform-image recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -target recon-stacks-brain/stack-${jj}.nii.gz -labels - - ${mirtk_path}/mirtk centre-volume recon-stacks-brain/stack-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz recon-stacks-brain/stack-${jj}.nii.gz - ${mirtk_path}/mirtk centre-volume recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz - - if [ $motion_correction_mode -eq 1 ]; then - - ${mirtk_path}/mirtk dilate-image recon-masks-brain/mask-${jj}.nii.gz dl.nii.gz -iterations 4 - - ${mirtk_path}/mirtk crop-image recon-stacks-brain/stack-${jj}.nii.gz dl.nii.gz masked-cropped-files-brain/stack-${jj}.nii.gz - ${mirtk_path}/mirtk mask-image masked-cropped-files-brain/stack-${jj}.nii.gz dl.nii.gz masked-cropped-files-brain/stack-${jj}.nii.gz - - ${mirtk_path}/mirtk resample-image masked-cropped-files-brain/stack-${jj}.nii.gz masked-cropped-files-brain/stack-${jj}.nii.gz -size 1 1 1 -interp Linear - fi -done - - -if [ $motion_correction_mode -eq 1 ]; then - - echo - echo "-----------------------------------------------------------------------------" - echo "RUNNING BRAIN ROI REORIENTATION ..." - echo "-----------------------------------------------------------------------------" - echo - - number_of_stacks=$(ls masked-cropped-files-brain/*.nii* | wc -l) - stack_names=$(ls masked-cropped-files-brain/*.nii*) - - echo " ... " - - roi=brain - res=128 - monai_lab_num=5 - ${mirtk_path}/mirtk prepare-for-monai res-cropped-files/ again-cropped-files/ reo-cropped-stack-info.json reo-cropped-stack-info.csv ${res} ${number_of_stacks} masked-cropped-files-brain/*nii* > tmp.log - - current_monai_check_path=${model_path}/monai-checkpoints-unet-svr-brain-reo-raw-stacks-5-lab - -# current_monai_check_path=${model_path}/monai-checkpoints-unet-brain-raw-reo-5-lab-055t - - mkdir monai-segmentation-results-stack-reo - python ${segm_path}/src/run_monai_unet_segmentation-2022.py ${main_dir}/ ${current_monai_check_path}/ reo-cropped-stack-info.json ${main_dir}/monai-segmentation-results-stack-reo ${res} ${monai_lab_num} - - - number_of_stacks=$(find monai-segmentation-results-stack-reo/ -name "*.nii*" | wc -l) - if [ ${number_of_stacks} -eq 0 ];then - - chmod 1777 -R ${output_main_folder}/ - - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: REO CNN LOCALISATION DID NOT WORK !!!!" - echo "-----------------------------------------------------------------------------" - echo - exit - fi - - echo - echo "-----------------------------------------------------------------------------" - echo "EXTRACTING REO LABELS AND REORIENTING ..." - echo "-----------------------------------------------------------------------------" - echo - - out_mask_names=$(ls monai-segmentation-results-stack-reo/cnn-*.nii*) - read -rd '' -a all_masks <<<"$out_mask_names" - - org_stack_names=$(ls cropped-stacks-${roi}/*.nii*) - read -rd '' -a all_org_stacks <<<"$org_stack_names" - - mkdir out-stack-reo-masks - mkdir out-dofs-to-templates - - ${mirtk_path}/mirtk init-dof init.dof - - # mkdir test-org - - - - for ((i=0;i<${#all_org_stacks[@]};i++)); - do - echo " - " ${i} " : " ${all_org_stacks[$i]} ${all_masks[$i]} - - jj=$((${i}+1000)) - - - for ((q=1;q<6;q++)); - do - ${mirtk_path}/mirtk extract-label ${all_masks[$i]} out-stack-reo-masks/mask-${jj}-${q}.nii.gz ${q} ${q} - ${mirtk_path}/mirtk dilate-image out-stack-reo-masks/mask-${jj}-${q}.nii.gz out-stack-reo-masks/mask-${jj}-${q}.nii.gz - ${mirtk_path}/mirtk erode-image out-stack-reo-masks/mask-${jj}-${q}.nii.gz out-stack-reo-masks/mask-${jj}-${q}.nii.gz - ${mirtk_path}/mirtk extract-connected-components out-stack-reo-masks/mask-${jj}-${q}.nii.gz out-stack-reo-masks/mask-${jj}-${q}.nii.gz - # ${mirtk_path}/mirtk transform-image out-stack-reo-masks/mask-${jj}-${q}.nii.gz out-stack-reo-masks/mask-${jj}-${q}.nii.gz -target ${all_org_stacks[$i]} -labels - done - - - - n_roi=4; z1=1; z2=2; z3=3; z4=4; - current_template_path=${template_path}/brain-ref-atlas-2022 - ${mirtk_path}/mirtk register-landmarks mask-${z1}.nii.gz out-stack-reo-masks/mask-${jj}-${z1}.nii.gz init.dof out-dofs-to-templates/dof-to-atl-${jj}.dof 4 4 ${current_template_path}/mask-${z1}.nii.gz ${current_template_path}/mask-${z2}.nii.gz ${current_template_path}/mask-${z3}.nii.gz ${current_template_path}/mask-${z4}.nii.gz out-stack-reo-masks/mask-${jj}-${z1}.nii.gz out-stack-reo-masks/mask-${jj}-${z2}.nii.gz out-stack-reo-masks/mask-${jj}-${z3}.nii.gz out-stack-reo-masks/mask-${jj}-${z4}.nii.gz > tmp.log - - cp out-dofs-to-templates/dof-to-atl-${jj}.dof init.dof - - test_file=out-dofs-to-templates/dof-to-atl-${jj}.dof - if [ ! -f ${test_file} ];then - - chmod 1777 -R ${output_main_folder}/ - - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: REORIENTATION DID NOT WORK !!!!" - echo "-----------------------------------------------------------------------------" - echo - exit - fi - - ${mirtk_path}/mirtk info out-dofs-to-templates/dof-to-atl-${jj}.dof - - ${mirtk_path}/mirtk edit-image recon-stacks-brain/stack-${jj}.nii.gz recon-stacks-brain/stack-${jj}.nii.gz -dofin_i out-dofs-to-templates/dof-to-atl-${jj}.dof - ${mirtk_path}/mirtk edit-image recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -dofin_i out-dofs-to-templates/dof-to-atl-${jj}.dof - - # ${mirtk_path}/mirtk centre-volume recon-stacks-brain/stack-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz recon-stacks-brain/stack-${jj}.nii.gz - # ${mirtk_path}/mirtk centre-volume recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz - - done - - - -fi - - - -echo -echo "-----------------------------------------------------------------------------" -echo "-----------------------------------------------------------------------------" -echo -echo "RUNNING RECONSTRUCTION ..." -echo - -cd ${main_dir} - - -if [ $recon_roi = "brain" ]; then - - echo - echo "-----------------------------------------------------------------------------" - echo "SELECTING STACKS / GENERATING TEMPLATE ..." - echo "-----------------------------------------------------------------------------" - echo - - cd ${main_dir} - - recon_roi_global=brain - - number_of_stacks=$(ls recon-stacks-${recon_roi_global}/*.nii* | wc -l) - stack_names=$(ls recon-stacks-${recon_roi_global}/*.nii*) - mask_names=$(ls recon-masks-${recon_roi}/*.nii*) - - - mkdir proc-stacks-${recon_roi} - - echo " ... " - - mkdir proc-stacks-${recon_roi} - - ${mirtk_path}/mirtk stacks-and-masks-selection ${number_of_stacks} $(echo $stack_names) $(echo $mask_names) proc-stacks-${recon_roi} 15 1 - - - test_file=selected_template.nii.gz - if [ ! -f ${test_file} ];then - echo - echo "-----------------------------------------------------------------------------" - echo "COMPUTING GLOBAL AVERAGE - THE AUTO-SELECTION FAILED ..." - echo "-----------------------------------------------------------------------------" - echo - - ${mirtk_path}/mirtk average-images selected_template.nii.gz recon-stacks-${recon_roi_global}/*.nii* - ${mirtk_path}/mirtk resample-image selected_template.nii.gz selected_template.nii.gz -size 1 1 1 - ${mirtk_path}/mirtk average-images selected_template.nii.gz recon-stacks-${recon_roi_global}/*.nii* -target selected_template.nii.gz - ${mirtk_path}/mirtk average-images average_mask_cnn.nii.gz recon-masks-${recon_roi}/*.nii* -target selected_template.nii.gz - ${mirtk_path}/mirtk convert-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -short - cp recon-stacks-${recon_roi_global}/*.nii* proc-stacks-${recon_roi}/ - - ${mirtk_path}/mirtk mask-image selected_template.nii.gz average_mask_cnn.nii.gz masked-selected_template.nii.gz - - out_mask_names=$(ls recon-masks-${recon_roi}/*.nii*) - read -rd '' -a all_masks <<<"$out_mask_names" - - org_stack_names=$(ls recon-stacks-${recon_roi_global}/*.nii*) - read -rd '' -a all_org_stacks <<<"$org_stack_names" - - ${mirtk_path}/mirtk init-dof init.dof - - for ((i=0;i<${#all_org_stacks[@]};i++)); - do - echo " - " ${i} " ... " - - ${mirtk_path}/mirtk mask-image ${all_org_stacks[$i]} ${all_masks[$i]} tmp-stack.nii.gz - ${mirtk_path}/mirtk register masked-selected_template.nii.gz tmp-stack.nii.gz -model Rigid -dofin init.dof -dofout d.dof -v 0 - ${mirtk_path}/mirtk edit-image ${all_org_stacks[$i]} ${all_org_stacks[$i]} -dofin_i d.dof - ${mirtk_path}/mirtk edit-image ${all_masks[$i]} ${all_masks[$i]} -dofin_i d.dof - done - - ${mirtk_path}/mirtk average-images selected_template.nii.gz recon-stacks-${recon_roi_global}/*.nii* -target selected_template.nii.gz - ${mirtk_path}/mirtk average-images average_mask_cnn.nii.gz recon-masks-${recon_roi}/*.nii* -target selected_template.nii.gz - ${mirtk_path}/mirtk nan selected_template.nii.gz 1000000 - ${mirtk_path}/mirtk convert-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -short - - else - - ${mirtk_path}/mirtk average-images selected_template.nii.gz proc-stacks-${recon_roi}/*nii* - ${mirtk_path}/mirtk resample-image selected_template.nii.gz ref.nii.gz -size 1 1 1 - - ${mirtk_path}/mirtk edit-image ref.nii.gz ref.nii.gz -dx 1.5 -dy 1.5 -dz 1.5 - ${mirtk_path}/mirtk resample-image ref.nii.gz ref.nii.gz -size 1 1 1 - - ${mirtk_path}/mirtk average-images selected_template.nii.gz proc-stacks-${recon_roi}/*nii* -target ref.nii.gz - ${mirtk_path}/mirtk transform-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -target ref.nii.gz -labels - - fi - - current_template_path=${template_path}/brain-stack-reo-template - if [ $motion_correction_mode -eq 1 ]; then - ${mirtk_path}/mirtk resample-image ${template_path}/brain-ref-atlas-2022/ref-space-brain.nii.gz ref.nii.gz -size 1 1 1 - ${mirtk_path}/mirtk transform-image selected_template.nii.gz transf-selected_template.nii.gz -target ref.nii.gz -interp Linear - ${mirtk_path}/mirtk crop-image transf-selected_template.nii.gz transf-selected_template.nii.gz transf-selected_template.nii.gz - else - cp selected_template.nii.gz transf-selected_template.nii.gz - fi - - ${mirtk_path}/mirtk dilate-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -iterations 2 - ${mirtk_path}/mirtk erode-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -iterations 2 - - echo - echo "-----------------------------------------------------------------------------" - echo "SVR RECONSTRUCTION ..." - echo "-----------------------------------------------------------------------------" - echo - - mkdir out-recon-files-${recon_roi} - cd out-recon-files-${recon_roi} - number_of_stacks=$(ls ../proc-stacks-${recon_roi}/*.nii* | wc -l) - - - ${mirtk_path}/mirtk reconstruct tmp-output.nii.gz ${number_of_stacks} ../proc-stacks-${recon_roi}/*.nii* -mask ../average_mask_cnn.nii.gz -template ../transf-selected_template.nii.gz -default_thickness ${default_thickness} -svr_only -iterations 1 -resolution 1.6 -with_background - - - if [ $motion_correction_mode -eq 1 ]; then - - ${mirtk_path}/mirtk reconstruct ../SVR-output-${recon_roi}.nii.gz ${number_of_stacks} ../proc-stacks-${recon_roi}/*.nii* -mask ../average_mask_cnn.nii.gz -template tmp-output.nii.gz -default_thickness ${default_thickness} -iterations 3 -resolution ${recon_resolution} -structural -svr_only -with_background - - else - - ${mirtk_path}/mirtk reconstruct ../SVR-output-${recon_roi}.nii.gz ${number_of_stacks} ../proc-stacks-${recon_roi}/*.nii* -mask ../average_mask_cnn.nii.gz -template tmp-output.nii.gz -default_thickness ${default_thickness} -iterations 3 -resolution ${recon_resolution} -svr_only -with_background - - fi - - -# -delta 110 -lambda 0.018 -lastIter 0.008 ; - - test_file=../SVR-output-${recon_roi}.nii.gz - if [ ! -f ${test_file} ];then - - chmod 1777 -R ${output_main_folder}/ - - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: SVR RECONSTRUCTION DID NOT WORK !!!!" - echo "-----------------------------------------------------------------------------" - echo - exit - fi - - - ${mirtk_path}/mirtk dilate-image ../average_mask_cnn.nii.gz dl.nii.gz -iterations 6 - ${mirtk_path}/mirtk mask-image ../SVR-output-${recon_roi}.nii.gz dl.nii.gz ../SVR-output-${recon_roi}.nii.gz - - ${mirtk_path}/mirtk dilate-image ../average_mask_cnn.nii.gz dl.nii.gz -iterations 2 - ${mirtk_path}/mirtk mask-image ../SVR-output-${recon_roi}.nii.gz dl.nii.gz ../masked-SVR-output-${recon_roi}.nii.gz - - - echo - echo "-----------------------------------------------------------------------------" - echo "REORIENTATION TO THE STANDARD SPACE ..." - echo "-----------------------------------------------------------------------------" - echo - - cd ${main_dir} - - - number_of_stacks=1 - roi=brain - res=128 - monai_lab_num=5 - - echo " ... " - - # ${mirtk_path}/mirtk mask-image SVR-output-${recon_roi}.nii.gz average_mask_cnn.nii.gz masked-SVR-output-${recon_roi}.nii.gz - - ${mirtk_path}/mirtk prepare-for-monai res-svr-files/ svr-files/ reo-svr-info.json reo-svr-info.csv ${res} ${number_of_stacks} masked-SVR-output-${recon_roi}.nii.gz > tmp.log - - current_monai_check_path=${model_path}/monai-checkpoints-unet-svr-brain-reo-5-lab - - mkdir monai-segmentation-results-svr-reo - python ${segm_path}/src/run_monai_unet_segmentation-2022.py ${main_dir}/ ${current_monai_check_path}/ reo-svr-info.json ${main_dir}/monai-segmentation-results-svr-reo ${res} ${monai_lab_num} - - - number_of_stacks=$(find monai-segmentation-results-svr-reo/ -name "*.nii*" | wc -l) - if [ ${number_of_stacks} -eq 0 ];then - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: REO CNN LOCALISATION DID NOT WORK !!!!" - echo "-----------------------------------------------------------------------------" - echo - exit - fi - - mkdir out-svr-reo-masks - for ((q=1;q<6;q++)); - do - ${mirtk_path}/mirtk extract-label monai-segmentation-results-svr-reo/cnn* out-svr-reo-masks/mask-${q}.nii.gz ${q} ${q} - ${mirtk_path}/mirtk dilate-image out-svr-reo-masks/mask-${q}.nii.gz out-svr-reo-masks/mask-${q}.nii.gz -iterations 2 - ${mirtk_path}/mirtk erode-image out-svr-reo-masks/mask-${q}.nii.gz out-svr-reo-masks/mask-${q}.nii.gz -iterations 2 - ${mirtk_path}/mirtk extract-connected-components out-svr-reo-masks/mask-${q}.nii.gz out-svr-reo-masks/mask-${q}.nii.gz -n 1 - - done - - z1=1; z2=2; z3=3; z4=4; n_roi=4; - ${mirtk_path}/mirtk init-dof init.dof - ${mirtk_path}/mirtk register-landmarks ${template_path}/brain-ref-atlas-2022/mask-${z1}.nii.gz ${all_org_stacks[$j]} init.dof dof-to-atl-${recon_roi}.dof ${n_roi} ${n_roi} ${template_path}/brain-ref-atlas-2022/mask-${z1}.nii.gz ${template_path}/brain-ref-atlas-2022/mask-${z2}.nii.gz ${template_path}/brain-ref-atlas-2022/mask-${z3}.nii.gz ${template_path}/brain-ref-atlas-2022/mask-${z4}.nii.gz out-svr-reo-masks/mask-${z1}.nii.gz out-svr-reo-masks/mask-${z2}.nii.gz out-svr-reo-masks/mask-${z3}.nii.gz out-svr-reo-masks/mask-${z4}.nii.gz > tmp.log - - ${mirtk_path}/mirtk info dof-to-atl-${recon_roi}.dof - - ${mirtk_path}/mirtk resample-image ${template_path}/brain-ref-atlas-2022/ref-space-brain.nii.gz ref.nii.gz -size ${recon_resolution} ${recon_resolution} ${recon_resolution} - - ${mirtk_path}/mirtk transform-image SVR-output-${recon_roi}.nii.gz reo-SVR-output-${recon_roi}.nii.gz -target ref.nii.gz -dofin dof-to-atl-${recon_roi}.dof -interp BSpline - ${mirtk_path}/mirtk threshold-image reo-SVR-output-${recon_roi}.nii.gz tmp-m.nii.gz 0.01 - ${mirtk_path}/mirtk crop-image reo-SVR-output-${recon_roi}.nii.gz tmp-m.nii.gz reo-SVR-output-${recon_roi}.nii.gz - ${mirtk_path}/mirtk nan reo-SVR-output-${recon_roi}.nii.gz 100000 - - - test_file=reo-SVR-output-${recon_roi}.nii.gz - if [ ! -f ${test_file} ];then - - chmod 1777 -R ${output_main_folder}/ - - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: REORIENTATION OF RECONSTRUCTED IMAGE DID NOT WORK !!!!" - echo "-----------------------------------------------------------------------------" - echo - exit - fi - - number_of_final_recons=$(ls *SVR-output*.nii* | wc -l) - if [ ${number_of_final_recons} -ne 0 ];then - - cp -r *SVR-output*nii* ${output_main_folder}/ - cp -r average_mask_cnn.nii.gz ${output_main_folder}/ - - chmod 1777 -R ${output_main_folder}/ - - echo "-----------------------------------------------------------------------------" - echo "Reconstructed SVR results are in the output folder : " ${output_main_folder} - echo "-----------------------------------------------------------------------------" - - else - - chmod 1777 -R ${output_main_folder}/ - - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: COULD NOT COPY THE FILES TO THE OUTPUT FOLDER : " ${output_main_folder} - echo "PLEASE CHECK THE WRITE PERMISSIONS / LOCATION !!!" - echo - echo "note: you can still find the recon files in : " ${main_dir} - echo "-----------------------------------------------------------------------------" - echo - exit - fi - -fi - - -echo -echo "-----------------------------------------------------------------------------" -echo "-----------------------------------------------------------------------------" -echo - diff --git a/app/operators/docker-recon-brain-auto.bash b/app/operators/docker-recon-brain-auto.bash deleted file mode 100644 index dbcd2d2..0000000 --- a/app/operators/docker-recon-brain-auto.bash +++ /dev/null @@ -1,870 +0,0 @@ -#!/usr/bin/env bash -l - -# -# SVRTK : SVR reconstruction based on MIRTK -# -# Copyright 2018- King's College London -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -echo -echo "-----------------------------------------------------------------------------" -echo "-----------------------------------------------------------------------------" -echo - -#echo "Setting environment ... " -#echo - - -source ~/.bashrc - -#source /root/.bashrc -# -#eval "$(conda shell.bash hook)" -# -#conda init bash -# -#conda activate FetalMRI_MONAI - -# -#echo "NOTE: UPDATE SOFTWARE PAHTS AS REQUIRED BEFORE RUNNING " -#echo "NOTE: DOWNLOAD MONAI WEIGHTS INTO auto-proc-svrtk/trained_models FOLDER FROM https://gin.g-node.org/SVRTK/fetal_mri_network_weights" -# -#exit - - -software_path=/home - -default_run_dir=/home/tmp_proc - -segm_path=${software_path}/auto-proc-svrtk - -dcm2niix_path=${software_path}/dcm2niix/build/bin - -mirtk_path=${software_path}/MIRTK/build/bin - -template_path=${segm_path}/templates - -model_path=${segm_path}/trained_models - - - - -test_dir=${software_path}/MIRTK -if [ ! -d $test_dir ];then - echo "ERROR: COULD NOT FIND MIRTK INSTALLED IN : " ${software_path} - echo "PLEASE INSTALL OR UPDATE THE PATH software_path VARIABLE IN THE SCRIPT" - exit -fi - -test_dir=${segm_path}/trained_models -if [ ! -d $test_dir ];then - echo "ERROR: COULD NOT FIND SEGMENTATION MODULE INSTALLED IN : " ${software_path} - echo "PLEASE INSTALL OR UPDATE THE PATH software_path VARIABLE IN THE SCRIPT" - exit -fi - - - - -test_dir=${default_run_dir} -if [ ! -d $test_dir ];then - mkdir ${default_run_dir} -else - rm -r ${default_run_dir}/* -fi - -test_dir=${default_run_dir} -if [ ! -d $test_dir ];then - echo "ERROR: COULD NOT CREATE THE PROCESSING FOLDER : " ${default_run_dir} - echo "PLEASE CHECK THE PERMISSIONS OR UPDATE THE PATH default_run_dir VARIABLE IN THE SCRIPT" - exit -fi - - - -echo -echo "-----------------------------------------------------------------------------" -echo "-----------------------------------------------------------------------------" -echo -echo "SVRTK for fetal MRI (KCL): auto brain SVR reconstruction for SSTSE / HASTE T2w fetal MRI" -echo "Source code: https://github.com/SVRTK/auto-proc-svrtk" -echo -echo "-----------------------------------------------------------------------------" -echo "-----------------------------------------------------------------------------" -echo - -if [ $# -ne 2 ] ; then - - if [ $# -ne 6 ] ; then - echo "Usage: bash /home/auto-proc-svrtk/scripts/auto-brain-reconstruction.sh" - echo " [FULL path to the folder with raw T2w stacks in .nii or .dcm, e.g., /home/data/test]" - echo " [FULL path to the folder for recon results, e.g., /home/data/out-test]" - echo " (optional) [motion correction mode (0 or 1): 0 - minor, 1 - >180 degree rotations] - default: 1" - echo " (optional) [slice thickness] - default: 3.0" - echo " (optional) [output recon resolution] - default: 0.8" - echo " (optional) [number of packages] - default: 1" - echo - exit - else - input_main_folder=$1 - output_main_folder=$2 - motion_correction_mode=$3 - default_thickness=$4 - recon_resolution=$5 - num_packages=$6 - fi - -else - input_main_folder=$1 - output_main_folder=$2 - motion_correction_mode=1 - default_thickness=3.0 - recon_resolution=0.8 - num_packages=1 -fi - - -echo " - input folder : " ${input_main_folder} -echo " - output folder : " ${output_main_folder} -echo " - motion correction mode : " ${motion_correction_mode} -echo " - slice thickness : " ${default_thickness} -echo " - output resolution : " ${recon_resolution} - - -recon_roi=brain - - -test_dir=${input_main_folder} -if [ ! -d $test_dir ];then - echo - echo "ERROR: NO FOLDER WITH THE INPUT FILES FOUND !!!!" - exit -fi - - -test_dir=${output_main_folder} -if [ ! -d $test_dir ];then - mkdir ${output_main_folder} - chmod 1777 -R ${output_main_folder}/ -fi - - - -cd ${default_run_dir} -main_dir=$(pwd) - - - -number_of_stacks=$(find ${input_main_folder}/ -name "*.dcm" | wc -l) -if [ $number_of_stacks -gt 0 ];then - echo - echo "-----------------------------------------------------------------------------" - echo "FOUND .dcm FILES - CONVERTING TO .nii.gz !!!!" - echo "-----------------------------------------------------------------------------" - echo - cd ${input_main_folder}/ - ${dcm2niix_path}/dcm2niix -z y . - cd ${main_dir}/ -fi - - - -number_of_stacks=$(find ${input_main_folder}/ -name "*.nii*" | wc -l) -if [ $number_of_stacks -eq 0 ];then - - chmod 1777 -R ${output_main_folder}/ - - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: NO INPUT .nii / .nii.gz FILES FOUND !!!!" - echo "-----------------------------------------------------------------------------" - echo - exit -fi - -mkdir ${default_run_dir}/org-files -find ${input_main_folder}/ -name "*.nii*" -exec cp {} ${default_run_dir}/org-files \; - - -number_of_stacks=$(find ${default_run_dir}/org-files -name "*SVR-output*.nii*" | wc -l) -if [ $number_of_stacks -gt 0 ];then - echo - echo "-----------------------------------------------------------------------------" - echo "WARNING: FOUND ALREADY EXISTING *SVR-output* FILES IN THE DATA FOLDER !!!!" - echo "-----------------------------------------------------------------------------" - echo "note: they won't be used in reconstruction" - echo - rm ${default_run_dir}/org-files/"*SVR-output*.nii*" -fi - -number_of_stacks=$(find ${default_run_dir}/org-files -name "*mask*.nii*" | wc -l) -if [ $number_of_stacks -gt 0 ];then - - echo - echo "-----------------------------------------------------------------------------" - echo "WARNING: FOUND *mask* FILES IN THE DATA FOLDER !!!!" - echo "-----------------------------------------------------------------------------" - echo "note: they won't be used in reconstruction" - echo - rm ${default_run_dir}/org-files/"*mask*.nii*" -fi - -echo -echo "-----------------------------------------------------------------------------" -echo "-----------------------------------------------------------------------------" -echo -echo "PREPROCESSING ..." -echo - -cd ${default_run_dir} - - -mkdir org-files-preproc -cp org-files/* org-files-preproc - -cd org-files-preproc - -stack_names=$(ls *.nii*) -read -rd '' -a all_stacks <<<"$stack_names" - -echo -echo "-----------------------------------------------------------------------------" -echo "REMOVING NAN & NEGATIVE/EXTREME VALUES & SPLITTING INTO DYNAMICS ..." -echo "-----------------------------------------------------------------------------" -echo - -for ((i=0;i<${#all_stacks[@]};i++)); -do - echo " - " ${i} " : " ${all_stacks[$i]} - - st=${all_stacks[$i]} - st=$(echo ${st//.nii.gz\//\.nii.gz}) - st=$(echo ${st//.nii\//\.nii}) - - ${mirtk_path}/mirtk nan ${st} 100000 - ${mirtk_path}/mirtk extract-image-region ${st} ${st} -split t - rm ${st} -done - - -stack_names=$(ls *.nii*) -read -rd '' -a all_stacks <<<"$stack_names" - - -if [ $num_packages -ne 1 ]; then - echo - echo "-----------------------------------------------------------------------------" - echo "SPLITTING INTO PACKAGES ..." - echo "-----------------------------------------------------------------------------" - echo - - for ((i=0;i<${#all_stacks[@]};i++)); - do - echo " - " ${i} " : " ${all_stacks[$i]} - - st=${all_stacks[$i]} - st=$(echo ${st//.nii.gz\//\.nii.gz}) - st=$(echo ${st//.nii\//\.nii}) - - ${mirtk_path}/mirtk extract-packages ${st} ${num_packages} - - rm ${st} - rm package-template.nii.gz - - done -fi - - - mkdir ${default_run_dir}/tmp-res-global - - stack_names=$(ls *.nii*) - read -rd '' -a all_stacks <<<"$stack_names" - - echo - echo "-----------------------------------------------------------------------------" - echo "PREPROCESSING FOR LOCALISATION ..." - echo "-----------------------------------------------------------------------------" - echo - - for ((i=0;i<${#all_stacks[@]};i++)); - do - echo " - " ${i} " : " ${all_stacks[$i]} - - st=${all_stacks[$i]} - st=$(echo ${st//.nii.gz\//\.nii.gz}) - st=$(echo ${st//.nii\//\.nii}) - - jj=$((${i}+1000)) - - ${mirtk_path}/mirtk resample-image ${st} ${main_dir}/tmp-res-global/stack-${jj}.nii.gz -size 1.5 1.5 1.5 - - done - - -echo -echo "-----------------------------------------------------------------------------" -echo "-----------------------------------------------------------------------------" -echo -echo "GLOBAL LOCALISATION SEGMENTATION..." -echo - -cd ${main_dir} - -echo -echo "-----------------------------------------------------------------------------" -echo "RUNNING GLOBAL BODY+BRAIN LOCALISATION ..." -echo "-----------------------------------------------------------------------------" -echo - -number_of_stacks=$(ls org-files-preproc/*.nii* | wc -l) -stack_names=$(ls org-files-preproc/*.nii*) - -echo " ... " - -res=128 -monai_lab_num=2 -number_of_stacks=$(find tmp-res-global/ -name "*.nii*" | wc -l) -${mirtk_path}/mirtk prepare-for-monai res-global-files/ global-files/ stack-info.json stack-info.csv ${res} ${number_of_stacks} tmp-res-global/*nii* > tmp.log - -current_monai_check_path=${model_path}/monai-checkpoints-unet-global-loc-2-lab - -mkdir monai-segmentation-results-global -python ${segm_path}/src/run_monai_unet_segmentation-2022.py ${main_dir}/ ${current_monai_check_path}/ stack-info.json ${main_dir}/monai-segmentation-results-global ${res} ${monai_lab_num} - - -number_of_stacks=$(find monai-segmentation-results-global/ -name "*.nii*" | wc -l) -if [ ${number_of_stacks} -eq 0 ];then - - chmod 1777 -R ${output_main_folder}/ - - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: GLOBAL CNN LOCALISATION DID NOT WORK !!!!" - echo "-----------------------------------------------------------------------------" - echo - exit -fi - -echo -echo "-----------------------------------------------------------------------------" -echo "EXTRACTING LABELS ..." -echo "-----------------------------------------------------------------------------" -echo - -out_mask_names=$(ls monai-segmentation-results-global/cnn-*.nii*) -read -rd '' -a all_masks <<<"$out_mask_names" - -org_stack_names=$(ls org-files-preproc/*.nii*) -read -rd '' -a all_org_stacks <<<"$org_stack_names" - - -mkdir out-global-masks -mkdir cropped-stacks-brain -#mkdir cropped-stacks-body -mkdir recon-stacks-brain -#mkdir recon-stacks-body -mkdir masked-cropped-stacks-brain - - -for ((i=0;i<${#all_org_stacks[@]};i++)); -do - echo " - " ${i} " : " ${all_org_stacks[$i]} ${all_masks[$i]} - - jj=$((${i}+1000)) - - ${mirtk_path}/mirtk extract-label ${all_masks[$i]} out-global-masks/mask-body-${jj}.nii.gz 1 1 - ${mirtk_path}/mirtk extract-label ${all_masks[$i]} out-global-masks/mask-brain-${jj}.nii.gz 2 2 - - ${mirtk_path}/mirtk erode-image out-global-masks/mask-brain-${jj}.nii.gz out-global-masks/mask-brain-${jj}.nii.gz -iterations 1 - -# ${mirtk_path}/mirtk extract-connected-components out-global-masks/mask-body-${jj}.nii.gz out-global-masks/mask-body-${jj}.nii.gz -n 1 - ${mirtk_path}/mirtk extract-connected-components out-global-masks/mask-brain-${jj}.nii.gz out-global-masks/mask-brain-${jj}.nii.gz -max-size 950000 -n 1 - - roi=brain -# ${mirtk_path}/mirtk erode-image out-global-masks/mask-${roi}-${jj}.nii.gz out-global-masks/mask-${roi}-${jj}.nii.gz -iterations 2 -# ${mirtk_path}/mirtk dilate-image out-global-masks/mask-brain-${jj}.nii.gz out-global-masks/mask-${roi}-${jj}.nii.gz -iterations 2 - ${mirtk_path}/mirtk dilate-image out-global-masks/mask-${roi}-${jj}.nii.gz dl-m.nii.gz -iterations 3 - ${mirtk_path}/mirtk crop-image ${all_org_stacks[$i]} dl-m.nii.gz cropped-stacks-${roi}/stack-${jj}.nii.gz - cp cropped-stacks-${roi}/stack-${jj}.nii.gz recon-stacks-${roi}/ -# ${mirtk_path}/mirtk mask-image cropped-stacks-${roi}/stack-${jj}.nii.gz dl-m.nii.gz masked-cropped-stacks-${roi}/stack-${jj}.nii.gz - cp cropped-stacks-${roi}/stack-${jj}.nii.gz masked-cropped-stacks-${roi}/stack-${jj}.nii.gz - ${mirtk_path}/mirtk resample-image masked-cropped-stacks-${roi}/stack-${jj}.nii.gz masked-cropped-stacks-${roi}/stack-${jj}.nii.gz -size 1.5 1.5 1.5 - - -done - - -echo -echo "-----------------------------------------------------------------------------" -echo "-----------------------------------------------------------------------------" -echo -echo "LOCAL ROI SEGMENTATION ..." -echo - -cd ${main_dir} - -mkdir recon-masks-brain/ - - -echo -echo "-----------------------------------------------------------------------------" -echo "RUNNING BRAIN SEGMENTATION ..." -echo "-----------------------------------------------------------------------------" -echo - -number_of_stacks=$(ls masked-cropped-stacks-${roi}/*.nii* | wc -l) -stack_names=$(ls masked-cropped-stacks-${roi}/*.nii*) - -echo " ... " - -roi=brain -res=128 -monai_lab_num=1 -${mirtk_path}/mirtk prepare-for-monai res-cropped-files/ again-cropped-files/ cropped-stack-info.json cropped-stack-info.csv ${res} ${number_of_stacks} masked-cropped-stacks-${roi}/*nii* > tmp.log - -current_monai_check_path=${model_path}/monai-checkpoints-atunet-brain_bet_all_degree_raw_stacks-1-lab - -mkdir monai-segmentation-results-stack-brain -python ${segm_path}/src/run_monai_atunet_segmentation-2022.py ${main_dir}/ ${current_monai_check_path}/ cropped-stack-info.json ${main_dir}/monai-segmentation-results-stack-brain ${res} ${monai_lab_num} - -number_of_stacks=$(find monai-segmentation-results-stack-brain/ -name "*.nii*" | wc -l) -if [ ${number_of_stacks} -eq 0 ];then - - chmod 1777 -R ${output_main_folder}/ - - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: brain CNN LOCALISATION DID NOT WORK !!!!" - echo "-----------------------------------------------------------------------------" - echo "note: check whether FetalMRI_MONAI was activated" - echo "conda init bash" - echo "conda activate FetalMRI_MONAI" - echo - exit -fi - -echo -echo "-----------------------------------------------------------------------------" -echo "EXTRACTING LABELS ..." -echo "-----------------------------------------------------------------------------" -echo - -out_mask_names=$(ls monai-segmentation-results-stack-brain/cnn-*.nii*) -read -rd '' -a all_masks <<<"$out_mask_names" - -org_stack_names=$(ls cropped-stacks-${roi}/*.nii*) -read -rd '' -a all_org_stacks <<<"$org_stack_names" - -mkdir masked-cropped-files-brain - -for ((i=0;i<${#all_org_stacks[@]};i++)); -do - echo " - " ${i} " : " ${all_org_stacks[$i]} ${all_masks[$i]} - - jj=$((${i}+1000)) - - ${mirtk_path}/mirtk extract-label ${all_masks[$i]} recon-masks-brain/mask-${jj}.nii.gz 1 1 - ${mirtk_path}/mirtk erode-image recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -iterations 2 - ${mirtk_path}/mirtk extract-connected-components recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -n 1 -max-size 700000 - ${mirtk_path}/mirtk dilate-image recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -iterations 2 - - ${mirtk_path}/mirtk transform-image recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -target recon-stacks-brain/stack-${jj}.nii.gz -labels - - ${mirtk_path}/mirtk centre-volume recon-stacks-brain/stack-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz recon-stacks-brain/stack-${jj}.nii.gz - ${mirtk_path}/mirtk centre-volume recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz - - if [ $motion_correction_mode -eq 1 ]; then - - ${mirtk_path}/mirtk dilate-image recon-masks-brain/mask-${jj}.nii.gz dl.nii.gz -iterations 4 - - ${mirtk_path}/mirtk crop-image recon-stacks-brain/stack-${jj}.nii.gz dl.nii.gz masked-cropped-files-brain/stack-${jj}.nii.gz - ${mirtk_path}/mirtk mask-image masked-cropped-files-brain/stack-${jj}.nii.gz dl.nii.gz masked-cropped-files-brain/stack-${jj}.nii.gz - - ${mirtk_path}/mirtk resample-image masked-cropped-files-brain/stack-${jj}.nii.gz masked-cropped-files-brain/stack-${jj}.nii.gz -size 1 1 1 -interp Linear - fi -done - - -if [ $motion_correction_mode -eq 1 ]; then - - echo - echo "-----------------------------------------------------------------------------" - echo "RUNNING BRAIN ROI REORIENTATION ..." - echo "-----------------------------------------------------------------------------" - echo - - number_of_stacks=$(ls masked-cropped-files-brain/*.nii* | wc -l) - stack_names=$(ls masked-cropped-files-brain/*.nii*) - - echo " ... " - - roi=brain - res=128 - monai_lab_num=5 - ${mirtk_path}/mirtk prepare-for-monai res-cropped-files/ again-cropped-files/ reo-cropped-stack-info.json reo-cropped-stack-info.csv ${res} ${number_of_stacks} masked-cropped-files-brain/*nii* > tmp.log - - current_monai_check_path=${model_path}/monai-checkpoints-unet-svr-brain-reo-raw-stacks-5-lab - -# current_monai_check_path=${model_path}/monai-checkpoints-unet-brain-raw-reo-5-lab-055t - - mkdir monai-segmentation-results-stack-reo - python ${segm_path}/src/run_monai_unet_segmentation-2022.py ${main_dir}/ ${current_monai_check_path}/ reo-cropped-stack-info.json ${main_dir}/monai-segmentation-results-stack-reo ${res} ${monai_lab_num} - - - number_of_stacks=$(find monai-segmentation-results-stack-reo/ -name "*.nii*" | wc -l) - if [ ${number_of_stacks} -eq 0 ];then - - chmod 1777 -R ${output_main_folder}/ - - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: REO CNN LOCALISATION DID NOT WORK !!!!" - echo "-----------------------------------------------------------------------------" - echo - exit - fi - - echo - echo "-----------------------------------------------------------------------------" - echo "EXTRACTING REO LABELS AND REORIENTING ..." - echo "-----------------------------------------------------------------------------" - echo - - out_mask_names=$(ls monai-segmentation-results-stack-reo/cnn-*.nii*) - read -rd '' -a all_masks <<<"$out_mask_names" - - org_stack_names=$(ls cropped-stacks-${roi}/*.nii*) - read -rd '' -a all_org_stacks <<<"$org_stack_names" - - mkdir out-stack-reo-masks - mkdir out-dofs-to-templates - - ${mirtk_path}/mirtk init-dof init.dof - - # mkdir test-org - - - - for ((i=0;i<${#all_org_stacks[@]};i++)); - do - echo " - " ${i} " : " ${all_org_stacks[$i]} ${all_masks[$i]} - - jj=$((${i}+1000)) - - - for ((q=1;q<6;q++)); - do - ${mirtk_path}/mirtk extract-label ${all_masks[$i]} out-stack-reo-masks/mask-${jj}-${q}.nii.gz ${q} ${q} - ${mirtk_path}/mirtk dilate-image out-stack-reo-masks/mask-${jj}-${q}.nii.gz out-stack-reo-masks/mask-${jj}-${q}.nii.gz - ${mirtk_path}/mirtk erode-image out-stack-reo-masks/mask-${jj}-${q}.nii.gz out-stack-reo-masks/mask-${jj}-${q}.nii.gz - ${mirtk_path}/mirtk extract-connected-components out-stack-reo-masks/mask-${jj}-${q}.nii.gz out-stack-reo-masks/mask-${jj}-${q}.nii.gz - # ${mirtk_path}/mirtk transform-image out-stack-reo-masks/mask-${jj}-${q}.nii.gz out-stack-reo-masks/mask-${jj}-${q}.nii.gz -target ${all_org_stacks[$i]} -labels - done - - - - n_roi=4; z1=1; z2=2; z3=3; z4=4; - current_template_path=${template_path}/brain-ref-atlas-2022 - ${mirtk_path}/mirtk register-landmarks mask-${z1}.nii.gz out-stack-reo-masks/mask-${jj}-${z1}.nii.gz init.dof out-dofs-to-templates/dof-to-atl-${jj}.dof 4 4 ${current_template_path}/mask-${z1}.nii.gz ${current_template_path}/mask-${z2}.nii.gz ${current_template_path}/mask-${z3}.nii.gz ${current_template_path}/mask-${z4}.nii.gz out-stack-reo-masks/mask-${jj}-${z1}.nii.gz out-stack-reo-masks/mask-${jj}-${z2}.nii.gz out-stack-reo-masks/mask-${jj}-${z3}.nii.gz out-stack-reo-masks/mask-${jj}-${z4}.nii.gz > tmp.log - - cp out-dofs-to-templates/dof-to-atl-${jj}.dof init.dof - - test_file=out-dofs-to-templates/dof-to-atl-${jj}.dof - if [ ! -f ${test_file} ];then - - chmod 1777 -R ${output_main_folder}/ - - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: REORIENTATION DID NOT WORK !!!!" - echo "-----------------------------------------------------------------------------" - echo - exit - fi - - ${mirtk_path}/mirtk info out-dofs-to-templates/dof-to-atl-${jj}.dof - - ${mirtk_path}/mirtk edit-image recon-stacks-brain/stack-${jj}.nii.gz recon-stacks-brain/stack-${jj}.nii.gz -dofin_i out-dofs-to-templates/dof-to-atl-${jj}.dof - ${mirtk_path}/mirtk edit-image recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz -dofin_i out-dofs-to-templates/dof-to-atl-${jj}.dof - - # ${mirtk_path}/mirtk centre-volume recon-stacks-brain/stack-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz recon-stacks-brain/stack-${jj}.nii.gz - # ${mirtk_path}/mirtk centre-volume recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz recon-masks-brain/mask-${jj}.nii.gz - - done - - - -fi - - - -echo -echo "-----------------------------------------------------------------------------" -echo "-----------------------------------------------------------------------------" -echo -echo "RUNNING RECONSTRUCTION ..." -echo - -cd ${main_dir} - - -if [ $recon_roi = "brain" ]; then - - echo - echo "-----------------------------------------------------------------------------" - echo "SELECTING STACKS / GENERATING TEMPLATE ..." - echo "-----------------------------------------------------------------------------" - echo - - cd ${main_dir} - - recon_roi_global=brain - - number_of_stacks=$(ls recon-stacks-${recon_roi_global}/*.nii* | wc -l) - stack_names=$(ls recon-stacks-${recon_roi_global}/*.nii*) - mask_names=$(ls recon-masks-${recon_roi}/*.nii*) - - - mkdir proc-stacks-${recon_roi} - - echo " ... " - - mkdir proc-stacks-${recon_roi} - - ${mirtk_path}/mirtk stacks-and-masks-selection ${number_of_stacks} $(echo $stack_names) $(echo $mask_names) proc-stacks-${recon_roi} 15 1 - - - test_file=selected_template.nii.gz - if [ ! -f ${test_file} ];then - echo - echo "-----------------------------------------------------------------------------" - echo "COMPUTING GLOBAL AVERAGE - THE AUTO-SELECTION FAILED ..." - echo "-----------------------------------------------------------------------------" - echo - - ${mirtk_path}/mirtk average-images selected_template.nii.gz recon-stacks-${recon_roi_global}/*.nii* - ${mirtk_path}/mirtk resample-image selected_template.nii.gz selected_template.nii.gz -size 1 1 1 - ${mirtk_path}/mirtk average-images selected_template.nii.gz recon-stacks-${recon_roi_global}/*.nii* -target selected_template.nii.gz - ${mirtk_path}/mirtk average-images average_mask_cnn.nii.gz recon-masks-${recon_roi}/*.nii* -target selected_template.nii.gz - ${mirtk_path}/mirtk convert-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -short - cp recon-stacks-${recon_roi_global}/*.nii* proc-stacks-${recon_roi}/ - - ${mirtk_path}/mirtk mask-image selected_template.nii.gz average_mask_cnn.nii.gz masked-selected_template.nii.gz - - out_mask_names=$(ls recon-masks-${recon_roi}/*.nii*) - read -rd '' -a all_masks <<<"$out_mask_names" - - org_stack_names=$(ls recon-stacks-${recon_roi_global}/*.nii*) - read -rd '' -a all_org_stacks <<<"$org_stack_names" - - ${mirtk_path}/mirtk init-dof init.dof - - for ((i=0;i<${#all_org_stacks[@]};i++)); - do - echo " - " ${i} " ... " - - ${mirtk_path}/mirtk mask-image ${all_org_stacks[$i]} ${all_masks[$i]} tmp-stack.nii.gz - ${mirtk_path}/mirtk register masked-selected_template.nii.gz tmp-stack.nii.gz -model Rigid -dofin init.dof -dofout d.dof -v 0 - ${mirtk_path}/mirtk edit-image ${all_org_stacks[$i]} ${all_org_stacks[$i]} -dofin_i d.dof - ${mirtk_path}/mirtk edit-image ${all_masks[$i]} ${all_masks[$i]} -dofin_i d.dof - done - - ${mirtk_path}/mirtk average-images selected_template.nii.gz recon-stacks-${recon_roi_global}/*.nii* -target selected_template.nii.gz - ${mirtk_path}/mirtk average-images average_mask_cnn.nii.gz recon-masks-${recon_roi}/*.nii* -target selected_template.nii.gz - ${mirtk_path}/mirtk nan selected_template.nii.gz 1000000 - ${mirtk_path}/mirtk convert-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -short - - else - - ${mirtk_path}/mirtk average-images selected_template.nii.gz proc-stacks-${recon_roi}/*nii* - ${mirtk_path}/mirtk resample-image selected_template.nii.gz ref.nii.gz -size 1 1 1 - - ${mirtk_path}/mirtk edit-image ref.nii.gz ref.nii.gz -dx 1.5 -dy 1.5 -dz 1.5 - ${mirtk_path}/mirtk resample-image ref.nii.gz ref.nii.gz -size 1 1 1 - - ${mirtk_path}/mirtk average-images selected_template.nii.gz proc-stacks-${recon_roi}/*nii* -target ref.nii.gz - ${mirtk_path}/mirtk transform-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -target ref.nii.gz -labels - - fi - - current_template_path=${template_path}/brain-stack-reo-template - if [ $motion_correction_mode -eq 1 ]; then - ${mirtk_path}/mirtk resample-image ${template_path}/brain-ref-atlas-2022/ref-space-brain.nii.gz ref.nii.gz -size 1 1 1 - ${mirtk_path}/mirtk transform-image selected_template.nii.gz transf-selected_template.nii.gz -target ref.nii.gz -interp Linear - ${mirtk_path}/mirtk crop-image transf-selected_template.nii.gz transf-selected_template.nii.gz transf-selected_template.nii.gz - else - cp selected_template.nii.gz transf-selected_template.nii.gz - fi - - ${mirtk_path}/mirtk dilate-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -iterations 2 - ${mirtk_path}/mirtk erode-image average_mask_cnn.nii.gz average_mask_cnn.nii.gz -iterations 2 - - echo - echo "-----------------------------------------------------------------------------" - echo "SVR RECONSTRUCTION ..." - echo "-----------------------------------------------------------------------------" - echo - - mkdir out-recon-files-${recon_roi} - cd out-recon-files-${recon_roi} - number_of_stacks=$(ls ../proc-stacks-${recon_roi}/*.nii* | wc -l) - - - ${mirtk_path}/mirtk reconstruct tmp-output.nii.gz ${number_of_stacks} ../proc-stacks-${recon_roi}/*.nii* -mask ../average_mask_cnn.nii.gz -template ../transf-selected_template.nii.gz -default_thickness ${default_thickness} -svr_only -iterations 1 -resolution 1.6 -with_background - - - if [ $motion_correction_mode -eq 1 ]; then - - ${mirtk_path}/mirtk reconstruct ../SVR-output-${recon_roi}.nii.gz ${number_of_stacks} ../proc-stacks-${recon_roi}/*.nii* -mask ../average_mask_cnn.nii.gz -template tmp-output.nii.gz -default_thickness ${default_thickness} -iterations 3 -resolution ${recon_resolution} -structural -svr_only -with_background - - else - - ${mirtk_path}/mirtk reconstruct ../SVR-output-${recon_roi}.nii.gz ${number_of_stacks} ../proc-stacks-${recon_roi}/*.nii* -mask ../average_mask_cnn.nii.gz -template tmp-output.nii.gz -default_thickness ${default_thickness} -iterations 3 -resolution ${recon_resolution} -svr_only -with_background - - fi - - -# -delta 110 -lambda 0.018 -lastIter 0.008 ; - - test_file=../SVR-output-${recon_roi}.nii.gz - if [ ! -f ${test_file} ];then - - chmod 1777 -R ${output_main_folder}/ - - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: SVR RECONSTRUCTION DID NOT WORK !!!!" - echo "-----------------------------------------------------------------------------" - echo - exit - fi - - - ${mirtk_path}/mirtk dilate-image ../average_mask_cnn.nii.gz dl.nii.gz -iterations 6 - ${mirtk_path}/mirtk mask-image ../SVR-output-${recon_roi}.nii.gz dl.nii.gz ../SVR-output-${recon_roi}.nii.gz - - ${mirtk_path}/mirtk dilate-image ../average_mask_cnn.nii.gz dl.nii.gz -iterations 2 - ${mirtk_path}/mirtk mask-image ../SVR-output-${recon_roi}.nii.gz dl.nii.gz ../masked-SVR-output-${recon_roi}.nii.gz - - - echo - echo "-----------------------------------------------------------------------------" - echo "REORIENTATION TO THE STANDARD SPACE ..." - echo "-----------------------------------------------------------------------------" - echo - - cd ${main_dir} - - - number_of_stacks=1 - roi=brain - res=128 - monai_lab_num=5 - - echo " ... " - - # ${mirtk_path}/mirtk mask-image SVR-output-${recon_roi}.nii.gz average_mask_cnn.nii.gz masked-SVR-output-${recon_roi}.nii.gz - - ${mirtk_path}/mirtk prepare-for-monai res-svr-files/ svr-files/ reo-svr-info.json reo-svr-info.csv ${res} ${number_of_stacks} masked-SVR-output-${recon_roi}.nii.gz > tmp.log - - current_monai_check_path=${model_path}/monai-checkpoints-unet-svr-brain-reo-5-lab - - mkdir monai-segmentation-results-svr-reo - python ${segm_path}/src/run_monai_unet_segmentation-2022.py ${main_dir}/ ${current_monai_check_path}/ reo-svr-info.json ${main_dir}/monai-segmentation-results-svr-reo ${res} ${monai_lab_num} - - - number_of_stacks=$(find monai-segmentation-results-svr-reo/ -name "*.nii*" | wc -l) - if [ ${number_of_stacks} -eq 0 ];then - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: REO CNN LOCALISATION DID NOT WORK !!!!" - echo "-----------------------------------------------------------------------------" - echo - exit - fi - - mkdir out-svr-reo-masks - for ((q=1;q<6;q++)); - do - ${mirtk_path}/mirtk extract-label monai-segmentation-results-svr-reo/cnn* out-svr-reo-masks/mask-${q}.nii.gz ${q} ${q} - ${mirtk_path}/mirtk dilate-image out-svr-reo-masks/mask-${q}.nii.gz out-svr-reo-masks/mask-${q}.nii.gz -iterations 2 - ${mirtk_path}/mirtk erode-image out-svr-reo-masks/mask-${q}.nii.gz out-svr-reo-masks/mask-${q}.nii.gz -iterations 2 - ${mirtk_path}/mirtk extract-connected-components out-svr-reo-masks/mask-${q}.nii.gz out-svr-reo-masks/mask-${q}.nii.gz -n 1 - - done - - z1=1; z2=2; z3=3; z4=4; n_roi=4; - ${mirtk_path}/mirtk init-dof init.dof - ${mirtk_path}/mirtk register-landmarks ${template_path}/brain-ref-atlas-2022/mask-${z1}.nii.gz ${all_org_stacks[$j]} init.dof dof-to-atl-${recon_roi}.dof ${n_roi} ${n_roi} ${template_path}/brain-ref-atlas-2022/mask-${z1}.nii.gz ${template_path}/brain-ref-atlas-2022/mask-${z2}.nii.gz ${template_path}/brain-ref-atlas-2022/mask-${z3}.nii.gz ${template_path}/brain-ref-atlas-2022/mask-${z4}.nii.gz out-svr-reo-masks/mask-${z1}.nii.gz out-svr-reo-masks/mask-${z2}.nii.gz out-svr-reo-masks/mask-${z3}.nii.gz out-svr-reo-masks/mask-${z4}.nii.gz > tmp.log - - ${mirtk_path}/mirtk info dof-to-atl-${recon_roi}.dof - - ${mirtk_path}/mirtk resample-image ${template_path}/brain-ref-atlas-2022/ref-space-brain.nii.gz ref.nii.gz -size ${recon_resolution} ${recon_resolution} ${recon_resolution} - - ${mirtk_path}/mirtk transform-image SVR-output-${recon_roi}.nii.gz reo-SVR-output-${recon_roi}.nii.gz -target ref.nii.gz -dofin dof-to-atl-${recon_roi}.dof -interp BSpline - ${mirtk_path}/mirtk threshold-image reo-SVR-output-${recon_roi}.nii.gz tmp-m.nii.gz 0.01 - ${mirtk_path}/mirtk crop-image reo-SVR-output-${recon_roi}.nii.gz tmp-m.nii.gz reo-SVR-output-${recon_roi}.nii.gz - ${mirtk_path}/mirtk nan reo-SVR-output-${recon_roi}.nii.gz 100000 - - - test_file=reo-SVR-output-${recon_roi}.nii.gz - if [ ! -f ${test_file} ];then - - chmod 1777 -R ${output_main_folder}/ - - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: REORIENTATION OF RECONSTRUCTED IMAGE DID NOT WORK !!!!" - echo "-----------------------------------------------------------------------------" - echo - exit - fi - - number_of_final_recons=$(ls *SVR-output*.nii* | wc -l) - if [ ${number_of_final_recons} -ne 0 ];then - - cp -r *SVR-output*nii* ${output_main_folder}/ - cp -r average_mask_cnn.nii.gz ${output_main_folder}/ - - chmod 1777 -R ${output_main_folder}/ - - echo "-----------------------------------------------------------------------------" - echo "Reconstructed SVR results are in the output folder : " ${output_main_folder} - echo "-----------------------------------------------------------------------------" - - else - - chmod 1777 -R ${output_main_folder}/ - - echo - echo "-----------------------------------------------------------------------------" - echo "ERROR: COULD NOT COPY THE FILES TO THE OUTPUT FOLDER : " ${output_main_folder} - echo "PLEASE CHECK THE WRITE PERMISSIONS / LOCATION !!!" - echo - echo "note: you can still find the recon files in : " ${main_dir} - echo "-----------------------------------------------------------------------------" - echo - exit - fi - -fi - - -echo -echo "-----------------------------------------------------------------------------" -echo "-----------------------------------------------------------------------------" -echo - - From 691d5633b0b98b1c89deb5704ce72e280ca1787a Mon Sep 17 00:00:00 2001 From: Alena Ulla Uus Date: Thu, 28 Sep 2023 11:29:49 +0100 Subject: [PATCH 06/11] script path and version updates --- README.md | 10 +++++----- app/Dockerfile | 16 +++++++++------- .../fetal_mri_3d_brain_recon_operator.py | 2 +- .../fetal-brain-3d-recon-argo-template.yaml | 2 +- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 7c81203..6184a0a 100644 --- a/README.md +++ b/README.md @@ -101,14 +101,14 @@ The final MAP is called `map` monai-deploy package app -t ghcr.io/svrtk/aide-svrtk/map-init:0.2.0 -r requirements.txt -l DEBUG # Build 3rd-party software on top of MAP -docker build -t ghcr.io/svrtk/aide-svrtk/map:0.2.0 app/ +docker build -t ghcr.io/svrtk/aide-svrtk/map:0.2.1 app/ # Test MAP with MONAI Deploy -monai-deploy run ghcr.io/svrtk/aide-svrtk/map:0.2.0 input/ output/ +monai-deploy run ghcr.io/svrtk/aide-svrtk/map:0.2.1 input/ output/ # Push initial MAP and final MAP to GHCR docker push ghcr.io/svrtk/aide-svrtk/map-init:0.2.0 -docker push ghcr.io/svrtk/aide-svrtk/map:0.2.0 +docker push ghcr.io/svrtk/aide-svrtk/map:0.2.1 ``` ## Optional @@ -116,13 +116,13 @@ docker push ghcr.io/svrtk/aide-svrtk/map:0.2.0 Enter Docker container for testing ```shell -docker run --gpus all -it --rm -v local/path/to/aide-svrtk/input:/var/monai/input/ --entrypoint /bin/bash ghcr.io/svrtk/aide-svrtk/map:0.2.0 +docker run --gpus all -it --rm -v local/path/to/aide-svrtk/input:/var/monai/input/ --entrypoint /bin/bash ghcr.io/svrtk/aide-svrtk/map:0.2.1 ``` Run on specified GPU if machine has >1 available ```shell -CUDA_VISIBLE_DEVICES=2 monai-deploy run ghcr.io/svrtk/aide-svrtk/map:0.2.0 input/ output/ +CUDA_VISIBLE_DEVICES=2 monai-deploy run ghcr.io/svrtk/aide-svrtk/map:0.2.1 input/ output/ ``` ## Running on AIDE diff --git a/app/Dockerfile b/app/Dockerfile index 8c216ad..7997d24 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -1,4 +1,4 @@ -FROM ghcr.io/svrtk/aide-svrtk/map-init:0.2.0 AS build +FROM ghcr.io/svrtk/aide-svrtk/map-init:0.2.1 AS build # Add dcm2niix to MAP WORKDIR /bin @@ -56,10 +56,10 @@ WORKDIR /home # Setup 3D UNet models RUN git clone https://github.com/SVRTK/auto-proc-svrtk.git /home/auto-proc-svrtk -RUN wget https://gin.g-node.org/SVRTK/fetal_mri_network_weights/raw/master/monai-checkpoints-atunet-brain_bet_all_degree_raw_stacks-1-lab/best_metric_model.pth -P /home/auto-proc-svrtk/trained-models/monai-checkpoints-atunet-brain_bet_all_degree_raw_stacks-1-lab \ - && wget https://gin.g-node.org/SVRTK/fetal_mri_network_weights/raw/master/monai-checkpoints-unet-global-loc-2-lab/best_metric_model.pth -P /home/auto-proc-svrtk/trained-models/monai-checkpoints-unet-global-loc-2-lab \ - && wget https://gin.g-node.org/SVRTK/fetal_mri_network_weights/raw/master/monai-checkpoints-unet-svr-brain-reo-5-lab/best_metric_model.pth -P /home/auto-proc-svrtk/trained-models/monai-checkpoints-unet-svr-brain-reo-5-lab \ - && wget https://gin.g-node.org/SVRTK/fetal_mri_network_weights/raw/master/monai-checkpoints-unet-svr-brain-reo-raw-stacks-5-lab/best_metric_model.pth -P /home/auto-proc-svrtk/trained-models/monai-checkpoints-unet-svr-brain-reo-raw-stacks-5-lab +RUN wget https://gin.g-node.org/SVRTK/fetal_mri_network_weights/raw/master/monai-checkpoints-atunet-brain_bet_all_degree_raw_stacks-1-lab/best_metric_model.pth -P /home/auto-proc-svrtk/trained_models/monai-checkpoints-atunet-brain_bet_all_degree_raw_stacks-1-lab \ + && wget https://gin.g-node.org/SVRTK/fetal_mri_network_weights/raw/master/monai-checkpoints-unet-global-loc-2-lab/best_metric_model.pth -P /home/auto-proc-svrtk/trained_models/monai-checkpoints-unet-global-loc-2-lab \ + && wget https://gin.g-node.org/SVRTK/fetal_mri_network_weights/raw/master/monai-checkpoints-unet-svr-brain-reo-5-lab/best_metric_model.pth -P /home/auto-proc-svrtk/trained_models/monai-checkpoints-unet-svr-brain-reo-5-lab \ + && wget https://gin.g-node.org/SVRTK/fetal_mri_network_weights/raw/master/monai-checkpoints-unet-svr-brain-reo-raw-stacks-5-lab/best_metric_model.pth -P /home/auto-proc-svrtk/trained_models/monai-checkpoints-unet-svr-brain-reo-raw-stacks-5-lab # Install Python packages RUN python -m pip install -r /home/auto-proc-svrtk/config/requirements.txt @@ -70,9 +70,11 @@ RUN python -m pip install -r /home/auto-proc-svrtk/config/requirements.txt ENV PATH="${PATH}:/opt/hpcx/ompi/bin" ENV LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/opt/hpcx/ompi/lib" -COPY /home/auto-proc-svrtk/scripts/auto-brain-reconstruction-aide.sh /home/scripts/auto-brain-reconstruction.sh +#COPY /home/auto-proc-svrtk/scripts/auto-brain-reconstruction-aide.sh /home/scripts/auto-brain-reconstruction.sh + RUN mkdir -p /home/recon \ && mkdir -p /home/output \ - && chmod +x /home/scripts/* + && chmod +x /home/scripts/* \ + && chmod +x /home/auto-proc-svrtk/scripts/* \ WORKDIR /var/monai diff --git a/app/operators/fetal_mri_3d_brain_recon_operator.py b/app/operators/fetal_mri_3d_brain_recon_operator.py index 72736ab..a65c621 100644 --- a/app/operators/fetal_mri_3d_brain_recon_operator.py +++ b/app/operators/fetal_mri_3d_brain_recon_operator.py @@ -44,7 +44,7 @@ def compute(self, op_input: InputContext, op_output: OutputContext, context: Exe # logging.info("SVRTK reconstruction ...") subprocess.run([ - "/home/scripts/docker-recon-brain-auto.bash", + "/home/scripts/auto-brain-reconstruction-aide.sh", nii_stacks_path, operator_workdir ]) diff --git a/app/workflows/fetal-brain-3d-recon-argo-template.yaml b/app/workflows/fetal-brain-3d-recon-argo-template.yaml index 9fabda8..e493108 100644 --- a/app/workflows/fetal-brain-3d-recon-argo-template.yaml +++ b/app/workflows/fetal-brain-3d-recon-argo-template.yaml @@ -32,7 +32,7 @@ spec: metadata: {} container: name: '' - image: ghcr.io/svrtk/aide-svrtk/map:0.2.0 + image: ghcr.io/svrtk/aide-svrtk/map:0.2.1 command: - /bin/bash - '-c' From f44dc9dac500368b06d7cdea98ca582c891af961 Mon Sep 17 00:00:00 2001 From: Alena Ulla Uus Date: Sun, 1 Oct 2023 12:25:46 +0100 Subject: [PATCH 07/11] updated file paths --- app/Dockerfile | 1 + app/operators/fetal_mri_3d_brain_recon_operator.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Dockerfile b/app/Dockerfile index 7997d24..7638cf3 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -74,6 +74,7 @@ ENV LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/opt/hpcx/ompi/lib" RUN mkdir -p /home/recon \ && mkdir -p /home/output \ + && mkdir -p /home/scripts \ && chmod +x /home/scripts/* \ && chmod +x /home/auto-proc-svrtk/scripts/* \ diff --git a/app/operators/fetal_mri_3d_brain_recon_operator.py b/app/operators/fetal_mri_3d_brain_recon_operator.py index a65c621..08bddfb 100644 --- a/app/operators/fetal_mri_3d_brain_recon_operator.py +++ b/app/operators/fetal_mri_3d_brain_recon_operator.py @@ -44,7 +44,7 @@ def compute(self, op_input: InputContext, op_output: OutputContext, context: Exe # logging.info("SVRTK reconstruction ...") subprocess.run([ - "/home/scripts/auto-brain-reconstruction-aide.sh", + "/home/auto-proc-svrtk/scripts/auto-brain-reconstruction-aide.sh", nii_stacks_path, operator_workdir ]) From 451c02ef406b8246dcbe83642333a72c2722cf99 Mon Sep 17 00:00:00 2001 From: Alena Ulla Uus Date: Sun, 1 Oct 2023 13:07:02 +0100 Subject: [PATCH 08/11] map version update --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6184a0a..88d5c74 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ The final MAP is called `map` ```shell # Initial packaging of MAP -monai-deploy package app -t ghcr.io/svrtk/aide-svrtk/map-init:0.2.0 -r requirements.txt -l DEBUG +monai-deploy package app -t ghcr.io/svrtk/aide-svrtk/map-init:0.2.1 -r requirements.txt -l DEBUG # Build 3rd-party software on top of MAP docker build -t ghcr.io/svrtk/aide-svrtk/map:0.2.1 app/ @@ -107,7 +107,7 @@ docker build -t ghcr.io/svrtk/aide-svrtk/map:0.2.1 app/ monai-deploy run ghcr.io/svrtk/aide-svrtk/map:0.2.1 input/ output/ # Push initial MAP and final MAP to GHCR -docker push ghcr.io/svrtk/aide-svrtk/map-init:0.2.0 +docker push ghcr.io/svrtk/aide-svrtk/map-init:0.2.1 docker push ghcr.io/svrtk/aide-svrtk/map:0.2.1 ``` From c76b8e65d3ee8833996bb736fc6a070dd90f7c44 Mon Sep 17 00:00:00 2001 From: Alena Ulla Uus Date: Sun, 1 Oct 2023 13:30:20 +0100 Subject: [PATCH 09/11] updated docker file --- app/Dockerfile | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/Dockerfile b/app/Dockerfile index 7638cf3..2127892 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -72,10 +72,11 @@ ENV LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/opt/hpcx/ompi/lib" #COPY /home/auto-proc-svrtk/scripts/auto-brain-reconstruction-aide.sh /home/scripts/auto-brain-reconstruction.sh -RUN mkdir -p /home/recon \ - && mkdir -p /home/output \ - && mkdir -p /home/scripts \ - && chmod +x /home/scripts/* \ - && chmod +x /home/auto-proc-svrtk/scripts/* \ + +RUN mkdir -p /home/recon +RUN mkdir -p /home/output +RUN mkdir -p /home/scripts +RUN chmod +x /home/auto-proc-svrtk/scripts/* + WORKDIR /var/monai From 2c6f200e7e3690d07edea5537692cdbcf5322245 Mon Sep 17 00:00:00 2001 From: Alena Ulla Uus Date: Sun, 1 Oct 2023 15:12:32 +0100 Subject: [PATCH 10/11] updated description with auto-proc-svrtk ref. --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 88d5c74..b9b61f0 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@

aide-svrtk

- AI-driven, automated SVR reconstruction packaged as an AIDE Application, based on + AI-driven, automated version of SVR reconstruction packaged as an AIDE Application, based on the open-source MONAI Application Package (MAP) standard.
@@ -20,14 +20,14 @@ The slice-to-volume reconstruction toolkit ([SVRTK](https://github.com/SVRTK/SVRTK)) is an image-based registration framework for reconstruction of 3D volumes from multiple 2D image slices. SVRTK is used extensively for performing -motion-corrected reconstruction of MRI data. +motion-corrected reconstruction of MRI data. The [automated SVR](https://github.com/SVRTK/auto-proc-svrtk) version employs deep learning [MONAI](https://github.com/Project-MONAI/MONAI) networks for localisation and reorientation of the brain to the standard radiological space. Currently, this MAP implements SVRTK for reconstruction of 2D **fetal brain MRI** data into motion-corrected 3D volumes. Further MAPs for reconstruction of other fetal organs are in development and coming soon. [AIDE](https://www.aicentre.co.uk/platforms#view1) is an open-source platform for the deployment of AI applications in -healthcare settings. This repo, created and led by [Tom Roberts](https://github.com/tomaroberts), packages automated -3D fetal brain MRI reconstruction into a [MONAI Application Package (MAP)](https://github.com/Project-MONAI/monai-deploy) +healthcare settings. This repo, created and led by [Tom Roberts](https://github.com/tomaroberts), packages [automated +3D fetal brain MRI reconstruction](https://github.com/SVRTK/auto-proc-svrtk) into a [MONAI Application Package (MAP)](https://github.com/Project-MONAI/monai-deploy) for execution on AIDE, and other platforms compatible with the MAP standard. ## aide-svrtk MAP workflow @@ -38,7 +38,7 @@ MRI DICOM Series contained the motion-corrected reconstruction. The aide-svrtk MAP consists of three operators: 1. `dcm2nii_operator.py` – converts the input 2D MRI DICOM Series into NIfTI format required by SVRTK, using [dcm2niix](https://github.com/rordenlab/dcm2niix) -2. `fetal_mri_3d_brain_recon_operator.py` – runs automated fetal brain SVRTK reconstruction, in three main steps: +2. `fetal_mri_3d_brain_recon_operator.py` – runs [automated fetal brain SVRTK reconstruction](https://github.com/SVRTK/auto-proc-svrtk), in three main steps: a. AI-driven brain masking b. Slice-to-volume registration reconstruction c. AI-driven brain reorientation From cd69bfeb388cf21c94481b142806d0a6e1234d84 Mon Sep 17 00:00:00 2001 From: Tom Roberts Date: Thu, 12 Oct 2023 14:27:28 +0100 Subject: [PATCH 11/11] Updates Clinical Workflow file to reflect v0.2.1 --- app/workflows/fetal-3d-brain-mri.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/workflows/fetal-3d-brain-mri.json b/app/workflows/fetal-3d-brain-mri.json index 8979af9..42119c7 100644 --- a/app/workflows/fetal-3d-brain-mri.json +++ b/app/workflows/fetal-3d-brain-mri.json @@ -1,9 +1,9 @@ { "name": "fetal-brain-mri", - "version": "1.0.0", + "version": "0.2.1", "description": "Clinical Workflow for 3D fetal brain MRI reconstruction", "informatics_gateway": { - "ae_title": "MONAI", + "ae_title": "AIDE_QA", "data_origins": [], "export_destinations": [ "PACS" @@ -53,8 +53,8 @@ "workflow_name": "fetal-brain-mri", "reviewed_task_id": "brain-3d-recon", "application_name": "fetal-brain-mri", - "application_version": "1.0.0", - "mode": "QA", + "application_version": "0.2.1", + "mode": "AIDE_QA", "reviewer_roles": "clinician" }, "task_destinations": [