From b8be5c4debcb2cbe3a02636d7a0b78172b411876 Mon Sep 17 00:00:00 2001 From: Mathieu Guay-Paquet Date: Wed, 30 Nov 2022 16:42:53 +0000 Subject: [PATCH] Backport fixes for ivadomed and submodule access Fixes #4163. --- requirements-freeze.txt | 2 +- spinalcordtoolbox/compat/launcher.py | 4 +-- spinalcordtoolbox/deepseg/models.py | 20 ++++++------- spinalcordtoolbox/scripts/sct_deepseg.py | 36 +++++++++++------------- spinalcordtoolbox/scripts/sct_version.py | 4 +-- 5 files changed, 32 insertions(+), 34 deletions(-) diff --git a/requirements-freeze.txt b/requirements-freeze.txt index ed9a28e414..f7ef8ecc59 100644 --- a/requirements-freeze.txt +++ b/requirements-freeze.txt @@ -37,7 +37,7 @@ imageio==2.22.4 importlib-metadata==5.1.0 iniconfig==1.1.1 interface-meta==1.3.0 -ivadomed==2.9.7 +ivadomed==2.9.8 joblib==1.2.0 kiwisolver==1.4.4 loguru==0.6.0 diff --git a/spinalcordtoolbox/compat/launcher.py b/spinalcordtoolbox/compat/launcher.py index d21c930d00..6f2a09cbfb 100644 --- a/spinalcordtoolbox/compat/launcher.py +++ b/spinalcordtoolbox/compat/launcher.py @@ -5,7 +5,7 @@ import subprocess import multiprocessing -import spinalcordtoolbox as sct +from spinalcordtoolbox import __file__ as package_init_file def main(): @@ -26,7 +26,7 @@ def main(): env['NEURITE_BACKEND'] = 'pytorch' command = os.path.basename(sys.argv[0]) - pkg_dir = os.path.dirname(sct.__file__) + pkg_dir = os.path.dirname(package_init_file) script = os.path.join(pkg_dir, "scripts", "{}.py".format(command)) assert os.path.exists(script) diff --git a/spinalcordtoolbox/deepseg/models.py b/spinalcordtoolbox/deepseg/models.py index 6b407be180..908db8b69b 100644 --- a/spinalcordtoolbox/deepseg/models.py +++ b/spinalcordtoolbox/deepseg/models.py @@ -11,7 +11,7 @@ import shutil import spinalcordtoolbox as sct -import spinalcordtoolbox.download +from spinalcordtoolbox import download from spinalcordtoolbox.utils import stylize @@ -256,7 +256,7 @@ def install_model(name_model): :return: None """ logger.info("\nINSTALLING MODEL: {}".format(name_model)) - sct.download.install_data(MODELS[name_model]['url'], folder(name_model)) + download.install_data(MODELS[name_model]['url'], folder(name_model)) def install_default_models(): @@ -292,21 +292,21 @@ def list_tasks(): def display_list_tasks(): - tasks = sct.deepseg.models.list_tasks() + tasks = list_tasks() # Display beautiful output color = {True: 'LightGreen', False: 'LightRed'} print("{:<30s}{:<50s}{:<15s}MODELS".format("TASK", "DESCRIPTION", "CONTRAST")) print("-" * 120) for name_task, value in tasks.items(): - path_models = [sct.deepseg.models.folder(name_model) for name_model in value['models']] - are_models_valid = [sct.deepseg.models.is_valid(path_model) for path_model in path_models] + path_models = [folder(name_model) for name_model in value['models']] + are_models_valid = [is_valid(path_model) for path_model in path_models] task_status = stylize(name_task.ljust(30), color[all(are_models_valid)]) description_status = stylize(value['description'].ljust(50), color[all(are_models_valid)]) models_status = ', '.join([stylize(model_name, - color[is_valid]) - for model_name, is_valid in zip(value['models'], are_models_valid)]) + color[validity]) + for model_name, validity in zip(value['models'], are_models_valid)]) input_contrasts = stylize(str(', '.join(model_name for model_name in get_required_contrasts(name_task))).ljust(15), color[all(are_models_valid)]) @@ -326,7 +326,7 @@ def display_list_tasks(): def display_list_tasks_long(): - for name_task, value in sct.deepseg.models.list_tasks().items(): + for name_task, value in list_tasks().items(): indent_len = len("LONG_DESCRIPTION: ") print("{}{}".format("TASK:".ljust(indent_len), stylize(name_task, 'Bold'))) print('\n'.join(textwrap.wrap(value['long_description'], @@ -335,9 +335,9 @@ def display_list_tasks_long(): subsequent_indent=' '*indent_len))) print("{}{}".format("URL:".ljust(indent_len), stylize(value['url'], 'Cyan'))) - path_models = [sct.deepseg.models.folder(name_model) + path_models = [folder(name_model) for name_model in value['models']] - if all([sct.deepseg.models.is_valid(path_model) for path_model in path_models]): + if all([is_valid(path_model) for path_model in path_models]): installed = stylize("Yes", 'LightGreen') else: installed = stylize("No", 'LightRed') diff --git a/spinalcordtoolbox/scripts/sct_deepseg.py b/spinalcordtoolbox/scripts/sct_deepseg.py index 3ff165085d..421fe1e3bd 100755 --- a/spinalcordtoolbox/scripts/sct_deepseg.py +++ b/spinalcordtoolbox/scripts/sct_deepseg.py @@ -18,10 +18,8 @@ from ivadomed import inference as imed_inference import nibabel as nib -import spinalcordtoolbox as sct -import spinalcordtoolbox.deepseg as deepseg -import spinalcordtoolbox.deepseg.models - +from spinalcordtoolbox.deepseg import models +from spinalcordtoolbox.image import splitext from spinalcordtoolbox.utils.shell import SCTArgumentParser, Metavar, display_viewer_syntax from spinalcordtoolbox.utils.sys import init_sct, printv, set_loglevel @@ -74,7 +72,7 @@ def get_parser(): seg.add_argument( "-install-task", help="Install models that are required for specified task.", - choices=list(deepseg.models.TASKS.keys())) + choices=list(models.TASKS.keys())) misc = parser.add_argument_group('\nPARAMETERS') misc.add_argument( @@ -146,14 +144,14 @@ def main(argv: Sequence[str]): # Deal with task if arguments.list_tasks: - deepseg.models.display_list_tasks() + models.display_list_tasks() # Deal with task long description if arguments.list_tasks_long: - deepseg.models.display_list_tasks_long() + models.display_list_tasks_long() if arguments.install_task is not None: - for name_model in deepseg.models.TASKS[arguments.install_task]['models']: - deepseg.models.install_model(name_model) + for name_model in models.TASKS[arguments.install_task]['models']: + models.install_model(name_model) exit(0) # Deal with input/output @@ -162,12 +160,12 @@ def main(argv: Sequence[str]): parser.error("This file does not exist: {}".format(file)) # Verify if the task is part of the "official" tasks, or if it is pointing to paths containing custom models - if len(arguments.task) == 1 and arguments.task[0] in deepseg.models.TASKS: + if len(arguments.task) == 1 and arguments.task[0] in models.TASKS: # Check if all input images are provided - required_contrasts = deepseg.models.get_required_contrasts(arguments.task[0]) + required_contrasts = models.get_required_contrasts(arguments.task[0]) n_contrasts = len(required_contrasts) # Get pipeline model names - name_models = deepseg.models.TASKS[arguments.task[0]]['models'] + name_models = models.TASKS[arguments.task[0]]['models'] else: n_contrasts = len(arguments.i) name_models = arguments.task @@ -188,22 +186,22 @@ def main(argv: Sequence[str]): output_filenames = None for name_model in name_models: # Check if this is an official model - if name_model in list(deepseg.models.MODELS.keys()): + if name_model in list(models.MODELS.keys()): # If it is, check if it is installed - path_model = deepseg.models.folder(name_model) - if not deepseg.models.is_valid(path_model): + path_model = models.folder(name_model) + if not models.is_valid(path_model): printv("Model {} is not installed. Installing it now...".format(name_model)) - deepseg.models.install_model(name_model) + models.install_model(name_model) # If it is not, check if this is a path to a valid model else: path_model = os.path.abspath(name_model) - if not deepseg.models.is_valid(path_model): + if not models.is_valid(path_model): parser.error("The input model is invalid: {}".format(path_model)) # Order input images if arguments.c is not None: input_filenames = [] - for required_contrast in deepseg.models.MODELS[name_model]['contrasts']: + for required_contrast in models.MODELS[name_model]['contrasts']: for provided_contrast, input_filename in zip(arguments.c, arguments.i): if required_contrast == provided_contrast: input_filenames.append(input_filename) @@ -231,7 +229,7 @@ def main(argv: Sequence[str]): fname_seg = options['o'].replace(extension, target + extension) if len(target_lst) > 1 \ else options['o'] else: - fname_seg = ''.join([sct.image.splitext(input_filenames[0])[0], target + '.nii.gz']) + fname_seg = ''.join([splitext(input_filenames[0])[0], target + '.nii.gz']) # If output folder does not exist, create it path_out = os.path.dirname(fname_seg) diff --git a/spinalcordtoolbox/scripts/sct_version.py b/spinalcordtoolbox/scripts/sct_version.py index 6eafa777b3..12880c2ae9 100755 --- a/spinalcordtoolbox/scripts/sct_version.py +++ b/spinalcordtoolbox/scripts/sct_version.py @@ -1,10 +1,10 @@ #!/usr/bin/env python -import spinalcordtoolbox as sct +from spinalcordtoolbox import __version__ def main(): - print(sct.__version__) + print(__version__) if __name__ == "__main__":