monai-weekly 1.5.dev2505__py3-none-any.whl → 1.5.dev2507__py3-none-any.whl
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/__init__.py +1 -1
- monai/_version.py +3 -3
- monai/apps/auto3dseg/transforms.py +1 -4
- monai/data/meta_tensor.py +5 -0
- monai/data/utils.py +6 -13
- monai/inferers/utils.py +1 -2
- monai/losses/dice.py +2 -14
- monai/losses/ds_loss.py +1 -3
- monai/networks/layers/simplelayers.py +2 -14
- monai/networks/utils.py +4 -16
- monai/transforms/compose.py +28 -11
- monai/transforms/croppad/array.py +1 -6
- monai/transforms/io/array.py +0 -1
- monai/transforms/transform.py +15 -6
- monai/transforms/utils.py +1 -2
- monai/utils/jupyter_utils.py +1 -1
- monai/utils/tf32.py +0 -10
- monai/visualize/class_activation_maps.py +5 -8
- monai/visualize/img2tensorboard.py +2 -2
- {monai_weekly-1.5.dev2505.dist-info → monai_weekly-1.5.dev2507.dist-info}/METADATA +2 -2
- monai_weekly-1.5.dev2507.dist-info/RECORD +1181 -0
- {monai_weekly-1.5.dev2505.dist-info → monai_weekly-1.5.dev2507.dist-info}/top_level.txt +1 -0
- tests/apps/__init__.py +10 -0
- tests/apps/deepedit/__init__.py +10 -0
- tests/apps/deepedit/test_deepedit_transforms.py +314 -0
- tests/apps/deepgrow/__init__.py +10 -0
- tests/apps/deepgrow/test_deepgrow_dataset.py +109 -0
- tests/apps/deepgrow/transforms/__init__.py +10 -0
- tests/apps/deepgrow/transforms/test_deepgrow_interaction.py +97 -0
- tests/apps/deepgrow/transforms/test_deepgrow_transforms.py +556 -0
- tests/apps/detection/__init__.py +10 -0
- tests/apps/detection/metrics/__init__.py +10 -0
- tests/apps/detection/metrics/test_detection_coco_metrics.py +69 -0
- tests/apps/detection/networks/__init__.py +10 -0
- tests/apps/detection/networks/test_retinanet.py +210 -0
- tests/apps/detection/networks/test_retinanet_detector.py +203 -0
- tests/apps/detection/test_box_transform.py +370 -0
- tests/apps/detection/utils/__init__.py +10 -0
- tests/apps/detection/utils/test_anchor_box.py +88 -0
- tests/apps/detection/utils/test_atss_box_matcher.py +46 -0
- tests/apps/detection/utils/test_box_coder.py +43 -0
- tests/apps/detection/utils/test_detector_boxselector.py +67 -0
- tests/apps/detection/utils/test_detector_utils.py +96 -0
- tests/apps/detection/utils/test_hardnegsampler.py +54 -0
- tests/apps/nuclick/__init__.py +10 -0
- tests/apps/nuclick/test_nuclick_transforms.py +259 -0
- tests/apps/pathology/__init__.py +10 -0
- tests/apps/pathology/handlers/__init__.py +10 -0
- tests/apps/pathology/handlers/test_from_engine_hovernet.py +38 -0
- tests/apps/pathology/test_lesion_froc.py +333 -0
- tests/apps/pathology/test_pathology_prob_nms.py +55 -0
- tests/apps/pathology/test_prepare_batch_hovernet.py +70 -0
- tests/apps/pathology/test_sliding_window_hovernet_inference.py +303 -0
- tests/apps/pathology/transforms/__init__.py +10 -0
- tests/apps/pathology/transforms/post/__init__.py +10 -0
- tests/apps/pathology/transforms/post/test_generate_distance_map.py +51 -0
- tests/apps/pathology/transforms/post/test_generate_distance_mapd.py +70 -0
- tests/apps/pathology/transforms/post/test_generate_instance_border.py +49 -0
- tests/apps/pathology/transforms/post/test_generate_instance_borderd.py +59 -0
- tests/apps/pathology/transforms/post/test_generate_instance_centroid.py +53 -0
- tests/apps/pathology/transforms/post/test_generate_instance_centroidd.py +56 -0
- tests/apps/pathology/transforms/post/test_generate_instance_contour.py +58 -0
- tests/apps/pathology/transforms/post/test_generate_instance_contourd.py +61 -0
- tests/apps/pathology/transforms/post/test_generate_instance_type.py +51 -0
- tests/apps/pathology/transforms/post/test_generate_instance_typed.py +53 -0
- tests/apps/pathology/transforms/post/test_generate_succinct_contour.py +55 -0
- tests/apps/pathology/transforms/post/test_generate_succinct_contourd.py +57 -0
- tests/apps/pathology/transforms/post/test_generate_watershed_markers.py +53 -0
- tests/apps/pathology/transforms/post/test_generate_watershed_markersd.py +83 -0
- tests/apps/pathology/transforms/post/test_generate_watershed_mask.py +77 -0
- tests/apps/pathology/transforms/post/test_generate_watershed_maskd.py +77 -0
- tests/apps/pathology/transforms/post/test_hovernet_instance_map_post_processing.py +61 -0
- tests/apps/pathology/transforms/post/test_hovernet_instance_map_post_processingd.py +66 -0
- tests/apps/pathology/transforms/post/test_hovernet_nuclear_type_post_processing.py +66 -0
- tests/apps/pathology/transforms/post/test_watershed.py +60 -0
- tests/apps/pathology/transforms/post/test_watershedd.py +70 -0
- tests/apps/pathology/transforms/test_pathology_he_stain.py +230 -0
- tests/apps/pathology/transforms/test_pathology_he_stain_dict.py +225 -0
- tests/apps/reconstruction/__init__.py +10 -0
- tests/apps/reconstruction/nets/__init__.py +10 -0
- tests/apps/reconstruction/nets/test_recon_net_utils.py +82 -0
- tests/apps/reconstruction/test_complex_utils.py +77 -0
- tests/apps/reconstruction/test_fastmri_reader.py +82 -0
- tests/apps/reconstruction/test_mri_utils.py +37 -0
- tests/apps/reconstruction/transforms/__init__.py +10 -0
- tests/apps/reconstruction/transforms/test_kspace_mask.py +50 -0
- tests/apps/reconstruction/transforms/test_reference_based_normalize_intensity.py +77 -0
- tests/apps/reconstruction/transforms/test_reference_based_spatial_cropd.py +57 -0
- tests/apps/test_auto3dseg_bundlegen.py +156 -0
- tests/apps/test_check_hash.py +53 -0
- tests/apps/test_cross_validation.py +74 -0
- tests/apps/test_decathlondataset.py +93 -0
- tests/apps/test_download_and_extract.py +70 -0
- tests/apps/test_download_url_yandex.py +45 -0
- tests/apps/test_mednistdataset.py +72 -0
- tests/apps/test_mmar_download.py +154 -0
- tests/apps/test_tciadataset.py +123 -0
- tests/apps/vista3d/__init__.py +10 -0
- tests/apps/vista3d/test_point_based_window_inferer.py +77 -0
- tests/apps/vista3d/test_vista3d_sampler.py +100 -0
- tests/apps/vista3d/test_vista3d_transforms.py +94 -0
- tests/bundle/__init__.py +10 -0
- tests/bundle/test_bundle_ckpt_export.py +107 -0
- tests/bundle/test_bundle_download.py +435 -0
- tests/bundle/test_bundle_get_data.py +94 -0
- tests/bundle/test_bundle_push_to_hf_hub.py +41 -0
- tests/bundle/test_bundle_trt_export.py +147 -0
- tests/bundle/test_bundle_utils.py +149 -0
- tests/bundle/test_bundle_verify_metadata.py +66 -0
- tests/bundle/test_bundle_verify_net.py +76 -0
- tests/bundle/test_bundle_workflow.py +272 -0
- tests/bundle/test_component_locator.py +38 -0
- tests/bundle/test_config_item.py +138 -0
- tests/bundle/test_config_parser.py +392 -0
- tests/bundle/test_reference_resolver.py +114 -0
- tests/config/__init__.py +10 -0
- tests/config/test_cv2_dist.py +53 -0
- tests/engines/__init__.py +10 -0
- tests/engines/test_ensemble_evaluator.py +94 -0
- tests/engines/test_prepare_batch_default.py +76 -0
- tests/engines/test_prepare_batch_default_dist.py +76 -0
- tests/engines/test_prepare_batch_diffusion.py +104 -0
- tests/engines/test_prepare_batch_extra_input.py +80 -0
- tests/fl/__init__.py +10 -0
- tests/fl/monai_algo/__init__.py +10 -0
- tests/fl/monai_algo/test_fl_monai_algo.py +251 -0
- tests/fl/monai_algo/test_fl_monai_algo_dist.py +117 -0
- tests/fl/test_fl_monai_algo_stats.py +81 -0
- tests/fl/utils/__init__.py +10 -0
- tests/fl/utils/test_fl_exchange_object.py +63 -0
- tests/handlers/__init__.py +10 -0
- tests/handlers/test_handler_checkpoint_loader.py +182 -0
- tests/handlers/test_handler_checkpoint_saver.py +233 -0
- tests/handlers/test_handler_classification_saver.py +64 -0
- tests/handlers/test_handler_classification_saver_dist.py +77 -0
- tests/handlers/test_handler_clearml_image.py +65 -0
- tests/handlers/test_handler_clearml_stats.py +65 -0
- tests/handlers/test_handler_confusion_matrix.py +104 -0
- tests/handlers/test_handler_confusion_matrix_dist.py +70 -0
- tests/handlers/test_handler_decollate_batch.py +66 -0
- tests/handlers/test_handler_early_stop.py +68 -0
- tests/handlers/test_handler_garbage_collector.py +73 -0
- tests/handlers/test_handler_hausdorff_distance.py +111 -0
- tests/handlers/test_handler_ignite_metric.py +191 -0
- tests/handlers/test_handler_lr_scheduler.py +94 -0
- tests/handlers/test_handler_mean_dice.py +98 -0
- tests/handlers/test_handler_mean_iou.py +76 -0
- tests/handlers/test_handler_metrics_reloaded.py +149 -0
- tests/handlers/test_handler_metrics_saver.py +89 -0
- tests/handlers/test_handler_metrics_saver_dist.py +120 -0
- tests/handlers/test_handler_mlflow.py +296 -0
- tests/handlers/test_handler_nvtx.py +93 -0
- tests/handlers/test_handler_panoptic_quality.py +89 -0
- tests/handlers/test_handler_parameter_scheduler.py +136 -0
- tests/handlers/test_handler_post_processing.py +74 -0
- tests/handlers/test_handler_prob_map_producer.py +111 -0
- tests/handlers/test_handler_regression_metrics.py +160 -0
- tests/handlers/test_handler_regression_metrics_dist.py +245 -0
- tests/handlers/test_handler_rocauc.py +48 -0
- tests/handlers/test_handler_rocauc_dist.py +54 -0
- tests/handlers/test_handler_stats.py +281 -0
- tests/handlers/test_handler_surface_distance.py +113 -0
- tests/handlers/test_handler_tb_image.py +61 -0
- tests/handlers/test_handler_tb_stats.py +166 -0
- tests/handlers/test_handler_validation.py +59 -0
- tests/handlers/test_trt_compile.py +145 -0
- tests/handlers/test_write_metrics_reports.py +68 -0
- tests/inferers/__init__.py +10 -0
- tests/inferers/test_avg_merger.py +179 -0
- tests/inferers/test_controlnet_inferers.py +1310 -0
- tests/inferers/test_diffusion_inferer.py +236 -0
- tests/inferers/test_latent_diffusion_inferer.py +824 -0
- tests/inferers/test_patch_inferer.py +309 -0
- tests/inferers/test_saliency_inferer.py +55 -0
- tests/inferers/test_slice_inferer.py +57 -0
- tests/inferers/test_sliding_window_inference.py +377 -0
- tests/inferers/test_sliding_window_splitter.py +284 -0
- tests/inferers/test_wsi_sliding_window_splitter.py +249 -0
- tests/inferers/test_zarr_avg_merger.py +326 -0
- tests/integration/__init__.py +10 -0
- tests/integration/test_auto3dseg_ensemble.py +211 -0
- tests/integration/test_auto3dseg_hpo.py +189 -0
- tests/integration/test_deepedit_interaction.py +122 -0
- tests/integration/test_downsample_block.py +50 -0
- tests/integration/test_hovernet_nuclear_type_post_processingd.py +71 -0
- tests/integration/test_integration_autorunner.py +201 -0
- tests/integration/test_integration_bundle_run.py +240 -0
- tests/integration/test_integration_classification_2d.py +282 -0
- tests/integration/test_integration_determinism.py +95 -0
- tests/integration/test_integration_fast_train.py +231 -0
- tests/integration/test_integration_gpu_customization.py +159 -0
- tests/integration/test_integration_lazy_samples.py +219 -0
- tests/integration/test_integration_nnunetv2_runner.py +96 -0
- tests/integration/test_integration_segmentation_3d.py +304 -0
- tests/integration/test_integration_sliding_window.py +100 -0
- tests/integration/test_integration_stn.py +133 -0
- tests/integration/test_integration_unet_2d.py +67 -0
- tests/integration/test_integration_workers.py +61 -0
- tests/integration/test_integration_workflows.py +365 -0
- tests/integration/test_integration_workflows_adversarial.py +173 -0
- tests/integration/test_integration_workflows_gan.py +158 -0
- tests/integration/test_loader_semaphore.py +48 -0
- tests/integration/test_mapping_filed.py +122 -0
- tests/integration/test_meta_affine.py +183 -0
- tests/integration/test_metatensor_integration.py +114 -0
- tests/integration/test_module_list.py +76 -0
- tests/integration/test_one_of.py +283 -0
- tests/integration/test_pad_collation.py +124 -0
- tests/integration/test_reg_loss_integration.py +107 -0
- tests/integration/test_retinanet_predict_utils.py +154 -0
- tests/integration/test_seg_loss_integration.py +159 -0
- tests/integration/test_spatial_combine_transforms.py +185 -0
- tests/integration/test_testtimeaugmentation.py +186 -0
- tests/integration/test_vis_gradbased.py +69 -0
- tests/integration/test_vista3d_utils.py +159 -0
- tests/losses/__init__.py +10 -0
- tests/losses/deform/__init__.py +10 -0
- tests/losses/deform/test_bending_energy.py +88 -0
- tests/losses/deform/test_diffusion_loss.py +117 -0
- tests/losses/image_dissimilarity/__init__.py +10 -0
- tests/losses/image_dissimilarity/test_global_mutual_information_loss.py +150 -0
- tests/losses/image_dissimilarity/test_local_normalized_cross_correlation_loss.py +162 -0
- tests/losses/test_adversarial_loss.py +94 -0
- tests/losses/test_barlow_twins_loss.py +109 -0
- tests/losses/test_cldice_loss.py +51 -0
- tests/losses/test_contrastive_loss.py +86 -0
- tests/losses/test_dice_ce_loss.py +123 -0
- tests/losses/test_dice_focal_loss.py +124 -0
- tests/losses/test_dice_loss.py +227 -0
- tests/losses/test_ds_loss.py +189 -0
- tests/losses/test_focal_loss.py +379 -0
- tests/losses/test_generalized_dice_focal_loss.py +85 -0
- tests/losses/test_generalized_dice_loss.py +221 -0
- tests/losses/test_generalized_wasserstein_dice_loss.py +234 -0
- tests/losses/test_giou_loss.py +62 -0
- tests/losses/test_hausdorff_loss.py +264 -0
- tests/losses/test_masked_dice_loss.py +152 -0
- tests/losses/test_masked_loss.py +87 -0
- tests/losses/test_multi_scale.py +86 -0
- tests/losses/test_nacl_loss.py +167 -0
- tests/losses/test_perceptual_loss.py +122 -0
- tests/losses/test_spectral_loss.py +86 -0
- tests/losses/test_ssim_loss.py +59 -0
- tests/losses/test_sure_loss.py +72 -0
- tests/losses/test_tversky_loss.py +198 -0
- tests/losses/test_unified_focal_loss.py +66 -0
- tests/metrics/__init__.py +10 -0
- tests/metrics/test_compute_confusion_matrix.py +294 -0
- tests/metrics/test_compute_f_beta.py +80 -0
- tests/metrics/test_compute_fid_metric.py +40 -0
- tests/metrics/test_compute_froc.py +143 -0
- tests/metrics/test_compute_generalized_dice.py +240 -0
- tests/metrics/test_compute_meandice.py +306 -0
- tests/metrics/test_compute_meaniou.py +223 -0
- tests/metrics/test_compute_mmd_metric.py +56 -0
- tests/metrics/test_compute_multiscalessim_metric.py +83 -0
- tests/metrics/test_compute_panoptic_quality.py +113 -0
- tests/metrics/test_compute_regression_metrics.py +196 -0
- tests/metrics/test_compute_roc_auc.py +155 -0
- tests/metrics/test_compute_variance.py +147 -0
- tests/metrics/test_cumulative.py +63 -0
- tests/metrics/test_cumulative_average.py +74 -0
- tests/metrics/test_cumulative_average_dist.py +48 -0
- tests/metrics/test_hausdorff_distance.py +209 -0
- tests/metrics/test_label_quality_score.py +134 -0
- tests/metrics/test_loss_metric.py +57 -0
- tests/metrics/test_metrics_reloaded.py +96 -0
- tests/metrics/test_ssim_metric.py +78 -0
- tests/metrics/test_surface_dice.py +416 -0
- tests/metrics/test_surface_distance.py +186 -0
- tests/networks/__init__.py +10 -0
- tests/networks/blocks/__init__.py +10 -0
- tests/networks/blocks/dints_block/__init__.py +10 -0
- tests/networks/blocks/dints_block/test_acn_block.py +41 -0
- tests/networks/blocks/dints_block/test_factorized_increase.py +37 -0
- tests/networks/blocks/dints_block/test_factorized_reduce.py +37 -0
- tests/networks/blocks/dints_block/test_p3d_block.py +78 -0
- tests/networks/blocks/test_adn.py +86 -0
- tests/networks/blocks/test_convolutions.py +156 -0
- tests/networks/blocks/test_crf_cpu.py +513 -0
- tests/networks/blocks/test_crf_cuda.py +528 -0
- tests/networks/blocks/test_crossattention.py +185 -0
- tests/networks/blocks/test_denseblock.py +105 -0
- tests/networks/blocks/test_dynunet_block.py +116 -0
- tests/networks/blocks/test_fpn_block.py +88 -0
- tests/networks/blocks/test_localnet_block.py +121 -0
- tests/networks/blocks/test_mlp.py +78 -0
- tests/networks/blocks/test_patchembedding.py +212 -0
- tests/networks/blocks/test_regunet_block.py +103 -0
- tests/networks/blocks/test_se_block.py +85 -0
- tests/networks/blocks/test_se_blocks.py +78 -0
- tests/networks/blocks/test_segresnet_block.py +57 -0
- tests/networks/blocks/test_selfattention.py +232 -0
- tests/networks/blocks/test_simple_aspp.py +87 -0
- tests/networks/blocks/test_spatialattention.py +55 -0
- tests/networks/blocks/test_subpixel_upsample.py +87 -0
- tests/networks/blocks/test_text_encoding.py +49 -0
- tests/networks/blocks/test_transformerblock.py +90 -0
- tests/networks/blocks/test_unetr_block.py +158 -0
- tests/networks/blocks/test_upsample_block.py +134 -0
- tests/networks/blocks/warp/__init__.py +10 -0
- tests/networks/blocks/warp/test_dvf2ddf.py +72 -0
- tests/networks/blocks/warp/test_warp.py +250 -0
- tests/networks/layers/__init__.py +10 -0
- tests/networks/layers/filtering/__init__.py +10 -0
- tests/networks/layers/filtering/test_bilateral_approx_cpu.py +399 -0
- tests/networks/layers/filtering/test_bilateral_approx_cuda.py +404 -0
- tests/networks/layers/filtering/test_bilateral_precise.py +437 -0
- tests/networks/layers/filtering/test_phl_cpu.py +259 -0
- tests/networks/layers/filtering/test_phl_cuda.py +167 -0
- tests/networks/layers/filtering/test_trainable_bilateral.py +474 -0
- tests/networks/layers/filtering/test_trainable_joint_bilateral.py +609 -0
- tests/networks/layers/test_affine_transform.py +385 -0
- tests/networks/layers/test_apply_filter.py +89 -0
- tests/networks/layers/test_channel_pad.py +51 -0
- tests/networks/layers/test_conjugate_gradient.py +56 -0
- tests/networks/layers/test_drop_path.py +46 -0
- tests/networks/layers/test_gaussian.py +317 -0
- tests/networks/layers/test_gaussian_filter.py +206 -0
- tests/networks/layers/test_get_layers.py +65 -0
- tests/networks/layers/test_gmm.py +314 -0
- tests/networks/layers/test_grid_pull.py +93 -0
- tests/networks/layers/test_hilbert_transform.py +131 -0
- tests/networks/layers/test_lltm.py +62 -0
- tests/networks/layers/test_median_filter.py +52 -0
- tests/networks/layers/test_polyval.py +55 -0
- tests/networks/layers/test_preset_filters.py +136 -0
- tests/networks/layers/test_savitzky_golay_filter.py +141 -0
- tests/networks/layers/test_separable_filter.py +87 -0
- tests/networks/layers/test_skip_connection.py +48 -0
- tests/networks/layers/test_vector_quantizer.py +89 -0
- tests/networks/layers/test_weight_init.py +50 -0
- tests/networks/nets/__init__.py +10 -0
- tests/networks/nets/dints/__init__.py +10 -0
- tests/networks/nets/dints/test_dints_cell.py +110 -0
- tests/networks/nets/dints/test_dints_mixop.py +84 -0
- tests/networks/nets/regunet/__init__.py +10 -0
- tests/networks/nets/regunet/test_localnet.py +86 -0
- tests/networks/nets/regunet/test_regunet.py +88 -0
- tests/networks/nets/test_ahnet.py +224 -0
- tests/networks/nets/test_attentionunet.py +88 -0
- tests/networks/nets/test_autoencoder.py +95 -0
- tests/networks/nets/test_autoencoderkl.py +337 -0
- tests/networks/nets/test_basic_unet.py +102 -0
- tests/networks/nets/test_basic_unetplusplus.py +109 -0
- tests/networks/nets/test_bundle_init_bundle.py +55 -0
- tests/networks/nets/test_cell_sam_wrapper.py +58 -0
- tests/networks/nets/test_controlnet.py +215 -0
- tests/networks/nets/test_daf3d.py +62 -0
- tests/networks/nets/test_densenet.py +121 -0
- tests/networks/nets/test_diffusion_model_unet.py +585 -0
- tests/networks/nets/test_dints_network.py +168 -0
- tests/networks/nets/test_discriminator.py +59 -0
- tests/networks/nets/test_dynunet.py +181 -0
- tests/networks/nets/test_efficientnet.py +400 -0
- tests/networks/nets/test_flexible_unet.py +341 -0
- tests/networks/nets/test_fullyconnectednet.py +69 -0
- tests/networks/nets/test_generator.py +59 -0
- tests/networks/nets/test_globalnet.py +103 -0
- tests/networks/nets/test_highresnet.py +67 -0
- tests/networks/nets/test_hovernet.py +218 -0
- tests/networks/nets/test_mednext.py +122 -0
- tests/networks/nets/test_milmodel.py +92 -0
- tests/networks/nets/test_net_adapter.py +68 -0
- tests/networks/nets/test_network_consistency.py +86 -0
- tests/networks/nets/test_patch_gan_dicriminator.py +179 -0
- tests/networks/nets/test_quicknat.py +57 -0
- tests/networks/nets/test_resnet.py +340 -0
- tests/networks/nets/test_segresnet.py +120 -0
- tests/networks/nets/test_segresnet_ds.py +156 -0
- tests/networks/nets/test_senet.py +151 -0
- tests/networks/nets/test_spade_autoencoderkl.py +295 -0
- tests/networks/nets/test_spade_diffusion_model_unet.py +574 -0
- tests/networks/nets/test_spade_vaegan.py +140 -0
- tests/networks/nets/test_swin_unetr.py +139 -0
- tests/networks/nets/test_torchvision_fc_model.py +201 -0
- tests/networks/nets/test_transchex.py +84 -0
- tests/networks/nets/test_transformer.py +108 -0
- tests/networks/nets/test_unet.py +208 -0
- tests/networks/nets/test_unetr.py +137 -0
- tests/networks/nets/test_varautoencoder.py +127 -0
- tests/networks/nets/test_vista3d.py +84 -0
- tests/networks/nets/test_vit.py +139 -0
- tests/networks/nets/test_vitautoenc.py +112 -0
- tests/networks/nets/test_vnet.py +81 -0
- tests/networks/nets/test_voxelmorph.py +280 -0
- tests/networks/nets/test_vqvae.py +274 -0
- tests/networks/nets/test_vqvaetransformer_inferer.py +295 -0
- tests/networks/schedulers/__init__.py +10 -0
- tests/networks/schedulers/test_scheduler_ddim.py +83 -0
- tests/networks/schedulers/test_scheduler_ddpm.py +104 -0
- tests/networks/schedulers/test_scheduler_pndm.py +108 -0
- tests/networks/test_bundle_onnx_export.py +71 -0
- tests/networks/test_convert_to_onnx.py +106 -0
- tests/networks/test_convert_to_torchscript.py +46 -0
- tests/networks/test_convert_to_trt.py +79 -0
- tests/networks/test_save_state.py +73 -0
- tests/networks/test_to_onehot.py +63 -0
- tests/networks/test_varnet.py +63 -0
- tests/networks/utils/__init__.py +10 -0
- tests/networks/utils/test_copy_model_state.py +187 -0
- tests/networks/utils/test_eval_mode.py +34 -0
- tests/networks/utils/test_freeze_layers.py +61 -0
- tests/networks/utils/test_replace_module.py +98 -0
- tests/networks/utils/test_train_mode.py +34 -0
- tests/optimizers/__init__.py +10 -0
- tests/optimizers/test_generate_param_groups.py +105 -0
- tests/optimizers/test_lr_finder.py +108 -0
- tests/optimizers/test_lr_scheduler.py +71 -0
- tests/optimizers/test_optim_novograd.py +100 -0
- tests/profile_subclass/__init__.py +10 -0
- tests/profile_subclass/cprofile_profiling.py +29 -0
- tests/profile_subclass/min_classes.py +30 -0
- tests/profile_subclass/profiling.py +73 -0
- tests/profile_subclass/pyspy_profiling.py +41 -0
- tests/transforms/__init__.py +10 -0
- tests/transforms/compose/__init__.py +10 -0
- tests/transforms/compose/test_compose.py +758 -0
- tests/transforms/compose/test_some_of.py +258 -0
- tests/transforms/croppad/__init__.py +10 -0
- tests/transforms/croppad/test_rand_weighted_crop.py +224 -0
- tests/transforms/croppad/test_rand_weighted_cropd.py +182 -0
- tests/transforms/functional/__init__.py +10 -0
- tests/transforms/functional/test_apply.py +75 -0
- tests/transforms/functional/test_resample.py +50 -0
- tests/transforms/intensity/__init__.py +10 -0
- tests/transforms/intensity/test_compute_ho_ver_maps.py +75 -0
- tests/transforms/intensity/test_compute_ho_ver_maps_d.py +79 -0
- tests/transforms/intensity/test_foreground_mask.py +98 -0
- tests/transforms/intensity/test_foreground_maskd.py +106 -0
- tests/transforms/intensity/test_rand_histogram_shiftd.py +76 -0
- tests/transforms/intensity/test_scale_intensity_range_percentiles.py +96 -0
- tests/transforms/intensity/test_scale_intensity_range_percentilesd.py +100 -0
- tests/transforms/inverse/__init__.py +10 -0
- tests/transforms/inverse/test_inverse_array.py +76 -0
- tests/transforms/inverse/test_traceable_transform.py +59 -0
- tests/transforms/post/__init__.py +10 -0
- tests/transforms/post/test_label_filterd.py +78 -0
- tests/transforms/post/test_probnms.py +72 -0
- tests/transforms/post/test_probnmsd.py +79 -0
- tests/transforms/post/test_remove_small_objects.py +102 -0
- tests/transforms/spatial/__init__.py +10 -0
- tests/transforms/spatial/test_convert_box_points.py +119 -0
- tests/transforms/spatial/test_grid_patch.py +134 -0
- tests/transforms/spatial/test_grid_patchd.py +102 -0
- tests/transforms/spatial/test_rand_grid_patch.py +150 -0
- tests/transforms/spatial/test_rand_grid_patchd.py +117 -0
- tests/transforms/spatial/test_spatial_resampled.py +124 -0
- tests/transforms/test_activations.py +120 -0
- tests/transforms/test_activationsd.py +64 -0
- tests/transforms/test_adaptors.py +160 -0
- tests/transforms/test_add_coordinate_channels.py +53 -0
- tests/transforms/test_add_coordinate_channelsd.py +67 -0
- tests/transforms/test_add_extreme_points_channel.py +80 -0
- tests/transforms/test_add_extreme_points_channeld.py +77 -0
- tests/transforms/test_adjust_contrast.py +70 -0
- tests/transforms/test_adjust_contrastd.py +64 -0
- tests/transforms/test_affine.py +245 -0
- tests/transforms/test_affine_grid.py +152 -0
- tests/transforms/test_affined.py +190 -0
- tests/transforms/test_as_channel_last.py +38 -0
- tests/transforms/test_as_channel_lastd.py +44 -0
- tests/transforms/test_as_discrete.py +81 -0
- tests/transforms/test_as_discreted.py +82 -0
- tests/transforms/test_border_pad.py +49 -0
- tests/transforms/test_border_padd.py +45 -0
- tests/transforms/test_bounding_rect.py +54 -0
- tests/transforms/test_bounding_rectd.py +53 -0
- tests/transforms/test_cast_to_type.py +63 -0
- tests/transforms/test_cast_to_typed.py +74 -0
- tests/transforms/test_center_scale_crop.py +55 -0
- tests/transforms/test_center_scale_cropd.py +56 -0
- tests/transforms/test_center_spatial_crop.py +56 -0
- tests/transforms/test_center_spatial_cropd.py +63 -0
- tests/transforms/test_classes_to_indices.py +93 -0
- tests/transforms/test_classes_to_indicesd.py +110 -0
- tests/transforms/test_clip_intensity_percentiles.py +196 -0
- tests/transforms/test_clip_intensity_percentilesd.py +193 -0
- tests/transforms/test_compose_get_number_conversions.py +127 -0
- tests/transforms/test_concat_itemsd.py +82 -0
- tests/transforms/test_convert_to_multi_channel.py +59 -0
- tests/transforms/test_convert_to_multi_channeld.py +37 -0
- tests/transforms/test_copy_itemsd.py +86 -0
- tests/transforms/test_create_grid_and_affine.py +274 -0
- tests/transforms/test_crop_foreground.py +164 -0
- tests/transforms/test_crop_foregroundd.py +205 -0
- tests/transforms/test_cucim_dict_transform.py +142 -0
- tests/transforms/test_cucim_transform.py +141 -0
- tests/transforms/test_data_stats.py +221 -0
- tests/transforms/test_data_statsd.py +249 -0
- tests/transforms/test_delete_itemsd.py +58 -0
- tests/transforms/test_detect_envelope.py +159 -0
- tests/transforms/test_distance_transform_edt.py +202 -0
- tests/transforms/test_divisible_pad.py +49 -0
- tests/transforms/test_divisible_padd.py +42 -0
- tests/transforms/test_ensure_channel_first.py +113 -0
- tests/transforms/test_ensure_channel_firstd.py +85 -0
- tests/transforms/test_ensure_type.py +94 -0
- tests/transforms/test_ensure_typed.py +110 -0
- tests/transforms/test_fg_bg_to_indices.py +83 -0
- tests/transforms/test_fg_bg_to_indicesd.py +78 -0
- tests/transforms/test_fill_holes.py +207 -0
- tests/transforms/test_fill_holesd.py +209 -0
- tests/transforms/test_flatten_sub_keysd.py +64 -0
- tests/transforms/test_flip.py +83 -0
- tests/transforms/test_flipd.py +90 -0
- tests/transforms/test_fourier.py +70 -0
- tests/transforms/test_gaussian_sharpen.py +92 -0
- tests/transforms/test_gaussian_sharpend.py +92 -0
- tests/transforms/test_gaussian_smooth.py +96 -0
- tests/transforms/test_gaussian_smoothd.py +96 -0
- tests/transforms/test_generate_label_classes_crop_centers.py +71 -0
- tests/transforms/test_generate_pos_neg_label_crop_centers.py +76 -0
- tests/transforms/test_generate_spatial_bounding_box.py +114 -0
- tests/transforms/test_get_extreme_points.py +57 -0
- tests/transforms/test_gibbs_noise.py +75 -0
- tests/transforms/test_gibbs_noised.py +88 -0
- tests/transforms/test_grid_distortion.py +113 -0
- tests/transforms/test_grid_distortiond.py +87 -0
- tests/transforms/test_grid_split.py +88 -0
- tests/transforms/test_grid_splitd.py +96 -0
- tests/transforms/test_histogram_normalize.py +59 -0
- tests/transforms/test_histogram_normalized.py +59 -0
- tests/transforms/test_image_filter.py +259 -0
- tests/transforms/test_intensity_stats.py +73 -0
- tests/transforms/test_intensity_statsd.py +90 -0
- tests/transforms/test_inverse.py +521 -0
- tests/transforms/test_inverse_collation.py +147 -0
- tests/transforms/test_invert.py +105 -0
- tests/transforms/test_invertd.py +142 -0
- tests/transforms/test_k_space_spike_noise.py +81 -0
- tests/transforms/test_k_space_spike_noised.py +98 -0
- tests/transforms/test_keep_largest_connected_component.py +419 -0
- tests/transforms/test_keep_largest_connected_componentd.py +348 -0
- tests/transforms/test_label_filter.py +78 -0
- tests/transforms/test_label_to_contour.py +179 -0
- tests/transforms/test_label_to_contourd.py +182 -0
- tests/transforms/test_label_to_mask.py +69 -0
- tests/transforms/test_label_to_maskd.py +70 -0
- tests/transforms/test_load_image.py +502 -0
- tests/transforms/test_load_imaged.py +198 -0
- tests/transforms/test_load_spacing_orientation.py +149 -0
- tests/transforms/test_map_and_generate_sampling_centers.py +86 -0
- tests/transforms/test_map_binary_to_indices.py +75 -0
- tests/transforms/test_map_classes_to_indices.py +135 -0
- tests/transforms/test_map_label_value.py +89 -0
- tests/transforms/test_map_label_valued.py +85 -0
- tests/transforms/test_map_transform.py +45 -0
- tests/transforms/test_mask_intensity.py +74 -0
- tests/transforms/test_mask_intensityd.py +68 -0
- tests/transforms/test_mean_ensemble.py +77 -0
- tests/transforms/test_mean_ensembled.py +91 -0
- tests/transforms/test_median_smooth.py +41 -0
- tests/transforms/test_median_smoothd.py +65 -0
- tests/transforms/test_morphological_ops.py +101 -0
- tests/transforms/test_nifti_endianness.py +107 -0
- tests/transforms/test_normalize_intensity.py +143 -0
- tests/transforms/test_normalize_intensityd.py +81 -0
- tests/transforms/test_nvtx_decorator.py +289 -0
- tests/transforms/test_nvtx_transform.py +143 -0
- tests/transforms/test_orientation.py +247 -0
- tests/transforms/test_orientationd.py +112 -0
- tests/transforms/test_rand_adjust_contrast.py +45 -0
- tests/transforms/test_rand_adjust_contrastd.py +44 -0
- tests/transforms/test_rand_affine.py +201 -0
- tests/transforms/test_rand_affine_grid.py +212 -0
- tests/transforms/test_rand_affined.py +281 -0
- tests/transforms/test_rand_axis_flip.py +50 -0
- tests/transforms/test_rand_axis_flipd.py +50 -0
- tests/transforms/test_rand_bias_field.py +69 -0
- tests/transforms/test_rand_bias_fieldd.py +65 -0
- tests/transforms/test_rand_coarse_dropout.py +110 -0
- tests/transforms/test_rand_coarse_dropoutd.py +107 -0
- tests/transforms/test_rand_coarse_shuffle.py +65 -0
- tests/transforms/test_rand_coarse_shuffled.py +59 -0
- tests/transforms/test_rand_crop_by_label_classes.py +170 -0
- tests/transforms/test_rand_crop_by_label_classesd.py +159 -0
- tests/transforms/test_rand_crop_by_pos_neg_label.py +152 -0
- tests/transforms/test_rand_crop_by_pos_neg_labeld.py +172 -0
- tests/transforms/test_rand_cucim_dict_transform.py +162 -0
- tests/transforms/test_rand_cucim_transform.py +162 -0
- tests/transforms/test_rand_deform_grid.py +138 -0
- tests/transforms/test_rand_elastic_2d.py +127 -0
- tests/transforms/test_rand_elastic_3d.py +104 -0
- tests/transforms/test_rand_elasticd_2d.py +177 -0
- tests/transforms/test_rand_elasticd_3d.py +156 -0
- tests/transforms/test_rand_flip.py +60 -0
- tests/transforms/test_rand_flipd.py +55 -0
- tests/transforms/test_rand_gaussian_noise.py +48 -0
- tests/transforms/test_rand_gaussian_noised.py +54 -0
- tests/transforms/test_rand_gaussian_sharpen.py +140 -0
- tests/transforms/test_rand_gaussian_sharpend.py +143 -0
- tests/transforms/test_rand_gaussian_smooth.py +98 -0
- tests/transforms/test_rand_gaussian_smoothd.py +98 -0
- tests/transforms/test_rand_gibbs_noise.py +103 -0
- tests/transforms/test_rand_gibbs_noised.py +117 -0
- tests/transforms/test_rand_grid_distortion.py +99 -0
- tests/transforms/test_rand_grid_distortiond.py +90 -0
- tests/transforms/test_rand_histogram_shift.py +92 -0
- tests/transforms/test_rand_k_space_spike_noise.py +92 -0
- tests/transforms/test_rand_k_space_spike_noised.py +76 -0
- tests/transforms/test_rand_rician_noise.py +52 -0
- tests/transforms/test_rand_rician_noised.py +52 -0
- tests/transforms/test_rand_rotate.py +166 -0
- tests/transforms/test_rand_rotate90.py +100 -0
- tests/transforms/test_rand_rotate90d.py +112 -0
- tests/transforms/test_rand_rotated.py +187 -0
- tests/transforms/test_rand_scale_crop.py +78 -0
- tests/transforms/test_rand_scale_cropd.py +98 -0
- tests/transforms/test_rand_scale_intensity.py +54 -0
- tests/transforms/test_rand_scale_intensity_fixed_mean.py +41 -0
- tests/transforms/test_rand_scale_intensity_fixed_meand.py +41 -0
- tests/transforms/test_rand_scale_intensityd.py +53 -0
- tests/transforms/test_rand_shift_intensity.py +52 -0
- tests/transforms/test_rand_shift_intensityd.py +67 -0
- tests/transforms/test_rand_simulate_low_resolution.py +83 -0
- tests/transforms/test_rand_simulate_low_resolutiond.py +73 -0
- tests/transforms/test_rand_spatial_crop.py +107 -0
- tests/transforms/test_rand_spatial_crop_samples.py +128 -0
- tests/transforms/test_rand_spatial_crop_samplesd.py +147 -0
- tests/transforms/test_rand_spatial_cropd.py +112 -0
- tests/transforms/test_rand_std_shift_intensity.py +43 -0
- tests/transforms/test_rand_std_shift_intensityd.py +38 -0
- tests/transforms/test_rand_zoom.py +105 -0
- tests/transforms/test_rand_zoomd.py +108 -0
- tests/transforms/test_randidentity.py +49 -0
- tests/transforms/test_random_order.py +144 -0
- tests/transforms/test_randtorchvisiond.py +65 -0
- tests/transforms/test_regularization.py +139 -0
- tests/transforms/test_remove_repeated_channel.py +34 -0
- tests/transforms/test_remove_repeated_channeld.py +44 -0
- tests/transforms/test_repeat_channel.py +34 -0
- tests/transforms/test_repeat_channeld.py +41 -0
- tests/transforms/test_resample_backends.py +65 -0
- tests/transforms/test_resample_to_match.py +110 -0
- tests/transforms/test_resample_to_matchd.py +93 -0
- tests/transforms/test_resampler.py +165 -0
- tests/transforms/test_resize.py +140 -0
- tests/transforms/test_resize_with_pad_or_crop.py +91 -0
- tests/transforms/test_resize_with_pad_or_cropd.py +86 -0
- tests/transforms/test_resized.py +163 -0
- tests/transforms/test_rotate.py +160 -0
- tests/transforms/test_rotate90.py +212 -0
- tests/transforms/test_rotate90d.py +106 -0
- tests/transforms/test_rotated.py +179 -0
- tests/transforms/test_save_classificationd.py +109 -0
- tests/transforms/test_save_image.py +80 -0
- tests/transforms/test_save_imaged.py +130 -0
- tests/transforms/test_savitzky_golay_smooth.py +73 -0
- tests/transforms/test_savitzky_golay_smoothd.py +73 -0
- tests/transforms/test_scale_intensity.py +76 -0
- tests/transforms/test_scale_intensity_fixed_mean.py +94 -0
- tests/transforms/test_scale_intensity_range.py +41 -0
- tests/transforms/test_scale_intensity_ranged.py +40 -0
- tests/transforms/test_scale_intensityd.py +57 -0
- tests/transforms/test_select_itemsd.py +41 -0
- tests/transforms/test_shift_intensity.py +31 -0
- tests/transforms/test_shift_intensityd.py +44 -0
- tests/transforms/test_signal_continuouswavelet.py +44 -0
- tests/transforms/test_signal_fillempty.py +52 -0
- tests/transforms/test_signal_fillemptyd.py +60 -0
- tests/transforms/test_signal_rand_add_gaussiannoise.py +50 -0
- tests/transforms/test_signal_rand_add_sine.py +52 -0
- tests/transforms/test_signal_rand_add_sine_partial.py +50 -0
- tests/transforms/test_signal_rand_add_squarepulse.py +58 -0
- tests/transforms/test_signal_rand_add_squarepulse_partial.py +62 -0
- tests/transforms/test_signal_rand_drop.py +50 -0
- tests/transforms/test_signal_rand_scale.py +52 -0
- tests/transforms/test_signal_rand_shift.py +55 -0
- tests/transforms/test_signal_remove_frequency.py +71 -0
- tests/transforms/test_smooth_field.py +177 -0
- tests/transforms/test_sobel_gradient.py +189 -0
- tests/transforms/test_sobel_gradientd.py +212 -0
- tests/transforms/test_spacing.py +381 -0
- tests/transforms/test_spacingd.py +178 -0
- tests/transforms/test_spatial_crop.py +82 -0
- tests/transforms/test_spatial_cropd.py +74 -0
- tests/transforms/test_spatial_pad.py +57 -0
- tests/transforms/test_spatial_padd.py +43 -0
- tests/transforms/test_spatial_resample.py +235 -0
- tests/transforms/test_squeezedim.py +62 -0
- tests/transforms/test_squeezedimd.py +98 -0
- tests/transforms/test_std_shift_intensity.py +76 -0
- tests/transforms/test_std_shift_intensityd.py +74 -0
- tests/transforms/test_threshold_intensity.py +38 -0
- tests/transforms/test_threshold_intensityd.py +58 -0
- tests/transforms/test_to_contiguous.py +47 -0
- tests/transforms/test_to_cupy.py +112 -0
- tests/transforms/test_to_cupyd.py +76 -0
- tests/transforms/test_to_device.py +42 -0
- tests/transforms/test_to_deviced.py +37 -0
- tests/transforms/test_to_numpy.py +85 -0
- tests/transforms/test_to_numpyd.py +68 -0
- tests/transforms/test_to_pil.py +52 -0
- tests/transforms/test_to_pild.py +50 -0
- tests/transforms/test_to_tensor.py +60 -0
- tests/transforms/test_to_tensord.py +71 -0
- tests/transforms/test_torchvision.py +66 -0
- tests/transforms/test_torchvisiond.py +63 -0
- tests/transforms/test_transform.py +62 -0
- tests/transforms/test_transpose.py +41 -0
- tests/transforms/test_transposed.py +52 -0
- tests/transforms/test_ultrasound_confidence_map_transform.py +711 -0
- tests/transforms/test_utils_pytorch_numpy_unification.py +90 -0
- tests/transforms/test_vote_ensemble.py +84 -0
- tests/transforms/test_vote_ensembled.py +107 -0
- tests/transforms/test_with_allow_missing_keys.py +76 -0
- tests/transforms/test_zoom.py +120 -0
- tests/transforms/test_zoomd.py +94 -0
- tests/transforms/transform/__init__.py +10 -0
- tests/transforms/transform/test_randomizable.py +52 -0
- tests/transforms/transform/test_randomizable_transform_type.py +37 -0
- tests/transforms/utility/__init__.py +10 -0
- tests/transforms/utility/test_apply_transform_to_points.py +81 -0
- tests/transforms/utility/test_apply_transform_to_pointsd.py +185 -0
- tests/transforms/utility/test_identity.py +29 -0
- tests/transforms/utility/test_identityd.py +30 -0
- tests/transforms/utility/test_lambda.py +71 -0
- tests/transforms/utility/test_lambdad.py +83 -0
- tests/transforms/utility/test_rand_lambda.py +87 -0
- tests/transforms/utility/test_rand_lambdad.py +77 -0
- tests/transforms/utility/test_simulatedelay.py +36 -0
- tests/transforms/utility/test_simulatedelayd.py +36 -0
- tests/transforms/utility/test_splitdim.py +52 -0
- tests/transforms/utility/test_splitdimd.py +96 -0
- tests/transforms/utils/__init__.py +10 -0
- tests/transforms/utils/test_correct_crop_centers.py +36 -0
- tests/transforms/utils/test_get_unique_labels.py +45 -0
- tests/transforms/utils/test_print_transform_backends.py +29 -0
- tests/transforms/utils/test_soft_clip.py +125 -0
- tests/utils/__init__.py +10 -0
- tests/utils/enums/__init__.py +10 -0
- tests/utils/enums/test_hovernet_loss.py +190 -0
- tests/utils/enums/test_ordering.py +289 -0
- tests/utils/enums/test_wsireader.py +663 -0
- tests/utils/misc/__init__.py +10 -0
- tests/utils/misc/test_ensure_tuple.py +53 -0
- tests/utils/misc/test_monai_env_vars.py +44 -0
- tests/utils/misc/test_monai_utils_misc.py +103 -0
- tests/utils/misc/test_str2bool.py +34 -0
- tests/utils/misc/test_str2list.py +33 -0
- tests/utils/test_alias.py +44 -0
- tests/utils/test_component_store.py +73 -0
- tests/utils/test_deprecated.py +455 -0
- tests/utils/test_enum_bound_interp.py +75 -0
- tests/utils/test_evenly_divisible_all_gather_dist.py +50 -0
- tests/utils/test_get_package_version.py +34 -0
- tests/utils/test_handler_logfile.py +84 -0
- tests/utils/test_handler_metric_logger.py +62 -0
- tests/utils/test_list_to_dict.py +43 -0
- tests/utils/test_look_up_option.py +87 -0
- tests/utils/test_optional_import.py +80 -0
- tests/utils/test_pad_mode.py +39 -0
- tests/utils/test_profiling.py +208 -0
- tests/utils/test_rankfilter_dist.py +77 -0
- tests/utils/test_require_pkg.py +83 -0
- tests/utils/test_sample_slices.py +43 -0
- tests/utils/test_set_determinism.py +74 -0
- tests/utils/test_squeeze_unsqueeze.py +71 -0
- tests/utils/test_state_cacher.py +67 -0
- tests/utils/test_torchscript_utils.py +113 -0
- tests/utils/test_version.py +91 -0
- tests/utils/test_version_after.py +65 -0
- tests/utils/type_conversion/__init__.py +10 -0
- tests/utils/type_conversion/test_convert_data_type.py +152 -0
- tests/utils/type_conversion/test_get_equivalent_dtype.py +65 -0
- tests/utils/type_conversion/test_safe_dtype_range.py +99 -0
- tests/visualize/__init__.py +10 -0
- tests/visualize/test_img2tensorboard.py +46 -0
- tests/visualize/test_occlusion_sensitivity.py +128 -0
- tests/visualize/test_plot_2d_or_3d_image.py +74 -0
- tests/visualize/test_vis_cam.py +98 -0
- tests/visualize/test_vis_gradcam.py +211 -0
- tests/visualize/utils/__init__.py +10 -0
- tests/visualize/utils/test_blend_images.py +63 -0
- tests/visualize/utils/test_matshow3d.py +133 -0
- monai_weekly-1.5.dev2505.dist-info/RECORD +0 -427
- {monai_weekly-1.5.dev2505.dist-info → monai_weekly-1.5.dev2507.dist-info}/LICENSE +0 -0
- {monai_weekly-1.5.dev2505.dist-info → monai_weekly-1.5.dev2507.dist-info}/WHEEL +0 -0
@@ -0,0 +1,88 @@
|
|
1
|
+
# Copyright (c) MONAI Consortium
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
6
|
+
# Unless required by applicable law or agreed to in writing, software
|
7
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
8
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
9
|
+
# See the License for the specific language governing permissions and
|
10
|
+
# limitations under the License.
|
11
|
+
|
12
|
+
from __future__ import annotations
|
13
|
+
|
14
|
+
import unittest
|
15
|
+
|
16
|
+
import torch
|
17
|
+
from parameterized import parameterized
|
18
|
+
|
19
|
+
from monai.transforms import GridSplit
|
20
|
+
from tests.test_utils import TEST_NDARRAYS, assert_allclose
|
21
|
+
|
22
|
+
A11 = torch.randn(3, 2, 2)
|
23
|
+
A12 = torch.randn(3, 2, 2)
|
24
|
+
A21 = torch.randn(3, 2, 2)
|
25
|
+
A22 = torch.randn(3, 2, 2)
|
26
|
+
|
27
|
+
A1 = torch.cat([A11, A12], 2)
|
28
|
+
A2 = torch.cat([A21, A22], 2)
|
29
|
+
A = torch.cat([A1, A2], 1)
|
30
|
+
|
31
|
+
TEST_CASE_0 = [{"grid": (2, 2)}, A, [A11, A12, A21, A22]]
|
32
|
+
TEST_CASE_1 = [{"grid": (2, 1)}, A, [A1, A2]]
|
33
|
+
TEST_CASE_2 = [{"grid": (1, 2)}, A1, [A11, A12]]
|
34
|
+
TEST_CASE_3 = [{"grid": (1, 2)}, A2, [A21, A22]]
|
35
|
+
TEST_CASE_4 = [{"grid": (1, 1), "size": (2, 2)}, A, [A11]]
|
36
|
+
TEST_CASE_5 = [{"grid": (1, 1), "size": 4}, A, [A]]
|
37
|
+
TEST_CASE_6 = [{"grid": (2, 2), "size": 2}, A, [A11, A12, A21, A22]]
|
38
|
+
TEST_CASE_7 = [{"grid": (1, 1)}, A, [A]]
|
39
|
+
TEST_CASE_8 = [
|
40
|
+
{"grid": (2, 2), "size": 2},
|
41
|
+
torch.arange(12).reshape(1, 3, 4).to(torch.float32),
|
42
|
+
torch.Tensor([[[[0, 1], [4, 5]]], [[[2, 3], [6, 7]]], [[[4, 5], [8, 9]]], [[[6, 7], [10, 11]]]]).to(torch.float32),
|
43
|
+
]
|
44
|
+
|
45
|
+
TEST_SINGLE = []
|
46
|
+
for p in TEST_NDARRAYS:
|
47
|
+
TEST_SINGLE.append([p, *TEST_CASE_0])
|
48
|
+
TEST_SINGLE.append([p, *TEST_CASE_1])
|
49
|
+
TEST_SINGLE.append([p, *TEST_CASE_2])
|
50
|
+
TEST_SINGLE.append([p, *TEST_CASE_3])
|
51
|
+
TEST_SINGLE.append([p, *TEST_CASE_4])
|
52
|
+
TEST_SINGLE.append([p, *TEST_CASE_5])
|
53
|
+
TEST_SINGLE.append([p, *TEST_CASE_6])
|
54
|
+
TEST_SINGLE.append([p, *TEST_CASE_7])
|
55
|
+
TEST_SINGLE.append([p, *TEST_CASE_8])
|
56
|
+
|
57
|
+
TEST_CASE_MC_0 = [{"grid": (2, 2)}, [A, A], [[A11, A12, A21, A22], [A11, A12, A21, A22]]]
|
58
|
+
TEST_CASE_MC_1 = [{"grid": (2, 1)}, [A] * 5, [[A1, A2]] * 5]
|
59
|
+
TEST_CASE_MC_2 = [{"grid": (1, 2)}, [A1, A2], [[A11, A12], [A21, A22]]]
|
60
|
+
|
61
|
+
TEST_MULTIPLE = []
|
62
|
+
for p in TEST_NDARRAYS:
|
63
|
+
TEST_MULTIPLE.append([p, *TEST_CASE_MC_0])
|
64
|
+
TEST_MULTIPLE.append([p, *TEST_CASE_MC_1])
|
65
|
+
TEST_MULTIPLE.append([p, *TEST_CASE_MC_2])
|
66
|
+
|
67
|
+
|
68
|
+
class TestGridSplit(unittest.TestCase):
|
69
|
+
@parameterized.expand(TEST_SINGLE)
|
70
|
+
def test_split_patch_single_call(self, in_type, input_parameters, image, expected):
|
71
|
+
input_image = in_type(image)
|
72
|
+
splitter = GridSplit(**input_parameters)
|
73
|
+
output = splitter(input_image)
|
74
|
+
for output_patch, expected_patch in zip(output, expected):
|
75
|
+
assert_allclose(output_patch, expected_patch, type_test=False)
|
76
|
+
|
77
|
+
@parameterized.expand(TEST_MULTIPLE)
|
78
|
+
def test_split_patch_multiple_call(self, in_type, input_parameters, img_list, expected_list):
|
79
|
+
splitter = GridSplit(**input_parameters)
|
80
|
+
for image, expected in zip(img_list, expected_list):
|
81
|
+
input_image = in_type(image)
|
82
|
+
output = splitter(input_image)
|
83
|
+
for output_patch, expected_patch in zip(output, expected):
|
84
|
+
assert_allclose(output_patch, expected_patch, type_test=False)
|
85
|
+
|
86
|
+
|
87
|
+
if __name__ == "__main__":
|
88
|
+
unittest.main()
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# Copyright (c) MONAI Consortium
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
6
|
+
# Unless required by applicable law or agreed to in writing, software
|
7
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
8
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
9
|
+
# See the License for the specific language governing permissions and
|
10
|
+
# limitations under the License.
|
11
|
+
|
12
|
+
from __future__ import annotations
|
13
|
+
|
14
|
+
import unittest
|
15
|
+
|
16
|
+
import torch
|
17
|
+
from parameterized import parameterized
|
18
|
+
|
19
|
+
from monai.transforms import GridSplitd
|
20
|
+
from tests.test_utils import TEST_NDARRAYS, assert_allclose
|
21
|
+
|
22
|
+
A11 = torch.randn(3, 2, 2)
|
23
|
+
A12 = torch.randn(3, 2, 2)
|
24
|
+
A21 = torch.randn(3, 2, 2)
|
25
|
+
A22 = torch.randn(3, 2, 2)
|
26
|
+
|
27
|
+
A1 = torch.cat([A11, A12], 2)
|
28
|
+
A2 = torch.cat([A21, A22], 2)
|
29
|
+
A = torch.cat([A1, A2], 1)
|
30
|
+
|
31
|
+
TEST_CASE_0 = [{"keys": "image", "grid": (2, 2)}, {"image": A}, [A11, A12, A21, A22]]
|
32
|
+
TEST_CASE_1 = [{"keys": "image", "grid": (2, 1)}, {"image": A}, [A1, A2]]
|
33
|
+
TEST_CASE_2 = [{"keys": "image", "grid": (1, 2)}, {"image": A1}, [A11, A12]]
|
34
|
+
TEST_CASE_3 = [{"keys": "image", "grid": (1, 2)}, {"image": A2}, [A21, A22]]
|
35
|
+
TEST_CASE_4 = [{"keys": "image", "grid": (1, 1), "size": {"image": (2, 2)}}, {"image": A}, [A11]]
|
36
|
+
TEST_CASE_5 = [{"keys": "image", "grid": (1, 1), "size": {"image": 4}}, {"image": A}, [A]]
|
37
|
+
TEST_CASE_6 = [{"keys": "image", "grid": (2, 2), "size": {"image": 2}}, {"image": A}, [A11, A12, A21, A22]]
|
38
|
+
TEST_CASE_7 = [{"keys": "image", "grid": (1, 1)}, {"image": A}, [A]]
|
39
|
+
TEST_CASE_8 = [
|
40
|
+
{"keys": "image", "grid": (2, 2), "size": {"image": 2}},
|
41
|
+
{"image": torch.arange(12).reshape(1, 3, 4).to(torch.float32)},
|
42
|
+
torch.Tensor([[[[0, 1], [4, 5]]], [[[2, 3], [6, 7]]], [[[4, 5], [8, 9]]], [[[6, 7], [10, 11]]]]).to(torch.float32),
|
43
|
+
]
|
44
|
+
|
45
|
+
TEST_SINGLE = []
|
46
|
+
for p in TEST_NDARRAYS:
|
47
|
+
TEST_SINGLE.append([p, *TEST_CASE_0])
|
48
|
+
TEST_SINGLE.append([p, *TEST_CASE_1])
|
49
|
+
TEST_SINGLE.append([p, *TEST_CASE_2])
|
50
|
+
TEST_SINGLE.append([p, *TEST_CASE_3])
|
51
|
+
TEST_SINGLE.append([p, *TEST_CASE_4])
|
52
|
+
TEST_SINGLE.append([p, *TEST_CASE_5])
|
53
|
+
TEST_SINGLE.append([p, *TEST_CASE_6])
|
54
|
+
TEST_SINGLE.append([p, *TEST_CASE_7])
|
55
|
+
TEST_SINGLE.append([p, *TEST_CASE_8])
|
56
|
+
|
57
|
+
TEST_CASE_MC_0 = [
|
58
|
+
{"keys": "image", "grid": (2, 2)},
|
59
|
+
[{"image": A}, {"image": A}],
|
60
|
+
[[A11, A12, A21, A22], [A11, A12, A21, A22]],
|
61
|
+
]
|
62
|
+
TEST_CASE_MC_1 = [{"keys": "image", "grid": (2, 1)}, [{"image": A}, {"image": A}, {"image": A}], [[A1, A2]] * 3]
|
63
|
+
TEST_CASE_MC_2 = [{"keys": "image", "grid": (1, 2)}, [{"image": A1}, {"image": A2}], [[A11, A12], [A21, A22]]]
|
64
|
+
|
65
|
+
TEST_MULTIPLE = []
|
66
|
+
for p in TEST_NDARRAYS:
|
67
|
+
TEST_MULTIPLE.append([p, *TEST_CASE_MC_0])
|
68
|
+
TEST_MULTIPLE.append([p, *TEST_CASE_MC_1])
|
69
|
+
TEST_MULTIPLE.append([p, *TEST_CASE_MC_2])
|
70
|
+
|
71
|
+
|
72
|
+
class TestGridSplitd(unittest.TestCase):
|
73
|
+
@parameterized.expand(TEST_SINGLE)
|
74
|
+
def test_split_patch_single_call(self, in_type, input_parameters, img_dict, expected):
|
75
|
+
input_dict = {}
|
76
|
+
for k, v in img_dict.items():
|
77
|
+
input_dict[k] = in_type(v)
|
78
|
+
splitter = GridSplitd(**input_parameters)
|
79
|
+
output = splitter(input_dict)
|
80
|
+
for output_patch, expected_patch in zip(output, expected):
|
81
|
+
assert_allclose(output_patch[input_parameters["keys"]], expected_patch, type_test=False)
|
82
|
+
|
83
|
+
@parameterized.expand(TEST_MULTIPLE)
|
84
|
+
def test_split_patch_multiple_call(self, in_type, input_parameters, img_list, expected_list):
|
85
|
+
splitter = GridSplitd(**input_parameters)
|
86
|
+
for img_dict, expected in zip(img_list, expected_list):
|
87
|
+
input_dict = {}
|
88
|
+
for k, v in img_dict.items():
|
89
|
+
input_dict[k] = in_type(v)
|
90
|
+
output = splitter(input_dict)
|
91
|
+
for output_patch, expected_patch in zip(output, expected):
|
92
|
+
assert_allclose(output_patch[input_parameters["keys"]], expected_patch, type_test=False)
|
93
|
+
|
94
|
+
|
95
|
+
if __name__ == "__main__":
|
96
|
+
unittest.main()
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# Copyright (c) MONAI Consortium
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
6
|
+
# Unless required by applicable law or agreed to in writing, software
|
7
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
8
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
9
|
+
# See the License for the specific language governing permissions and
|
10
|
+
# limitations under the License.
|
11
|
+
|
12
|
+
from __future__ import annotations
|
13
|
+
|
14
|
+
import unittest
|
15
|
+
|
16
|
+
import numpy as np
|
17
|
+
from parameterized import parameterized
|
18
|
+
|
19
|
+
from monai.transforms import HistogramNormalize
|
20
|
+
from monai.utils import get_equivalent_dtype
|
21
|
+
from tests.test_utils import TEST_NDARRAYS, assert_allclose
|
22
|
+
|
23
|
+
TESTS = []
|
24
|
+
for p in TEST_NDARRAYS:
|
25
|
+
TESTS.append(
|
26
|
+
[
|
27
|
+
{"num_bins": 4, "min": 1, "max": 5, "mask": np.array([1, 1, 1, 1, 1, 0])},
|
28
|
+
p(np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0])),
|
29
|
+
p(np.array([1.0, 1.5, 2.5, 4.0, 5.0, 5.0])),
|
30
|
+
]
|
31
|
+
)
|
32
|
+
|
33
|
+
TESTS.append(
|
34
|
+
[
|
35
|
+
{"num_bins": 4, "max": 4, "dtype": np.uint8},
|
36
|
+
p(np.array([0.0, 1.0, 2.0, 3.0, 4.0])),
|
37
|
+
p(np.array([0, 0, 1, 3, 4])),
|
38
|
+
]
|
39
|
+
)
|
40
|
+
|
41
|
+
TESTS.append(
|
42
|
+
[
|
43
|
+
{"num_bins": 256, "max": 255, "dtype": np.uint8},
|
44
|
+
p(np.array([[[100.0, 200.0], [150.0, 250.0]]])),
|
45
|
+
p(np.array([[[0, 170], [70, 255]]])),
|
46
|
+
]
|
47
|
+
)
|
48
|
+
|
49
|
+
|
50
|
+
class TestHistogramNormalize(unittest.TestCase):
|
51
|
+
@parameterized.expand(TESTS)
|
52
|
+
def test_value(self, arguments, image, expected_data):
|
53
|
+
result = HistogramNormalize(**arguments)(image)
|
54
|
+
assert_allclose(result, expected_data, type_test="tensor")
|
55
|
+
self.assertEqual(get_equivalent_dtype(result.dtype, data_type=np.ndarray), arguments.get("dtype", np.float32))
|
56
|
+
|
57
|
+
|
58
|
+
if __name__ == "__main__":
|
59
|
+
unittest.main()
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# Copyright (c) MONAI Consortium
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
6
|
+
# Unless required by applicable law or agreed to in writing, software
|
7
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
8
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
9
|
+
# See the License for the specific language governing permissions and
|
10
|
+
# limitations under the License.
|
11
|
+
|
12
|
+
from __future__ import annotations
|
13
|
+
|
14
|
+
import unittest
|
15
|
+
|
16
|
+
import numpy as np
|
17
|
+
from parameterized import parameterized
|
18
|
+
|
19
|
+
from monai.transforms import HistogramNormalized
|
20
|
+
from monai.utils import get_equivalent_dtype
|
21
|
+
from tests.test_utils import TEST_NDARRAYS, assert_allclose
|
22
|
+
|
23
|
+
TESTS = []
|
24
|
+
for p in TEST_NDARRAYS:
|
25
|
+
TESTS.append(
|
26
|
+
[
|
27
|
+
{"keys": "img", "num_bins": 4, "min": 1, "max": 5, "mask_key": "mask"},
|
28
|
+
{"img": p(np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0])), "mask": p(np.array([1, 1, 1, 1, 1, 0]))},
|
29
|
+
p(np.array([1.0, 1.5, 2.5, 4.0, 5.0, 5.0])),
|
30
|
+
]
|
31
|
+
)
|
32
|
+
|
33
|
+
TESTS.append(
|
34
|
+
[
|
35
|
+
{"keys": "img", "num_bins": 4, "max": 4, "dtype": np.uint8},
|
36
|
+
{"img": p(np.array([0.0, 1.0, 2.0, 3.0, 4.0]))},
|
37
|
+
p(np.array([0, 0, 1, 3, 4])),
|
38
|
+
]
|
39
|
+
)
|
40
|
+
|
41
|
+
TESTS.append(
|
42
|
+
[
|
43
|
+
{"keys": "img", "num_bins": 256, "max": 255, "dtype": np.uint8},
|
44
|
+
{"img": p(np.array([[[100.0, 200.0], [150.0, 250.0]]]))},
|
45
|
+
p(np.array([[[0, 170], [70, 255]]])),
|
46
|
+
]
|
47
|
+
)
|
48
|
+
|
49
|
+
|
50
|
+
class TestHistogramNormalized(unittest.TestCase):
|
51
|
+
@parameterized.expand(TESTS)
|
52
|
+
def test_value(self, arguments, image, expected_data):
|
53
|
+
result = HistogramNormalized(**arguments)(image)["img"]
|
54
|
+
assert_allclose(result, expected_data, type_test="tensor")
|
55
|
+
self.assertEqual(get_equivalent_dtype(result.dtype, data_type=np.ndarray), arguments.get("dtype", np.float32))
|
56
|
+
|
57
|
+
|
58
|
+
if __name__ == "__main__":
|
59
|
+
unittest.main()
|
@@ -0,0 +1,259 @@
|
|
1
|
+
# Copyright (c) MONAI Consortium
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
6
|
+
# Unless required by applicable law or agreed to in writing, software
|
7
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
8
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
9
|
+
# See the License for the specific language governing permissions and
|
10
|
+
# limitations under the License.
|
11
|
+
|
12
|
+
from __future__ import annotations
|
13
|
+
|
14
|
+
import unittest
|
15
|
+
|
16
|
+
import numpy as np
|
17
|
+
import torch
|
18
|
+
from parameterized import parameterized
|
19
|
+
|
20
|
+
from monai.data.meta_tensor import MetaTensor
|
21
|
+
from monai.networks.layers.simplelayers import GaussianFilter
|
22
|
+
from monai.transforms import ImageFilter, ImageFilterd, RandImageFilter, RandImageFilterd
|
23
|
+
|
24
|
+
EXPECTED_FILTERS = {
|
25
|
+
"mean": torch.tensor([[1, 1, 1], [1, 1, 1], [1, 1, 1]]).float(),
|
26
|
+
"laplace": torch.tensor([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]]).float(),
|
27
|
+
"elliptical": torch.tensor([[0, 1, 0], [1, 1, 1], [0, 1, 0]]).float(),
|
28
|
+
"sharpen": torch.tensor([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]).float(),
|
29
|
+
}
|
30
|
+
|
31
|
+
SUPPORTED_FILTERS = ["mean", "laplace", "elliptical", "sobel", "sharpen", "median", "gauss", "savitzky_golay"]
|
32
|
+
SAMPLE_IMAGE_2D = torch.randn(1, 10, 10)
|
33
|
+
SAMPLE_IMAGE_3D = torch.randn(1, 10, 10, 10)
|
34
|
+
SAMPLE_DICT = {"image_2d": SAMPLE_IMAGE_2D, "image_3d": SAMPLE_IMAGE_3D}
|
35
|
+
|
36
|
+
# Sobel filter uses reflect pad as default which is not implemented for 3d in torch 1.8.1 or 1.9.1
|
37
|
+
ADDITIONAL_ARGUMENTS = {"order": 1, "sigma": 1, "padding_mode": "zeros"}
|
38
|
+
|
39
|
+
|
40
|
+
class TestModule(torch.nn.Module):
|
41
|
+
__test__ = False # indicate to pytest that this class is not intended for collection
|
42
|
+
|
43
|
+
def __init__(self):
|
44
|
+
super().__init__()
|
45
|
+
|
46
|
+
def forward(self, x):
|
47
|
+
return x + 1
|
48
|
+
|
49
|
+
|
50
|
+
class TestNotAModuleOrTransform:
|
51
|
+
pass
|
52
|
+
|
53
|
+
|
54
|
+
class TestImageFilter(unittest.TestCase):
|
55
|
+
|
56
|
+
@parameterized.expand(SUPPORTED_FILTERS)
|
57
|
+
def test_init_from_string(self, filter_name):
|
58
|
+
"Test init from string"
|
59
|
+
_ = ImageFilter(filter_name, 3, **ADDITIONAL_ARGUMENTS)
|
60
|
+
|
61
|
+
def test_init_raises(self):
|
62
|
+
with self.assertRaises(Exception) as context:
|
63
|
+
_ = ImageFilter("mean")
|
64
|
+
self.assertTrue("`filter_size` must be specified when specifying filters by string." in str(context.output))
|
65
|
+
with self.assertRaises(Exception) as context:
|
66
|
+
_ = ImageFilter("mean")
|
67
|
+
self.assertTrue("`filter_size` should be a single uneven integer." in str(context.output))
|
68
|
+
with self.assertRaises(Exception) as context:
|
69
|
+
_ = ImageFilter("gauss", 3)
|
70
|
+
self.assertTrue("`filter='gauss', requires the additonal keyword argument `sigma`" in str(context.output))
|
71
|
+
with self.assertRaises(Exception) as context:
|
72
|
+
_ = ImageFilter("savitzky_golay", 3)
|
73
|
+
self.assertTrue(
|
74
|
+
"`filter='savitzky_golay', requires the additonal keyword argument `order`" in str(context.output)
|
75
|
+
)
|
76
|
+
|
77
|
+
def test_init_from_array(self):
|
78
|
+
"Test init with custom filter and assert wrong filter shape throws an error"
|
79
|
+
_ = ImageFilter(torch.ones(3, 3))
|
80
|
+
_ = ImageFilter(torch.ones(3, 3, 3))
|
81
|
+
_ = ImageFilter(np.ones((3, 3)))
|
82
|
+
_ = ImageFilter(np.ones((3, 3, 3)))
|
83
|
+
|
84
|
+
with self.assertRaises(Exception) as context:
|
85
|
+
_ = ImageFilter(torch.ones(3, 3, 3, 3))
|
86
|
+
self.assertTrue("Only 1D, 2D, and 3D filters are supported." in str(context.output))
|
87
|
+
|
88
|
+
def test_init_from_module(self):
|
89
|
+
filter = ImageFilter(TestModule())
|
90
|
+
out = filter(torch.zeros(1, 3, 3, 3))
|
91
|
+
torch.testing.assert_allclose(torch.ones(1, 3, 3, 3), out)
|
92
|
+
|
93
|
+
def test_init_from_transform(self):
|
94
|
+
_ = ImageFilter(GaussianFilter(3, sigma=2))
|
95
|
+
|
96
|
+
def test_init_from_wrong_type_fails(self):
|
97
|
+
with self.assertRaises(Exception) as context:
|
98
|
+
_ = ImageFilter(TestNotAModuleOrTransform())
|
99
|
+
self.assertTrue("<class 'type'> is not supported." in str(context.output))
|
100
|
+
|
101
|
+
@parameterized.expand(EXPECTED_FILTERS.keys())
|
102
|
+
def test_2d_filter_correctness(self, filter_name):
|
103
|
+
"Test correctness of filters (2d only)"
|
104
|
+
tfm = ImageFilter(filter_name, 3, **ADDITIONAL_ARGUMENTS)
|
105
|
+
filter = tfm._get_filter_from_string(filter_name, size=3, ndim=2).filter.squeeze()
|
106
|
+
torch.testing.assert_allclose(filter, EXPECTED_FILTERS[filter_name])
|
107
|
+
|
108
|
+
@parameterized.expand(SUPPORTED_FILTERS)
|
109
|
+
def test_call_2d(self, filter_name):
|
110
|
+
"Text function `__call__` for 2d images"
|
111
|
+
filter = ImageFilter(filter_name, 3, **ADDITIONAL_ARGUMENTS)
|
112
|
+
out_tensor = filter(SAMPLE_IMAGE_2D)
|
113
|
+
self.assertEqual(out_tensor.shape[1:], SAMPLE_IMAGE_2D.shape[1:])
|
114
|
+
|
115
|
+
@parameterized.expand(SUPPORTED_FILTERS)
|
116
|
+
def test_call_3d(self, filter_name):
|
117
|
+
"Text function `__call__` for 3d images"
|
118
|
+
filter = ImageFilter(filter_name, 3, **ADDITIONAL_ARGUMENTS)
|
119
|
+
out_tensor = filter(SAMPLE_IMAGE_3D)
|
120
|
+
self.assertEqual(out_tensor.shape[1:], SAMPLE_IMAGE_3D.shape[1:])
|
121
|
+
|
122
|
+
def test_pass_applied_operations(self):
|
123
|
+
"Test that applied operations are passed through"
|
124
|
+
applied_operations = ["op1", "op2"]
|
125
|
+
image = MetaTensor(SAMPLE_IMAGE_2D, applied_operations=applied_operations)
|
126
|
+
filter = ImageFilter(SUPPORTED_FILTERS[0], 3, **ADDITIONAL_ARGUMENTS)
|
127
|
+
out_tensor = filter(image)
|
128
|
+
self.assertEqual(out_tensor.applied_operations, applied_operations)
|
129
|
+
|
130
|
+
def test_pass_empty_metadata_dict(self):
|
131
|
+
"Test that applied operations are passed through"
|
132
|
+
image = MetaTensor(SAMPLE_IMAGE_2D, meta={})
|
133
|
+
filter = ImageFilter(SUPPORTED_FILTERS[0], 3, **ADDITIONAL_ARGUMENTS)
|
134
|
+
out_tensor = filter(image)
|
135
|
+
self.assertTrue(isinstance(out_tensor, MetaTensor))
|
136
|
+
|
137
|
+
def test_gaussian_filter_without_filter_size(self):
|
138
|
+
"Test Gaussian filter without specifying filter_size"
|
139
|
+
filter = ImageFilter("gauss", sigma=2)
|
140
|
+
out_tensor = filter(SAMPLE_IMAGE_2D)
|
141
|
+
self.assertEqual(out_tensor.shape[1:], SAMPLE_IMAGE_2D.shape[1:])
|
142
|
+
|
143
|
+
|
144
|
+
class TestImageFilterDict(unittest.TestCase):
|
145
|
+
|
146
|
+
@parameterized.expand(SUPPORTED_FILTERS)
|
147
|
+
def test_init_from_string_dict(self, filter_name):
|
148
|
+
"Test init from string and assert an error is thrown if no size is passed"
|
149
|
+
_ = ImageFilterd("image", filter_name, 3, **ADDITIONAL_ARGUMENTS)
|
150
|
+
with self.assertRaises(Exception) as _:
|
151
|
+
_ = ImageFilterd(self.image_key, filter_name)
|
152
|
+
|
153
|
+
def test_init_from_array_dict(self):
|
154
|
+
"Test init with custom filter and assert wrong filter shape throws an error"
|
155
|
+
_ = ImageFilterd("image", torch.ones(3, 3))
|
156
|
+
with self.assertRaises(Exception) as _:
|
157
|
+
_ = ImageFilterd(self.image_key, torch.ones(3, 3, 3, 3))
|
158
|
+
|
159
|
+
@parameterized.expand(SUPPORTED_FILTERS)
|
160
|
+
def test_call_2d(self, filter_name):
|
161
|
+
"Text function `__call__` for 2d images"
|
162
|
+
filter = ImageFilterd("image_2d", filter_name, 3, **ADDITIONAL_ARGUMENTS)
|
163
|
+
out_tensor = filter(SAMPLE_DICT)
|
164
|
+
self.assertEqual(out_tensor["image_2d"].shape[1:], SAMPLE_IMAGE_2D.shape[1:])
|
165
|
+
|
166
|
+
@parameterized.expand(SUPPORTED_FILTERS)
|
167
|
+
def test_call_3d(self, filter_name):
|
168
|
+
"Text function `__call__` for 3d images"
|
169
|
+
filter = ImageFilterd("image_3d", filter_name, 3, **ADDITIONAL_ARGUMENTS)
|
170
|
+
out_tensor = filter(SAMPLE_DICT)
|
171
|
+
self.assertEqual(out_tensor["image_3d"].shape[1:], SAMPLE_IMAGE_3D.shape[1:])
|
172
|
+
|
173
|
+
|
174
|
+
class TestRandImageFilter(unittest.TestCase):
|
175
|
+
|
176
|
+
@parameterized.expand(SUPPORTED_FILTERS)
|
177
|
+
def test_init_from_string(self, filter_name):
|
178
|
+
"Test init from string and assert an error is thrown if no size is passed"
|
179
|
+
_ = RandImageFilter(filter_name, 3, **ADDITIONAL_ARGUMENTS)
|
180
|
+
with self.assertRaises(Exception) as _:
|
181
|
+
_ = RandImageFilter(filter_name)
|
182
|
+
|
183
|
+
def test_init_from_array(self):
|
184
|
+
"Test init with custom filter and assert wrong filter shape throws an error"
|
185
|
+
_ = RandImageFilter(torch.ones(3, 3))
|
186
|
+
with self.assertRaises(Exception) as _:
|
187
|
+
_ = RandImageFilter(torch.ones(3, 3, 3, 3))
|
188
|
+
|
189
|
+
@parameterized.expand(SUPPORTED_FILTERS)
|
190
|
+
def test_call_2d_prob_1(self, filter_name):
|
191
|
+
"Text function `__call__` for 2d images"
|
192
|
+
filter = RandImageFilter(filter_name, 3, 1, **ADDITIONAL_ARGUMENTS)
|
193
|
+
out_tensor = filter(SAMPLE_IMAGE_2D)
|
194
|
+
self.assertEqual(out_tensor.shape[1:], SAMPLE_IMAGE_2D.shape[1:])
|
195
|
+
|
196
|
+
@parameterized.expand(SUPPORTED_FILTERS)
|
197
|
+
def test_call_3d_prob_1(self, filter_name):
|
198
|
+
"Text function `__call__` for 3d images"
|
199
|
+
filter = RandImageFilter(filter_name, 3, 1, **ADDITIONAL_ARGUMENTS)
|
200
|
+
out_tensor = filter(SAMPLE_IMAGE_3D)
|
201
|
+
self.assertEqual(out_tensor.shape[1:], SAMPLE_IMAGE_3D.shape[1:])
|
202
|
+
|
203
|
+
@parameterized.expand(SUPPORTED_FILTERS)
|
204
|
+
def test_call_2d_prob_0(self, filter_name):
|
205
|
+
"Text function `__call__` for 2d images"
|
206
|
+
filter = RandImageFilter(filter_name, 3, 0, **ADDITIONAL_ARGUMENTS)
|
207
|
+
out_tensor = filter(SAMPLE_IMAGE_2D)
|
208
|
+
torch.testing.assert_allclose(out_tensor, SAMPLE_IMAGE_2D)
|
209
|
+
|
210
|
+
@parameterized.expand(SUPPORTED_FILTERS)
|
211
|
+
def test_call_3d_prob_0(self, filter_name):
|
212
|
+
"Text function `__call__` for 3d images"
|
213
|
+
filter = RandImageFilter(filter_name, 3, 0, **ADDITIONAL_ARGUMENTS)
|
214
|
+
out_tensor = filter(SAMPLE_IMAGE_3D)
|
215
|
+
torch.testing.assert_allclose(out_tensor, SAMPLE_IMAGE_3D)
|
216
|
+
|
217
|
+
|
218
|
+
class TestRandImageFilterDict(unittest.TestCase):
|
219
|
+
|
220
|
+
@parameterized.expand(SUPPORTED_FILTERS)
|
221
|
+
def test_init_from_string_dict(self, filter_name):
|
222
|
+
"Test init from string and assert an error is thrown if no size is passed"
|
223
|
+
_ = RandImageFilterd("image", filter_name, 3, **ADDITIONAL_ARGUMENTS)
|
224
|
+
with self.assertRaises(Exception) as _:
|
225
|
+
_ = RandImageFilterd("image", filter_name)
|
226
|
+
|
227
|
+
def test_init_from_array_dict(self):
|
228
|
+
"Test init with custom filter and assert wrong filter shape throws an error"
|
229
|
+
_ = RandImageFilterd("image", torch.ones(3, 3))
|
230
|
+
with self.assertRaises(Exception) as _:
|
231
|
+
_ = RandImageFilterd("image", torch.ones(3, 3, 3, 3))
|
232
|
+
|
233
|
+
@parameterized.expand(SUPPORTED_FILTERS)
|
234
|
+
def test_call_2d_prob_1(self, filter_name):
|
235
|
+
filter = RandImageFilterd("image_2d", filter_name, 3, 1.0, **ADDITIONAL_ARGUMENTS)
|
236
|
+
out_tensor = filter(SAMPLE_DICT)
|
237
|
+
self.assertEqual(out_tensor["image_2d"].shape[1:], SAMPLE_IMAGE_2D.shape[1:])
|
238
|
+
|
239
|
+
@parameterized.expand(SUPPORTED_FILTERS)
|
240
|
+
def test_call_3d_prob_1(self, filter_name):
|
241
|
+
filter = RandImageFilterd("image_3d", filter_name, 3, 1.0, **ADDITIONAL_ARGUMENTS)
|
242
|
+
out_tensor = filter(SAMPLE_DICT)
|
243
|
+
self.assertEqual(out_tensor["image_3d"].shape[1:], SAMPLE_IMAGE_3D.shape[1:])
|
244
|
+
|
245
|
+
@parameterized.expand(SUPPORTED_FILTERS)
|
246
|
+
def test_call_2d_prob_0(self, filter_name):
|
247
|
+
filter = RandImageFilterd("image_2d", filter_name, 3, 0.0, **ADDITIONAL_ARGUMENTS)
|
248
|
+
out_tensor = filter(SAMPLE_DICT)
|
249
|
+
torch.testing.assert_allclose(out_tensor["image_2d"].shape[1:], SAMPLE_IMAGE_2D.shape[1:])
|
250
|
+
|
251
|
+
@parameterized.expand(SUPPORTED_FILTERS)
|
252
|
+
def test_call_3d_prob_0(self, filter_name):
|
253
|
+
filter = RandImageFilterd("image_3d", filter_name, 3, 0.0, **ADDITIONAL_ARGUMENTS)
|
254
|
+
out_tensor = filter(SAMPLE_DICT)
|
255
|
+
torch.testing.assert_allclose(out_tensor["image_3d"].shape[1:], SAMPLE_IMAGE_3D.shape[1:])
|
256
|
+
|
257
|
+
|
258
|
+
if __name__ == "__main__":
|
259
|
+
unittest.main()
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# Copyright (c) MONAI Consortium
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
# you may not use this file except in compliance with the License.
|
4
|
+
# You may obtain a copy of the License at
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
6
|
+
# Unless required by applicable law or agreed to in writing, software
|
7
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
8
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
9
|
+
# See the License for the specific language governing permissions and
|
10
|
+
# limitations under the License.
|
11
|
+
|
12
|
+
from __future__ import annotations
|
13
|
+
|
14
|
+
import unittest
|
15
|
+
|
16
|
+
import numpy as np
|
17
|
+
from parameterized import parameterized
|
18
|
+
|
19
|
+
from monai.transforms import IntensityStats
|
20
|
+
from tests.test_utils import TEST_NDARRAYS
|
21
|
+
|
22
|
+
TESTS = []
|
23
|
+
for p in TEST_NDARRAYS:
|
24
|
+
TESTS.extend(
|
25
|
+
[
|
26
|
+
[
|
27
|
+
{"ops": ["max", "mean"], "key_prefix": "orig"},
|
28
|
+
p([[[0.0, 1.0], [2.0, 3.0]]]),
|
29
|
+
{"affine": None},
|
30
|
+
{"orig_max": 3.0, "orig_mean": 1.5},
|
31
|
+
],
|
32
|
+
[{"ops": "std", "key_prefix": "orig"}, p([[[0.0, 1.0], [2.0, 3.0]]]), None, {"orig_std": 1.118034}],
|
33
|
+
[
|
34
|
+
{"ops": [np.mean, "max", np.min], "key_prefix": "orig"},
|
35
|
+
p([[[0.0, 1.0], [2.0, 3.0]]]),
|
36
|
+
None,
|
37
|
+
{"orig_custom_0": 1.5, "orig_max": 3.0, "orig_custom_1": 0.0},
|
38
|
+
],
|
39
|
+
[
|
40
|
+
{"ops": ["max", "mean"], "key_prefix": "orig", "channel_wise": True},
|
41
|
+
p([[[0.0, 1.0], [2.0, 3.0]], [[4.0, 5.0], [6.0, 7.0]]]),
|
42
|
+
{"affine": None},
|
43
|
+
{"orig_max": [3.0, 7.0], "orig_mean": [1.5, 5.5]},
|
44
|
+
],
|
45
|
+
[
|
46
|
+
{"ops": ["max", "mean"], "key_prefix": "orig"},
|
47
|
+
p([[[0.0, 1.0], [2.0, 3.0]]]),
|
48
|
+
{"affine": None},
|
49
|
+
{"orig_max": 3.0, "orig_mean": 1.5},
|
50
|
+
],
|
51
|
+
]
|
52
|
+
)
|
53
|
+
|
54
|
+
|
55
|
+
class TestIntensityStats(unittest.TestCase):
|
56
|
+
@parameterized.expand(TESTS)
|
57
|
+
def test_value(self, input_param, img, meta_dict, expected):
|
58
|
+
_, meta_dict = IntensityStats(**input_param)(img, meta_dict)
|
59
|
+
for k, v in expected.items():
|
60
|
+
self.assertTrue(k in meta_dict)
|
61
|
+
np.testing.assert_allclose(v, meta_dict[k], atol=1e-3)
|
62
|
+
|
63
|
+
def test_mask(self):
|
64
|
+
for p in TEST_NDARRAYS:
|
65
|
+
img = p([[[0.0, 1.0], [2.0, 3.0]]])
|
66
|
+
mask = np.array([[[1, 0], [1, 0]]], dtype=bool)
|
67
|
+
img, meta_dict = IntensityStats(ops=["max", "mean"], key_prefix="orig")(img, mask=mask)
|
68
|
+
np.testing.assert_allclose(meta_dict["orig_max"], 2.0, atol=1e-3)
|
69
|
+
np.testing.assert_allclose(meta_dict["orig_mean"], 1.0, atol=1e-3)
|
70
|
+
|
71
|
+
|
72
|
+
if __name__ == "__main__":
|
73
|
+
unittest.main()
|