monai-weekly 1.7.dev2625__tar.gz → 1.7.dev2627__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {monai_weekly-1.7.dev2625/monai_weekly.egg-info → monai_weekly-1.7.dev2627}/PKG-INFO +1 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/__init__.py +1 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/_version.py +3 -3
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/nnunet/nnunetv2_runner.py +6 -2
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/nnunet/utils.py +1 -9
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/vista3d/transforms.py +0 -2
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/auto3dseg/utils.py +1 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/__init__.py +1 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/box_utils.py +1 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/dataset.py +19 -25
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/image_reader.py +4 -4
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/meta_obj.py +4 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/meta_tensor.py +94 -12
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/utils.py +8 -16
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/inferers/merger.py +0 -3
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/adversarial_loss.py +2 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/cldice.py +2 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/deform.py +66 -17
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/dice.py +7 -7
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/focal_loss.py +2 -2
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/hausdorff_loss.py +3 -3
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/image_dissimilarity.py +7 -4
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/mcc_loss.py +3 -3
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/nacl_loss.py +1 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/perceptual.py +3 -2
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/spatial_mask.py +5 -3
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/tversky.py +3 -3
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/unified_focal_loss.py +3 -3
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/__init__.py +1 -0
- monai_weekly-1.7.dev2627/monai/metrics/absolute_volume_difference.py +180 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/active_learning_metrics.py +5 -2
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/average_precision.py +4 -2
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/confusion_matrix.py +1 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/cumulative_average.py +1 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/froc.py +7 -5
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/generalized_dice.py +0 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/rocauc.py +6 -2
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/utils.py +31 -5
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/text_embedding.py +0 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/layers/filtering.py +0 -3
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/layers/simplelayers.py +0 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/basic_unet.py +0 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/basic_unetplusplus.py +0 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/adaptors.py +1 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/croppad/array.py +1 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/croppad/dictionary.py +5 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/croppad/functional.py +2 -2
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/intensity/array.py +8 -6
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/inverse.py +1 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/lazy/functional.py +6 -4
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/post/array.py +7 -3
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/spatial/array.py +71 -14
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/spatial/dictionary.py +11 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/spatial/functional.py +11 -5
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/utility/array.py +28 -15
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/utility/dictionary.py +7 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/utils.py +65 -26
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/utils/profiling.py +0 -2
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627/monai_weekly.egg-info}/PKG-INFO +1 -1
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai_weekly.egg-info/SOURCES.txt +1 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/LICENSE +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/MANIFEST.in +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/README.md +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/_extensions/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/_extensions/gmm/gmm.cpp +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/_extensions/gmm/gmm.h +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/_extensions/gmm/gmm_cpu.cpp +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/_extensions/gmm/gmm_cuda.cu +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/_extensions/gmm/gmm_cuda_linalg.cuh +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/_extensions/loader.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/auto3dseg/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/auto3dseg/__main__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/auto3dseg/auto_runner.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/auto3dseg/bundle_gen.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/auto3dseg/data_analyzer.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/auto3dseg/ensemble_builder.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/auto3dseg/hpo_gen.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/auto3dseg/transforms.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/auto3dseg/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/datasets.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/deepedit/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/deepedit/interaction.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/deepedit/transforms.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/deepgrow/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/deepgrow/dataset.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/deepgrow/interaction.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/deepgrow/transforms.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/metrics/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/metrics/coco.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/metrics/matching.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/networks/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/networks/retinanet_detector.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/networks/retinanet_network.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/transforms/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/transforms/array.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/transforms/box_ops.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/transforms/dictionary.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/utils/ATSS_matcher.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/utils/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/utils/anchor_utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/utils/box_coder.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/utils/box_selector.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/utils/detector_utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/utils/hard_negative_sampler.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/detection/utils/predict_utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/generation/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/generation/maisi/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/generation/maisi/networks/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/generation/maisi/networks/autoencoderkl_maisi.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/generation/maisi/networks/controlnet_maisi.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/generation/maisi/networks/diffusion_model_unet_maisi.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/mmars/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/mmars/mmars.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/mmars/model_desc.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/nnunet/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/nnunet/__main__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/nnunet/nnunet_bundle.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/nuclick/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/nuclick/transforms.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/engines/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/engines/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/handlers/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/handlers/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/inferers/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/inferers/inferer.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/losses/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/losses/hovernet_loss.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/metrics/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/metrics/lesion_froc.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/transforms/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/transforms/post/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/transforms/post/array.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/transforms/post/dictionary.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/transforms/stain/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/transforms/stain/array.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/transforms/stain/dictionary.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/pathology/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/reconstruction/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/reconstruction/complex_utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/reconstruction/fastmri_reader.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/reconstruction/mri_utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/reconstruction/networks/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/reconstruction/networks/blocks/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/reconstruction/networks/blocks/varnetblock.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/reconstruction/networks/nets/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/reconstruction/networks/nets/coil_sensitivity_model.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/reconstruction/networks/nets/complex_unet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/reconstruction/networks/nets/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/reconstruction/networks/nets/varnet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/reconstruction/transforms/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/reconstruction/transforms/array.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/reconstruction/transforms/dictionary.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/tcia/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/tcia/label_desc.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/tcia/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/vista3d/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/vista3d/inferer.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/apps/vista3d/sampler.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/auto3dseg/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/auto3dseg/algo_gen.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/auto3dseg/analyzer.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/auto3dseg/operations.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/auto3dseg/seg_summarizer.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/bundle/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/bundle/__main__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/bundle/config_item.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/bundle/config_parser.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/bundle/properties.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/bundle/reference_resolver.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/bundle/scripts.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/bundle/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/bundle/workflows.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/config/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/config/deviceconfig.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/config/type_definitions.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/csv_saver.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/dataloader.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/dataset_summary.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/decathlon_datalist.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/fft_utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/folder_layout.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/grid_dataset.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/image_dataset.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/image_writer.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/iterable_dataset.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/itk_torch_bridge.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/samplers.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/synthetic.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/test_time_augmentation.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/thread_buffer.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/torchscript_utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/ultrasound_confidence_map.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/video_dataset.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/wsi_datasets.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/data/wsi_reader.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/engines/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/engines/evaluator.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/engines/trainer.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/engines/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/engines/workflow.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/fl/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/fl/client/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/fl/client/client_algo.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/fl/client/monai_algo.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/fl/utils/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/fl/utils/constants.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/fl/utils/exchange_object.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/fl/utils/filters.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/average_precision.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/calibration.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/checkpoint_loader.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/checkpoint_saver.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/classification_saver.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/clearml_handlers.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/confusion_matrix.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/decollate_batch.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/earlystop_handler.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/garbage_collector.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/hausdorff_distance.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/ignite_metric.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/logfile_handler.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/lr_schedule_handler.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/mean_dice.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/mean_iou.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/metric_logger.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/metrics_reloaded_handler.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/metrics_saver.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/mlflow_handler.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/nvtx_handlers.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/panoptic_quality.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/parameter_scheduler.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/postprocessing.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/probability_maps.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/regression_metrics.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/roc_auc.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/smartcache_handler.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/stats_handler.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/surface_distance.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/tensorboard_handlers.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/trt_handler.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/handlers/validation_handler.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/inferers/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/inferers/inferer.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/inferers/splitter.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/inferers/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/aucm_loss.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/barlow_twins.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/contrastive.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/ds_loss.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/giou_loss.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/multi_scale.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/spectral_loss.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/ssim_loss.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/sure_loss.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/losses/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/calibration.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/embedding_collapse.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/f_beta_score.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/fid.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/hausdorff_distance.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/loss_metric.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/meandice.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/meaniou.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/metric.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/mmd.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/panoptic_quality.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/regression.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/surface_dice.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/surface_distance.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/metrics/wrapper.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/acti_norm.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/activation.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/activation_checkpointing.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/aspp.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/attention_utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/backbone_fpn_utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/cablock.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/convolutions.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/crf.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/crossattention.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/denseblock.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/dints_block.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/downsample.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/dynunet_block.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/encoder.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/fcn.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/feature_pyramid_network.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/fft_utils_t.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/localnet_block.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/mednext_block.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/mlp.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/patchembedding.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/pos_embed_utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/regunet_block.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/rel_pos_embedding.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/segresnet_block.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/selfattention.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/spade_norm.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/spatialattention.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/squeeze_and_excitation.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/transformerblock.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/unetr_block.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/upsample.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/blocks/warp.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/layers/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/layers/conjugate_gradient.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/layers/convutils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/layers/drop_path.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/layers/factories.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/layers/gmm.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/layers/spatial_transforms.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/layers/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/layers/vector_quantizer.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/layers/weight_init.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/ahnet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/attentionunet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/autoencoder.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/autoencoderkl.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/cell_sam_wrapper.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/classifier.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/controlnet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/daf3d.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/densenet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/diffusion_model_unet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/dints.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/dynunet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/efficientnet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/flexible_unet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/fullyconnectednet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/generator.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/highresnet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/hovernet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/masked_autoencoder_vit.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/mednext.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/milmodel.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/netadapter.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/patchgan_discriminator.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/quicknat.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/regressor.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/regunet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/resnet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/restormer.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/segresnet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/segresnet_ds.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/senet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/spade_autoencoderkl.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/spade_diffusion_model_unet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/spade_network.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/swin_unetr.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/torchvision_fc.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/transchex.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/transformer.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/unet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/unetr.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/varautoencoder.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/vista3d.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/vit.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/vitautoenc.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/vnet.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/voxelmorph.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/nets/vqvae.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/schedulers/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/schedulers/ddim.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/schedulers/ddpm.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/schedulers/pndm.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/schedulers/rectified_flow.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/schedulers/scheduler.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/trt_compiler.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/networks/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/optimizers/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/optimizers/lr_finder.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/optimizers/lr_scheduler.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/optimizers/novograd.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/optimizers/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/py.typed +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/compose.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/croppad/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/croppad/batch.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/intensity/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/intensity/dictionary.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/inverse_batch_transform.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/io/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/io/array.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/io/dictionary.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/lazy/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/lazy/array.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/lazy/dictionary.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/lazy/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/meta_utility/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/meta_utility/dictionary.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/nvtx.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/post/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/post/dictionary.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/regularization/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/regularization/array.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/regularization/dictionary.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/signal/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/signal/array.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/signal/dictionary.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/smooth_field/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/smooth_field/array.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/smooth_field/dictionary.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/spatial/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/traits.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/transform.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/utility/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/utils_create_transform_ims.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/utils_morphological_ops.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/transforms/utils_pytorch_numpy_unification.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/utils/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/utils/component_store.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/utils/decorators.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/utils/deprecate_utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/utils/dist.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/utils/enums.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/utils/jupyter_utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/utils/misc.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/utils/module.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/utils/nvtx.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/utils/ordering.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/utils/state_cacher.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/utils/tf32.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/utils/type_conversion.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/visualize/__init__.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/visualize/class_activation_maps.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/visualize/gradient_based.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/visualize/img2tensorboard.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/visualize/occlusion_sensitivity.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/visualize/utils.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai/visualize/visualizer.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai_weekly.egg-info/dependency_links.txt +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai_weekly.egg-info/not-zip-safe +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai_weekly.egg-info/requires.txt +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/monai_weekly.egg-info/top_level.txt +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/pyproject.toml +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/setup.cfg +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/setup.py +0 -0
- {monai_weekly-1.7.dev2625 → monai_weekly-1.7.dev2627}/versioneer.py +0 -0
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2026-
|
|
11
|
+
"date": "2026-07-05T03:07:50+0000",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "1.7.
|
|
14
|
+
"full-revisionid": "9c37af81ef49b616038685d338f97726a0266440",
|
|
15
|
+
"version": "1.7.dev2627"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -598,7 +598,11 @@ class nnUNetV2Runner: # noqa: N801
|
|
|
598
598
|
|
|
599
599
|
for _key, _value in kwargs.items():
|
|
600
600
|
prefix = "-" if _key in {"p", "pretrained_weights"} else "--"
|
|
601
|
-
|
|
601
|
+
if isinstance(_value, bool):
|
|
602
|
+
if _value:
|
|
603
|
+
cmd.append(f"{prefix}{_key}")
|
|
604
|
+
else:
|
|
605
|
+
cmd += [f"{prefix}{_key}", str(_value)]
|
|
602
606
|
|
|
603
607
|
cmd_str: list[str] = [str(c) for c in cmd]
|
|
604
608
|
|
|
@@ -758,7 +762,7 @@ class nnUNetV2Runner: # noqa: N801
|
|
|
758
762
|
kwargs: this optional parameter allows you to specify additional arguments defined in the
|
|
759
763
|
``train_single_model`` method.
|
|
760
764
|
"""
|
|
761
|
-
self.train_single_model(config=config, fold=fold,
|
|
765
|
+
self.train_single_model(config=config, fold=fold, val=True, **kwargs)
|
|
762
766
|
|
|
763
767
|
def validate(
|
|
764
768
|
self, configs: tuple = (M.N_3D_FULLRES, M.N_2D, M.N_3D_LOWRES, M.N_3D_CASCADE_FULLRES), **kwargs: Any
|
|
@@ -149,7 +149,6 @@ def create_new_dataset_json(
|
|
|
149
149
|
"""
|
|
150
150
|
new_json_data: dict = {}
|
|
151
151
|
|
|
152
|
-
# modality = self.input_info.pop("modality")
|
|
153
152
|
modality = ensure_tuple(modality) # type: ignore
|
|
154
153
|
|
|
155
154
|
new_json_data["channel_names"] = {}
|
|
@@ -161,18 +160,11 @@ def create_new_dataset_json(
|
|
|
161
160
|
for _j in range(num_foreground_classes):
|
|
162
161
|
new_json_data["labels"][f"class{_j + 1}"] = _j + 1
|
|
163
162
|
|
|
164
|
-
# new_json_data["numTraining"] = len(datalist_json["training"])
|
|
165
163
|
new_json_data["numTraining"] = num_training_data
|
|
166
164
|
new_json_data["file_ending"] = ".nii.gz"
|
|
167
165
|
|
|
168
166
|
ConfigParser.export_config_file(
|
|
169
|
-
config=new_json_data,
|
|
170
|
-
# filepath=os.path.join(raw_data_foldername, "dataset.json"),
|
|
171
|
-
filepath=output_filepath,
|
|
172
|
-
fmt="json",
|
|
173
|
-
sort_keys=True,
|
|
174
|
-
indent=4,
|
|
175
|
-
ensure_ascii=False,
|
|
167
|
+
config=new_json_data, filepath=output_filepath, fmt="json", sort_keys=True, indent=4, ensure_ascii=False
|
|
176
168
|
)
|
|
177
169
|
|
|
178
170
|
return
|
|
@@ -160,8 +160,6 @@ class VistaPostTransformd(MapTransform):
|
|
|
160
160
|
pred = pred.argmax(0).unsqueeze(0).float() + 1.0
|
|
161
161
|
pred[is_bk] = 0.0
|
|
162
162
|
else:
|
|
163
|
-
# AsDiscrete will remove NaN
|
|
164
|
-
# pred = monai.transforms.AsDiscrete(threshold=0.5)(pred)
|
|
165
163
|
pred[pred > 0] = 1.0
|
|
166
164
|
if "label_prompt" in data and data["label_prompt"] is not None:
|
|
167
165
|
pred += 0.5 # inplace mapping to avoid cloning pred
|
|
@@ -284,7 +284,7 @@ def verify_report_format(report: dict, report_format: dict) -> bool:
|
|
|
284
284
|
|
|
285
285
|
if isinstance(v_fmt, list) and isinstance(v, list):
|
|
286
286
|
if len(v_fmt) != 1:
|
|
287
|
-
|
|
287
|
+
warnings.warn("list length in report_format is not 1", stacklevel=2)
|
|
288
288
|
if len(v_fmt) > 0 and len(v) > 0:
|
|
289
289
|
return verify_report_format(v[0], v_fmt[0])
|
|
290
290
|
else:
|
|
@@ -71,7 +71,7 @@ from .itk_torch_bridge import (
|
|
|
71
71
|
monai_to_itk_ddf,
|
|
72
72
|
)
|
|
73
73
|
from .meta_obj import MetaObj, get_track_meta, set_track_meta
|
|
74
|
-
from .meta_tensor import MetaTensor
|
|
74
|
+
from .meta_tensor import MetaTensor, get_spatial_ndim
|
|
75
75
|
from .samplers import DistributedSampler, DistributedWeightedRandomSampler
|
|
76
76
|
from .synthetic import create_test_image_2d, create_test_image_3d
|
|
77
77
|
from .test_time_augmentation import TestTimeAugmentation
|
|
@@ -1200,7 +1200,7 @@ def batched_nms(
|
|
|
1200
1200
|
# from different classes do not overlap
|
|
1201
1201
|
max_coordinate = boxes_t.max()
|
|
1202
1202
|
offsets = labels_t.to(boxes_t) * (max_coordinate + 1)
|
|
1203
|
-
boxes_for_nms =
|
|
1203
|
+
boxes_for_nms = boxes_t + offsets[:, None]
|
|
1204
1204
|
keep = non_max_suppression(boxes_for_nms, scores_t, nms_thresh, max_proposals, box_overlap_metric)
|
|
1205
1205
|
|
|
1206
1206
|
# convert tensor back to numpy if needed
|
|
@@ -210,8 +210,12 @@ class PersistentDataset(Dataset):
|
|
|
210
210
|
|
|
211
211
|
Cached data is expected to be tensors, primitives, or dictionaries keying to these values. Numpy arrays will
|
|
212
212
|
be converted to tensors, however any other object type returned by transforms will not be loadable since
|
|
213
|
-
`torch.load` will be used with `weights_only=True` to prevent loading of potentially malicious
|
|
214
|
-
Legacy cache files may not be loadable and may need to be recomputed.
|
|
213
|
+
`torch.load` will be used with `weights_only=True` by default to prevent loading of potentially malicious
|
|
214
|
+
objects. Legacy cache files may not be loadable and may need to be recomputed. MetaTensor objects can be saved
|
|
215
|
+
and loaded with their metadata preserved if `track_meta` is True, however the objects stored in the metadata
|
|
216
|
+
must be acceptable as serialisable by `torch.load` by default or if they have been white-listed with
|
|
217
|
+
`torch.serialization.add_safe_globals`. Any other object type may be stored but will fail to load and force
|
|
218
|
+
a cache recompute.
|
|
215
219
|
|
|
216
220
|
Lazy Resampling:
|
|
217
221
|
If you make use of the lazy resampling feature of `monai.transforms.Compose`, please refer to
|
|
@@ -245,8 +249,8 @@ class PersistentDataset(Dataset):
|
|
|
245
249
|
may share a common cache dir provided that the transforms pre-processing is consistent.
|
|
246
250
|
If `cache_dir` doesn't exist, will automatically create it.
|
|
247
251
|
If `cache_dir` is `None`, there is effectively no caching.
|
|
248
|
-
hash_func: a callable to compute hash from data items to be cached
|
|
249
|
-
|
|
252
|
+
hash_func: a callable to compute hash from data items to be cached, defaults to
|
|
253
|
+
`monai.data.utils.pickle_hashing` which uses sha256 (previously md5 so old caches will not work).
|
|
250
254
|
pickle_module: string representing the module used for pickling metadata and objects,
|
|
251
255
|
default to `"pickle"`. due to the pickle limitation in multi-processing of Dataloader,
|
|
252
256
|
we can't use `pickle` as arg directly, so here we use a string name instead.
|
|
@@ -266,17 +270,12 @@ class PersistentDataset(Dataset):
|
|
|
266
270
|
When this is enabled, the traced transform instance IDs will be removed from the cached MetaTensors.
|
|
267
271
|
This is useful for skipping the transform instance checks when inverting applied operations
|
|
268
272
|
using the cached content and with re-created transform instances.
|
|
269
|
-
track_meta: whether to track the meta information,
|
|
270
|
-
default to `False`. Cannot be used with `weights_only=True`.
|
|
273
|
+
track_meta: whether to track the meta information, defaults to False. If `True`, converts to `MetaTensor`.
|
|
271
274
|
weights_only: keyword argument passed to `torch.load` when reading cached files.
|
|
272
|
-
default to `True`. When
|
|
273
|
-
|
|
274
|
-
objects
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
Raises:
|
|
278
|
-
ValueError: When both `track_meta=True` and `weights_only=True`, since this combination
|
|
279
|
-
prevents cached MetaTensors from being reloaded and causes perpetual cache regeneration.
|
|
275
|
+
default to `True`. When `True`, `torch.load` restricts loading to tensors and other safe objects.
|
|
276
|
+
Setting to `False` should only be done if it's absolutely necessary to load unsafe pickled data,
|
|
277
|
+
eg. MetaTensor objects with unsafe objects in their metadata. Users must verify the safety of the data
|
|
278
|
+
they intend to load before doing so.
|
|
280
279
|
"""
|
|
281
280
|
super().__init__(data=data, transform=transform)
|
|
282
281
|
self.cache_dir = Path(cache_dir) if cache_dir is not None else None
|
|
@@ -292,11 +291,6 @@ class PersistentDataset(Dataset):
|
|
|
292
291
|
if hash_transform is not None:
|
|
293
292
|
self.set_transform_hash(hash_transform)
|
|
294
293
|
self.reset_ops_id = reset_ops_id
|
|
295
|
-
if track_meta and weights_only:
|
|
296
|
-
raise ValueError(
|
|
297
|
-
"Invalid argument combination: `track_meta=True` cannot be used with `weights_only=True`. "
|
|
298
|
-
"To cache and reload MetaTensors, set `track_meta=True` and `weights_only=False`."
|
|
299
|
-
)
|
|
300
294
|
self.track_meta = track_meta
|
|
301
295
|
self.weights_only = weights_only
|
|
302
296
|
|
|
@@ -390,9 +384,9 @@ class PersistentDataset(Dataset):
|
|
|
390
384
|
"""
|
|
391
385
|
hashfile = None
|
|
392
386
|
if self.cache_dir is not None:
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
hashfile = self.cache_dir / f"{
|
|
387
|
+
data_item_hash = self.hash_func(item_transformed).decode("utf-8")
|
|
388
|
+
data_item_hash += self.transform_hash
|
|
389
|
+
hashfile = self.cache_dir / f"{data_item_hash}.pt"
|
|
396
390
|
|
|
397
391
|
if hashfile is not None and hashfile.is_file(): # cache hit
|
|
398
392
|
try:
|
|
@@ -1624,9 +1618,9 @@ class GDSDataset(PersistentDataset):
|
|
|
1624
1618
|
hashfile = None
|
|
1625
1619
|
# compute a cache id
|
|
1626
1620
|
if self.cache_dir is not None:
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
hashfile = self.cache_dir / f"{
|
|
1621
|
+
data_item_hash = self.hash_func(item_transformed).decode("utf-8")
|
|
1622
|
+
data_item_hash += self.transform_hash
|
|
1623
|
+
hashfile = self.cache_dir / f"{data_item_hash}.pt"
|
|
1630
1624
|
|
|
1631
1625
|
if hashfile is not None and hashfile.is_file(): # cache hit
|
|
1632
1626
|
with cp.cuda.Device(self.device):
|
|
@@ -761,10 +761,10 @@ class PydicomReader(ImageReader):
|
|
|
761
761
|
if "lastImagePositionPatient" in metadata:
|
|
762
762
|
t1n, t2n, t3n = metadata["lastImagePositionPatient"]
|
|
763
763
|
n = metadata[MetaKeys.SPATIAL_SHAPE][-1]
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
764
|
+
if n > 1:
|
|
765
|
+
affine[0, 2] = (t1n - sx) / (n - 1)
|
|
766
|
+
affine[1, 2] = (t2n - sy) / (n - 1)
|
|
767
|
+
affine[2, 2] = (t3n - sz) / (n - 1)
|
|
768
768
|
|
|
769
769
|
if lps_to_ras:
|
|
770
770
|
affine = orientation_ras_lps(affine)
|
|
@@ -24,6 +24,9 @@ from monai.utils import TraceKeys, first, is_immutable
|
|
|
24
24
|
|
|
25
25
|
_TRACK_META = True
|
|
26
26
|
|
|
27
|
+
# Default number of spatial dimensions for medical imaging (3D volumetric data)
|
|
28
|
+
_DEFAULT_SPATIAL_NDIM = 3
|
|
29
|
+
|
|
27
30
|
__all__ = ["get_track_meta", "set_track_meta", "MetaObj"]
|
|
28
31
|
|
|
29
32
|
|
|
@@ -84,6 +87,7 @@ class MetaObj:
|
|
|
84
87
|
self._applied_operations: list = MetaObj.get_default_applied_operations()
|
|
85
88
|
self._pending_operations: list = MetaObj.get_default_applied_operations() # the same default as applied_ops
|
|
86
89
|
self._is_batch: bool = False
|
|
90
|
+
self._spatial_ndim: int = 3 # default: 3 spatial dimensions
|
|
87
91
|
|
|
88
92
|
@staticmethod
|
|
89
93
|
def flatten_meta_objs(*args: Iterable):
|
|
@@ -13,22 +13,60 @@ from __future__ import annotations
|
|
|
13
13
|
|
|
14
14
|
import functools
|
|
15
15
|
import warnings
|
|
16
|
-
from collections.abc import Sequence
|
|
16
|
+
from collections.abc import Mapping, Sequence
|
|
17
17
|
from copy import deepcopy
|
|
18
|
+
from numbers import Integral
|
|
18
19
|
from typing import Any
|
|
19
20
|
|
|
20
21
|
import numpy as np
|
|
21
22
|
import torch
|
|
22
23
|
|
|
23
24
|
import monai
|
|
24
|
-
from monai.config.type_definitions import NdarrayTensor
|
|
25
|
-
from monai.data.meta_obj import MetaObj, get_track_meta
|
|
26
|
-
from monai.data.utils import affine_to_spacing, decollate_batch, list_data_collate, remove_extra_metadata
|
|
25
|
+
from monai.config.type_definitions import NdarrayOrTensor, NdarrayTensor
|
|
26
|
+
from monai.data.meta_obj import _DEFAULT_SPATIAL_NDIM, MetaObj, get_track_meta
|
|
27
|
+
from monai.data.utils import affine_to_spacing, decollate_batch, is_no_channel, list_data_collate, remove_extra_metadata
|
|
27
28
|
from monai.utils import look_up_option
|
|
28
29
|
from monai.utils.enums import LazyAttr, MetaKeys, PostFix, SpaceKeys
|
|
29
30
|
from monai.utils.type_conversion import convert_data_type, convert_to_dst_type, convert_to_numpy, convert_to_tensor
|
|
30
31
|
|
|
31
|
-
__all__ = ["MetaTensor"]
|
|
32
|
+
__all__ = ["MetaTensor", "get_spatial_ndim"]
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _normalize_spatial_ndim(spatial_ndim: int, tensor_ndim: int, no_channel: bool = False) -> int:
|
|
36
|
+
"""Clamp spatial dims to a valid range for the current tensor shape."""
|
|
37
|
+
limit = max(int(tensor_ndim), 1) if no_channel else max(int(tensor_ndim) - 1, 1)
|
|
38
|
+
return max(1, min(int(spatial_ndim), limit))
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _has_explicit_no_channel(meta: Mapping | None) -> bool:
|
|
42
|
+
return (
|
|
43
|
+
isinstance(meta, Mapping)
|
|
44
|
+
and MetaKeys.ORIGINAL_CHANNEL_DIM in meta
|
|
45
|
+
and is_no_channel(meta[MetaKeys.ORIGINAL_CHANNEL_DIM])
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def get_spatial_ndim(img: NdarrayOrTensor) -> int:
|
|
50
|
+
"""Return the number of spatial dimensions assuming channel-first layout.
|
|
51
|
+
|
|
52
|
+
Uses ``MetaTensor.spatial_ndim`` when available, otherwise falls back to
|
|
53
|
+
``img.ndim - 1``. Always assumes channel-first (``no_channel=False``)
|
|
54
|
+
because callers run after ``EnsureChannelFirst`` has already added one.
|
|
55
|
+
"""
|
|
56
|
+
if isinstance(img, MetaTensor):
|
|
57
|
+
return _normalize_spatial_ndim(img.spatial_ndim, img.ndim)
|
|
58
|
+
return img.ndim - 1
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _is_batch_only_index(index: Any) -> bool:
|
|
62
|
+
"""True when indexing pattern selects only the batch axis (e.g., ``x[0]`` or ``x[0, ...]``)."""
|
|
63
|
+
if isinstance(index, (int, np.integer)):
|
|
64
|
+
return True
|
|
65
|
+
if not isinstance(index, Sequence) or not index:
|
|
66
|
+
return False
|
|
67
|
+
if not isinstance(index[0], (int, np.integer)):
|
|
68
|
+
return False
|
|
69
|
+
return all(i in (slice(None, None, None), Ellipsis, None) for i in index[1:])
|
|
32
70
|
|
|
33
71
|
|
|
34
72
|
@functools.lru_cache(None)
|
|
@@ -111,6 +149,7 @@ class MetaTensor(MetaObj, torch.Tensor):
|
|
|
111
149
|
meta: dict | None = None,
|
|
112
150
|
applied_operations: list | None = None,
|
|
113
151
|
*args,
|
|
152
|
+
spatial_ndim: int | None = None,
|
|
114
153
|
**kwargs,
|
|
115
154
|
) -> MetaTensor:
|
|
116
155
|
_kwargs = {"device": kwargs.pop("device", None), "dtype": kwargs.pop("dtype", None)} if kwargs else {}
|
|
@@ -123,6 +162,7 @@ class MetaTensor(MetaObj, torch.Tensor):
|
|
|
123
162
|
meta: dict | None = None,
|
|
124
163
|
applied_operations: list | None = None,
|
|
125
164
|
*_args,
|
|
165
|
+
spatial_ndim: int | None = None,
|
|
126
166
|
**_kwargs,
|
|
127
167
|
) -> None:
|
|
128
168
|
"""
|
|
@@ -134,6 +174,8 @@ class MetaTensor(MetaObj, torch.Tensor):
|
|
|
134
174
|
the list is typically maintained by `monai.transforms.TraceableTransform`.
|
|
135
175
|
See also: :py:class:`monai.transforms.TraceableTransform`
|
|
136
176
|
_args: additional args (currently not in use in this constructor).
|
|
177
|
+
spatial_ndim: optional number of spatial dimensions. If ``None``, derived
|
|
178
|
+
from the affine matrix clamped by the tensor shape.
|
|
137
179
|
_kwargs: additional kwargs (currently not in use in this constructor).
|
|
138
180
|
|
|
139
181
|
Note:
|
|
@@ -158,6 +200,14 @@ class MetaTensor(MetaObj, torch.Tensor):
|
|
|
158
200
|
self.affine = self.meta[MetaKeys.AFFINE]
|
|
159
201
|
else:
|
|
160
202
|
self.affine = self.get_default_affine()
|
|
203
|
+
# Initialize spatial_ndim from affine matrix (source of truth), clamped by tensor shape.
|
|
204
|
+
# This cached value is kept in sync via the affine setter for hot-path performance.
|
|
205
|
+
no_channel = _has_explicit_no_channel(self.meta)
|
|
206
|
+
if spatial_ndim is not None:
|
|
207
|
+
self.spatial_ndim = _normalize_spatial_ndim(spatial_ndim, self.ndim, no_channel=no_channel)
|
|
208
|
+
elif self.affine.ndim == 2:
|
|
209
|
+
self.spatial_ndim = _normalize_spatial_ndim(self.affine.shape[-1] - 1, self.ndim, no_channel=no_channel)
|
|
210
|
+
|
|
161
211
|
# applied_operations
|
|
162
212
|
if applied_operations is not None:
|
|
163
213
|
self.applied_operations = applied_operations
|
|
@@ -237,6 +287,7 @@ class MetaTensor(MetaObj, torch.Tensor):
|
|
|
237
287
|
if func == torch.Tensor.__getitem__:
|
|
238
288
|
if idx > 0 or len(args) < 2 or len(args[0]) < 1:
|
|
239
289
|
return ret
|
|
290
|
+
full_idx = args[1]
|
|
240
291
|
batch_idx = args[1][0] if isinstance(args[1], Sequence) else args[1]
|
|
241
292
|
# if using e.g., `batch[:, -1]` or `batch[..., -1]`, then the
|
|
242
293
|
# first element will be `slice(None, None, None)` and `Ellipsis`,
|
|
@@ -258,6 +309,8 @@ class MetaTensor(MetaObj, torch.Tensor):
|
|
|
258
309
|
ret_meta.is_batch = False
|
|
259
310
|
if hasattr(ret_meta, "__dict__"):
|
|
260
311
|
ret.__dict__ = ret_meta.__dict__.copy()
|
|
312
|
+
if _is_batch_only_index(full_idx):
|
|
313
|
+
ret.spatial_ndim = _normalize_spatial_ndim(ret.spatial_ndim, ret.ndim)
|
|
261
314
|
# `unbind` is used for `next(iter(batch))`. Also for `decollate_batch`.
|
|
262
315
|
# But we only want to split the batch if the `unbind` is along the 0th dimension.
|
|
263
316
|
elif func == torch.Tensor.unbind:
|
|
@@ -467,15 +520,42 @@ class MetaTensor(MetaObj, torch.Tensor):
|
|
|
467
520
|
|
|
468
521
|
@affine.setter
|
|
469
522
|
def affine(self, d: NdarrayTensor) -> None:
|
|
470
|
-
"""Set the affine.
|
|
471
|
-
|
|
523
|
+
"""Set the affine.
|
|
524
|
+
|
|
525
|
+
When setting a non-batched affine matrix, automatically synchronizes the cached
|
|
526
|
+
spatial_ndim attribute to maintain consistency between the affine matrix (source of truth)
|
|
527
|
+
and the cached spatial dimension count.
|
|
528
|
+
"""
|
|
529
|
+
a = torch.as_tensor(d, device=torch.device("cpu"), dtype=torch.float64)
|
|
530
|
+
self.meta[MetaKeys.AFFINE] = a
|
|
531
|
+
if a.ndim == 2: # non-batched: sync spatial_ndim from affine (source of truth)
|
|
532
|
+
no_channel = _has_explicit_no_channel(self.meta)
|
|
533
|
+
self.spatial_ndim = _normalize_spatial_ndim(a.shape[-1] - 1, self.ndim, no_channel=no_channel)
|
|
534
|
+
|
|
535
|
+
@property
|
|
536
|
+
def spatial_ndim(self) -> int:
|
|
537
|
+
"""Get the number of spatial dimensions.
|
|
538
|
+
|
|
539
|
+
This value is cached for hot-path performance and is kept in sync with the affine matrix
|
|
540
|
+
via the affine setter. The affine matrix is the source of truth for spatial dimensions.
|
|
541
|
+
"""
|
|
542
|
+
return getattr(self, "_spatial_ndim", _DEFAULT_SPATIAL_NDIM)
|
|
543
|
+
|
|
544
|
+
@spatial_ndim.setter
|
|
545
|
+
def spatial_ndim(self, val: int) -> None:
|
|
546
|
+
"""Set the number of spatial dimensions."""
|
|
547
|
+
if not isinstance(val, Integral):
|
|
548
|
+
raise TypeError(f"'val' must be an numbers.Integral type; got {type(val)}.")
|
|
549
|
+
if val < 1:
|
|
550
|
+
raise ValueError(f"spatial_ndim must be >= 1, got {val}")
|
|
551
|
+
self._spatial_ndim = int(val)
|
|
472
552
|
|
|
473
553
|
@property
|
|
474
554
|
def pixdim(self):
|
|
475
555
|
"""Get the spacing"""
|
|
476
556
|
if self.is_batch:
|
|
477
|
-
return [affine_to_spacing(a) for a in self.affine]
|
|
478
|
-
return affine_to_spacing(self.affine)
|
|
557
|
+
return [affine_to_spacing(a, r=self.spatial_ndim) for a in self.affine]
|
|
558
|
+
return affine_to_spacing(self.affine, r=self.spatial_ndim)
|
|
479
559
|
|
|
480
560
|
def peek_pending_shape(self):
|
|
481
561
|
"""
|
|
@@ -490,7 +570,7 @@ class MetaTensor(MetaObj, torch.Tensor):
|
|
|
490
570
|
|
|
491
571
|
def peek_pending_affine(self):
|
|
492
572
|
res = self.affine
|
|
493
|
-
r =
|
|
573
|
+
r = res.shape[-1] - 1 if res.ndim >= 2 else self.spatial_ndim
|
|
494
574
|
if r not in (2, 3):
|
|
495
575
|
warnings.warn(f"Only 2d and 3d affine are supported, got {r}d input.")
|
|
496
576
|
for p in self.pending_operations:
|
|
@@ -503,8 +583,10 @@ class MetaTensor(MetaObj, torch.Tensor):
|
|
|
503
583
|
return res
|
|
504
584
|
|
|
505
585
|
def peek_pending_rank(self):
|
|
506
|
-
|
|
507
|
-
|
|
586
|
+
if self.pending_operations:
|
|
587
|
+
a = self.pending_operations[-1].get(LazyAttr.AFFINE, None)
|
|
588
|
+
return 1 if a is None else int(max(1, len(a) - 1))
|
|
589
|
+
return self.spatial_ndim
|
|
508
590
|
|
|
509
591
|
def new_empty(self, size, dtype=None, device=None, requires_grad=False): # type: ignore[override]
|
|
510
592
|
"""
|
|
@@ -17,7 +17,6 @@ import logging
|
|
|
17
17
|
import math
|
|
18
18
|
import os
|
|
19
19
|
import pickle
|
|
20
|
-
import sys
|
|
21
20
|
from collections import abc, defaultdict
|
|
22
21
|
from collections.abc import Generator, Iterable, Mapping, Sequence, Sized
|
|
23
22
|
from copy import deepcopy
|
|
@@ -31,7 +30,7 @@ import torch
|
|
|
31
30
|
from torch.utils.data._utils.collate import default_collate
|
|
32
31
|
|
|
33
32
|
from monai.config.type_definitions import NdarrayOrTensor, NdarrayTensor, PathLike
|
|
34
|
-
from monai.data.meta_obj import MetaObj
|
|
33
|
+
from monai.data.meta_obj import _DEFAULT_SPATIAL_NDIM, MetaObj
|
|
35
34
|
from monai.utils import (
|
|
36
35
|
MAX_SEED,
|
|
37
36
|
BlendMode,
|
|
@@ -432,6 +431,9 @@ def collate_meta_tensor_fn(batch, *, collate_fn_map=None):
|
|
|
432
431
|
collated.meta = default_collate(meta_dicts)
|
|
433
432
|
collated.applied_operations = [i.applied_operations or TraceKeys.NONE for i in batch]
|
|
434
433
|
collated.is_batch = True
|
|
434
|
+
collated.spatial_ndim = min(
|
|
435
|
+
min(getattr(t, "spatial_ndim", _DEFAULT_SPATIAL_NDIM) for t in batch), max(collated.ndim - 1, 1)
|
|
436
|
+
)
|
|
435
437
|
return collated
|
|
436
438
|
|
|
437
439
|
|
|
@@ -1367,13 +1369,8 @@ def json_hashing(item) -> bytes:
|
|
|
1367
1369
|
|
|
1368
1370
|
"""
|
|
1369
1371
|
# TODO: Find way to hash transforms content as part of the cache
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
cache_key = hashlib.md5(json.dumps(item, sort_keys=True).encode("utf-8")).hexdigest()
|
|
1373
|
-
else:
|
|
1374
|
-
cache_key = hashlib.md5(
|
|
1375
|
-
json.dumps(item, sort_keys=True).encode("utf-8"), usedforsecurity=False # type: ignore
|
|
1376
|
-
).hexdigest()
|
|
1372
|
+
dump = json.dumps(item, sort_keys=True).encode("utf-8")
|
|
1373
|
+
cache_key = hashlib.sha256(dump, usedforsecurity=False).hexdigest() # type: ignore
|
|
1377
1374
|
return f"{cache_key}".encode()
|
|
1378
1375
|
|
|
1379
1376
|
|
|
@@ -1388,13 +1385,8 @@ def pickle_hashing(item, protocol=pickle.HIGHEST_PROTOCOL) -> bytes:
|
|
|
1388
1385
|
Returns: the corresponding hash key
|
|
1389
1386
|
|
|
1390
1387
|
"""
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
cache_key = hashlib.md5(pickle.dumps(sorted_dict(item), protocol=protocol)).hexdigest()
|
|
1394
|
-
else:
|
|
1395
|
-
cache_key = hashlib.md5(
|
|
1396
|
-
pickle.dumps(sorted_dict(item), protocol=protocol), usedforsecurity=False # type: ignore
|
|
1397
|
-
).hexdigest()
|
|
1388
|
+
dump = pickle.dumps(sorted_dict(item), protocol=protocol)
|
|
1389
|
+
cache_key = hashlib.sha256(dump, usedforsecurity=False).hexdigest() # type: ignore
|
|
1398
1390
|
return f"{cache_key}".encode()
|
|
1399
1391
|
|
|
1400
1392
|
|
|
@@ -309,9 +309,6 @@ class ZarrAvgMerger(Merger):
|
|
|
309
309
|
|
|
310
310
|
self.chunks = chunks
|
|
311
311
|
|
|
312
|
-
# Handle compressor/codecs based on zarr version
|
|
313
|
-
is_zarr_v3 = version_geq(get_package_version("zarr"), "3.0.0")
|
|
314
|
-
|
|
315
312
|
# Initialize codecs/compressor attributes with proper types
|
|
316
313
|
self.codecs: list | None = None
|
|
317
314
|
self.value_codecs: list | None = None
|
|
@@ -129,7 +129,8 @@ class PatchAdversarialLoss(_Loss):
|
|
|
129
129
|
target_is_real = True # With generator, we always want this to be true!
|
|
130
130
|
warnings.warn(
|
|
131
131
|
"Variable target_is_real has been set to False, but for_discriminator is set"
|
|
132
|
-
"to False. To optimise a generator, target_is_real must be set to True."
|
|
132
|
+
"to False. To optimise a generator, target_is_real must be set to True.",
|
|
133
|
+
stacklevel=2,
|
|
133
134
|
)
|
|
134
135
|
|
|
135
136
|
if not isinstance(input, list):
|
|
@@ -134,7 +134,8 @@ class SoftclDiceLoss(_Loss):
|
|
|
134
134
|
Args:
|
|
135
135
|
iter_: Number of iterations for skeletonization. Must be a non-negative integer. Defaults to 3.
|
|
136
136
|
smooth_nr: a small constant added to the numerator to avoid zero. Defaults to 1.0.
|
|
137
|
-
smooth_dr: a small constant added to the denominator
|
|
137
|
+
smooth_dr: a small constant added to the denominator of the individual precision /
|
|
138
|
+
sensitivity ratios and the internal Dice denominator to avoid nan. Defaults to 1.0.
|
|
138
139
|
smooth: a small constant added to the denominator of the harmonic mean to avoid nan. Defaults to 1e-4.
|
|
139
140
|
include_background: if False, channel index 0 (background category) is excluded from the calculation.
|
|
140
141
|
if the non-background segmentations are small compared to the total image size they can get overwhelmed
|
|
@@ -44,9 +44,58 @@ def spatial_gradient(x: torch.Tensor, dim: int) -> torch.Tensor:
|
|
|
44
44
|
return (x[slicing_s] - x[slicing_e]) / 2.0
|
|
45
45
|
|
|
46
46
|
|
|
47
|
+
def spatial_gradient_squared(x: torch.Tensor, dim_1: int, dim_2: int) -> torch.Tensor:
|
|
48
|
+
"""
|
|
49
|
+
Calculate the second-order partial derivative of ``x`` with respect to spatial dims
|
|
50
|
+
``dim_1`` and ``dim_2`` using compact central finite differences.
|
|
51
|
+
|
|
52
|
+
For ``dim_1 == dim_2`` the pure second derivative uses the ``[1, -2, 1]`` stencil:
|
|
53
|
+
``d2x[i] = x[i+1] - 2 * x[i] + x[i-1]``.
|
|
54
|
+
|
|
55
|
+
For ``dim_1 != dim_2`` the mixed partial uses the compact 4-point stencil:
|
|
56
|
+
``d2x[i, j] = (x[i+1, j+1] - x[i+1, j-1] - x[i-1, j+1] + x[i-1, j-1]) / 4``.
|
|
57
|
+
|
|
58
|
+
Every spatial dimension is sliced to ``[1:-1]`` so the output shape is independent of
|
|
59
|
+
``(dim_1, dim_2)``; this lets terms be summed together. Requires ``x.shape[d] > 2``
|
|
60
|
+
for every spatial dim ``d``.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
x: the shape should be BCH(WD).
|
|
64
|
+
dim_1: first spatial dimension index.
|
|
65
|
+
dim_2: second spatial dimension index.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
Tensor with batch and channel axes preserved and every spatial axis sliced to
|
|
69
|
+
``[1:-1]``.
|
|
70
|
+
"""
|
|
71
|
+
slice_inner = slice(1, -1)
|
|
72
|
+
slice_plus = slice(2, None)
|
|
73
|
+
slice_minus = slice(None, -2)
|
|
74
|
+
slice_all = slice(None)
|
|
75
|
+
|
|
76
|
+
def _idx(overrides: dict) -> list:
|
|
77
|
+
out: list = [slice_all, slice_all]
|
|
78
|
+
for d in range(2, x.ndim):
|
|
79
|
+
out.append(overrides.get(d, slice_inner))
|
|
80
|
+
return out
|
|
81
|
+
|
|
82
|
+
if dim_1 == dim_2:
|
|
83
|
+
return x[_idx({dim_1: slice_plus})] - 2 * x[_idx({})] + x[_idx({dim_1: slice_minus})]
|
|
84
|
+
return (
|
|
85
|
+
x[_idx({dim_1: slice_plus, dim_2: slice_plus})]
|
|
86
|
+
- x[_idx({dim_1: slice_plus, dim_2: slice_minus})]
|
|
87
|
+
- x[_idx({dim_1: slice_minus, dim_2: slice_plus})]
|
|
88
|
+
+ x[_idx({dim_1: slice_minus, dim_2: slice_minus})]
|
|
89
|
+
) / 4.0
|
|
90
|
+
|
|
91
|
+
|
|
47
92
|
class BendingEnergyLoss(_Loss):
|
|
48
93
|
"""
|
|
49
|
-
Calculate the bending energy based on second-order differentiation of ``pred
|
|
94
|
+
Calculate the bending energy based on second-order differentiation of ``pred``.
|
|
95
|
+
|
|
96
|
+
Pure second derivatives use the compact ``[1, -2, 1]`` stencil; mixed partials use a
|
|
97
|
+
compact 4-point central scheme. Both span three voxels per axis, so each spatial
|
|
98
|
+
dimension of ``pred`` only needs to be greater than 2.
|
|
50
99
|
|
|
51
100
|
For more information,
|
|
52
101
|
see https://github.com/Project-MONAI/tutorials/blob/main/modules/bending_energy_diffusion_loss_notes.ipynb.
|
|
@@ -79,41 +128,41 @@ class BendingEnergyLoss(_Loss):
|
|
|
79
128
|
Raises:
|
|
80
129
|
ValueError: When ``self.reduction`` is not one of ["mean", "sum", "none"].
|
|
81
130
|
ValueError: When ``pred`` is not 3-d, 4-d or 5-d.
|
|
82
|
-
ValueError: When any spatial dimension of ``pred`` has size less than or equal to
|
|
131
|
+
ValueError: When any spatial dimension of ``pred`` has size less than or equal to 2.
|
|
83
132
|
ValueError: When the number of channels of ``pred`` does not match the number of spatial dimensions.
|
|
84
133
|
|
|
85
134
|
"""
|
|
86
135
|
if pred.ndim not in [3, 4, 5]:
|
|
87
136
|
raise ValueError(f"Expecting 3-d, 4-d or 5-d pred, instead got pred of shape {pred.shape}")
|
|
88
137
|
for i in range(pred.ndim - 2):
|
|
89
|
-
if pred.shape[-i - 1] <=
|
|
90
|
-
raise ValueError(f"All spatial dimensions must be >
|
|
138
|
+
if pred.shape[-i - 1] <= 2:
|
|
139
|
+
raise ValueError(f"All spatial dimensions must be > 2, got spatial dimensions {pred.shape[2:]}")
|
|
91
140
|
if pred.shape[1] != pred.ndim - 2:
|
|
92
141
|
raise ValueError(
|
|
93
142
|
f"Number of vector components, i.e. number of channels of the input DDF, {pred.shape[1]}, "
|
|
94
143
|
f"does not match number of spatial dimensions, {pred.ndim - 2}"
|
|
95
144
|
)
|
|
96
145
|
|
|
97
|
-
# first order gradient
|
|
98
|
-
first_order_gradient = [spatial_gradient(pred, dim) for dim in range(2, pred.ndim)]
|
|
99
|
-
|
|
100
146
|
# spatial dimensions in a shape suited for broadcasting below
|
|
101
147
|
if self.normalize:
|
|
102
148
|
spatial_dims = torch.tensor(pred.shape, device=pred.device)[2:].reshape((1, -1) + (pred.ndim - 2) * (1,))
|
|
103
149
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
150
|
+
# Initialize on pred.device so a GPU `pred` does not get added to a CPU
|
|
151
|
+
# accumulator, and as a float so an integer-dtype `pred` still produces a
|
|
152
|
+
# floating-point energy (the compact pure-derivative stencil has no
|
|
153
|
+
# division, so a Long input would otherwise propagate as Long and fail
|
|
154
|
+
# `torch.mean` at the reduction step).
|
|
155
|
+
energy = torch.tensor(0.0, device=pred.device)
|
|
156
|
+
for dim_1 in range(2, pred.ndim):
|
|
157
|
+
d2 = spatial_gradient_squared(pred, dim_1, dim_1)
|
|
107
158
|
if self.normalize:
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
else:
|
|
111
|
-
energy = energy + spatial_gradient(g, dim_1) ** 2
|
|
159
|
+
d2 = d2 * (pred.shape[dim_1] ** 2 / spatial_dims)
|
|
160
|
+
energy = energy + d2**2
|
|
112
161
|
for dim_2 in range(dim_1 + 1, pred.ndim):
|
|
162
|
+
d2_mixed = spatial_gradient_squared(pred, dim_1, dim_2)
|
|
113
163
|
if self.normalize:
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
energy = energy + 2 * spatial_gradient(g, dim_2) ** 2
|
|
164
|
+
d2_mixed = d2_mixed * (pred.shape[dim_1] * pred.shape[dim_2] / spatial_dims)
|
|
165
|
+
energy = energy + 2 * d2_mixed**2
|
|
117
166
|
|
|
118
167
|
if self.reduction == LossReduction.MEAN.value:
|
|
119
168
|
energy = torch.mean(energy) # the batch and channel average
|