From 6687962e80088fb16ef966ed8b4088dd3e699c06 Mon Sep 17 00:00:00 2001 From: YunLiu <55491388+KumoLiu@users.noreply.github.com> Date: Tue, 23 Jul 2024 21:27:36 +0800 Subject: [PATCH] Merge dev into geometric (#7931) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes # . ### Description A few sentences describing the changes proposed in this pull request. ### Types of changes - [x] Non-breaking change (fix or new feature that would not break existing functionality). - [ ] Breaking change (fix or new feature that would cause existing functionality to change). - [ ] New tests added to cover the changes. - [ ] Integration tests passed locally by running `./runtests.sh -f -u --net --coverage`. - [ ] Quick tests passed locally by running `./runtests.sh --quick --unittests --disttests`. - [ ] In-line docstrings updated. - [ ] Documentation updated, tested `make html` command in the `docs/` folder. --------- Signed-off-by: YunLiu <55491388+KumoLiu@users.noreply.github.com> Signed-off-by: monai-bot Signed-off-by: Timothy Baker Signed-off-by: Mathijs de Boer Signed-off-by: dependabot[bot] Signed-off-by: Fabian Klopfer Signed-off-by: Lucas Robinet Signed-off-by: Lucas Robinet <67736918+Lucas-rbnt@users.noreply.github.com> Signed-off-by: chaoliu Signed-off-by: cxlcl Signed-off-by: chaoliu Signed-off-by: Suraj Pai Signed-off-by: Juan Pablo de la Cruz Gutiérrez Signed-off-by: elitap Signed-off-by: Felix Schnabel Signed-off-by: YanxuanLiu Signed-off-by: ytl0623 Signed-off-by: Dženan Zukić Signed-off-by: KumoLiu Signed-off-by: Ishan Dutta Signed-off-by: kaibo Signed-off-by: heyufan1995 Signed-off-by: binliu Signed-off-by: axel.vlaminck Signed-off-by: Ibrahim Hadzic Signed-off-by: Behrooz <3968947+drbeh@users.noreply.github.com> Signed-off-by: John Zielke Signed-off-by: Mingxin Zheng Signed-off-by: Vladimir Chernyi <57420464+scalyvladimir@users.noreply.github.com> Signed-off-by: Yiheng Wang Signed-off-by: Szabolcs Botond Lorincz Molnar Signed-off-by: Lucas Robinet Signed-off-by: Mingxin Signed-off-by: Han Wang Signed-off-by: Konstantin Sukharev Signed-off-by: Ben Murray Signed-off-by: Matthew Vine <32849887+MattTheCuber@users.noreply.github.com> Signed-off-by: Peter Kaplinsky Signed-off-by: Simon Jensen <61684806+simojens@users.noreply.github.com> Signed-off-by: NabJa Signed-off-by: Eric Kerfoot Signed-off-by: alkamid Signed-off-by: Eric Kerfoot <17726042+ericspod@users.noreply.github.com> Signed-off-by: MrGranddy Signed-off-by: Vahit Buğra YEŞİLKAYNAK Signed-off-by: Kyle Harrington Signed-off-by: Pengfei Guo Signed-off-by: Pengfei Guo <32000655+guopengf@users.noreply.github.com> Signed-off-by: dongyang0122 Signed-off-by: Dong Yang Signed-off-by: Can-Zhao Signed-off-by: Can Zhao <69829124+Can-Zhao@users.noreply.github.com> Signed-off-by: Hans Johnson Signed-off-by: Mark Graham Signed-off-by: Mark Graham Signed-off-by: vgrau98 Signed-off-by: vgrau98 <35843843+vgrau98@users.noreply.github.com> Signed-off-by: Wenqi Li Signed-off-by: dongy Signed-off-by: myron Signed-off-by: virginiafdez Co-authored-by: monai-bot <64792179+monai-bot@users.noreply.github.com> Co-authored-by: Timothy J. Baker <62781117+tim-the-baker@users.noreply.github.com> Co-authored-by: Mathijs de Boer <8137653+MathijsdeBoer@users.noreply.github.com> Co-authored-by: Mathijs de Boer Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Eric Kerfoot <17726042+ericspod@users.noreply.github.com> Co-authored-by: Fabian Klopfer Co-authored-by: Yiheng Wang <68361391+yiheng-wang-nv@users.noreply.github.com> Co-authored-by: Lucas Robinet <67736918+Lucas-rbnt@users.noreply.github.com> Co-authored-by: Lucas Robinet Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: cxlcl Co-authored-by: Suraj Pai Co-authored-by: Juampa <1523654+juampatronics@users.noreply.github.com> Co-authored-by: elitap Co-authored-by: Felix Schnabel Co-authored-by: YanxuanLiu <104543031+YanxuanLiu@users.noreply.github.com> Co-authored-by: ytl0623 Co-authored-by: Dženan Zukić Co-authored-by: Ishan Dutta Co-authored-by: Kaibo Tang Co-authored-by: Yufan He <59374597+heyufan1995@users.noreply.github.com> Co-authored-by: binliunls <107988372+binliunls@users.noreply.github.com> Co-authored-by: Ben Murray Co-authored-by: axel.vlaminck Co-authored-by: Mingxin Zheng <18563433+mingxin-zheng@users.noreply.github.com> Co-authored-by: Ibrahim Hadzic Co-authored-by: Dr. Behrooz Hashemian <3968947+drbeh@users.noreply.github.com> Co-authored-by: johnzielke Co-authored-by: Vladimir Chernyi <57420464+scalyvladimir@users.noreply.github.com> Co-authored-by: Lőrincz-Molnár Szabolcs-Botond Co-authored-by: Nic Ma Co-authored-by: Lucas Robinet Co-authored-by: Han Wang Co-authored-by: Konstantin Sukharev <50718389+k-sukharev@users.noreply.github.com> Co-authored-by: Matthew Vine <32849887+MattTheCuber@users.noreply.github.com> Co-authored-by: Pkaps25 <43655728+Pkaps25@users.noreply.github.com> Co-authored-by: Peter Kaplinsky Co-authored-by: Simon Jensen <61684806+simojens@users.noreply.github.com> Co-authored-by: NabJa <32510324+NabJa@users.noreply.github.com> Co-authored-by: Yu <146002968+Yu0610@users.noreply.github.com> Co-authored-by: Adam Klimont Co-authored-by: Eric Kerfoot Co-authored-by: Vahit Buğra YEŞİLKAYNAK Co-authored-by: ge85evz Co-authored-by: Kyle I S Harrington Co-authored-by: Pengfei Guo <32000655+guopengf@users.noreply.github.com> Co-authored-by: Dong Yang Co-authored-by: Dong Yang Co-authored-by: Can Zhao <69829124+Can-Zhao@users.noreply.github.com> Co-authored-by: Hans Johnson Co-authored-by: Mark Graham Co-authored-by: vgrau98 <35843843+vgrau98@users.noreply.github.com> Co-authored-by: Wenqi Li <831580+wyli@users.noreply.github.com> Co-authored-by: myron Co-authored-by: Kaibo Tang <99367900+kvttt@users.noreply.github.com> Co-authored-by: Virginia Fernandez <61539159+virginiafdez@users.noreply.github.com> Co-authored-by: virginiafdez --- .github/workflows/blossom-ci.yml | 16 +- .github/workflows/conda.yml | 10 +- .github/workflows/cron-ngc-bundle.yml | 4 +- .github/workflows/cron.yml | 28 +- .github/workflows/docker.yml | 3 + .github/workflows/integration.yml | 3 + .github/workflows/pythonapp-gpu.yml | 10 +- .github/workflows/pythonapp-min.yml | 23 +- .github/workflows/pythonapp.yml | 22 +- .github/workflows/release.yml | 3 +- .github/workflows/setupapp.yml | 14 +- .pre-commit-config.yaml | 8 +- CHANGELOG.md | 101 +- CITATION.cff | 4 +- CONTRIBUTING.md | 2 +- Dockerfile | 10 +- README.md | 1 - docs/images/python.svg | 2 +- docs/requirements.txt | 7 +- docs/source/apps.rst | 8 + docs/source/conf.py | 65 +- docs/source/engines.rst | 5 + docs/source/inferers.rst | 23 + docs/source/installation.md | 4 +- docs/source/losses.rst | 10 + docs/source/networks.rst | 10 + docs/source/transforms.rst | 60 + docs/source/transforms_idx.rst | 10 + docs/source/utils.rst | 5 + monai/__init__.py | 7 +- monai/apps/auto3dseg/auto_runner.py | 18 +- monai/apps/auto3dseg/hpo_gen.py | 6 +- monai/apps/deepedit/transforms.py | 2 +- monai/apps/deepgrow/transforms.py | 2 +- monai/apps/detection/utils/anchor_utils.py | 4 +- monai/apps/generation/__init__.py | 10 + monai/apps/generation/maisi/__init__.py | 10 + .../generation/maisi/networks/__init__.py | 10 + .../maisi/networks/autoencoderkl_maisi.py | 973 +++++++++ .../maisi/networks/controlnet_maisi.py | 178 ++ .../networks/diffusion_model_unet_maisi.py | 410 ++++ monai/apps/generation/maisi/utils/__init__.py | 10 + .../maisi/utils/morphological_ops.py | 170 ++ monai/apps/nnunet/nnunetv2_runner.py | 94 +- monai/apps/nuclick/transforms.py | 2 +- monai/apps/pathology/transforms/post/array.py | 13 +- monai/apps/pathology/utils.py | 4 +- monai/apps/utils.py | 7 +- monai/auto3dseg/analyzer.py | 4 +- monai/auto3dseg/utils.py | 2 +- monai/bundle/config_item.py | 5 +- monai/bundle/scripts.py | 131 +- monai/bundle/utils.py | 7 +- monai/bundle/workflows.py | 126 +- monai/data/dataset.py | 54 +- monai/data/dataset_summary.py | 1 + monai/data/image_reader.py | 2 +- monai/data/meta_tensor.py | 4 +- monai/data/torchscript_utils.py | 2 +- monai/data/ultrasound_confidence_map.py | 51 +- monai/data/utils.py | 15 +- monai/data/video_dataset.py | 4 +- monai/data/wsi_reader.py | 4 +- monai/engines/__init__.py | 4 +- monai/engines/trainer.py | 283 ++- monai/engines/utils.py | 77 +- monai/fl/client/monai_algo.py | 14 +- monai/fl/utils/constants.py | 1 + monai/handlers/mlflow_handler.py | 25 +- monai/inferers/__init__.py | 5 + monai/inferers/inferer.py | 1280 ++++++++++- monai/losses/__init__.py | 2 + monai/losses/barlow_twins.py | 84 + monai/losses/dice.py | 55 +- monai/losses/ds_loss.py | 2 +- monai/losses/focal_loss.py | 5 +- monai/losses/perceptual.py | 59 +- monai/losses/sure_loss.py | 200 ++ monai/metrics/metric.py | 3 + monai/metrics/regression.py | 2 +- monai/metrics/utils.py | 6 +- monai/networks/blocks/__init__.py | 3 + monai/networks/blocks/attention_utils.py | 128 ++ monai/networks/blocks/crossattention.py | 166 ++ monai/networks/blocks/patchembedding.py | 4 +- monai/networks/blocks/pos_embed_utils.py | 2 +- monai/networks/blocks/rel_pos_embedding.py | 56 + monai/networks/blocks/selfattention.py | 81 +- monai/networks/blocks/spade_norm.py | 95 + monai/networks/blocks/spatialattention.py | 82 + monai/networks/blocks/transformerblock.py | 28 +- monai/networks/blocks/upsample.py | 32 +- monai/networks/layers/__init__.py | 4 +- monai/networks/layers/conjugate_gradient.py | 112 + monai/networks/layers/factories.py | 13 +- monai/networks/layers/simplelayers.py | 2 +- monai/networks/layers/utils.py | 15 +- monai/networks/layers/vector_quantizer.py | 233 ++ monai/networks/nets/__init__.py | 11 + monai/networks/nets/attentionunet.py | 12 +- monai/networks/nets/autoencoderkl.py | 702 ++++++ monai/networks/nets/controlnet.py | 465 ++++ monai/networks/nets/daf3d.py | 28 +- monai/networks/nets/diffusion_model_unet.py | 1913 +++++++++++++++++ monai/networks/nets/flexible_unet.py | 13 +- monai/networks/nets/patchgan_discriminator.py | 230 ++ monai/networks/nets/quicknat.py | 14 +- monai/networks/nets/resnet.py | 217 +- monai/networks/nets/spade_autoencoderkl.py | 480 +++++ .../nets/spade_diffusion_model_unet.py | 934 ++++++++ monai/networks/nets/spade_network.py | 435 ++++ monai/networks/nets/swin_unetr.py | 7 +- monai/networks/nets/transformer.py | 157 ++ monai/networks/nets/vqvae.py | 472 ++++ monai/networks/schedulers/__init__.py | 17 + monai/networks/schedulers/ddim.py | 294 +++ monai/networks/schedulers/ddpm.py | 250 +++ monai/networks/schedulers/pndm.py | 316 +++ monai/networks/schedulers/scheduler.py | 205 ++ monai/networks/utils.py | 29 +- monai/optimizers/lr_finder.py | 2 +- monai/transforms/__init__.py | 17 + monai/transforms/croppad/array.py | 16 +- monai/transforms/croppad/dictionary.py | 8 +- monai/transforms/intensity/array.py | 198 +- monai/transforms/intensity/dictionary.py | 46 +- monai/transforms/io/array.py | 6 +- monai/transforms/regularization/__init__.py | 10 + monai/transforms/regularization/array.py | 196 ++ monai/transforms/regularization/dictionary.py | 129 ++ monai/transforms/signal/array.py | 2 +- monai/transforms/spatial/array.py | 2 +- monai/transforms/utils.py | 113 +- .../transforms/utils_create_transform_ims.py | 6 +- .../utils_pytorch_numpy_unification.py | 15 + monai/utils/__init__.py | 1 + monai/utils/misc.py | 33 +- monai/utils/module.py | 11 +- monai/utils/ordering.py | 207 ++ monai/visualize/class_activation_maps.py | 10 +- monai/visualize/utils.py | 4 +- pyproject.toml | 3 +- requirements-dev.txt | 18 +- requirements-min.txt | 3 +- requirements.txt | 2 +- runtests.sh | 4 +- setup.cfg | 27 +- tests/hvd_evenly_divisible_all_gather.py | 8 +- tests/min_tests.py | 1 + tests/nonconfig_workflow.py | 4 +- tests/test_affine_transform.py | 27 +- tests/test_arraydataset.py | 2 +- tests/test_attentionunet.py | 20 + tests/test_auto3dseg.py | 1 - tests/test_auto3dseg_hpo.py | 2 +- tests/test_autoencoderkl.py | 337 +++ tests/test_autoencoderkl_maisi.py | 229 ++ tests/test_barlow_twins_loss.py | 109 + tests/test_bundle_ckpt_export.py | 6 +- tests/test_bundle_download.py | 19 +- tests/test_bundle_get_data.py | 15 +- tests/test_bundle_trt_export.py | 12 +- tests/test_bundle_workflow.py | 24 +- tests/test_clip_intensity_percentiles.py | 198 ++ tests/test_clip_intensity_percentilesd.py | 196 ++ tests/test_component_store.py | 8 +- tests/test_compose.py | 6 +- tests/test_compute_f_beta.py | 36 +- tests/test_compute_ho_ver_maps.py | 4 +- tests/test_compute_ho_ver_maps_d.py | 4 +- tests/test_compute_regression_metrics.py | 10 +- tests/test_concat_itemsd.py | 8 +- tests/test_config_parser.py | 2 +- tests/test_conjugate_gradient.py | 56 + tests/test_controlnet.py | 215 ++ tests/test_controlnet_inferers.py | 1310 +++++++++++ tests/test_controlnet_maisi.py | 170 ++ tests/test_convert_to_onnx.py | 19 +- tests/test_crossattention.py | 131 ++ tests/test_cucim_dict_transform.py | 16 +- tests/test_cucim_transform.py | 16 +- tests/test_dataset.py | 68 +- tests/test_decathlondataset.py | 5 +- tests/test_detect_envelope.py | 2 +- tests/test_dice_ce_loss.py | 18 +- tests/test_dice_focal_loss.py | 43 +- tests/test_diffusion_inferer.py | 236 ++ tests/test_diffusion_model_unet.py | 585 +++++ tests/test_diffusion_model_unet_maisi.py | 593 +++++ tests/test_dynunet.py | 9 +- tests/test_ensure_channel_first.py | 7 +- tests/test_ensure_channel_firstd.py | 7 +- tests/test_ensure_typed.py | 32 +- .../test_evenly_divisible_all_gather_dist.py | 8 +- tests/test_fl_monai_algo.py | 6 +- tests/test_flexible_unet.py | 135 +- tests/test_flipd.py | 2 +- tests/test_focal_loss.py | 2 +- tests/test_freeze_layers.py | 8 +- tests/test_generalized_dice_focal_loss.py | 14 +- tests/test_generalized_dice_loss.py | 4 +- tests/test_get_package_version.py | 6 +- tests/test_global_mutual_information_loss.py | 40 +- tests/test_grid_patch.py | 6 +- tests/test_handler_metrics_saver_dist.py | 4 +- tests/test_handler_stats.py | 16 +- tests/test_hausdorff_loss.py | 22 +- tests/test_hilbert_transform.py | 123 +- tests/test_integration_bundle_run.py | 6 +- tests/test_integration_unet_2d.py | 1 + .../test_integration_workflows_adversarial.py | 173 ++ tests/test_inverse_collation.py | 2 +- tests/test_invertd.py | 2 +- tests/test_latent_diffusion_inferer.py | 824 +++++++ tests/test_load_imaged.py | 2 +- tests/test_load_spacing_orientation.py | 4 +- tests/test_look_up_option.py | 2 +- .../test_map_and_generate_sampling_centers.py | 87 + tests/test_matshow3d.py | 3 +- tests/test_median_filter.py | 20 +- tests/test_mednistdataset.py | 7 +- tests/test_meta_affine.py | 4 +- tests/test_meta_tensor.py | 4 +- tests/test_mmar_download.py | 2 +- tests/test_monai_utils_misc.py | 9 +- tests/test_morphological_ops.py | 102 + tests/test_multi_scale.py | 29 +- tests/test_optional_import.py | 27 +- tests/test_ordering.py | 289 +++ tests/test_pad_collation.py | 8 +- tests/test_patch_gan_dicriminator.py | 179 ++ tests/test_patchembedding.py | 26 + tests/test_perceptual_loss.py | 47 +- tests/test_persistentdataset.py | 2 +- tests/test_prepare_batch_default.py | 100 +- tests/test_prepare_batch_diffusion.py | 104 + tests/test_profiling.py | 4 +- tests/test_rand_affine.py | 9 +- tests/test_rand_affined.py | 15 +- tests/test_rand_bias_field.py | 2 +- tests/test_rand_gaussian_noise.py | 12 +- tests/test_rand_gaussian_noised.py | 14 +- tests/test_rand_gibbs_noise.py | 9 + tests/test_rand_gibbs_noised.py | 8 + tests/test_rand_weighted_cropd.py | 2 +- tests/test_recon_net_utils.py | 2 +- tests/test_reg_loss_integration.py | 5 +- tests/test_regularization.py | 142 ++ tests/test_resize.py | 1 + tests/test_resized.py | 1 + tests/test_resnet.py | 84 +- tests/test_scheduler_ddim.py | 83 + tests/test_scheduler_ddpm.py | 104 + tests/test_scheduler_pndm.py | 108 + tests/test_selfattention.py | 76 +- tests/test_set_visible_devices.py | 3 +- tests/test_sobel_gradient.py | 4 +- tests/test_sobel_gradientd.py | 4 +- tests/test_soft_clip.py | 125 ++ tests/test_spade_autoencoderkl.py | 295 +++ tests/test_spade_diffusion_model_unet.py | 574 +++++ tests/test_spade_vaegan.py | 140 ++ tests/test_spatial_resampled.py | 9 +- tests/test_spatialattention.py | 55 + tests/test_subpixel_upsample.py | 6 +- tests/test_sure_loss.py | 72 + tests/test_synthetic.py | 2 +- tests/test_tciadataset.py | 4 +- tests/test_threadcontainer.py | 2 +- tests/test_to_cupy.py | 16 +- tests/test_to_numpy.py | 14 +- tests/test_torchvision_fc_model.py | 4 +- tests/test_traceable_transform.py | 4 +- tests/test_transformer.py | 109 + tests/test_transformerblock.py | 29 +- tests/test_tversky_loss.py | 11 +- ...est_ultrasound_confidence_map_transform.py | 1094 +++++----- tests/test_vector_quantizer.py | 89 + tests/test_vis_cam.py | 3 + tests/test_vis_gradcam.py | 2 + tests/test_vit.py | 99 +- tests/test_vitautoenc.py | 97 +- tests/test_vqvae.py | 274 +++ tests/test_vqvaetransformer_inferer.py | 295 +++ tests/test_warp.py | 3 +- tests/testing_data/data_config.json | 20 + tests/testing_data/fl_infer_properties.json | 67 + tests/testing_data/integration_answers.py | 56 + .../ultrasound_confidence_map/femur_input.png | Bin 0 -> 125674 bytes .../femur_result.npy | Bin 0 -> 974976 bytes .../ultrasound_confidence_map/neck_input.png | Bin 0 -> 100996 bytes .../ultrasound_confidence_map/neck_result.npy | Bin 0 -> 1356512 bytes tests/utils.py | 3 +- 293 files changed, 23985 insertions(+), 1833 deletions(-) create mode 100644 monai/apps/generation/__init__.py create mode 100644 monai/apps/generation/maisi/__init__.py create mode 100644 monai/apps/generation/maisi/networks/__init__.py create mode 100644 monai/apps/generation/maisi/networks/autoencoderkl_maisi.py create mode 100644 monai/apps/generation/maisi/networks/controlnet_maisi.py create mode 100644 monai/apps/generation/maisi/networks/diffusion_model_unet_maisi.py create mode 100644 monai/apps/generation/maisi/utils/__init__.py create mode 100644 monai/apps/generation/maisi/utils/morphological_ops.py create mode 100644 monai/losses/barlow_twins.py create mode 100644 monai/losses/sure_loss.py create mode 100644 monai/networks/blocks/attention_utils.py create mode 100644 monai/networks/blocks/crossattention.py create mode 100644 monai/networks/blocks/rel_pos_embedding.py create mode 100644 monai/networks/blocks/spade_norm.py create mode 100644 monai/networks/blocks/spatialattention.py create mode 100644 monai/networks/layers/conjugate_gradient.py create mode 100644 monai/networks/layers/vector_quantizer.py create mode 100644 monai/networks/nets/autoencoderkl.py create mode 100644 monai/networks/nets/controlnet.py create mode 100644 monai/networks/nets/diffusion_model_unet.py create mode 100644 monai/networks/nets/patchgan_discriminator.py create mode 100644 monai/networks/nets/spade_autoencoderkl.py create mode 100644 monai/networks/nets/spade_diffusion_model_unet.py create mode 100644 monai/networks/nets/spade_network.py create mode 100644 monai/networks/nets/transformer.py create mode 100644 monai/networks/nets/vqvae.py create mode 100644 monai/networks/schedulers/__init__.py create mode 100644 monai/networks/schedulers/ddim.py create mode 100644 monai/networks/schedulers/ddpm.py create mode 100644 monai/networks/schedulers/pndm.py create mode 100644 monai/networks/schedulers/scheduler.py create mode 100644 monai/transforms/regularization/__init__.py create mode 100644 monai/transforms/regularization/array.py create mode 100644 monai/transforms/regularization/dictionary.py create mode 100644 monai/utils/ordering.py create mode 100644 tests/test_autoencoderkl.py create mode 100644 tests/test_autoencoderkl_maisi.py create mode 100644 tests/test_barlow_twins_loss.py create mode 100644 tests/test_clip_intensity_percentiles.py create mode 100644 tests/test_clip_intensity_percentilesd.py create mode 100644 tests/test_conjugate_gradient.py create mode 100644 tests/test_controlnet.py create mode 100644 tests/test_controlnet_inferers.py create mode 100644 tests/test_controlnet_maisi.py create mode 100644 tests/test_crossattention.py create mode 100644 tests/test_diffusion_inferer.py create mode 100644 tests/test_diffusion_model_unet.py create mode 100644 tests/test_diffusion_model_unet_maisi.py create mode 100644 tests/test_integration_workflows_adversarial.py create mode 100644 tests/test_latent_diffusion_inferer.py create mode 100644 tests/test_map_and_generate_sampling_centers.py create mode 100644 tests/test_morphological_ops.py create mode 100644 tests/test_ordering.py create mode 100644 tests/test_patch_gan_dicriminator.py create mode 100644 tests/test_prepare_batch_diffusion.py create mode 100644 tests/test_regularization.py create mode 100644 tests/test_scheduler_ddim.py create mode 100644 tests/test_scheduler_ddpm.py create mode 100644 tests/test_scheduler_pndm.py create mode 100644 tests/test_soft_clip.py create mode 100644 tests/test_spade_autoencoderkl.py create mode 100644 tests/test_spade_diffusion_model_unet.py create mode 100644 tests/test_spade_vaegan.py create mode 100644 tests/test_spatialattention.py create mode 100644 tests/test_sure_loss.py create mode 100644 tests/test_transformer.py create mode 100644 tests/test_vector_quantizer.py create mode 100644 tests/test_vqvae.py create mode 100644 tests/test_vqvaetransformer_inferer.py create mode 100644 tests/testing_data/fl_infer_properties.json create mode 100644 tests/testing_data/ultrasound_confidence_map/femur_input.png create mode 100644 tests/testing_data/ultrasound_confidence_map/femur_result.npy create mode 100644 tests/testing_data/ultrasound_confidence_map/neck_input.png create mode 100644 tests/testing_data/ultrasound_confidence_map/neck_result.npy diff --git a/.github/workflows/blossom-ci.yml b/.github/workflows/blossom-ci.yml index 1d6ee8a46c..bf507bab3b 100644 --- a/.github/workflows/blossom-ci.yml +++ b/.github/workflows/blossom-ci.yml @@ -29,13 +29,15 @@ jobs: args: ${{ env.args }} # This job only runs for pull request comments - if: contains('\ - Nic-Ma,\ - wyli,\ - pxLi,\ - YanxuanLiu,\ - KumoLiu,\ - ', format('{0},', github.actor)) && github.event.comment.body == '/build' + if: | + github.event.comment.body == '/build' && + ( + github.actor == 'Nic-Ma' || + github.actor == 'wyli' || + github.actor == 'pxLi' || + github.actor == 'YanxuanLiu' || + github.actor == 'KumoLiu' + ) steps: - name: Check if comment is issued by authorized person run: blossom-ci diff --git a/.github/workflows/conda.yml b/.github/workflows/conda.yml index a387c77ebd..394685acd3 100644 --- a/.github/workflows/conda.yml +++ b/.github/workflows/conda.yml @@ -26,12 +26,16 @@ jobs: steps: - if: runner.os == 'windows' name: Config pagefile (Windows only) - uses: al-cheb/configure-pagefile-action@v1.3 + uses: al-cheb/configure-pagefile-action@v1.4 with: minimum-size: 8GB maximum-size: 16GB disk-root: "D:" - uses: actions/checkout@v4 + - name: Clean up disk space + run: | + find /opt/hostedtoolcache/* -maxdepth 0 ! -name 'Python' -exec rm -rf {} \; + rm -rf /usr/share/dotnet/ - uses: conda-incubator/setup-miniconda@v3 with: auto-update-conda: true @@ -56,6 +60,10 @@ jobs: conda deactivate - name: Test env (CPU ${{ runner.os }}) shell: bash -el {0} + env: + NGC_API_KEY: ${{ secrets.NGC_API_KEY }} + NGC_ORG: ${{ secrets.NGC_ORG }} + NGC_TEAM: ${{ secrets.NGC_TEAM }} run: | conda activate monai $(pwd)/runtests.sh --build --unittests diff --git a/.github/workflows/cron-ngc-bundle.yml b/.github/workflows/cron-ngc-bundle.yml index bd45bc8d1e..d4b45e1d55 100644 --- a/.github/workflows/cron-ngc-bundle.yml +++ b/.github/workflows/cron-ngc-bundle.yml @@ -18,10 +18,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: '3.8' + python-version: '3.9' - name: cache weekly timestamp id: pip-cache run: echo "datew=$(date '+%Y-%V')" >> $GITHUB_OUTPUT diff --git a/.github/workflows/cron.yml b/.github/workflows/cron.yml index 792fda5279..cc113b0446 100644 --- a/.github/workflows/cron.yml +++ b/.github/workflows/cron.yml @@ -19,18 +19,18 @@ jobs: - "PTLATEST+CUDA121" include: # https://docs.nvidia.com/deeplearning/frameworks/pytorch-release-notes - - environment: PT191+CUDA113 - pytorch: "torch==1.9.1 torchvision==0.10.1 --extra-index-url https://download.pytorch.org/whl/cu113" - base: "nvcr.io/nvidia/pytorch:21.06-py3" # CUDA 11.3 - environment: PT110+CUDA113 pytorch: "torch==1.10.2 torchvision==0.11.3 --extra-index-url https://download.pytorch.org/whl/cu113" base: "nvcr.io/nvidia/pytorch:21.06-py3" # CUDA 11.3 - environment: PT113+CUDA113 pytorch: "torch==1.13.1 torchvision==0.14.1 --extra-index-url https://download.pytorch.org/whl/cu113" base: "nvcr.io/nvidia/pytorch:21.06-py3" # CUDA 11.3 - - environment: PTLATEST+CUDA121 - pytorch: "-U torch torchvision --extra-index-url https://download.pytorch.org/whl/cu118" + - environment: PT113+CUDA122 + pytorch: "torch==1.13.1 torchvision==0.14.1 --extra-index-url https://download.pytorch.org/whl/cu121" base: "nvcr.io/nvidia/pytorch:23.08-py3" # CUDA 12.2 + - environment: PTLATEST+CUDA124 + pytorch: "-U torch torchvision --extra-index-url https://download.pytorch.org/whl/cu121" + base: "nvcr.io/nvidia/pytorch:24.03-py3" # CUDA 12.4 container: image: ${{ matrix.base }} options: "--gpus all" @@ -50,6 +50,10 @@ jobs: python -m pip install -r requirements-dev.txt python -m pip list - name: Run tests report coverage + env: + NGC_API_KEY: ${{ secrets.NGC_API_KEY }} + NGC_ORG: ${{ secrets.NGC_ORG }} + NGC_TEAM: ${{ secrets.NGC_TEAM }} run: | export LAUNCH_DELAY=$[ $RANDOM % 16 * 60 ] echo "Sleep $LAUNCH_DELAY" @@ -76,7 +80,7 @@ jobs: if: github.repository == 'Project-MONAI/MONAI' strategy: matrix: - container: ["pytorch:22.10", "pytorch:23.08"] + container: ["pytorch:23.08", "pytorch:24.03"] container: image: nvcr.io/nvidia/${{ matrix.container }}-py3 # testing with the latest pytorch base image options: "--gpus all" @@ -94,6 +98,10 @@ jobs: python -m pip install -r requirements-dev.txt python -m pip list - name: Run tests report coverage + env: + NGC_API_KEY: ${{ secrets.NGC_API_KEY }} + NGC_ORG: ${{ secrets.NGC_ORG }} + NGC_TEAM: ${{ secrets.NGC_TEAM }} run: | export LAUNCH_DELAY=$[ $RANDOM % 16 * 60 ] echo "Sleep $LAUNCH_DELAY" @@ -121,7 +129,7 @@ jobs: if: github.repository == 'Project-MONAI/MONAI' strategy: matrix: - container: ["pytorch:23.08"] + container: ["pytorch:24.03"] container: image: nvcr.io/nvidia/${{ matrix.container }}-py3 # testing with the latest pytorch base image options: "--gpus all" @@ -196,6 +204,10 @@ jobs: - name: Run tests report coverage # The docker image process has done the compilation. # BUILD_MONAI=1 is necessary for triggering the USE_COMPILED flag. + env: + NGC_API_KEY: ${{ secrets.NGC_API_KEY }} + NGC_ORG: ${{ secrets.NGC_ORG }} + NGC_TEAM: ${{ secrets.NGC_TEAM }} run: | cd /opt/monai nvidia-smi @@ -221,7 +233,7 @@ jobs: if: github.repository == 'Project-MONAI/MONAI' needs: cron-gpu # so that monai itself is verified first container: - image: nvcr.io/nvidia/pytorch:23.08-py3 # testing with the latest pytorch base image + image: nvcr.io/nvidia/pytorch:24.03-py3 # testing with the latest pytorch base image options: "--gpus all --ipc=host" runs-on: [self-hosted, linux, x64, integration] steps: diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 65716f86f9..17ffe4cf90 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -100,3 +100,6 @@ jobs: shell: bash env: QUICKTEST: True + NGC_API_KEY: ${{ secrets.NGC_API_KEY }} + NGC_ORG: ${{ secrets.NGC_ORG }} + NGC_TEAM: ${{ secrets.NGC_TEAM }} diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index c82530a551..5be2ebb86c 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -68,6 +68,9 @@ jobs: shell: bash env: BUILD_MONAI: 1 + NGC_API_KEY: ${{ secrets.NGC_API_KEY }} + NGC_ORG: ${{ secrets.NGC_ORG }} + NGC_TEAM: ${{ secrets.NGC_TEAM }} run: ./runtests.sh --build --net - name: Add reaction diff --git a/.github/workflows/pythonapp-gpu.yml b/.github/workflows/pythonapp-gpu.yml index a6d7981814..ead622b39c 100644 --- a/.github/workflows/pythonapp-gpu.yml +++ b/.github/workflows/pythonapp-gpu.yml @@ -29,10 +29,6 @@ jobs: - "PT210+CUDA121DOCKER" include: # https://docs.nvidia.com/deeplearning/frameworks/pytorch-release-notes - - environment: PT19+CUDA114DOCKER - # 21.10: 1.10.0a0+0aef44c - pytorch: "-h" # we explicitly set pytorch to -h to avoid pip install error - base: "nvcr.io/nvidia/pytorch:21.10-py3" - environment: PT110+CUDA111 pytorch: "torch==1.10.2 torchvision==0.11.3 --extra-index-url https://download.pytorch.org/whl/cu111" base: "nvcr.io/nvidia/cuda:11.1.1-devel-ubuntu18.04" @@ -47,6 +43,10 @@ jobs: # 23.08: 2.1.0a0+29c30b1 pytorch: "-h" # we explicitly set pytorch to -h to avoid pip install error base: "nvcr.io/nvidia/pytorch:23.08-py3" + - environment: PT210+CUDA121DOCKER + # 24.03: 2.3.0a0+40ec155e58.nv24.3 + pytorch: "-h" # we explicitly set pytorch to -h to avoid pip install error + base: "nvcr.io/nvidia/pytorch:24.03-py3" container: image: ${{ matrix.base }} options: --gpus all --env NVIDIA_DISABLE_REQUIRE=true # workaround for unsatisfied condition: cuda>=11.6 @@ -62,7 +62,7 @@ jobs: if [ ${{ matrix.environment }} = "PT110+CUDA111" ] || \ [ ${{ matrix.environment }} = "PT113+CUDA116" ] then - PYVER=3.8 PYSFX=3 DISTUTILS=python3-distutils && \ + PYVER=3.9 PYSFX=3 DISTUTILS=python3-distutils && \ apt-get update && apt-get install -y --no-install-recommends \ curl \ pkg-config \ diff --git a/.github/workflows/pythonapp-min.yml b/.github/workflows/pythonapp-min.yml index bbe7579774..b0d37937e9 100644 --- a/.github/workflows/pythonapp-min.yml +++ b/.github/workflows/pythonapp-min.yml @@ -9,6 +9,8 @@ on: - main - releasing/* pull_request: + head_ref-ignore: + - dev concurrency: # automatically cancel the previously triggered workflows when there's a newer version @@ -29,10 +31,10 @@ jobs: timeout-minutes: 40 steps: - uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: '3.8' + python-version: '3.9' - name: Prepare pip wheel run: | which python @@ -65,13 +67,16 @@ jobs: shell: bash env: QUICKTEST: True + NGC_API_KEY: ${{ secrets.NGC_API_KEY }} + NGC_ORG: ${{ secrets.NGC_ORG }} + NGC_TEAM: ${{ secrets.NGC_TEAM }} min-dep-py3: # min dependencies installed tests for different python runs-on: ubuntu-latest strategy: fail-fast: false matrix: - python-version: ['3.8', '3.9', '3.10', '3.11'] + python-version: ['3.9', '3.10', '3.11', '3.12'] timeout-minutes: 40 steps: - uses: actions/checkout@v4 @@ -110,20 +115,23 @@ jobs: ./runtests.sh --min env: QUICKTEST: True + NGC_API_KEY: ${{ secrets.NGC_API_KEY }} + NGC_ORG: ${{ secrets.NGC_ORG }} + NGC_TEAM: ${{ secrets.NGC_TEAM }} min-dep-pytorch: # min dependencies installed tests for different pytorch runs-on: ubuntu-latest strategy: fail-fast: false matrix: - pytorch-version: ['1.9.1', '1.10.2', '1.11.0', '1.12.1', '1.13', 'latest'] + pytorch-version: ['1.10.2', '1.11.0', '1.12.1', '1.13', '2.0.1', 'latest'] timeout-minutes: 40 steps: - uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: '3.8' + python-version: '3.9' - name: Prepare pip wheel run: | which python @@ -159,3 +167,6 @@ jobs: ./runtests.sh --min env: QUICKTEST: True + NGC_API_KEY: ${{ secrets.NGC_API_KEY }} + NGC_ORG: ${{ secrets.NGC_ORG }} + NGC_TEAM: ${{ secrets.NGC_TEAM }} diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index b011e65cf1..cd6b6ccede 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -9,6 +9,8 @@ on: - main - releasing/* pull_request: + head_ref-ignore: + - dev concurrency: # automatically cancel the previously triggered workflows when there's a newer version @@ -27,10 +29,10 @@ jobs: opt: ["codeformat", "pytype", "mypy"] steps: - uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: '3.8' + python-version: '3.9' - name: cache weekly timestamp id: pip-cache run: | @@ -43,6 +45,7 @@ jobs: key: ${{ runner.os }}-pip-${{ steps.pip-cache.outputs.datew }} - name: Install dependencies run: | + find /opt/hostedtoolcache/* -maxdepth 0 ! -name 'Python' -exec rm -rf {} \; python -m pip install --upgrade pip wheel python -m pip install -r requirements-dev.txt - name: Lint and type check @@ -62,16 +65,16 @@ jobs: steps: - if: runner.os == 'windows' name: Config pagefile (Windows only) - uses: al-cheb/configure-pagefile-action@v1.3 + uses: al-cheb/configure-pagefile-action@v1.4 with: minimum-size: 8GB maximum-size: 16GB disk-root: "D:" - uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: '3.8' + python-version: '3.9' - name: Prepare pip wheel run: | which python @@ -98,6 +101,7 @@ jobs: python -m pip install --pre -U itk - name: Install the dependencies run: | + python -m pip install --user --upgrade pip wheel python -m pip install torch==1.13.1 torchvision==0.14.1 cat "requirements-dev.txt" python -m pip install -r requirements-dev.txt @@ -127,10 +131,10 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Set up Python 3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: '3.8' + python-version: '3.9' - name: cache weekly timestamp id: pip-cache run: | @@ -208,10 +212,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Set up Python 3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: '3.8' + python-version: '3.9' - name: cache weekly timestamp id: pip-cache run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c134724665..60b610565e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -119,7 +119,8 @@ jobs: rm -rf {*,.[^.]*} release_tag_docker: - if: github.repository == 'Project-MONAI/MONAI' + # if: github.repository == 'Project-MONAI/MONAI' + if: ${{ false }} needs: versioning runs-on: ubuntu-latest steps: diff --git a/.github/workflows/setupapp.yml b/.github/workflows/setupapp.yml index c6ad243b81..7e01f55cd9 100644 --- a/.github/workflows/setupapp.yml +++ b/.github/workflows/setupapp.yml @@ -49,6 +49,10 @@ jobs: python -m pip install --upgrade torch torchvision python -m pip install -r requirements-dev.txt - name: Run unit tests report coverage + env: + NGC_API_KEY: ${{ secrets.NGC_API_KEY }} + NGC_ORG: ${{ secrets.NGC_ORG }} + NGC_TEAM: ${{ secrets.NGC_TEAM }} run: | python -m pip list git config --global --add safe.directory /__w/MONAI/MONAI @@ -77,7 +81,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8', '3.9', '3.10'] + python-version: ['3.9', '3.10', '3.11'] steps: - uses: actions/checkout@v4 with: @@ -104,6 +108,10 @@ jobs: python -m pip install --upgrade pip wheel python -m pip install -r requirements-dev.txt - name: Run quick tests CPU ubuntu + env: + NGC_API_KEY: ${{ secrets.NGC_API_KEY }} + NGC_ORG: ${{ secrets.NGC_ORG }} + NGC_TEAM: ${{ secrets.NGC_TEAM }} run: | python -m pip list python -c 'import torch; print(torch.__version__); print(torch.rand(5,3))' @@ -119,10 +127,10 @@ jobs: install: # pip install from github url, the default branch is dev runs-on: ubuntu-latest steps: - - name: Set up Python 3.8 + - name: Set up Python 3.9 uses: actions/setup-python@v5 with: - python-version: '3.8' + python-version: '3.9' - name: cache weekly timestamp id: pip-cache run: | diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 14b41bbeb8..3fff6ed631 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,7 +9,7 @@ ci: repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.6.0 hooks: - id: end-of-file-fixer - id: trailing-whitespace @@ -27,7 +27,7 @@ repos: - id: end-of-file-fixer - id: mixed-line-ending - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: v0.0.261 + rev: v0.3.5 hooks: - id: ruff args: @@ -58,7 +58,7 @@ repos: name: Unused noqa additional_dependencies: - flake8>=3.8.1 - - flake8-bugbear + - flake8-bugbear<=24.2.6 - flake8-comprehensions - pep8-naming exclude: | @@ -69,7 +69,7 @@ repos: )$ - repo: https://github.com/hadialqattan/pycln - rev: v2.1.3 + rev: v2.4.0 hooks: - id: pycln args: [--config=pyproject.toml] diff --git a/CHANGELOG.md b/CHANGELOG.md index 61be8f07c1..804508c262 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,103 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). ## [Unreleased] +## [1.3.2] - 2024-06-25 +### Fixed +#### misc. +* Updated Numpy version constraint to < 2.0 (#7859) + +## [1.3.1] - 2024-05-17 +### Added +* Support for `by_measure` argument in `RemoveSmallObjects` (#7137) +* Support for `pretrained` flag in `ResNet` (#7095) +* Support for uploading and downloading bundles to and from the Hugging Face Hub (#6454) +* Added weight parameter in DiceLoss to apply weight to voxels of each class (#7158) +* Support for returning dice for each class in `DiceMetric` (#7163) +* Introduced `ComponentStore` for storage purposes (#7159) +* Added utilities used in MONAI Generative (#7134) +* Enabled Python 3.11 support for `convert_to_torchscript` and `convert_to_onnx` (#7182) +* Support for MLflow in `AutoRunner` (#7176) +* `fname_regex` option in PydicomReader (#7181) +* Allowed setting AutoRunner parameters from config (#7175) +* `VoxelMorphUNet` and `VoxelMorph` (#7178) +* Enabled `cache` option in `GridPatchDataset` (#7180) +* Introduced `class_labels` option in `write_metrics_reports` for improved readability (#7249) +* `DiffusionLoss` for image registration task (#7272) +* Supported specifying `filename` in `Saveimage` (#7318) +* Compile support in `SupervisedTrainer` and `SupervisedEvaluator` (#7375) +* `mlflow_experiment_name` support in `Auto3DSeg` (#7442) +* Arm support (#7500) +* `BarlowTwinsLoss` for representation learning (#7530) +* `SURELoss` and `ConjugateGradient` for diffusion models (#7308) +* Support for `CutMix`, `CutOut`, and `MixUp` augmentation techniques (#7198) +* `meta_file` and `logging_file` options to `BundleWorkflow` (#7549) +* `properties_path` option to `BundleWorkflow` for customized properties (#7542) +* Support for both soft and hard clipping in `ClipIntensityPercentiles` (#7535) +* Support for not saving artifacts in `MLFlowHandler` (#7604) +* Support for multi-channel images in `PerceptualLoss` (#7568) +* Added ResNet backbone for `FlexibleUNet` (#7571) +* Introduced `dim_head` option in `SABlock` to set dimensions for each head (#7664) +* Direct links to github source code to docs (#7738, #7779) +#### misc. +* Refactored `list_data_collate` and `collate_meta_tensor` to utilize the latest PyTorch API (#7165) +* Added __str__ method in `Metric` base class (#7487) +* Made enhancements for testing files (#7662, #7670, #7663, #7671, #7672) +* Improved documentation for bundles (#7116) +### Fixed +#### transforms +* Addressed issue where lazy mode was ignored in `SpatialPadd` (#7316) +* Tracked applied operations in `ImageFilter` (#7395) +* Warnings are now given only if missing class is not set to 0 in `generate_label_classes_crop_centers` (#7602) +* Input is now always converted to C-order in `distance_transform_edt` to ensure consistent behavior (#7675) +#### data +* Modified .npz file behavior to use keys in `NumpyReader` (#7148) +* Handled corrupted cached files in `PersistentDataset` (#7244) +* Corrected affine update in `NrrdReader` (#7415) +#### metrics and losses +* Addressed precision issue in `get_confusion_matrix` (#7187) +* Harmonized and clarified documentation and tests for dice losses variants (#7587) +#### networks +* Removed hard-coded `spatial_dims` in `SwinTransformer` (#7302) +* Fixed learnable `position_embeddings` in `PatchEmbeddingBlock` (#7564, #7605) +* Removed `memory_pool_limit` in TRT config (#7647) +* Propagated `kernel_size` to `ConvBlocks` within `AttentionUnet` (#7734) +* Addressed hard-coded activation layer in `ResNet` (#7749) +#### bundle +* Resolved bundle download issue (#7280) +* Updated `bundle_root` directory for `NNIGen` (#7586) +* Checked for `num_fold` and failed early if incorrect (#7634) +* Enhanced logging logic in `ConfigWorkflow` (#7745) +#### misc. +* Enabled chaining in `Auto3DSeg` CLI (#7168) +* Addressed useless error message in `nnUNetV2Runner` (#7217) +* Resolved typing and deprecation issues in Mypy (#7231) +* Quoted `$PY_EXE` variable to handle Python path that contains spaces in Bash (#7268) +* Improved documentation, code examples, and warning messages in various modules (#7234, #7213, #7271, #7326, #7569, #7584) +* Fixed typos in various modules (#7321, #7322, #7458, #7595, #7612) +* Enhanced docstrings in various modules (#7245, #7381, #7746) +* Handled error when data is on CPU in `DataAnalyzer` (#7310) +* Updated version requirements for third-party packages (#7343, #7344, #7384, #7448, #7659, #7704, #7744, #7742, #7780) +* Addressed incorrect slice compute in `ImageStats` (#7374) +* Avoided editing a loop's mutable iterable to address B308 (#7397) +* Fixed issue with `CUDA_VISIBLE_DEVICES` setting being ignored (#7408, #7581) +* Avoided changing Python version in CICD (#7424) +* Renamed partial to callable in instantiate mode (#7413) +* Imported AttributeError for Python 3.12 compatibility (#7482) +* Updated `nnUNetV2Runner` to support nnunetv2 2.2 (#7483) +* Used uint8 instead of int8 in `LabelStats` (#7489) +* Utilized subprocess for nnUNet training (#7576) +* Addressed deprecated warning in ruff (#7625) +* Fixed downloading failure on FIPS machine (#7698) +* Updated `torch_tensorrt` compile parameters to avoid warning (#7714) +* Restrict `Auto3DSeg` fold input based on datalist (#7778) +### Changed +* Base Docker image upgraded to `nvcr.io/nvidia/pytorch:24.03-py3` from `nvcr.io/nvidia/pytorch:23.08-py3` +### Removed +* Removed unrecommended star-arg unpacking after a keyword argument, addressed B026 (#7262) +* Skipped old PyTorch version test for `SwinUNETR` (#7266) +* Dropped docker build workflow and migrated to Nvidia Blossom system (#7450) +* Dropped Python 3.8 test on quick-py3 workflow (#7719) + ## [1.3.0] - 2023-10-12 ### Added * Intensity transforms `ScaleIntensityFixedMean` and `RandScaleIntensityFixedMean` (#6542) @@ -943,7 +1040,9 @@ the postprocessing steps should be used before calling the metrics methods [highlights]: https://github.com/Project-MONAI/MONAI/blob/master/docs/source/highlights.md -[Unreleased]: https://github.com/Project-MONAI/MONAI/compare/1.3.0...HEAD +[Unreleased]: https://github.com/Project-MONAI/MONAI/compare/1.3.2...HEAD +[1.3.2]: https://github.com/Project-MONAI/MONAI/compare/1.3.1...1.3.2 +[1.3.1]: https://github.com/Project-MONAI/MONAI/compare/1.3.0...1.3.1 [1.3.0]: https://github.com/Project-MONAI/MONAI/compare/1.2.0...1.3.0 [1.2.0]: https://github.com/Project-MONAI/MONAI/compare/1.1.0...1.2.0 [1.1.0]: https://github.com/Project-MONAI/MONAI/compare/1.0.1...1.1.0 diff --git a/CITATION.cff b/CITATION.cff index cac47faae4..b535a77a9f 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -6,8 +6,8 @@ title: "MONAI: Medical Open Network for AI" abstract: "AI Toolkit for Healthcare Imaging" authors: - name: "MONAI Consortium" -date-released: 2023-10-12 -version: "1.3.0" +date-released: 2024-06-26 +version: "1.3.2" identifiers: - description: "This DOI represents all versions of MONAI, and will always resolve to the latest one." type: doi diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5c886cff30..8db796637f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -123,7 +123,7 @@ or (for new features that would not break existing functionality): ``` It is recommended that the new test `test_[module_name].py` is constructed by using only -python 3.8+ build-in functions, `torch`, `numpy`, `coverage` (for reporting code coverages) and `parameterized` (for organising test cases) packages. +python 3.9+ build-in functions, `torch`, `numpy`, `coverage` (for reporting code coverages) and `parameterized` (for organising test cases) packages. If it requires any other external packages, please make sure: - the packages are listed in [`requirements-dev.txt`](requirements-dev.txt) - the new test `test_[module_name].py` is added to the `exclude_cases` in [`./tests/min_tests.py`](./tests/min_tests.py) so that diff --git a/Dockerfile b/Dockerfile index cb1300ea90..8e255597d1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,11 +11,19 @@ # To build with a different base image # please run `docker build` using the `--build-arg PYTORCH_IMAGE=...` flag. -ARG PYTORCH_IMAGE=nvcr.io/nvidia/pytorch:23.08-py3 +ARG PYTORCH_IMAGE=nvcr.io/nvidia/pytorch:24.03-py3 FROM ${PYTORCH_IMAGE} LABEL maintainer="monai.contact@gmail.com" +# TODO: remark for issue [revise the dockerfile](https://github.com/zarr-developers/numcodecs/issues/431) +RUN if [[ $(uname -m) =~ "aarch64" ]]; then \ + export CFLAGS="-O3" && \ + export DISABLE_NUMCODECS_SSE2=true && \ + export DISABLE_NUMCODECS_AVX2=true && \ + pip install numcodecs; \ + fi + WORKDIR /opt/monai # install full deps diff --git a/README.md b/README.md index 7565fea1b7..5345cdb926 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,6 @@ [![premerge](https://github.com/Project-MONAI/MONAI/actions/workflows/pythonapp.yml/badge.svg?branch=dev)](https://github.com/Project-MONAI/MONAI/actions/workflows/pythonapp.yml) [![postmerge](https://img.shields.io/github/checks-status/project-monai/monai/dev?label=postmerge)](https://github.com/Project-MONAI/MONAI/actions?query=branch%3Adev) -[![docker](https://github.com/Project-MONAI/MONAI/actions/workflows/docker.yml/badge.svg?branch=dev)](https://github.com/Project-MONAI/MONAI/actions/workflows/docker.yml) [![Documentation Status](https://readthedocs.org/projects/monai/badge/?version=latest)](https://docs.monai.io/en/latest/) [![codecov](https://codecov.io/gh/Project-MONAI/MONAI/branch/dev/graph/badge.svg?token=6FTC7U1JJ4)](https://codecov.io/gh/Project-MONAI/MONAI) diff --git a/docs/images/python.svg b/docs/images/python.svg index b7aa7c59bd..8ef6b61c03 100644 --- a/docs/images/python.svg +++ b/docs/images/python.svg @@ -1 +1 @@ -pythonpython3.8+3.8+ +pythonpython3.9+3.9+ diff --git a/docs/requirements.txt b/docs/requirements.txt index e5bedf8552..fe415a07b5 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -6,7 +6,7 @@ itk>=5.2 nibabel parameterized scikit-image>=0.19.0 -scipy>=1.7.1 +scipy>=1.12.0; python_version >= '3.9' tensorboard commonmark==0.9.1 recommonmark==0.6.0 @@ -21,8 +21,8 @@ sphinxcontrib-serializinghtml sphinx-autodoc-typehints==1.11.1 pandas einops -transformers<4.22; python_version <= '3.10' # https://github.com/Project-MONAI/MONAI/issues/5157 -mlflow>=1.28.0 +transformers>=4.36.0, <4.41.0; python_version <= '3.10' +mlflow>=2.12.2 clearml>=1.10.0rc0 tensorboardX imagecodecs; platform_system == "Linux" or platform_system == "Darwin" @@ -40,3 +40,4 @@ onnx>=1.13.0 onnxruntime; python_version <= '3.10' zarr huggingface_hub +pyamg>=5.0.0 diff --git a/docs/source/apps.rst b/docs/source/apps.rst index 7fa7b9e9ff..c6ba8c0b9a 100644 --- a/docs/source/apps.rst +++ b/docs/source/apps.rst @@ -261,3 +261,11 @@ FastMRIReader .. autoclass:: monai.apps.nnunet.nnUNetV2Runner :members: + +`Generative AI` +--------------- + +`MAISI Utilities` +~~~~~~~~~~~~~~~~~ +.. automodule:: monai.apps.generation.maisi.utils.morphological_ops + :members: diff --git a/docs/source/conf.py b/docs/source/conf.py index fdb10fbe03..a91f38081f 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -13,6 +13,8 @@ import os import subprocess import sys +import importlib +import inspect sys.path.insert(0, os.path.abspath("..")) sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))) @@ -95,7 +97,7 @@ def generate_apidocs(*args): "sphinx.ext.mathjax", "sphinx.ext.napoleon", "sphinx.ext.autodoc", - "sphinx.ext.viewcode", + "sphinx.ext.linkcode", "sphinx.ext.autosectionlabel", "sphinx.ext.autosummary", "sphinx_autodoc_typehints", @@ -137,8 +139,8 @@ def generate_apidocs(*args): "github_user": "Project-MONAI", "github_repo": "MONAI", "github_version": "dev", - "doc_path": "docs/", - "conf_py_path": "/docs/", + "doc_path": "docs/source", + "conf_py_path": "/docs/source", "VERSION": version, } html_scaled_image_link = False @@ -162,3 +164,60 @@ def setup(app): # Hook to allow for automatic generation of API docs # before doc deployment begins. app.connect("builder-inited", generate_apidocs) + + +# -- Linkcode configuration -------------------------------------------------- +DEFAULT_REF = "dev" +read_the_docs_ref = os.environ.get("READTHEDOCS_GIT_IDENTIFIER", None) +if read_the_docs_ref: + # When building on ReadTheDocs, link to the specific commit + # https://docs.readthedocs.io/en/stable/reference/environment-variables.html#envvar-READTHEDOCS_GIT_IDENTIFIER + git_ref = read_the_docs_ref +elif os.environ.get("GITHUB_REF_TYPE", "branch") == "tag": + # When building a tag, link to the tag itself + git_ref = os.environ.get("GITHUB_REF", DEFAULT_REF) +else: + git_ref = os.environ.get("GITHUB_SHA", DEFAULT_REF) + +DEFAULT_REPOSITORY = "Project-MONAI/MONAI" +repository = os.environ.get("GITHUB_REPOSITORY", DEFAULT_REPOSITORY) + +base_code_url = f"https://github.com/{repository}/blob/{git_ref}" +MODULE_ROOT_FOLDER = "monai" +repo_root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) + + +# Adjusted from https://github.com/python-websockets/websockets/blob/main/docs/conf.py +def linkcode_resolve(domain, info): + if domain != "py": + raise ValueError( + f"expected domain to be 'py', got {domain}." + "Please adjust linkcode_resolve to either handle this domain or ignore it." + ) + + mod = importlib.import_module(info["module"]) + if "." in info["fullname"]: + objname, attrname = info["fullname"].split(".") + obj = getattr(mod, objname) + try: + # object is a method of a class + obj = getattr(obj, attrname) + except AttributeError: + # object is an attribute of a class + return None + else: + obj = getattr(mod, info["fullname"]) + + try: + file = inspect.getsourcefile(obj) + source, lineno = inspect.getsourcelines(obj) + except TypeError: + # e.g. object is a typing.Union + return None + file = os.path.relpath(file, repo_root_path) + if not file.startswith(MODULE_ROOT_FOLDER): + # e.g. object is a typing.NewType + return None + start, end = lineno, lineno + len(source) - 1 + url = f"{base_code_url}/{file}#L{start}-L{end}" + return url diff --git a/docs/source/engines.rst b/docs/source/engines.rst index afb2682822..a015c7b2a3 100644 --- a/docs/source/engines.rst +++ b/docs/source/engines.rst @@ -30,6 +30,11 @@ Workflows .. autoclass:: GanTrainer :members: +`AdversarialTrainer` +~~~~~~~~~~~~~~~~~~~~ +.. autoclass:: AdversarialTrainer + :members: + `Evaluator` ~~~~~~~~~~~ .. autoclass:: Evaluator diff --git a/docs/source/inferers.rst b/docs/source/inferers.rst index 33f9e14d83..326f56e96c 100644 --- a/docs/source/inferers.rst +++ b/docs/source/inferers.rst @@ -49,6 +49,29 @@ Inferers :members: :special-members: __call__ +`DiffusionInferer` +~~~~~~~~~~~~~~~~~~ +.. autoclass:: DiffusionInferer + :members: + :special-members: __call__ + +`LatentDiffusionInferer` +~~~~~~~~~~~~~~~~~~~~~~~~ +.. autoclass:: LatentDiffusionInferer + :members: + :special-members: __call__ + +`ControlNetDiffusionInferer` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. autoclass:: ControlNetDiffusionInferer + :members: + :special-members: __call__ + +`ControlNetLatentDiffusionInferer` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. autoclass:: ControlNetLatentDiffusionInferer + :members: + :special-members: __call__ Splitters --------- diff --git a/docs/source/installation.md b/docs/source/installation.md index d77253f0f9..4308a07647 100644 --- a/docs/source/installation.md +++ b/docs/source/installation.md @@ -19,7 +19,7 @@ --- -MONAI's core functionality is written in Python 3 (>= 3.8) and only requires [Numpy](https://numpy.org/) and [Pytorch](https://pytorch.org/). +MONAI's core functionality is written in Python 3 (>= 3.9) and only requires [Numpy](https://numpy.org/) and [Pytorch](https://pytorch.org/). The package is currently distributed via Github as the primary source code repository, and the Python package index (PyPI). The pre-built Docker images are made available on DockerHub. @@ -258,6 +258,6 @@ Since MONAI v0.2.0, the extras syntax such as `pip install 'monai[nibabel]'` is ``` which correspond to `nibabel`, `scikit-image`,`scipy`, `pillow`, `tensorboard`, -`gdown`, `pytorch-ignite`, `torchvision`, `itk`, `tqdm`, `lmdb`, `psutil`, `cucim`, `openslide-python`, `pandas`, `einops`, `transformers`, `mlflow`, `clearml`, `matplotlib`, `tensorboardX`, `tifffile`, `imagecodecs`, `pyyaml`, `fire`, `jsonschema`, `ninja`, `pynrrd`, `pydicom`, `h5py`, `nni`, `optuna`, `onnx`, `onnxruntime`, `zarr`, `lpips`, `nvidia-ml-py`, and `huggingface_hub` respectively. +`gdown`, `pytorch-ignite`, `torchvision`, `itk`, `tqdm`, `lmdb`, `psutil`, `cucim`, `openslide-python`, `pandas`, `einops`, `transformers`, `mlflow`, `clearml`, `matplotlib`, `tensorboardX`, `tifffile`, `imagecodecs`, `pyyaml`, `fire`, `jsonschema`, `ninja`, `pynrrd`, `pydicom`, `h5py`, `nni`, `optuna`, `onnx`, `onnxruntime`, `zarr`, `lpips`, `nvidia-ml-py`, `huggingface_hub` and `pyamg` respectively. - `pip install 'monai[all]'` installs all the optional dependencies. diff --git a/docs/source/losses.rst b/docs/source/losses.rst index e929e9d605..ba794af3eb 100644 --- a/docs/source/losses.rst +++ b/docs/source/losses.rst @@ -73,6 +73,11 @@ Segmentation Losses .. autoclass:: ContrastiveLoss :members: +`BarlowTwinsLoss` +~~~~~~~~~~~~~~~~~ +.. autoclass:: BarlowTwinsLoss + :members: + `HausdorffDTLoss` ~~~~~~~~~~~~~~~~~ .. autoclass:: HausdorffDTLoss @@ -134,6 +139,11 @@ Reconstruction Losses .. autoclass:: JukeboxLoss :members: +`SURELoss` +~~~~~~~~~~ +.. autoclass:: SURELoss + :members: + Loss Wrappers ------------- diff --git a/docs/source/networks.rst b/docs/source/networks.rst index 8eada7933f..249375dfc1 100644 --- a/docs/source/networks.rst +++ b/docs/source/networks.rst @@ -408,6 +408,11 @@ Layers .. autoclass:: LLTM :members: +`ConjugateGradient` +~~~~~~~~~~~~~~~~~~~ +.. autoclass:: ConjugateGradient + :members: + `Utilities` ~~~~~~~~~~~ .. automodule:: monai.networks.layers.convutils @@ -486,6 +491,11 @@ Nets .. autoclass:: ResNet :members: +`ResNetFeatures` +~~~~~~~~~~~~~~~~ +.. autoclass:: ResNetFeatures + :members: + `SENet` ~~~~~~~ .. autoclass:: SENet diff --git a/docs/source/transforms.rst b/docs/source/transforms.rst index 8990e7991d..a359821679 100644 --- a/docs/source/transforms.rst +++ b/docs/source/transforms.rst @@ -309,6 +309,12 @@ Intensity :members: :special-members: __call__ +`ClipIntensityPercentiles` +"""""""""""""""""""""""""" +.. autoclass:: ClipIntensityPercentiles + :members: + :special-members: __call__ + `RandScaleIntensity` """""""""""""""""""" .. image:: https://raw.githubusercontent.com/Project-MONAI/DocImages/main/transforms/RandScaleIntensity.png @@ -661,6 +667,33 @@ Post-processing :members: :special-members: __call__ +`Invert` +""""""""" +.. autoclass:: Invert + :members: + :special-members: __call__ + +Regularization +^^^^^^^^^^^^^^ + +`CutMix` +"""""""" +.. autoclass:: CutMix + :members: + :special-members: __call__ + +`CutOut` +"""""""" +.. autoclass:: CutOut + :members: + :special-members: __call__ + +`MixUp` +""""""" +.. autoclass:: MixUp + :members: + :special-members: __call__ + Signal ^^^^^^^ @@ -1384,6 +1417,12 @@ Intensity (Dict) :members: :special-members: __call__ +`ClipIntensityPercentilesd` +""""""""""""""""""""""""""" +.. autoclass:: ClipIntensityPercentilesd + :members: + :special-members: __call__ + `RandScaleIntensityd` """"""""""""""""""""" .. image:: https://raw.githubusercontent.com/Project-MONAI/DocImages/main/transforms/RandScaleIntensityd.png @@ -1707,6 +1746,27 @@ Post-processing (Dict) :members: :special-members: __call__ +Regularization (Dict) +^^^^^^^^^^^^^^^^^^^^^ + +`CutMixd` +""""""""" +.. autoclass:: CutMixd + :members: + :special-members: __call__ + +`CutOutd` +""""""""" +.. autoclass:: CutOutd + :members: + :special-members: __call__ + +`MixUpd` +"""""""" +.. autoclass:: MixUpd + :members: + :special-members: __call__ + Signal (Dict) ^^^^^^^^^^^^^ diff --git a/docs/source/transforms_idx.rst b/docs/source/transforms_idx.rst index f4d02a483f..650d45db71 100644 --- a/docs/source/transforms_idx.rst +++ b/docs/source/transforms_idx.rst @@ -74,6 +74,16 @@ Post-processing post.array post.dictionary +Regularization +^^^^^^^^^^^^^^ + +.. autosummary:: + :toctree: _gen + :nosignatures: + + regularization.array + regularization.dictionary + Signal ^^^^^^ diff --git a/docs/source/utils.rst b/docs/source/utils.rst index 527247799f..fef671e1f8 100644 --- a/docs/source/utils.rst +++ b/docs/source/utils.rst @@ -81,3 +81,8 @@ Component store --------------- .. autoclass:: monai.utils.component_store.ComponentStore :members: + +Ordering +-------- +.. automodule:: monai.utils.ordering + :members: diff --git a/monai/__init__.py b/monai/__init__.py index 638220f6df..cb0ccd36f8 100644 --- a/monai/__init__.py +++ b/monai/__init__.py @@ -17,7 +17,7 @@ from ._version import get_versions PY_REQUIRED_MAJOR = 3 -PY_REQUIRED_MINOR = 8 +PY_REQUIRED_MINOR = 9 version_dict = get_versions() __version__: str = version_dict.get("version", "0+unknown") @@ -83,6 +83,11 @@ from .utils.tf32 import detect_default_tf32 detect_default_tf32() + import torch + + # workaround related to https://github.com/Project-MONAI/MONAI/issues/7575 + if hasattr(torch.cuda.device_count, "cache_clear"): + torch.cuda.device_count.cache_clear() except BaseException: from .utils.misc import MONAIEnvVars diff --git a/monai/apps/auto3dseg/auto_runner.py b/monai/apps/auto3dseg/auto_runner.py index 52a0824227..99bf92c481 100644 --- a/monai/apps/auto3dseg/auto_runner.py +++ b/monai/apps/auto3dseg/auto_runner.py @@ -298,9 +298,13 @@ def __init__( pass # inspect and update folds - num_fold = self.inspect_datalist_folds(datalist_filename=datalist_filename) + self.max_fold = self.inspect_datalist_folds(datalist_filename=datalist_filename) if "num_fold" in self.data_src_cfg: num_fold = int(self.data_src_cfg["num_fold"]) # override from config + logger.info(f"Setting num_fold {num_fold} based on the input config.") + else: + num_fold = self.max_fold + logger.info(f"Setting num_fold {num_fold} based on the input datalist {datalist_filename}.") self.data_src_cfg["datalist"] = datalist_filename # update path to a version in work_dir and save user input ConfigParser.export_config_file( @@ -398,7 +402,10 @@ def inspect_datalist_folds(self, datalist_filename: str) -> int: if len(fold_list) > 0: num_fold = max(fold_list) + 1 - logger.info(f"Setting num_fold {num_fold} based on the input datalist {datalist_filename}.") + logger.info(f"Found num_fold {num_fold} based on the input datalist {datalist_filename}.") + # check if every fold is present + if len(set(fold_list)) != num_fold: + raise ValueError(f"Fold numbers are not continuous from 0 to {num_fold - 1}") elif "validation" in datalist and len(datalist["validation"]) > 0: logger.info("No fold numbers provided, attempting to use a single fold based on the validation key") # update the datalist file @@ -492,6 +499,11 @@ def set_num_fold(self, num_fold: int = 5) -> AutoRunner: if num_fold <= 0: raise ValueError(f"num_fold is expected to be an integer greater than zero. Now it gets {num_fold}") + if num_fold > self.max_fold: + # Auto3DSeg must contain validation set, so the maximum fold number is max_fold. + raise ValueError( + f"num_fold is greater than the maximum fold number {self.max_fold} in {self.datalist_filename}." + ) self.num_fold = num_fold return self @@ -539,7 +551,7 @@ def set_device_info( cmd_prefix: command line prefix for subprocess running in BundleAlgo and EnsembleRunner. Default using env "CMD_PREFIX" or None, examples are: - - single GPU/CPU or multinode bcprun: "python " or "/opt/conda/bin/python3.8 ", + - single GPU/CPU or multinode bcprun: "python " or "/opt/conda/bin/python3.9 ", - single node multi-GPU running "torchrun --nnodes=1 --nproc_per_node=2 " If user define this prefix, please make sure --nproc_per_node matches cuda_visible_device or diff --git a/monai/apps/auto3dseg/hpo_gen.py b/monai/apps/auto3dseg/hpo_gen.py index 688bf2b916..ed6d903897 100644 --- a/monai/apps/auto3dseg/hpo_gen.py +++ b/monai/apps/auto3dseg/hpo_gen.py @@ -53,7 +53,7 @@ def update_params(self, *args, **kwargs): raise NotImplementedError @abstractmethod - def set_score(self): + def set_score(self, *args, **kwargs): """Report the evaluated results to HPO.""" raise NotImplementedError @@ -193,7 +193,9 @@ def generate(self, output_folder: str = ".") -> None: self.obj_filename = os.path.join(write_path, "algo_object.pkl") if isinstance(self.algo, BundleAlgo): - self.algo.export_to_disk(output_folder, task_prefix + task_id, fill_with_datastats=False) + self.algo.export_to_disk( + output_folder, task_prefix + task_id, bundle_root=write_path, fill_with_datastats=False + ) else: ConfigParser.export_config_file(self.params, write_path) logger.info(write_path) diff --git a/monai/apps/deepedit/transforms.py b/monai/apps/deepedit/transforms.py index 6d0825f54a..5af082e2b0 100644 --- a/monai/apps/deepedit/transforms.py +++ b/monai/apps/deepedit/transforms.py @@ -30,7 +30,7 @@ logger = logging.getLogger(__name__) -distance_transform_cdt, _ = optional_import("scipy.ndimage.morphology", name="distance_transform_cdt") +distance_transform_cdt, _ = optional_import("scipy.ndimage", name="distance_transform_cdt") class DiscardAddGuidanced(MapTransform): diff --git a/monai/apps/deepgrow/transforms.py b/monai/apps/deepgrow/transforms.py index 9aca77a36c..c2f97091fd 100644 --- a/monai/apps/deepgrow/transforms.py +++ b/monai/apps/deepgrow/transforms.py @@ -27,7 +27,7 @@ from monai.utils.enums import PostFix measure, _ = optional_import("skimage.measure", "0.14.2", min_version) -distance_transform_cdt, _ = optional_import("scipy.ndimage.morphology", name="distance_transform_cdt") +distance_transform_cdt, _ = optional_import("scipy.ndimage", name="distance_transform_cdt") DEFAULT_POST_FIX = PostFix.meta() diff --git a/monai/apps/detection/utils/anchor_utils.py b/monai/apps/detection/utils/anchor_utils.py index 283169b653..cbde3ebae9 100644 --- a/monai/apps/detection/utils/anchor_utils.py +++ b/monai/apps/detection/utils/anchor_utils.py @@ -189,7 +189,7 @@ def generate_anchors( w_ratios = 1 / area_scale h_ratios = area_scale # if 3d, w:h:d = 1:aspect_ratios[:,0]:aspect_ratios[:,1] - elif self.spatial_dims == 3: + else: area_scale = torch.pow(aspect_ratios_t[:, 0] * aspect_ratios_t[:, 1], 1 / 3.0) w_ratios = 1 / area_scale h_ratios = aspect_ratios_t[:, 0] / area_scale @@ -199,7 +199,7 @@ def generate_anchors( hs = (h_ratios[:, None] * scales_t[None, :]).view(-1) if self.spatial_dims == 2: base_anchors = torch.stack([-ws, -hs, ws, hs], dim=1) / 2.0 - elif self.spatial_dims == 3: + else: # elif self.spatial_dims == 3: ds = (d_ratios[:, None] * scales_t[None, :]).view(-1) base_anchors = torch.stack([-ws, -hs, -ds, ws, hs, ds], dim=1) / 2.0 diff --git a/monai/apps/generation/__init__.py b/monai/apps/generation/__init__.py new file mode 100644 index 0000000000..1e97f89407 --- /dev/null +++ b/monai/apps/generation/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/monai/apps/generation/maisi/__init__.py b/monai/apps/generation/maisi/__init__.py new file mode 100644 index 0000000000..1e97f89407 --- /dev/null +++ b/monai/apps/generation/maisi/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/monai/apps/generation/maisi/networks/__init__.py b/monai/apps/generation/maisi/networks/__init__.py new file mode 100644 index 0000000000..1e97f89407 --- /dev/null +++ b/monai/apps/generation/maisi/networks/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/monai/apps/generation/maisi/networks/autoencoderkl_maisi.py b/monai/apps/generation/maisi/networks/autoencoderkl_maisi.py new file mode 100644 index 0000000000..f27f73ec60 --- /dev/null +++ b/monai/apps/generation/maisi/networks/autoencoderkl_maisi.py @@ -0,0 +1,973 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import gc +import logging +from typing import TYPE_CHECKING, Sequence, cast + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from monai.networks.blocks import Convolution +from monai.utils import optional_import +from monai.utils.type_conversion import convert_to_tensor + +AttentionBlock, has_attentionblock = optional_import("generative.networks.nets.autoencoderkl", name="AttentionBlock") +AutoencoderKL, has_autoencoderkl = optional_import("generative.networks.nets.autoencoderkl", name="AutoencoderKL") +ResBlock, has_resblock = optional_import("generative.networks.nets.autoencoderkl", name="ResBlock") + +if TYPE_CHECKING: + from generative.networks.nets.autoencoderkl import AutoencoderKL as AutoencoderKLType +else: + AutoencoderKLType = cast(type, AutoencoderKL) + +# Set up logging configuration +logger = logging.getLogger(__name__) + + +def _empty_cuda_cache(save_mem: bool) -> None: + if torch.cuda.is_available() and save_mem: + torch.cuda.empty_cache() + return + + +class MaisiGroupNorm3D(nn.GroupNorm): + """ + Custom 3D Group Normalization with optional print_info output. + + Args: + num_groups: Number of groups for the group norm. + num_channels: Number of channels for the group norm. + eps: Epsilon value for numerical stability. + affine: Whether to use learnable affine parameters, default to `True`. + norm_float16: If True, convert output of MaisiGroupNorm3D to float16 format, default to `False`. + print_info: Whether to print information, default to `False`. + save_mem: Whether to clean CUDA cache in order to save GPU memory, default to `True`. + """ + + def __init__( + self, + num_groups: int, + num_channels: int, + eps: float = 1e-5, + affine: bool = True, + norm_float16: bool = False, + print_info: bool = False, + save_mem: bool = True, + ): + super().__init__(num_groups, num_channels, eps, affine) + self.norm_float16 = norm_float16 + self.print_info = print_info + self.save_mem = save_mem + + def forward(self, input: torch.Tensor) -> torch.Tensor: + if self.print_info: + logger.info(f"MaisiGroupNorm3D with input size: {input.size()}") + + if len(input.shape) != 5: + raise ValueError("Expected a 5D tensor") + + param_n, param_c, param_d, param_h, param_w = input.shape + input = input.view(param_n, self.num_groups, param_c // self.num_groups, param_d, param_h, param_w) + + inputs = [] + for i in range(input.size(1)): + array = input[:, i : i + 1, ...].to(dtype=torch.float32) + mean = array.mean([2, 3, 4, 5], keepdim=True) + std = array.var([2, 3, 4, 5], unbiased=False, keepdim=True).add_(self.eps).sqrt_() + if self.norm_float16: + inputs.append(((array - mean) / std).to(dtype=torch.float16)) + else: + inputs.append((array - mean) / std) + + del input + _empty_cuda_cache(self.save_mem) + + input = torch.cat(inputs, dim=1) if max(inputs[0].size()) < 500 else self._cat_inputs(inputs) + + input = input.view(param_n, param_c, param_d, param_h, param_w) + if self.affine: + input.mul_(self.weight.view(1, param_c, 1, 1, 1)).add_(self.bias.view(1, param_c, 1, 1, 1)) + + if self.print_info: + logger.info(f"MaisiGroupNorm3D with output size: {input.size()}") + + return input + + def _cat_inputs(self, inputs): + input_type = inputs[0].device.type + input = inputs[0].clone().to("cpu", non_blocking=True) if input_type == "cuda" else inputs[0].clone() + inputs[0] = 0 + _empty_cuda_cache(self.save_mem) + + for k in range(len(inputs) - 1): + input = torch.cat((input, inputs[k + 1].cpu()), dim=1) + inputs[k + 1] = 0 + _empty_cuda_cache(self.save_mem) + gc.collect() + + if self.print_info: + logger.info(f"MaisiGroupNorm3D concat progress: {k + 1}/{len(inputs) - 1}.") + + return input.to("cuda", non_blocking=True) if input_type == "cuda" else input + + +class MaisiConvolution(nn.Module): + """ + Convolutional layer with optional print_info output and custom splitting mechanism. + + Args: + spatial_dims: Number of spatial dimensions (1D, 2D, 3D). + in_channels: Number of input channels. + out_channels: Number of output channels. + num_splits: Number of splits for the input tensor. + dim_split: Dimension of splitting for the input tensor. + print_info: Whether to print information. + save_mem: Whether to clean CUDA cache in order to save GPU memory, default to `True`. + Additional arguments for the convolution operation. + https://docs.monai.io/en/stable/networks.html#convolution + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + out_channels: int, + num_splits: int, + dim_split: int, + print_info: bool, + save_mem: bool = True, + strides: Sequence[int] | int = 1, + kernel_size: Sequence[int] | int = 3, + adn_ordering: str = "NDA", + act: tuple | str | None = "PRELU", + norm: tuple | str | None = "INSTANCE", + dropout: tuple | str | float | None = None, + dropout_dim: int = 1, + dilation: Sequence[int] | int = 1, + groups: int = 1, + bias: bool = True, + conv_only: bool = False, + is_transposed: bool = False, + padding: Sequence[int] | int | None = None, + output_padding: Sequence[int] | int | None = None, + ) -> None: + super().__init__() + self.conv = Convolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=out_channels, + strides=strides, + kernel_size=kernel_size, + adn_ordering=adn_ordering, + act=act, + norm=norm, + dropout=dropout, + dropout_dim=dropout_dim, + dilation=dilation, + groups=groups, + bias=bias, + conv_only=conv_only, + is_transposed=is_transposed, + padding=padding, + output_padding=output_padding, + ) + + self.dim_split = dim_split + self.stride = strides[self.dim_split] if isinstance(strides, list) else strides + self.num_splits = num_splits + self.print_info = print_info + self.save_mem = save_mem + + def _split_tensor(self, x: torch.Tensor, split_size: int, padding: int) -> list[torch.Tensor]: + overlaps = [0] + [padding] * (self.num_splits - 1) + last_padding = x.size(self.dim_split + 2) % split_size + + slices = [slice(None)] * 5 + splits: list[torch.Tensor] = [] + for i in range(self.num_splits): + slices[self.dim_split + 2] = slice( + i * split_size - overlaps[i], + (i + 1) * split_size + (padding if i != self.num_splits - 1 else last_padding), + ) + splits.append(x[tuple(slices)]) + + if self.print_info: + for j in range(len(splits)): + logger.info(f"Split {j + 1}/{len(splits)} size: {splits[j].size()}") + + return splits + + def _concatenate_tensors(self, outputs: list[torch.Tensor], split_size: int, padding: int) -> torch.Tensor: + slices = [slice(None)] * 5 + for i in range(self.num_splits): + slices[self.dim_split + 2] = slice(None, split_size) if i == 0 else slice(padding, padding + split_size) + outputs[i] = outputs[i][tuple(slices)] + + if self.print_info: + for i in range(self.num_splits): + logger.info(f"Output {i + 1}/{len(outputs)} size after: {outputs[i].size()}") + + if max(outputs[0].size()) < 500: + x = torch.cat(outputs, dim=self.dim_split + 2) + else: + x = outputs[0].clone().to("cpu", non_blocking=True) + outputs[0] = torch.Tensor(0) + _empty_cuda_cache(self.save_mem) + for k in range(len(outputs) - 1): + x = torch.cat((x, outputs[k + 1].cpu()), dim=self.dim_split + 2) + outputs[k + 1] = torch.Tensor(0) + _empty_cuda_cache(self.save_mem) + gc.collect() + if self.print_info: + logger.info(f"MaisiConvolution concat progress: {k + 1}/{len(outputs) - 1}.") + + x = x.to("cuda", non_blocking=True) + return x + + def forward(self, x: torch.Tensor) -> torch.Tensor: + if self.print_info: + logger.info(f"Number of splits: {self.num_splits}") + + # compute size of splits + l = x.size(self.dim_split + 2) + split_size = l // self.num_splits + + # update padding length if necessary + padding = 3 + if padding % self.stride > 0: + padding = (padding // self.stride + 1) * self.stride + if self.print_info: + logger.info(f"Padding size: {padding}") + + # split tensor into a list of tensors + splits = self._split_tensor(x, split_size, padding) + + del x + _empty_cuda_cache(self.save_mem) + + # convolution + outputs = [self.conv(split) for split in splits] + if self.print_info: + for j in range(len(outputs)): + logger.info(f"Output {j + 1}/{len(outputs)} size before: {outputs[j].size()}") + + # update size of splits and padding length for output + split_size_out = split_size + padding_s = padding + non_dim_split = self.dim_split + 1 if self.dim_split < 2 else 0 + if outputs[0].size(non_dim_split + 2) // splits[0].size(non_dim_split + 2) == 2: + split_size_out *= 2 + padding_s *= 2 + elif splits[0].size(non_dim_split + 2) // outputs[0].size(non_dim_split + 2) == 2: + split_size_out //= 2 + padding_s //= 2 + + # concatenate list of tensors + x = self._concatenate_tensors(outputs, split_size_out, padding_s) + + del outputs + _empty_cuda_cache(self.save_mem) + + return x + + +class MaisiUpsample(nn.Module): + """ + Convolution-based upsampling layer. + + Args: + spatial_dims: Number of spatial dimensions (1D, 2D, 3D). + in_channels: Number of input channels to the layer. + use_convtranspose: If True, use ConvTranspose to upsample feature maps in decoder. + num_splits: Number of splits for the input tensor. + dim_split: Dimension of splitting for the input tensor. + print_info: Whether to print information. + save_mem: Whether to clean CUDA cache in order to save GPU memory, default to `True`. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + use_convtranspose: bool, + num_splits: int, + dim_split: int, + print_info: bool, + save_mem: bool = True, + ) -> None: + super().__init__() + self.conv = MaisiConvolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=in_channels, + strides=2 if use_convtranspose else 1, + kernel_size=3, + padding=1, + conv_only=True, + is_transposed=use_convtranspose, + num_splits=num_splits, + dim_split=dim_split, + print_info=print_info, + save_mem=save_mem, + ) + self.use_convtranspose = use_convtranspose + self.save_mem = save_mem + + def forward(self, x: torch.Tensor) -> torch.Tensor: + if self.use_convtranspose: + x = self.conv(x) + x_tensor: torch.Tensor = convert_to_tensor(x) + return x_tensor + + x = F.interpolate(x, scale_factor=2.0, mode="trilinear") + _empty_cuda_cache(self.save_mem) + x = self.conv(x) + _empty_cuda_cache(self.save_mem) + + out_tensor: torch.Tensor = convert_to_tensor(x) + return out_tensor + + +class MaisiDownsample(nn.Module): + """ + Convolution-based downsampling layer. + + Args: + spatial_dims: Number of spatial dimensions (1D, 2D, 3D). + in_channels: Number of input channels. + num_splits: Number of splits for the input tensor. + dim_split: Dimension of splitting for the input tensor. + print_info: Whether to print information. + save_mem: Whether to clean CUDA cache in order to save GPU memory, default to `True`. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + num_splits: int, + dim_split: int, + print_info: bool, + save_mem: bool = True, + ) -> None: + super().__init__() + self.pad = (0, 1) * spatial_dims + self.conv = MaisiConvolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=in_channels, + strides=2, + kernel_size=3, + padding=0, + conv_only=True, + num_splits=num_splits, + dim_split=dim_split, + print_info=print_info, + save_mem=save_mem, + ) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + x = F.pad(x, self.pad, mode="constant", value=0.0) + x = self.conv(x) + return x + + +class MaisiResBlock(nn.Module): + """ + Residual block consisting of a cascade of 2 convolutions + activation + normalisation block, and a + residual connection between input and output. + + Args: + spatial_dims: Number of spatial dimensions (1D, 2D, 3D). + in_channels: Input channels to the layer. + norm_num_groups: Number of groups for the group norm layer. + norm_eps: Epsilon for the normalization. + out_channels: Number of output channels. + num_splits: Number of splits for the input tensor. + dim_split: Dimension of splitting for the input tensor. + norm_float16: If True, convert output of MaisiGroupNorm3D to float16 format, default to `False`. + print_info: Whether to print information, default to `False`. + save_mem: Whether to clean CUDA cache in order to save GPU memory, default to `True`. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + norm_num_groups: int, + norm_eps: float, + out_channels: int, + num_splits: int, + dim_split: int, + norm_float16: bool = False, + print_info: bool = False, + save_mem: bool = True, + ) -> None: + super().__init__() + self.in_channels = in_channels + self.out_channels = in_channels if out_channels is None else out_channels + self.save_mem = save_mem + + self.norm1 = MaisiGroupNorm3D( + num_groups=norm_num_groups, + num_channels=in_channels, + eps=norm_eps, + affine=True, + norm_float16=norm_float16, + print_info=print_info, + save_mem=save_mem, + ) + self.conv1 = MaisiConvolution( + spatial_dims=spatial_dims, + in_channels=self.in_channels, + out_channels=self.out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + num_splits=num_splits, + dim_split=dim_split, + print_info=print_info, + save_mem=save_mem, + ) + self.norm2 = MaisiGroupNorm3D( + num_groups=norm_num_groups, + num_channels=out_channels, + eps=norm_eps, + affine=True, + norm_float16=norm_float16, + print_info=print_info, + save_mem=save_mem, + ) + self.conv2 = MaisiConvolution( + spatial_dims=spatial_dims, + in_channels=self.out_channels, + out_channels=self.out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + num_splits=num_splits, + dim_split=dim_split, + print_info=print_info, + save_mem=save_mem, + ) + + self.nin_shortcut = ( + MaisiConvolution( + spatial_dims=spatial_dims, + in_channels=self.in_channels, + out_channels=self.out_channels, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + num_splits=num_splits, + dim_split=dim_split, + print_info=print_info, + save_mem=save_mem, + ) + if self.in_channels != self.out_channels + else nn.Identity() + ) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + h = self.norm1(x) + _empty_cuda_cache(self.save_mem) + + h = F.silu(h) + _empty_cuda_cache(self.save_mem) + h = self.conv1(h) + _empty_cuda_cache(self.save_mem) + + h = self.norm2(h) + _empty_cuda_cache(self.save_mem) + + h = F.silu(h) + _empty_cuda_cache(self.save_mem) + h = self.conv2(h) + _empty_cuda_cache(self.save_mem) + + if self.in_channels != self.out_channels: + x = self.nin_shortcut(x) + _empty_cuda_cache(self.save_mem) + + out = x + h + out_tensor: torch.Tensor = convert_to_tensor(out) + return out_tensor + + +class MaisiEncoder(nn.Module): + """ + Convolutional cascade that downsamples the image into a spatial latent space. + + Args: + spatial_dims: Number of spatial dimensions (1D, 2D, 3D). + in_channels: Number of input channels. + num_channels: Sequence of block output channels. + out_channels: Number of channels in the bottom layer (latent space) of the autoencoder. + num_res_blocks: Number of residual blocks (see ResBlock) per level. + norm_num_groups: Number of groups for the group norm layers. + norm_eps: Epsilon for the normalization. + attention_levels: Indicate which level from num_channels contain an attention block. + with_nonlocal_attn: If True, use non-local attention block. + use_flash_attention: If True, use flash attention for a memory efficient attention mechanism. + num_splits: Number of splits for the input tensor. + dim_split: Dimension of splitting for the input tensor. + norm_float16: If True, convert output of MaisiGroupNorm3D to float16 format, default to `False`. + print_info: Whether to print information, default to `False`. + save_mem: Whether to clean CUDA cache in order to save GPU memory, default to `True`. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + num_channels: Sequence[int], + out_channels: int, + num_res_blocks: Sequence[int], + norm_num_groups: int, + norm_eps: float, + attention_levels: Sequence[bool], + num_splits: int, + dim_split: int, + norm_float16: bool = False, + print_info: bool = False, + save_mem: bool = True, + with_nonlocal_attn: bool = True, + use_flash_attention: bool = False, + ) -> None: + super().__init__() + + # Check if attention_levels and num_channels have the same size + if len(attention_levels) != len(num_channels): + raise ValueError("attention_levels and num_channels must have the same size") + + # Check if num_res_blocks and num_channels have the same size + if len(num_res_blocks) != len(num_channels): + raise ValueError("num_res_blocks and num_channels must have the same size") + + self.save_mem = save_mem + + blocks: list[nn.Module] = [] + + blocks.append( + MaisiConvolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=num_channels[0], + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + num_splits=num_splits, + dim_split=dim_split, + print_info=print_info, + save_mem=save_mem, + ) + ) + + output_channel = num_channels[0] + for i in range(len(num_channels)): + input_channel = output_channel + output_channel = num_channels[i] + is_final_block = i == len(num_channels) - 1 + + for _ in range(num_res_blocks[i]): + blocks.append( + MaisiResBlock( + spatial_dims=spatial_dims, + in_channels=input_channel, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + out_channels=output_channel, + num_splits=num_splits, + dim_split=dim_split, + norm_float16=norm_float16, + print_info=print_info, + save_mem=save_mem, + ) + ) + input_channel = output_channel + if attention_levels[i]: + blocks.append( + AttentionBlock( + spatial_dims=spatial_dims, + num_channels=input_channel, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + use_flash_attention=use_flash_attention, + ) + ) + + if not is_final_block: + blocks.append( + MaisiDownsample( + spatial_dims=spatial_dims, + in_channels=input_channel, + num_splits=num_splits, + dim_split=dim_split, + print_info=print_info, + save_mem=save_mem, + ) + ) + + if with_nonlocal_attn: + blocks.append( + ResBlock( + spatial_dims=spatial_dims, + in_channels=num_channels[-1], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + out_channels=num_channels[-1], + ) + ) + + blocks.append( + AttentionBlock( + spatial_dims=spatial_dims, + num_channels=num_channels[-1], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + use_flash_attention=use_flash_attention, + ) + ) + blocks.append( + ResBlock( + spatial_dims=spatial_dims, + in_channels=num_channels[-1], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + out_channels=num_channels[-1], + ) + ) + + blocks.append( + MaisiGroupNorm3D( + num_groups=norm_num_groups, + num_channels=num_channels[-1], + eps=norm_eps, + affine=True, + norm_float16=norm_float16, + print_info=print_info, + save_mem=save_mem, + ) + ) + blocks.append( + MaisiConvolution( + spatial_dims=spatial_dims, + in_channels=num_channels[-1], + out_channels=out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + num_splits=num_splits, + dim_split=dim_split, + print_info=print_info, + save_mem=save_mem, + ) + ) + + self.blocks = nn.ModuleList(blocks) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + for block in self.blocks: + x = block(x) + _empty_cuda_cache(self.save_mem) + return x + + +class MaisiDecoder(nn.Module): + """ + Convolutional cascade upsampling from a spatial latent space into an image space. + + Args: + spatial_dims: Number of spatial dimensions (1D, 2D, 3D). + num_channels: Sequence of block output channels. + in_channels: Number of channels in the bottom layer (latent space) of the autoencoder. + out_channels: Number of output channels. + num_res_blocks: Number of residual blocks (see ResBlock) per level. + norm_num_groups: Number of groups for the group norm layers. + norm_eps: Epsilon for the normalization. + attention_levels: Indicate which level from num_channels contain an attention block. + with_nonlocal_attn: If True, use non-local attention block. + use_flash_attention: If True, use flash attention for a memory efficient attention mechanism. + use_convtranspose: If True, use ConvTranspose to upsample feature maps in decoder. + num_splits: Number of splits for the input tensor. + dim_split: Dimension of splitting for the input tensor. + norm_float16: If True, convert output of MaisiGroupNorm3D to float16 format, default to `False`. + print_info: Whether to print information, default to `False`. + save_mem: Whether to clean CUDA cache in order to save GPU memory, default to `True`. + """ + + def __init__( + self, + spatial_dims: int, + num_channels: Sequence[int], + in_channels: int, + out_channels: int, + num_res_blocks: Sequence[int], + norm_num_groups: int, + norm_eps: float, + attention_levels: Sequence[bool], + num_splits: int, + dim_split: int, + norm_float16: bool = False, + print_info: bool = False, + save_mem: bool = True, + with_nonlocal_attn: bool = True, + use_flash_attention: bool = False, + use_convtranspose: bool = False, + ) -> None: + super().__init__() + self.print_info = print_info + self.save_mem = save_mem + + reversed_block_out_channels = list(reversed(num_channels)) + + blocks: list[nn.Module] = [] + + blocks.append( + MaisiConvolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=reversed_block_out_channels[0], + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + num_splits=num_splits, + dim_split=dim_split, + print_info=print_info, + save_mem=save_mem, + ) + ) + + if with_nonlocal_attn: + blocks.append( + ResBlock( + spatial_dims=spatial_dims, + in_channels=reversed_block_out_channels[0], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + out_channels=reversed_block_out_channels[0], + ) + ) + blocks.append( + AttentionBlock( + spatial_dims=spatial_dims, + num_channels=reversed_block_out_channels[0], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + use_flash_attention=use_flash_attention, + ) + ) + blocks.append( + ResBlock( + spatial_dims=spatial_dims, + in_channels=reversed_block_out_channels[0], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + out_channels=reversed_block_out_channels[0], + ) + ) + + reversed_attention_levels = list(reversed(attention_levels)) + reversed_num_res_blocks = list(reversed(num_res_blocks)) + block_out_ch = reversed_block_out_channels[0] + for i in range(len(reversed_block_out_channels)): + block_in_ch = block_out_ch + block_out_ch = reversed_block_out_channels[i] + is_final_block = i == len(num_channels) - 1 + + for _ in range(reversed_num_res_blocks[i]): + blocks.append( + MaisiResBlock( + spatial_dims=spatial_dims, + in_channels=block_in_ch, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + out_channels=block_out_ch, + num_splits=num_splits, + dim_split=dim_split, + norm_float16=norm_float16, + print_info=print_info, + save_mem=save_mem, + ) + ) + block_in_ch = block_out_ch + + if reversed_attention_levels[i]: + blocks.append( + AttentionBlock( + spatial_dims=spatial_dims, + num_channels=block_in_ch, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + use_flash_attention=use_flash_attention, + ) + ) + + if not is_final_block: + blocks.append( + MaisiUpsample( + spatial_dims=spatial_dims, + in_channels=block_in_ch, + use_convtranspose=use_convtranspose, + num_splits=num_splits, + dim_split=dim_split, + print_info=print_info, + save_mem=save_mem, + ) + ) + + blocks.append( + MaisiGroupNorm3D( + num_groups=norm_num_groups, + num_channels=block_in_ch, + eps=norm_eps, + affine=True, + norm_float16=norm_float16, + print_info=print_info, + save_mem=save_mem, + ) + ) + blocks.append( + MaisiConvolution( + spatial_dims=spatial_dims, + in_channels=block_in_ch, + out_channels=out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + num_splits=num_splits, + dim_split=dim_split, + print_info=print_info, + save_mem=save_mem, + ) + ) + + self.blocks = nn.ModuleList(blocks) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + for block in self.blocks: + x = block(x) + _empty_cuda_cache(self.save_mem) + return x + + +class AutoencoderKlMaisi(AutoencoderKLType): + """ + AutoencoderKL with custom MaisiEncoder and MaisiDecoder. + + Args: + spatial_dims: Number of spatial dimensions (1D, 2D, 3D). + in_channels: Number of input channels. + out_channels: Number of output channels. + num_res_blocks: Number of residual blocks per level. + num_channels: Sequence of block output channels. + attention_levels: Indicate which level from num_channels contain an attention block. + latent_channels: Number of channels in the latent space. + norm_num_groups: Number of groups for the group norm layers. + norm_eps: Epsilon for the normalization. + with_encoder_nonlocal_attn: If True, use non-local attention block in the encoder. + with_decoder_nonlocal_attn: If True, use non-local attention block in the decoder. + use_flash_attention: If True, use flash attention for a memory efficient attention mechanism. + use_checkpointing: If True, use activation checkpointing. + use_convtranspose: If True, use ConvTranspose to upsample feature maps in decoder. + num_splits: Number of splits for the input tensor. + dim_split: Dimension of splitting for the input tensor. + norm_float16: If True, convert output of MaisiGroupNorm3D to float16 format, default to `False`. + print_info: Whether to print information, default to `False`. + save_mem: Whether to clean CUDA cache in order to save GPU memory, default to `True`. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + out_channels: int, + num_res_blocks: Sequence[int], + num_channels: Sequence[int], + attention_levels: Sequence[bool], + latent_channels: int = 3, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + with_encoder_nonlocal_attn: bool = False, + with_decoder_nonlocal_attn: bool = False, + use_flash_attention: bool = False, + use_checkpointing: bool = False, + use_convtranspose: bool = False, + num_splits: int = 16, + dim_split: int = 0, + norm_float16: bool = False, + print_info: bool = False, + save_mem: bool = True, + ) -> None: + super().__init__( + spatial_dims, + in_channels, + out_channels, + num_res_blocks, + num_channels, + attention_levels, + latent_channels, + norm_num_groups, + norm_eps, + with_encoder_nonlocal_attn, + with_decoder_nonlocal_attn, + use_flash_attention, + use_checkpointing, + use_convtranspose, + ) + + self.encoder = MaisiEncoder( + spatial_dims=spatial_dims, + in_channels=in_channels, + num_channels=num_channels, + out_channels=latent_channels, + num_res_blocks=num_res_blocks, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + attention_levels=attention_levels, + with_nonlocal_attn=with_encoder_nonlocal_attn, + use_flash_attention=use_flash_attention, + num_splits=num_splits, + dim_split=dim_split, + norm_float16=norm_float16, + print_info=print_info, + save_mem=save_mem, + ) + + self.decoder = MaisiDecoder( + spatial_dims=spatial_dims, + num_channels=num_channels, + in_channels=latent_channels, + out_channels=out_channels, + num_res_blocks=num_res_blocks, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + attention_levels=attention_levels, + with_nonlocal_attn=with_decoder_nonlocal_attn, + use_flash_attention=use_flash_attention, + use_convtranspose=use_convtranspose, + num_splits=num_splits, + dim_split=dim_split, + norm_float16=norm_float16, + print_info=print_info, + save_mem=save_mem, + ) diff --git a/monai/apps/generation/maisi/networks/controlnet_maisi.py b/monai/apps/generation/maisi/networks/controlnet_maisi.py new file mode 100644 index 0000000000..3641124b7d --- /dev/null +++ b/monai/apps/generation/maisi/networks/controlnet_maisi.py @@ -0,0 +1,178 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import TYPE_CHECKING, Sequence, cast + +import torch + +from monai.utils import optional_import + +ControlNet, has_controlnet = optional_import("generative.networks.nets.controlnet", name="ControlNet") +get_timestep_embedding, has_get_timestep_embedding = optional_import( + "generative.networks.nets.diffusion_model_unet", name="get_timestep_embedding" +) + +if TYPE_CHECKING: + from generative.networks.nets.controlnet import ControlNet as ControlNetType +else: + ControlNetType = cast(type, ControlNet) + + +class ControlNetMaisi(ControlNetType): + """ + Control network for diffusion models based on Zhang and Agrawala "Adding Conditional Control to Text-to-Image + Diffusion Models" (https://arxiv.org/abs/2302.05543) + + Args: + spatial_dims: number of spatial dimensions. + in_channels: number of input channels. + num_res_blocks: number of residual blocks (see ResnetBlock) per level. + num_channels: tuple of block output channels. + attention_levels: list of levels to add attention. + norm_num_groups: number of groups for the normalization. + norm_eps: epsilon for the normalization. + resblock_updown: if True use residual blocks for up/downsampling. + num_head_channels: number of channels in each attention head. + with_conditioning: if True add spatial transformers to perform conditioning. + transformer_num_layers: number of layers of Transformer blocks to use. + cross_attention_dim: number of context dimensions to use. + num_class_embeds: if specified (as an int), then this model will be class-conditional with `num_class_embeds` + classes. + upcast_attention: if True, upcast attention operations to full precision. + use_flash_attention: if True, use flash attention for a memory efficient attention mechanism. + conditioning_embedding_in_channels: number of input channels for the conditioning embedding. + conditioning_embedding_num_channels: number of channels for the blocks in the conditioning embedding. + use_checkpointing: if True, use activation checkpointing to save memory. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + num_res_blocks: Sequence[int] | int = (2, 2, 2, 2), + num_channels: Sequence[int] = (32, 64, 64, 64), + attention_levels: Sequence[bool] = (False, False, True, True), + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + resblock_updown: bool = False, + num_head_channels: int | Sequence[int] = 8, + with_conditioning: bool = False, + transformer_num_layers: int = 1, + cross_attention_dim: int | None = None, + num_class_embeds: int | None = None, + upcast_attention: bool = False, + use_flash_attention: bool = False, + conditioning_embedding_in_channels: int = 1, + conditioning_embedding_num_channels: Sequence[int] | None = (16, 32, 96, 256), + use_checkpointing: bool = True, + ) -> None: + super().__init__( + spatial_dims, + in_channels, + num_res_blocks, + num_channels, + attention_levels, + norm_num_groups, + norm_eps, + resblock_updown, + num_head_channels, + with_conditioning, + transformer_num_layers, + cross_attention_dim, + num_class_embeds, + upcast_attention, + use_flash_attention, + conditioning_embedding_in_channels, + conditioning_embedding_num_channels, + ) + self.use_checkpointing = use_checkpointing + + def forward( + self, + x: torch.Tensor, + timesteps: torch.Tensor, + controlnet_cond: torch.Tensor, + conditioning_scale: float = 1.0, + context: torch.Tensor | None = None, + class_labels: torch.Tensor | None = None, + ) -> tuple[Sequence[torch.Tensor], torch.Tensor]: + emb = self._prepare_time_and_class_embedding(x, timesteps, class_labels) + h = self._apply_initial_convolution(x) + if self.use_checkpointing: + controlnet_cond = torch.utils.checkpoint.checkpoint( + self.controlnet_cond_embedding, controlnet_cond, use_reentrant=False + ) + else: + controlnet_cond = self.controlnet_cond_embedding(controlnet_cond) + h += controlnet_cond + down_block_res_samples, h = self._apply_down_blocks(emb, context, h) + h = self._apply_mid_block(emb, context, h) + down_block_res_samples, mid_block_res_sample = self._apply_controlnet_blocks(h, down_block_res_samples) + # scaling + down_block_res_samples = [h * conditioning_scale for h in down_block_res_samples] + mid_block_res_sample *= conditioning_scale + + return down_block_res_samples, mid_block_res_sample + + def _prepare_time_and_class_embedding(self, x, timesteps, class_labels): + # 1. time + t_emb = get_timestep_embedding(timesteps, self.block_out_channels[0]) + + # timesteps does not contain any weights and will always return f32 tensors + # but time_embedding might actually be running in fp16. so we need to cast here. + # there might be better ways to encapsulate this. + t_emb = t_emb.to(dtype=x.dtype) + emb = self.time_embed(t_emb) + + # 2. class + if self.num_class_embeds is not None: + if class_labels is None: + raise ValueError("class_labels should be provided when num_class_embeds > 0") + class_emb = self.class_embedding(class_labels) + class_emb = class_emb.to(dtype=x.dtype) + emb = emb + class_emb + + return emb + + def _apply_initial_convolution(self, x): + # 3. initial convolution + h = self.conv_in(x) + return h + + def _apply_down_blocks(self, emb, context, h): + # 4. down + if context is not None and self.with_conditioning is False: + raise ValueError("model should have with_conditioning = True if context is provided") + down_block_res_samples: list[torch.Tensor] = [h] + for downsample_block in self.down_blocks: + h, res_samples = downsample_block(hidden_states=h, temb=emb, context=context) + for residual in res_samples: + down_block_res_samples.append(residual) + + return down_block_res_samples, h + + def _apply_mid_block(self, emb, context, h): + # 5. mid + h = self.middle_block(hidden_states=h, temb=emb, context=context) + return h + + def _apply_controlnet_blocks(self, h, down_block_res_samples): + # 6. Control net blocks + controlnet_down_block_res_samples = [] + for down_block_res_sample, controlnet_block in zip(down_block_res_samples, self.controlnet_down_blocks): + down_block_res_sample = controlnet_block(down_block_res_sample) + controlnet_down_block_res_samples.append(down_block_res_sample) + + mid_block_res_sample = self.controlnet_mid_block(h) + + return controlnet_down_block_res_samples, mid_block_res_sample diff --git a/monai/apps/generation/maisi/networks/diffusion_model_unet_maisi.py b/monai/apps/generation/maisi/networks/diffusion_model_unet_maisi.py new file mode 100644 index 0000000000..d5f5f6136b --- /dev/null +++ b/monai/apps/generation/maisi/networks/diffusion_model_unet_maisi.py @@ -0,0 +1,410 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ========================================================================= +# Adapted from https://github.com/huggingface/diffusers +# which has the following license: +# https://github.com/huggingface/diffusers/blob/main/LICENSE +# +# Copyright 2022 UC Berkeley Team and The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================================================================= + +from __future__ import annotations + +from collections.abc import Sequence + +import torch +from torch import nn + +from monai.networks.blocks import Convolution +from monai.utils import ensure_tuple_rep, optional_import +from monai.utils.type_conversion import convert_to_tensor + +get_down_block, has_get_down_block = optional_import( + "generative.networks.nets.diffusion_model_unet", name="get_down_block" +) +get_mid_block, has_get_mid_block = optional_import( + "generative.networks.nets.diffusion_model_unet", name="get_mid_block" +) +get_timestep_embedding, has_get_timestep_embedding = optional_import( + "generative.networks.nets.diffusion_model_unet", name="get_timestep_embedding" +) +get_up_block, has_get_up_block = optional_import("generative.networks.nets.diffusion_model_unet", name="get_up_block") +xformers, has_xformers = optional_import("xformers") +zero_module, has_zero_module = optional_import("generative.networks.nets.diffusion_model_unet", name="zero_module") + +__all__ = ["DiffusionModelUNetMaisi"] + + +class DiffusionModelUNetMaisi(nn.Module): + """ + U-Net network with timestep embedding and attention mechanisms for conditioning based on + Rombach et al. "High-Resolution Image Synthesis with Latent Diffusion Models" https://arxiv.org/abs/2112.10752 + and Pinaya et al. "Brain Imaging Generation with Latent Diffusion Models" https://arxiv.org/abs/2209.07162 + + Args: + spatial_dims: Number of spatial dimensions. + in_channels: Number of input channels. + out_channels: Number of output channels. + num_res_blocks: Number of residual blocks (see ResnetBlock) per level. Can be a single integer or a sequence of integers. + num_channels: Tuple of block output channels. + attention_levels: List of levels to add attention. + norm_num_groups: Number of groups for the normalization. + norm_eps: Epsilon for the normalization. + resblock_updown: If True, use residual blocks for up/downsampling. + num_head_channels: Number of channels in each attention head. Can be a single integer or a sequence of integers. + with_conditioning: If True, add spatial transformers to perform conditioning. + transformer_num_layers: Number of layers of Transformer blocks to use. + cross_attention_dim: Number of context dimensions to use. + num_class_embeds: If specified (as an int), then this model will be class-conditional with `num_class_embeds` classes. + upcast_attention: If True, upcast attention operations to full precision. + use_flash_attention: If True, use flash attention for a memory efficient attention mechanism. + dropout_cattn: If different from zero, this will be the dropout value for the cross-attention layers. + include_top_region_index_input: If True, use top region index input. + include_bottom_region_index_input: If True, use bottom region index input. + include_spacing_input: If True, use spacing input. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + out_channels: int, + num_res_blocks: Sequence[int] | int = (2, 2, 2, 2), + num_channels: Sequence[int] = (32, 64, 64, 64), + attention_levels: Sequence[bool] = (False, False, True, True), + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + resblock_updown: bool = False, + num_head_channels: int | Sequence[int] = 8, + with_conditioning: bool = False, + transformer_num_layers: int = 1, + cross_attention_dim: int | None = None, + num_class_embeds: int | None = None, + upcast_attention: bool = False, + use_flash_attention: bool = False, + dropout_cattn: float = 0.0, + include_top_region_index_input: bool = False, + include_bottom_region_index_input: bool = False, + include_spacing_input: bool = False, + ) -> None: + super().__init__() + if with_conditioning is True and cross_attention_dim is None: + raise ValueError( + "DiffusionModelUNetMaisi expects dimension of the cross-attention conditioning (cross_attention_dim) " + "when using with_conditioning." + ) + if cross_attention_dim is not None and with_conditioning is False: + raise ValueError( + "DiffusionModelUNetMaisi expects with_conditioning=True when specifying the cross_attention_dim." + ) + if dropout_cattn > 1.0 or dropout_cattn < 0.0: + raise ValueError("Dropout cannot be negative or >1.0!") + + # All number of channels should be multiple of num_groups + if any((out_channel % norm_num_groups) != 0 for out_channel in num_channels): + raise ValueError( + f"DiffusionModelUNetMaisi expects all num_channels being multiple of norm_num_groups, " + f"but get num_channels: {num_channels} and norm_num_groups: {norm_num_groups}" + ) + + if len(num_channels) != len(attention_levels): + raise ValueError( + f"DiffusionModelUNetMaisi expects num_channels being same size of attention_levels, " + f"but get num_channels: {len(num_channels)} and attention_levels: {len(attention_levels)}" + ) + + if isinstance(num_head_channels, int): + num_head_channels = ensure_tuple_rep(num_head_channels, len(attention_levels)) + + if len(num_head_channels) != len(attention_levels): + raise ValueError( + "num_head_channels should have the same length as attention_levels. For the i levels without attention," + " i.e. `attention_level[i]=False`, the num_head_channels[i] will be ignored." + ) + + if isinstance(num_res_blocks, int): + num_res_blocks = ensure_tuple_rep(num_res_blocks, len(num_channels)) + + if len(num_res_blocks) != len(num_channels): + raise ValueError( + "`num_res_blocks` should be a single integer or a tuple of integers with the same length as " + "`num_channels`." + ) + + if use_flash_attention and not has_xformers: + raise ValueError("use_flash_attention is True but xformers is not installed.") + + if use_flash_attention is True and not torch.cuda.is_available(): + raise ValueError( + "torch.cuda.is_available() should be True but is False. Flash attention is only available for GPU." + ) + + self.in_channels = in_channels + self.block_out_channels = num_channels + self.out_channels = out_channels + self.num_res_blocks = num_res_blocks + self.attention_levels = attention_levels + self.num_head_channels = num_head_channels + self.with_conditioning = with_conditioning + + # input + self.conv_in = Convolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=num_channels[0], + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + + # time + time_embed_dim = num_channels[0] * 4 + self.time_embed = self._create_embedding_module(num_channels[0], time_embed_dim) + + # class embedding + self.num_class_embeds = num_class_embeds + if num_class_embeds is not None: + self.class_embedding = nn.Embedding(num_class_embeds, time_embed_dim) + + self.include_top_region_index_input = include_top_region_index_input + self.include_bottom_region_index_input = include_bottom_region_index_input + self.include_spacing_input = include_spacing_input + + new_time_embed_dim = time_embed_dim + if self.include_top_region_index_input: + self.top_region_index_layer = self._create_embedding_module(4, time_embed_dim) + new_time_embed_dim += time_embed_dim + if self.include_bottom_region_index_input: + self.bottom_region_index_layer = self._create_embedding_module(4, time_embed_dim) + new_time_embed_dim += time_embed_dim + if self.include_spacing_input: + self.spacing_layer = self._create_embedding_module(3, time_embed_dim) + new_time_embed_dim += time_embed_dim + + # down + self.down_blocks = nn.ModuleList([]) + output_channel = num_channels[0] + for i in range(len(num_channels)): + input_channel = output_channel + output_channel = num_channels[i] + is_final_block = i == len(num_channels) - 1 + + down_block = get_down_block( + spatial_dims=spatial_dims, + in_channels=input_channel, + out_channels=output_channel, + temb_channels=new_time_embed_dim, + num_res_blocks=num_res_blocks[i], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_downsample=not is_final_block, + resblock_updown=resblock_updown, + with_attn=(attention_levels[i] and not with_conditioning), + with_cross_attn=(attention_levels[i] and with_conditioning), + num_head_channels=num_head_channels[i], + transformer_num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + use_flash_attention=use_flash_attention, + dropout_cattn=dropout_cattn, + ) + + self.down_blocks.append(down_block) + + # mid + self.middle_block = get_mid_block( + spatial_dims=spatial_dims, + in_channels=num_channels[-1], + temb_channels=new_time_embed_dim, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + with_conditioning=with_conditioning, + num_head_channels=num_head_channels[-1], + transformer_num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + use_flash_attention=use_flash_attention, + dropout_cattn=dropout_cattn, + ) + + # up + self.up_blocks = nn.ModuleList([]) + reversed_block_out_channels = list(reversed(num_channels)) + reversed_num_res_blocks = list(reversed(num_res_blocks)) + reversed_attention_levels = list(reversed(attention_levels)) + reversed_num_head_channels = list(reversed(num_head_channels)) + output_channel = reversed_block_out_channels[0] + for i in range(len(reversed_block_out_channels)): + prev_output_channel = output_channel + output_channel = reversed_block_out_channels[i] + input_channel = reversed_block_out_channels[min(i + 1, len(num_channels) - 1)] + + is_final_block = i == len(num_channels) - 1 + + up_block = get_up_block( + spatial_dims=spatial_dims, + in_channels=input_channel, + prev_output_channel=prev_output_channel, + out_channels=output_channel, + temb_channels=new_time_embed_dim, + num_res_blocks=reversed_num_res_blocks[i] + 1, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_upsample=not is_final_block, + resblock_updown=resblock_updown, + with_attn=(reversed_attention_levels[i] and not with_conditioning), + with_cross_attn=(reversed_attention_levels[i] and with_conditioning), + num_head_channels=reversed_num_head_channels[i], + transformer_num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + use_flash_attention=use_flash_attention, + dropout_cattn=dropout_cattn, + ) + + self.up_blocks.append(up_block) + + # out + self.out = nn.Sequential( + nn.GroupNorm(num_groups=norm_num_groups, num_channels=num_channels[0], eps=norm_eps, affine=True), + nn.SiLU(), + zero_module( + Convolution( + spatial_dims=spatial_dims, + in_channels=num_channels[0], + out_channels=out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + ), + ) + + def _create_embedding_module(self, input_dim, embed_dim): + model = nn.Sequential(nn.Linear(input_dim, embed_dim), nn.SiLU(), nn.Linear(embed_dim, embed_dim)) + return model + + def _get_time_and_class_embedding(self, x, timesteps, class_labels): + t_emb = get_timestep_embedding(timesteps, self.block_out_channels[0]) + + # timesteps does not contain any weights and will always return f32 tensors + # but time_embedding might actually be running in fp16. so we need to cast here. + # there might be better ways to encapsulate this. + t_emb = t_emb.to(dtype=x.dtype) + emb = self.time_embed(t_emb) + + if self.num_class_embeds is not None: + if class_labels is None: + raise ValueError("class_labels should be provided when num_class_embeds > 0") + class_emb = self.class_embedding(class_labels) + class_emb = class_emb.to(dtype=x.dtype) + emb += class_emb + return emb + + def _get_input_embeddings(self, emb, top_index, bottom_index, spacing): + if self.include_top_region_index_input: + _emb = self.top_region_index_layer(top_index) + emb = torch.cat((emb, _emb), dim=1) + if self.include_bottom_region_index_input: + _emb = self.bottom_region_index_layer(bottom_index) + emb = torch.cat((emb, _emb), dim=1) + if self.include_spacing_input: + _emb = self.spacing_layer(spacing) + emb = torch.cat((emb, _emb), dim=1) + return emb + + def _apply_down_blocks(self, h, emb, context, down_block_additional_residuals): + if context is not None and self.with_conditioning is False: + raise ValueError("model should have with_conditioning = True if context is provided") + down_block_res_samples: list[torch.Tensor] = [h] + for downsample_block in self.down_blocks: + h, res_samples = downsample_block(hidden_states=h, temb=emb, context=context) + down_block_res_samples.extend(res_samples) + + # Additional residual conections for Controlnets + if down_block_additional_residuals is not None: + new_down_block_res_samples: list[torch.Tensor] = [] + for down_block_res_sample, down_block_additional_residual in zip( + down_block_res_samples, down_block_additional_residuals + ): + down_block_res_sample += down_block_additional_residual + new_down_block_res_samples.append(down_block_res_sample) + + down_block_res_samples = new_down_block_res_samples + return h, down_block_res_samples + + def _apply_up_blocks(self, h, emb, context, down_block_res_samples): + for upsample_block in self.up_blocks: + res_samples = down_block_res_samples[-len(upsample_block.resnets) :] + down_block_res_samples = down_block_res_samples[: -len(upsample_block.resnets)] + h = upsample_block(hidden_states=h, res_hidden_states_list=res_samples, temb=emb, context=context) + + return h + + def forward( + self, + x: torch.Tensor, + timesteps: torch.Tensor, + context: torch.Tensor | None = None, + class_labels: torch.Tensor | None = None, + down_block_additional_residuals: tuple[torch.Tensor] | None = None, + mid_block_additional_residual: torch.Tensor | None = None, + top_region_index_tensor: torch.Tensor | None = None, + bottom_region_index_tensor: torch.Tensor | None = None, + spacing_tensor: torch.Tensor | None = None, + ) -> torch.Tensor: + """ + Forward pass through the UNet model. + + Args: + x: Input tensor of shape (N, C, SpatialDims). + timesteps: Timestep tensor of shape (N,). + context: Context tensor of shape (N, 1, ContextDim). + class_labels: Class labels tensor of shape (N,). + down_block_additional_residuals: Additional residual tensors for down blocks of shape (N, C, FeatureMapsDims). + mid_block_additional_residual: Additional residual tensor for mid block of shape (N, C, FeatureMapsDims). + top_region_index_tensor: Tensor representing top region index of shape (N, 4). + bottom_region_index_tensor: Tensor representing bottom region index of shape (N, 4). + spacing_tensor: Tensor representing spacing of shape (N, 3). + + Returns: + A tensor representing the output of the UNet model. + """ + + emb = self._get_time_and_class_embedding(x, timesteps, class_labels) + emb = self._get_input_embeddings(emb, top_region_index_tensor, bottom_region_index_tensor, spacing_tensor) + h = self.conv_in(x) + h, _updated_down_block_res_samples = self._apply_down_blocks(h, emb, context, down_block_additional_residuals) + h = self.middle_block(h, emb, context) + + # Additional residual conections for Controlnets + if mid_block_additional_residual is not None: + h += mid_block_additional_residual + + h = self._apply_up_blocks(h, emb, context, _updated_down_block_res_samples) + h = self.out(h) + h_tensor: torch.Tensor = convert_to_tensor(h) + return h_tensor diff --git a/monai/apps/generation/maisi/utils/__init__.py b/monai/apps/generation/maisi/utils/__init__.py new file mode 100644 index 0000000000..1e97f89407 --- /dev/null +++ b/monai/apps/generation/maisi/utils/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/monai/apps/generation/maisi/utils/morphological_ops.py b/monai/apps/generation/maisi/utils/morphological_ops.py new file mode 100644 index 0000000000..14786d60a2 --- /dev/null +++ b/monai/apps/generation/maisi/utils/morphological_ops.py @@ -0,0 +1,170 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Sequence + +import torch +import torch.nn.functional as F +from torch import Tensor + +from monai.config import NdarrayOrTensor +from monai.utils import convert_data_type, convert_to_dst_type, ensure_tuple_rep + + +def erode(mask: NdarrayOrTensor, filter_size: int | Sequence[int] = 3, pad_value: float = 1.0) -> NdarrayOrTensor: + """ + Erode 2D/3D binary mask. + + Args: + mask: input 2D/3D binary mask, [N,C,M,N] or [N,C,M,N,P] torch tensor or ndarray. + filter_size: erosion filter size, has to be odd numbers, default to be 3. + pad_value: the filled value for padding. We need to pad the input before filtering + to keep the output with the same size as input. Usually use default value + and not changed. + + Return: + eroded mask, same shape and data type as input. + + Example: + + .. code-block:: python + + # define a naive mask + mask = torch.zeros(3,2,3,3,3) + mask[:,:,1,1,1] = 1.0 + filter_size = 3 + erode_result = erode(mask, filter_size) # expect torch.zeros(3,2,3,3,3) + dilate_result = dilate(mask, filter_size) # expect torch.ones(3,2,3,3,3) + """ + mask_t, *_ = convert_data_type(mask, torch.Tensor) + res_mask_t = erode_t(mask_t, filter_size=filter_size, pad_value=pad_value) + res_mask: NdarrayOrTensor + res_mask, *_ = convert_to_dst_type(src=res_mask_t, dst=mask) + return res_mask + + +def dilate(mask: NdarrayOrTensor, filter_size: int | Sequence[int] = 3, pad_value: float = 0.0) -> NdarrayOrTensor: + """ + Dilate 2D/3D binary mask. + + Args: + mask: input 2D/3D binary mask, [N,C,M,N] or [N,C,M,N,P] torch tensor or ndarray. + filter_size: dilation filter size, has to be odd numbers, default to be 3. + pad_value: the filled value for padding. We need to pad the input before filtering + to keep the output with the same size as input. Usually use default value + and not changed. + + Return: + dilated mask, same shape and data type as input. + + Example: + + .. code-block:: python + + # define a naive mask + mask = torch.zeros(3,2,3,3,3) + mask[:,:,1,1,1] = 1.0 + filter_size = 3 + erode_result = erode(mask,filter_size) # expect torch.zeros(3,2,3,3,3) + dilate_result = dilate(mask,filter_size) # expect torch.ones(3,2,3,3,3) + """ + mask_t, *_ = convert_data_type(mask, torch.Tensor) + res_mask_t = dilate_t(mask_t, filter_size=filter_size, pad_value=pad_value) + res_mask: NdarrayOrTensor + res_mask, *_ = convert_to_dst_type(src=res_mask_t, dst=mask) + return res_mask + + +def get_morphological_filter_result_t(mask_t: Tensor, filter_size: int | Sequence[int], pad_value: float) -> Tensor: + """ + Apply a morphological filter to a 2D/3D binary mask tensor. + + Args: + mask_t: input 2D/3D binary mask, [N,C,M,N] or [N,C,M,N,P] torch tensor. + filter_size: morphological filter size, has to be odd numbers. + pad_value: the filled value for padding. We need to pad the input before filtering + to keep the output with the same size as input. + + Return: + Tensor: Morphological filter result mask, same shape as input. + """ + spatial_dims = len(mask_t.shape) - 2 + if spatial_dims not in [2, 3]: + raise ValueError( + f"spatial_dims must be either 2 or 3, " + f"got spatial_dims={spatial_dims} for mask tensor with shape of {mask_t.shape}." + ) + + # Define the structuring element + filter_size = ensure_tuple_rep(filter_size, spatial_dims) + if any(size % 2 == 0 for size in filter_size): + raise ValueError(f"All dimensions in filter_size must be odd numbers, got {filter_size}.") + + structuring_element = torch.ones((mask_t.shape[1], mask_t.shape[1]) + filter_size).to(mask_t.device) + + # Pad the input tensor to handle border pixels + # Calculate padding size + pad_size = [size // 2 for size in filter_size for _ in range(2)] + + input_padded = F.pad(mask_t.float(), pad_size, mode="constant", value=pad_value) + + # Apply filter operation + conv_fn = F.conv2d if spatial_dims == 2 else F.conv3d + output = conv_fn(input_padded, structuring_element, padding=0) / torch.sum(structuring_element[0, ...]) + + return output + + +def erode_t(mask_t: Tensor, filter_size: int | Sequence[int] = 3, pad_value: float = 1.0) -> Tensor: + """ + Erode 2D/3D binary mask with data type as torch tensor. + + Args: + mask_t: input 2D/3D binary mask, [N,C,M,N] or [N,C,M,N,P] torch tensor. + filter_size: erosion filter size, has to be odd numbers, default to be 3. + pad_value: the filled value for padding. We need to pad the input before filtering + to keep the output with the same size as input. Usually use default value + and not changed. + + Return: + Tensor: eroded mask, same shape as input. + """ + + output = get_morphological_filter_result_t(mask_t, filter_size, pad_value) + + # Set output values based on the minimum value within the structuring element + output = torch.where(torch.abs(output - 1.0) < 1e-7, 1.0, 0.0) + + return output + + +def dilate_t(mask_t: Tensor, filter_size: int | Sequence[int] = 3, pad_value: float = 0.0) -> Tensor: + """ + Dilate 2D/3D binary mask with data type as torch tensor. + + Args: + mask_t: input 2D/3D binary mask, [N,C,M,N] or [N,C,M,N,P] torch tensor. + filter_size: dilation filter size, has to be odd numbers, default to be 3. + pad_value: the filled value for padding. We need to pad the input before filtering + to keep the output with the same size as input. Usually use default value + and not changed. + + Return: + Tensor: dilated mask, same shape as input. + """ + output = get_morphological_filter_result_t(mask_t, filter_size, pad_value) + + # Set output values based on the minimum value within the structuring element + output = torch.where(output > 0, 1.0, 0.0) + + return output diff --git a/monai/apps/nnunet/nnunetv2_runner.py b/monai/apps/nnunet/nnunetv2_runner.py index 44b3c24256..8a10849904 100644 --- a/monai/apps/nnunet/nnunetv2_runner.py +++ b/monai/apps/nnunet/nnunetv2_runner.py @@ -22,6 +22,7 @@ from monai.apps.nnunet.utils import analyze_data, create_new_data_copy, create_new_dataset_json from monai.bundle import ConfigParser from monai.utils import ensure_tuple, optional_import +from monai.utils.misc import run_cmd load_pickle, _ = optional_import("batchgenerators.utilities.file_and_folder_operations", name="load_pickle") join, _ = optional_import("batchgenerators.utilities.file_and_folder_operations", name="join") @@ -495,65 +496,64 @@ def train_single_model(self, config: Any, fold: int, gpu_id: tuple | list | int fold: fold of the 5-fold cross-validation. Should be an int between 0 and 4. gpu_id: an integer to select the device to use, or a tuple/list of GPU device indices used for multi-GPU training (e.g., (0,1)). Default: 0. - from nnunetv2.run.run_training import run_training kwargs: this optional parameter allows you to specify additional arguments in - ``nnunetv2.run.run_training.run_training``. Currently supported args are - - plans_identifier: custom plans identifier. Default: "nnUNetPlans". - - pretrained_weights: path to nnU-Net checkpoint file to be used as pretrained model. Will only be - used when actually training. Beta. Use with caution. Default: False. - - use_compressed_data: True to use compressed data for training. Reading compressed data is much - more CPU and (potentially) RAM intensive and should only be used if you know what you are - doing. Default: False. - - continue_training: continue training from latest checkpoint. Default: False. - - only_run_validation: True to run the validation only. Requires training to have finished. - Default: False. - - disable_checkpointing: True to disable checkpointing. Ideal for testing things out and you - don't want to flood your hard drive with checkpoints. Default: False. + ``nnunetv2.run.run_training.run_training_entry``. + + Currently supported args are: + + - p: custom plans identifier. Default: "nnUNetPlans". + - pretrained_weights: path to nnU-Net checkpoint file to be used as pretrained model. Will only be + used when actually training. Beta. Use with caution. Default: False. + - use_compressed: True to use compressed data for training. Reading compressed data is much + more CPU and (potentially) RAM intensive and should only be used if you know what you are + doing. Default: False. + - c: continue training from latest checkpoint. Default: False. + - val: True to run the validation only. Requires training to have finished. + Default: False. + - disable_checkpointing: True to disable checkpointing. Ideal for testing things out and you + don't want to flood your hard drive with checkpoints. Default: False. """ if "num_gpus" in kwargs: kwargs.pop("num_gpus") logger.warning("please use gpu_id to set the GPUs to use") - if "trainer_class_name" in kwargs: - kwargs.pop("trainer_class_name") + if "tr" in kwargs: + kwargs.pop("tr") logger.warning("please specify the `trainer_class_name` in the __init__ of `nnUNetV2Runner`.") - if "export_validation_probabilities" in kwargs: - kwargs.pop("export_validation_probabilities") + if "npz" in kwargs: + kwargs.pop("npz") logger.warning("please specify the `export_validation_probabilities` in the __init__ of `nnUNetV2Runner`.") + cmd = self.train_single_model_command(config, fold, gpu_id, kwargs) + run_cmd(cmd, shell=True) + + def train_single_model_command(self, config, fold, gpu_id, kwargs): if isinstance(gpu_id, (tuple, list)): if len(gpu_id) > 1: gpu_ids_str = "" for _i in range(len(gpu_id)): gpu_ids_str += f"{gpu_id[_i]}," - os.environ["CUDA_VISIBLE_DEVICES"] = gpu_ids_str[:-1] + device_setting = f"CUDA_VISIBLE_DEVICES={gpu_ids_str[:-1]}" else: - os.environ["CUDA_VISIBLE_DEVICES"] = f"{gpu_id[0]}" - else: - os.environ["CUDA_VISIBLE_DEVICES"] = f"{gpu_id}" - - from nnunetv2.run.run_training import run_training - - if isinstance(gpu_id, int) or len(gpu_id) == 1: - run_training( - dataset_name_or_id=self.dataset_name_or_id, - configuration=config, - fold=fold, - trainer_class_name=self.trainer_class_name, - export_validation_probabilities=self.export_validation_probabilities, - **kwargs, - ) + device_setting = f"CUDA_VISIBLE_DEVICES={gpu_id[0]}" else: - run_training( - dataset_name_or_id=self.dataset_name_or_id, - configuration=config, - fold=fold, - num_gpus=len(gpu_id), - trainer_class_name=self.trainer_class_name, - export_validation_probabilities=self.export_validation_probabilities, - **kwargs, - ) + device_setting = f"CUDA_VISIBLE_DEVICES={gpu_id}" + num_gpus = 1 if isinstance(gpu_id, int) or len(gpu_id) == 1 else len(gpu_id) + + cmd = ( + f"{device_setting} nnUNetv2_train " + + f"{self.dataset_name_or_id} {config} {fold} " + + f"-tr {self.trainer_class_name} -num_gpus {num_gpus}" + ) + if self.export_validation_probabilities: + cmd += " --npz" + for _key, _value in kwargs.items(): + if _key == "p" or _key == "pretrained_weights": + cmd += f" -{_key} {_value}" + else: + cmd += f" --{_key} {_value}" + return cmd def train( self, @@ -637,15 +637,7 @@ def train_parallel_cmd( if _config in ensure_tuple(configs): for _i in range(self.num_folds): the_device = gpu_id_for_all[_index % n_devices] # type: ignore - cmd = ( - "python -m monai.apps.nnunet nnUNetV2Runner train_single_model " - + f"--input_config '{self.input_config_or_dict}' --work_dir '{self.work_dir}' " - + f"--config '{_config}' --fold {_i} --gpu_id {the_device} " - + f"--trainer_class_name {self.trainer_class_name} " - + f"--export_validation_probabilities {self.export_validation_probabilities}" - ) - for _key, _value in kwargs.items(): - cmd += f" --{_key} {_value}" + cmd = self.train_single_model_command(_config, _i, the_device, kwargs) all_cmds[-1][the_device].append(cmd) _index += 1 return all_cmds diff --git a/monai/apps/nuclick/transforms.py b/monai/apps/nuclick/transforms.py index f22ea764be..4828bd2e5a 100644 --- a/monai/apps/nuclick/transforms.py +++ b/monai/apps/nuclick/transforms.py @@ -24,7 +24,7 @@ measure, _ = optional_import("skimage.measure") morphology, _ = optional_import("skimage.morphology") -distance_transform_cdt, _ = optional_import("scipy.ndimage.morphology", name="distance_transform_cdt") +distance_transform_cdt, _ = optional_import("scipy.ndimage", name="distance_transform_cdt") class NuclickKeys(StrEnum): diff --git a/monai/apps/pathology/transforms/post/array.py b/monai/apps/pathology/transforms/post/array.py index 99e94f89c0..035bce2c69 100644 --- a/monai/apps/pathology/transforms/post/array.py +++ b/monai/apps/pathology/transforms/post/array.py @@ -28,12 +28,12 @@ SobelGradients, ) from monai.transforms.transform import Transform -from monai.transforms.utils_pytorch_numpy_unification import max, maximum, min, sum, unique +from monai.transforms.utils_pytorch_numpy_unification import max, maximum, min, sum, unique, where from monai.utils import TransformBackends, convert_to_numpy, optional_import from monai.utils.misc import ensure_tuple_rep from monai.utils.type_conversion import convert_to_dst_type, convert_to_tensor -label, _ = optional_import("scipy.ndimage.measurements", name="label") +label, _ = optional_import("scipy.ndimage", name="label") disk, _ = optional_import("skimage.morphology", name="disk") opening, _ = optional_import("skimage.morphology", name="opening") watershed, _ = optional_import("skimage.segmentation", name="watershed") @@ -162,7 +162,8 @@ def __call__(self, prob_map: NdarrayOrTensor) -> NdarrayOrTensor: pred = label(pred)[0] if self.remove_small_objects is not None: pred = self.remove_small_objects(pred) - pred[pred > 0] = 1 + pred_indices = np.where(pred > 0) + pred[pred_indices] = 1 return convert_to_dst_type(pred, prob_map, dtype=self.dtype)[0] @@ -338,7 +339,8 @@ def __call__(self, mask: NdarrayOrTensor, instance_border: NdarrayOrTensor) -> N instance_border = instance_border >= self.threshold # uncertain area marker = mask - convert_to_dst_type(instance_border, mask)[0] # certain foreground - marker[marker < 0] = 0 + marker_indices = where(marker < 0) + marker[marker_indices] = 0 # type: ignore[index] marker = self.postprocess_fn(marker) marker = convert_to_numpy(marker) @@ -379,6 +381,7 @@ def _generate_contour_coord(self, current: np.ndarray, previous: np.ndarray) -> """ p_delta = (current[0] - previous[0], current[1] - previous[1]) + row, col = -1, -1 if p_delta in ((0.0, 1.0), (0.5, 0.5), (1.0, 0.0)): row = int(current[0] + 0.5) @@ -634,7 +637,7 @@ def __call__( # type: ignore seg_map_crop = convert_to_dst_type(seg_map_crop == instance_id, type_map_crop, dtype=bool)[0] - inst_type = type_map_crop[seg_map_crop] + inst_type = type_map_crop[seg_map_crop] # type: ignore[index] type_list, type_pixels = unique(inst_type, return_counts=True) type_list = list(zip(type_list, type_pixels)) type_list = sorted(type_list, key=lambda x: x[1], reverse=True) diff --git a/monai/apps/pathology/utils.py b/monai/apps/pathology/utils.py index d3ebe0a7a6..3aa0bfab86 100644 --- a/monai/apps/pathology/utils.py +++ b/monai/apps/pathology/utils.py @@ -33,10 +33,10 @@ def compute_multi_instance_mask(mask: np.ndarray, threshold: float) -> Any: """ neg = 255 - mask * 255 - distance = ndimage.morphology.distance_transform_edt(neg) + distance = ndimage.distance_transform_edt(neg) binary = distance < threshold - filled_image = ndimage.morphology.binary_fill_holes(binary) + filled_image = ndimage.binary_fill_holes(binary) multi_instance_mask = measure.label(filled_image, connectivity=2) return multi_instance_mask diff --git a/monai/apps/utils.py b/monai/apps/utils.py index db541923b5..0c998146a3 100644 --- a/monai/apps/utils.py +++ b/monai/apps/utils.py @@ -135,7 +135,12 @@ def check_hash(filepath: PathLike, val: str | None = None, hash_type: str = "md5 logger.info(f"Expected {hash_type} is None, skip {hash_type} check for file {filepath}.") return True actual_hash_func = look_up_option(hash_type.lower(), SUPPORTED_HASH_TYPES) - actual_hash = actual_hash_func() + + if sys.version_info >= (3, 9): + actual_hash = actual_hash_func(usedforsecurity=False) # allows checks on FIPS enabled machines + else: + actual_hash = actual_hash_func() + try: with open(filepath, "rb") as f: for chunk in iter(lambda: f.read(1024 * 1024), b""): diff --git a/monai/auto3dseg/analyzer.py b/monai/auto3dseg/analyzer.py index 56419da4cb..37f3faea21 100644 --- a/monai/auto3dseg/analyzer.py +++ b/monai/auto3dseg/analyzer.py @@ -460,7 +460,7 @@ def __call__(self, data: Mapping[Hashable, MetaTensor]) -> dict[Hashable, MetaTe torch.set_grad_enabled(False) ndas: list[MetaTensor] = [d[self.image_key][i] for i in range(d[self.image_key].shape[0])] # type: ignore - ndas_label: MetaTensor = d[self.label_key].astype(torch.int8) # (H,W,D) + ndas_label: MetaTensor = d[self.label_key].astype(torch.int16) # (H,W,D) if ndas_label.shape != ndas[0].shape: raise ValueError(f"Label shape {ndas_label.shape} is different from image shape {ndas[0].shape}") @@ -472,7 +472,7 @@ def __call__(self, data: Mapping[Hashable, MetaTensor]) -> dict[Hashable, MetaTe if isinstance(ndas_label, (MetaTensor, torch.Tensor)): unique_label = unique_label.data.cpu().numpy() - unique_label = unique_label.astype(np.int8).tolist() + unique_label = unique_label.astype(np.int16).tolist() label_substats = [] # each element is one label pixel_sum = 0 diff --git a/monai/auto3dseg/utils.py b/monai/auto3dseg/utils.py index 58b900d410..211f23c415 100644 --- a/monai/auto3dseg/utils.py +++ b/monai/auto3dseg/utils.py @@ -407,7 +407,7 @@ def _prepare_cmd_default(cmd: str, cmd_prefix: str | None = None, **kwargs: Any) Args: cmd: the command or script to run in the distributed job. - cmd_prefix: the command prefix to run the script, e.g., "python", "python -m", "python3", "/opt/conda/bin/python3.8 ". + cmd_prefix: the command prefix to run the script, e.g., "python", "python -m", "python3", "/opt/conda/bin/python3.9 ". kwargs: the keyword arguments to be passed to the script. Returns: diff --git a/monai/bundle/config_item.py b/monai/bundle/config_item.py index 844d5b30bf..e5122bf3de 100644 --- a/monai/bundle/config_item.py +++ b/monai/bundle/config_item.py @@ -289,10 +289,7 @@ def instantiate(self, **kwargs: Any) -> object: mode = self.get_config().get("_mode_", CompInitMode.DEFAULT) args = self.resolve_args() args.update(kwargs) - try: - return instantiate(modname, mode, **args) - except Exception as e: - raise RuntimeError(f"Failed to instantiate {self}") from e + return instantiate(modname, mode, **args) class ConfigExpression(ConfigItem): diff --git a/monai/bundle/scripts.py b/monai/bundle/scripts.py index 2565a3cf64..56146546e8 100644 --- a/monai/bundle/scripts.py +++ b/monai/bundle/scripts.py @@ -16,6 +16,7 @@ import os import re import warnings +import zipfile from collections.abc import Mapping, Sequence from pathlib import Path from pydoc import locate @@ -171,6 +172,10 @@ def _get_ngc_bundle_url(model_name: str, version: str) -> str: return f"https://api.ngc.nvidia.com/v2/models/nvidia/monaitoolkit/{model_name.lower()}/versions/{version}/zip" +def _get_ngc_private_bundle_url(model_name: str, version: str, repo: str) -> str: + return f"https://api.ngc.nvidia.com/v2/{repo}/models/{model_name.lower()}/versions/{version}/zip" + + def _get_monaihosting_bundle_url(model_name: str, version: str) -> str: monaihosting_root_path = "https://api.ngc.nvidia.com/v2/models/nvidia/monaihosting" return f"{monaihosting_root_path}/{model_name.lower()}/versions/{version}/files/{model_name}_v{version}.zip" @@ -219,6 +224,48 @@ def _download_from_ngc( extractall(filepath=filepath, output_dir=extract_path, has_base=True) +def _download_from_ngc_private( + download_path: Path, filename: str, version: str, remove_prefix: str | None, repo: str, headers: dict | None = None +) -> None: + # ensure prefix is contained + filename = _add_ngc_prefix(filename) + request_url = _get_ngc_private_bundle_url(model_name=filename, version=version, repo=repo) + if has_requests: + headers = {} if headers is None else headers + response = requests_get(request_url, headers=headers) + response.raise_for_status() + else: + raise ValueError("NGC API requires requests package. Please install it.") + + zip_path = download_path / f"{filename}_v{version}.zip" + with open(zip_path, "wb") as f: + f.write(response.content) + logger.info(f"Downloading: {zip_path}.") + if remove_prefix: + filename = _remove_ngc_prefix(filename, prefix=remove_prefix) + extract_path = download_path / f"{filename}" + with zipfile.ZipFile(zip_path, "r") as z: + z.extractall(extract_path) + logger.info(f"Writing into directory: {extract_path}.") + + +def _get_ngc_token(api_key, retry=0): + """Try to connect to NGC.""" + url = "https://authn.nvidia.com/token?service=ngc" + headers = {"Accept": "application/json", "Authorization": "ApiKey " + api_key} + if has_requests: + response = requests_get(url, headers=headers) + if not response.ok: + # retry 3 times, if failed, raise an error. + if retry < 3: + logger.info(f"Retrying {retry} time(s) to GET {url}.") + return _get_ngc_token(url, retry + 1) + raise RuntimeError("NGC API response is not ok. Failed to get token.") + else: + token = response.json()["token"] + return token + + def _get_latest_bundle_version_monaihosting(name): url = "https://api.ngc.nvidia.com/v2/models/nvidia/monaihosting" full_url = f"{url}/{name.lower()}" @@ -227,12 +274,28 @@ def _get_latest_bundle_version_monaihosting(name): resp = requests_get(full_url) resp.raise_for_status() else: - raise ValueError("NGC API requires requests package. Please install it.") + raise ValueError("NGC API requires requests package. Please install it.") model_info = json.loads(resp.text) return model_info["model"]["latestVersionIdStr"] -def _get_latest_bundle_version(source: str, name: str, repo: str) -> dict[str, list[str] | str] | Any | None: +def _get_latest_bundle_version_private_registry(name, repo, headers=None): + url = f"https://api.ngc.nvidia.com/v2/{repo}/models" + full_url = f"{url}/{name.lower()}" + requests_get, has_requests = optional_import("requests", name="get") + if has_requests: + headers = {} if headers is None else headers + resp = requests_get(full_url, headers=headers) + resp.raise_for_status() + else: + raise ValueError("NGC API requires requests package. Please install it.") + model_info = json.loads(resp.text) + return model_info["model"]["latestVersionIdStr"] + + +def _get_latest_bundle_version( + source: str, name: str, repo: str, **kwargs: Any +) -> dict[str, list[str] | str] | Any | None: if source == "ngc": name = _add_ngc_prefix(name) model_dict = _get_all_ngc_models(name) @@ -242,6 +305,10 @@ def _get_latest_bundle_version(source: str, name: str, repo: str) -> dict[str, l return None elif source == "monaihosting": return _get_latest_bundle_version_monaihosting(name) + elif source == "ngc_private": + headers = kwargs.pop("headers", {}) + name = _add_ngc_prefix(name) + return _get_latest_bundle_version_private_registry(name, repo, headers) elif source == "github": repo_owner, repo_name, tag_name = repo.split("/") return get_bundle_versions(name, repo=f"{repo_owner}/{repo_name}", tag=tag_name)["latest_version"] @@ -308,6 +375,9 @@ def download( # Execute this module as a CLI entry, and download bundle via URL: python -m monai.bundle download --name --url + # Execute this module as a CLI entry, and download bundle from ngc_private with latest version: + python -m monai.bundle download --name --source "ngc_private" --bundle_dir "./" --repo "org/org_name" + # Set default args of `run` in a JSON / YAML file, help to record and simplify the command line. # Other args still can override the default args at runtime. # The content of the JSON / YAML file is a dictionary. For example: @@ -328,10 +398,13 @@ def download( Default is `bundle` subfolder under `torch.hub.get_dir()`. source: storage location name. This argument is used when `url` is `None`. In default, the value is achieved from the environment variable BUNDLE_DOWNLOAD_SRC, and - it should be "ngc", "monaihosting", "github", or "huggingface_hub". + it should be "ngc", "monaihosting", "github", "ngc_private", or "huggingface_hub". + If source is "ngc_private", you need specify the NGC_API_KEY in the environment variable. repo: repo name. This argument is used when `url` is `None` and `source` is "github" or "huggingface_hub". If `source` is "github", it should be in the form of "repo_owner/repo_name/release_tag". If `source` is "huggingface_hub", it should be in the form of "repo_owner/repo_name". + If `source` is "ngc_private", it should be in the form of "org/org_name" or "org/org_name/team/team_name", + or you can specify the environment variable NGC_ORG and NGC_TEAM. url: url to download the data. If not `None`, data will be downloaded directly and `source` will not be checked. If `name` is `None`, filename is determined by `monai.apps.utils._basename(url)`. @@ -363,11 +436,18 @@ def download( bundle_dir_ = _process_bundle_dir(bundle_dir_) if repo_ is None: - repo_ = "Project-MONAI/model-zoo/hosting_storage_v1" - if len(repo_.split("/")) != 3 and source_ != "huggingface_hub": - raise ValueError("repo should be in the form of `repo_owner/repo_name/release_tag`.") + org_ = os.getenv("NGC_ORG", None) + team_ = os.getenv("NGC_TEAM", None) + if org_ is not None and source_ == "ngc_private": + repo_ = f"org/{org_}/team/{team_}" if team_ is not None else f"org/{org_}" + else: + repo_ = "Project-MONAI/model-zoo/hosting_storage_v1" + if len(repo_.split("/")) not in (2, 4) and source_ == "ngc_private": + raise ValueError(f"repo should be in the form of `org/org_name/team/team_name` or `org/org_name`, got {repo_}.") + if len(repo_.split("/")) != 3 and source_ == "github": + raise ValueError(f"repo should be in the form of `repo_owner/repo_name/release_tag`, got {repo_}.") elif len(repo_.split("/")) != 2 and source_ == "huggingface_hub": - raise ValueError("Hugging Face Hub repo should be in the form of `repo_owner/repo_name`") + raise ValueError(f"Hugging Face Hub repo should be in the form of `repo_owner/repo_name`, got {repo_}.") if url_ is not None: if name_ is not None: filepath = bundle_dir_ / f"{name_}.zip" @@ -376,10 +456,19 @@ def download( download_url(url=url_, filepath=filepath, hash_val=None, progress=progress_) extractall(filepath=filepath, output_dir=bundle_dir_, has_base=True) else: + headers = {} if name_ is None: raise ValueError(f"To download from source: {source_}, `name` must be provided.") + if source == "ngc_private": + api_key = os.getenv("NGC_API_KEY", None) + if api_key is None: + raise ValueError("API key is required for ngc_private source.") + else: + token = _get_ngc_token(api_key) + headers = {"Authorization": f"Bearer {token}"} + if version_ is None: - version_ = _get_latest_bundle_version(source=source_, name=name_, repo=repo_) + version_ = _get_latest_bundle_version(source=source_, name=name_, repo=repo_, headers=headers) if source_ == "github": if version_ is not None: name_ = "_v".join([name_, version_]) @@ -394,6 +483,15 @@ def download( remove_prefix=remove_prefix_, progress=progress_, ) + elif source_ == "ngc_private": + _download_from_ngc_private( + download_path=bundle_dir_, + filename=name_, + version=version_, + remove_prefix=remove_prefix_, + repo=repo_, + headers=headers, + ) elif source_ == "huggingface_hub": extract_path = os.path.join(bundle_dir_, name_) huggingface_hub.snapshot_download(repo_id=repo_, revision=version_, local_dir=extract_path) @@ -778,10 +876,19 @@ def run( https://docs.python.org/3/library/logging.config.html#logging.config.fileConfig. Default to None. tracking: if not None, enable the experiment tracking at runtime with optionally configurable and extensible. - if "mlflow", will add `MLFlowHandler` to the parsed bundle with default tracking settings, - if other string, treat it as file path to load the tracking settings. - if `dict`, treat it as tracking settings. - will patch the target config content with `tracking handlers` and the top-level items of `configs`. + If "mlflow", will add `MLFlowHandler` to the parsed bundle with default tracking settings where a set of + common parameters shown below will be added and can be passed through the `override` parameter of this method. + + - ``"output_dir"``: the path to save mlflow tracking outputs locally, default to "/eval". + - ``"tracking_uri"``: uri to save mlflow tracking outputs, default to "/output_dir/mlruns". + - ``"experiment_name"``: experiment name for this run, default to "monai_experiment". + - ``"run_name"``: the name of current run. + - ``"save_execute_config"``: whether to save the executed config files. It can be `False`, `/path/to/artifacts` + or `True`. If set to `True`, will save to the default path "/eval". Default to `True`. + + If other string, treat it as file path to load the tracking settings. + If `dict`, treat it as tracking settings. + Will patch the target config content with `tracking handlers` and the top-level items of `configs`. for detailed usage examples, please check the tutorial: https://github.com/Project-MONAI/tutorials/blob/main/experiment_management/bundle_integrate_mlflow.ipynb. args_file: a JSON or YAML file to provide default values for `run_id`, `meta_file`, diff --git a/monai/bundle/utils.py b/monai/bundle/utils.py index b187159c89..0f17422ba5 100644 --- a/monai/bundle/utils.py +++ b/monai/bundle/utils.py @@ -113,7 +113,7 @@ "experiment_name": "monai_experiment", "run_name": None, # may fill it at runtime - "execute_config": None, + "save_execute_config": True, "is_not_rank0": ( "$torch.distributed.is_available() \ and torch.distributed.is_initialized() and torch.distributed.get_rank() > 0" @@ -125,7 +125,7 @@ "tracking_uri": "@tracking_uri", "experiment_name": "@experiment_name", "run_name": "@run_name", - "artifacts": "@execute_config", + "artifacts": "@save_execute_config", "iteration_log": True, "epoch_log": True, "tag_name": "train_loss", @@ -148,7 +148,7 @@ "tracking_uri": "@tracking_uri", "experiment_name": "@experiment_name", "run_name": "@run_name", - "artifacts": "@execute_config", + "artifacts": "@save_execute_config", "iteration_log": False, "close_on_complete": True, }, @@ -221,6 +221,7 @@ def load_bundle_config(bundle_path: str, *config_names: str, **load_kw_args: Any raise ValueError(f"Cannot find config file '{full_cname}'") ardata = archive.read(full_cname) + cdata = {} if full_cname.lower().endswith("json"): cdata = json.loads(ardata, **load_kw_args) diff --git a/monai/bundle/workflows.py b/monai/bundle/workflows.py index da3aa30141..11c9bf0562 100644 --- a/monai/bundle/workflows.py +++ b/monai/bundle/workflows.py @@ -11,6 +11,7 @@ from __future__ import annotations +import json import os import sys import time @@ -24,6 +25,7 @@ from monai.bundle.config_parser import ConfigParser from monai.bundle.properties import InferProperties, MetaProperties, TrainProperties from monai.bundle.utils import DEFAULT_EXP_MGMT_SETTINGS, EXPR_KEY, ID_REF_KEY, ID_SEP_KEY +from monai.config import PathLike from monai.utils import BundleProperty, BundlePropertyConfig, deprecated_arg, deprecated_arg_default, ensure_tuple __all__ = ["BundleWorkflow", "ConfigWorkflow"] @@ -46,6 +48,10 @@ class BundleWorkflow(ABC): or "infer", "inference", "eval", "evaluation" for a inference workflow, other unsupported string will raise a ValueError. default to `None` for common workflow. + properties_path: the path to the JSON file of properties. + meta_file: filepath of the metadata file, if this is a list of file paths, their contents will be merged in order. + logging_file: config file for `logging` module in the program. for more details: + https://docs.python.org/3/library/logging.config.html#logging.config.fileConfig. """ @@ -59,21 +65,62 @@ class BundleWorkflow(ABC): new_name="workflow_type", msg_suffix="please use `workflow_type` instead.", ) - def __init__(self, workflow_type: str | None = None, workflow: str | None = None): + def __init__( + self, + workflow_type: str | None = None, + workflow: str | None = None, + properties_path: PathLike | None = None, + meta_file: str | Sequence[str] | None = None, + logging_file: str | None = None, + ): + if logging_file is not None: + if not os.path.isfile(logging_file): + raise FileNotFoundError(f"Cannot find the logging config file: {logging_file}.") + logger.info(f"Setting logging properties based on config: {logging_file}.") + fileConfig(logging_file, disable_existing_loggers=False) + + if meta_file is not None: + if isinstance(meta_file, str) and not os.path.isfile(meta_file): + logger.error( + f"Cannot find the metadata config file: {meta_file}. " + "Please see: https://docs.monai.io/en/stable/mb_specification.html" + ) + meta_file = None + if isinstance(meta_file, list): + for f in meta_file: + if not os.path.isfile(f): + logger.error( + f"Cannot find the metadata config file: {f}. " + "Please see: https://docs.monai.io/en/stable/mb_specification.html" + ) + meta_file = None + workflow_type = workflow if workflow is not None else workflow_type - if workflow_type is None: + if workflow_type is None and properties_path is None: self.properties = copy(MetaProperties) self.workflow_type = None + self.meta_file = meta_file + return + if properties_path is not None: + properties_path = Path(properties_path) + if not properties_path.is_file(): + raise ValueError(f"Property file {properties_path} does not exist.") + with open(properties_path) as json_file: + self.properties = json.load(json_file) + self.workflow_type = None + self.meta_file = meta_file return - if workflow_type.lower() in self.supported_train_type: + if workflow_type.lower() in self.supported_train_type: # type: ignore[union-attr] self.properties = {**TrainProperties, **MetaProperties} self.workflow_type = "train" - elif workflow_type.lower() in self.supported_infer_type: + elif workflow_type.lower() in self.supported_infer_type: # type: ignore[union-attr] self.properties = {**InferProperties, **MetaProperties} self.workflow_type = "infer" else: raise ValueError(f"Unsupported workflow type: '{workflow_type}'.") + self.meta_file = meta_file + @abstractmethod def initialize(self, *args: Any, **kwargs: Any) -> Any: """ @@ -142,6 +189,13 @@ def get_workflow_type(self): """ return self.workflow_type + def get_meta_file(self): + """ + Get the meta file. + + """ + return self.meta_file + def add_property(self, name: str, required: str, desc: str | None = None) -> None: """ Besides the default predefined properties, some 3rd party applications may need the bundle @@ -185,6 +239,7 @@ class ConfigWorkflow(BundleWorkflow): logging_file: config file for `logging` module in the program. for more details: https://docs.python.org/3/library/logging.config.html#logging.config.fileConfig. If None, default to "configs/logging.conf", which is commonly used for bundles in MONAI model zoo. + If False, the logging logic for the bundle will not be modified. init_id: ID name of the expected config expression to initialize before running, default to "initialize". allow a config to have no `initialize` logic and the ID. run_id: ID name of the expected config expression to run, default to "run". @@ -206,6 +261,7 @@ class ConfigWorkflow(BundleWorkflow): or "infer", "inference", "eval", "evaluation" for a inference workflow, other unsupported string will raise a ValueError. default to `None` for common workflow. + properties_path: the path to the JSON file of properties. override: id-value pairs to override or add the corresponding config content. e.g. ``--net#input_chns 42``, ``--net %/data/other.json#net_arg`` @@ -223,53 +279,51 @@ def __init__( self, config_file: str | Sequence[str], meta_file: str | Sequence[str] | None = None, - logging_file: str | None = None, + logging_file: str | bool | None = None, init_id: str = "initialize", run_id: str = "run", final_id: str = "finalize", tracking: str | dict | None = None, workflow_type: str | None = None, workflow: str | None = None, + properties_path: PathLike | None = None, **override: Any, ) -> None: workflow_type = workflow if workflow is not None else workflow_type - super().__init__(workflow_type=workflow_type) if config_file is not None: _config_files = ensure_tuple(config_file) - self.config_root_path = Path(_config_files[0]).parent + config_root_path = Path(_config_files[0]).parent for _config_file in _config_files: _config_file = Path(_config_file) - if _config_file.parent != self.config_root_path: + if _config_file.parent != config_root_path: logger.warn( - f"Not all config files are in {self.config_root_path}. If logging_file and meta_file are" - f"not specified, {self.config_root_path} will be used as the default config root directory." + f"Not all config files are in {config_root_path}. If logging_file and meta_file are" + f"not specified, {config_root_path} will be used as the default config root directory." ) if not _config_file.is_file(): raise FileNotFoundError(f"Cannot find the config file: {_config_file}.") else: - self.config_root_path = Path("configs") - + config_root_path = Path("configs") + meta_file = str(config_root_path / "metadata.json") if meta_file is None else meta_file + super().__init__(workflow_type=workflow_type, meta_file=meta_file, properties_path=properties_path) + self.config_root_path = config_root_path logging_file = str(self.config_root_path / "logging.conf") if logging_file is None else logging_file - if logging_file is not None: - if not os.path.exists(logging_file): + if logging_file is False: + logger.warn(f"Logging file is set to {logging_file}, skipping logging.") + else: + if not os.path.isfile(logging_file): if logging_file == str(self.config_root_path / "logging.conf"): logger.warn(f"Default logging file in {logging_file} does not exist, skipping logging.") else: raise FileNotFoundError(f"Cannot find the logging config file: {logging_file}.") else: logger.info(f"Setting logging properties based on config: {logging_file}.") - fileConfig(logging_file, disable_existing_loggers=False) + fileConfig(str(logging_file), disable_existing_loggers=False) self.parser = ConfigParser() self.parser.read_config(f=config_file) - meta_file = str(self.config_root_path / "metadata.json") if meta_file is None else meta_file - if isinstance(meta_file, str) and not os.path.exists(meta_file): - logger.error( - f"Cannot find the metadata config file: {meta_file}. " - "Please see: https://docs.monai.io/en/stable/mb_specification.html" - ) - else: - self.parser.read_meta(f=meta_file) + if self.meta_file is not None: + self.parser.read_meta(f=self.meta_file) # the rest key-values in the _args are to override config content self.parser.update(pairs=override) @@ -455,13 +509,19 @@ def patch_bundle_tracking(parser: ConfigParser, settings: dict) -> None: parser[k] = v # save the executed config into file default_name = f"config_{time.strftime('%Y%m%d_%H%M%S')}.json" - filepath = parser.get("execute_config", None) - if filepath is None: - if "output_dir" not in parser: - # if no "output_dir" in the bundle config, default to "/eval" - parser["output_dir"] = f"{EXPR_KEY}{ID_REF_KEY}bundle_root + '/eval'" - # experiment management tools can refer to this config item to track the config info - parser["execute_config"] = parser["output_dir"] + f" + '/{default_name}'" - filepath = os.path.join(parser.get_parsed_content("output_dir"), default_name) - Path(filepath).parent.mkdir(parents=True, exist_ok=True) - parser.export_config_file(parser.get(), filepath) + # Users can set the `save_execute_config` to `False`, `/path/to/artifacts` or `True`. + # If set to False, nothing will be recorded. If set to True, the default path will be logged. + # If set to a file path, the given path will be logged. + filepath = parser.get("save_execute_config", True) + if filepath: + if isinstance(filepath, bool): + if "output_dir" not in parser: + # if no "output_dir" in the bundle config, default to "/eval" + parser["output_dir"] = f"{EXPR_KEY}{ID_REF_KEY}bundle_root + '/eval'" + # experiment management tools can refer to this config item to track the config info + parser["save_execute_config"] = parser["output_dir"] + f" + '/{default_name}'" + filepath = os.path.join(parser.get_parsed_content("output_dir"), default_name) + Path(filepath).parent.mkdir(parents=True, exist_ok=True) + parser.export_config_file(parser.get(), filepath) + else: + parser["save_execute_config"] = None diff --git a/monai/data/dataset.py b/monai/data/dataset.py index 531893d768..871b523289 100644 --- a/monai/data/dataset.py +++ b/monai/data/dataset.py @@ -36,15 +36,7 @@ from monai.data.meta_tensor import MetaTensor from monai.data.utils import SUPPORTED_PICKLE_MOD, convert_tables_to_dicts, pickle_hashing -from monai.transforms import ( - Compose, - Randomizable, - RandomizableTrait, - Transform, - apply_transform, - convert_to_contiguous, - reset_ops_id, -) +from monai.transforms import Compose, Randomizable, RandomizableTrait, Transform, convert_to_contiguous, reset_ops_id from monai.utils import MAX_SEED, convert_to_tensor, get_seed, look_up_option, min_version, optional_import from monai.utils.misc import first @@ -77,15 +69,19 @@ class Dataset(_TorchDataset): }, }, }] """ - def __init__(self, data: Sequence, transform: Callable | None = None) -> None: + def __init__(self, data: Sequence, transform: Sequence[Callable] | Callable | None = None) -> None: """ Args: data: input data to load and transform to generate dataset for model. - transform: a callable data transform on input data. - + transform: a callable, sequence of callables or None. If transform is not + a `Compose` instance, it will be wrapped in a `Compose` instance. Sequences + of callables are applied in order and if `None` is passed, the data is returned as is. """ self.data = data - self.transform: Any = transform + try: + self.transform = Compose(transform) if not isinstance(transform, Compose) else transform + except Exception as e: + raise ValueError("`transform` must be a callable or a list of callables that is Composable") from e def __len__(self) -> int: return len(self.data) @@ -95,7 +91,7 @@ def _transform(self, index: int): Fetch single data item from `self.data`. """ data_i = self.data[index] - return apply_transform(self.transform, data_i) if self.transform is not None else data_i + return self.transform(data_i) def __getitem__(self, index: int | slice | Sequence[int]): """ @@ -264,8 +260,6 @@ def __init__( using the cached content and with re-created transform instances. """ - if not isinstance(transform, Compose): - transform = Compose(transform) super().__init__(data=data, transform=transform) self.cache_dir = Path(cache_dir) if cache_dir is not None else None self.hash_func = hash_func @@ -323,9 +317,6 @@ def _pre_transform(self, item_transformed): random transform object """ - if not isinstance(self.transform, Compose): - raise ValueError("transform must be an instance of monai.transforms.Compose.") - first_random = self.transform.get_index_of_first( lambda t: isinstance(t, RandomizableTrait) or not isinstance(t, Transform) ) @@ -346,9 +337,6 @@ def _post_transform(self, item_transformed): the transformed element through the random transforms """ - if not isinstance(self.transform, Compose): - raise ValueError("transform must be an instance of monai.transforms.Compose.") - first_random = self.transform.get_index_of_first( lambda t: isinstance(t, RandomizableTrait) or not isinstance(t, Transform) ) @@ -427,7 +415,7 @@ def _transform(self, index: int): class CacheNTransDataset(PersistentDataset): """ - Extension of `PersistentDataset`, tt can also cache the result of first N transforms, no matter it's random or not. + Extension of `PersistentDataset`, it can also cache the result of first N transforms, no matter it's random or not. """ @@ -501,9 +489,6 @@ def _pre_transform(self, item_transformed): Returns: the transformed element up to the N transform object """ - if not isinstance(self.transform, Compose): - raise ValueError("transform must be an instance of monai.transforms.Compose.") - item_transformed = self.transform(item_transformed, end=self.cache_n_trans, threading=True) reset_ops_id(item_transformed) @@ -519,9 +504,6 @@ def _post_transform(self, item_transformed): Returns: the final transformed result """ - if not isinstance(self.transform, Compose): - raise ValueError("transform must be an instance of monai.transforms.Compose.") - return self.transform(item_transformed, start=self.cache_n_trans) @@ -809,8 +791,6 @@ def __init__( Not following these recommendations may lead to runtime errors or duplicated cache across processes. """ - if not isinstance(transform, Compose): - transform = Compose(transform) super().__init__(data=data, transform=transform) self.set_num = cache_num # tracking the user-provided `cache_num` option self.set_rate = cache_rate # tracking the user-provided `cache_rate` option @@ -1282,8 +1262,10 @@ def to_list(x): data = [] for dataset in self.data: data.extend(to_list(dataset[index])) + if self.transform is not None: - data = apply_transform(self.transform, data, map_items=False) # transform the list data + self.transform.map_items = False # Compose object map_items to false so transform is applied to list + data = self.transform(data) # use tuple instead of list as the default collate_fn callback of MONAI DataLoader flattens nested lists return tuple(data) @@ -1432,15 +1414,11 @@ def __len__(self): def _transform(self, index: int): data = {k: v[index] for k, v in self.arrays.items()} - - if not self.transform: - return data - - result = apply_transform(self.transform, data) + result = self.transform(data) if self.transform is not None else data if isinstance(result, dict) or (isinstance(result, list) and isinstance(result[0], dict)): return result - raise AssertionError("With a dict supplied to apply_transform, should return a dict or a list of dicts.") + raise AssertionError("With a dict supplied to Compose, should return a dict or a list of dicts.") class CSVDataset(Dataset): diff --git a/monai/data/dataset_summary.py b/monai/data/dataset_summary.py index 769ae33b46..5b9e32afca 100644 --- a/monai/data/dataset_summary.py +++ b/monai/data/dataset_summary.py @@ -84,6 +84,7 @@ def collect_meta_data(self): """ for data in self.data_loader: + meta_dict = {} if isinstance(data[self.image_key], MetaTensor): meta_dict = data[self.image_key].meta elif self.meta_key in data: diff --git a/monai/data/image_reader.py b/monai/data/image_reader.py index 2361bb63a7..f5e199e2a3 100644 --- a/monai/data/image_reader.py +++ b/monai/data/image_reader.py @@ -1331,7 +1331,7 @@ def get_data(self, img: NrrdImage | list[NrrdImage]) -> tuple[np.ndarray, dict]: header[MetaKeys.SPACE] = SpaceKeys.LPS # assuming LPS if not specified header[MetaKeys.AFFINE] = header[MetaKeys.ORIGINAL_AFFINE].copy() - header[MetaKeys.SPATIAL_SHAPE] = header["sizes"] + header[MetaKeys.SPATIAL_SHAPE] = header["sizes"].copy() [header.pop(k) for k in ("sizes", "space origin", "space directions")] # rm duplicated data in header if self.channel_dim is None: # default to "no_channel" or -1 diff --git a/monai/data/meta_tensor.py b/monai/data/meta_tensor.py index b845c6cd8f..b79ac3c14d 100644 --- a/monai/data/meta_tensor.py +++ b/monai/data/meta_tensor.py @@ -519,7 +519,7 @@ def peek_pending_rank(self): a = self.pending_operations[-1].get(LazyAttr.AFFINE, None) if self.pending_operations else self.affine return 1 if a is None else int(max(1, len(a) - 1)) - def new_empty(self, size, dtype=None, device=None, requires_grad=False): + def new_empty(self, size, dtype=None, device=None, requires_grad=False): # type: ignore[override] """ must be defined for deepcopy to work @@ -594,7 +594,7 @@ def ensure_torch_and_prune_meta( img.affine = MetaTensor.get_default_affine() return img - def __repr__(self): + def __repr__(self): # type: ignore[override] """ Prints a representation of the tensor. Prepends "meta" to ``torch.Tensor.__repr__``. diff --git a/monai/data/torchscript_utils.py b/monai/data/torchscript_utils.py index cabf06ce89..507cf411d6 100644 --- a/monai/data/torchscript_utils.py +++ b/monai/data/torchscript_utils.py @@ -116,7 +116,7 @@ def load_net_with_metadata( Returns: Triple containing loaded object, metadata dict, and extra files dict containing other file data if present """ - extra_files = {f: "" for f in more_extra_files} + extra_files = dict.fromkeys(more_extra_files, "") extra_files[METADATA_FILENAME] = "" jit_obj = torch.jit.load(filename_prefix_or_stream, map_location, extra_files) diff --git a/monai/data/ultrasound_confidence_map.py b/monai/data/ultrasound_confidence_map.py index 03813e7559..865e4a0a0f 100644 --- a/monai/data/ultrasound_confidence_map.py +++ b/monai/data/ultrasound_confidence_map.py @@ -19,9 +19,11 @@ __all__ = ["UltrasoundConfidenceMap"] cv2, _ = optional_import("cv2") -csc_matrix, _ = optional_import("scipy.sparse", "1.7.1", min_version, "csc_matrix") -spsolve, _ = optional_import("scipy.sparse.linalg", "1.7.1", min_version, "spsolve") -hilbert, _ = optional_import("scipy.signal", "1.7.1", min_version, "hilbert") +csc_matrix, _ = optional_import("scipy.sparse", "1.12.0", min_version, "csc_matrix") +spsolve, _ = optional_import("scipy.sparse.linalg", "1.12.0", min_version, "spsolve") +cg, _ = optional_import("scipy.sparse.linalg", "1.12.0", min_version, "cg") +hilbert, _ = optional_import("scipy.signal", "1.12.0", min_version, "hilbert") +ruge_stuben_solver, _ = optional_import("pyamg", "5.0.0", min_version, "ruge_stuben_solver") class UltrasoundConfidenceMap: @@ -30,6 +32,9 @@ class UltrasoundConfidenceMap: It generates a confidence map by setting source and sink points in the image and computing the probability for random walks to reach the source for each pixel. + The official code is available at: + https://campar.in.tum.de/Main/AthanasiosKaramalisCode + Args: alpha (float, optional): Alpha parameter. Defaults to 2.0. beta (float, optional): Beta parameter. Defaults to 90.0. @@ -37,15 +42,33 @@ class UltrasoundConfidenceMap: mode (str, optional): 'RF' or 'B' mode data. Defaults to 'B'. sink_mode (str, optional): Sink mode. Defaults to 'all'. If 'mask' is selected, a mask must be when calling the transform. Can be 'all', 'mid', 'min', or 'mask'. + use_cg (bool, optional): Use Conjugate Gradient method for solving the linear system. Defaults to False. + cg_tol (float, optional): Tolerance for the Conjugate Gradient method. Defaults to 1e-6. + Will be used only if `use_cg` is True. + cg_maxiter (int, optional): Maximum number of iterations for the Conjugate Gradient method. Defaults to 200. + Will be used only if `use_cg` is True. """ - def __init__(self, alpha: float = 2.0, beta: float = 90.0, gamma: float = 0.05, mode="B", sink_mode="all"): + def __init__( + self, + alpha: float = 2.0, + beta: float = 90.0, + gamma: float = 0.05, + mode="B", + sink_mode="all", + use_cg=False, + cg_tol=1e-6, + cg_maxiter=200, + ): # The hyperparameters for confidence map estimation self.alpha = alpha self.beta = beta self.gamma = gamma self.mode = mode self.sink_mode = sink_mode + self.use_cg = use_cg + self.cg_tol = cg_tol + self.cg_maxiter = cg_maxiter # The precision to use for all computations self.eps = np.finfo("float64").eps @@ -228,17 +251,18 @@ def confidence_laplacian(self, padded_index: NDArray, padded_image: NDArray, bet s = self.normalize(s) # Horizontal penalty - s[:vertical_end] += gamma - # s[vertical_end:diagonal_end] += gamma * np.sqrt(2) # --> In the paper it is sqrt(2) - # since the diagonal edges are longer yet does not exist in the original code + s[vertical_end:] += gamma + # Here there is a difference between the official MATLAB code and the paper + # on the edge penalty. We directly implement what the official code does. # Normalize differences s = self.normalize(s) # Gaussian weighting function s = -( - (np.exp(-beta * s, dtype="float64")) + 1.0e-6 - ) # --> This epsilon changes results drastically default: 1.e-6 + (np.exp(-beta * s, dtype="float64")) + 1e-5 + ) # --> This epsilon changes results drastically default: 10e-6 + # Please notice that it is not 1e-6, it is 10e-6 which is actually different. # Create Laplacian, diagonal missing lap = csc_matrix((s, (i, j))) @@ -256,7 +280,14 @@ def confidence_laplacian(self, padded_index: NDArray, padded_image: NDArray, bet return lap def _solve_linear_system(self, lap, rhs): - x = spsolve(lap, rhs) + + if self.use_cg: + lap_sparse = lap.tocsr() + ml = ruge_stuben_solver(lap_sparse, coarse_solver="pinv") + m = ml.aspreconditioner(cycle="V") + x, _ = cg(lap, rhs, rtol=self.cg_tol, maxiter=self.cg_maxiter, M=m) + else: + x = spsolve(lap, rhs) return x diff --git a/monai/data/utils.py b/monai/data/utils.py index 585f02ec9e..7a08300abb 100644 --- a/monai/data/utils.py +++ b/monai/data/utils.py @@ -53,10 +53,6 @@ pytorch_after, ) -if pytorch_after(1, 13): - # import private code for reuse purposes, comment in case things break in the future - from torch.utils.data._utils.collate import collate_tensor_fn, default_collate_fn_map - pd, _ = optional_import("pandas") DataFrame, _ = optional_import("pandas", name="DataFrame") nib, _ = optional_import("nibabel") @@ -454,8 +450,13 @@ def collate_meta_tensor_fn(batch, *, collate_fn_map=None): Collate a sequence of meta tensor into a single batched metatensor. This is called by `collage_meta_tensor` and so should not be used as a collate function directly in dataloaders. """ - collate_fn = collate_tensor_fn if pytorch_after(1, 13) else default_collate - collated = collate_fn(batch) # type: ignore + if pytorch_after(1, 13): + from torch.utils.data._utils.collate import collate_tensor_fn # imported here for pylint/mypy issues + + collated = collate_tensor_fn(batch) + else: + collated = default_collate(batch) + meta_dicts = [i.meta or TraceKeys.NONE for i in batch] common_ = set.intersection(*[set(d.keys()) for d in meta_dicts if isinstance(d, dict)]) if common_: @@ -496,6 +497,8 @@ def list_data_collate(batch: Sequence): if pytorch_after(1, 13): # needs to go here to avoid circular import + from torch.utils.data._utils.collate import default_collate_fn_map + from monai.data.meta_tensor import MetaTensor default_collate_fn_map.update({MetaTensor: collate_meta_tensor_fn}) diff --git a/monai/data/video_dataset.py b/monai/data/video_dataset.py index be3bcf5bd5..031e85db26 100644 --- a/monai/data/video_dataset.py +++ b/monai/data/video_dataset.py @@ -173,15 +173,15 @@ def get_available_codecs() -> dict[str, str]: all_codecs = {"mp4v": ".mp4", "X264": ".avi", "H264": ".mp4", "MP42": ".mp4", "MJPG": ".mjpeg", "DIVX": ".avi"} codecs = {} with SuppressStderr(): - writer = cv2.VideoWriter() with tempfile.TemporaryDirectory() as tmp_dir: for codec, ext in all_codecs.items(): + writer = cv2.VideoWriter() fname = os.path.join(tmp_dir, f"test{ext}") fourcc = cv2.VideoWriter_fourcc(*codec) noviderr = writer.open(fname, fourcc, 1, (10, 10)) if noviderr: codecs[codec] = ext - writer.release() + writer.release() return codecs def get_num_frames(self) -> int: diff --git a/monai/data/wsi_reader.py b/monai/data/wsi_reader.py index b31d4d9c3a..2a4fe9f7a8 100644 --- a/monai/data/wsi_reader.py +++ b/monai/data/wsi_reader.py @@ -1097,8 +1097,8 @@ def get_mpp(self, wsi, level: int) -> tuple[float, float]: ): unit = wsi.pages[level].tags.get("ResolutionUnit") if unit is not None: - unit = str(unit.value)[8:] - else: + unit = str(unit.value.name) + if unit is None or len(unit) == 0: warnings.warn("The resolution unit is missing. `micrometer` will be used as default.") unit = "micrometer" diff --git a/monai/engines/__init__.py b/monai/engines/__init__.py index d8dc51f620..93cc40e292 100644 --- a/monai/engines/__init__.py +++ b/monai/engines/__init__.py @@ -12,12 +12,14 @@ from __future__ import annotations from .evaluator import EnsembleEvaluator, Evaluator, SupervisedEvaluator -from .trainer import GanTrainer, SupervisedTrainer, Trainer +from .trainer import AdversarialTrainer, GanTrainer, SupervisedTrainer, Trainer from .utils import ( + DiffusionPrepareBatch, IterationEvents, PrepareBatch, PrepareBatchDefault, PrepareBatchExtraInput, + VPredictionPrepareBatch, default_make_latent, default_metric_cmp_fn, default_prepare_batch, diff --git a/monai/engines/trainer.py b/monai/engines/trainer.py index f1513ea73b..c1364fe015 100644 --- a/monai/engines/trainer.py +++ b/monai/engines/trainer.py @@ -24,7 +24,7 @@ from monai.engines.workflow import Workflow from monai.inferers import Inferer, SimpleInferer from monai.transforms import Transform -from monai.utils import GanKeys, min_version, optional_import +from monai.utils import AdversarialIterationEvents, AdversarialKeys, GanKeys, min_version, optional_import from monai.utils.enums import CommonKeys as Keys from monai.utils.enums import EngineStatsKeys as ESKeys from monai.utils.module import pytorch_after @@ -37,7 +37,7 @@ Metric, _ = optional_import("ignite.metrics", IgniteInfo.OPT_IMPORT_VERSION, min_version, "Metric") EventEnum, _ = optional_import("ignite.engine", IgniteInfo.OPT_IMPORT_VERSION, min_version, "EventEnum") -__all__ = ["Trainer", "SupervisedTrainer", "GanTrainer"] +__all__ = ["Trainer", "SupervisedTrainer", "GanTrainer", "AdversarialTrainer"] class Trainer(Workflow): @@ -471,3 +471,282 @@ def _iteration( GanKeys.GLOSS: g_loss.item(), GanKeys.DLOSS: d_total_loss.item(), } + + +class AdversarialTrainer(Trainer): + """ + Standard supervised training workflow for adversarial loss enabled neural networks. + + Args: + device: an object representing the device on which to run. + max_epochs: the total epoch number for engine to run. + train_data_loader: Core ignite engines uses `DataLoader` for training loop batchdata. + g_network: ''generator'' (G) network architecture. + g_optimizer: G optimizer function. + g_loss_function: G loss function for adversarial training. + recon_loss_function: G loss function for reconstructions. + d_network: discriminator (D) network architecture. + d_optimizer: D optimizer function. + d_loss_function: D loss function for adversarial training.. + epoch_length: number of iterations for one epoch, default to `len(train_data_loader)`. + non_blocking: if True and this copy is between CPU and GPU, the copy may occur asynchronously with respect to + the host. For other cases, this argument has no effect. + prepare_batch: function to parse image and label for current iteration. + iteration_update: the callable function for every iteration, expect to accept `engine` and `batchdata` as input + parameters. if not provided, use `self._iteration()` instead. + g_inferer: inference method to execute G model forward. Defaults to ``SimpleInferer()``. + d_inferer: inference method to execute D model forward. Defaults to ``SimpleInferer()``. + postprocessing: execute additional transformation for the model output data. Typically, several Tensor based + transforms composed by `Compose`. Defaults to None + key_train_metric: compute metric when every iteration completed, and save average value to engine.state.metrics + when epoch completed. key_train_metric is the main metric to compare and save the checkpoint into files. + additional_metrics: more Ignite metrics that also attach to Ignite Engine. + metric_cmp_fn: function to compare current key metric with previous best key metric value, it must accept 2 args + (current_metric, previous_best) and return a bool result: if `True`, will update 'best_metric` and + `best_metric_epoch` with current metric and epoch, default to `greater than`. + train_handlers: every handler is a set of Ignite Event-Handlers, must have `attach` function, like: + CheckpointHandler, StatsHandler, etc. + amp: whether to enable auto-mixed-precision training, default is False. + event_names: additional custom ignite events that will register to the engine. + new events can be a list of str or `ignite.engine.events.EventEnum`. + event_to_attr: a dictionary to map an event to a state attribute, then add to `engine.state`. + for more details, check: https://pytorch.org/ignite/generated/ignite.engine.engine.Engine.html + #ignite.engine.engine.Engine.register_events. + decollate: whether to decollate the batch-first data to a list of data after model computation, recommend + `decollate=True` when `postprocessing` uses components from `monai.transforms`. default to `True`. + optim_set_to_none: when calling `optimizer.zero_grad()`, instead of setting to zero, set the grads to None. + more details: https://pytorch.org/docs/stable/generated/torch.optim.Optimizer.zero_grad.html. + to_kwargs: dict of other args for `prepare_batch` API when converting the input data, except for + `device`, `non_blocking`. + amp_kwargs: dict of the args for `torch.cuda.amp.autocast()` API, for more details: + https://pytorch.org/docs/stable/amp.html#torch.cuda.amp.autocast. + """ + + def __init__( + self, + device: torch.device | str, + max_epochs: int, + train_data_loader: Iterable | DataLoader, + g_network: torch.nn.Module, + g_optimizer: Optimizer, + g_loss_function: Callable, + recon_loss_function: Callable, + d_network: torch.nn.Module, + d_optimizer: Optimizer, + d_loss_function: Callable, + epoch_length: int | None = None, + non_blocking: bool = False, + prepare_batch: Callable = default_prepare_batch, + iteration_update: Callable | None = None, + g_inferer: Inferer | None = None, + d_inferer: Inferer | None = None, + postprocessing: Transform | None = None, + key_train_metric: dict[str, Metric] | None = None, + additional_metrics: dict[str, Metric] | None = None, + metric_cmp_fn: Callable = default_metric_cmp_fn, + train_handlers: Sequence | None = None, + amp: bool = False, + event_names: list[str | EventEnum | type[EventEnum]] | None = None, + event_to_attr: dict | None = None, + decollate: bool = True, + optim_set_to_none: bool = False, + to_kwargs: dict | None = None, + amp_kwargs: dict | None = None, + ): + super().__init__( + device=device, + max_epochs=max_epochs, + data_loader=train_data_loader, + epoch_length=epoch_length, + non_blocking=non_blocking, + prepare_batch=prepare_batch, + iteration_update=iteration_update, + postprocessing=postprocessing, + key_metric=key_train_metric, + additional_metrics=additional_metrics, + metric_cmp_fn=metric_cmp_fn, + handlers=train_handlers, + amp=amp, + event_names=event_names, + event_to_attr=event_to_attr, + decollate=decollate, + to_kwargs=to_kwargs, + amp_kwargs=amp_kwargs, + ) + + self.register_events(*AdversarialIterationEvents) + + self.state.g_network = g_network + self.state.g_optimizer = g_optimizer + self.state.g_loss_function = g_loss_function + self.state.recon_loss_function = recon_loss_function + + self.state.d_network = d_network + self.state.d_optimizer = d_optimizer + self.state.d_loss_function = d_loss_function + + self.g_inferer = SimpleInferer() if g_inferer is None else g_inferer + self.d_inferer = SimpleInferer() if d_inferer is None else d_inferer + + self.state.g_scaler = torch.cuda.amp.GradScaler() if self.amp else None + self.state.d_scaler = torch.cuda.amp.GradScaler() if self.amp else None + + self.optim_set_to_none = optim_set_to_none + self._complete_state_dict_user_keys() + + def _complete_state_dict_user_keys(self) -> None: + """ + This method appends to the _state_dict_user_keys AdversarialTrainer's elements that are required for + checkpoint saving. + + Follows the example found at: + https://pytorch.org/ignite/generated/ignite.engine.engine.Engine.html#ignite.engine.engine.Engine.state_dict + """ + self._state_dict_user_keys.extend( + ["g_network", "g_optimizer", "d_network", "d_optimizer", "g_scaler", "d_scaler"] + ) + + g_loss_state_dict = getattr(self.state.g_loss_function, "state_dict", None) + if callable(g_loss_state_dict): + self._state_dict_user_keys.append("g_loss_function") + + d_loss_state_dict = getattr(self.state.d_loss_function, "state_dict", None) + if callable(d_loss_state_dict): + self._state_dict_user_keys.append("d_loss_function") + + recon_loss_state_dict = getattr(self.state.recon_loss_function, "state_dict", None) + if callable(recon_loss_state_dict): + self._state_dict_user_keys.append("recon_loss_function") + + def _iteration( + self, engine: AdversarialTrainer, batchdata: dict[str, torch.Tensor] + ) -> dict[str, torch.Tensor | int | float | bool]: + """ + Callback function for the Adversarial Training processing logic of 1 iteration in Ignite Engine. + Return below items in a dictionary: + - IMAGE: image Tensor data for model input, already moved to device. + - LABEL: label Tensor data corresponding to the image, already moved to device. In case of Unsupervised + Learning this is equal to IMAGE. + - PRED: prediction result of model. + - LOSS: loss value computed by loss functions of the generator (reconstruction and adversarial summed up). + - AdversarialKeys.REALS: real images from the batch. Are the same as IMAGE. + - AdversarialKeys.FAKES: fake images generated by the generator. Are the same as PRED. + - AdversarialKeys.REAL_LOGITS: logits of the discriminator for the real images. + - AdversarialKeys.FAKE_LOGITS: logits of the discriminator for the fake images. + - AdversarialKeys.RECONSTRUCTION_LOSS: loss value computed by the reconstruction loss function. + - AdversarialKeys.GENERATOR_LOSS: loss value computed by the generator loss function. It is the + discriminator loss for the fake images. That is backpropagated through the generator only. + - AdversarialKeys.DISCRIMINATOR_LOSS: loss value computed by the discriminator loss function. It is the + discriminator loss for the real images and the fake images. That is backpropagated through the + discriminator only. + + Args: + engine: `AdversarialTrainer` to execute operation for an iteration. + batchdata: input data for this iteration, usually can be dictionary or tuple of Tensor data. + + Raises: + ValueError: must provide batch data for current iteration. + + """ + + if batchdata is None: + raise ValueError("Must provide batch data for current iteration.") + batch = engine.prepare_batch(batchdata, engine.state.device, engine.non_blocking, **engine.to_kwargs) + + if len(batch) == 2: + inputs, targets = batch + args: tuple = () + kwargs: dict = {} + else: + inputs, targets, args, kwargs = batch + + engine.state.output = {Keys.IMAGE: inputs, Keys.LABEL: targets, AdversarialKeys.REALS: inputs} + + def _compute_generator_loss() -> None: + engine.state.output[AdversarialKeys.FAKES] = engine.g_inferer( + inputs, engine.state.g_network, *args, **kwargs + ) + engine.state.output[Keys.PRED] = engine.state.output[AdversarialKeys.FAKES] + engine.fire_event(AdversarialIterationEvents.GENERATOR_FORWARD_COMPLETED) + + engine.state.output[AdversarialKeys.FAKE_LOGITS] = engine.d_inferer( + engine.state.output[AdversarialKeys.FAKES].float().contiguous(), engine.state.d_network, *args, **kwargs + ) + engine.fire_event(AdversarialIterationEvents.GENERATOR_DISCRIMINATOR_FORWARD_COMPLETED) + + engine.state.output[AdversarialKeys.RECONSTRUCTION_LOSS] = engine.state.recon_loss_function( + engine.state.output[AdversarialKeys.FAKES], targets + ).mean() + engine.fire_event(AdversarialIterationEvents.RECONSTRUCTION_LOSS_COMPLETED) + + engine.state.output[AdversarialKeys.GENERATOR_LOSS] = engine.state.g_loss_function( + engine.state.output[AdversarialKeys.FAKE_LOGITS] + ).mean() + engine.fire_event(AdversarialIterationEvents.GENERATOR_LOSS_COMPLETED) + + # Train Generator + engine.state.g_network.train() + engine.state.g_optimizer.zero_grad(set_to_none=engine.optim_set_to_none) + + if engine.amp and engine.state.g_scaler is not None: + with torch.cuda.amp.autocast(**engine.amp_kwargs): + _compute_generator_loss() + + engine.state.output[Keys.LOSS] = ( + engine.state.output[AdversarialKeys.RECONSTRUCTION_LOSS] + + engine.state.output[AdversarialKeys.GENERATOR_LOSS] + ) + engine.state.g_scaler.scale(engine.state.output[Keys.LOSS]).backward() + engine.fire_event(AdversarialIterationEvents.GENERATOR_BACKWARD_COMPLETED) + engine.state.g_scaler.step(engine.state.g_optimizer) + engine.state.g_scaler.update() + else: + _compute_generator_loss() + ( + engine.state.output[AdversarialKeys.RECONSTRUCTION_LOSS] + + engine.state.output[AdversarialKeys.GENERATOR_LOSS] + ).backward() + engine.fire_event(AdversarialIterationEvents.GENERATOR_BACKWARD_COMPLETED) + engine.state.g_optimizer.step() + engine.fire_event(AdversarialIterationEvents.GENERATOR_MODEL_COMPLETED) + + def _compute_discriminator_loss() -> None: + engine.state.output[AdversarialKeys.REAL_LOGITS] = engine.d_inferer( + engine.state.output[AdversarialKeys.REALS].contiguous().detach(), + engine.state.d_network, + *args, + **kwargs, + ) + engine.fire_event(AdversarialIterationEvents.DISCRIMINATOR_REALS_FORWARD_COMPLETED) + + engine.state.output[AdversarialKeys.FAKE_LOGITS] = engine.d_inferer( + engine.state.output[AdversarialKeys.FAKES].contiguous().detach(), + engine.state.d_network, + *args, + **kwargs, + ) + engine.fire_event(AdversarialIterationEvents.DISCRIMINATOR_FAKES_FORWARD_COMPLETED) + + engine.state.output[AdversarialKeys.DISCRIMINATOR_LOSS] = engine.state.d_loss_function( + engine.state.output[AdversarialKeys.REAL_LOGITS], engine.state.output[AdversarialKeys.FAKE_LOGITS] + ).mean() + engine.fire_event(AdversarialIterationEvents.DISCRIMINATOR_LOSS_COMPLETED) + + # Train Discriminator + engine.state.d_network.train() + engine.state.d_network.zero_grad(set_to_none=engine.optim_set_to_none) + + if engine.amp and engine.state.d_scaler is not None: + with torch.cuda.amp.autocast(**engine.amp_kwargs): + _compute_discriminator_loss() + + engine.state.d_scaler.scale(engine.state.output[AdversarialKeys.DISCRIMINATOR_LOSS]).backward() + engine.fire_event(AdversarialIterationEvents.DISCRIMINATOR_BACKWARD_COMPLETED) + engine.state.d_scaler.step(engine.state.d_optimizer) + engine.state.d_scaler.update() + else: + _compute_discriminator_loss() + engine.state.output[AdversarialKeys.DISCRIMINATOR_LOSS].backward() + engine.state.d_optimizer.step() + + return engine.state.output diff --git a/monai/engines/utils.py b/monai/engines/utils.py index 02c718cd14..5339d6965a 100644 --- a/monai/engines/utils.py +++ b/monai/engines/utils.py @@ -13,9 +13,10 @@ from abc import ABC, abstractmethod from collections.abc import Callable, Sequence -from typing import TYPE_CHECKING, Any, cast +from typing import TYPE_CHECKING, Any, Mapping, cast import torch +import torch.nn as nn from monai.config import IgniteInfo from monai.transforms import apply_transform @@ -36,6 +37,8 @@ "PrepareBatch", "PrepareBatchDefault", "PrepareBatchExtraInput", + "DiffusionPrepareBatch", + "VPredictionPrepareBatch", "default_make_latent", "engine_apply_transform", "default_metric_cmp_fn", @@ -238,6 +241,78 @@ def _get_data(key: str) -> torch.Tensor: return cast(torch.Tensor, image), cast(torch.Tensor, label), tuple(args_), kwargs_ +class DiffusionPrepareBatch(PrepareBatch): + """ + This class is used as a callable for the `prepare_batch` parameter of engine classes for diffusion training. + + Assuming a supervised training process, it will generate a noise field using `get_noise` for an input image, and + return the image and noise field as the image/target pair plus the noise field the kwargs under the key "noise". + This assumes the inferer being used in conjunction with this class expects a "noise" parameter to be provided. + + If the `condition_name` is provided, this must refer to a key in the input dictionary containing the condition + field to be passed to the inferer. This will appear in the keyword arguments under the key "condition". + + """ + + def __init__(self, num_train_timesteps: int, condition_name: str | None = None) -> None: + self.condition_name = condition_name + self.num_train_timesteps = num_train_timesteps + + def get_noise(self, images: torch.Tensor) -> torch.Tensor: + """Returns the noise tensor for input tensor `images`, override this for different noise distributions.""" + return torch.randn_like(images) + + def get_timesteps(self, images: torch.Tensor) -> torch.Tensor: + """Get a timestep, by default this is a random integer between 0 and `self.num_train_timesteps`.""" + return torch.randint(0, self.num_train_timesteps, (images.shape[0],), device=images.device).long() + + def get_target(self, images: torch.Tensor, noise: torch.Tensor, timesteps: torch.Tensor) -> torch.Tensor: + """Return the target for the loss function, this is the `noise` value by default.""" + return noise + + def __call__( + self, + batchdata: dict[str, torch.Tensor], + device: str | torch.device | None = None, + non_blocking: bool = False, + **kwargs: Any, + ) -> tuple[torch.Tensor, torch.Tensor, tuple, dict]: + images, _ = default_prepare_batch(batchdata, device, non_blocking, **kwargs) + noise = self.get_noise(images).to(device, non_blocking=non_blocking, **kwargs) + timesteps = self.get_timesteps(images).to(device, non_blocking=non_blocking, **kwargs) + + target = self.get_target(images, noise, timesteps).to(device, non_blocking=non_blocking, **kwargs) + infer_kwargs = {"noise": noise, "timesteps": timesteps} + + if self.condition_name is not None and isinstance(batchdata, Mapping): + infer_kwargs["condition"] = batchdata[self.condition_name].to(device, non_blocking=non_blocking, **kwargs) + + # return input, target, arguments, and keyword arguments where noise is the target and also a keyword value + return images, target, (), infer_kwargs + + +class VPredictionPrepareBatch(DiffusionPrepareBatch): + """ + This class is used as a callable for the `prepare_batch` parameter of engine classes for diffusion training. + + Assuming a supervised training process, it will generate a noise field using `get_noise` for an input image, and + from this compute the velocity using the provided scheduler. This value is used as the target in place of the + noise field itself although the noise is field is in the kwargs under the key "noise". This assumes the inferer + being used in conjunction with this class expects a "noise" parameter to be provided. + + If the `condition_name` is provided, this must refer to a key in the input dictionary containing the condition + field to be passed to the inferer. This will appear in the keyword arguments under the key "condition". + + """ + + def __init__(self, scheduler: nn.Module, num_train_timesteps: int, condition_name: str | None = None) -> None: + super().__init__(num_train_timesteps=num_train_timesteps, condition_name=condition_name) + self.scheduler = scheduler + + def get_target(self, images, noise, timesteps): + return self.scheduler.get_velocity(images, noise, timesteps) + + def default_make_latent( num_latents: int, latent_size: int, diff --git a/monai/fl/client/monai_algo.py b/monai/fl/client/monai_algo.py index 9acf131bd9..a3ac58c221 100644 --- a/monai/fl/client/monai_algo.py +++ b/monai/fl/client/monai_algo.py @@ -134,12 +134,14 @@ def initialize(self, extra=None): Args: extra: Dict with additional information that should be provided by FL system, - i.e., `ExtraItems.CLIENT_NAME` and `ExtraItems.APP_ROOT`. + i.e., `ExtraItems.CLIENT_NAME`, `ExtraItems.APP_ROOT` and `ExtraItems.LOGGING_FILE`. + You can diable the logging logic in the monai bundle by setting {ExtraItems.LOGGING_FILE} to False. """ if extra is None: extra = {} self.client_name = extra.get(ExtraItems.CLIENT_NAME, "noname") + logging_file = extra.get(ExtraItems.LOGGING_FILE, None) self.logger.info(f"Initializing {self.client_name} ...") # FL platform needs to provide filepath to configuration files @@ -149,7 +151,7 @@ def initialize(self, extra=None): if self.workflow is None: config_train_files = self._add_config_files(self.config_train_filename) self.workflow = ConfigWorkflow( - config_file=config_train_files, meta_file=None, logging_file=None, workflow_type="train" + config_file=config_train_files, meta_file=None, logging_file=logging_file, workflow_type="train" ) self.workflow.initialize() self.workflow.bundle_root = self.bundle_root @@ -412,13 +414,15 @@ def initialize(self, extra=None): Args: extra: Dict with additional information that should be provided by FL system, - i.e., `ExtraItems.CLIENT_NAME` and `ExtraItems.APP_ROOT`. + i.e., `ExtraItems.CLIENT_NAME`, `ExtraItems.APP_ROOT` and `ExtraItems.LOGGING_FILE`. + You can diable the logging logic in the monai bundle by setting {ExtraItems.LOGGING_FILE} to False. """ self._set_cuda_device() if extra is None: extra = {} self.client_name = extra.get(ExtraItems.CLIENT_NAME, "noname") + logging_file = extra.get(ExtraItems.LOGGING_FILE, None) timestamp = time.strftime("%Y%m%d_%H%M%S") self.logger.info(f"Initializing {self.client_name} ...") # FL platform needs to provide filepath to configuration files @@ -434,7 +438,7 @@ def initialize(self, extra=None): self.train_workflow = ConfigWorkflow( config_file=config_train_files, meta_file=None, - logging_file=None, + logging_file=logging_file, workflow_type="train", **self.train_kwargs, ) @@ -459,7 +463,7 @@ def initialize(self, extra=None): self.eval_workflow = ConfigWorkflow( config_file=config_eval_files, meta_file=None, - logging_file=None, + logging_file=logging_file, workflow_type=self.eval_workflow_name, **self.eval_kwargs, ) diff --git a/monai/fl/utils/constants.py b/monai/fl/utils/constants.py index eda1a6b4f9..18beceeaee 100644 --- a/monai/fl/utils/constants.py +++ b/monai/fl/utils/constants.py @@ -30,6 +30,7 @@ class ExtraItems(StrEnum): CLIENT_NAME = "fl_client_name" APP_ROOT = "fl_app_root" STATS_SENDER = "fl_stats_sender" + LOGGING_FILE = "logging_file" class FlPhase(StrEnum): diff --git a/monai/handlers/mlflow_handler.py b/monai/handlers/mlflow_handler.py index df209c1c8b..6d19579d9e 100644 --- a/monai/handlers/mlflow_handler.py +++ b/monai/handlers/mlflow_handler.py @@ -21,6 +21,7 @@ import torch from torch.utils.data import Dataset +from monai.apps.utils import get_logger from monai.config import IgniteInfo from monai.utils import CommonKeys, ensure_tuple, min_version, optional_import @@ -29,6 +30,9 @@ mlflow.entities, _ = optional_import( "mlflow.entities", descriptor="Please install mlflow.entities before using MLFlowHandler." ) +MlflowException, _ = optional_import( + "mlflow.exceptions", name="MlflowException", descriptor="Please install mlflow before using MLFlowHandler." +) pandas, _ = optional_import("pandas", descriptor="Please install pandas for recording the dataset.") tqdm, _ = optional_import("tqdm", "4.47.0", min_version, "tqdm") @@ -41,6 +45,8 @@ DEFAULT_TAG = "Loss" +logger = get_logger(module_name=__name__) + class MLFlowHandler: """ @@ -236,10 +242,21 @@ def start(self, engine: Engine) -> None: def _set_experiment(self): experiment = self.experiment if not experiment: - experiment = self.client.get_experiment_by_name(self.experiment_name) - if not experiment: - experiment_id = self.client.create_experiment(self.experiment_name) - experiment = self.client.get_experiment(experiment_id) + for _retry_time in range(3): + try: + experiment = self.client.get_experiment_by_name(self.experiment_name) + if not experiment: + experiment_id = self.client.create_experiment(self.experiment_name) + experiment = self.client.get_experiment(experiment_id) + break + except MlflowException as e: + if "RESOURCE_ALREADY_EXISTS" in str(e): + logger.warning("Experiment already exists; delaying before retrying.") + time.sleep(1) + if _retry_time == 2: + raise e + else: + raise e if experiment.lifecycle_stage != mlflow.entities.LifecycleStage.ACTIVE: raise ValueError(f"Cannot set a deleted experiment '{self.experiment_name}' as the active experiment") diff --git a/monai/inferers/__init__.py b/monai/inferers/__init__.py index 960380bfb8..fc78b9f7c4 100644 --- a/monai/inferers/__init__.py +++ b/monai/inferers/__init__.py @@ -12,13 +12,18 @@ from __future__ import annotations from .inferer import ( + ControlNetDiffusionInferer, + ControlNetLatentDiffusionInferer, + DiffusionInferer, Inferer, + LatentDiffusionInferer, PatchInferer, SaliencyInferer, SimpleInferer, SliceInferer, SlidingWindowInferer, SlidingWindowInfererAdapt, + VQVAETransformerInferer, ) from .merger import AvgMerger, Merger, ZarrAvgMerger from .splitter import SlidingWindowSplitter, Splitter, WSISlidingWindowSplitter diff --git a/monai/inferers/inferer.py b/monai/inferers/inferer.py index 0b4199938d..769b6cc0e7 100644 --- a/monai/inferers/inferer.py +++ b/monai/inferers/inferer.py @@ -11,24 +11,41 @@ from __future__ import annotations +import math import warnings from abc import ABC, abstractmethod from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence +from functools import partial from pydoc import locate from typing import Any import torch import torch.nn as nn +import torch.nn.functional as F from monai.apps.utils import get_logger +from monai.data import decollate_batch from monai.data.meta_tensor import MetaTensor from monai.data.thread_buffer import ThreadBuffer from monai.inferers.merger import AvgMerger, Merger from monai.inferers.splitter import Splitter from monai.inferers.utils import compute_importance_map, sliding_window_inference -from monai.utils import BlendMode, PatchKeys, PytorchPadMode, ensure_tuple, optional_import +from monai.networks.nets import ( + VQVAE, + AutoencoderKL, + ControlNet, + DecoderOnlyTransformer, + DiffusionModelUNet, + SPADEAutoencoderKL, + SPADEDiffusionModelUNet, +) +from monai.networks.schedulers import Scheduler +from monai.transforms import CenterSpatialCrop, SpatialPad +from monai.utils import BlendMode, Ordering, PatchKeys, PytorchPadMode, ensure_tuple, optional_import from monai.visualize import CAM, GradCAM, GradCAMpp +tqdm, has_tqdm = optional_import("tqdm", name="tqdm") + logger = get_logger(__name__) __all__ = [ @@ -752,3 +769,1264 @@ def network_wrapper( return out return tuple(out_i.unsqueeze(dim=self.spatial_dim + 2) for out_i in out) + + +class DiffusionInferer(Inferer): + """ + DiffusionInferer takes a trained diffusion model and a scheduler and can be used to perform a signal forward pass + for a training iteration, and sample from the model. + + Args: + scheduler: diffusion scheduler. + """ + + def __init__(self, scheduler: Scheduler) -> None: # type: ignore[override] + super().__init__() + + self.scheduler = scheduler + + def __call__( # type: ignore[override] + self, + inputs: torch.Tensor, + diffusion_model: DiffusionModelUNet, + noise: torch.Tensor, + timesteps: torch.Tensor, + condition: torch.Tensor | None = None, + mode: str = "crossattn", + seg: torch.Tensor | None = None, + ) -> torch.Tensor: + """ + Implements the forward pass for a supervised training iteration. + + Args: + inputs: Input image to which noise is added. + diffusion_model: diffusion model. + noise: random noise, of the same shape as the input. + timesteps: random timesteps. + condition: Conditioning for network input. + mode: Conditioning mode for the network. + seg: if model is instance of SPADEDiffusionModelUnet, segmentation must be + provided on the forward (for SPADE-like AE or SPADE-like DM) + """ + if mode not in ["crossattn", "concat"]: + raise NotImplementedError(f"{mode} condition is not supported") + + noisy_image: torch.Tensor = self.scheduler.add_noise(original_samples=inputs, noise=noise, timesteps=timesteps) + if mode == "concat": + if condition is None: + raise ValueError("Conditioning is required for concat condition") + else: + noisy_image = torch.cat([noisy_image, condition], dim=1) + condition = None + diffusion_model = ( + partial(diffusion_model, seg=seg) + if isinstance(diffusion_model, SPADEDiffusionModelUNet) + else diffusion_model + ) + prediction: torch.Tensor = diffusion_model(x=noisy_image, timesteps=timesteps, context=condition) + + return prediction + + @torch.no_grad() + def sample( + self, + input_noise: torch.Tensor, + diffusion_model: DiffusionModelUNet, + scheduler: Scheduler | None = None, + save_intermediates: bool | None = False, + intermediate_steps: int | None = 100, + conditioning: torch.Tensor | None = None, + mode: str = "crossattn", + verbose: bool = True, + seg: torch.Tensor | None = None, + ) -> torch.Tensor | tuple[torch.Tensor, list[torch.Tensor]]: + """ + Args: + input_noise: random noise, of the same shape as the desired sample. + diffusion_model: model to sample from. + scheduler: diffusion scheduler. If none provided will use the class attribute scheduler + save_intermediates: whether to return intermediates along the sampling change + intermediate_steps: if save_intermediates is True, saves every n steps + conditioning: Conditioning for network input. + mode: Conditioning mode for the network. + verbose: if true, prints the progression bar of the sampling process. + seg: if diffusion model is instance of SPADEDiffusionModel, segmentation must be provided. + """ + if mode not in ["crossattn", "concat"]: + raise NotImplementedError(f"{mode} condition is not supported") + if mode == "concat" and conditioning is None: + raise ValueError("Conditioning must be supplied for if condition mode is concat.") + if not scheduler: + scheduler = self.scheduler + image = input_noise + if verbose and has_tqdm: + progress_bar = tqdm(scheduler.timesteps) + else: + progress_bar = iter(scheduler.timesteps) + intermediates = [] + for t in progress_bar: + # 1. predict noise model_output + diffusion_model = ( + partial(diffusion_model, seg=seg) + if isinstance(diffusion_model, SPADEDiffusionModelUNet) + else diffusion_model + ) + if mode == "concat" and conditioning is not None: + model_input = torch.cat([image, conditioning], dim=1) + model_output = diffusion_model( + model_input, timesteps=torch.Tensor((t,)).to(input_noise.device), context=None + ) + else: + model_output = diffusion_model( + image, timesteps=torch.Tensor((t,)).to(input_noise.device), context=conditioning + ) + + # 2. compute previous image: x_t -> x_t-1 + image, _ = scheduler.step(model_output, t, image) + if save_intermediates and t % intermediate_steps == 0: + intermediates.append(image) + if save_intermediates: + return image, intermediates + else: + return image + + @torch.no_grad() + def get_likelihood( + self, + inputs: torch.Tensor, + diffusion_model: DiffusionModelUNet, + scheduler: Scheduler | None = None, + save_intermediates: bool | None = False, + conditioning: torch.Tensor | None = None, + mode: str = "crossattn", + original_input_range: tuple = (0, 255), + scaled_input_range: tuple = (0, 1), + verbose: bool = True, + seg: torch.Tensor | None = None, + ) -> torch.Tensor | tuple[torch.Tensor, list[torch.Tensor]]: + """ + Computes the log-likelihoods for an input. + + Args: + inputs: input images, NxCxHxW[xD] + diffusion_model: model to compute likelihood from + scheduler: diffusion scheduler. If none provided will use the class attribute scheduler. + save_intermediates: save the intermediate spatial KL maps + conditioning: Conditioning for network input. + mode: Conditioning mode for the network. + original_input_range: the [min,max] intensity range of the input data before any scaling was applied. + scaled_input_range: the [min,max] intensity range of the input data after scaling. + verbose: if true, prints the progression bar of the sampling process. + seg: if diffusion model is instance of SPADEDiffusionModel, segmentation must be provided. + """ + + if not scheduler: + scheduler = self.scheduler + if scheduler._get_name() != "DDPMScheduler": + raise NotImplementedError( + f"Likelihood computation is only compatible with DDPMScheduler," + f" you are using {scheduler._get_name()}" + ) + if mode not in ["crossattn", "concat"]: + raise NotImplementedError(f"{mode} condition is not supported") + if mode == "concat" and conditioning is None: + raise ValueError("Conditioning must be supplied for if condition mode is concat.") + if verbose and has_tqdm: + progress_bar = tqdm(scheduler.timesteps) + else: + progress_bar = iter(scheduler.timesteps) + intermediates = [] + noise = torch.randn_like(inputs).to(inputs.device) + total_kl = torch.zeros(inputs.shape[0]).to(inputs.device) + for t in progress_bar: + timesteps = torch.full(inputs.shape[:1], t, device=inputs.device).long() + noisy_image = self.scheduler.add_noise(original_samples=inputs, noise=noise, timesteps=timesteps) + diffusion_model = ( + partial(diffusion_model, seg=seg) + if isinstance(diffusion_model, SPADEDiffusionModelUNet) + else diffusion_model + ) + if mode == "concat" and conditioning is not None: + noisy_image = torch.cat([noisy_image, conditioning], dim=1) + model_output = diffusion_model(noisy_image, timesteps=timesteps, context=None) + else: + model_output = diffusion_model(x=noisy_image, timesteps=timesteps, context=conditioning) + + # get the model's predicted mean, and variance if it is predicted + if model_output.shape[1] == inputs.shape[1] * 2 and scheduler.variance_type in ["learned", "learned_range"]: + model_output, predicted_variance = torch.split(model_output, inputs.shape[1], dim=1) + else: + predicted_variance = None + + # 1. compute alphas, betas + alpha_prod_t = scheduler.alphas_cumprod[t] + alpha_prod_t_prev = scheduler.alphas_cumprod[t - 1] if t > 0 else scheduler.one + beta_prod_t = 1 - alpha_prod_t + beta_prod_t_prev = 1 - alpha_prod_t_prev + + # 2. compute predicted original sample from predicted noise also called + # "predicted x_0" of formula (15) from https://arxiv.org/pdf/2006.11239.pdf + if scheduler.prediction_type == "epsilon": + pred_original_sample = (noisy_image - beta_prod_t ** (0.5) * model_output) / alpha_prod_t ** (0.5) + elif scheduler.prediction_type == "sample": + pred_original_sample = model_output + elif scheduler.prediction_type == "v_prediction": + pred_original_sample = (alpha_prod_t**0.5) * noisy_image - (beta_prod_t**0.5) * model_output + # 3. Clip "predicted x_0" + if scheduler.clip_sample: + pred_original_sample = torch.clamp(pred_original_sample, -1, 1) + + # 4. Compute coefficients for pred_original_sample x_0 and current sample x_t + # See formula (7) from https://arxiv.org/pdf/2006.11239.pdf + pred_original_sample_coeff = (alpha_prod_t_prev ** (0.5) * scheduler.betas[t]) / beta_prod_t + current_sample_coeff = scheduler.alphas[t] ** (0.5) * beta_prod_t_prev / beta_prod_t + + # 5. Compute predicted previous sample µ_t + # See formula (7) from https://arxiv.org/pdf/2006.11239.pdf + predicted_mean = pred_original_sample_coeff * pred_original_sample + current_sample_coeff * noisy_image + + # get the posterior mean and variance + posterior_mean = scheduler._get_mean(timestep=t, x_0=inputs, x_t=noisy_image) + posterior_variance = scheduler._get_variance(timestep=t, predicted_variance=predicted_variance) + + log_posterior_variance = torch.log(posterior_variance) + log_predicted_variance = torch.log(predicted_variance) if predicted_variance else log_posterior_variance + + if t == 0: + # compute -log p(x_0|x_1) + kl = -self._get_decoder_log_likelihood( + inputs=inputs, + means=predicted_mean, + log_scales=0.5 * log_predicted_variance, + original_input_range=original_input_range, + scaled_input_range=scaled_input_range, + ) + else: + # compute kl between two normals + kl = 0.5 * ( + -1.0 + + log_predicted_variance + - log_posterior_variance + + torch.exp(log_posterior_variance - log_predicted_variance) + + ((posterior_mean - predicted_mean) ** 2) * torch.exp(-log_predicted_variance) + ) + total_kl += kl.view(kl.shape[0], -1).mean(dim=1) + if save_intermediates: + intermediates.append(kl.cpu()) + + if save_intermediates: + return total_kl, intermediates + else: + return total_kl + + def _approx_standard_normal_cdf(self, x): + """ + A fast approximation of the cumulative distribution function of the + standard normal. Code adapted from https://github.com/openai/improved-diffusion. + """ + + return 0.5 * ( + 1.0 + torch.tanh(torch.sqrt(torch.Tensor([2.0 / math.pi]).to(x.device)) * (x + 0.044715 * torch.pow(x, 3))) + ) + + def _get_decoder_log_likelihood( + self, + inputs: torch.Tensor, + means: torch.Tensor, + log_scales: torch.Tensor, + original_input_range: tuple = (0, 255), + scaled_input_range: tuple = (0, 1), + ) -> torch.Tensor: + """ + Compute the log-likelihood of a Gaussian distribution discretizing to a + given image. Code adapted from https://github.com/openai/improved-diffusion. + + Args: + input: the target images. It is assumed that this was uint8 values, + rescaled to the range [-1, 1]. + means: the Gaussian mean Tensor. + log_scales: the Gaussian log stddev Tensor. + original_input_range: the [min,max] intensity range of the input data before any scaling was applied. + scaled_input_range: the [min,max] intensity range of the input data after scaling. + """ + if inputs.shape != means.shape: + raise ValueError(f"Inputs and means must have the same shape, got {inputs.shape} and {means.shape}") + bin_width = (scaled_input_range[1] - scaled_input_range[0]) / ( + original_input_range[1] - original_input_range[0] + ) + centered_x = inputs - means + inv_stdv = torch.exp(-log_scales) + plus_in = inv_stdv * (centered_x + bin_width / 2) + cdf_plus = self._approx_standard_normal_cdf(plus_in) + min_in = inv_stdv * (centered_x - bin_width / 2) + cdf_min = self._approx_standard_normal_cdf(min_in) + log_cdf_plus = torch.log(cdf_plus.clamp(min=1e-12)) + log_one_minus_cdf_min = torch.log((1.0 - cdf_min).clamp(min=1e-12)) + cdf_delta = cdf_plus - cdf_min + log_probs = torch.where( + inputs < -0.999, + log_cdf_plus, + torch.where(inputs > 0.999, log_one_minus_cdf_min, torch.log(cdf_delta.clamp(min=1e-12))), + ) + return log_probs + + +class LatentDiffusionInferer(DiffusionInferer): + """ + LatentDiffusionInferer takes a stage 1 model (VQVAE or AutoencoderKL), diffusion model, and a scheduler, and can + be used to perform a signal forward pass for a training iteration, and sample from the model. + + Args: + scheduler: a scheduler to be used in combination with `unet` to denoise the encoded image latents. + scale_factor: scale factor to multiply the values of the latent representation before processing it by the + second stage. + ldm_latent_shape: desired spatial latent space shape. Used if there is a difference in the autoencoder model's latent shape. + autoencoder_latent_shape: autoencoder_latent_shape: autoencoder spatial latent space shape. Used if there is a + difference between the autoencoder's latent shape and the DM shape. + """ + + def __init__( + self, + scheduler: Scheduler, + scale_factor: float = 1.0, + ldm_latent_shape: list | None = None, + autoencoder_latent_shape: list | None = None, + ) -> None: + super().__init__(scheduler=scheduler) + self.scale_factor = scale_factor + if (ldm_latent_shape is None) ^ (autoencoder_latent_shape is None): + raise ValueError("If ldm_latent_shape is None, autoencoder_latent_shape must be None, and vice versa.") + self.ldm_latent_shape = ldm_latent_shape + self.autoencoder_latent_shape = autoencoder_latent_shape + if self.ldm_latent_shape is not None and self.autoencoder_latent_shape is not None: + self.ldm_resizer = SpatialPad(spatial_size=self.ldm_latent_shape) + self.autoencoder_resizer = CenterSpatialCrop(roi_size=self.autoencoder_latent_shape) + + def __call__( # type: ignore[override] + self, + inputs: torch.Tensor, + autoencoder_model: AutoencoderKL | VQVAE, + diffusion_model: DiffusionModelUNet, + noise: torch.Tensor, + timesteps: torch.Tensor, + condition: torch.Tensor | None = None, + mode: str = "crossattn", + seg: torch.Tensor | None = None, + ) -> torch.Tensor: + """ + Implements the forward pass for a supervised training iteration. + + Args: + inputs: input image to which the latent representation will be extracted and noise is added. + autoencoder_model: first stage model. + diffusion_model: diffusion model. + noise: random noise, of the same shape as the latent representation. + timesteps: random timesteps. + condition: conditioning for network input. + mode: Conditioning mode for the network. + seg: if diffusion model is instance of SPADEDiffusionModel, segmentation must be provided. + """ + with torch.no_grad(): + latent = autoencoder_model.encode_stage_2_inputs(inputs) * self.scale_factor + + if self.ldm_latent_shape is not None: + latent = torch.stack([self.ldm_resizer(i) for i in decollate_batch(latent)], 0) + + prediction: torch.Tensor = super().__call__( + inputs=latent, + diffusion_model=diffusion_model, + noise=noise, + timesteps=timesteps, + condition=condition, + mode=mode, + seg=seg, + ) + return prediction + + @torch.no_grad() + def sample( # type: ignore[override] + self, + input_noise: torch.Tensor, + autoencoder_model: AutoencoderKL | VQVAE, + diffusion_model: DiffusionModelUNet, + scheduler: Scheduler | None = None, + save_intermediates: bool | None = False, + intermediate_steps: int | None = 100, + conditioning: torch.Tensor | None = None, + mode: str = "crossattn", + verbose: bool = True, + seg: torch.Tensor | None = None, + ) -> torch.Tensor | tuple[torch.Tensor, list[torch.Tensor]]: + """ + Args: + input_noise: random noise, of the same shape as the desired latent representation. + autoencoder_model: first stage model. + diffusion_model: model to sample from. + scheduler: diffusion scheduler. If none provided will use the class attribute scheduler. + save_intermediates: whether to return intermediates along the sampling change + intermediate_steps: if save_intermediates is True, saves every n steps + conditioning: Conditioning for network input. + mode: Conditioning mode for the network. + verbose: if true, prints the progression bar of the sampling process. + seg: if diffusion model is instance of SPADEDiffusionModel, or autoencoder_model + is instance of SPADEAutoencoderKL, segmentation must be provided. + """ + + if ( + isinstance(autoencoder_model, SPADEAutoencoderKL) + and isinstance(diffusion_model, SPADEDiffusionModelUNet) + and autoencoder_model.decoder.label_nc != diffusion_model.label_nc + ): + raise ValueError( + f"If both autoencoder_model and diffusion_model implement SPADE, the number of semantic" + f"labels for each must be compatible, but got {autoencoder_model.decoder.label_nc} and" + f"{diffusion_model.label_nc}" + ) + + outputs = super().sample( + input_noise=input_noise, + diffusion_model=diffusion_model, + scheduler=scheduler, + save_intermediates=save_intermediates, + intermediate_steps=intermediate_steps, + conditioning=conditioning, + mode=mode, + verbose=verbose, + seg=seg, + ) + + if save_intermediates: + latent, latent_intermediates = outputs + else: + latent = outputs + + if self.autoencoder_latent_shape is not None: + latent = torch.stack([self.autoencoder_resizer(i) for i in decollate_batch(latent)], 0) + latent_intermediates = [ + torch.stack([self.autoencoder_resizer(i) for i in decollate_batch(l)], 0) for l in latent_intermediates + ] + + decode = autoencoder_model.decode_stage_2_outputs + if isinstance(autoencoder_model, SPADEAutoencoderKL): + decode = partial(autoencoder_model.decode_stage_2_outputs, seg=seg) + image = decode(latent / self.scale_factor) + + if save_intermediates: + intermediates = [] + for latent_intermediate in latent_intermediates: + decode = autoencoder_model.decode_stage_2_outputs + if isinstance(autoencoder_model, SPADEAutoencoderKL): + decode = partial(autoencoder_model.decode_stage_2_outputs, seg=seg) + intermediates.append(decode(latent_intermediate / self.scale_factor)) + return image, intermediates + + else: + return image + + @torch.no_grad() + def get_likelihood( # type: ignore[override] + self, + inputs: torch.Tensor, + autoencoder_model: AutoencoderKL | VQVAE, + diffusion_model: DiffusionModelUNet, + scheduler: Scheduler | None = None, + save_intermediates: bool | None = False, + conditioning: torch.Tensor | None = None, + mode: str = "crossattn", + original_input_range: tuple | None = (0, 255), + scaled_input_range: tuple | None = (0, 1), + verbose: bool = True, + resample_latent_likelihoods: bool = False, + resample_interpolation_mode: str = "nearest", + seg: torch.Tensor | None = None, + ) -> torch.Tensor | tuple[torch.Tensor, list[torch.Tensor]]: + """ + Computes the log-likelihoods of the latent representations of the input. + + Args: + inputs: input images, NxCxHxW[xD] + autoencoder_model: first stage model. + diffusion_model: model to compute likelihood from + scheduler: diffusion scheduler. If none provided will use the class attribute scheduler + save_intermediates: save the intermediate spatial KL maps + conditioning: Conditioning for network input. + mode: Conditioning mode for the network. + original_input_range: the [min,max] intensity range of the input data before any scaling was applied. + scaled_input_range: the [min,max] intensity range of the input data after scaling. + verbose: if true, prints the progression bar of the sampling process. + resample_latent_likelihoods: if true, resamples the intermediate likelihood maps to have the same spatial + dimension as the input images. + resample_interpolation_mode: if use resample_latent_likelihoods, select interpolation 'nearest', 'bilinear', + or 'trilinear; + seg: if diffusion model is instance of SPADEDiffusionModel, or autoencoder_model + is instance of SPADEAutoencoderKL, segmentation must be provided. + """ + if resample_latent_likelihoods and resample_interpolation_mode not in ("nearest", "bilinear", "trilinear"): + raise ValueError( + f"resample_interpolation mode should be either nearest, bilinear, or trilinear, got {resample_interpolation_mode}" + ) + latents = autoencoder_model.encode_stage_2_inputs(inputs) * self.scale_factor + + if self.ldm_latent_shape is not None: + latents = torch.stack([self.ldm_resizer(i) for i in decollate_batch(latents)], 0) + + outputs = super().get_likelihood( + inputs=latents, + diffusion_model=diffusion_model, + scheduler=scheduler, + save_intermediates=save_intermediates, + conditioning=conditioning, + mode=mode, + verbose=verbose, + seg=seg, + ) + + if save_intermediates and resample_latent_likelihoods: + intermediates = outputs[1] + resizer = nn.Upsample(size=inputs.shape[2:], mode=resample_interpolation_mode) + intermediates = [resizer(x) for x in intermediates] + outputs = (outputs[0], intermediates) + return outputs + + +class ControlNetDiffusionInferer(DiffusionInferer): + """ + ControlNetDiffusionInferer takes a trained diffusion model and a scheduler and can be used to perform a signal + forward pass for a training iteration, and sample from the model, supporting ControlNet-based conditioning. + + Args: + scheduler: diffusion scheduler. + """ + + def __init__(self, scheduler: Scheduler) -> None: + Inferer.__init__(self) + self.scheduler = scheduler + + def __call__( # type: ignore[override] + self, + inputs: torch.Tensor, + diffusion_model: DiffusionModelUNet, + controlnet: ControlNet, + noise: torch.Tensor, + timesteps: torch.Tensor, + cn_cond: torch.Tensor, + condition: torch.Tensor | None = None, + mode: str = "crossattn", + seg: torch.Tensor | None = None, + ) -> torch.Tensor: + """ + Implements the forward pass for a supervised training iteration. + + Args: + inputs: Input image to which noise is added. + diffusion_model: diffusion model. + controlnet: controlnet sub-network. + noise: random noise, of the same shape as the input. + timesteps: random timesteps. + cn_cond: conditioning image for the ControlNet. + condition: Conditioning for network input. + mode: Conditioning mode for the network. + seg: if model is instance of SPADEDiffusionModelUnet, segmentation must be + provided on the forward (for SPADE-like AE or SPADE-like DM) + """ + if mode not in ["crossattn", "concat"]: + raise NotImplementedError(f"{mode} condition is not supported") + + noisy_image = self.scheduler.add_noise(original_samples=inputs, noise=noise, timesteps=timesteps) + down_block_res_samples, mid_block_res_sample = controlnet( + x=noisy_image, timesteps=timesteps, controlnet_cond=cn_cond + ) + if mode == "concat" and condition is not None: + noisy_image = torch.cat([noisy_image, condition], dim=1) + condition = None + + diffuse = diffusion_model + if isinstance(diffusion_model, SPADEDiffusionModelUNet): + diffuse = partial(diffusion_model, seg=seg) + + prediction: torch.Tensor = diffuse( + x=noisy_image, + timesteps=timesteps, + context=condition, + down_block_additional_residuals=down_block_res_samples, + mid_block_additional_residual=mid_block_res_sample, + ) + + return prediction + + @torch.no_grad() + def sample( # type: ignore[override] + self, + input_noise: torch.Tensor, + diffusion_model: DiffusionModelUNet, + controlnet: ControlNet, + cn_cond: torch.Tensor, + scheduler: Scheduler | None = None, + save_intermediates: bool | None = False, + intermediate_steps: int | None = 100, + conditioning: torch.Tensor | None = None, + mode: str = "crossattn", + verbose: bool = True, + seg: torch.Tensor | None = None, + ) -> torch.Tensor | tuple[torch.Tensor, list[torch.Tensor]]: + """ + Args: + input_noise: random noise, of the same shape as the desired sample. + diffusion_model: model to sample from. + controlnet: controlnet sub-network. + cn_cond: conditioning image for the ControlNet. + scheduler: diffusion scheduler. If none provided will use the class attribute scheduler + save_intermediates: whether to return intermediates along the sampling change + intermediate_steps: if save_intermediates is True, saves every n steps + conditioning: Conditioning for network input. + mode: Conditioning mode for the network. + verbose: if true, prints the progression bar of the sampling process. + seg: if diffusion model is instance of SPADEDiffusionModel, segmentation must be provided. + """ + if mode not in ["crossattn", "concat"]: + raise NotImplementedError(f"{mode} condition is not supported") + + if not scheduler: + scheduler = self.scheduler + image = input_noise + if verbose and has_tqdm: + progress_bar = tqdm(scheduler.timesteps) + else: + progress_bar = iter(scheduler.timesteps) + intermediates = [] + for t in progress_bar: + # 1. ControlNet forward + down_block_res_samples, mid_block_res_sample = controlnet( + x=image, timesteps=torch.Tensor((t,)).to(input_noise.device), controlnet_cond=cn_cond + ) + # 2. predict noise model_output + diffuse = diffusion_model + if isinstance(diffusion_model, SPADEDiffusionModelUNet): + diffuse = partial(diffusion_model, seg=seg) + + if mode == "concat" and conditioning is not None: + model_input = torch.cat([image, conditioning], dim=1) + model_output = diffuse( + model_input, + timesteps=torch.Tensor((t,)).to(input_noise.device), + context=None, + down_block_additional_residuals=down_block_res_samples, + mid_block_additional_residual=mid_block_res_sample, + ) + else: + model_output = diffuse( + image, + timesteps=torch.Tensor((t,)).to(input_noise.device), + context=conditioning, + down_block_additional_residuals=down_block_res_samples, + mid_block_additional_residual=mid_block_res_sample, + ) + + # 3. compute previous image: x_t -> x_t-1 + image, _ = scheduler.step(model_output, t, image) + if save_intermediates and t % intermediate_steps == 0: + intermediates.append(image) + if save_intermediates: + return image, intermediates + else: + return image + + @torch.no_grad() + def get_likelihood( # type: ignore[override] + self, + inputs: torch.Tensor, + diffusion_model: DiffusionModelUNet, + controlnet: ControlNet, + cn_cond: torch.Tensor, + scheduler: Scheduler | None = None, + save_intermediates: bool | None = False, + conditioning: torch.Tensor | None = None, + mode: str = "crossattn", + original_input_range: tuple = (0, 255), + scaled_input_range: tuple = (0, 1), + verbose: bool = True, + seg: torch.Tensor | None = None, + ) -> torch.Tensor | tuple[torch.Tensor, list[torch.Tensor]]: + """ + Computes the log-likelihoods for an input. + + Args: + inputs: input images, NxCxHxW[xD] + diffusion_model: model to compute likelihood from + controlnet: controlnet sub-network. + cn_cond: conditioning image for the ControlNet. + scheduler: diffusion scheduler. If none provided will use the class attribute scheduler. + save_intermediates: save the intermediate spatial KL maps + conditioning: Conditioning for network input. + mode: Conditioning mode for the network. + original_input_range: the [min,max] intensity range of the input data before any scaling was applied. + scaled_input_range: the [min,max] intensity range of the input data after scaling. + verbose: if true, prints the progression bar of the sampling process. + seg: if diffusion model is instance of SPADEDiffusionModel, segmentation must be provided. + """ + + if not scheduler: + scheduler = self.scheduler + if scheduler._get_name() != "DDPMScheduler": + raise NotImplementedError( + f"Likelihood computation is only compatible with DDPMScheduler," + f" you are using {scheduler._get_name()}" + ) + if mode not in ["crossattn", "concat"]: + raise NotImplementedError(f"{mode} condition is not supported") + if verbose and has_tqdm: + progress_bar = tqdm(scheduler.timesteps) + else: + progress_bar = iter(scheduler.timesteps) + intermediates = [] + noise = torch.randn_like(inputs).to(inputs.device) + total_kl = torch.zeros(inputs.shape[0]).to(inputs.device) + for t in progress_bar: + timesteps = torch.full(inputs.shape[:1], t, device=inputs.device).long() + noisy_image = self.scheduler.add_noise(original_samples=inputs, noise=noise, timesteps=timesteps) + down_block_res_samples, mid_block_res_sample = controlnet( + x=noisy_image, timesteps=torch.Tensor((t,)).to(inputs.device), controlnet_cond=cn_cond + ) + + diffuse = diffusion_model + if isinstance(diffusion_model, SPADEDiffusionModelUNet): + diffuse = partial(diffusion_model, seg=seg) + + if mode == "concat" and conditioning is not None: + noisy_image = torch.cat([noisy_image, conditioning], dim=1) + model_output = diffuse( + noisy_image, + timesteps=timesteps, + context=None, + down_block_additional_residuals=down_block_res_samples, + mid_block_additional_residual=mid_block_res_sample, + ) + else: + model_output = diffuse( + x=noisy_image, + timesteps=timesteps, + context=conditioning, + down_block_additional_residuals=down_block_res_samples, + mid_block_additional_residual=mid_block_res_sample, + ) + # get the model's predicted mean, and variance if it is predicted + if model_output.shape[1] == inputs.shape[1] * 2 and scheduler.variance_type in ["learned", "learned_range"]: + model_output, predicted_variance = torch.split(model_output, inputs.shape[1], dim=1) + else: + predicted_variance = None + + # 1. compute alphas, betas + alpha_prod_t = scheduler.alphas_cumprod[t] + alpha_prod_t_prev = scheduler.alphas_cumprod[t - 1] if t > 0 else scheduler.one + beta_prod_t = 1 - alpha_prod_t + beta_prod_t_prev = 1 - alpha_prod_t_prev + + # 2. compute predicted original sample from predicted noise also called + # "predicted x_0" of formula (15) from https://arxiv.org/pdf/2006.11239.pdf + if scheduler.prediction_type == "epsilon": + pred_original_sample = (noisy_image - beta_prod_t ** (0.5) * model_output) / alpha_prod_t ** (0.5) + elif scheduler.prediction_type == "sample": + pred_original_sample = model_output + elif scheduler.prediction_type == "v_prediction": + pred_original_sample = (alpha_prod_t**0.5) * noisy_image - (beta_prod_t**0.5) * model_output + # 3. Clip "predicted x_0" + if scheduler.clip_sample: + pred_original_sample = torch.clamp(pred_original_sample, -1, 1) + + # 4. Compute coefficients for pred_original_sample x_0 and current sample x_t + # See formula (7) from https://arxiv.org/pdf/2006.11239.pdf + pred_original_sample_coeff = (alpha_prod_t_prev ** (0.5) * scheduler.betas[t]) / beta_prod_t + current_sample_coeff = scheduler.alphas[t] ** (0.5) * beta_prod_t_prev / beta_prod_t + + # 5. Compute predicted previous sample µ_t + # See formula (7) from https://arxiv.org/pdf/2006.11239.pdf + predicted_mean = pred_original_sample_coeff * pred_original_sample + current_sample_coeff * noisy_image + + # get the posterior mean and variance + posterior_mean = scheduler._get_mean(timestep=t, x_0=inputs, x_t=noisy_image) + posterior_variance = scheduler._get_variance(timestep=t, predicted_variance=predicted_variance) + + log_posterior_variance = torch.log(posterior_variance) + log_predicted_variance = torch.log(predicted_variance) if predicted_variance else log_posterior_variance + + if t == 0: + # compute -log p(x_0|x_1) + kl = -super()._get_decoder_log_likelihood( + inputs=inputs, + means=predicted_mean, + log_scales=0.5 * log_predicted_variance, + original_input_range=original_input_range, + scaled_input_range=scaled_input_range, + ) + else: + # compute kl between two normals + kl = 0.5 * ( + -1.0 + + log_predicted_variance + - log_posterior_variance + + torch.exp(log_posterior_variance - log_predicted_variance) + + ((posterior_mean - predicted_mean) ** 2) * torch.exp(-log_predicted_variance) + ) + total_kl += kl.view(kl.shape[0], -1).mean(dim=1) + if save_intermediates: + intermediates.append(kl.cpu()) + + if save_intermediates: + return total_kl, intermediates + else: + return total_kl + + +class ControlNetLatentDiffusionInferer(ControlNetDiffusionInferer): + """ + ControlNetLatentDiffusionInferer takes a stage 1 model (VQVAE or AutoencoderKL), diffusion model, controlnet, + and a scheduler, and can be used to perform a signal forward pass for a training iteration, and sample from + the model. + + Args: + scheduler: a scheduler to be used in combination with `unet` to denoise the encoded image latents. + scale_factor: scale factor to multiply the values of the latent representation before processing it by the + second stage. + ldm_latent_shape: desired spatial latent space shape. Used if there is a difference in the autoencoder model's latent shape. + autoencoder_latent_shape: autoencoder_latent_shape: autoencoder spatial latent space shape. Used if there is a + difference between the autoencoder's latent shape and the DM shape. + """ + + def __init__( + self, + scheduler: Scheduler, + scale_factor: float = 1.0, + ldm_latent_shape: list | None = None, + autoencoder_latent_shape: list | None = None, + ) -> None: + super().__init__(scheduler=scheduler) + self.scale_factor = scale_factor + if (ldm_latent_shape is None) ^ (autoencoder_latent_shape is None): + raise ValueError("If ldm_latent_shape is None, autoencoder_latent_shape must be None" "and vice versa.") + self.ldm_latent_shape = ldm_latent_shape + self.autoencoder_latent_shape = autoencoder_latent_shape + if self.ldm_latent_shape is not None and self.autoencoder_latent_shape is not None: + self.ldm_resizer = SpatialPad(spatial_size=self.ldm_latent_shape) + self.autoencoder_resizer = CenterSpatialCrop(roi_size=self.autoencoder_latent_shape) + + def __call__( # type: ignore[override] + self, + inputs: torch.Tensor, + autoencoder_model: AutoencoderKL | VQVAE, + diffusion_model: DiffusionModelUNet, + controlnet: ControlNet, + noise: torch.Tensor, + timesteps: torch.Tensor, + cn_cond: torch.Tensor, + condition: torch.Tensor | None = None, + mode: str = "crossattn", + seg: torch.Tensor | None = None, + ) -> torch.Tensor: + """ + Implements the forward pass for a supervised training iteration. + + Args: + inputs: input image to which the latent representation will be extracted and noise is added. + autoencoder_model: first stage model. + diffusion_model: diffusion model. + controlnet: instance of ControlNet model + noise: random noise, of the same shape as the latent representation. + timesteps: random timesteps. + cn_cond: conditioning tensor for the ControlNet network + condition: conditioning for network input. + mode: Conditioning mode for the network. + seg: if diffusion model is instance of SPADEDiffusionModel, segmentation must be provided. + """ + with torch.no_grad(): + latent = autoencoder_model.encode_stage_2_inputs(inputs) * self.scale_factor + + if self.ldm_latent_shape is not None: + latent = torch.stack([self.ldm_resizer(i) for i in decollate_batch(latent)], 0) + + if cn_cond.shape[2:] != latent.shape[2:]: + cn_cond = F.interpolate(cn_cond, latent.shape[2:]) + + prediction = super().__call__( + inputs=latent, + diffusion_model=diffusion_model, + controlnet=controlnet, + noise=noise, + timesteps=timesteps, + cn_cond=cn_cond, + condition=condition, + mode=mode, + seg=seg, + ) + + return prediction + + @torch.no_grad() + def sample( # type: ignore[override] + self, + input_noise: torch.Tensor, + autoencoder_model: AutoencoderKL | VQVAE, + diffusion_model: DiffusionModelUNet, + controlnet: ControlNet, + cn_cond: torch.Tensor, + scheduler: Scheduler | None = None, + save_intermediates: bool | None = False, + intermediate_steps: int | None = 100, + conditioning: torch.Tensor | None = None, + mode: str = "crossattn", + verbose: bool = True, + seg: torch.Tensor | None = None, + ) -> torch.Tensor | tuple[torch.Tensor, list[torch.Tensor]]: + """ + Args: + input_noise: random noise, of the same shape as the desired latent representation. + autoencoder_model: first stage model. + diffusion_model: model to sample from. + controlnet: instance of ControlNet model. + cn_cond: conditioning tensor for the ControlNet network. + scheduler: diffusion scheduler. If none provided will use the class attribute scheduler. + save_intermediates: whether to return intermediates along the sampling change + intermediate_steps: if save_intermediates is True, saves every n steps + conditioning: Conditioning for network input. + mode: Conditioning mode for the network. + verbose: if true, prints the progression bar of the sampling process. + seg: if diffusion model is instance of SPADEDiffusionModel, or autoencoder_model + is instance of SPADEAutoencoderKL, segmentation must be provided. + """ + + if ( + isinstance(autoencoder_model, SPADEAutoencoderKL) + and isinstance(diffusion_model, SPADEDiffusionModelUNet) + and autoencoder_model.decoder.label_nc != diffusion_model.label_nc + ): + raise ValueError( + "If both autoencoder_model and diffusion_model implement SPADE, the number of semantic" + "labels for each must be compatible. Got {autoencoder_model.decoder.label_nc} and {diffusion_model.label_nc}" + ) + + if cn_cond.shape[2:] != input_noise.shape[2:]: + cn_cond = F.interpolate(cn_cond, input_noise.shape[2:]) + + outputs = super().sample( + input_noise=input_noise, + diffusion_model=diffusion_model, + controlnet=controlnet, + cn_cond=cn_cond, + scheduler=scheduler, + save_intermediates=save_intermediates, + intermediate_steps=intermediate_steps, + conditioning=conditioning, + mode=mode, + verbose=verbose, + seg=seg, + ) + + if save_intermediates: + latent, latent_intermediates = outputs + else: + latent = outputs + + if self.autoencoder_latent_shape is not None: + latent = torch.stack([self.autoencoder_resizer(i) for i in decollate_batch(latent)], 0) + latent_intermediates = [ + torch.stack([self.autoencoder_resizer(i) for i in decollate_batch(l)], 0) for l in latent_intermediates + ] + + decode = autoencoder_model.decode_stage_2_outputs + if isinstance(autoencoder_model, SPADEAutoencoderKL): + decode = partial(autoencoder_model.decode_stage_2_outputs, seg=seg) + + image = decode(latent / self.scale_factor) + + if save_intermediates: + intermediates = [] + for latent_intermediate in latent_intermediates: + decode = autoencoder_model.decode_stage_2_outputs + if isinstance(autoencoder_model, SPADEAutoencoderKL): + decode = partial(autoencoder_model.decode_stage_2_outputs, seg=seg) + intermediates.append(decode(latent_intermediate / self.scale_factor)) + return image, intermediates + + else: + return image + + @torch.no_grad() + def get_likelihood( # type: ignore[override] + self, + inputs: torch.Tensor, + autoencoder_model: AutoencoderKL | VQVAE, + diffusion_model: DiffusionModelUNet, + controlnet: ControlNet, + cn_cond: torch.Tensor, + scheduler: Scheduler | None = None, + save_intermediates: bool | None = False, + conditioning: torch.Tensor | None = None, + mode: str = "crossattn", + original_input_range: tuple | None = (0, 255), + scaled_input_range: tuple | None = (0, 1), + verbose: bool = True, + resample_latent_likelihoods: bool = False, + resample_interpolation_mode: str = "nearest", + seg: torch.Tensor | None = None, + ) -> torch.Tensor | tuple[torch.Tensor, list[torch.Tensor]]: + """ + Computes the log-likelihoods of the latent representations of the input. + + Args: + inputs: input images, NxCxHxW[xD] + autoencoder_model: first stage model. + diffusion_model: model to compute likelihood from + controlnet: instance of ControlNet model. + cn_cond: conditioning tensor for the ControlNet network. + scheduler: diffusion scheduler. If none provided will use the class attribute scheduler + save_intermediates: save the intermediate spatial KL maps + conditioning: Conditioning for network input. + mode: Conditioning mode for the network. + original_input_range: the [min,max] intensity range of the input data before any scaling was applied. + scaled_input_range: the [min,max] intensity range of the input data after scaling. + verbose: if true, prints the progression bar of the sampling process. + resample_latent_likelihoods: if true, resamples the intermediate likelihood maps to have the same spatial + dimension as the input images. + resample_interpolation_mode: if use resample_latent_likelihoods, select interpolation 'nearest', 'bilinear', + or 'trilinear; + seg: if diffusion model is instance of SPADEDiffusionModel, or autoencoder_model + is instance of SPADEAutoencoderKL, segmentation must be provided. + """ + if resample_latent_likelihoods and resample_interpolation_mode not in ("nearest", "bilinear", "trilinear"): + raise ValueError( + f"resample_interpolation mode should be either nearest, bilinear, or trilinear, got {resample_interpolation_mode}" + ) + + latents = autoencoder_model.encode_stage_2_inputs(inputs) * self.scale_factor + + if cn_cond.shape[2:] != latents.shape[2:]: + cn_cond = F.interpolate(cn_cond, latents.shape[2:]) + + if self.ldm_latent_shape is not None: + latents = torch.stack([self.ldm_resizer(i) for i in decollate_batch(latents)], 0) + + outputs = super().get_likelihood( + inputs=latents, + diffusion_model=diffusion_model, + controlnet=controlnet, + cn_cond=cn_cond, + scheduler=scheduler, + save_intermediates=save_intermediates, + conditioning=conditioning, + mode=mode, + verbose=verbose, + seg=seg, + ) + + if save_intermediates and resample_latent_likelihoods: + intermediates = outputs[1] + resizer = nn.Upsample(size=inputs.shape[2:], mode=resample_interpolation_mode) + intermediates = [resizer(x) for x in intermediates] + outputs = (outputs[0], intermediates) + return outputs + + +class VQVAETransformerInferer(nn.Module): + """ + Class to perform inference with a VQVAE + Transformer model. + """ + + def __init__(self) -> None: + Inferer.__init__(self) + + def __call__( + self, + inputs: torch.Tensor, + vqvae_model: VQVAE, + transformer_model: DecoderOnlyTransformer, + ordering: Ordering, + condition: torch.Tensor | None = None, + return_latent: bool = False, + ) -> torch.Tensor | tuple[torch.Tensor, torch.Tensor, tuple]: + """ + Implements the forward pass for a supervised training iteration. + + Args: + inputs: input image to which the latent representation will be extracted. + vqvae_model: first stage model. + transformer_model: autoregressive transformer model. + ordering: ordering of the quantised latent representation. + return_latent: also return latent sequence and spatial dim of the latent. + condition: conditioning for network input. + """ + with torch.no_grad(): + latent = vqvae_model.index_quantize(inputs) + + latent_spatial_dim = tuple(latent.shape[1:]) + latent = latent.reshape(latent.shape[0], -1) + latent = latent[:, ordering.get_sequence_ordering()] + + # get the targets for the loss + target = latent.clone() + # Use the value from vqvae_model's num_embeddings as the starting token, the "Begin Of Sentence" (BOS) token. + # Note the transformer_model must have vqvae_model.num_embeddings + 1 defined as num_tokens. + latent = F.pad(latent, (1, 0), "constant", vqvae_model.num_embeddings) + # crop the last token as we do not need the probability of the token that follows it + latent = latent[:, :-1] + latent = latent.long() + + # train on a part of the sequence if it is longer than max_seq_length + seq_len = latent.shape[1] + max_seq_len = transformer_model.max_seq_len + if max_seq_len < seq_len: + start = int(torch.randint(low=0, high=seq_len + 1 - max_seq_len, size=(1,)).item()) + else: + start = 0 + prediction: torch.Tensor = transformer_model(x=latent[:, start : start + max_seq_len], context=condition) + if return_latent: + return prediction, target[:, start : start + max_seq_len], latent_spatial_dim + else: + return prediction + + @torch.no_grad() + def sample( + self, + latent_spatial_dim: tuple[int, int, int] | tuple[int, int], + starting_tokens: torch.Tensor, + vqvae_model: VQVAE, + transformer_model: DecoderOnlyTransformer, + ordering: Ordering, + conditioning: torch.Tensor | None = None, + temperature: float = 1.0, + top_k: int | None = None, + verbose: bool = True, + ) -> torch.Tensor: + """ + Sampling function for the VQVAE + Transformer model. + + Args: + latent_spatial_dim: shape of the sampled image. + starting_tokens: starting tokens for the sampling. It must be vqvae_model.num_embeddings value. + vqvae_model: first stage model. + transformer_model: model to sample from. + conditioning: Conditioning for network input. + temperature: temperature for sampling. + top_k: top k sampling. + verbose: if true, prints the progression bar of the sampling process. + """ + seq_len = math.prod(latent_spatial_dim) + + if verbose and has_tqdm: + progress_bar = tqdm(range(seq_len)) + else: + progress_bar = iter(range(seq_len)) + + latent_seq = starting_tokens.long() + for _ in progress_bar: + # if the sequence context is growing too long we must crop it at block_size + if latent_seq.size(1) <= transformer_model.max_seq_len: + idx_cond = latent_seq + else: + idx_cond = latent_seq[:, -transformer_model.max_seq_len :] + + # forward the model to get the logits for the index in the sequence + logits = transformer_model(x=idx_cond, context=conditioning) + # pluck the logits at the final step and scale by desired temperature + logits = logits[:, -1, :] / temperature + # optionally crop the logits to only the top k options + if top_k is not None: + v, _ = torch.topk(logits, min(top_k, logits.size(-1))) + logits[logits < v[:, [-1]]] = -float("Inf") + # apply softmax to convert logits to (normalized) probabilities + probs = F.softmax(logits, dim=-1) + # remove the chance to be sampled the BOS token + probs[:, vqvae_model.num_embeddings] = 0 + # sample from the distribution + idx_next = torch.multinomial(probs, num_samples=1) + # append sampled index to the running sequence and continue + latent_seq = torch.cat((latent_seq, idx_next), dim=1) + + latent_seq = latent_seq[:, 1:] + latent_seq = latent_seq[:, ordering.get_revert_sequence_ordering()] + latent = latent_seq.reshape((starting_tokens.shape[0],) + latent_spatial_dim) + + return vqvae_model.decode_samples(latent) + + @torch.no_grad() + def get_likelihood( + self, + inputs: torch.Tensor, + vqvae_model: VQVAE, + transformer_model: DecoderOnlyTransformer, + ordering: Ordering, + condition: torch.Tensor | None = None, + resample_latent_likelihoods: bool = False, + resample_interpolation_mode: str = "nearest", + verbose: bool = False, + ) -> torch.Tensor: + """ + Computes the log-likelihoods of the latent representations of the input. + + Args: + inputs: input images, NxCxHxW[xD] + vqvae_model: first stage model. + transformer_model: autoregressive transformer model. + ordering: ordering of the quantised latent representation. + condition: conditioning for network input. + resample_latent_likelihoods: if true, resamples the intermediate likelihood maps to have the same spatial + dimension as the input images. + resample_interpolation_mode: if use resample_latent_likelihoods, select interpolation 'nearest', 'bilinear', + or 'trilinear; + verbose: if true, prints the progression bar of the sampling process. + + """ + if resample_latent_likelihoods and resample_interpolation_mode not in ("nearest", "bilinear", "trilinear"): + raise ValueError( + f"resample_interpolation mode should be either nearest, bilinear, or trilinear, got {resample_interpolation_mode}" + ) + + with torch.no_grad(): + latent = vqvae_model.index_quantize(inputs) + + latent_spatial_dim = tuple(latent.shape[1:]) + latent = latent.reshape(latent.shape[0], -1) + latent = latent[:, ordering.get_sequence_ordering()] + seq_len = math.prod(latent_spatial_dim) + + # Use the value from vqvae_model's num_embeddings as the starting token, the "Begin Of Sentence" (BOS) token. + # Note the transformer_model must have vqvae_model.num_embeddings + 1 defined as num_tokens. + latent = F.pad(latent, (1, 0), "constant", vqvae_model.num_embeddings) + latent = latent.long() + + # get the first batch, up to max_seq_length, efficiently + logits = transformer_model(x=latent[:, : transformer_model.max_seq_len], context=condition) + probs = F.softmax(logits, dim=-1) + # target token for each set of logits is the next token along + target = latent[:, 1:] + probs = torch.gather(probs, 2, target[:, : transformer_model.max_seq_len].unsqueeze(2)).squeeze(2) + + # if we have not covered the full sequence we continue with inefficient looping + if probs.shape[1] < target.shape[1]: + if verbose and has_tqdm: + progress_bar = tqdm(range(transformer_model.max_seq_len, seq_len)) + else: + progress_bar = iter(range(transformer_model.max_seq_len, seq_len)) + + for i in progress_bar: + idx_cond = latent[:, i + 1 - transformer_model.max_seq_len : i + 1] + # forward the model to get the logits for the index in the sequence + logits = transformer_model(x=idx_cond, context=condition) + # pluck the logits at the final step + logits = logits[:, -1, :] + # apply softmax to convert logits to (normalized) probabilities + p = F.softmax(logits, dim=-1) + # select correct values and append + p = torch.gather(p, 1, target[:, i].unsqueeze(1)) + + probs = torch.cat((probs, p), dim=1) + + # convert to log-likelihood + probs = torch.log(probs) + + # reshape + probs = probs[:, ordering.get_revert_sequence_ordering()] + probs_reshaped = probs.reshape((inputs.shape[0],) + latent_spatial_dim) + if resample_latent_likelihoods: + resizer = nn.Upsample(size=inputs.shape[2:], mode=resample_interpolation_mode) + probs_reshaped = resizer(probs_reshaped[:, None, ...]) + + return probs_reshaped diff --git a/monai/losses/__init__.py b/monai/losses/__init__.py index 92898c81ca..e937b53fa4 100644 --- a/monai/losses/__init__.py +++ b/monai/losses/__init__.py @@ -12,6 +12,7 @@ from __future__ import annotations from .adversarial_loss import PatchAdversarialLoss +from .barlow_twins import BarlowTwinsLoss from .cldice import SoftclDiceLoss, SoftDiceclDiceLoss from .contrastive import ContrastiveLoss from .deform import BendingEnergyLoss, DiffusionLoss @@ -40,5 +41,6 @@ from .spatial_mask import MaskedLoss from .spectral_loss import JukeboxLoss from .ssim_loss import SSIMLoss +from .sure_loss import SURELoss from .tversky import TverskyLoss from .unified_focal_loss import AsymmetricUnifiedFocalLoss diff --git a/monai/losses/barlow_twins.py b/monai/losses/barlow_twins.py new file mode 100644 index 0000000000..a61acca66e --- /dev/null +++ b/monai/losses/barlow_twins.py @@ -0,0 +1,84 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import torch +from torch.nn.modules.loss import _Loss + + +class BarlowTwinsLoss(_Loss): + """ + The Barlow Twins cost function takes the representations extracted by a neural network from two + distorted views and seeks to make the cross-correlation matrix of the two representations tend + towards identity. This encourages the neural network to learn similar representations with the least + amount of redundancy. This cost function can be used in particular in multimodal learning to work on + representations from two modalities. The most common use case is for unsupervised learning, where data + augmentations are used to generate 2 distorted views of the same sample to force the encoder to + extract useful features for downstream tasks. + + Zbontar, Jure, et al. "Barlow Twins: Self-Supervised Learning via Redundancy Reduction" International + conference on machine learning. PMLR, 2020. (http://proceedings.mlr.press/v139/zbontar21a/zbontar21a.pdf) + + Adapted from: + https://github.com/facebookresearch/barlowtwins + + """ + + def __init__(self, lambd: float = 5e-3) -> None: + """ + Args: + lamb: Can be any float to handle the informativeness and invariance trade-off. Ideally set to 5e-3. + + Raises: + ValueError: When an input of dimension length > 2 is passed + ValueError: When input and target are of different shapes + ValueError: When batch size is less than or equal to 1 + + """ + super().__init__() + self.lambd = lambd + + def forward(self, input: torch.Tensor, target: torch.Tensor) -> torch.Tensor: + """ + Args: + input: the shape should be B[F]. + target: the shape should be B[F]. + """ + if len(target.shape) > 2 or len(input.shape) > 2: + raise ValueError( + f"Either target or input has dimensions greater than 2 where target " + f"shape is ({target.shape}) and input shape is ({input.shape})" + ) + + if target.shape != input.shape: + raise ValueError(f"ground truth has differing shape ({target.shape}) from input ({input.shape})") + + if target.size(0) <= 1: + raise ValueError( + f"Batch size must be greater than 1 to compute Barlow Twins Loss, but got {target.size(0)}" + ) + + lambd_tensor = torch.as_tensor(self.lambd).to(input.device) + batch_size = input.shape[0] + + # normalize input and target + input_norm = (input - input.mean(0)) / input.std(0).add(1e-6) + target_norm = (target - target.mean(0)) / target.std(0).add(1e-6) + + # cross-correlation matrix + c = torch.mm(input_norm.t(), target_norm) / batch_size # input_norm.t() is FxB, target_norm is BxF so c is FxF + + # loss + c_diff = (c - torch.eye(c.size(0), device=c.device)).pow_(2) # FxF + c_diff[~torch.eye(c.size(0), device=c.device).bool()] *= lambd_tensor + + return c_diff.sum() diff --git a/monai/losses/dice.py b/monai/losses/dice.py index b3c0f57c6e..07a38d9572 100644 --- a/monai/losses/dice.py +++ b/monai/losses/dice.py @@ -778,12 +778,22 @@ def forward(self, input: torch.Tensor, target: torch.Tensor) -> torch.Tensor: Raises: ValueError: When number of dimensions for input and target are different. - ValueError: When number of channels for target is neither 1 nor the same as input. + ValueError: When number of channels for target is neither 1 (without one-hot encoding) nor the same as input. + + Returns: + torch.Tensor: value of the loss. """ - if len(input.shape) != len(target.shape): + if input.dim() != target.dim(): raise ValueError( "the number of dimensions for input and target should be the same, " + f"got shape {input.shape} (nb dims: {len(input.shape)}) and {target.shape} (nb dims: {len(target.shape)}). " + "if target is not one-hot encoded, please provide a tensor with shape B1H[WD]." + ) + + if target.shape[1] != 1 and target.shape[1] != input.shape[1]: + raise ValueError( + "number of channels for target is neither 1 (without one-hot encoding) nor the same as input, " f"got shape {input.shape} and {target.shape}." ) @@ -801,7 +811,7 @@ class DiceFocalLoss(_Loss): The details of Focal Loss is shown in ``monai.losses.FocalLoss``. ``gamma`` and ``lambda_focal`` are only used for the focal loss. - ``include_background``, ``weight`` and ``reduction`` are used for both losses + ``include_background``, ``weight``, ``reduction``, and ``alpha`` are used for both losses, and other parameters are only used for dice loss. """ @@ -827,6 +837,7 @@ def __init__( weight: Sequence[float] | float | int | torch.Tensor | None = None, lambda_dice: float = 1.0, lambda_focal: float = 1.0, + alpha: float | None = None, ) -> None: """ Args: @@ -861,7 +872,8 @@ def __init__( Defaults to 1.0. lambda_focal: the trade-off weight value for focal loss. The value should be no less than 0.0. Defaults to 1.0. - + alpha: value of the alpha in the definition of the alpha-balanced Focal loss. The value should be in + [0, 1]. Defaults to None. """ super().__init__() weight = focal_weight if focal_weight is not None else weight @@ -880,7 +892,12 @@ def __init__( weight=weight, ) self.focal = FocalLoss( - include_background=include_background, to_onehot_y=False, gamma=gamma, weight=weight, reduction=reduction + include_background=include_background, + to_onehot_y=False, + gamma=gamma, + weight=weight, + alpha=alpha, + reduction=reduction, ) if lambda_dice < 0.0: raise ValueError("lambda_dice should be no less than 0.0.") @@ -899,14 +916,24 @@ def forward(self, input: torch.Tensor, target: torch.Tensor) -> torch.Tensor: Raises: ValueError: When number of dimensions for input and target are different. - ValueError: When number of channels for target is neither 1 nor the same as input. + ValueError: When number of channels for target is neither 1 (without one-hot encoding) nor the same as input. + Returns: + torch.Tensor: value of the loss. """ - if len(input.shape) != len(target.shape): + if input.dim() != target.dim(): raise ValueError( "the number of dimensions for input and target should be the same, " + f"got shape {input.shape} (nb dims: {len(input.shape)}) and {target.shape} (nb dims: {len(target.shape)}). " + "if target is not one-hot encoded, please provide a tensor with shape B1H[WD]." + ) + + if target.shape[1] != 1 and target.shape[1] != input.shape[1]: + raise ValueError( + "number of channels for target is neither 1 (without one-hot encoding) nor the same as input, " f"got shape {input.shape} and {target.shape}." ) + if self.to_onehot_y: n_pred_ch = input.shape[1] if n_pred_ch == 1: @@ -1015,15 +1042,23 @@ def forward(self, input: torch.Tensor, target: torch.Tensor) -> torch.Tensor: target (torch.Tensor): the shape should be BNH[WD] or B1H[WD]. Raises: - ValueError: When the input and target tensors have different numbers of dimensions, or the target - channel isn't either one-hot encoded or categorical with the same shape of the input. + ValueError: When number of dimensions for input and target are different. + ValueError: When number of channels for target is neither 1 (without one-hot encoding) nor the same as input. Returns: torch.Tensor: value of the loss. """ if input.dim() != target.dim(): raise ValueError( - f"Input - {input.shape} - and target - {target.shape} - must have the same number of dimensions." + "the number of dimensions for input and target should be the same, " + f"got shape {input.shape} (nb dims: {len(input.shape)}) and {target.shape} (nb dims: {len(target.shape)}). " + "if target is not one-hot encoded, please provide a tensor with shape B1H[WD]." + ) + + if target.shape[1] != 1 and target.shape[1] != input.shape[1]: + raise ValueError( + "number of channels for target is neither 1 (without one-hot encoding) nor the same as input, " + f"got shape {input.shape} and {target.shape}." ) gdl_loss = self.generalized_dice(input, target) diff --git a/monai/losses/ds_loss.py b/monai/losses/ds_loss.py index 57fcff6b87..aacc16874d 100644 --- a/monai/losses/ds_loss.py +++ b/monai/losses/ds_loss.py @@ -33,7 +33,7 @@ def __init__(self, loss: _Loss, weight_mode: str = "exp", weights: list[float] | weight_mode: {``"same"``, ``"exp"``, ``"two"``} Specifies the weights calculation for each image level. Defaults to ``"exp"``. - ``"same"``: all weights are equal to 1. - - ``"exp"``: exponentially decreasing weights by a power of 2: 0, 0.5, 0.25, 0.125, etc . + - ``"exp"``: exponentially decreasing weights by a power of 2: 1, 0.5, 0.25, 0.125, etc . - ``"two"``: equal smaller weights for lower levels: 1, 0.5, 0.5, 0.5, 0.5, etc weights: a list of weights to apply to each deeply supervised sub-loss, if provided, this will be used regardless of the weight_mode diff --git a/monai/losses/focal_loss.py b/monai/losses/focal_loss.py index 98c1a071b6..28d1c0cdc9 100644 --- a/monai/losses/focal_loss.py +++ b/monai/losses/focal_loss.py @@ -234,9 +234,8 @@ def sigmoid_focal_loss( """ # computing binary cross entropy with logits # equivalent to F.binary_cross_entropy_with_logits(input, target, reduction='none') - # see also https://github.com/pytorch/pytorch/blob/v1.9.0/aten/src/ATen/native/Loss.cpp#L231 - max_val = (-input).clamp(min=0) - loss: torch.Tensor = input - input * target + max_val + ((-max_val).exp() + (-input - max_val).exp()).log() + # see also https://github.com/pytorch/pytorch/blob/main/aten/src/ATen/native/Loss.cpp#L363 + loss: torch.Tensor = input - input * target - F.logsigmoid(input) # sigmoid(-i) if t==1; sigmoid(i) if t==0 <=> # 1-sigmoid(i) if t==1; sigmoid(i) if t==0 <=> diff --git a/monai/losses/perceptual.py b/monai/losses/perceptual.py index 2207de5e64..a8ae90993a 100644 --- a/monai/losses/perceptual.py +++ b/monai/losses/perceptual.py @@ -29,7 +29,7 @@ class PercetualNetworkType(StrEnum): squeeze = "squeeze" radimagenet_resnet50 = "radimagenet_resnet50" medicalnet_resnet10_23datasets = "medicalnet_resnet10_23datasets" - medical_resnet50_23datasets = "medical_resnet50_23datasets" + medicalnet_resnet50_23datasets = "medicalnet_resnet50_23datasets" resnet50 = "resnet50" @@ -45,6 +45,7 @@ class PerceptualLoss(nn.Module): The fake 3D implementation is based on a 2.5D approach where we calculate the 2D perceptual loss on slices from all three axes and average. The full 3D approach uses a 3D network to calculate the perceptual loss. + MedicalNet networks are only compatible with 3D inputs and support channel-wise loss. Args: spatial_dims: number of spatial dimensions. @@ -62,6 +63,8 @@ class PerceptualLoss(nn.Module): pretrained_state_dict_key: if `pretrained_path` is not `None`, this argument is used to extract the expected state dict. This argument only works when ``"network_type"`` is "resnet50". Defaults to `None`. + channel_wise: if True, the loss is returned per channel. Otherwise the loss is averaged over the channels. + Defaults to ``False``. """ def __init__( @@ -74,6 +77,7 @@ def __init__( pretrained: bool = True, pretrained_path: str | None = None, pretrained_state_dict_key: str | None = None, + channel_wise: bool = False, ): super().__init__() @@ -86,6 +90,9 @@ def __init__( "Argument is_fake_3d must be set to False." ) + if channel_wise and "medicalnet_" not in network_type: + raise ValueError("Channel-wise loss is only compatible with MedicalNet networks.") + if network_type.lower() not in list(PercetualNetworkType): raise ValueError( "Unrecognised criterion entered for Adversarial Loss. Must be one in: %s" @@ -102,7 +109,9 @@ def __init__( self.spatial_dims = spatial_dims self.perceptual_function: nn.Module if spatial_dims == 3 and is_fake_3d is False: - self.perceptual_function = MedicalNetPerceptualSimilarity(net=network_type, verbose=False) + self.perceptual_function = MedicalNetPerceptualSimilarity( + net=network_type, verbose=False, channel_wise=channel_wise + ) elif "radimagenet_" in network_type: self.perceptual_function = RadImageNetPerceptualSimilarity(net=network_type, verbose=False) elif network_type == "resnet50": @@ -116,6 +125,7 @@ def __init__( self.perceptual_function = LPIPS(pretrained=pretrained, net=network_type, verbose=False) self.is_fake_3d = is_fake_3d self.fake_3d_ratio = fake_3d_ratio + self.channel_wise = channel_wise def _calculate_axis_loss(self, input: torch.Tensor, target: torch.Tensor, spatial_axis: int) -> torch.Tensor: """ @@ -172,7 +182,12 @@ def forward(self, input: torch.Tensor, target: torch.Tensor) -> torch.Tensor: # 2D and real 3D cases loss = self.perceptual_function(input, target) - return torch.mean(loss) + if self.channel_wise: + loss = torch.mean(loss.squeeze(), dim=0) + else: + loss = torch.mean(loss) + + return loss class MedicalNetPerceptualSimilarity(nn.Module): @@ -185,14 +200,20 @@ class MedicalNetPerceptualSimilarity(nn.Module): net: {``"medicalnet_resnet10_23datasets"``, ``"medicalnet_resnet50_23datasets"``} Specifies the network architecture to use. Defaults to ``"medicalnet_resnet10_23datasets"``. verbose: if false, mute messages from torch Hub load function. + channel_wise: if True, the loss is returned per channel. Otherwise the loss is averaged over the channels. + Defaults to ``False``. """ - def __init__(self, net: str = "medicalnet_resnet10_23datasets", verbose: bool = False) -> None: + def __init__( + self, net: str = "medicalnet_resnet10_23datasets", verbose: bool = False, channel_wise: bool = False + ) -> None: super().__init__() torch.hub._validate_not_a_forked_repo = lambda a, b, c: True self.model = torch.hub.load("warvito/MedicalNet-models", model=net, verbose=verbose) self.eval() + self.channel_wise = channel_wise + for param in self.parameters(): param.requires_grad = False @@ -206,20 +227,42 @@ def forward(self, input: torch.Tensor, target: torch.Tensor) -> torch.Tensor: Args: input: 3D input tensor with shape BCDHW. target: 3D target tensor with shape BCDHW. + """ input = medicalnet_intensity_normalisation(input) target = medicalnet_intensity_normalisation(target) # Get model outputs - outs_input = self.model.forward(input) - outs_target = self.model.forward(target) + feats_per_ch = 0 + for ch_idx in range(input.shape[1]): + input_channel = input[:, ch_idx, ...].unsqueeze(1) + target_channel = target[:, ch_idx, ...].unsqueeze(1) + + if ch_idx == 0: + outs_input = self.model.forward(input_channel) + outs_target = self.model.forward(target_channel) + feats_per_ch = outs_input.shape[1] + else: + outs_input = torch.cat([outs_input, self.model.forward(input_channel)], dim=1) + outs_target = torch.cat([outs_target, self.model.forward(target_channel)], dim=1) # Normalise through the channels feats_input = normalize_tensor(outs_input) feats_target = normalize_tensor(outs_target) - results: torch.Tensor = (feats_input - feats_target) ** 2 - results = spatial_average_3d(results.sum(dim=1, keepdim=True), keepdim=True) + feats_diff: torch.Tensor = (feats_input - feats_target) ** 2 + if self.channel_wise: + results = torch.zeros( + feats_diff.shape[0], input.shape[1], feats_diff.shape[2], feats_diff.shape[3], feats_diff.shape[4] + ) + for i in range(input.shape[1]): + l_idx = i * feats_per_ch + r_idx = (i + 1) * feats_per_ch + results[:, i, ...] = feats_diff[:, l_idx : i + r_idx, ...].sum(dim=1) + else: + results = feats_diff.sum(dim=1, keepdim=True) + + results = spatial_average_3d(results, keepdim=True) return results diff --git a/monai/losses/sure_loss.py b/monai/losses/sure_loss.py new file mode 100644 index 0000000000..ebf25613a6 --- /dev/null +++ b/monai/losses/sure_loss.py @@ -0,0 +1,200 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Callable, Optional + +import torch +import torch.nn as nn +from torch.nn.modules.loss import _Loss + + +def complex_diff_abs_loss(x: torch.Tensor, y: torch.Tensor) -> torch.Tensor: + """ + First compute the difference in the complex domain, + then get the absolute value and take the mse + + Args: + x, y - B, 2, H, W real valued tensors representing complex numbers + or B,1,H,W complex valued tensors + Returns: + l2_loss - scalar + """ + if not x.is_complex(): + x = torch.view_as_complex(x.permute(0, 2, 3, 1).contiguous()) + if not y.is_complex(): + y = torch.view_as_complex(y.permute(0, 2, 3, 1).contiguous()) + + diff = torch.abs(x - y) + return nn.functional.mse_loss(diff, torch.zeros_like(diff), reduction="mean") + + +def sure_loss_function( + operator: Callable, + x: torch.Tensor, + y_pseudo_gt: torch.Tensor, + y_ref: Optional[torch.Tensor] = None, + eps: Optional[float] = -1.0, + perturb_noise: Optional[torch.Tensor] = None, + complex_input: Optional[bool] = False, +) -> torch.Tensor: + """ + Args: + operator (function): The operator function that takes in an input + tensor x and returns an output tensor y. We will use this to compute + the divergence. More specifically, we will perturb the input x by a + small amount and compute the divergence between the perturbed output + and the reference output + + x (torch.Tensor): The input tensor of shape (B, C, H, W) to the + operator. For complex input, the shape is (B, 2, H, W) aka C=2 real. + For real input, the shape is (B, 1, H, W) real. + + y_pseudo_gt (torch.Tensor): The pseudo ground truth tensor of shape + (B, C, H, W) used to compute the L2 loss. For complex input, the shape is + (B, 2, H, W) aka C=2 real. For real input, the shape is (B, 1, H, W) + real. + + y_ref (torch.Tensor, optional): The reference output tensor of shape + (B, C, H, W) used to compute the divergence. Defaults to None. For + complex input, the shape is (B, 2, H, W) aka C=2 real. For real input, + the shape is (B, 1, H, W) real. + + eps (float, optional): The perturbation scalar. Set to -1 to set it + automatically estimated based on y_pseudo_gtk + + perturb_noise (torch.Tensor, optional): The noise vector of shape (B, C, H, W). + Defaults to None. For complex input, the shape is (B, 2, H, W) aka C=2 real. + For real input, the shape is (B, 1, H, W) real. + + complex_input(bool, optional): Whether the input is complex or not. + Defaults to False. + + Returns: + sure_loss (torch.Tensor): The SURE loss scalar. + """ + # perturb input + if perturb_noise is None: + perturb_noise = torch.randn_like(x) + if eps == -1.0: + eps = float(torch.abs(y_pseudo_gt.max())) / 1000 + # get y_ref if not provided + if y_ref is None: + y_ref = operator(x) + + # get perturbed output + x_perturbed = x + eps * perturb_noise + y_perturbed = operator(x_perturbed) + # divergence + divergence = torch.sum(1.0 / eps * torch.matmul(perturb_noise.permute(0, 1, 3, 2), y_perturbed - y_ref)) # type: ignore + # l2 loss between y_ref, y_pseudo_gt + if complex_input: + l2_loss = complex_diff_abs_loss(y_ref, y_pseudo_gt) + else: + # real input + l2_loss = nn.functional.mse_loss(y_ref, y_pseudo_gt, reduction="mean") + + # sure loss + sure_loss = l2_loss * divergence / (x.shape[0] * x.shape[2] * x.shape[3]) + return sure_loss + + +class SURELoss(_Loss): + """ + Calculate the Stein's Unbiased Risk Estimator (SURE) loss for a given operator. + + This is a differentiable loss function that can be used to train/guide an + operator (e.g. neural network), where the pseudo ground truth is available + but the reference ground truth is not. For example, in the MRI + reconstruction, the pseudo ground truth is the zero-filled reconstruction + and the reference ground truth is the fully sampled reconstruction. Often, + the reference ground truth is not available due to the lack of fully sampled + data. + + The original SURE loss is proposed in [1]. The SURE loss used for guiding + the diffusion model based MRI reconstruction is proposed in [2]. + + Reference + + [1] Stein, C.M.: Estimation of the mean of a multivariate normal distribution. Annals of Statistics + + [2] B. Ozturkler et al. SMRD: SURE-based Robust MRI Reconstruction with Diffusion Models. + (https://arxiv.org/pdf/2310.01799.pdf) + """ + + def __init__(self, perturb_noise: Optional[torch.Tensor] = None, eps: Optional[float] = None) -> None: + """ + Args: + perturb_noise (torch.Tensor, optional): The noise vector of shape + (B, C, H, W). Defaults to None. For complex input, the shape is (B, 2, H, W) aka C=2 real. + For real input, the shape is (B, 1, H, W) real. + + eps (float, optional): The perturbation scalar. Defaults to None. + """ + super().__init__() + self.perturb_noise = perturb_noise + self.eps = eps + + def forward( + self, + operator: Callable, + x: torch.Tensor, + y_pseudo_gt: torch.Tensor, + y_ref: Optional[torch.Tensor] = None, + complex_input: Optional[bool] = False, + ) -> torch.Tensor: + """ + Args: + operator (function): The operator function that takes in an input + tensor x and returns an output tensor y. We will use this to compute + the divergence. More specifically, we will perturb the input x by a + small amount and compute the divergence between the perturbed output + and the reference output + + x (torch.Tensor): The input tensor of shape (B, C, H, W) to the + operator. C=1 or 2: For complex input, the shape is (B, 2, H, W) aka + C=2 real. For real input, the shape is (B, 1, H, W) real. + + y_pseudo_gt (torch.Tensor): The pseudo ground truth tensor of shape + (B, C, H, W) used to compute the L2 loss. C=1 or 2: For complex + input, the shape is (B, 2, H, W) aka C=2 real. For real input, the + shape is (B, 1, H, W) real. + + y_ref (torch.Tensor, optional): The reference output tensor of the + same shape as y_pseudo_gt + + Returns: + sure_loss (torch.Tensor): The SURE loss scalar. + """ + + # check inputs shapes + if x.dim() != 4: + raise ValueError(f"Input tensor x should be 4D, got {x.dim()}.") + if y_pseudo_gt.dim() != 4: + raise ValueError(f"Input tensor y_pseudo_gt should be 4D, but got {y_pseudo_gt.dim()}.") + if y_ref is not None and y_ref.dim() != 4: + raise ValueError(f"Input tensor y_ref should be 4D, but got {y_ref.dim()}.") + if x.shape != y_pseudo_gt.shape: + raise ValueError( + f"Input tensor x and y_pseudo_gt should have the same shape, but got x shape {x.shape}, " + f"y_pseudo_gt shape {y_pseudo_gt.shape}." + ) + if y_ref is not None and y_pseudo_gt.shape != y_ref.shape: + raise ValueError( + f"Input tensor y_pseudo_gt and y_ref should have the same shape, but got y_pseudo_gt shape {y_pseudo_gt.shape}, " + f"y_ref shape {y_ref.shape}." + ) + + # compute loss + loss = sure_loss_function(operator, x, y_pseudo_gt, y_ref, self.eps, self.perturb_noise, complex_input) + + return loss diff --git a/monai/metrics/metric.py b/monai/metrics/metric.py index a6dc1a49a2..249b2dc951 100644 --- a/monai/metrics/metric.py +++ b/monai/metrics/metric.py @@ -37,6 +37,9 @@ def __call__(self, *args: Any, **kwargs: Any) -> Any: """ raise NotImplementedError(f"Subclass {self.__class__.__name__} must implement this method.") + def __str__(self): + return self.__class__.__name__ + class IterationMetric(Metric): """ diff --git a/monai/metrics/regression.py b/monai/metrics/regression.py index 9d29654ee3..4c8b8aa71b 100644 --- a/monai/metrics/regression.py +++ b/monai/metrics/regression.py @@ -303,7 +303,7 @@ def _compute_metric(self, y_pred: torch.Tensor, y: torch.Tensor) -> torch.Tensor if self.spatial_dims == 3 and dims != 5: raise ValueError( - f"y_pred should have 4 dimensions (batch, channel, height, width, depth) when using {self.spatial_dims}" + f"y_pred should have 5 dimensions (batch, channel, height, width, depth) when using {self.spatial_dims}" f" spatial dimensions, got {dims}." ) diff --git a/monai/metrics/utils.py b/monai/metrics/utils.py index e7057256fb..340e54a1d7 100644 --- a/monai/metrics/utils.py +++ b/monai/metrics/utils.py @@ -35,9 +35,9 @@ optional_import, ) -binary_erosion, _ = optional_import("scipy.ndimage.morphology", name="binary_erosion") -distance_transform_edt, _ = optional_import("scipy.ndimage.morphology", name="distance_transform_edt") -distance_transform_cdt, _ = optional_import("scipy.ndimage.morphology", name="distance_transform_cdt") +binary_erosion, _ = optional_import("scipy.ndimage", name="binary_erosion") +distance_transform_edt, _ = optional_import("scipy.ndimage", name="distance_transform_edt") +distance_transform_cdt, _ = optional_import("scipy.ndimage", name="distance_transform_cdt") __all__ = [ "ignore_background", diff --git a/monai/networks/blocks/__init__.py b/monai/networks/blocks/__init__.py index e67cb3376f..47abc4a1c4 100644 --- a/monai/networks/blocks/__init__.py +++ b/monai/networks/blocks/__init__.py @@ -17,6 +17,7 @@ from .backbone_fpn_utils import BackboneWithFPN from .convolutions import Convolution, ResidualUnit from .crf import CRF +from .crossattention import CrossAttentionBlock from .denseblock import ConvDenseBlock, DenseBlock from .dints_block import ActiConvNormBlock, FactorizedIncreaseBlock, FactorizedReduceBlock, P3DActiConvNormBlock from .downsample import MaxAvgPool @@ -30,6 +31,8 @@ from .regunet_block import RegistrationDownSampleBlock, RegistrationExtractionBlock, RegistrationResidualConvBlock from .segresnet_block import ResBlock from .selfattention import SABlock +from .spade_norm import SPADE +from .spatialattention import SpatialAttentionBlock from .squeeze_and_excitation import ( ChannelSELayer, ResidualSELayer, diff --git a/monai/networks/blocks/attention_utils.py b/monai/networks/blocks/attention_utils.py new file mode 100644 index 0000000000..8c9002a16e --- /dev/null +++ b/monai/networks/blocks/attention_utils.py @@ -0,0 +1,128 @@ +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Tuple + +import torch +import torch.nn.functional as F +from torch import nn + + +def get_rel_pos(q_size: int, k_size: int, rel_pos: torch.Tensor) -> torch.Tensor: + """ + Get relative positional embeddings according to the relative positions of + query and key sizes. + + Args: + q_size (int): size of query q. + k_size (int): size of key k. + rel_pos (Tensor): relative position embeddings (L, C). + + Returns: + Extracted positional embeddings according to relative positions. + """ + rel_pos_resized: torch.Tensor = torch.Tensor() + max_rel_dist = int(2 * max(q_size, k_size) - 1) + # Interpolate rel pos if needed. + if rel_pos.shape[0] != max_rel_dist: + # Interpolate rel pos. + rel_pos_resized = F.interpolate( + rel_pos.reshape(1, rel_pos.shape[0], -1).permute(0, 2, 1), size=max_rel_dist, mode="linear" + ) + rel_pos_resized = rel_pos_resized.reshape(-1, max_rel_dist).permute(1, 0) + else: + rel_pos_resized = rel_pos + + # Scale the coords with short length if shapes for q and k are different. + q_coords = torch.arange(q_size)[:, None] * max(k_size / q_size, 1.0) + k_coords = torch.arange(k_size)[None, :] * max(q_size / k_size, 1.0) + relative_coords = (q_coords - k_coords) + (k_size - 1) * max(q_size / k_size, 1.0) + + return rel_pos_resized[relative_coords.long()] + + +def add_decomposed_rel_pos( + attn: torch.Tensor, q: torch.Tensor, rel_pos_lst: nn.ParameterList, q_size: Tuple, k_size: Tuple +) -> torch.Tensor: + r""" + Calculate decomposed Relative Positional Embeddings from mvitv2 implementation: + https://github.com/facebookresearch/mvit/blob/19786631e330df9f3622e5402b4a419a263a2c80/mvit/models/attention.py + + Only 2D and 3D are supported. + + Encoding the relative position of tokens in the attention matrix: tokens spaced a distance + `d` apart will have the same embedding value (unlike absolute positional embedding). + + .. math:: + Attn_{logits}(Q, K) = (QK^{T} + E_{rel})*scale + + where + + .. math:: + E_{ij}^{(rel)} = Q_{i}.R_{p(i), p(j)} + + with :math:`R_{p(i), p(j)} \in R^{dim}` and :math:`p(i), p(j)`, + respectively spatial positions of element :math:`i` and :math:`j` + + When using "decomposed" relative positional embedding, positional embedding is defined ("decomposed") as follow: + + .. math:: + R_{p(i), p(j)} = R^{d1}_{d1(i), d1(j)} + ... + R^{dn}_{dn(i), dn(j)} + + with :math:`n = 1...dim` + + Decomposed relative positional embedding reduces the complexity from :math:`\mathcal{O}(d1*...*dn)` to + :math:`\mathcal{O}(d1+...+dn)` compared with classical relative positional embedding. + + Args: + attn (Tensor): attention map. + q (Tensor): query q in the attention layer with shape (B, s_dim_1 * ... * s_dim_n, C). + rel_pos_lst (ParameterList): relative position embeddings for each axis: rel_pos_lst[n] for nth axis. + q_size (Tuple): spatial sequence size of query q with (q_dim_1, ..., q_dim_n). + k_size (Tuple): spatial sequence size of key k with (k_dim_1, ..., k_dim_n). + + Returns: + attn (Tensor): attention logits with added relative positional embeddings. + """ + rh = get_rel_pos(q_size[0], k_size[0], rel_pos_lst[0]) + rw = get_rel_pos(q_size[1], k_size[1], rel_pos_lst[1]) + + batch, _, dim = q.shape + + if len(rel_pos_lst) == 2: + q_h, q_w = q_size[:2] + k_h, k_w = k_size[:2] + r_q = q.reshape(batch, q_h, q_w, dim) + rel_h = torch.einsum("bhwc,hkc->bhwk", r_q, rh) + rel_w = torch.einsum("bhwc,wkc->bhwk", r_q, rw) + + attn = (attn.view(batch, q_h, q_w, k_h, k_w) + rel_h[:, :, :, :, None] + rel_w[:, :, :, None, :]).view( + batch, q_h * q_w, k_h * k_w + ) + elif len(rel_pos_lst) == 3: + q_h, q_w, q_d = q_size[:3] + k_h, k_w, k_d = k_size[:3] + + rd = get_rel_pos(q_d, k_d, rel_pos_lst[2]) + + r_q = q.reshape(batch, q_h, q_w, q_d, dim) + rel_h = torch.einsum("bhwdc,hkc->bhwdk", r_q, rh) + rel_w = torch.einsum("bhwdc,wkc->bhwdk", r_q, rw) + rel_d = torch.einsum("bhwdc,wkc->bhwdk", r_q, rd) + + attn = ( + attn.view(batch, q_h, q_w, q_d, k_h, k_w, k_d) + + rel_h[:, :, :, :, None, None] + + rel_w[:, :, :, None, :, None] + + rel_d[:, :, :, None, None, :] + ).view(batch, q_h * q_w * q_d, k_h * k_w * k_d) + + return attn diff --git a/monai/networks/blocks/crossattention.py b/monai/networks/blocks/crossattention.py new file mode 100644 index 0000000000..dc1d5d388e --- /dev/null +++ b/monai/networks/blocks/crossattention.py @@ -0,0 +1,166 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Optional, Tuple + +import torch +import torch.nn as nn + +from monai.networks.layers.utils import get_rel_pos_embedding_layer +from monai.utils import optional_import + +Rearrange, _ = optional_import("einops.layers.torch", name="Rearrange") + + +class CrossAttentionBlock(nn.Module): + """ + A cross-attention block, based on: "Dosovitskiy et al., + An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale " + One can setup relative positional embedding as described in + """ + + def __init__( + self, + hidden_size: int, + num_heads: int, + dropout_rate: float = 0.0, + hidden_input_size: int | None = None, + context_input_size: int | None = None, + dim_head: int | None = None, + qkv_bias: bool = False, + save_attn: bool = False, + causal: bool = False, + sequence_length: int | None = None, + rel_pos_embedding: Optional[str] = None, + input_size: Optional[Tuple] = None, + attention_dtype: Optional[torch.dtype] = None, + ) -> None: + """ + Args: + hidden_size (int): dimension of hidden layer. + num_heads (int): number of attention heads. + dropout_rate (float, optional): fraction of the input units to drop. Defaults to 0.0. + hidden_input_size (int, optional): dimension of the input tensor. Defaults to hidden_size. + context_input_size (int, optional): dimension of the context tensor. Defaults to hidden_size. + dim_head (int, optional): dimension of each head. Defaults to hidden_size // num_heads. + qkv_bias (bool, optional): bias term for the qkv linear layer. Defaults to False. + save_attn (bool, optional): to make accessible the attention matrix. Defaults to False. + causal: whether to use causal attention. + sequence_length: if causal is True, it is necessary to specify the sequence length. + rel_pos_embedding (str, optional): Add relative positional embeddings to the attention map. + For now only "decomposed" is supported (see https://arxiv.org/abs/2112.01526). 2D and 3D are supported. + input_size (tuple(spatial_dim), optional): Input resolution for calculating the relative + positional parameter size. + attention_dtype: cast attention operations to this dtype. + """ + + super().__init__() + + if not (0 <= dropout_rate <= 1): + raise ValueError("dropout_rate should be between 0 and 1.") + + if dim_head: + inner_size = num_heads * dim_head + self.head_dim = dim_head + else: + if hidden_size % num_heads != 0: + raise ValueError("hidden size should be divisible by num_heads.") + inner_size = hidden_size + self.head_dim = hidden_size // num_heads + + if causal and sequence_length is None: + raise ValueError("sequence_length is necessary for causal attention.") + + self.num_heads = num_heads + self.hidden_input_size = hidden_input_size if hidden_input_size else hidden_size + self.context_input_size = context_input_size if context_input_size else hidden_size + self.out_proj = nn.Linear(inner_size, self.hidden_input_size) + # key, query, value projections + self.to_q = nn.Linear(self.hidden_input_size, inner_size, bias=qkv_bias) + self.to_k = nn.Linear(self.context_input_size, inner_size, bias=qkv_bias) + self.to_v = nn.Linear(self.context_input_size, inner_size, bias=qkv_bias) + self.input_rearrange = Rearrange("b h (l d) -> b l h d", l=num_heads) + + self.out_rearrange = Rearrange("b h l d -> b l (h d)") + self.drop_output = nn.Dropout(dropout_rate) + self.drop_weights = nn.Dropout(dropout_rate) + + self.scale = self.head_dim**-0.5 + self.save_attn = save_attn + self.attention_dtype = attention_dtype + + self.causal = causal + self.sequence_length = sequence_length + + if causal and sequence_length is not None: + # causal mask to ensure that attention is only applied to the left in the input sequence + self.register_buffer( + "causal_mask", + torch.tril(torch.ones(sequence_length, sequence_length)).view(1, 1, sequence_length, sequence_length), + ) + self.causal_mask: torch.Tensor + + self.att_mat = torch.Tensor() + self.rel_positional_embedding = ( + get_rel_pos_embedding_layer(rel_pos_embedding, input_size, self.head_dim, self.num_heads) + if rel_pos_embedding is not None + else None + ) + self.input_size = input_size + + def forward(self, x: torch.Tensor, context: torch.Tensor | None = None): + """ + Args: + x (torch.Tensor): input tensor. B x (s_dim_1 * ... * s_dim_n) x C + context (torch.Tensor, optional): context tensor. B x (s_dim_1 * ... * s_dim_n) x C + + Return: + torch.Tensor: B x (s_dim_1 * ... * s_dim_n) x C + """ + # calculate query, key, values for all heads in batch and move head forward to be the batch dim + b, t, c = x.size() # batch size, sequence length, embedding dimensionality (hidden_size) + + q = self.to_q(x) + kv = context if context is not None else x + _, kv_t, _ = kv.size() + k = self.to_k(kv) + v = self.to_v(kv) + + if self.attention_dtype is not None: + q = q.to(self.attention_dtype) + k = k.to(self.attention_dtype) + + q = q.view(b, t, self.num_heads, c // self.num_heads).transpose(1, 2) # (b, nh, t, hs) + k = k.view(b, kv_t, self.num_heads, c // self.num_heads).transpose(1, 2) # (b, nh, kv_t, hs) + v = v.view(b, kv_t, self.num_heads, c // self.num_heads).transpose(1, 2) # (b, nh, kv_t, hs) + att_mat = torch.einsum("blxd,blyd->blxy", q, k) * self.scale + + # apply relative positional embedding if defined + att_mat = self.rel_positional_embedding(x, att_mat, q) if self.rel_positional_embedding is not None else att_mat + + if self.causal: + att_mat = att_mat.masked_fill(self.causal_mask[:, :, :t, :kv_t] == 0, float("-inf")) + + att_mat = att_mat.softmax(dim=-1) + + if self.save_attn: + # no gradients and new tensor; + # https://pytorch.org/docs/stable/generated/torch.Tensor.detach.html + self.att_mat = att_mat.detach() + + att_mat = self.drop_weights(att_mat) + x = torch.einsum("bhxy,bhyd->bhxd", att_mat, v) + x = self.out_rearrange(x) + x = self.out_proj(x) + x = self.drop_output(x) + return x diff --git a/monai/networks/blocks/patchembedding.py b/monai/networks/blocks/patchembedding.py index 7d56045814..91bd73ebbb 100644 --- a/monai/networks/blocks/patchembedding.py +++ b/monai/networks/blocks/patchembedding.py @@ -120,9 +120,7 @@ def __init__( for in_size, pa_size in zip(img_size, patch_size): grid_size.append(in_size // pa_size) - with torch.no_grad(): - pos_embeddings = build_sincos_position_embedding(grid_size, hidden_size, spatial_dims) - self.position_embeddings.data.copy_(pos_embeddings.float()) + self.position_embeddings = build_sincos_position_embedding(grid_size, hidden_size, spatial_dims) else: raise ValueError(f"pos_embed_type {self.pos_embed_type} not supported.") diff --git a/monai/networks/blocks/pos_embed_utils.py b/monai/networks/blocks/pos_embed_utils.py index e03553307e..21586e56da 100644 --- a/monai/networks/blocks/pos_embed_utils.py +++ b/monai/networks/blocks/pos_embed_utils.py @@ -46,7 +46,7 @@ def build_sincos_position_embedding( temperature (float): The temperature for the sin-cos position embedding. Returns: - pos_embed (nn.Parameter): The sin-cos position embedding as a learnable parameter. + pos_embed (nn.Parameter): The sin-cos position embedding as a fixed parameter. """ if spatial_dims == 2: diff --git a/monai/networks/blocks/rel_pos_embedding.py b/monai/networks/blocks/rel_pos_embedding.py new file mode 100644 index 0000000000..e53e5841b0 --- /dev/null +++ b/monai/networks/blocks/rel_pos_embedding.py @@ -0,0 +1,56 @@ +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Iterable, Tuple + +import torch +from torch import nn + +from monai.networks.blocks.attention_utils import add_decomposed_rel_pos +from monai.utils.misc import ensure_tuple_size + + +class DecomposedRelativePosEmbedding(nn.Module): + def __init__(self, s_input_dims: Tuple[int, int] | Tuple[int, int, int], c_dim: int, num_heads: int) -> None: + """ + Args: + s_input_dims (Tuple): input spatial dimension. (H, W) or (H, W, D) + c_dim (int): channel dimension + num_heads(int): number of attention heads + """ + super().__init__() + + # validate inputs + if not isinstance(s_input_dims, Iterable) or len(s_input_dims) not in [2, 3]: + raise ValueError("s_input_dims must be set as follows: (H, W) or (H, W, D)") + + self.s_input_dims = s_input_dims + self.c_dim = c_dim + self.num_heads = num_heads + self.rel_pos_arr = nn.ParameterList( + [nn.Parameter(torch.zeros(2 * dim_input_size - 1, c_dim)) for dim_input_size in s_input_dims] + ) + + def forward(self, x: torch.Tensor, att_mat: torch.Tensor, q: torch.Tensor) -> torch.Tensor: + """""" + batch = x.shape[0] + h, w, d = ensure_tuple_size(self.s_input_dims, 3, 1) + + att_mat = add_decomposed_rel_pos( + att_mat.contiguous().view(batch * self.num_heads, h * w * d, h * w * d), + q.contiguous().view(batch * self.num_heads, h * w * d, -1), + self.rel_pos_arr, + (h, w) if d == 1 else (h, w, d), + (h, w) if d == 1 else (h, w, d), + ) + + att_mat = att_mat.reshape(batch, self.num_heads, h * w * d, h * w * d) + return att_mat diff --git a/monai/networks/blocks/selfattention.py b/monai/networks/blocks/selfattention.py index 7c81c1704f..9905e7d036 100644 --- a/monai/networks/blocks/selfattention.py +++ b/monai/networks/blocks/selfattention.py @@ -11,9 +11,12 @@ from __future__ import annotations +from typing import Optional, Tuple + import torch import torch.nn as nn +from monai.networks.layers.utils import get_rel_pos_embedding_layer from monai.utils import optional_import Rearrange, _ = optional_import("einops.layers.torch", name="Rearrange") @@ -32,6 +35,13 @@ def __init__( dropout_rate: float = 0.0, qkv_bias: bool = False, save_attn: bool = False, + dim_head: int | None = None, + hidden_input_size: int | None = None, + causal: bool = False, + sequence_length: int | None = None, + rel_pos_embedding: Optional[str] = None, + input_size: Optional[Tuple] = None, + attention_dtype: Optional[torch.dtype] = None, ) -> None: """ Args: @@ -40,6 +50,15 @@ def __init__( dropout_rate (float, optional): fraction of the input units to drop. Defaults to 0.0. qkv_bias (bool, optional): bias term for the qkv linear layer. Defaults to False. save_attn (bool, optional): to make accessible the attention matrix. Defaults to False. + dim_head (int, optional): dimension of each head. Defaults to hidden_size // num_heads. + hidden_input_size (int, optional): dimension of the input tensor. Defaults to hidden_size. + causal: whether to use causal attention (see https://arxiv.org/abs/1706.03762). + sequence_length: if causal is True, it is necessary to specify the sequence length. + rel_pos_embedding (str, optional): Add relative positional embeddings to the attention map. + For now only "decomposed" is supported (see https://arxiv.org/abs/2112.01526). 2D and 3D are supported. + input_size (tuple(spatial_dim), optional): Input resolution for calculating the relative + positional parameter size. + attention_dtype: cast attention operations to this dtype. """ @@ -51,22 +70,74 @@ def __init__( if hidden_size % num_heads != 0: raise ValueError("hidden size should be divisible by num_heads.") + if dim_head: + self.inner_dim = num_heads * dim_head + self.dim_head = dim_head + else: + if hidden_size % num_heads != 0: + raise ValueError("hidden size should be divisible by num_heads.") + self.inner_dim = hidden_size + self.dim_head = hidden_size // num_heads + + if causal and sequence_length is None: + raise ValueError("sequence_length is necessary for causal attention.") + self.num_heads = num_heads - self.out_proj = nn.Linear(hidden_size, hidden_size) - self.qkv = nn.Linear(hidden_size, hidden_size * 3, bias=qkv_bias) + self.hidden_input_size = hidden_input_size if hidden_input_size else hidden_size + self.out_proj = nn.Linear(self.inner_dim, self.hidden_input_size) + + self.qkv = nn.Linear(self.hidden_input_size, self.inner_dim * 3, bias=qkv_bias) self.input_rearrange = Rearrange("b h (qkv l d) -> qkv b l h d", qkv=3, l=num_heads) self.out_rearrange = Rearrange("b h l d -> b l (h d)") self.drop_output = nn.Dropout(dropout_rate) self.drop_weights = nn.Dropout(dropout_rate) - self.head_dim = hidden_size // num_heads - self.scale = self.head_dim**-0.5 + self.scale = self.dim_head**-0.5 self.save_attn = save_attn self.att_mat = torch.Tensor() + self.attention_dtype = attention_dtype + self.causal = causal + self.sequence_length = sequence_length + + if causal and sequence_length is not None: + # causal mask to ensure that attention is only applied to the left in the input sequence + self.register_buffer( + "causal_mask", + torch.tril(torch.ones(sequence_length, sequence_length)).view(1, 1, sequence_length, sequence_length), + ) + self.causal_mask: torch.Tensor + + self.rel_positional_embedding = ( + get_rel_pos_embedding_layer(rel_pos_embedding, input_size, self.dim_head, self.num_heads) + if rel_pos_embedding is not None + else None + ) + self.input_size = input_size def forward(self, x): + """ + Args: + x (torch.Tensor): input tensor. B x (s_dim_1 * ... * s_dim_n) x C + + Return: + torch.Tensor: B x (s_dim_1 * ... * s_dim_n) x C + """ output = self.input_rearrange(self.qkv(x)) q, k, v = output[0], output[1], output[2] - att_mat = (torch.einsum("blxd,blyd->blxy", q, k) * self.scale).softmax(dim=-1) + + if self.attention_dtype is not None: + q = q.to(self.attention_dtype) + k = k.to(self.attention_dtype) + + att_mat = torch.einsum("blxd,blyd->blxy", q, k) * self.scale + + # apply relative positional embedding if defined + att_mat = self.rel_positional_embedding(x, att_mat, q) if self.rel_positional_embedding is not None else att_mat + + if self.causal: + att_mat = att_mat.masked_fill(self.causal_mask[:, :, : x.shape[1], : x.shape[1]] == 0, float("-inf")) + + att_mat = att_mat.softmax(dim=-1) + if self.save_attn: # no gradients and new tensor; # https://pytorch.org/docs/stable/generated/torch.Tensor.detach.html diff --git a/monai/networks/blocks/spade_norm.py b/monai/networks/blocks/spade_norm.py new file mode 100644 index 0000000000..343dfa9ec0 --- /dev/null +++ b/monai/networks/blocks/spade_norm.py @@ -0,0 +1,95 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from monai.networks.blocks import Convolution +from monai.networks.layers.utils import get_norm_layer + + +class SPADE(nn.Module): + """ + Spatially Adaptive Normalization (SPADE) block, allowing for normalization of activations conditioned on a + semantic map. This block is used in SPADE-based image-to-image translation models, as described in + Semantic Image Synthesis with Spatially-Adaptive Normalization (https://arxiv.org/abs/1903.07291). + + Args: + label_nc: number of semantic labels + norm_nc: number of output channels + kernel_size: kernel size + spatial_dims: number of spatial dimensions + hidden_channels: number of channels in the intermediate gamma and beta layers + norm: type of base normalisation used before applying the SPADE normalisation + norm_params: parameters for the base normalisation + """ + + def __init__( + self, + label_nc: int, + norm_nc: int, + kernel_size: int = 3, + spatial_dims: int = 2, + hidden_channels: int = 64, + norm: str | tuple = "INSTANCE", + norm_params: dict | None = None, + ) -> None: + super().__init__() + + if norm_params is None: + norm_params = {} + if len(norm_params) != 0: + norm = (norm, norm_params) + self.param_free_norm = get_norm_layer(norm, spatial_dims=spatial_dims, channels=norm_nc) + self.mlp_shared = Convolution( + spatial_dims=spatial_dims, + in_channels=label_nc, + out_channels=hidden_channels, + kernel_size=kernel_size, + norm=None, + act="LEAKYRELU", + ) + self.mlp_gamma = Convolution( + spatial_dims=spatial_dims, + in_channels=hidden_channels, + out_channels=norm_nc, + kernel_size=kernel_size, + act=None, + ) + self.mlp_beta = Convolution( + spatial_dims=spatial_dims, + in_channels=hidden_channels, + out_channels=norm_nc, + kernel_size=kernel_size, + act=None, + ) + + def forward(self, x: torch.Tensor, segmap: torch.Tensor) -> torch.Tensor: + """ + Args: + x: input tensor with shape (B, C, [spatial-dimensions]) where C is the number of semantic channels. + segmap: input segmentation map (B, C, [spatial-dimensions]) where C is the number of semantic channels. + The map will be interpolated to the dimension of x internally. + """ + + # Part 1. generate parameter-free normalized activations + normalized = self.param_free_norm(x.contiguous()) + + # Part 2. produce scaling and bias conditioned on semantic map + segmap = F.interpolate(segmap, size=x.size()[2:], mode="nearest") + actv = self.mlp_shared(segmap) + gamma = self.mlp_gamma(actv) + beta = self.mlp_beta(actv) + out: torch.Tensor = normalized * (1 + gamma) + beta + return out diff --git a/monai/networks/blocks/spatialattention.py b/monai/networks/blocks/spatialattention.py new file mode 100644 index 0000000000..75319853d9 --- /dev/null +++ b/monai/networks/blocks/spatialattention.py @@ -0,0 +1,82 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Optional + +import torch +import torch.nn as nn + +from monai.networks.blocks import SABlock +from monai.utils import optional_import + +Rearrange, _ = optional_import("einops.layers.torch", name="Rearrange") + + +class SpatialAttentionBlock(nn.Module): + """Perform spatial self-attention on the input tensor. + + The input tensor is reshaped to B x (x_dim * y_dim [ * z_dim]) x C, where C is the number of channels, and then + self-attention is performed on the reshaped tensor. The output tensor is reshaped back to the original shape. + + Args: + spatial_dims: number of spatial dimensions, could be 1, 2, or 3. + num_channels: number of input channels. Must be divisible by num_head_channels. + num_head_channels: number of channels per head. + attention_dtype: cast attention operations to this dtype. + + """ + + def __init__( + self, + spatial_dims: int, + num_channels: int, + num_head_channels: int | None = None, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + attention_dtype: Optional[torch.dtype] = None, + ) -> None: + super().__init__() + + self.spatial_dims = spatial_dims + self.norm = nn.GroupNorm(num_groups=norm_num_groups, num_channels=num_channels, eps=norm_eps, affine=True) + # check num_head_channels is divisible by num_channels + if num_head_channels is not None and num_channels % num_head_channels != 0: + raise ValueError("num_channels must be divisible by num_head_channels") + num_heads = num_channels // num_head_channels if num_head_channels is not None else 1 + self.attn = SABlock( + hidden_size=num_channels, num_heads=num_heads, qkv_bias=True, attention_dtype=attention_dtype + ) + + def forward(self, x: torch.Tensor): + residual = x + + if self.spatial_dims == 1: + h = x.shape[2] + rearrange_input = Rearrange("b c h -> b h c") + rearrange_output = Rearrange("b h c -> b c h", h=h) + if self.spatial_dims == 2: + h, w = x.shape[2], x.shape[3] + rearrange_input = Rearrange("b c h w -> b (h w) c") + rearrange_output = Rearrange("b (h w) c -> b c h w", h=h, w=w) + else: + h, w, d = x.shape[2], x.shape[3], x.shape[4] + rearrange_input = Rearrange("b c h w d -> b (h w d) c") + rearrange_output = Rearrange("b (h w d) c -> b c h w d", h=h, w=w, d=d) + + x = self.norm(x) + x = rearrange_input(x) # B x (x_dim * y_dim [ * z_dim]) x C + + x = self.attn(x) + x = rearrange_output(x) # B x x C x x_dim * y_dim * [z_dim] + x = x + residual + return x diff --git a/monai/networks/blocks/transformerblock.py b/monai/networks/blocks/transformerblock.py index ddf959dad2..2458902cba 100644 --- a/monai/networks/blocks/transformerblock.py +++ b/monai/networks/blocks/transformerblock.py @@ -11,10 +11,10 @@ from __future__ import annotations +import torch import torch.nn as nn -from monai.networks.blocks.mlp import MLPBlock -from monai.networks.blocks.selfattention import SABlock +from monai.networks.blocks import CrossAttentionBlock, MLPBlock, SABlock class TransformerBlock(nn.Module): @@ -31,6 +31,9 @@ def __init__( dropout_rate: float = 0.0, qkv_bias: bool = False, save_attn: bool = False, + causal: bool = False, + sequence_length: int | None = None, + with_cross_attention: bool = False, ) -> None: """ Args: @@ -53,10 +56,27 @@ def __init__( self.mlp = MLPBlock(hidden_size, mlp_dim, dropout_rate) self.norm1 = nn.LayerNorm(hidden_size) - self.attn = SABlock(hidden_size, num_heads, dropout_rate, qkv_bias, save_attn) + self.attn = SABlock( + hidden_size, + num_heads, + dropout_rate, + qkv_bias=qkv_bias, + save_attn=save_attn, + causal=causal, + sequence_length=sequence_length, + ) self.norm2 = nn.LayerNorm(hidden_size) + self.with_cross_attention = with_cross_attention - def forward(self, x): + if self.with_cross_attention: + self.norm_cross_attn = nn.LayerNorm(hidden_size) + self.cross_attn = CrossAttentionBlock( + hidden_size=hidden_size, num_heads=num_heads, dropout_rate=dropout_rate, qkv_bias=qkv_bias, causal=False + ) + + def forward(self, x: torch.Tensor, context: torch.Tensor | None = None) -> torch.Tensor: x = x + self.attn(self.norm1(x)) + if self.with_cross_attention: + x = x + self.cross_attn(self.norm_cross_attn(x), context=context) x = x + self.mlp(self.norm2(x)) return x diff --git a/monai/networks/blocks/upsample.py b/monai/networks/blocks/upsample.py index dee9966919..50fd39a70b 100644 --- a/monai/networks/blocks/upsample.py +++ b/monai/networks/blocks/upsample.py @@ -17,8 +17,8 @@ import torch.nn as nn from monai.networks.layers.factories import Conv, Pad, Pool -from monai.networks.utils import icnr_init, pixelshuffle -from monai.utils import InterpolateMode, UpsampleMode, ensure_tuple_rep, look_up_option +from monai.networks.utils import CastTempType, icnr_init, pixelshuffle +from monai.utils import InterpolateMode, UpsampleMode, ensure_tuple_rep, look_up_option, pytorch_after __all__ = ["Upsample", "UpSample", "SubpixelUpsample", "Subpixelupsample", "SubpixelUpSample"] @@ -50,6 +50,7 @@ def __init__( size: tuple[int] | int | None = None, mode: UpsampleMode | str = UpsampleMode.DECONV, pre_conv: nn.Module | str | None = "default", + post_conv: nn.Module | None = None, interp_mode: str = InterpolateMode.LINEAR, align_corners: bool | None = True, bias: bool = True, @@ -71,6 +72,7 @@ def __init__( pre_conv: a conv block applied before upsampling. Defaults to "default". When ``conv_block`` is ``"default"``, one reserved conv layer will be utilized when Only used in the "nontrainable" or "pixelshuffle" mode. + post_conv: a conv block applied after upsampling. Defaults to None. Only used in the "nontrainable" mode. interp_mode: {``"nearest"``, ``"linear"``, ``"bilinear"``, ``"bicubic"``, ``"trilinear"``} Only used in the "nontrainable" mode. If ends with ``"linear"`` will use ``spatial dims`` to determine the correct interpolation. @@ -154,15 +156,25 @@ def __init__( linear_mode = [InterpolateMode.LINEAR, InterpolateMode.BILINEAR, InterpolateMode.TRILINEAR] if interp_mode in linear_mode: # choose mode based on dimensions interp_mode = linear_mode[spatial_dims - 1] - self.add_module( - "upsample_non_trainable", - nn.Upsample( - size=size, - scale_factor=None if size else scale_factor_, - mode=interp_mode.value, - align_corners=align_corners, - ), + + upsample = nn.Upsample( + size=size, + scale_factor=None if size else scale_factor_, + mode=interp_mode.value, + align_corners=align_corners, ) + + # Cast to float32 as 'upsample_nearest2d_out_frame' op does not support bfloat16 + # https://github.com/pytorch/pytorch/issues/86679. This issue is solved in PyTorch 2.1 + if pytorch_after(major=2, minor=1): + self.add_module("upsample_non_trainable", upsample) + else: + self.add_module( + "upsample_non_trainable", + CastTempType(initial_type=torch.bfloat16, temporary_type=torch.float32, submodule=upsample), + ) + if post_conv: + self.add_module("postconv", post_conv) elif up_mode == UpsampleMode.PIXELSHUFFLE: self.add_module( "pixelshuffle", diff --git a/monai/networks/layers/__init__.py b/monai/networks/layers/__init__.py index d61ed57f7f..48c10270b1 100644 --- a/monai/networks/layers/__init__.py +++ b/monai/networks/layers/__init__.py @@ -11,9 +11,10 @@ from __future__ import annotations +from .conjugate_gradient import ConjugateGradient from .convutils import calculate_out_shape, gaussian_1d, polyval, same_padding, stride_minus_kernel_padding from .drop_path import DropPath -from .factories import Act, Conv, Dropout, LayerFactory, Norm, Pad, Pool, split_args +from .factories import Act, Conv, Dropout, LayerFactory, Norm, Pad, Pool, RelPosEmbedding, split_args from .filtering import BilateralFilter, PHLFilter, TrainableBilateralFilter, TrainableJointBilateralFilter from .gmm import GaussianMixtureModel from .simplelayers import ( @@ -37,4 +38,5 @@ ) from .spatial_transforms import AffineTransform, grid_count, grid_grad, grid_pull, grid_push from .utils import get_act_layer, get_dropout_layer, get_norm_layer, get_pool_layer +from .vector_quantizer import EMAQuantizer, VectorQuantizer from .weight_init import _no_grad_trunc_normal_, trunc_normal_ diff --git a/monai/networks/layers/conjugate_gradient.py b/monai/networks/layers/conjugate_gradient.py new file mode 100644 index 0000000000..93a45930d7 --- /dev/null +++ b/monai/networks/layers/conjugate_gradient.py @@ -0,0 +1,112 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Callable + +import torch +from torch import nn + + +def _zdot(x1: torch.Tensor, x2: torch.Tensor) -> torch.Tensor: + """ + Complex dot product between tensors x1 and x2: sum(x1.*x2) + """ + if torch.is_complex(x1): + assert torch.is_complex(x2), "x1 and x2 must both be complex" + return torch.sum(x1.conj() * x2) + else: + return torch.sum(x1 * x2) + + +def _zdot_single(x: torch.Tensor) -> torch.Tensor: + """ + Complex dot product between tensor x and itself + """ + res = _zdot(x, x) + if torch.is_complex(res): + return res.real + else: + return res + + +class ConjugateGradient(nn.Module): + """ + Congugate Gradient (CG) solver for linear systems Ax = y. + + For linear_op that is positive definite and self-adjoint, CG is + guaranteed to converge CG is often used to solve linear systems of the form + Ax = y, where A is too large to store explicitly, but can be computed via a + linear operator. + + As a result, here we won't set A explicitly as a matrix, but rather as a + linear operator. For example, A could be a FFT/IFFT operation + """ + + def __init__(self, linear_op: Callable, num_iter: int): + """ + Args: + linear_op: Linear operator + num_iter: Number of iterations to run CG + """ + super().__init__() + + self.linear_op = linear_op + self.num_iter = num_iter + + def update( + self, x: torch.Tensor, p: torch.Tensor, r: torch.Tensor, rsold: torch.Tensor + ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]: + """ + perform one iteration of the CG method. It takes the current solution x, + the current search direction p, the current residual r, and the old + residual norm rsold as inputs. Then it computes the new solution, search + direction, residual, and residual norm, and returns them. + """ + + dy = self.linear_op(p) + p_dot_dy = _zdot(p, dy) + alpha = rsold / p_dot_dy + x = x + alpha * p + r = r - alpha * dy + rsnew = _zdot_single(r) + beta = rsnew / rsold + rsold = rsnew + p = beta * p + r + return x, p, r, rsold + + def forward(self, x: torch.Tensor, y: torch.Tensor) -> torch.Tensor: + """ + run conjugate gradient for num_iter iterations to solve Ax = y + + Args: + x: tensor (real or complex); Initial guess for linear system Ax = y. + The size of x should be applicable to the linear operator. For + example, if the linear operator is FFT, then x is HCHW; if the + linear operator is a matrix multiplication, then x is a vector + + y: tensor (real or complex); Measurement. Same size as x + + Returns: + x: Solution to Ax = y + """ + # Compute residual + r = y - self.linear_op(x) + rsold = _zdot_single(r) + p = r + + # Update + for _i in range(self.num_iter): + x, p, r, rsold = self.update(x, p, r, rsold) + if rsold < 1e-10: + break + return x diff --git a/monai/networks/layers/factories.py b/monai/networks/layers/factories.py index 4fc2c16f73..29b72a4f37 100644 --- a/monai/networks/layers/factories.py +++ b/monai/networks/layers/factories.py @@ -70,7 +70,7 @@ def use_factory(fact_args): from monai.networks.utils import has_nvfuser_instance_norm from monai.utils import ComponentStore, look_up_option, optional_import -__all__ = ["LayerFactory", "Dropout", "Norm", "Act", "Conv", "Pool", "Pad", "split_args"] +__all__ = ["LayerFactory", "Dropout", "Norm", "Act", "Conv", "Pool", "Pad", "RelPosEmbedding", "split_args"] class LayerFactory(ComponentStore): @@ -201,6 +201,10 @@ def split_args(args): Conv = LayerFactory(name="Convolution layers", description="Factory for creating convolution layers.") Pool = LayerFactory(name="Pooling layers", description="Factory for creating pooling layers.") Pad = LayerFactory(name="Padding layers", description="Factory for creating padding layers.") +RelPosEmbedding = LayerFactory( + name="Relative positional embedding layers", + description="Factory for creating relative positional embedding factory", +) @Dropout.factory_function("dropout") @@ -468,3 +472,10 @@ def constant_pad_factory(dim: int) -> type[nn.ConstantPad1d | nn.ConstantPad2d | """ types = (nn.ConstantPad1d, nn.ConstantPad2d, nn.ConstantPad3d) return types[dim - 1] + + +@RelPosEmbedding.factory_function("decomposed") +def decomposed_rel_pos_embedding() -> type[nn.Module]: + from monai.networks.blocks.rel_pos_embedding import DecomposedRelativePosEmbedding + + return DecomposedRelativePosEmbedding diff --git a/monai/networks/layers/simplelayers.py b/monai/networks/layers/simplelayers.py index 4ac621967f..4acd4a3622 100644 --- a/monai/networks/layers/simplelayers.py +++ b/monai/networks/layers/simplelayers.py @@ -452,7 +452,7 @@ def get_binary_kernel(window_size: Sequence[int], dtype=torch.float, device=None def median_filter( in_tensor: torch.Tensor, - kernel_size: Sequence[int] = (3, 3, 3), + kernel_size: Sequence[int] | int = (3, 3, 3), spatial_dims: int = 3, kernel: torch.Tensor | None = None, **kwargs, diff --git a/monai/networks/layers/utils.py b/monai/networks/layers/utils.py index ace1af27b6..8676f74638 100644 --- a/monai/networks/layers/utils.py +++ b/monai/networks/layers/utils.py @@ -11,9 +11,11 @@ from __future__ import annotations +from typing import Optional + import torch.nn -from monai.networks.layers.factories import Act, Dropout, Norm, Pool, split_args +from monai.networks.layers.factories import Act, Dropout, Norm, Pool, RelPosEmbedding, split_args from monai.utils import has_option __all__ = ["get_norm_layer", "get_act_layer", "get_dropout_layer", "get_pool_layer"] @@ -124,3 +126,14 @@ def get_pool_layer(name: tuple | str, spatial_dims: int | None = 1): pool_name, pool_args = split_args(name) pool_type = Pool[pool_name, spatial_dims] return pool_type(**pool_args) + + +def get_rel_pos_embedding_layer(name: tuple | str, s_input_dims: Optional[tuple], c_dim: int, num_heads: int): + embedding_name, embedding_args = split_args(name) + embedding_type = RelPosEmbedding[embedding_name] + # create a dictionary with the default values which can be overridden by embedding_args + kw_args = {"s_input_dims": s_input_dims, "c_dim": c_dim, "num_heads": num_heads, **embedding_args} + # filter out unused argument names + kw_args = {k: v for k, v in kw_args.items() if has_option(embedding_type, k)} + + return embedding_type(**kw_args) diff --git a/monai/networks/layers/vector_quantizer.py b/monai/networks/layers/vector_quantizer.py new file mode 100644 index 0000000000..9c354e1009 --- /dev/null +++ b/monai/networks/layers/vector_quantizer.py @@ -0,0 +1,233 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Sequence, Tuple + +import torch +from torch import nn + +__all__ = ["VectorQuantizer", "EMAQuantizer"] + + +class EMAQuantizer(nn.Module): + """ + Vector Quantization module using Exponential Moving Average (EMA) to learn the codebook parameters based on Neural + Discrete Representation Learning by Oord et al. (https://arxiv.org/abs/1711.00937) and the official implementation + that can be found at https://github.com/deepmind/sonnet/blob/v2/sonnet/src/nets/vqvae.py#L148 and commit + 58d9a2746493717a7c9252938da7efa6006f3739. + + This module is not compatible with TorchScript while working in a Distributed Data Parallelism Module. This is due + to lack of TorchScript support for torch.distributed module as per https://github.com/pytorch/pytorch/issues/41353 + on 22/10/2022. If you want to TorchScript your model, please turn set `ddp_sync` to False. + + Args: + spatial_dims: number of spatial dimensions of the input. + num_embeddings: number of atomic elements in the codebook. + embedding_dim: number of channels of the input and atomic elements. + commitment_cost: scaling factor of the MSE loss between input and its quantized version. Defaults to 0.25. + decay: EMA decay. Defaults to 0.99. + epsilon: epsilon value. Defaults to 1e-5. + embedding_init: initialization method for the codebook. Defaults to "normal". + ddp_sync: whether to synchronize the codebook across processes. Defaults to True. + """ + + def __init__( + self, + spatial_dims: int, + num_embeddings: int, + embedding_dim: int, + commitment_cost: float = 0.25, + decay: float = 0.99, + epsilon: float = 1e-5, + embedding_init: str = "normal", + ddp_sync: bool = True, + ): + super().__init__() + self.spatial_dims: int = spatial_dims + self.embedding_dim: int = embedding_dim + self.num_embeddings: int = num_embeddings + + assert self.spatial_dims in [2, 3], ValueError( + f"EMAQuantizer only supports 4D and 5D tensor inputs but received spatial dims {spatial_dims}." + ) + + self.embedding: torch.nn.Embedding = torch.nn.Embedding(self.num_embeddings, self.embedding_dim) + if embedding_init == "normal": + # Initialization is passed since the default one is normal inside the nn.Embedding + pass + elif embedding_init == "kaiming_uniform": + torch.nn.init.kaiming_uniform_(self.embedding.weight.data, mode="fan_in", nonlinearity="linear") + self.embedding.weight.requires_grad = False + + self.commitment_cost: float = commitment_cost + + self.register_buffer("ema_cluster_size", torch.zeros(self.num_embeddings)) + self.register_buffer("ema_w", self.embedding.weight.data.clone()) + # declare types for mypy + self.ema_cluster_size: torch.Tensor + self.ema_w: torch.Tensor + self.decay: float = decay + self.epsilon: float = epsilon + + self.ddp_sync: bool = ddp_sync + + # Precalculating required permutation shapes + self.flatten_permutation = [0] + list(range(2, self.spatial_dims + 2)) + [1] + self.quantization_permutation: Sequence[int] = [0, self.spatial_dims + 1] + list( + range(1, self.spatial_dims + 1) + ) + + def quantize(self, inputs: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """ + Given an input it projects it to the quantized space and returns additional tensors needed for EMA loss. + + Args: + inputs: Encoding space tensors of shape [B, C, H, W, D]. + + Returns: + torch.Tensor: Flatten version of the input of shape [B*H*W*D, C]. + torch.Tensor: One-hot representation of the quantization indices of shape [B*H*W*D, self.num_embeddings]. + torch.Tensor: Quantization indices of shape [B,H,W,D,1] + + """ + with torch.cuda.amp.autocast(enabled=False): + encoding_indices_view = list(inputs.shape) + del encoding_indices_view[1] + + inputs = inputs.float() + + # Converting to channel last format + flat_input = inputs.permute(self.flatten_permutation).contiguous().view(-1, self.embedding_dim) + + # Calculate Euclidean distances + distances = ( + (flat_input**2).sum(dim=1, keepdim=True) + + (self.embedding.weight.t() ** 2).sum(dim=0, keepdim=True) + - 2 * torch.mm(flat_input, self.embedding.weight.t()) + ) + + # Mapping distances to indexes + encoding_indices = torch.max(-distances, dim=1)[1] + encodings = torch.nn.functional.one_hot(encoding_indices, self.num_embeddings).float() + + # Quantize and reshape + encoding_indices = encoding_indices.view(encoding_indices_view) + + return flat_input, encodings, encoding_indices + + def embed(self, embedding_indices: torch.Tensor) -> torch.Tensor: + """ + Given encoding indices of shape [B,D,H,W,1] embeds them in the quantized space + [B, D, H, W, self.embedding_dim] and reshapes them to [B, self.embedding_dim, D, H, W] to be fed to the + decoder. + + Args: + embedding_indices: Tensor in channel last format which holds indices referencing atomic + elements from self.embedding + + Returns: + torch.Tensor: Quantize space representation of encoding_indices in channel first format. + """ + with torch.cuda.amp.autocast(enabled=False): + embedding: torch.Tensor = ( + self.embedding(embedding_indices).permute(self.quantization_permutation).contiguous() + ) + return embedding + + def distributed_synchronization(self, encodings_sum: torch.Tensor, dw: torch.Tensor) -> None: + """ + TorchScript does not support torch.distributed.all_reduce. This function is a bypassing trick based on the + example: https://pytorch.org/docs/stable/generated/torch.jit.unused.html#torch.jit.unused + + Args: + encodings_sum: The summation of one hot representation of what encoding was used for each + position. + dw: The multiplication of the one hot representation of what encoding was used for each + position with the flattened input. + + Returns: + None + """ + if self.ddp_sync and torch.distributed.is_initialized(): + torch.distributed.all_reduce(tensor=encodings_sum, op=torch.distributed.ReduceOp.SUM) + torch.distributed.all_reduce(tensor=dw, op=torch.distributed.ReduceOp.SUM) + else: + pass + + def forward(self, inputs: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + flat_input, encodings, encoding_indices = self.quantize(inputs) + quantized = self.embed(encoding_indices) + + # Use EMA to update the embedding vectors + if self.training: + with torch.no_grad(): + encodings_sum = encodings.sum(0) + dw = torch.mm(encodings.t(), flat_input) + + if self.ddp_sync: + self.distributed_synchronization(encodings_sum, dw) + + self.ema_cluster_size.data.mul_(self.decay).add_(torch.mul(encodings_sum, 1 - self.decay)) + + # Laplace smoothing of the cluster size + n = self.ema_cluster_size.sum() + weights = (self.ema_cluster_size + self.epsilon) / (n + self.num_embeddings * self.epsilon) * n + self.ema_w.data.mul_(self.decay).add_(torch.mul(dw, 1 - self.decay)) + self.embedding.weight.data.copy_(self.ema_w / weights.unsqueeze(1)) + + # Encoding Loss + loss = self.commitment_cost * torch.nn.functional.mse_loss(quantized.detach(), inputs) + + # Straight Through Estimator + quantized = inputs + (quantized - inputs).detach() + + return quantized, loss, encoding_indices + + +class VectorQuantizer(torch.nn.Module): + """ + Vector Quantization wrapper that is needed as a workaround for the AMP to isolate the non fp16 compatible parts of + the quantization in their own class. + + Args: + quantizer (torch.nn.Module): Quantizer module that needs to return its quantized representation, loss and index + based quantized representation. + """ + + def __init__(self, quantizer: EMAQuantizer): + super().__init__() + + self.quantizer: EMAQuantizer = quantizer + + self.perplexity: torch.Tensor = torch.rand(1) + + def forward(self, inputs: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]: + quantized, loss, encoding_indices = self.quantizer(inputs) + # Perplexity calculations + avg_probs = ( + torch.histc(encoding_indices.float(), bins=self.quantizer.num_embeddings, max=self.quantizer.num_embeddings) + .float() + .div(encoding_indices.numel()) + ) + + self.perplexity = torch.exp(-torch.sum(avg_probs * torch.log(avg_probs + 1e-10))) + + return loss, quantized + + def embed(self, embedding_indices: torch.Tensor) -> torch.Tensor: + return self.quantizer.embed(embedding_indices=embedding_indices) + + def quantize(self, encodings: torch.Tensor) -> torch.Tensor: + output = self.quantizer(encodings) + encoding_indices: torch.Tensor = output[2] + return encoding_indices diff --git a/monai/networks/nets/__init__.py b/monai/networks/nets/__init__.py index 9247aaee85..c777fe6442 100644 --- a/monai/networks/nets/__init__.py +++ b/monai/networks/nets/__init__.py @@ -14,9 +14,11 @@ from .ahnet import AHnet, Ahnet, AHNet from .attentionunet import AttentionUnet from .autoencoder import AutoEncoder +from .autoencoderkl import AutoencoderKL from .basic_unet import BasicUNet, BasicUnet, Basicunet, basicunet from .basic_unetplusplus import BasicUNetPlusPlus, BasicUnetPlusPlus, BasicunetPlusPlus, basicunetplusplus from .classifier import Classifier, Critic, Discriminator +from .controlnet import ControlNet from .daf3d import DAF3D from .densenet import ( DenseNet, @@ -34,6 +36,7 @@ densenet201, densenet264, ) +from .diffusion_model_unet import DiffusionModelUNet from .dints import DiNTS, TopologyConstruction, TopologyInstance, TopologySearch from .dynunet import DynUNet, DynUnet, Dynunet from .efficientnet import ( @@ -52,6 +55,7 @@ from .hovernet import Hovernet, HoVernet, HoVerNet, HoverNet from .milmodel import MILModel from .netadapter import NetAdapter +from .patchgan_discriminator import MultiScalePatchDiscriminator, PatchDiscriminator from .quicknat import Quicknat from .regressor import Regressor from .regunet import GlobalNet, LocalNet, RegUNet @@ -59,6 +63,8 @@ ResNet, ResNetBlock, ResNetBottleneck, + ResNetEncoder, + ResNetFeatures, get_medicalnet_pretrained_resnet_args, get_pretrained_resnet_medicalnet, resnet10, @@ -102,9 +108,13 @@ seresnext50, seresnext101, ) +from .spade_autoencoderkl import SPADEAutoencoderKL +from .spade_diffusion_model_unet import SPADEDiffusionModelUNet +from .spade_network import SPADENet from .swin_unetr import PatchMerging, PatchMergingV2, SwinUNETR from .torchvision_fc import TorchVisionFCModel from .transchex import BertAttention, BertMixedLayer, BertOutput, BertPreTrainedModel, MultiModal, Pooler, Transchex +from .transformer import DecoderOnlyTransformer from .unet import UNet, Unet from .unetr import UNETR from .varautoencoder import VarAutoEncoder @@ -112,3 +122,4 @@ from .vitautoenc import ViTAutoEnc from .vnet import VNet from .voxelmorph import VoxelMorph, VoxelMorphUNet +from .vqvae import VQVAE diff --git a/monai/networks/nets/attentionunet.py b/monai/networks/nets/attentionunet.py index 5689cf1071..fdf31d9701 100644 --- a/monai/networks/nets/attentionunet.py +++ b/monai/networks/nets/attentionunet.py @@ -29,7 +29,7 @@ def __init__( spatial_dims: int, in_channels: int, out_channels: int, - kernel_size: int = 3, + kernel_size: Sequence[int] | int = 3, strides: int = 1, dropout=0.0, ): @@ -219,7 +219,13 @@ def __init__( self.kernel_size = kernel_size self.dropout = dropout - head = ConvBlock(spatial_dims=spatial_dims, in_channels=in_channels, out_channels=channels[0], dropout=dropout) + head = ConvBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=channels[0], + dropout=dropout, + kernel_size=self.kernel_size, + ) reduce_channels = Convolution( spatial_dims=spatial_dims, in_channels=channels[0], @@ -245,6 +251,7 @@ def _create_block(channels: Sequence[int], strides: Sequence[int]) -> nn.Module: out_channels=channels[1], strides=strides[0], dropout=self.dropout, + kernel_size=self.kernel_size, ), subblock, ), @@ -271,6 +278,7 @@ def _get_bottom_layer(self, in_channels: int, out_channels: int, strides: int) - out_channels=out_channels, strides=strides, dropout=self.dropout, + kernel_size=self.kernel_size, ), up_kernel_size=self.up_kernel_size, strides=strides, diff --git a/monai/networks/nets/autoencoderkl.py b/monai/networks/nets/autoencoderkl.py new file mode 100644 index 0000000000..35d80e0565 --- /dev/null +++ b/monai/networks/nets/autoencoderkl.py @@ -0,0 +1,702 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from collections.abc import Sequence +from typing import List + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from monai.networks.blocks import Convolution, SpatialAttentionBlock, Upsample +from monai.utils import ensure_tuple_rep, optional_import + +Rearrange, _ = optional_import("einops.layers.torch", name="Rearrange") + +__all__ = ["AutoencoderKL"] + + +class AsymmetricPad(nn.Module): + """ + Pad the input tensor asymmetrically along every spatial dimension. + + Args: + spatial_dims: number of spatial dimensions, could be 1, 2, or 3. + """ + + def __init__(self, spatial_dims: int) -> None: + super().__init__() + self.pad = (0, 1) * spatial_dims + + def forward(self, x: torch.Tensor) -> torch.Tensor: + x = nn.functional.pad(x, self.pad, mode="constant", value=0.0) + return x + + +class AEKLDownsample(nn.Module): + """ + Convolution-based downsampling layer. + + Args: + spatial_dims: number of spatial dimensions (1D, 2D, 3D). + in_channels: number of input channels. + """ + + def __init__(self, spatial_dims: int, in_channels: int) -> None: + super().__init__() + self.pad = AsymmetricPad(spatial_dims=spatial_dims) + + self.conv = Convolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=in_channels, + strides=2, + kernel_size=3, + padding=0, + conv_only=True, + ) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + x = self.pad(x) + x = self.conv(x) + return x + + +class AEKLResBlock(nn.Module): + """ + Residual block consisting of a cascade of 2 convolutions + activation + normalisation block, and a + residual connection between input and output. + + Args: + spatial_dims: number of spatial dimensions, could be 1, 2, or 3. + in_channels: input channels to the layer. + norm_num_groups: number of groups involved for the group normalisation layer. Ensure that your number of + channels is divisible by this number. + norm_eps: epsilon for the normalisation. + out_channels: number of output channels. + """ + + def __init__( + self, spatial_dims: int, in_channels: int, norm_num_groups: int, norm_eps: float, out_channels: int + ) -> None: + super().__init__() + self.in_channels = in_channels + self.out_channels = in_channels if out_channels is None else out_channels + + self.norm1 = nn.GroupNorm(num_groups=norm_num_groups, num_channels=in_channels, eps=norm_eps, affine=True) + self.conv1 = Convolution( + spatial_dims=spatial_dims, + in_channels=self.in_channels, + out_channels=self.out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + self.norm2 = nn.GroupNorm(num_groups=norm_num_groups, num_channels=out_channels, eps=norm_eps, affine=True) + self.conv2 = Convolution( + spatial_dims=spatial_dims, + in_channels=self.out_channels, + out_channels=self.out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + + self.nin_shortcut: nn.Module + if self.in_channels != self.out_channels: + self.nin_shortcut = Convolution( + spatial_dims=spatial_dims, + in_channels=self.in_channels, + out_channels=self.out_channels, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + ) + else: + self.nin_shortcut = nn.Identity() + + def forward(self, x: torch.Tensor) -> torch.Tensor: + h = x + h = self.norm1(h) + h = F.silu(h) + h = self.conv1(h) + + h = self.norm2(h) + h = F.silu(h) + h = self.conv2(h) + + x = self.nin_shortcut(x) + + return x + h + + +class Encoder(nn.Module): + """ + Convolutional cascade that downsamples the image into a spatial latent space. + + Args: + spatial_dims: number of spatial dimensions, could be 1, 2, or 3. + in_channels: number of input channels. + channels: sequence of block output channels. + out_channels: number of channels in the bottom layer (latent space) of the autoencoder. + num_res_blocks: number of residual blocks (see _ResBlock) per level. + norm_num_groups: number of groups for the GroupNorm layers, num_channels must be divisible by this number. + norm_eps: epsilon for the normalization. + attention_levels: indicate which level from num_channels contain an attention block. + with_nonlocal_attn: if True use non-local attention block. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + channels: Sequence[int], + out_channels: int, + num_res_blocks: Sequence[int], + norm_num_groups: int, + norm_eps: float, + attention_levels: Sequence[bool], + with_nonlocal_attn: bool = True, + ) -> None: + super().__init__() + self.spatial_dims = spatial_dims + self.in_channels = in_channels + self.channels = channels + self.out_channels = out_channels + self.num_res_blocks = num_res_blocks + self.norm_num_groups = norm_num_groups + self.norm_eps = norm_eps + self.attention_levels = attention_levels + + blocks: List[nn.Module] = [] + # Initial convolution + blocks.append( + Convolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=channels[0], + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + ) + + # Residual and downsampling blocks + output_channel = channels[0] + for i in range(len(channels)): + input_channel = output_channel + output_channel = channels[i] + is_final_block = i == len(channels) - 1 + + for _ in range(self.num_res_blocks[i]): + blocks.append( + AEKLResBlock( + spatial_dims=spatial_dims, + in_channels=input_channel, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + out_channels=output_channel, + ) + ) + input_channel = output_channel + if attention_levels[i]: + blocks.append( + SpatialAttentionBlock( + spatial_dims=spatial_dims, + num_channels=input_channel, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + ) + + if not is_final_block: + blocks.append(AEKLDownsample(spatial_dims=spatial_dims, in_channels=input_channel)) + # Non-local attention block + if with_nonlocal_attn is True: + blocks.append( + AEKLResBlock( + spatial_dims=spatial_dims, + in_channels=channels[-1], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + out_channels=channels[-1], + ) + ) + + blocks.append( + SpatialAttentionBlock( + spatial_dims=spatial_dims, + num_channels=channels[-1], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + ) + blocks.append( + AEKLResBlock( + spatial_dims=spatial_dims, + in_channels=channels[-1], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + out_channels=channels[-1], + ) + ) + # Normalise and convert to latent size + blocks.append(nn.GroupNorm(num_groups=norm_num_groups, num_channels=channels[-1], eps=norm_eps, affine=True)) + blocks.append( + Convolution( + spatial_dims=self.spatial_dims, + in_channels=channels[-1], + out_channels=out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + ) + + self.blocks = nn.ModuleList(blocks) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + for block in self.blocks: + x = block(x) + return x + + +class Decoder(nn.Module): + """ + Convolutional cascade upsampling from a spatial latent space into an image space. + + Args: + spatial_dims: number of spatial dimensions, could be 1, 2, or 3. + channels: sequence of block output channels. + in_channels: number of channels in the bottom layer (latent space) of the autoencoder. + out_channels: number of output channels. + num_res_blocks: number of residual blocks (see _ResBlock) per level. + norm_num_groups: number of groups for the GroupNorm layers, num_channels must be divisible by this number. + norm_eps: epsilon for the normalization. + attention_levels: indicate which level from num_channels contain an attention block. + with_nonlocal_attn: if True use non-local attention block. + use_convtranspose: if True, use ConvTranspose to upsample feature maps in decoder. + """ + + def __init__( + self, + spatial_dims: int, + channels: Sequence[int], + in_channels: int, + out_channels: int, + num_res_blocks: Sequence[int], + norm_num_groups: int, + norm_eps: float, + attention_levels: Sequence[bool], + with_nonlocal_attn: bool = True, + use_convtranspose: bool = False, + ) -> None: + super().__init__() + self.spatial_dims = spatial_dims + self.channels = channels + self.in_channels = in_channels + self.out_channels = out_channels + self.num_res_blocks = num_res_blocks + self.norm_num_groups = norm_num_groups + self.norm_eps = norm_eps + self.attention_levels = attention_levels + + reversed_block_out_channels = list(reversed(channels)) + + blocks: List[nn.Module] = [] + + # Initial convolution + blocks.append( + Convolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=reversed_block_out_channels[0], + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + ) + + # Non-local attention block + if with_nonlocal_attn is True: + blocks.append( + AEKLResBlock( + spatial_dims=spatial_dims, + in_channels=reversed_block_out_channels[0], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + out_channels=reversed_block_out_channels[0], + ) + ) + blocks.append( + SpatialAttentionBlock( + spatial_dims=spatial_dims, + num_channels=reversed_block_out_channels[0], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + ) + blocks.append( + AEKLResBlock( + spatial_dims=spatial_dims, + in_channels=reversed_block_out_channels[0], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + out_channels=reversed_block_out_channels[0], + ) + ) + + reversed_attention_levels = list(reversed(attention_levels)) + reversed_num_res_blocks = list(reversed(num_res_blocks)) + block_out_ch = reversed_block_out_channels[0] + for i in range(len(reversed_block_out_channels)): + block_in_ch = block_out_ch + block_out_ch = reversed_block_out_channels[i] + is_final_block = i == len(channels) - 1 + + for _ in range(reversed_num_res_blocks[i]): + blocks.append( + AEKLResBlock( + spatial_dims=spatial_dims, + in_channels=block_in_ch, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + out_channels=block_out_ch, + ) + ) + block_in_ch = block_out_ch + + if reversed_attention_levels[i]: + blocks.append( + SpatialAttentionBlock( + spatial_dims=spatial_dims, + num_channels=block_in_ch, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + ) + + if not is_final_block: + if use_convtranspose: + blocks.append( + Upsample( + spatial_dims=spatial_dims, mode="deconv", in_channels=block_in_ch, out_channels=block_in_ch + ) + ) + else: + post_conv = Convolution( + spatial_dims=spatial_dims, + in_channels=block_in_ch, + out_channels=block_in_ch, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + blocks.append( + Upsample( + spatial_dims=spatial_dims, + mode="nontrainable", + in_channels=block_in_ch, + out_channels=block_in_ch, + interp_mode="nearest", + scale_factor=2.0, + post_conv=post_conv, + align_corners=None, + ) + ) + + blocks.append(nn.GroupNorm(num_groups=norm_num_groups, num_channels=block_in_ch, eps=norm_eps, affine=True)) + blocks.append( + Convolution( + spatial_dims=spatial_dims, + in_channels=block_in_ch, + out_channels=out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + ) + + self.blocks = nn.ModuleList(blocks) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + for block in self.blocks: + x = block(x) + return x + + +class AutoencoderKL(nn.Module): + """ + Autoencoder model with KL-regularized latent space based on + Rombach et al. "High-Resolution Image Synthesis with Latent Diffusion Models" https://arxiv.org/abs/2112.10752 + and Pinaya et al. "Brain Imaging Generation with Latent Diffusion Models" https://arxiv.org/abs/2209.07162 + + Args: + spatial_dims: number of spatial dimensions, could be 1, 2, or 3. + in_channels: number of input channels. + out_channels: number of output channels. + num_res_blocks: number of residual blocks (see _ResBlock) per level. + channels: number of output channels for each block. + attention_levels: sequence of levels to add attention. + latent_channels: latent embedding dimension. + norm_num_groups: number of groups for the GroupNorm layers, num_channels must be divisible by this number. + norm_eps: epsilon for the normalization. + with_encoder_nonlocal_attn: if True use non-local attention block in the encoder. + with_decoder_nonlocal_attn: if True use non-local attention block in the decoder. + use_checkpoint: if True, use activation checkpoint to save memory. + use_convtranspose: if True, use ConvTranspose to upsample feature maps in decoder. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int = 1, + out_channels: int = 1, + num_res_blocks: Sequence[int] | int = (2, 2, 2, 2), + channels: Sequence[int] = (32, 64, 64, 64), + attention_levels: Sequence[bool] = (False, False, True, True), + latent_channels: int = 3, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + with_encoder_nonlocal_attn: bool = True, + with_decoder_nonlocal_attn: bool = True, + use_checkpoint: bool = False, + use_convtranspose: bool = False, + ) -> None: + super().__init__() + + # All number of channels should be multiple of num_groups + if any((out_channel % norm_num_groups) != 0 for out_channel in channels): + raise ValueError("AutoencoderKL expects all num_channels being multiple of norm_num_groups") + + if len(channels) != len(attention_levels): + raise ValueError("AutoencoderKL expects num_channels being same size of attention_levels") + + if isinstance(num_res_blocks, int): + num_res_blocks = ensure_tuple_rep(num_res_blocks, len(channels)) + + if len(num_res_blocks) != len(channels): + raise ValueError( + "`num_res_blocks` should be a single integer or a tuple of integers with the same length as " + "`num_channels`." + ) + + self.encoder = Encoder( + spatial_dims=spatial_dims, + in_channels=in_channels, + channels=channels, + out_channels=latent_channels, + num_res_blocks=num_res_blocks, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + attention_levels=attention_levels, + with_nonlocal_attn=with_encoder_nonlocal_attn, + ) + self.decoder = Decoder( + spatial_dims=spatial_dims, + channels=channels, + in_channels=latent_channels, + out_channels=out_channels, + num_res_blocks=num_res_blocks, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + attention_levels=attention_levels, + with_nonlocal_attn=with_decoder_nonlocal_attn, + use_convtranspose=use_convtranspose, + ) + self.quant_conv_mu = Convolution( + spatial_dims=spatial_dims, + in_channels=latent_channels, + out_channels=latent_channels, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + ) + self.quant_conv_log_sigma = Convolution( + spatial_dims=spatial_dims, + in_channels=latent_channels, + out_channels=latent_channels, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + ) + self.post_quant_conv = Convolution( + spatial_dims=spatial_dims, + in_channels=latent_channels, + out_channels=latent_channels, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + ) + self.latent_channels = latent_channels + self.use_checkpoint = use_checkpoint + + def encode(self, x: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor]: + """ + Forwards an image through the spatial encoder, obtaining the latent mean and sigma representations. + + Args: + x: BxCx[SPATIAL DIMS] tensor + + """ + if self.use_checkpoint: + h = torch.utils.checkpoint.checkpoint(self.encoder, x, use_reentrant=False) + else: + h = self.encoder(x) + + z_mu = self.quant_conv_mu(h) + z_log_var = self.quant_conv_log_sigma(h) + z_log_var = torch.clamp(z_log_var, -30.0, 20.0) + z_sigma = torch.exp(z_log_var / 2) + + return z_mu, z_sigma + + def sampling(self, z_mu: torch.Tensor, z_sigma: torch.Tensor) -> torch.Tensor: + """ + From the mean and sigma representations resulting of encoding an image through the latent space, + obtains a noise sample resulting from sampling gaussian noise, multiplying by the variance (sigma) and + adding the mean. + + Args: + z_mu: Bx[Z_CHANNELS]x[LATENT SPACE SIZE] mean vector obtained by the encoder when you encode an image + z_sigma: Bx[Z_CHANNELS]x[LATENT SPACE SIZE] variance vector obtained by the encoder when you encode an image + + Returns: + sample of shape Bx[Z_CHANNELS]x[LATENT SPACE SIZE] + """ + eps = torch.randn_like(z_sigma) + z_vae = z_mu + eps * z_sigma + return z_vae + + def reconstruct(self, x: torch.Tensor) -> torch.Tensor: + """ + Encodes and decodes an input image. + + Args: + x: BxCx[SPATIAL DIMENSIONS] tensor. + + Returns: + reconstructed image, of the same shape as input + """ + z_mu, _ = self.encode(x) + reconstruction = self.decode(z_mu) + return reconstruction + + def decode(self, z: torch.Tensor) -> torch.Tensor: + """ + Based on a latent space sample, forwards it through the Decoder. + + Args: + z: Bx[Z_CHANNELS]x[LATENT SPACE SHAPE] + + Returns: + decoded image tensor + """ + z = self.post_quant_conv(z) + dec: torch.Tensor + if self.use_checkpoint: + dec = torch.utils.checkpoint.checkpoint(self.decoder, z, use_reentrant=False) + else: + dec = self.decoder(z) + return dec + + def forward(self, x: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + z_mu, z_sigma = self.encode(x) + z = self.sampling(z_mu, z_sigma) + reconstruction = self.decode(z) + return reconstruction, z_mu, z_sigma + + def encode_stage_2_inputs(self, x: torch.Tensor) -> torch.Tensor: + z_mu, z_sigma = self.encode(x) + z = self.sampling(z_mu, z_sigma) + return z + + def decode_stage_2_outputs(self, z: torch.Tensor) -> torch.Tensor: + image = self.decode(z) + return image + + def load_old_state_dict(self, old_state_dict: dict, verbose=False) -> None: + """ + Load a state dict from an AutoencoderKL trained with [MONAI Generative](https://github.com/Project-MONAI/GenerativeModels). + + Args: + old_state_dict: state dict from the old AutoencoderKL model. + """ + + new_state_dict = self.state_dict() + # if all keys match, just load the state dict + if all(k in new_state_dict for k in old_state_dict): + print("All keys match, loading state dict.") + self.load_state_dict(old_state_dict) + return + + if verbose: + # print all new_state_dict keys that are not in old_state_dict + for k in new_state_dict: + if k not in old_state_dict: + print(f"key {k} not found in old state dict") + # and vice versa + print("----------------------------------------------") + for k in old_state_dict: + if k not in new_state_dict: + print(f"key {k} not found in new state dict") + + # copy over all matching keys + for k in new_state_dict: + if k in old_state_dict: + new_state_dict[k] = old_state_dict[k] + + # fix the attention blocks + attention_blocks = [k.replace(".attn.qkv.weight", "") for k in new_state_dict if "attn.qkv.weight" in k] + for block in attention_blocks: + new_state_dict[f"{block}.attn.qkv.weight"] = torch.cat( + [ + old_state_dict[f"{block}.to_q.weight"], + old_state_dict[f"{block}.to_k.weight"], + old_state_dict[f"{block}.to_v.weight"], + ], + dim=0, + ) + new_state_dict[f"{block}.attn.qkv.bias"] = torch.cat( + [ + old_state_dict[f"{block}.to_q.bias"], + old_state_dict[f"{block}.to_k.bias"], + old_state_dict[f"{block}.to_v.bias"], + ], + dim=0, + ) + # old version did not have a projection so set these to the identity + new_state_dict[f"{block}.attn.out_proj.weight"] = torch.eye( + new_state_dict[f"{block}.attn.out_proj.weight"].shape[0] + ) + new_state_dict[f"{block}.attn.out_proj.bias"] = torch.zeros( + new_state_dict[f"{block}.attn.out_proj.bias"].shape + ) + + # fix the upsample conv blocks which were renamed postconv + for k in new_state_dict: + if "postconv" in k: + old_name = k.replace("postconv", "conv") + new_state_dict[k] = old_state_dict[old_name] + self.load_state_dict(new_state_dict) diff --git a/monai/networks/nets/controlnet.py b/monai/networks/nets/controlnet.py new file mode 100644 index 0000000000..ed3654733d --- /dev/null +++ b/monai/networks/nets/controlnet.py @@ -0,0 +1,465 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ========================================================================= +# Adapted from https://github.com/huggingface/diffusers +# which has the following license: +# https://github.com/huggingface/diffusers/blob/main/LICENSE +# +# Copyright 2022 UC Berkeley Team and The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================================================================= + +from __future__ import annotations + +from collections.abc import Sequence + +import torch +from torch import nn + +from monai.networks.blocks import Convolution +from monai.networks.nets.diffusion_model_unet import get_down_block, get_mid_block, get_timestep_embedding +from monai.utils import ensure_tuple_rep + + +class ControlNetConditioningEmbedding(nn.Module): + """ + Network to encode the conditioning into a latent space. + """ + + def __init__(self, spatial_dims: int, in_channels: int, out_channels: int, channels: Sequence[int]): + super().__init__() + + self.conv_in = Convolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=channels[0], + strides=1, + kernel_size=3, + padding=1, + adn_ordering="A", + act="SWISH", + ) + + self.blocks = nn.ModuleList([]) + + for i in range(len(channels) - 1): + channel_in = channels[i] + channel_out = channels[i + 1] + self.blocks.append( + Convolution( + spatial_dims=spatial_dims, + in_channels=channel_in, + out_channels=channel_in, + strides=1, + kernel_size=3, + padding=1, + adn_ordering="A", + act="SWISH", + ) + ) + + self.blocks.append( + Convolution( + spatial_dims=spatial_dims, + in_channels=channel_in, + out_channels=channel_out, + strides=2, + kernel_size=3, + padding=1, + adn_ordering="A", + act="SWISH", + ) + ) + + self.conv_out = zero_module( + Convolution( + spatial_dims=spatial_dims, + in_channels=channels[-1], + out_channels=out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + ) + + def forward(self, conditioning): + embedding = self.conv_in(conditioning) + + for block in self.blocks: + embedding = block(embedding) + + embedding = self.conv_out(embedding) + + return embedding + + +def zero_module(module): + for p in module.parameters(): + nn.init.zeros_(p) + return module + + +class ControlNet(nn.Module): + """ + Control network for diffusion models based on Zhang and Agrawala "Adding Conditional Control to Text-to-Image + Diffusion Models" (https://arxiv.org/abs/2302.05543) + + Args: + spatial_dims: number of spatial dimensions. + in_channels: number of input channels. + num_res_blocks: number of residual blocks (see ResnetBlock) per level. + channels: tuple of block output channels. + attention_levels: list of levels to add attention. + norm_num_groups: number of groups for the normalization. + norm_eps: epsilon for the normalization. + resblock_updown: if True use residual blocks for up/downsampling. + num_head_channels: number of channels in each attention head. + with_conditioning: if True add spatial transformers to perform conditioning. + transformer_num_layers: number of layers of Transformer blocks to use. + cross_attention_dim: number of context dimensions to use. + num_class_embeds: if specified (as an int), then this model will be class-conditional with `num_class_embeds` + classes. + upcast_attention: if True, upcast attention operations to full precision. + conditioning_embedding_in_channels: number of input channels for the conditioning embedding. + conditioning_embedding_num_channels: number of channels for the blocks in the conditioning embedding. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + num_res_blocks: Sequence[int] | int = (2, 2, 2, 2), + channels: Sequence[int] = (32, 64, 64, 64), + attention_levels: Sequence[bool] = (False, False, True, True), + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + resblock_updown: bool = False, + num_head_channels: int | Sequence[int] = 8, + with_conditioning: bool = False, + transformer_num_layers: int = 1, + cross_attention_dim: int | None = None, + num_class_embeds: int | None = None, + upcast_attention: bool = False, + conditioning_embedding_in_channels: int = 1, + conditioning_embedding_num_channels: Sequence[int] = (16, 32, 96, 256), + ) -> None: + super().__init__() + if with_conditioning is True and cross_attention_dim is None: + raise ValueError( + "DiffusionModelUNet expects dimension of the cross-attention conditioning (cross_attention_dim) " + "to be specified when with_conditioning=True." + ) + if cross_attention_dim is not None and with_conditioning is False: + raise ValueError( + "DiffusionModelUNet expects with_conditioning=True when specifying the cross_attention_dim." + ) + + # All number of channels should be multiple of num_groups + if any((out_channel % norm_num_groups) != 0 for out_channel in channels): + raise ValueError( + f"DiffusionModelUNet expects all channels to be a multiple of norm_num_groups, but got" + f" channels={channels} and norm_num_groups={norm_num_groups}" + ) + + if len(channels) != len(attention_levels): + raise ValueError( + f"DiffusionModelUNet expects channels to have the same length as attention_levels, but got " + f"channels={channels} and attention_levels={attention_levels}" + ) + + if isinstance(num_head_channels, int): + num_head_channels = ensure_tuple_rep(num_head_channels, len(attention_levels)) + + if len(num_head_channels) != len(attention_levels): + raise ValueError( + f"num_head_channels should have the same length as attention_levels, but got channels={channels} and " + f"attention_levels={attention_levels} . For the i levels without attention," + " i.e. `attention_level[i]=False`, the num_head_channels[i] will be ignored." + ) + + if isinstance(num_res_blocks, int): + num_res_blocks = ensure_tuple_rep(num_res_blocks, len(channels)) + + if len(num_res_blocks) != len(channels): + raise ValueError( + f"`num_res_blocks` should be a single integer or a tuple of integers with the same length as " + f"`num_channels`, but got num_res_blocks={num_res_blocks} and channels={channels}." + ) + + self.in_channels = in_channels + self.block_out_channels = channels + self.num_res_blocks = num_res_blocks + self.attention_levels = attention_levels + self.num_head_channels = num_head_channels + self.with_conditioning = with_conditioning + + # input + self.conv_in = Convolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=channels[0], + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + + # time + time_embed_dim = channels[0] * 4 + self.time_embed = nn.Sequential( + nn.Linear(channels[0], time_embed_dim), nn.SiLU(), nn.Linear(time_embed_dim, time_embed_dim) + ) + + # class embedding + self.num_class_embeds = num_class_embeds + if num_class_embeds is not None: + self.class_embedding = nn.Embedding(num_class_embeds, time_embed_dim) + + # control net conditioning embedding + self.controlnet_cond_embedding = ControlNetConditioningEmbedding( + spatial_dims=spatial_dims, + in_channels=conditioning_embedding_in_channels, + channels=conditioning_embedding_num_channels, + out_channels=channels[0], + ) + + # down + self.down_blocks = nn.ModuleList([]) + self.controlnet_down_blocks = nn.ModuleList([]) + output_channel = channels[0] + + controlnet_block = Convolution( + spatial_dims=spatial_dims, + in_channels=output_channel, + out_channels=output_channel, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + ) + controlnet_block = zero_module(controlnet_block.conv) + self.controlnet_down_blocks.append(controlnet_block) + + for i in range(len(channels)): + input_channel = output_channel + output_channel = channels[i] + is_final_block = i == len(channels) - 1 + + down_block = get_down_block( + spatial_dims=spatial_dims, + in_channels=input_channel, + out_channels=output_channel, + temb_channels=time_embed_dim, + num_res_blocks=num_res_blocks[i], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_downsample=not is_final_block, + resblock_updown=resblock_updown, + with_attn=(attention_levels[i] and not with_conditioning), + with_cross_attn=(attention_levels[i] and with_conditioning), + num_head_channels=num_head_channels[i], + transformer_num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + ) + + self.down_blocks.append(down_block) + + for _ in range(num_res_blocks[i]): + controlnet_block = Convolution( + spatial_dims=spatial_dims, + in_channels=output_channel, + out_channels=output_channel, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + ) + controlnet_block = zero_module(controlnet_block) + self.controlnet_down_blocks.append(controlnet_block) + # + if not is_final_block: + controlnet_block = Convolution( + spatial_dims=spatial_dims, + in_channels=output_channel, + out_channels=output_channel, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + ) + controlnet_block = zero_module(controlnet_block) + self.controlnet_down_blocks.append(controlnet_block) + + # mid + mid_block_channel = channels[-1] + + self.middle_block = get_mid_block( + spatial_dims=spatial_dims, + in_channels=mid_block_channel, + temb_channels=time_embed_dim, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + with_conditioning=with_conditioning, + num_head_channels=num_head_channels[-1], + transformer_num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + ) + + controlnet_block = Convolution( + spatial_dims=spatial_dims, + in_channels=output_channel, + out_channels=output_channel, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + ) + controlnet_block = zero_module(controlnet_block) + self.controlnet_mid_block = controlnet_block + + def forward( + self, + x: torch.Tensor, + timesteps: torch.Tensor, + controlnet_cond: torch.Tensor, + conditioning_scale: float = 1.0, + context: torch.Tensor | None = None, + class_labels: torch.Tensor | None = None, + ) -> tuple[list[torch.Tensor], torch.Tensor]: + """ + Args: + x: input tensor (N, C, H, W, [D]). + timesteps: timestep tensor (N,). + controlnet_cond: controlnet conditioning tensor (N, C, H, W, [D]) + conditioning_scale: conditioning scale. + context: context tensor (N, 1, cross_attention_dim), where cross_attention_dim is specified in the model init. + class_labels: context tensor (N, ). + """ + # 1. time + t_emb = get_timestep_embedding(timesteps, self.block_out_channels[0]) + + # timesteps does not contain any weights and will always return f32 tensors + # but time_embedding might actually be running in fp16. so we need to cast here. + # there might be better ways to encapsulate this. + t_emb = t_emb.to(dtype=x.dtype) + emb = self.time_embed(t_emb) + + # 2. class + if self.num_class_embeds is not None: + if class_labels is None: + raise ValueError("class_labels should be provided when num_class_embeds > 0") + class_emb = self.class_embedding(class_labels) + class_emb = class_emb.to(dtype=x.dtype) + emb = emb + class_emb + + # 3. initial convolution + h = self.conv_in(x) + + controlnet_cond = self.controlnet_cond_embedding(controlnet_cond) + + h += controlnet_cond + + # 4. down + if context is not None and self.with_conditioning is False: + raise ValueError("model should have with_conditioning = True if context is provided") + down_block_res_samples: list[torch.Tensor] = [h] + for downsample_block in self.down_blocks: + h, res_samples = downsample_block(hidden_states=h, temb=emb, context=context) + for residual in res_samples: + down_block_res_samples.append(residual) + + # 5. mid + h = self.middle_block(hidden_states=h, temb=emb, context=context) + + # 6. Control net blocks + controlnet_down_block_res_samples = [] + + for down_block_res_sample, controlnet_block in zip(down_block_res_samples, self.controlnet_down_blocks): + down_block_res_sample = controlnet_block(down_block_res_sample) + controlnet_down_block_res_samples.append(down_block_res_sample) + + down_block_res_samples = controlnet_down_block_res_samples + + mid_block_res_sample: torch.Tensor = self.controlnet_mid_block(h) + + # 6. scaling + down_block_res_samples = [h * conditioning_scale for h in down_block_res_samples] + mid_block_res_sample *= conditioning_scale + + return down_block_res_samples, mid_block_res_sample + + def load_old_state_dict(self, old_state_dict: dict, verbose=False) -> None: + """ + Load a state dict from a ControlNet trained with + [MONAI Generative](https://github.com/Project-MONAI/GenerativeModels). + + Args: + old_state_dict: state dict from the old ControlNet model. + """ + + new_state_dict = self.state_dict() + # if all keys match, just load the state dict + if all(k in new_state_dict for k in old_state_dict): + print("All keys match, loading state dict.") + self.load_state_dict(old_state_dict) + return + + if verbose: + # print all new_state_dict keys that are not in old_state_dict + for k in new_state_dict: + if k not in old_state_dict: + print(f"key {k} not found in old state dict") + # and vice versa + print("----------------------------------------------") + for k in old_state_dict: + if k not in new_state_dict: + print(f"key {k} not found in new state dict") + + # copy over all matching keys + for k in new_state_dict: + if k in old_state_dict: + new_state_dict[k] = old_state_dict[k] + + # fix the attention blocks + attention_blocks = [k.replace(".attn1.qkv.weight", "") for k in new_state_dict if "attn1.qkv.weight" in k] + for block in attention_blocks: + new_state_dict[f"{block}.attn1.qkv.weight"] = torch.cat( + [ + old_state_dict[f"{block}.attn1.to_q.weight"], + old_state_dict[f"{block}.attn1.to_k.weight"], + old_state_dict[f"{block}.attn1.to_v.weight"], + ], + dim=0, + ) + + # projection + new_state_dict[f"{block}.attn1.out_proj.weight"] = old_state_dict[f"{block}.attn1.to_out.0.weight"] + new_state_dict[f"{block}.attn1.out_proj.bias"] = old_state_dict[f"{block}.attn1.to_out.0.bias"] + + new_state_dict[f"{block}.attn2.out_proj.weight"] = old_state_dict[f"{block}.attn2.to_out.0.weight"] + new_state_dict[f"{block}.attn2.out_proj.bias"] = old_state_dict[f"{block}.attn2.to_out.0.bias"] + + self.load_state_dict(new_state_dict) diff --git a/monai/networks/nets/daf3d.py b/monai/networks/nets/daf3d.py index c9a18c746a..02e5bb022a 100644 --- a/monai/networks/nets/daf3d.py +++ b/monai/networks/nets/daf3d.py @@ -13,6 +13,7 @@ from collections import OrderedDict from collections.abc import Callable, Sequence +from functools import partial import torch import torch.nn as nn @@ -25,6 +26,7 @@ from monai.networks.blocks.convolutions import Convolution from monai.networks.blocks.feature_pyramid_network import ExtraFPNBlock, FeaturePyramidNetwork from monai.networks.layers.factories import Conv, Norm +from monai.networks.layers.utils import get_norm_layer from monai.networks.nets.resnet import ResNet, ResNetBottleneck __all__ = [ @@ -170,33 +172,37 @@ class Daf3dResNetBottleneck(ResNetBottleneck): spatial_dims: number of spatial dimensions of the input image. stride: stride to use for second conv layer. downsample: which downsample layer to use. + norm: which normalization layer to use. Defaults to group. """ expansion = 2 - def __init__(self, in_planes, planes, spatial_dims=3, stride=1, downsample=None): - norm_type: Callable = Norm[Norm.GROUP, spatial_dims] + def __init__( + self, in_planes, planes, spatial_dims=3, stride=1, downsample=None, norm=("group", {"num_groups": 32}) + ): conv_type: Callable = Conv[Conv.CONV, spatial_dims] + norm_layer = partial(get_norm_layer, name=norm, spatial_dims=spatial_dims) + # in case downsample uses batch norm, change to group norm if isinstance(downsample, nn.Sequential): downsample = nn.Sequential( conv_type(in_planes, planes * self.expansion, kernel_size=1, stride=stride, bias=False), - norm_type(num_groups=32, num_channels=planes * self.expansion), + norm_layer(channels=planes * self.expansion), ) super().__init__(in_planes, planes, spatial_dims, stride, downsample) # change norm from batch to group norm - self.bn1 = norm_type(num_groups=32, num_channels=planes) - self.bn2 = norm_type(num_groups=32, num_channels=planes) - self.bn3 = norm_type(num_groups=32, num_channels=planes * self.expansion) + self.bn1 = norm_layer(channels=planes) + self.bn2 = norm_layer(channels=planes) + self.bn3 = norm_layer(channels=planes * self.expansion) # adapt second convolution to work with groups self.conv2 = conv_type(planes, planes, kernel_size=3, padding=1, stride=stride, groups=32, bias=False) # adapt activation function - self.relu = nn.PReLU() # type: ignore + self.relu = nn.PReLU() class Daf3dResNetDilatedBottleneck(Daf3dResNetBottleneck): @@ -212,8 +218,10 @@ class Daf3dResNetDilatedBottleneck(Daf3dResNetBottleneck): downsample: which downsample layer to use. """ - def __init__(self, in_planes, planes, spatial_dims=3, stride=1, downsample=None): - super().__init__(in_planes, planes, spatial_dims, stride, downsample) + def __init__( + self, in_planes, planes, spatial_dims=3, stride=1, downsample=None, norm=("group", {"num_groups": 32}) + ): + super().__init__(in_planes, planes, spatial_dims, stride, downsample, norm) # add dilation in second convolution conv_type: Callable = Conv[Conv.CONV, spatial_dims] @@ -287,7 +295,7 @@ def __init__( n_input_channels, self.in_planes, kernel_size=7, stride=(1, 2, 2), padding=(3, 3, 3), bias=False ) self.bn1 = norm_type(32, 64) - self.relu = nn.PReLU() # type: ignore + self.relu = nn.PReLU() # adapt layers to our needs self.layer1 = self._make_layer(Daf3dResNetBottleneck, block_inplanes[0], layers[0], spatial_dims, shortcut_type) diff --git a/monai/networks/nets/diffusion_model_unet.py b/monai/networks/nets/diffusion_model_unet.py new file mode 100644 index 0000000000..8a9ac859a3 --- /dev/null +++ b/monai/networks/nets/diffusion_model_unet.py @@ -0,0 +1,1913 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ========================================================================= +# Adapted from https://github.com/huggingface/diffusers +# which has the following license: +# https://github.com/huggingface/diffusers/blob/main/LICENSE +# +# Copyright 2022 UC Berkeley Team and The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================================================================= + +from __future__ import annotations + +import math +from collections.abc import Sequence + +import torch +from torch import nn + +from monai.networks.blocks import Convolution, CrossAttentionBlock, MLPBlock, SABlock, SpatialAttentionBlock, Upsample +from monai.networks.layers.factories import Pool +from monai.utils import ensure_tuple_rep, optional_import + +Rearrange, _ = optional_import("einops.layers.torch", name="Rearrange") + +__all__ = ["DiffusionModelUNet"] + + +def zero_module(module: nn.Module) -> nn.Module: + """ + Zero out the parameters of a module and return it. + """ + for p in module.parameters(): + p.detach().zero_() + return module + + +class DiffusionUNetTransformerBlock(nn.Module): + """ + A Transformer block that allows for the input dimension to differ from the hidden dimension. + + Args: + num_channels: number of channels in the input and output. + num_attention_heads: number of heads to use for multi-head attention. + num_head_channels: number of channels in each attention head. + dropout: dropout probability to use. + cross_attention_dim: size of the context vector for cross attention. + upcast_attention: if True, upcast attention operations to full precision. + + """ + + def __init__( + self, + num_channels: int, + num_attention_heads: int, + num_head_channels: int, + dropout: float = 0.0, + cross_attention_dim: int | None = None, + upcast_attention: bool = False, + ) -> None: + super().__init__() + self.attn1 = SABlock( + hidden_size=num_attention_heads * num_head_channels, + hidden_input_size=num_channels, + num_heads=num_attention_heads, + dim_head=num_head_channels, + dropout_rate=dropout, + attention_dtype=torch.float if upcast_attention else None, + ) + self.ff = MLPBlock(hidden_size=num_channels, mlp_dim=num_channels * 4, act="GEGLU", dropout_rate=dropout) + self.attn2 = CrossAttentionBlock( + hidden_size=num_attention_heads * num_head_channels, + num_heads=num_attention_heads, + hidden_input_size=num_channels, + context_input_size=cross_attention_dim, + dim_head=num_head_channels, + dropout_rate=dropout, + attention_dtype=torch.float if upcast_attention else None, + ) + self.norm1 = nn.LayerNorm(num_channels) + self.norm2 = nn.LayerNorm(num_channels) + self.norm3 = nn.LayerNorm(num_channels) + + def forward(self, x: torch.Tensor, context: torch.Tensor | None = None) -> torch.Tensor: + # 1. Self-Attention + x = self.attn1(self.norm1(x)) + x + + # 2. Cross-Attention + x = self.attn2(self.norm2(x), context=context) + x + + # 3. Feed-forward + x = self.ff(self.norm3(x)) + x + return x + + +class SpatialTransformer(nn.Module): + """ + Transformer block for image-like data. First, project the input (aka embedding) and reshape to b, t, d. Then apply + standard transformer action. Finally, reshape to image. + + Args: + spatial_dims: number of spatial dimensions. + in_channels: number of channels in the input and output. + num_attention_heads: number of heads to use for multi-head attention. + num_head_channels: number of channels in each attention head. + num_layers: number of layers of Transformer blocks to use. + dropout: dropout probability to use. + norm_num_groups: number of groups for the normalization. + norm_eps: epsilon for the normalization. + cross_attention_dim: number of context dimensions to use. + upcast_attention: if True, upcast attention operations to full precision. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + num_attention_heads: int, + num_head_channels: int, + num_layers: int = 1, + dropout: float = 0.0, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + cross_attention_dim: int | None = None, + upcast_attention: bool = False, + ) -> None: + super().__init__() + self.spatial_dims = spatial_dims + self.in_channels = in_channels + inner_dim = num_attention_heads * num_head_channels + + self.norm = nn.GroupNorm(num_groups=norm_num_groups, num_channels=in_channels, eps=norm_eps, affine=True) + + self.proj_in = Convolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=inner_dim, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + ) + + self.transformer_blocks = nn.ModuleList( + [ + DiffusionUNetTransformerBlock( + num_channels=inner_dim, + num_attention_heads=num_attention_heads, + num_head_channels=num_head_channels, + dropout=dropout, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + ) + for _ in range(num_layers) + ] + ) + + self.proj_out = zero_module( + Convolution( + spatial_dims=spatial_dims, + in_channels=inner_dim, + out_channels=in_channels, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + ) + ) + + def forward(self, x: torch.Tensor, context: torch.Tensor | None = None) -> torch.Tensor: + # note: if no context is given, cross-attention defaults to self-attention + batch = channel = height = width = depth = -1 + if self.spatial_dims == 2: + batch, channel, height, width = x.shape + if self.spatial_dims == 3: + batch, channel, height, width, depth = x.shape + + residual = x + x = self.norm(x) + x = self.proj_in(x) + + inner_dim = x.shape[1] + + if self.spatial_dims == 2: + x = x.permute(0, 2, 3, 1).reshape(batch, height * width, inner_dim) + if self.spatial_dims == 3: + x = x.permute(0, 2, 3, 4, 1).reshape(batch, height * width * depth, inner_dim) + + for block in self.transformer_blocks: + x = block(x, context=context) + + if self.spatial_dims == 2: + x = x.reshape(batch, height, width, inner_dim).permute(0, 3, 1, 2).contiguous() + if self.spatial_dims == 3: + x = x.reshape(batch, height, width, depth, inner_dim).permute(0, 4, 1, 2, 3).contiguous() + + x = self.proj_out(x) + return x + residual + + +def get_timestep_embedding(timesteps: torch.Tensor, embedding_dim: int, max_period: int = 10000) -> torch.Tensor: + """ + Create sinusoidal timestep embeddings following the implementation in Ho et al. "Denoising Diffusion Probabilistic + Models" https://arxiv.org/abs/2006.11239. + + Args: + timesteps: a 1-D Tensor of N indices, one per batch element. + embedding_dim: the dimension of the output. + max_period: controls the minimum frequency of the embeddings. + """ + if timesteps.ndim != 1: + raise ValueError("Timesteps should be a 1d-array") + + half_dim = embedding_dim // 2 + exponent = -math.log(max_period) * torch.arange(start=0, end=half_dim, dtype=torch.float32, device=timesteps.device) + freqs = torch.exp(exponent / half_dim) + + args = timesteps[:, None].float() * freqs[None, :] + embedding = torch.cat([torch.cos(args), torch.sin(args)], dim=-1) + + # zero pad + if embedding_dim % 2 == 1: + embedding = torch.nn.functional.pad(embedding, (0, 1, 0, 0)) + + return embedding + + +class DiffusionUnetDownsample(nn.Module): + """ + Downsampling layer. + + Args: + spatial_dims: number of spatial dimensions. + num_channels: number of input channels. + use_conv: if True uses Convolution instead of Pool average to perform downsampling. In case that use_conv is + False, the number of output channels must be the same as the number of input channels. + out_channels: number of output channels. + padding: controls the amount of implicit zero-paddings on both sides for padding number of points + for each dimension. + """ + + def __init__( + self, spatial_dims: int, num_channels: int, use_conv: bool, out_channels: int | None = None, padding: int = 1 + ) -> None: + super().__init__() + self.num_channels = num_channels + self.out_channels = out_channels or num_channels + self.use_conv = use_conv + if use_conv: + self.op = Convolution( + spatial_dims=spatial_dims, + in_channels=self.num_channels, + out_channels=self.out_channels, + strides=2, + kernel_size=3, + padding=padding, + conv_only=True, + ) + else: + if self.num_channels != self.out_channels: + raise ValueError("num_channels and out_channels must be equal when use_conv=False") + self.op = Pool[Pool.AVG, spatial_dims](kernel_size=2, stride=2) + + def forward(self, x: torch.Tensor, emb: torch.Tensor | None = None) -> torch.Tensor: + del emb + if x.shape[1] != self.num_channels: + raise ValueError( + f"Input number of channels ({x.shape[1]}) is not equal to expected number of channels " + f"({self.num_channels})" + ) + output: torch.Tensor = self.op(x) + return output + + +class WrappedUpsample(Upsample): + """ + Wraps MONAI upsample block to allow for calling with timestep embeddings. + """ + + def forward(self, x: torch.Tensor, emb: torch.Tensor | None = None) -> torch.Tensor: + del emb + upsampled: torch.Tensor = super().forward(x) + return upsampled + + +class DiffusionUNetResnetBlock(nn.Module): + """ + Residual block with timestep conditioning. + + Args: + spatial_dims: The number of spatial dimensions. + in_channels: number of input channels. + temb_channels: number of timestep embedding channels. + out_channels: number of output channels. + up: if True, performs upsampling. + down: if True, performs downsampling. + norm_num_groups: number of groups for the group normalization. + norm_eps: epsilon for the group normalization. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + temb_channels: int, + out_channels: int | None = None, + up: bool = False, + down: bool = False, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + ) -> None: + super().__init__() + self.spatial_dims = spatial_dims + self.channels = in_channels + self.emb_channels = temb_channels + self.out_channels = out_channels or in_channels + self.up = up + self.down = down + + self.norm1 = nn.GroupNorm(num_groups=norm_num_groups, num_channels=in_channels, eps=norm_eps, affine=True) + self.nonlinearity = nn.SiLU() + self.conv1 = Convolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=self.out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + + self.upsample = self.downsample = None + if self.up: + self.upsample = WrappedUpsample( + spatial_dims=spatial_dims, + mode="nontrainable", + in_channels=in_channels, + out_channels=in_channels, + interp_mode="nearest", + scale_factor=2.0, + align_corners=None, + ) + elif down: + self.downsample = DiffusionUnetDownsample(spatial_dims, in_channels, use_conv=False) + + self.time_emb_proj = nn.Linear(temb_channels, self.out_channels) + + self.norm2 = nn.GroupNorm(num_groups=norm_num_groups, num_channels=self.out_channels, eps=norm_eps, affine=True) + self.conv2 = zero_module( + Convolution( + spatial_dims=spatial_dims, + in_channels=self.out_channels, + out_channels=self.out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + ) + self.skip_connection: nn.Module + if self.out_channels == in_channels: + self.skip_connection = nn.Identity() + else: + self.skip_connection = Convolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=self.out_channels, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + ) + + def forward(self, x: torch.Tensor, emb: torch.Tensor) -> torch.Tensor: + h = x + h = self.norm1(h) + h = self.nonlinearity(h) + + if self.upsample is not None: + x = self.upsample(x) + h = self.upsample(h) + elif self.downsample is not None: + x = self.downsample(x) + h = self.downsample(h) + + h = self.conv1(h) + + if self.spatial_dims == 2: + temb = self.time_emb_proj(self.nonlinearity(emb))[:, :, None, None] + else: + temb = self.time_emb_proj(self.nonlinearity(emb))[:, :, None, None, None] + h = h + temb + + h = self.norm2(h) + h = self.nonlinearity(h) + h = self.conv2(h) + output: torch.Tensor = self.skip_connection(x) + h + return output + + +class DownBlock(nn.Module): + """ + Unet's down block containing resnet and downsamplers blocks. + + Args: + spatial_dims: The number of spatial dimensions. + in_channels: number of input channels. + out_channels: number of output channels. + temb_channels: number of timestep embedding channels. + num_res_blocks: number of residual blocks. + norm_num_groups: number of groups for the group normalization. + norm_eps: epsilon for the group normalization. + add_downsample: if True add downsample block. + resblock_updown: if True use residual blocks for downsampling. + downsample_padding: padding used in the downsampling block. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + out_channels: int, + temb_channels: int, + num_res_blocks: int = 1, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + add_downsample: bool = True, + resblock_updown: bool = False, + downsample_padding: int = 1, + ) -> None: + super().__init__() + self.resblock_updown = resblock_updown + + resnets = [] + + for i in range(num_res_blocks): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + self.downsampler: nn.Module | None + if resblock_updown: + self.downsampler = DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + down=True, + ) + else: + self.downsampler = DiffusionUnetDownsample( + spatial_dims=spatial_dims, + num_channels=out_channels, + use_conv=True, + out_channels=out_channels, + padding=downsample_padding, + ) + else: + self.downsampler = None + + def forward( + self, hidden_states: torch.Tensor, temb: torch.Tensor, context: torch.Tensor | None = None + ) -> tuple[torch.Tensor, list[torch.Tensor]]: + del context + output_states = [] + + for resnet in self.resnets: + hidden_states = resnet(hidden_states, temb) + output_states.append(hidden_states) + + if self.downsampler is not None: + hidden_states = self.downsampler(hidden_states, temb) + output_states.append(hidden_states) + + return hidden_states, output_states + + +class AttnDownBlock(nn.Module): + """ + Unet's down block containing resnet, downsamplers and self-attention blocks. + + Args: + spatial_dims: The number of spatial dimensions. + in_channels: number of input channels. + out_channels: number of output channels. + temb_channels: number of timestep embedding channels. + num_res_blocks: number of residual blocks. + norm_num_groups: number of groups for the group normalization. + norm_eps: epsilon for the group normalization. + add_downsample: if True add downsample block. + resblock_updown: if True use residual blocks for downsampling. + downsample_padding: padding used in the downsampling block. + num_head_channels: number of channels in each attention head. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + out_channels: int, + temb_channels: int, + num_res_blocks: int = 1, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + add_downsample: bool = True, + resblock_updown: bool = False, + downsample_padding: int = 1, + num_head_channels: int = 1, + ) -> None: + super().__init__() + self.resblock_updown = resblock_updown + + resnets = [] + attentions = [] + + for i in range(num_res_blocks): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + ) + attentions.append( + SpatialAttentionBlock( + spatial_dims=spatial_dims, + num_channels=out_channels, + num_head_channels=num_head_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + self.downsampler: nn.Module | None + if add_downsample: + if resblock_updown: + self.downsampler = DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + down=True, + ) + else: + self.downsampler = DiffusionUnetDownsample( + spatial_dims=spatial_dims, + num_channels=out_channels, + use_conv=True, + out_channels=out_channels, + padding=downsample_padding, + ) + else: + self.downsampler = None + + def forward( + self, hidden_states: torch.Tensor, temb: torch.Tensor, context: torch.Tensor | None = None + ) -> tuple[torch.Tensor, list[torch.Tensor]]: + del context + output_states = [] + + for resnet, attn in zip(self.resnets, self.attentions): + hidden_states = resnet(hidden_states, temb) + hidden_states = attn(hidden_states).contiguous() + output_states.append(hidden_states) + + if self.downsampler is not None: + hidden_states = self.downsampler(hidden_states, temb) + output_states.append(hidden_states) + + return hidden_states, output_states + + +class CrossAttnDownBlock(nn.Module): + """ + Unet's down block containing resnet, downsamplers and cross-attention blocks. + + Args: + spatial_dims: number of spatial dimensions. + in_channels: number of input channels. + out_channels: number of output channels. + temb_channels: number of timestep embedding channels. + num_res_blocks: number of residual blocks. + norm_num_groups: number of groups for the group normalization. + norm_eps: epsilon for the group normalization. + add_downsample: if True add downsample block. + resblock_updown: if True use residual blocks for downsampling. + downsample_padding: padding used in the downsampling block. + num_head_channels: number of channels in each attention head. + transformer_num_layers: number of layers of Transformer blocks to use. + cross_attention_dim: number of context dimensions to use. + upcast_attention: if True, upcast attention operations to full precision. + dropout_cattn: if different from zero, this will be the dropout value for the cross-attention layers + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + out_channels: int, + temb_channels: int, + num_res_blocks: int = 1, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + add_downsample: bool = True, + resblock_updown: bool = False, + downsample_padding: int = 1, + num_head_channels: int = 1, + transformer_num_layers: int = 1, + cross_attention_dim: int | None = None, + upcast_attention: bool = False, + dropout_cattn: float = 0.0, + ) -> None: + super().__init__() + self.resblock_updown = resblock_updown + + resnets = [] + attentions = [] + + for i in range(num_res_blocks): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + ) + + attentions.append( + SpatialTransformer( + spatial_dims=spatial_dims, + in_channels=out_channels, + num_attention_heads=out_channels // num_head_channels, + num_head_channels=num_head_channels, + num_layers=transformer_num_layers, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + dropout=dropout_cattn, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + self.downsampler: nn.Module | None + if add_downsample: + if resblock_updown: + self.downsampler = DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + down=True, + ) + else: + self.downsampler = DiffusionUnetDownsample( + spatial_dims=spatial_dims, + num_channels=out_channels, + use_conv=True, + out_channels=out_channels, + padding=downsample_padding, + ) + else: + self.downsampler = None + + def forward( + self, hidden_states: torch.Tensor, temb: torch.Tensor, context: torch.Tensor | None = None + ) -> tuple[torch.Tensor, list[torch.Tensor]]: + output_states = [] + + for resnet, attn in zip(self.resnets, self.attentions): + hidden_states = resnet(hidden_states, temb) + hidden_states = attn(hidden_states, context=context).contiguous() + output_states.append(hidden_states) + + if self.downsampler is not None: + hidden_states = self.downsampler(hidden_states, temb) + output_states.append(hidden_states) + + return hidden_states, output_states + + +class AttnMidBlock(nn.Module): + """ + Unet's mid block containing resnet and self-attention blocks. + + Args: + spatial_dims: The number of spatial dimensions. + in_channels: number of input channels. + temb_channels: number of timestep embedding channels. + norm_num_groups: number of groups for the group normalization. + norm_eps: epsilon for the group normalization. + num_head_channels: number of channels in each attention head. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + temb_channels: int, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + num_head_channels: int = 1, + ) -> None: + super().__init__() + + self.resnet_1 = DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + self.attention = SpatialAttentionBlock( + spatial_dims=spatial_dims, + num_channels=in_channels, + num_head_channels=num_head_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + + self.resnet_2 = DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + + def forward( + self, hidden_states: torch.Tensor, temb: torch.Tensor, context: torch.Tensor | None = None + ) -> torch.Tensor: + del context + hidden_states = self.resnet_1(hidden_states, temb) + hidden_states = self.attention(hidden_states).contiguous() + hidden_states = self.resnet_2(hidden_states, temb) + + return hidden_states + + +class CrossAttnMidBlock(nn.Module): + """ + Unet's mid block containing resnet and cross-attention blocks. + + Args: + spatial_dims: The number of spatial dimensions. + in_channels: number of input channels. + temb_channels: number of timestep embedding channels + norm_num_groups: number of groups for the group normalization. + norm_eps: epsilon for the group normalization. + num_head_channels: number of channels in each attention head. + transformer_num_layers: number of layers of Transformer blocks to use. + cross_attention_dim: number of context dimensions to use. + upcast_attention: if True, upcast attention operations to full precision. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + temb_channels: int, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + num_head_channels: int = 1, + transformer_num_layers: int = 1, + cross_attention_dim: int | None = None, + upcast_attention: bool = False, + dropout_cattn: float = 0.0, + ) -> None: + super().__init__() + + self.resnet_1 = DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + self.attention = SpatialTransformer( + spatial_dims=spatial_dims, + in_channels=in_channels, + num_attention_heads=in_channels // num_head_channels, + num_head_channels=num_head_channels, + num_layers=transformer_num_layers, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + dropout=dropout_cattn, + ) + self.resnet_2 = DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + + def forward( + self, hidden_states: torch.Tensor, temb: torch.Tensor, context: torch.Tensor | None = None + ) -> torch.Tensor: + hidden_states = self.resnet_1(hidden_states, temb) + hidden_states = self.attention(hidden_states, context=context) + hidden_states = self.resnet_2(hidden_states, temb) + + return hidden_states + + +class UpBlock(nn.Module): + """ + Unet's up block containing resnet and upsamplers blocks. + + Args: + spatial_dims: The number of spatial dimensions. + in_channels: number of input channels. + prev_output_channel: number of channels from residual connection. + out_channels: number of output channels. + temb_channels: number of timestep embedding channels. + num_res_blocks: number of residual blocks. + norm_num_groups: number of groups for the group normalization. + norm_eps: epsilon for the group normalization. + add_upsample: if True add downsample block. + resblock_updown: if True use residual blocks for upsampling. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + num_res_blocks: int = 1, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + add_upsample: bool = True, + resblock_updown: bool = False, + ) -> None: + super().__init__() + self.resblock_updown = resblock_updown + resnets = [] + + for i in range(num_res_blocks): + res_skip_channels = in_channels if (i == num_res_blocks - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + resnets.append( + DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + self.upsampler: nn.Module | None + if add_upsample: + if resblock_updown: + self.upsampler = DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + up=True, + ) + else: + post_conv = Convolution( + spatial_dims=spatial_dims, + in_channels=out_channels, + out_channels=out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + self.upsampler = WrappedUpsample( + spatial_dims=spatial_dims, + mode="nontrainable", + in_channels=out_channels, + out_channels=out_channels, + interp_mode="nearest", + scale_factor=2.0, + post_conv=post_conv, + align_corners=None, + ) + + else: + self.upsampler = None + + def forward( + self, + hidden_states: torch.Tensor, + res_hidden_states_list: list[torch.Tensor], + temb: torch.Tensor, + context: torch.Tensor | None = None, + ) -> torch.Tensor: + del context + for resnet in self.resnets: + # pop res hidden states + res_hidden_states = res_hidden_states_list[-1] + res_hidden_states_list = res_hidden_states_list[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + hidden_states = resnet(hidden_states, temb) + + if self.upsampler is not None: + hidden_states = self.upsampler(hidden_states, temb) + + return hidden_states + + +class AttnUpBlock(nn.Module): + """ + Unet's up block containing resnet, upsamplers, and self-attention blocks. + + Args: + spatial_dims: The number of spatial dimensions. + in_channels: number of input channels. + prev_output_channel: number of channels from residual connection. + out_channels: number of output channels. + temb_channels: number of timestep embedding channels. + num_res_blocks: number of residual blocks. + norm_num_groups: number of groups for the group normalization. + norm_eps: epsilon for the group normalization. + add_upsample: if True add downsample block. + resblock_updown: if True use residual blocks for upsampling. + num_head_channels: number of channels in each attention head. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + num_res_blocks: int = 1, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + add_upsample: bool = True, + resblock_updown: bool = False, + num_head_channels: int = 1, + ) -> None: + super().__init__() + self.resblock_updown = resblock_updown + + resnets = [] + attentions = [] + + for i in range(num_res_blocks): + res_skip_channels = in_channels if (i == num_res_blocks - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + resnets.append( + DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + ) + attentions.append( + SpatialAttentionBlock( + spatial_dims=spatial_dims, + num_channels=out_channels, + num_head_channels=num_head_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + ) + + self.resnets = nn.ModuleList(resnets) + self.attentions = nn.ModuleList(attentions) + + self.upsampler: nn.Module | None + if add_upsample: + if resblock_updown: + self.upsampler = DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + up=True, + ) + else: + + post_conv = Convolution( + spatial_dims=spatial_dims, + in_channels=out_channels, + out_channels=out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + self.upsampler = WrappedUpsample( + spatial_dims=spatial_dims, + mode="nontrainable", + in_channels=out_channels, + out_channels=out_channels, + interp_mode="nearest", + scale_factor=2.0, + post_conv=post_conv, + align_corners=None, + ) + else: + self.upsampler = None + + def forward( + self, + hidden_states: torch.Tensor, + res_hidden_states_list: list[torch.Tensor], + temb: torch.Tensor, + context: torch.Tensor | None = None, + ) -> torch.Tensor: + del context + for resnet, attn in zip(self.resnets, self.attentions): + # pop res hidden states + res_hidden_states = res_hidden_states_list[-1] + res_hidden_states_list = res_hidden_states_list[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + hidden_states = resnet(hidden_states, temb) + hidden_states = attn(hidden_states).contiguous() + + if self.upsampler is not None: + hidden_states = self.upsampler(hidden_states, temb) + + return hidden_states + + +class CrossAttnUpBlock(nn.Module): + """ + Unet's up block containing resnet, upsamplers, and self-attention blocks. + + Args: + spatial_dims: The number of spatial dimensions. + in_channels: number of input channels. + prev_output_channel: number of channels from residual connection. + out_channels: number of output channels. + temb_channels: number of timestep embedding channels. + num_res_blocks: number of residual blocks. + norm_num_groups: number of groups for the group normalization. + norm_eps: epsilon for the group normalization. + add_upsample: if True add downsample block. + resblock_updown: if True use residual blocks for upsampling. + num_head_channels: number of channels in each attention head. + transformer_num_layers: number of layers of Transformer blocks to use. + cross_attention_dim: number of context dimensions to use. + upcast_attention: if True, upcast attention operations to full precision. + dropout_cattn: if different from zero, this will be the dropout value for the cross-attention layers + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + num_res_blocks: int = 1, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + add_upsample: bool = True, + resblock_updown: bool = False, + num_head_channels: int = 1, + transformer_num_layers: int = 1, + cross_attention_dim: int | None = None, + upcast_attention: bool = False, + dropout_cattn: float = 0.0, + ) -> None: + super().__init__() + self.resblock_updown = resblock_updown + + resnets = [] + attentions = [] + + for i in range(num_res_blocks): + res_skip_channels = in_channels if (i == num_res_blocks - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + resnets.append( + DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + ) + attentions.append( + SpatialTransformer( + spatial_dims=spatial_dims, + in_channels=out_channels, + num_attention_heads=out_channels // num_head_channels, + num_head_channels=num_head_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + dropout=dropout_cattn, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + self.upsampler: nn.Module | None + if add_upsample: + if resblock_updown: + self.upsampler = DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + up=True, + ) + else: + + post_conv = Convolution( + spatial_dims=spatial_dims, + in_channels=out_channels, + out_channels=out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + self.upsampler = WrappedUpsample( + spatial_dims=spatial_dims, + mode="nontrainable", + in_channels=out_channels, + out_channels=out_channels, + interp_mode="nearest", + scale_factor=2.0, + post_conv=post_conv, + align_corners=None, + ) + else: + self.upsampler = None + + def forward( + self, + hidden_states: torch.Tensor, + res_hidden_states_list: list[torch.Tensor], + temb: torch.Tensor, + context: torch.Tensor | None = None, + ) -> torch.Tensor: + for resnet, attn in zip(self.resnets, self.attentions): + # pop res hidden states + res_hidden_states = res_hidden_states_list[-1] + res_hidden_states_list = res_hidden_states_list[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + hidden_states = resnet(hidden_states, temb) + hidden_states = attn(hidden_states, context=context) + + if self.upsampler is not None: + hidden_states = self.upsampler(hidden_states, temb) + + return hidden_states + + +def get_down_block( + spatial_dims: int, + in_channels: int, + out_channels: int, + temb_channels: int, + num_res_blocks: int, + norm_num_groups: int, + norm_eps: float, + add_downsample: bool, + resblock_updown: bool, + with_attn: bool, + with_cross_attn: bool, + num_head_channels: int, + transformer_num_layers: int, + cross_attention_dim: int | None, + upcast_attention: bool = False, + dropout_cattn: float = 0.0, +) -> nn.Module: + if with_attn: + return AttnDownBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + num_res_blocks=num_res_blocks, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_downsample=add_downsample, + resblock_updown=resblock_updown, + num_head_channels=num_head_channels, + ) + elif with_cross_attn: + return CrossAttnDownBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + num_res_blocks=num_res_blocks, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_downsample=add_downsample, + resblock_updown=resblock_updown, + num_head_channels=num_head_channels, + transformer_num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + dropout_cattn=dropout_cattn, + ) + else: + return DownBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + num_res_blocks=num_res_blocks, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_downsample=add_downsample, + resblock_updown=resblock_updown, + ) + + +def get_mid_block( + spatial_dims: int, + in_channels: int, + temb_channels: int, + norm_num_groups: int, + norm_eps: float, + with_conditioning: bool, + num_head_channels: int, + transformer_num_layers: int, + cross_attention_dim: int | None, + upcast_attention: bool = False, + dropout_cattn: float = 0.0, +) -> nn.Module: + if with_conditioning: + return CrossAttnMidBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + num_head_channels=num_head_channels, + transformer_num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + dropout_cattn=dropout_cattn, + ) + else: + return AttnMidBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + num_head_channels=num_head_channels, + ) + + +def get_up_block( + spatial_dims: int, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + num_res_blocks: int, + norm_num_groups: int, + norm_eps: float, + add_upsample: bool, + resblock_updown: bool, + with_attn: bool, + with_cross_attn: bool, + num_head_channels: int, + transformer_num_layers: int, + cross_attention_dim: int | None, + upcast_attention: bool = False, + dropout_cattn: float = 0.0, +) -> nn.Module: + if with_attn: + return AttnUpBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + prev_output_channel=prev_output_channel, + out_channels=out_channels, + temb_channels=temb_channels, + num_res_blocks=num_res_blocks, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_upsample=add_upsample, + resblock_updown=resblock_updown, + num_head_channels=num_head_channels, + ) + elif with_cross_attn: + return CrossAttnUpBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + prev_output_channel=prev_output_channel, + out_channels=out_channels, + temb_channels=temb_channels, + num_res_blocks=num_res_blocks, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_upsample=add_upsample, + resblock_updown=resblock_updown, + num_head_channels=num_head_channels, + transformer_num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + dropout_cattn=dropout_cattn, + ) + else: + return UpBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + prev_output_channel=prev_output_channel, + out_channels=out_channels, + temb_channels=temb_channels, + num_res_blocks=num_res_blocks, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_upsample=add_upsample, + resblock_updown=resblock_updown, + ) + + +class DiffusionModelUNet(nn.Module): + """ + Unet network with timestep embedding and attention mechanisms for conditioning based on + Rombach et al. "High-Resolution Image Synthesis with Latent Diffusion Models" https://arxiv.org/abs/2112.10752 + and Pinaya et al. "Brain Imaging Generation with Latent Diffusion Models" https://arxiv.org/abs/2209.07162 + + Args: + spatial_dims: number of spatial dimensions. + in_channels: number of input channels. + out_channels: number of output channels. + num_res_blocks: number of residual blocks (see _ResnetBlock) per level. + channels: tuple of block output channels. + attention_levels: list of levels to add attention. + norm_num_groups: number of groups for the normalization. + norm_eps: epsilon for the normalization. + resblock_updown: if True use residual blocks for up/downsampling. + num_head_channels: number of channels in each attention head. + with_conditioning: if True add spatial transformers to perform conditioning. + transformer_num_layers: number of layers of Transformer blocks to use. + cross_attention_dim: number of context dimensions to use. + num_class_embeds: if specified (as an int), then this model will be class-conditional with `num_class_embeds` + classes. + upcast_attention: if True, upcast attention operations to full precision. + dropout_cattn: if different from zero, this will be the dropout value for the cross-attention layers + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + out_channels: int, + num_res_blocks: Sequence[int] | int = (2, 2, 2, 2), + channels: Sequence[int] = (32, 64, 64, 64), + attention_levels: Sequence[bool] = (False, False, True, True), + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + resblock_updown: bool = False, + num_head_channels: int | Sequence[int] = 8, + with_conditioning: bool = False, + transformer_num_layers: int = 1, + cross_attention_dim: int | None = None, + num_class_embeds: int | None = None, + upcast_attention: bool = False, + dropout_cattn: float = 0.0, + ) -> None: + super().__init__() + if with_conditioning is True and cross_attention_dim is None: + raise ValueError( + "DiffusionModelUNet expects dimension of the cross-attention conditioning (cross_attention_dim) " + "when using with_conditioning." + ) + if cross_attention_dim is not None and with_conditioning is False: + raise ValueError( + "DiffusionModelUNet expects with_conditioning=True when specifying the cross_attention_dim." + ) + if dropout_cattn > 1.0 or dropout_cattn < 0.0: + raise ValueError("Dropout cannot be negative or >1.0!") + + # All number of channels should be multiple of num_groups + if any((out_channel % norm_num_groups) != 0 for out_channel in channels): + raise ValueError("DiffusionModelUNet expects all num_channels being multiple of norm_num_groups") + + if len(channels) != len(attention_levels): + raise ValueError("DiffusionModelUNet expects num_channels being same size of attention_levels") + + if isinstance(num_head_channels, int): + num_head_channels = ensure_tuple_rep(num_head_channels, len(attention_levels)) + + if len(num_head_channels) != len(attention_levels): + raise ValueError( + "num_head_channels should have the same length as attention_levels. For the i levels without attention," + " i.e. `attention_level[i]=False`, the num_head_channels[i] will be ignored." + ) + + if isinstance(num_res_blocks, int): + num_res_blocks = ensure_tuple_rep(num_res_blocks, len(channels)) + + if len(num_res_blocks) != len(channels): + raise ValueError( + "`num_res_blocks` should be a single integer or a tuple of integers with the same length as " + "`num_channels`." + ) + + self.in_channels = in_channels + self.block_out_channels = channels + self.out_channels = out_channels + self.num_res_blocks = num_res_blocks + self.attention_levels = attention_levels + self.num_head_channels = num_head_channels + self.with_conditioning = with_conditioning + + # input + self.conv_in = Convolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=channels[0], + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + + # time + time_embed_dim = channels[0] * 4 + self.time_embed = nn.Sequential( + nn.Linear(channels[0], time_embed_dim), nn.SiLU(), nn.Linear(time_embed_dim, time_embed_dim) + ) + + # class embedding + self.num_class_embeds = num_class_embeds + if num_class_embeds is not None: + self.class_embedding = nn.Embedding(num_class_embeds, time_embed_dim) + + # down + self.down_blocks = nn.ModuleList([]) + output_channel = channels[0] + for i in range(len(channels)): + input_channel = output_channel + output_channel = channels[i] + is_final_block = i == len(channels) - 1 + + down_block = get_down_block( + spatial_dims=spatial_dims, + in_channels=input_channel, + out_channels=output_channel, + temb_channels=time_embed_dim, + num_res_blocks=num_res_blocks[i], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_downsample=not is_final_block, + resblock_updown=resblock_updown, + with_attn=(attention_levels[i] and not with_conditioning), + with_cross_attn=(attention_levels[i] and with_conditioning), + num_head_channels=num_head_channels[i], + transformer_num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + dropout_cattn=dropout_cattn, + ) + + self.down_blocks.append(down_block) + + # mid + self.middle_block = get_mid_block( + spatial_dims=spatial_dims, + in_channels=channels[-1], + temb_channels=time_embed_dim, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + with_conditioning=with_conditioning, + num_head_channels=num_head_channels[-1], + transformer_num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + dropout_cattn=dropout_cattn, + ) + + # up + self.up_blocks = nn.ModuleList([]) + reversed_block_out_channels = list(reversed(channels)) + reversed_num_res_blocks = list(reversed(num_res_blocks)) + reversed_attention_levels = list(reversed(attention_levels)) + reversed_num_head_channels = list(reversed(num_head_channels)) + output_channel = reversed_block_out_channels[0] + for i in range(len(reversed_block_out_channels)): + prev_output_channel = output_channel + output_channel = reversed_block_out_channels[i] + input_channel = reversed_block_out_channels[min(i + 1, len(channels) - 1)] + + is_final_block = i == len(channels) - 1 + + up_block = get_up_block( + spatial_dims=spatial_dims, + in_channels=input_channel, + prev_output_channel=prev_output_channel, + out_channels=output_channel, + temb_channels=time_embed_dim, + num_res_blocks=reversed_num_res_blocks[i] + 1, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_upsample=not is_final_block, + resblock_updown=resblock_updown, + with_attn=(reversed_attention_levels[i] and not with_conditioning), + with_cross_attn=(reversed_attention_levels[i] and with_conditioning), + num_head_channels=reversed_num_head_channels[i], + transformer_num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + dropout_cattn=dropout_cattn, + ) + + self.up_blocks.append(up_block) + + # out + self.out = nn.Sequential( + nn.GroupNorm(num_groups=norm_num_groups, num_channels=channels[0], eps=norm_eps, affine=True), + nn.SiLU(), + zero_module( + Convolution( + spatial_dims=spatial_dims, + in_channels=channels[0], + out_channels=out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + ), + ) + + def forward( + self, + x: torch.Tensor, + timesteps: torch.Tensor, + context: torch.Tensor | None = None, + class_labels: torch.Tensor | None = None, + down_block_additional_residuals: tuple[torch.Tensor] | None = None, + mid_block_additional_residual: torch.Tensor | None = None, + ) -> torch.Tensor: + """ + Args: + x: input tensor (N, C, SpatialDims). + timesteps: timestep tensor (N,). + context: context tensor (N, 1, ContextDim). + class_labels: context tensor (N, ). + down_block_additional_residuals: additional residual tensors for down blocks (N, C, FeatureMapsDims). + mid_block_additional_residual: additional residual tensor for mid block (N, C, FeatureMapsDims). + """ + # 1. time + t_emb = get_timestep_embedding(timesteps, self.block_out_channels[0]) + + # timesteps does not contain any weights and will always return f32 tensors + # but time_embedding might actually be running in fp16. so we need to cast here. + # there might be better ways to encapsulate this. + t_emb = t_emb.to(dtype=x.dtype) + emb = self.time_embed(t_emb) + + # 2. class + if self.num_class_embeds is not None: + if class_labels is None: + raise ValueError("class_labels should be provided when num_class_embeds > 0") + class_emb = self.class_embedding(class_labels) + class_emb = class_emb.to(dtype=x.dtype) + emb = emb + class_emb + + # 3. initial convolution + h = self.conv_in(x) + + # 4. down + if context is not None and self.with_conditioning is False: + raise ValueError("model should have with_conditioning = True if context is provided") + down_block_res_samples: list[torch.Tensor] = [h] + for downsample_block in self.down_blocks: + h, res_samples = downsample_block(hidden_states=h, temb=emb, context=context) + for residual in res_samples: + down_block_res_samples.append(residual) + + # Additional residual conections for Controlnets + if down_block_additional_residuals is not None: + new_down_block_res_samples: list[torch.Tensor] = [] + for down_block_res_sample, down_block_additional_residual in zip( + down_block_res_samples, down_block_additional_residuals + ): + down_block_res_sample = down_block_res_sample + down_block_additional_residual + new_down_block_res_samples += [down_block_res_sample] + + down_block_res_samples = new_down_block_res_samples + + # 5. mid + h = self.middle_block(hidden_states=h, temb=emb, context=context) + + # Additional residual conections for Controlnets + if mid_block_additional_residual is not None: + h = h + mid_block_additional_residual + + # 6. up + for upsample_block in self.up_blocks: + res_samples = down_block_res_samples[-len(upsample_block.resnets) :] + down_block_res_samples = down_block_res_samples[: -len(upsample_block.resnets)] + h = upsample_block(hidden_states=h, res_hidden_states_list=res_samples, temb=emb, context=context) + + # 7. output block + output: torch.Tensor = self.out(h) + + return output + + def load_old_state_dict(self, old_state_dict: dict, verbose=False) -> None: + """ + Load a state dict from a DiffusionModelUNet trained with + [MONAI Generative](https://github.com/Project-MONAI/GenerativeModels). + + Args: + old_state_dict: state dict from the old DecoderOnlyTransformer model. + """ + + new_state_dict = self.state_dict() + # if all keys match, just load the state dict + if all(k in new_state_dict for k in old_state_dict): + print("All keys match, loading state dict.") + self.load_state_dict(old_state_dict) + return + + if verbose: + # print all new_state_dict keys that are not in old_state_dict + for k in new_state_dict: + if k not in old_state_dict: + print(f"key {k} not found in old state dict") + # and vice versa + print("----------------------------------------------") + for k in old_state_dict: + if k not in new_state_dict: + print(f"key {k} not found in new state dict") + + # copy over all matching keys + for k in new_state_dict: + if k in old_state_dict: + new_state_dict[k] = old_state_dict[k] + + # fix the attention blocks + attention_blocks = [k.replace(".attn1.qkv.weight", "") for k in new_state_dict if "attn1.qkv.weight" in k] + for block in attention_blocks: + new_state_dict[f"{block}.attn1.qkv.weight"] = torch.cat( + [ + old_state_dict[f"{block}.attn1.to_q.weight"], + old_state_dict[f"{block}.attn1.to_k.weight"], + old_state_dict[f"{block}.attn1.to_v.weight"], + ], + dim=0, + ) + + # projection + new_state_dict[f"{block}.attn1.out_proj.weight"] = old_state_dict[f"{block}.attn1.to_out.0.weight"] + new_state_dict[f"{block}.attn1.out_proj.bias"] = old_state_dict[f"{block}.attn1.to_out.0.bias"] + + new_state_dict[f"{block}.attn2.out_proj.weight"] = old_state_dict[f"{block}.attn2.to_out.0.weight"] + new_state_dict[f"{block}.attn2.out_proj.bias"] = old_state_dict[f"{block}.attn2.to_out.0.bias"] + # fix the upsample conv blocks which were renamed postconv + for k in new_state_dict: + if "postconv" in k: + old_name = k.replace("postconv", "conv") + new_state_dict[k] = old_state_dict[old_name] + self.load_state_dict(new_state_dict) + + +class DiffusionModelEncoder(nn.Module): + """ + Classification Network based on the Encoder of the Diffusion Model, followed by fully connected layers. This network is based on + Wolleb et al. "Diffusion Models for Medical Anomaly Detection" (https://arxiv.org/abs/2203.04306). + + Args: + spatial_dims: number of spatial dimensions. + in_channels: number of input channels. + out_channels: number of output channels. + num_res_blocks: number of residual blocks (see _ResnetBlock) per level. + channels: tuple of block output channels. + attention_levels: list of levels to add attention. + norm_num_groups: number of groups for the normalization. + norm_eps: epsilon for the normalization. + resblock_updown: if True use residual blocks for downsampling. + num_head_channels: number of channels in each attention head. + with_conditioning: if True add spatial transformers to perform conditioning. + transformer_num_layers: number of layers of Transformer blocks to use. + cross_attention_dim: number of context dimensions to use. + num_class_embeds: if specified (as an int), then this model will be class-conditional with `num_class_embeds` classes. + upcast_attention: if True, upcast attention operations to full precision. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + out_channels: int, + num_res_blocks: Sequence[int] | int = (2, 2, 2, 2), + channels: Sequence[int] = (32, 64, 64, 64), + attention_levels: Sequence[bool] = (False, False, True, True), + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + resblock_updown: bool = False, + num_head_channels: int | Sequence[int] = 8, + with_conditioning: bool = False, + transformer_num_layers: int = 1, + cross_attention_dim: int | None = None, + num_class_embeds: int | None = None, + upcast_attention: bool = False, + ) -> None: + super().__init__() + if with_conditioning is True and cross_attention_dim is None: + raise ValueError( + "DiffusionModelEncoder expects dimension of the cross-attention conditioning (cross_attention_dim) " + "when using with_conditioning." + ) + if cross_attention_dim is not None and with_conditioning is False: + raise ValueError( + "DiffusionModelEncoder expects with_conditioning=True when specifying the cross_attention_dim." + ) + + # All number of channels should be multiple of num_groups + if any((out_channel % norm_num_groups) != 0 for out_channel in channels): + raise ValueError("DiffusionModelEncoder expects all num_channels being multiple of norm_num_groups") + if len(channels) != len(attention_levels): + raise ValueError("DiffusionModelEncoder expects num_channels being same size of attention_levels") + + if isinstance(num_head_channels, int): + num_head_channels = ensure_tuple_rep(num_head_channels, len(attention_levels)) + + if isinstance(num_res_blocks, int): + num_res_blocks = ensure_tuple_rep(num_res_blocks, len(channels)) + + if len(num_head_channels) != len(attention_levels): + raise ValueError( + "num_head_channels should have the same length as attention_levels. For the i levels without attention," + " i.e. `attention_level[i]=False`, the num_head_channels[i] will be ignored." + ) + + self.in_channels = in_channels + self.block_out_channels = channels + self.out_channels = out_channels + self.num_res_blocks = num_res_blocks + self.attention_levels = attention_levels + self.num_head_channels = num_head_channels + self.with_conditioning = with_conditioning + + # input + self.conv_in = Convolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=channels[0], + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + + # time + time_embed_dim = channels[0] * 4 + self.time_embed = nn.Sequential( + nn.Linear(channels[0], time_embed_dim), nn.SiLU(), nn.Linear(time_embed_dim, time_embed_dim) + ) + + # class embedding + self.num_class_embeds = num_class_embeds + if num_class_embeds is not None: + self.class_embedding = nn.Embedding(num_class_embeds, time_embed_dim) + + # down + self.down_blocks = nn.ModuleList([]) + output_channel = channels[0] + for i in range(len(channels)): + input_channel = output_channel + output_channel = channels[i] + is_final_block = i == len(channels) # - 1 + + down_block = get_down_block( + spatial_dims=spatial_dims, + in_channels=input_channel, + out_channels=output_channel, + temb_channels=time_embed_dim, + num_res_blocks=num_res_blocks[i], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_downsample=not is_final_block, + resblock_updown=resblock_updown, + with_attn=(attention_levels[i] and not with_conditioning), + with_cross_attn=(attention_levels[i] and with_conditioning), + num_head_channels=num_head_channels[i], + transformer_num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + ) + + self.down_blocks.append(down_block) + + self.out = nn.Sequential(nn.Linear(4096, 512), nn.ReLU(), nn.Dropout(0.1), nn.Linear(512, self.out_channels)) + + def forward( + self, + x: torch.Tensor, + timesteps: torch.Tensor, + context: torch.Tensor | None = None, + class_labels: torch.Tensor | None = None, + ) -> torch.Tensor: + """ + Args: + x: input tensor (N, C, SpatialDims). + timesteps: timestep tensor (N,). + context: context tensor (N, 1, ContextDim). + class_labels: context tensor (N, ). + """ + # 1. time + t_emb = get_timestep_embedding(timesteps, self.block_out_channels[0]) + + # timesteps does not contain any weights and will always return f32 tensors + # but time_embedding might actually be running in fp16. so we need to cast here. + # there might be better ways to encapsulate this. + t_emb = t_emb.to(dtype=x.dtype) + emb = self.time_embed(t_emb) + + # 2. class + if self.num_class_embeds is not None: + if class_labels is None: + raise ValueError("class_labels should be provided when num_class_embeds > 0") + class_emb = self.class_embedding(class_labels) + class_emb = class_emb.to(dtype=x.dtype) + emb = emb + class_emb + + # 3. initial convolution + h = self.conv_in(x) + + # 4. down + if context is not None and self.with_conditioning is False: + raise ValueError("model should have with_conditioning = True if context is provided") + for downsample_block in self.down_blocks: + h, _ = downsample_block(hidden_states=h, temb=emb, context=context) + + h = h.reshape(h.shape[0], -1) + output: torch.Tensor = self.out(h) + + return output diff --git a/monai/networks/nets/flexible_unet.py b/monai/networks/nets/flexible_unet.py index ac2124b5f9..c27b0fc17b 100644 --- a/monai/networks/nets/flexible_unet.py +++ b/monai/networks/nets/flexible_unet.py @@ -24,6 +24,7 @@ from monai.networks.layers.utils import get_act_layer from monai.networks.nets import EfficientNetEncoder from monai.networks.nets.basic_unet import UpCat +from monai.networks.nets.resnet import ResNetEncoder from monai.utils import InterpolateMode, optional_import __all__ = ["FlexibleUNet", "FlexUNet", "FLEXUNET_BACKBONE", "FlexUNetEncoderRegister"] @@ -78,6 +79,7 @@ def register_class(self, name: type[Any] | str): FLEXUNET_BACKBONE = FlexUNetEncoderRegister() FLEXUNET_BACKBONE.register_class(EfficientNetEncoder) +FLEXUNET_BACKBONE.register_class(ResNetEncoder) class UNetDecoder(nn.Module): @@ -238,7 +240,7 @@ def __init__( ) -> None: """ A flexible implement of UNet, in which the backbone/encoder can be replaced with - any efficient network. Currently the input must have a 2 or 3 spatial dimension + any efficient or residual network. Currently the input must have a 2 or 3 spatial dimension and the spatial size of each dimension must be a multiple of 32 if is_pad parameter is False. Please notice each output of backbone must be 2x downsample in spatial dimension @@ -248,10 +250,11 @@ def __init__( Args: in_channels: number of input channels. out_channels: number of output channels. - backbone: name of backbones to initialize, only support efficientnet right now, - can be from [efficientnet-b0,..., efficientnet-b8, efficientnet-l2]. - pretrained: whether to initialize pretrained ImageNet weights, only available - for spatial_dims=2 and batch norm is used, default to False. + backbone: name of backbones to initialize, only support efficientnet and resnet right now, + can be from [efficientnet-b0, ..., efficientnet-b8, efficientnet-l2, resnet10, ..., resnet200]. + pretrained: whether to initialize pretrained weights. ImageNet weights are available for efficient networks + if spatial_dims=2 and batch norm is used. MedicalNet weights are available for residual networks + if spatial_dims=3 and in_channels=1. Default to False. decoder_channels: number of output channels for all feature maps in decoder. `len(decoder_channels)` should equal to `len(encoder_channels) - 1`,default to (256, 128, 64, 32, 16). diff --git a/monai/networks/nets/patchgan_discriminator.py b/monai/networks/nets/patchgan_discriminator.py new file mode 100644 index 0000000000..74da917694 --- /dev/null +++ b/monai/networks/nets/patchgan_discriminator.py @@ -0,0 +1,230 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from collections.abc import Sequence + +import torch +import torch.nn as nn + +from monai.networks.blocks import Convolution +from monai.networks.layers import Act +from monai.networks.utils import normal_init + + +class MultiScalePatchDiscriminator(nn.Sequential): + """ + Multi-scale Patch-GAN discriminator based on Pix2PixHD: + High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs (https://arxiv.org/abs/1711.11585) + + The Multi-scale discriminator made up of several PatchGAN discriminators, that process the images + at different spatial scales. + + Args: + num_d: number of discriminators + num_layers_d: number of Convolution layers (Conv + activation + normalisation + [dropout]) in the first + discriminator. Each subsequent discriminator has one additional layer, meaning the output size is halved. + spatial_dims: number of spatial dimensions (1D, 2D etc.) + channels: number of filters in the first convolutional layer (doubled for each subsequent layer) + in_channels: number of input channels + out_channels: number of output channels in each discriminator + kernel_size: kernel size of the convolution layers + activation: activation layer type + norm: normalisation type + bias: introduction of layer bias + dropout: probability of dropout applied, defaults to 0. + minimum_size_im: minimum spatial size of the input image. Introduced to make sure the architecture + requested isn't going to downsample the input image beyond value of 1. + last_conv_kernel_size: kernel size of the last convolutional layer. + """ + + def __init__( + self, + num_d: int, + num_layers_d: int, + spatial_dims: int, + channels: int, + in_channels: int, + out_channels: int = 1, + kernel_size: int = 4, + activation: str | tuple = (Act.LEAKYRELU, {"negative_slope": 0.2}), + norm: str | tuple = "BATCH", + bias: bool = False, + dropout: float | tuple = 0.0, + minimum_size_im: int = 256, + last_conv_kernel_size: int = 1, + ) -> None: + super().__init__() + self.num_d = num_d + self.num_layers_d = num_layers_d + self.num_channels = channels + self.padding = tuple([int((kernel_size - 1) / 2)] * spatial_dims) + for i_ in range(self.num_d): + num_layers_d_i = self.num_layers_d * (i_ + 1) + output_size = float(minimum_size_im) / (2**num_layers_d_i) + if output_size < 1: + raise AssertionError( + f"Your image size is too small to take in up to {i_} discriminators with num_layers = {num_layers_d_i}." + "Please reduce num_layers, reduce num_D or enter bigger images." + ) + subnet_d = PatchDiscriminator( + spatial_dims=spatial_dims, + channels=self.num_channels, + in_channels=in_channels, + out_channels=out_channels, + num_layers_d=num_layers_d_i, + kernel_size=kernel_size, + activation=activation, + norm=norm, + bias=bias, + padding=self.padding, + dropout=dropout, + last_conv_kernel_size=last_conv_kernel_size, + ) + + self.add_module("discriminator_%d" % i_, subnet_d) + + def forward(self, i: torch.Tensor) -> tuple[list[torch.Tensor], list[list[torch.Tensor]]]: + """ + Args: + i: Input tensor + + Returns: + list of outputs and another list of lists with the intermediate features + of each discriminator. + """ + + out: list[torch.Tensor] = [] + intermediate_features: list[list[torch.Tensor]] = [] + for disc in self.children(): + out_d: list[torch.Tensor] = disc(i) + out.append(out_d[-1]) + intermediate_features.append(out_d[:-1]) + + return out, intermediate_features + + +class PatchDiscriminator(nn.Sequential): + """ + Patch-GAN discriminator based on Pix2PixHD: + High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs (https://arxiv.org/abs/1711.11585) + + + Args: + spatial_dims: number of spatial dimensions (1D, 2D etc.) + channels: number of filters in the first convolutional layer (doubled for each subsequent layer) + in_channels: number of input channels + out_channels: number of output channels + num_layers_d: number of Convolution layers (Conv + activation + normalisation + [dropout]) in the discriminator. + kernel_size: kernel size of the convolution layers + act: activation type and arguments. Defaults to LeakyReLU. + norm: feature normalization type and arguments. Defaults to batch norm. + bias: whether to have a bias term in convolution blocks. Defaults to False. + padding: padding to be applied to the convolutional layers + dropout: proportion of dropout applied, defaults to 0. + last_conv_kernel_size: kernel size of the last convolutional layer. + """ + + def __init__( + self, + spatial_dims: int, + channels: int, + in_channels: int, + out_channels: int = 1, + num_layers_d: int = 3, + kernel_size: int = 4, + activation: str | tuple = (Act.LEAKYRELU, {"negative_slope": 0.2}), + norm: str | tuple = "BATCH", + bias: bool = False, + padding: int | Sequence[int] = 1, + dropout: float | tuple = 0.0, + last_conv_kernel_size: int | None = None, + ) -> None: + super().__init__() + self.num_layers_d = num_layers_d + self.num_channels = channels + if last_conv_kernel_size is None: + last_conv_kernel_size = kernel_size + + self.add_module( + "initial_conv", + Convolution( + spatial_dims=spatial_dims, + kernel_size=kernel_size, + in_channels=in_channels, + out_channels=channels, + act=activation, + bias=True, + norm=None, + dropout=dropout, + padding=padding, + strides=2, + ), + ) + + input_channels = channels + output_channels = channels * 2 + + # Initial Layer + for l_ in range(self.num_layers_d): + if l_ == self.num_layers_d - 1: + stride = 1 + else: + stride = 2 + layer = Convolution( + spatial_dims=spatial_dims, + kernel_size=kernel_size, + in_channels=input_channels, + out_channels=output_channels, + act=activation, + bias=bias, + norm=norm, + dropout=dropout, + padding=padding, + strides=stride, + ) + self.add_module("%d" % l_, layer) + input_channels = output_channels + output_channels = output_channels * 2 + + # Final layer + self.add_module( + "final_conv", + Convolution( + spatial_dims=spatial_dims, + kernel_size=last_conv_kernel_size, + in_channels=input_channels, + out_channels=out_channels, + bias=True, + conv_only=True, + padding=int((last_conv_kernel_size - 1) / 2), + dropout=0.0, + strides=1, + ), + ) + + self.apply(normal_init) + + def forward(self, x: torch.Tensor) -> list[torch.Tensor]: + """ + Args: + x: input tensor + + Returns: + list of intermediate features, with the last element being the output. + """ + out = [x] + for submodel in self.children(): + intermediate_output = submodel(out[-1]) + out.append(intermediate_output) + + return out[1:] diff --git a/monai/networks/nets/quicknat.py b/monai/networks/nets/quicknat.py index cbcccf24d7..7e0f9c6b38 100644 --- a/monai/networks/nets/quicknat.py +++ b/monai/networks/nets/quicknat.py @@ -42,7 +42,7 @@ class SkipConnectionWithIdx(SkipConnection): Inherits from SkipConnection but provides the indizes with each forward pass. """ - def forward(self, input, indices): + def forward(self, input, indices): # type: ignore[override] return super().forward(input), indices @@ -57,7 +57,7 @@ class SequentialWithIdx(nn.Sequential): def __init__(self, *args): super().__init__(*args) - def forward(self, input, indices): + def forward(self, input, indices): # type: ignore[override] for module in self: input, indices = module(input, indices) return input, indices @@ -165,9 +165,11 @@ def _get_layer(self, in_channels, out_channels, dilation): ) return nn.Sequential(conv.get_submodule("adn"), conv.get_submodule("conv")) - def forward(self, input, _): + def forward(self, input, _): # type: ignore[override] i = 0 result = input + result1 = input # this will not stay this value, needed here for pylint/mypy + for l in self.children(): # ignoring the max (un-)pool and droupout already added in the initial initialization step if isinstance(l, (nn.MaxPool2d, nn.MaxUnpool2d, nn.Dropout2d)): @@ -213,7 +215,7 @@ def __init__(self, in_channels: int, max_pool, se_layer, dropout, kernel_size, n super().__init__(in_channels, se_layer, dropout, kernel_size, num_filters) self.max_pool = max_pool - def forward(self, input, indices=None): + def forward(self, input, indices=None): # type: ignore[override] input, indices = self.max_pool(input) out_block, _ = super().forward(input, None) @@ -241,7 +243,7 @@ def __init__(self, in_channels: int, un_pool, se_layer, dropout, kernel_size, nu super().__init__(in_channels, se_layer, dropout, kernel_size, num_filters) self.un_pool = un_pool - def forward(self, input, indices): + def forward(self, input, indices): # type: ignore[override] out_block, _ = super().forward(input, None) out_block = self.un_pool(out_block, indices) return out_block, None @@ -268,7 +270,7 @@ def __init__(self, in_channels: int, se_layer, dropout, max_pool, un_pool, kerne self.max_pool = max_pool self.un_pool = un_pool - def forward(self, input, indices): + def forward(self, input, indices): # type: ignore[override] out_block, indices = self.max_pool(input) out_block, _ = super().forward(out_block, None) out_block = self.un_pool(out_block, indices) diff --git a/monai/networks/nets/resnet.py b/monai/networks/nets/resnet.py index 34a4b7057e..d62722478e 100644 --- a/monai/networks/nets/resnet.py +++ b/monai/networks/nets/resnet.py @@ -21,8 +21,9 @@ import torch import torch.nn as nn -from monai.networks.layers.factories import Conv, Norm, Pool -from monai.networks.layers.utils import get_pool_layer +from monai.networks.blocks.encoder import BaseEncoder +from monai.networks.layers.factories import Conv, Pool +from monai.networks.layers.utils import get_act_layer, get_norm_layer, get_pool_layer from monai.utils import ensure_tuple_rep from monai.utils.module import look_up_option, optional_import @@ -45,6 +46,17 @@ "resnet200", ] +resnet_params = { + # model_name: (block, layers, shortcut_type, bias_downsample, datasets23) + "resnet10": ("basic", [1, 1, 1, 1], "B", False, True), + "resnet18": ("basic", [2, 2, 2, 2], "A", True, True), + "resnet34": ("basic", [3, 4, 6, 3], "A", True, True), + "resnet50": ("bottleneck", [3, 4, 6, 3], "B", False, True), + "resnet101": ("bottleneck", [3, 4, 23, 3], "B", False, False), + "resnet152": ("bottleneck", [3, 8, 36, 3], "B", False, False), + "resnet200": ("bottleneck", [3, 24, 36, 3], "B", False, False), +} + logger = logging.getLogger(__name__) @@ -66,6 +78,8 @@ def __init__( spatial_dims: int = 3, stride: int = 1, downsample: nn.Module | partial | None = None, + act: str | tuple = ("relu", {"inplace": True}), + norm: str | tuple = "batch", ) -> None: """ Args: @@ -74,17 +88,18 @@ def __init__( spatial_dims: number of spatial dimensions of the input image. stride: stride to use for first conv layer. downsample: which downsample layer to use. + act: activation type and arguments. Defaults to relu. + norm: feature normalization type and arguments. Defaults to batch norm. """ super().__init__() conv_type: Callable = Conv[Conv.CONV, spatial_dims] - norm_type: Callable = Norm[Norm.BATCH, spatial_dims] self.conv1 = conv_type(in_planes, planes, kernel_size=3, padding=1, stride=stride, bias=False) - self.bn1 = norm_type(planes) - self.relu = nn.ReLU(inplace=True) + self.bn1 = get_norm_layer(name=norm, spatial_dims=spatial_dims, channels=planes) + self.act = get_act_layer(name=act) self.conv2 = conv_type(planes, planes, kernel_size=3, padding=1, bias=False) - self.bn2 = norm_type(planes) + self.bn2 = get_norm_layer(name=norm, spatial_dims=spatial_dims, channels=planes) self.downsample = downsample self.stride = stride @@ -93,7 +108,7 @@ def forward(self, x: torch.Tensor) -> torch.Tensor: out: torch.Tensor = self.conv1(x) out = self.bn1(out) - out = self.relu(out) + out = self.act(out) out = self.conv2(out) out = self.bn2(out) @@ -102,7 +117,7 @@ def forward(self, x: torch.Tensor) -> torch.Tensor: residual = self.downsample(x) out += residual - out = self.relu(out) + out = self.act(out) return out @@ -117,6 +132,8 @@ def __init__( spatial_dims: int = 3, stride: int = 1, downsample: nn.Module | partial | None = None, + act: str | tuple = ("relu", {"inplace": True}), + norm: str | tuple = "batch", ) -> None: """ Args: @@ -125,20 +142,22 @@ def __init__( spatial_dims: number of spatial dimensions of the input image. stride: stride to use for second conv layer. downsample: which downsample layer to use. + act: activation type and arguments. Defaults to relu. + norm: feature normalization type and arguments. Defaults to batch norm. """ super().__init__() conv_type: Callable = Conv[Conv.CONV, spatial_dims] - norm_type: Callable = Norm[Norm.BATCH, spatial_dims] + norm_layer = partial(get_norm_layer, name=norm, spatial_dims=spatial_dims) self.conv1 = conv_type(in_planes, planes, kernel_size=1, bias=False) - self.bn1 = norm_type(planes) + self.bn1 = norm_layer(channels=planes) self.conv2 = conv_type(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False) - self.bn2 = norm_type(planes) + self.bn2 = norm_layer(channels=planes) self.conv3 = conv_type(planes, planes * self.expansion, kernel_size=1, bias=False) - self.bn3 = norm_type(planes * self.expansion) - self.relu = nn.ReLU(inplace=True) + self.bn3 = norm_layer(channels=planes * self.expansion) + self.act = get_act_layer(name=act) self.downsample = downsample self.stride = stride @@ -147,11 +166,11 @@ def forward(self, x: torch.Tensor) -> torch.Tensor: out: torch.Tensor = self.conv1(x) out = self.bn1(out) - out = self.relu(out) + out = self.act(out) out = self.conv2(out) out = self.bn2(out) - out = self.relu(out) + out = self.act(out) out = self.conv3(out) out = self.bn3(out) @@ -160,7 +179,7 @@ def forward(self, x: torch.Tensor) -> torch.Tensor: residual = self.downsample(x) out += residual - out = self.relu(out) + out = self.act(out) return out @@ -190,6 +209,8 @@ class ResNet(nn.Module): num_classes: number of output (classifications). feed_forward: whether to add the FC layer for the output, default to `True`. bias_downsample: whether to use bias term in the downsampling block when `shortcut_type` is 'B', default to `True`. + act: activation type and arguments. Defaults to relu. + norm: feature normalization type and arguments. Defaults to batch norm. """ @@ -208,6 +229,8 @@ def __init__( num_classes: int = 400, feed_forward: bool = True, bias_downsample: bool = True, # for backwards compatibility (also see PR #5477) + act: str | tuple = ("relu", {"inplace": True}), + norm: str | tuple = "batch", ) -> None: super().__init__() @@ -220,7 +243,6 @@ def __init__( raise ValueError("Unknown block '%s', use basic or bottleneck" % block) conv_type: type[nn.Conv1d | nn.Conv2d | nn.Conv3d] = Conv[Conv.CONV, spatial_dims] - norm_type: type[nn.BatchNorm1d | nn.BatchNorm2d | nn.BatchNorm3d] = Norm[Norm.BATCH, spatial_dims] pool_type: type[nn.MaxPool1d | nn.MaxPool2d | nn.MaxPool3d] = Pool[Pool.MAX, spatial_dims] avgp_type: type[nn.AdaptiveAvgPool1d | nn.AdaptiveAvgPool2d | nn.AdaptiveAvgPool3d] = Pool[ Pool.ADAPTIVEAVG, spatial_dims @@ -244,8 +266,10 @@ def __init__( padding=tuple(k // 2 for k in conv1_kernel_size), bias=False, ) - self.bn1 = norm_type(self.in_planes) - self.relu = nn.ReLU(inplace=True) + + norm_layer = get_norm_layer(name=norm, spatial_dims=spatial_dims, channels=self.in_planes) + self.bn1 = norm_layer + self.act = get_act_layer(name=act) self.maxpool = pool_type(kernel_size=3, stride=2, padding=1) self.layer1 = self._make_layer(block, block_inplanes[0], layers[0], spatial_dims, shortcut_type) self.layer2 = self._make_layer(block, block_inplanes[1], layers[1], spatial_dims, shortcut_type, stride=2) @@ -257,7 +281,7 @@ def __init__( for m in self.modules(): if isinstance(m, conv_type): nn.init.kaiming_normal_(torch.as_tensor(m.weight), mode="fan_out", nonlinearity="relu") - elif isinstance(m, norm_type): + elif isinstance(m, type(norm_layer)): nn.init.constant_(torch.as_tensor(m.weight), 1) nn.init.constant_(torch.as_tensor(m.bias), 0) elif isinstance(m, nn.Linear): @@ -277,9 +301,9 @@ def _make_layer( spatial_dims: int, shortcut_type: str, stride: int = 1, + norm: str | tuple = "batch", ) -> nn.Sequential: conv_type: Callable = Conv[Conv.CONV, spatial_dims] - norm_type: Callable = Norm[Norm.BATCH, spatial_dims] downsample: nn.Module | partial | None = None if stride != 1 or self.in_planes != planes * block.expansion: @@ -299,25 +323,30 @@ def _make_layer( stride=stride, bias=self.bias_downsample, ), - norm_type(planes * block.expansion), + get_norm_layer(name=norm, spatial_dims=spatial_dims, channels=planes * block.expansion), ) layers = [ block( - in_planes=self.in_planes, planes=planes, spatial_dims=spatial_dims, stride=stride, downsample=downsample + in_planes=self.in_planes, + planes=planes, + spatial_dims=spatial_dims, + stride=stride, + downsample=downsample, + norm=norm, ) ] self.in_planes = planes * block.expansion for _i in range(1, blocks): - layers.append(block(self.in_planes, planes, spatial_dims=spatial_dims)) + layers.append(block(self.in_planes, planes, spatial_dims=spatial_dims, norm=norm)) return nn.Sequential(*layers) def forward(self, x: torch.Tensor) -> torch.Tensor: x = self.conv1(x) x = self.bn1(x) - x = self.relu(x) + x = self.act(x) if not self.no_max_pool: x = self.maxpool(x) @@ -335,6 +364,120 @@ def forward(self, x: torch.Tensor) -> torch.Tensor: return x +class ResNetFeatures(ResNet): + + def __init__(self, model_name: str, pretrained: bool = True, spatial_dims: int = 3, in_channels: int = 1) -> None: + """Initialize resnet18 to resnet200 models as a backbone, the backbone can be used as an encoder for + segmentation and objection models. + + Compared with the class `ResNet`, the only different place is the forward function. + + Args: + model_name: name of model to initialize, can be from [resnet10, ..., resnet200]. + pretrained: whether to initialize pretrained MedicalNet weights, + only available for spatial_dims=3 and in_channels=1. + spatial_dims: number of spatial dimensions of the input image. + in_channels: number of input channels for first convolutional layer. + """ + if model_name not in resnet_params: + model_name_string = ", ".join(resnet_params.keys()) + raise ValueError(f"invalid model_name {model_name} found, must be one of {model_name_string} ") + + block, layers, shortcut_type, bias_downsample, datasets23 = resnet_params[model_name] + + super().__init__( + block=block, + layers=layers, + block_inplanes=get_inplanes(), + spatial_dims=spatial_dims, + n_input_channels=in_channels, + conv1_t_stride=2, + shortcut_type=shortcut_type, + feed_forward=False, + bias_downsample=bias_downsample, + ) + if pretrained: + if spatial_dims == 3 and in_channels == 1: + _load_state_dict(self, model_name, datasets23=datasets23) + else: + raise ValueError("Pretrained resnet models are only available for in_channels=1 and spatial_dims=3.") + + def forward(self, inputs: torch.Tensor): + """ + Args: + inputs: input should have spatially N dimensions + ``(Batch, in_channels, dim_0[, dim_1, ..., dim_N])``, N is defined by `dimensions`. + + Returns: + a list of torch Tensors. + """ + x = self.conv1(inputs) + x = self.bn1(x) + x = self.act(x) + + features = [] + features.append(x) + + if not self.no_max_pool: + x = self.maxpool(x) + + x = self.layer1(x) + features.append(x) + + x = self.layer2(x) + features.append(x) + + x = self.layer3(x) + features.append(x) + + x = self.layer4(x) + features.append(x) + + return features + + +class ResNetEncoder(ResNetFeatures, BaseEncoder): + """Wrap the original resnet to an encoder for flexible-unet.""" + + backbone_names = ["resnet10", "resnet18", "resnet34", "resnet50", "resnet101", "resnet152", "resnet200"] + + @classmethod + def get_encoder_parameters(cls) -> list[dict]: + """Get the initialization parameter for resnet backbones.""" + parameter_list = [] + for backbone_name in cls.backbone_names: + parameter_list.append( + {"model_name": backbone_name, "pretrained": True, "spatial_dims": 3, "in_channels": 1} + ) + return parameter_list + + @classmethod + def num_channels_per_output(cls) -> list[tuple[int, ...]]: + """Get number of resnet backbone output feature maps channel.""" + return [ + (64, 64, 128, 256, 512), + (64, 64, 128, 256, 512), + (64, 64, 128, 256, 512), + (64, 256, 512, 1024, 2048), + (64, 256, 512, 1024, 2048), + (64, 256, 512, 1024, 2048), + (64, 256, 512, 1024, 2048), + ] + + @classmethod + def num_outputs(cls) -> list[int]: + """Get number of resnet backbone output feature maps. + + Since every backbone contains the same 5 output feature maps, the number list should be `[5] * 7`. + """ + return [5] * 7 + + @classmethod + def get_encoder_names(cls) -> list[str]: + """Get names of resnet backbones.""" + return cls.backbone_names + + def _resnet( arch: str, block: type[ResNetBlock | ResNetBottleneck], @@ -367,7 +510,7 @@ def _resnet( # Check model bias_downsample and shortcut_type bias_downsample, shortcut_type = get_medicalnet_pretrained_resnet_args(resnet_depth) if shortcut_type == kwargs.get("shortcut_type", "B") and ( - bool(bias_downsample) == kwargs.get("bias_downsample", False) if bias_downsample != -1 else True + bias_downsample == kwargs.get("bias_downsample", True) ): # Download the MedicalNet pretrained model model_state_dict = get_pretrained_resnet_medicalnet( @@ -375,8 +518,7 @@ def _resnet( ) else: raise NotImplementedError( - f"Please set shortcut_type to {shortcut_type} and bias_downsample to" - f"{bool(bias_downsample) if bias_downsample!=-1 else 'True or False'}" + f"Please set shortcut_type to {shortcut_type} and bias_downsample to {bias_downsample} " f"when using pretrained MedicalNet resnet{resnet_depth}" ) else: @@ -477,7 +619,7 @@ def resnet200(pretrained: bool = False, progress: bool = True, **kwargs: Any) -> def get_pretrained_resnet_medicalnet(resnet_depth: int, device: str = "cpu", datasets23: bool = True): """ - Donwlad resnet pretrained weights from https://huggingface.co/TencentMedicalNet + Download resnet pretrained weights from https://huggingface.co/TencentMedicalNet Args: resnet_depth: depth of the pretrained model. Supported values are 10, 18, 34, 50, 101, 152 and 200 @@ -533,11 +675,24 @@ def get_pretrained_resnet_medicalnet(resnet_depth: int, device: str = "cpu", dat def get_medicalnet_pretrained_resnet_args(resnet_depth: int): """ Return correct shortcut_type and bias_downsample - for pretrained MedicalNet weights according to resnet depth + for pretrained MedicalNet weights according to resnet depth. """ # After testing # False: 10, 50, 101, 152, 200 # Any: 18, 34 - bias_downsample = -1 if resnet_depth in [18, 34] else 0 # 18, 10, 34 + bias_downsample = resnet_depth in (18, 34) shortcut_type = "A" if resnet_depth in [18, 34] else "B" return bias_downsample, shortcut_type + + +def _load_state_dict(model: nn.Module, model_name: str, datasets23: bool = True) -> None: + search_res = re.search(r"resnet(\d+)", model_name) + if search_res: + resnet_depth = int(search_res.group(1)) + datasets23 = model_name.endswith("_23datasets") + else: + raise ValueError("model_name argument should contain resnet depth. Example: resnet18 or resnet18_23datasets.") + + model_state_dict = get_pretrained_resnet_medicalnet(resnet_depth, device="cpu", datasets23=datasets23) + model_state_dict = {key.replace("module.", ""): value for key, value in model_state_dict.items()} + model.load_state_dict(model_state_dict) diff --git a/monai/networks/nets/spade_autoencoderkl.py b/monai/networks/nets/spade_autoencoderkl.py new file mode 100644 index 0000000000..294b121c94 --- /dev/null +++ b/monai/networks/nets/spade_autoencoderkl.py @@ -0,0 +1,480 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from collections.abc import Sequence + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from monai.networks.blocks import Convolution, SpatialAttentionBlock, Upsample +from monai.networks.blocks.spade_norm import SPADE +from monai.networks.nets.autoencoderkl import Encoder +from monai.utils import ensure_tuple_rep + +__all__ = ["SPADEAutoencoderKL"] + + +class SPADEResBlock(nn.Module): + """ + Residual block consisting of a cascade of 2 convolutions + activation + normalisation block, and a + residual connection between input and output. + Enables SPADE normalisation for semantic conditioning (Park et. al (2019): https://github.com/NVlabs/SPADE) + + Args: + spatial_dims: number of spatial dimensions (1D, 2D, 3D). + in_channels: input channels to the layer. + norm_num_groups: number of groups involved for the group normalisation layer. Ensure that your number of + channels is divisible by this number. + norm_eps: epsilon for the normalisation. + out_channels: number of output channels. + label_nc: number of semantic channels for SPADE normalisation + spade_intermediate_channels: number of intermediate channels for SPADE block layer + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + norm_num_groups: int, + norm_eps: float, + out_channels: int, + label_nc: int, + spade_intermediate_channels: int, + ) -> None: + super().__init__() + self.in_channels = in_channels + self.out_channels = in_channels if out_channels is None else out_channels + self.norm1 = SPADE( + label_nc=label_nc, + norm_nc=in_channels, + norm="GROUP", + norm_params={"num_groups": norm_num_groups, "affine": False}, + hidden_channels=spade_intermediate_channels, + kernel_size=3, + spatial_dims=spatial_dims, + ) + self.conv1 = Convolution( + spatial_dims=spatial_dims, + in_channels=self.in_channels, + out_channels=self.out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + self.norm2 = SPADE( + label_nc=label_nc, + norm_nc=out_channels, + norm="GROUP", + norm_params={"num_groups": norm_num_groups, "affine": False}, + hidden_channels=spade_intermediate_channels, + kernel_size=3, + spatial_dims=spatial_dims, + ) + self.conv2 = Convolution( + spatial_dims=spatial_dims, + in_channels=self.out_channels, + out_channels=self.out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + + self.nin_shortcut: nn.Module + if self.in_channels != self.out_channels: + self.nin_shortcut = Convolution( + spatial_dims=spatial_dims, + in_channels=self.in_channels, + out_channels=self.out_channels, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + ) + else: + self.nin_shortcut = nn.Identity() + + def forward(self, x: torch.Tensor, seg: torch.Tensor) -> torch.Tensor: + h = x + h = self.norm1(h, seg) + h = F.silu(h) + h = self.conv1(h) + h = self.norm2(h, seg) + h = F.silu(h) + h = self.conv2(h) + + x = self.nin_shortcut(x) + + return x + h + + +class SPADEDecoder(nn.Module): + """ + Convolutional cascade upsampling from a spatial latent space into an image space. + Enables SPADE normalisation for semantic conditioning (Park et. al (2019): https://github.com/NVlabs/SPADE) + + Args: + spatial_dims: number of spatial dimensions (1D, 2D, 3D). + channels: sequence of block output channels. + in_channels: number of channels in the bottom layer (latent space) of the autoencoder. + out_channels: number of output channels. + num_res_blocks: number of residual blocks (see ResBlock) per level. + norm_num_groups: number of groups for the GroupNorm layers, channels must be divisible by this number. + norm_eps: epsilon for the normalization. + attention_levels: indicate which level from channels contain an attention block. + label_nc: number of semantic channels for SPADE normalisation. + with_nonlocal_attn: if True use non-local attention block. + spade_intermediate_channels: number of intermediate channels for SPADE block layer. + """ + + def __init__( + self, + spatial_dims: int, + channels: Sequence[int], + in_channels: int, + out_channels: int, + num_res_blocks: Sequence[int], + norm_num_groups: int, + norm_eps: float, + attention_levels: Sequence[bool], + label_nc: int, + with_nonlocal_attn: bool = True, + spade_intermediate_channels: int = 128, + ) -> None: + super().__init__() + self.spatial_dims = spatial_dims + self.channels = channels + self.in_channels = in_channels + self.out_channels = out_channels + self.num_res_blocks = num_res_blocks + self.norm_num_groups = norm_num_groups + self.norm_eps = norm_eps + self.attention_levels = attention_levels + self.label_nc = label_nc + + reversed_block_out_channels = list(reversed(channels)) + + blocks: list[nn.Module] = [] + + # Initial convolution + blocks.append( + Convolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=reversed_block_out_channels[0], + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + ) + + # Non-local attention block + if with_nonlocal_attn is True: + blocks.append( + SPADEResBlock( + spatial_dims=spatial_dims, + in_channels=reversed_block_out_channels[0], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + out_channels=reversed_block_out_channels[0], + label_nc=label_nc, + spade_intermediate_channels=spade_intermediate_channels, + ) + ) + blocks.append( + SpatialAttentionBlock( + spatial_dims=spatial_dims, + num_channels=reversed_block_out_channels[0], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + ) + blocks.append( + SPADEResBlock( + spatial_dims=spatial_dims, + in_channels=reversed_block_out_channels[0], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + out_channels=reversed_block_out_channels[0], + label_nc=label_nc, + spade_intermediate_channels=spade_intermediate_channels, + ) + ) + + reversed_attention_levels = list(reversed(attention_levels)) + reversed_num_res_blocks = list(reversed(num_res_blocks)) + block_out_ch = reversed_block_out_channels[0] + for i in range(len(reversed_block_out_channels)): + block_in_ch = block_out_ch + block_out_ch = reversed_block_out_channels[i] + is_final_block = i == len(channels) - 1 + + for _ in range(reversed_num_res_blocks[i]): + blocks.append( + SPADEResBlock( + spatial_dims=spatial_dims, + in_channels=block_in_ch, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + out_channels=block_out_ch, + label_nc=label_nc, + spade_intermediate_channels=spade_intermediate_channels, + ) + ) + block_in_ch = block_out_ch + + if reversed_attention_levels[i]: + blocks.append( + SpatialAttentionBlock( + spatial_dims=spatial_dims, + num_channels=block_in_ch, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + ) + + if not is_final_block: + post_conv = Convolution( + spatial_dims=spatial_dims, + in_channels=block_in_ch, + out_channels=block_in_ch, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + blocks.append( + Upsample( + spatial_dims=spatial_dims, + mode="nontrainable", + in_channels=block_in_ch, + out_channels=block_in_ch, + interp_mode="nearest", + scale_factor=2.0, + post_conv=post_conv, + align_corners=None, + ) + ) + + blocks.append(nn.GroupNorm(num_groups=norm_num_groups, num_channels=block_in_ch, eps=norm_eps, affine=True)) + blocks.append( + Convolution( + spatial_dims=spatial_dims, + in_channels=block_in_ch, + out_channels=out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + ) + + self.blocks = nn.ModuleList(blocks) + + def forward(self, x: torch.Tensor, seg: torch.Tensor) -> torch.Tensor: + for block in self.blocks: + if isinstance(block, SPADEResBlock): + x = block(x, seg) + else: + x = block(x) + return x + + +class SPADEAutoencoderKL(nn.Module): + """ + Autoencoder model with KL-regularized latent space based on + Rombach et al. "High-Resolution Image Synthesis with Latent Diffusion Models" https://arxiv.org/abs/2112.10752 + and Pinaya et al. "Brain Imaging Generation with Latent Diffusion Models" https://arxiv.org/abs/2209.07162 + Enables SPADE normalisation for semantic conditioning (Park et. al (2019): https://github.com/NVlabs/SPADE) + + Args: + spatial_dims: number of spatial dimensions (1D, 2D, 3D). + label_nc: number of semantic channels for SPADE normalisation. + in_channels: number of input channels. + out_channels: number of output channels. + num_res_blocks: number of residual blocks (see ResBlock) per level. + channels: sequence of block output channels. + attention_levels: sequence of levels to add attention. + latent_channels: latent embedding dimension. + norm_num_groups: number of groups for the GroupNorm layers, channels must be divisible by this number. + norm_eps: epsilon for the normalization. + with_encoder_nonlocal_attn: if True use non-local attention block in the encoder. + with_decoder_nonlocal_attn: if True use non-local attention block in the decoder. + spade_intermediate_channels: number of intermediate channels for SPADE block layer. + """ + + def __init__( + self, + spatial_dims: int, + label_nc: int, + in_channels: int = 1, + out_channels: int = 1, + num_res_blocks: Sequence[int] | int = (2, 2, 2, 2), + channels: Sequence[int] = (32, 64, 64, 64), + attention_levels: Sequence[bool] = (False, False, True, True), + latent_channels: int = 3, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + with_encoder_nonlocal_attn: bool = True, + with_decoder_nonlocal_attn: bool = True, + spade_intermediate_channels: int = 128, + ) -> None: + super().__init__() + + # All number of channels should be multiple of num_groups + if any((out_channel % norm_num_groups) != 0 for out_channel in channels): + raise ValueError("SPADEAutoencoderKL expects all channels being multiple of norm_num_groups") + + if len(channels) != len(attention_levels): + raise ValueError("SPADEAutoencoderKL expects channels being same size of attention_levels") + + if isinstance(num_res_blocks, int): + num_res_blocks = ensure_tuple_rep(num_res_blocks, len(channels)) + + if len(num_res_blocks) != len(channels): + raise ValueError( + "`num_res_blocks` should be a single integer or a tuple of integers with the same length as " + "`channels`." + ) + + self.encoder = Encoder( + spatial_dims=spatial_dims, + in_channels=in_channels, + channels=channels, + out_channels=latent_channels, + num_res_blocks=num_res_blocks, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + attention_levels=attention_levels, + with_nonlocal_attn=with_encoder_nonlocal_attn, + ) + self.decoder = SPADEDecoder( + spatial_dims=spatial_dims, + channels=channels, + in_channels=latent_channels, + out_channels=out_channels, + num_res_blocks=num_res_blocks, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + attention_levels=attention_levels, + label_nc=label_nc, + with_nonlocal_attn=with_decoder_nonlocal_attn, + spade_intermediate_channels=spade_intermediate_channels, + ) + self.quant_conv_mu = Convolution( + spatial_dims=spatial_dims, + in_channels=latent_channels, + out_channels=latent_channels, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + ) + self.quant_conv_log_sigma = Convolution( + spatial_dims=spatial_dims, + in_channels=latent_channels, + out_channels=latent_channels, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + ) + self.post_quant_conv = Convolution( + spatial_dims=spatial_dims, + in_channels=latent_channels, + out_channels=latent_channels, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + ) + self.latent_channels = latent_channels + + def encode(self, x: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor]: + """ + Forwards an image through the spatial encoder, obtaining the latent mean and sigma representations. + + Args: + x: BxCx[SPATIAL DIMS] tensor + + """ + h = self.encoder(x) + z_mu = self.quant_conv_mu(h) + z_log_var = self.quant_conv_log_sigma(h) + z_log_var = torch.clamp(z_log_var, -30.0, 20.0) + z_sigma = torch.exp(z_log_var / 2) + + return z_mu, z_sigma + + def sampling(self, z_mu: torch.Tensor, z_sigma: torch.Tensor) -> torch.Tensor: + """ + From the mean and sigma representations resulting of encoding an image through the latent space, + obtains a noise sample resulting from sampling gaussian noise, multiplying by the variance (sigma) and + adding the mean. + + Args: + z_mu: Bx[Z_CHANNELS]x[LATENT SPACE SIZE] mean vector obtained by the encoder when you encode an image + z_sigma: Bx[Z_CHANNELS]x[LATENT SPACE SIZE] variance vector obtained by the encoder when you encode an image + + Returns: + sample of shape Bx[Z_CHANNELS]x[LATENT SPACE SIZE] + """ + eps = torch.randn_like(z_sigma) + z_vae = z_mu + eps * z_sigma + return z_vae + + def reconstruct(self, x: torch.Tensor, seg: torch.Tensor) -> torch.Tensor: + """ + Encodes and decodes an input image. + + Args: + x: BxCx[SPATIAL DIMENSIONS] tensor. + seg: Bx[LABEL_NC]x[SPATIAL DIMENSIONS] tensor of segmentations for SPADE norm. + Returns: + reconstructed image, of the same shape as input + """ + z_mu, _ = self.encode(x) + reconstruction = self.decode(z_mu, seg) + return reconstruction + + def decode(self, z: torch.Tensor, seg: torch.Tensor) -> torch.Tensor: + """ + Based on a latent space sample, forwards it through the Decoder. + + Args: + z: Bx[Z_CHANNELS]x[LATENT SPACE SHAPE] + seg: Bx[LABEL_NC]x[SPATIAL DIMENSIONS] tensor of segmentations for SPADE norm. + Returns: + decoded image tensor + """ + z = self.post_quant_conv(z) + dec: torch.Tensor = self.decoder(z, seg) + return dec + + def forward(self, x: torch.Tensor, seg: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + z_mu, z_sigma = self.encode(x) + z = self.sampling(z_mu, z_sigma) + reconstruction = self.decode(z, seg) + return reconstruction, z_mu, z_sigma + + def encode_stage_2_inputs(self, x: torch.Tensor) -> torch.Tensor: + z_mu, z_sigma = self.encode(x) + z = self.sampling(z_mu, z_sigma) + return z + + def decode_stage_2_outputs(self, z: torch.Tensor, seg: torch.Tensor) -> torch.Tensor: + image = self.decode(z, seg) + return image diff --git a/monai/networks/nets/spade_diffusion_model_unet.py b/monai/networks/nets/spade_diffusion_model_unet.py new file mode 100644 index 0000000000..75d1687df3 --- /dev/null +++ b/monai/networks/nets/spade_diffusion_model_unet.py @@ -0,0 +1,934 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ========================================================================= +# Adapted from https://github.com/huggingface/diffusers +# which has the following license: +# https://github.com/huggingface/diffusers/blob/main/LICENSE +# +# Copyright 2022 UC Berkeley Team and The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================================================================= + +from __future__ import annotations + +from collections.abc import Sequence + +import torch +from torch import nn + +from monai.networks.blocks import Convolution, SpatialAttentionBlock +from monai.networks.blocks.spade_norm import SPADE +from monai.networks.nets.diffusion_model_unet import ( + DiffusionUnetDownsample, + DiffusionUNetResnetBlock, + SpatialTransformer, + WrappedUpsample, + get_down_block, + get_mid_block, + get_timestep_embedding, + zero_module, +) +from monai.utils import ensure_tuple_rep + +__all__ = ["SPADEDiffusionModelUNet"] + + +class SPADEDiffResBlock(nn.Module): + """ + Residual block with timestep conditioning and SPADE norm. + Enables SPADE normalisation for semantic conditioning (Park et. al (2019): https://github.com/NVlabs/SPADE) + + Args: + spatial_dims: The number of spatial dimensions. + in_channels: number of input channels. + temb_channels: number of timestep embedding channels. + label_nc: number of semantic channels for SPADE normalisation. + out_channels: number of output channels. + up: if True, performs upsampling. + down: if True, performs downsampling. + norm_num_groups: number of groups for the group normalization. + norm_eps: epsilon for the group normalization. + spade_intermediate_channels: number of intermediate channels for SPADE block layer + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + temb_channels: int, + label_nc: int, + out_channels: int | None = None, + up: bool = False, + down: bool = False, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + spade_intermediate_channels: int = 128, + ) -> None: + super().__init__() + self.spatial_dims = spatial_dims + self.channels = in_channels + self.emb_channels = temb_channels + self.out_channels = out_channels or in_channels + self.up = up + self.down = down + + self.norm1 = SPADE( + label_nc=label_nc, + norm_nc=in_channels, + norm="GROUP", + norm_params={"num_groups": norm_num_groups, "eps": norm_eps, "affine": True}, + hidden_channels=spade_intermediate_channels, + kernel_size=3, + spatial_dims=spatial_dims, + ) + + self.nonlinearity = nn.SiLU() + self.conv1 = Convolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=self.out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + + self.upsample = self.downsample = None + if self.up: + self.upsample = WrappedUpsample( + spatial_dims=spatial_dims, + mode="nontrainable", + in_channels=in_channels, + out_channels=in_channels, + interp_mode="nearest", + scale_factor=2.0, + align_corners=None, + ) + elif down: + self.downsample = DiffusionUnetDownsample(spatial_dims, in_channels, use_conv=False) + + self.time_emb_proj = nn.Linear(temb_channels, self.out_channels) + + self.norm2 = SPADE( + label_nc=label_nc, + norm_nc=self.out_channels, + norm="GROUP", + norm_params={"num_groups": norm_num_groups, "eps": norm_eps, "affine": True}, + hidden_channels=spade_intermediate_channels, + kernel_size=3, + spatial_dims=spatial_dims, + ) + self.conv2 = zero_module( + Convolution( + spatial_dims=spatial_dims, + in_channels=self.out_channels, + out_channels=self.out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + ) + self.skip_connection: nn.Module + + if self.out_channels == in_channels: + self.skip_connection = nn.Identity() + else: + self.skip_connection = Convolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=self.out_channels, + strides=1, + kernel_size=1, + padding=0, + conv_only=True, + ) + + def forward(self, x: torch.Tensor, emb: torch.Tensor, seg: torch.Tensor) -> torch.Tensor: + h = x + h = self.norm1(h, seg) + h = self.nonlinearity(h) + + if self.upsample is not None: + x = self.upsample(x) + h = self.upsample(h) + elif self.downsample is not None: + x = self.downsample(x) + h = self.downsample(h) + + h = self.conv1(h) + + if self.spatial_dims == 2: + temb = self.time_emb_proj(self.nonlinearity(emb))[:, :, None, None] + else: + temb = self.time_emb_proj(self.nonlinearity(emb))[:, :, None, None, None] + h = h + temb + + h = self.norm2(h, seg) + h = self.nonlinearity(h) + h = self.conv2(h) + output: torch.Tensor = self.skip_connection(x) + h + return output + + +class SPADEUpBlock(nn.Module): + """ + Unet's up block containing resnet and upsamplers blocks. + Enables SPADE normalisation for semantic conditioning (Park et. al (2019): https://github.com/NVlabs/SPADE) + + Args: + spatial_dims: The number of spatial dimensions. + in_channels: number of input channels. + prev_output_channel: number of channels from residual connection. + out_channels: number of output channels. + temb_channels: number of timestep embedding channels. + label_nc: number of semantic channels for SPADE normalisation. + num_res_blocks: number of residual blocks. + norm_num_groups: number of groups for the group normalization. + norm_eps: epsilon for the group normalization. + add_upsample: if True add downsample block. + resblock_updown: if True use residual blocks for upsampling. + spade_intermediate_channels: number of intermediate channels for SPADE block layer. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + label_nc: int, + num_res_blocks: int = 1, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + add_upsample: bool = True, + resblock_updown: bool = False, + spade_intermediate_channels: int = 128, + ) -> None: + super().__init__() + self.resblock_updown = resblock_updown + resnets = [] + + for i in range(num_res_blocks): + res_skip_channels = in_channels if (i == num_res_blocks - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + resnets.append( + SPADEDiffResBlock( + spatial_dims=spatial_dims, + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + label_nc=label_nc, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + spade_intermediate_channels=spade_intermediate_channels, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + self.upsampler: nn.Module | None + if add_upsample: + if resblock_updown: + self.upsampler = DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + up=True, + ) + else: + post_conv = Convolution( + spatial_dims=spatial_dims, + in_channels=out_channels, + out_channels=out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + self.upsampler = WrappedUpsample( + spatial_dims=spatial_dims, + mode="nontrainable", + in_channels=out_channels, + out_channels=out_channels, + interp_mode="nearest", + scale_factor=2.0, + post_conv=post_conv, + align_corners=None, + ) + else: + self.upsampler = None + + def forward( + self, + hidden_states: torch.Tensor, + res_hidden_states_list: list[torch.Tensor], + temb: torch.Tensor, + seg: torch.Tensor, + context: torch.Tensor | None = None, + ) -> torch.Tensor: + del context + for resnet in self.resnets: + # pop res hidden states + res_hidden_states = res_hidden_states_list[-1] + res_hidden_states_list = res_hidden_states_list[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + hidden_states = resnet(hidden_states, temb, seg) + + if self.upsampler is not None: + hidden_states = self.upsampler(hidden_states, temb) + + return hidden_states + + +class SPADEAttnUpBlock(nn.Module): + """ + Unet's up block containing resnet, upsamplers, and self-attention blocks. + Enables SPADE normalisation for semantic conditioning (Park et. al (2019): https://github.com/NVlabs/SPADE) + + Args: + spatial_dims: The number of spatial dimensions. + in_channels: number of input channels. + prev_output_channel: number of channels from residual connection. + out_channels: number of output channels. + temb_channels: number of timestep embedding channels. + label_nc: number of semantic channels for SPADE normalisation + num_res_blocks: number of residual blocks. + norm_num_groups: number of groups for the group normalization. + norm_eps: epsilon for the group normalization. + add_upsample: if True add downsample block. + resblock_updown: if True use residual blocks for upsampling. + num_head_channels: number of channels in each attention head. + spade_intermediate_channels: number of intermediate channels for SPADE block layer + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + label_nc: int, + num_res_blocks: int = 1, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + add_upsample: bool = True, + resblock_updown: bool = False, + num_head_channels: int = 1, + spade_intermediate_channels: int = 128, + ) -> None: + super().__init__() + self.resblock_updown = resblock_updown + resnets = [] + attentions = [] + + for i in range(num_res_blocks): + res_skip_channels = in_channels if (i == num_res_blocks - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + resnets.append( + SPADEDiffResBlock( + spatial_dims=spatial_dims, + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + label_nc=label_nc, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + spade_intermediate_channels=spade_intermediate_channels, + ) + ) + attentions.append( + SpatialAttentionBlock( + spatial_dims=spatial_dims, + num_channels=out_channels, + num_head_channels=num_head_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + ) + ) + + self.resnets = nn.ModuleList(resnets) + self.attentions = nn.ModuleList(attentions) + + self.upsampler: nn.Module | None + if add_upsample: + if resblock_updown: + self.upsampler = DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + up=True, + ) + else: + post_conv = Convolution( + spatial_dims=spatial_dims, + in_channels=out_channels, + out_channels=out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + self.upsampler = WrappedUpsample( + spatial_dims=spatial_dims, + mode="nontrainable", + in_channels=out_channels, + out_channels=out_channels, + interp_mode="nearest", + scale_factor=2.0, + post_conv=post_conv, + align_corners=None, + ) + else: + self.upsampler = None + + def forward( + self, + hidden_states: torch.Tensor, + res_hidden_states_list: list[torch.Tensor], + temb: torch.Tensor, + seg: torch.Tensor, + context: torch.Tensor | None = None, + ) -> torch.Tensor: + del context + for resnet, attn in zip(self.resnets, self.attentions): + # pop res hidden states + res_hidden_states = res_hidden_states_list[-1] + res_hidden_states_list = res_hidden_states_list[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + hidden_states = resnet(hidden_states, temb, seg) + hidden_states = attn(hidden_states).contiguous() + + if self.upsampler is not None: + hidden_states = self.upsampler(hidden_states, temb) + + return hidden_states + + +class SPADECrossAttnUpBlock(nn.Module): + """ + Unet's up block containing resnet, upsamplers, and self-attention blocks. + Enables SPADE normalisation for semantic conditioning (Park et. al (2019): https://github.com/NVlabs/SPADE) + + Args: + spatial_dims: The number of spatial dimensions. + in_channels: number of input channels. + prev_output_channel: number of channels from residual connection. + out_channels: number of output channels. + temb_channels: number of timestep embedding channels. + label_nc: number of semantic channels for SPADE normalisation. + num_res_blocks: number of residual blocks. + norm_num_groups: number of groups for the group normalization. + norm_eps: epsilon for the group normalization. + add_upsample: if True add downsample block. + resblock_updown: if True use residual blocks for upsampling. + num_head_channels: number of channels in each attention head. + transformer_num_layers: number of layers of Transformer blocks to use. + cross_attention_dim: number of context dimensions to use. + upcast_attention: if True, upcast attention operations to full precision. + spade_intermediate_channels: number of intermediate channels for SPADE block layer. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + label_nc: int, + num_res_blocks: int = 1, + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + add_upsample: bool = True, + resblock_updown: bool = False, + num_head_channels: int = 1, + transformer_num_layers: int = 1, + cross_attention_dim: int | None = None, + upcast_attention: bool = False, + spade_intermediate_channels: int = 128, + ) -> None: + super().__init__() + self.resblock_updown = resblock_updown + resnets = [] + attentions = [] + + for i in range(num_res_blocks): + res_skip_channels = in_channels if (i == num_res_blocks - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + resnets.append( + SPADEDiffResBlock( + spatial_dims=spatial_dims, + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + label_nc=label_nc, + spade_intermediate_channels=spade_intermediate_channels, + ) + ) + attentions.append( + SpatialTransformer( + spatial_dims=spatial_dims, + in_channels=out_channels, + num_attention_heads=out_channels // num_head_channels, + num_head_channels=num_head_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + self.upsampler: nn.Module | None + if add_upsample: + if resblock_updown: + self.upsampler = DiffusionUNetResnetBlock( + spatial_dims=spatial_dims, + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + up=True, + ) + else: + post_conv = Convolution( + spatial_dims=spatial_dims, + in_channels=out_channels, + out_channels=out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + self.upsampler = WrappedUpsample( + spatial_dims=spatial_dims, + mode="nontrainable", + in_channels=out_channels, + out_channels=out_channels, + interp_mode="nearest", + scale_factor=2.0, + post_conv=post_conv, + align_corners=None, + ) + else: + self.upsampler = None + + def forward( + self, + hidden_states: torch.Tensor, + res_hidden_states_list: list[torch.Tensor], + temb: torch.Tensor, + seg: torch.Tensor | None = None, + context: torch.Tensor | None = None, + ) -> torch.Tensor: + for resnet, attn in zip(self.resnets, self.attentions): + # pop res hidden states + res_hidden_states = res_hidden_states_list[-1] + res_hidden_states_list = res_hidden_states_list[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + hidden_states = resnet(hidden_states, temb, seg) + hidden_states = attn(hidden_states, context=context).contiguous() + + if self.upsampler is not None: + hidden_states = self.upsampler(hidden_states, temb) + + return hidden_states + + +def get_spade_up_block( + spatial_dims: int, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + num_res_blocks: int, + norm_num_groups: int, + norm_eps: float, + add_upsample: bool, + resblock_updown: bool, + with_attn: bool, + with_cross_attn: bool, + num_head_channels: int, + transformer_num_layers: int, + label_nc: int, + cross_attention_dim: int | None, + upcast_attention: bool = False, + spade_intermediate_channels: int = 128, +) -> nn.Module: + if with_attn: + return SPADEAttnUpBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + prev_output_channel=prev_output_channel, + out_channels=out_channels, + temb_channels=temb_channels, + label_nc=label_nc, + num_res_blocks=num_res_blocks, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_upsample=add_upsample, + resblock_updown=resblock_updown, + num_head_channels=num_head_channels, + spade_intermediate_channels=spade_intermediate_channels, + ) + elif with_cross_attn: + return SPADECrossAttnUpBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + prev_output_channel=prev_output_channel, + out_channels=out_channels, + temb_channels=temb_channels, + label_nc=label_nc, + num_res_blocks=num_res_blocks, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_upsample=add_upsample, + resblock_updown=resblock_updown, + num_head_channels=num_head_channels, + transformer_num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + spade_intermediate_channels=spade_intermediate_channels, + ) + else: + return SPADEUpBlock( + spatial_dims=spatial_dims, + in_channels=in_channels, + prev_output_channel=prev_output_channel, + out_channels=out_channels, + temb_channels=temb_channels, + label_nc=label_nc, + num_res_blocks=num_res_blocks, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_upsample=add_upsample, + resblock_updown=resblock_updown, + spade_intermediate_channels=spade_intermediate_channels, + ) + + +class SPADEDiffusionModelUNet(nn.Module): + """ + UNet network with timestep embedding and attention mechanisms for conditioning, with added SPADE normalization for + semantic conditioning (Park et.al (2019): https://github.com/NVlabs/SPADE). An example tutorial can be found at + https://github.com/Project-MONAI/GenerativeModels/tree/main/tutorials/generative/2d_spade_ldm + + Args: + spatial_dims: number of spatial dimensions. + in_channels: number of input channels. + out_channels: number of output channels. + label_nc: number of semantic channels for SPADE normalisation. + num_res_blocks: number of residual blocks (see ResnetBlock) per level. + channels: tuple of block output channels. + attention_levels: list of levels to add attention. + norm_num_groups: number of groups for the normalization. + norm_eps: epsilon for the normalization. + resblock_updown: if True use residual blocks for up/downsampling. + num_head_channels: number of channels in each attention head. + with_conditioning: if True add spatial transformers to perform conditioning. + transformer_num_layers: number of layers of Transformer blocks to use. + cross_attention_dim: number of context dimensions to use. + num_class_embeds: if specified (as an int), then this model will be class-conditional with `num_class_embeds` + classes. + upcast_attention: if True, upcast attention operations to full precision. + spade_intermediate_channels: number of intermediate channels for SPADE block layer + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + out_channels: int, + label_nc: int, + num_res_blocks: Sequence[int] | int = (2, 2, 2, 2), + channels: Sequence[int] = (32, 64, 64, 64), + attention_levels: Sequence[bool] = (False, False, True, True), + norm_num_groups: int = 32, + norm_eps: float = 1e-6, + resblock_updown: bool = False, + num_head_channels: int | Sequence[int] = 8, + with_conditioning: bool = False, + transformer_num_layers: int = 1, + cross_attention_dim: int | None = None, + num_class_embeds: int | None = None, + upcast_attention: bool = False, + spade_intermediate_channels: int = 128, + ) -> None: + super().__init__() + if with_conditioning is True and cross_attention_dim is None: + raise ValueError( + "SPADEDiffusionModelUNet expects dimension of the cross-attention conditioning (cross_attention_dim) " + "when using with_conditioning." + ) + if cross_attention_dim is not None and with_conditioning is False: + raise ValueError( + "SPADEDiffusionModelUNet expects with_conditioning=True when specifying the cross_attention_dim." + ) + + # All number of channels should be multiple of num_groups + if any((out_channel % norm_num_groups) != 0 for out_channel in channels): + raise ValueError("SPADEDiffusionModelUNet expects all num_channels being multiple of norm_num_groups") + + if len(channels) != len(attention_levels): + raise ValueError("SPADEDiffusionModelUNet expects num_channels being same size of attention_levels") + + if isinstance(num_head_channels, int): + num_head_channels = ensure_tuple_rep(num_head_channels, len(attention_levels)) + + if len(num_head_channels) != len(attention_levels): + raise ValueError( + "num_head_channels should have the same length as attention_levels. For the i levels without attention," + " i.e. `attention_level[i]=False`, the num_head_channels[i] will be ignored." + ) + + if isinstance(num_res_blocks, int): + num_res_blocks = ensure_tuple_rep(num_res_blocks, len(channels)) + + if len(num_res_blocks) != len(channels): + raise ValueError( + "`num_res_blocks` should be a single integer or a tuple of integers with the same length as " + "`num_channels`." + ) + + self.in_channels = in_channels + self.block_out_channels = channels + self.out_channels = out_channels + self.num_res_blocks = num_res_blocks + self.attention_levels = attention_levels + self.num_head_channels = num_head_channels + self.with_conditioning = with_conditioning + self.label_nc = label_nc + + # input + self.conv_in = Convolution( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=channels[0], + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + + # time + time_embed_dim = channels[0] * 4 + self.time_embed = nn.Sequential( + nn.Linear(channels[0], time_embed_dim), nn.SiLU(), nn.Linear(time_embed_dim, time_embed_dim) + ) + + # class embedding + self.num_class_embeds = num_class_embeds + if num_class_embeds is not None: + self.class_embedding = nn.Embedding(num_class_embeds, time_embed_dim) + + # down + self.down_blocks = nn.ModuleList([]) + output_channel = channels[0] + for i in range(len(channels)): + input_channel = output_channel + output_channel = channels[i] + is_final_block = i == len(channels) - 1 + + down_block = get_down_block( + spatial_dims=spatial_dims, + in_channels=input_channel, + out_channels=output_channel, + temb_channels=time_embed_dim, + num_res_blocks=num_res_blocks[i], + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_downsample=not is_final_block, + resblock_updown=resblock_updown, + with_attn=(attention_levels[i] and not with_conditioning), + with_cross_attn=(attention_levels[i] and with_conditioning), + num_head_channels=num_head_channels[i], + transformer_num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + ) + + self.down_blocks.append(down_block) + + # mid + self.middle_block = get_mid_block( + spatial_dims=spatial_dims, + in_channels=channels[-1], + temb_channels=time_embed_dim, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + with_conditioning=with_conditioning, + num_head_channels=num_head_channels[-1], + transformer_num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + ) + + # up + self.up_blocks = nn.ModuleList([]) + reversed_block_out_channels = list(reversed(channels)) + reversed_num_res_blocks = list(reversed(num_res_blocks)) + reversed_attention_levels = list(reversed(attention_levels)) + reversed_num_head_channels = list(reversed(num_head_channels)) + output_channel = reversed_block_out_channels[0] + for i in range(len(reversed_block_out_channels)): + prev_output_channel = output_channel + output_channel = reversed_block_out_channels[i] + input_channel = reversed_block_out_channels[min(i + 1, len(channels) - 1)] + + is_final_block = i == len(channels) - 1 + + up_block = get_spade_up_block( + spatial_dims=spatial_dims, + in_channels=input_channel, + prev_output_channel=prev_output_channel, + out_channels=output_channel, + temb_channels=time_embed_dim, + num_res_blocks=reversed_num_res_blocks[i] + 1, + norm_num_groups=norm_num_groups, + norm_eps=norm_eps, + add_upsample=not is_final_block, + resblock_updown=resblock_updown, + with_attn=(reversed_attention_levels[i] and not with_conditioning), + with_cross_attn=(reversed_attention_levels[i] and with_conditioning), + num_head_channels=reversed_num_head_channels[i], + transformer_num_layers=transformer_num_layers, + cross_attention_dim=cross_attention_dim, + upcast_attention=upcast_attention, + label_nc=label_nc, + spade_intermediate_channels=spade_intermediate_channels, + ) + + self.up_blocks.append(up_block) + + # out + self.out = nn.Sequential( + nn.GroupNorm(num_groups=norm_num_groups, num_channels=channels[0], eps=norm_eps, affine=True), + nn.SiLU(), + zero_module( + Convolution( + spatial_dims=spatial_dims, + in_channels=channels[0], + out_channels=out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + ), + ) + + def forward( + self, + x: torch.Tensor, + timesteps: torch.Tensor, + seg: torch.Tensor, + context: torch.Tensor | None = None, + class_labels: torch.Tensor | None = None, + down_block_additional_residuals: tuple[torch.Tensor] | None = None, + mid_block_additional_residual: torch.Tensor | None = None, + ) -> torch.Tensor: + """ + Args: + x: input tensor (N, C, SpatialDims). + timesteps: timestep tensor (N,). + seg: Bx[LABEL_NC]x[SPATIAL DIMENSIONS] tensor of segmentations for SPADE norm. + context: context tensor (N, 1, ContextDim). + class_labels: context tensor (N, ). + down_block_additional_residuals: additional residual tensors for down blocks (N, C, FeatureMapsDims). + mid_block_additional_residual: additional residual tensor for mid block (N, C, FeatureMapsDims). + """ + # 1. time + t_emb = get_timestep_embedding(timesteps, self.block_out_channels[0]) + + # timesteps does not contain any weights and will always return f32 tensors + # but time_embedding might actually be running in fp16. so we need to cast here. + # there might be better ways to encapsulate this. + t_emb = t_emb.to(dtype=x.dtype) + emb = self.time_embed(t_emb) + + # 2. class + if self.num_class_embeds is not None: + if class_labels is None: + raise ValueError("class_labels should be provided when num_class_embeds > 0") + class_emb = self.class_embedding(class_labels) + class_emb = class_emb.to(dtype=x.dtype) + emb = emb + class_emb + + # 3. initial convolution + h = self.conv_in(x) + + # 4. down + if context is not None and self.with_conditioning is False: + raise ValueError("model should have with_conditioning = True if context is provided") + down_block_res_samples: list[torch.Tensor] = [h] + for downsample_block in self.down_blocks: + h, res_samples = downsample_block(hidden_states=h, temb=emb, context=context) + for residual in res_samples: + down_block_res_samples.append(residual) + + # Additional residual conections for Controlnets + if down_block_additional_residuals is not None: + new_down_block_res_samples: list[torch.Tensor] = [h] + for down_block_res_sample, down_block_additional_residual in zip( + down_block_res_samples, down_block_additional_residuals + ): + down_block_res_sample = down_block_res_sample + down_block_additional_residual + new_down_block_res_samples.append(down_block_res_sample) + + down_block_res_samples = new_down_block_res_samples + + # 5. mid + h = self.middle_block(hidden_states=h, temb=emb, context=context) + + # Additional residual conections for Controlnets + if mid_block_additional_residual is not None: + h = h + mid_block_additional_residual + + # 6. up + for upsample_block in self.up_blocks: + res_samples = down_block_res_samples[-len(upsample_block.resnets) :] + down_block_res_samples = down_block_res_samples[: -len(upsample_block.resnets)] + h = upsample_block(hidden_states=h, res_hidden_states_list=res_samples, seg=seg, temb=emb, context=context) + + # 7. output block + output: torch.Tensor = self.out(h) + + return output diff --git a/monai/networks/nets/spade_network.py b/monai/networks/nets/spade_network.py new file mode 100644 index 0000000000..9164541f27 --- /dev/null +++ b/monai/networks/nets/spade_network.py @@ -0,0 +1,435 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Sequence + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F + +from monai.networks.blocks import Convolution +from monai.networks.blocks.spade_norm import SPADE +from monai.networks.layers import Act +from monai.networks.layers.utils import get_act_layer +from monai.utils.enums import StrEnum + +__all__ = ["SPADENet"] + + +class UpsamplingModes(StrEnum): + bicubic = "bicubic" + nearest = "nearest" + bilinear = "bilinear" + + +class SPADENetResBlock(nn.Module): + """ + Creates a Residual Block with SPADE normalisation. + + Args: + spatial_dims: number of spatial dimensions + in_channels: number of input channels + out_channels: number of output channels + label_nc: number of semantic channels that will be taken into account in SPADE normalisation blocks + spade_intermediate_channels: number of intermediate channels in the middle conv. layers in SPADE normalisation blocks + norm: base normalisation type used on top of SPADE + kernel_size: convolutional kernel size + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + out_channels: int, + label_nc: int, + spade_intermediate_channels: int = 128, + norm: str | tuple = "INSTANCE", + act: str | tuple = (Act.LEAKYRELU, {"negative_slope": 0.2}), + kernel_size: int = 3, + ): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.int_channels = min(self.in_channels, self.out_channels) + self.learned_shortcut = self.in_channels != self.out_channels + self.conv_0 = Convolution( + spatial_dims=spatial_dims, in_channels=self.in_channels, out_channels=self.int_channels, act=None, norm=None + ) + self.conv_1 = Convolution( + spatial_dims=spatial_dims, + in_channels=self.int_channels, + out_channels=self.out_channels, + act=None, + norm=None, + ) + self.activation = get_act_layer(act) + self.norm_0 = SPADE( + label_nc=label_nc, + norm_nc=self.in_channels, + kernel_size=kernel_size, + spatial_dims=spatial_dims, + hidden_channels=spade_intermediate_channels, + norm=norm, + ) + self.norm_1 = SPADE( + label_nc=label_nc, + norm_nc=self.int_channels, + kernel_size=kernel_size, + spatial_dims=spatial_dims, + hidden_channels=spade_intermediate_channels, + norm=norm, + ) + + if self.learned_shortcut: + self.conv_s = Convolution( + spatial_dims=spatial_dims, + in_channels=self.in_channels, + out_channels=self.out_channels, + act=None, + norm=None, + kernel_size=1, + ) + self.norm_s = SPADE( + label_nc=label_nc, + norm_nc=self.in_channels, + kernel_size=kernel_size, + spatial_dims=spatial_dims, + hidden_channels=spade_intermediate_channels, + norm=norm, + ) + + def forward(self, x, seg): + x_s = self.shortcut(x, seg) + dx = self.conv_0(self.activation(self.norm_0(x, seg))) + dx = self.conv_1(self.activation(self.norm_1(dx, seg))) + out = x_s + dx + return out + + def shortcut(self, x, seg): + if self.learned_shortcut: + x_s = self.conv_s(self.norm_s(x, seg)) + else: + x_s = x + return x_s + + +class SPADEEncoder(nn.Module): + """ + Encoding branch of a VAE compatible with a SPADE-like generator + + Args: + spatial_dims: number of spatial dimensions + in_channels: number of input channels + z_dim: latent space dimension of the VAE containing the image sytle information + channels: number of output after each downsampling block + input_shape: spatial input shape of the tensor, necessary to do the reshaping after the linear layers + of the autoencoder (HxWx[D]) + kernel_size: convolutional kernel size + norm: normalisation layer type + act: activation type + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + z_dim: int, + channels: Sequence[int], + input_shape: Sequence[int], + kernel_size: int = 3, + norm: str | tuple = "INSTANCE", + act: str | tuple = (Act.LEAKYRELU, {"negative_slope": 0.2}), + ): + super().__init__() + self.in_channels = in_channels + self.z_dim = z_dim + self.channels = channels + if len(input_shape) != spatial_dims: + raise ValueError("Length of parameter input shape must match spatial_dims; got %s" % (input_shape)) + for s_ind, s_ in enumerate(input_shape): + if s_ / (2 ** len(channels)) != s_ // (2 ** len(channels)): + raise ValueError( + "Each dimension of your input must be divisible by 2 ** (autoencoder depth)." + "The shape in position %d, %d is not divisible by %d. " % (s_ind, s_, len(channels)) + ) + self.input_shape = input_shape + self.latent_spatial_shape = [s_ // (2 ** len(self.channels)) for s_ in self.input_shape] + blocks = [] + ch_init = self.in_channels + for _, ch_value in enumerate(channels): + blocks.append( + Convolution( + spatial_dims=spatial_dims, + in_channels=ch_init, + out_channels=ch_value, + strides=2, + kernel_size=kernel_size, + norm=norm, + act=act, + ) + ) + ch_init = ch_value + + self.blocks = nn.ModuleList(blocks) + self.fc_mu = nn.Linear( + in_features=np.prod(self.latent_spatial_shape) * self.channels[-1], out_features=self.z_dim + ) + self.fc_var = nn.Linear( + in_features=np.prod(self.latent_spatial_shape) * self.channels[-1], out_features=self.z_dim + ) + + def forward(self, x): + for block in self.blocks: + x = block(x) + x = x.view(x.size(0), -1) + mu = self.fc_mu(x) + logvar = self.fc_var(x) + return mu, logvar + + def encode(self, x): + for block in self.blocks: + x = block(x) + x = x.view(x.size(0), -1) + mu = self.fc_mu(x) + logvar = self.fc_var(x) + return self.reparameterize(mu, logvar) + + def reparameterize(self, mu, logvar): + std = torch.exp(0.5 * logvar) + eps = torch.randn_like(std) + return eps.mul(std) + mu + + +class SPADEDecoder(nn.Module): + """ + Decoder branch of a SPADE-like generator. It can be used independently, without an encoding branch, + behaving like a GAN, or coupled to a SPADE encoder. + + Args: + label_nc: number of semantic labels + spatial_dims: number of spatial dimensions + out_channels: number of output channels + label_nc: number of semantic channels used for the SPADE normalisation blocks + input_shape: spatial input shape of the tensor, necessary to do the reshaping after the linear layers + channels: number of output after each downsampling block + z_dim: latent space dimension of the VAE containing the image sytle information (None if encoder is not used) + is_vae: whether the decoder is going to be coupled to an autoencoder or not (true: yes, false: no) + spade_intermediate_channels: number of channels in the intermediate layers of the SPADE normalisation blocks + norm: base normalisation type + act: activation layer type + last_act: activation layer type for the last layer of the network (can differ from previous) + kernel_size: convolutional kernel size + upsampling_mode: upsampling mode (nearest, bilinear etc.) + """ + + def __init__( + self, + spatial_dims: int, + out_channels: int, + label_nc: int, + input_shape: Sequence[int], + channels: list[int], + z_dim: int | None = None, + is_vae: bool = True, + spade_intermediate_channels: int = 128, + norm: str | tuple = "INSTANCE", + act: str | tuple = (Act.LEAKYRELU, {"negative_slope": 0.2}), + last_act: str | tuple | None = (Act.LEAKYRELU, {"negative_slope": 0.2}), + kernel_size: int = 3, + upsampling_mode: str = UpsamplingModes.nearest.value, + ): + super().__init__() + self.is_vae = is_vae + self.out_channels = out_channels + self.label_nc = label_nc + self.num_channels = channels + if len(input_shape) != spatial_dims: + raise ValueError("Length of parameter input shape must match spatial_dims; got %s" % (input_shape)) + for s_ind, s_ in enumerate(input_shape): + if s_ / (2 ** len(channels)) != s_ // (2 ** len(channels)): + raise ValueError( + "Each dimension of your input must be divisible by 2 ** (autoencoder depth)." + "The shape in position %d, %d is not divisible by %d. " % (s_ind, s_, len(channels)) + ) + self.latent_spatial_shape = [s_ // (2 ** len(self.num_channels)) for s_ in input_shape] + + if not self.is_vae: + self.conv_init = Convolution( + spatial_dims=spatial_dims, in_channels=label_nc, out_channels=channels[0], kernel_size=kernel_size + ) + elif self.is_vae and z_dim is None: + raise ValueError( + "If the network is used in VAE-GAN mode, parameter z_dim " + "(number of latent channels in the VAE) must be populated." + ) + else: + self.fc = nn.Linear(z_dim, np.prod(self.latent_spatial_shape) * channels[0]) + + self.z_dim = z_dim + blocks = [] + channels.append(self.out_channels) + self.upsampling = torch.nn.Upsample(scale_factor=2, mode=upsampling_mode) + for ch_ind, ch_value in enumerate(channels[:-1]): + blocks.append( + SPADENetResBlock( + spatial_dims=spatial_dims, + in_channels=ch_value, + out_channels=channels[ch_ind + 1], + label_nc=label_nc, + spade_intermediate_channels=spade_intermediate_channels, + norm=norm, + kernel_size=kernel_size, + act=act, + ) + ) + + self.blocks = torch.nn.ModuleList(blocks) + self.last_conv = Convolution( + spatial_dims=spatial_dims, + in_channels=channels[-1], + out_channels=out_channels, + padding=(kernel_size - 1) // 2, + kernel_size=kernel_size, + norm=None, + act=last_act, + ) + + def forward(self, seg, z: torch.Tensor | None = None): + """ + Args: + seg: input BxCxHxW[xD] semantic map on which the output is conditioned on + z: latent vector output by the encoder if self.is_vae is True. When is_vae is + False, z is a random noise vector. + + Returns: + + """ + if not self.is_vae: + x = F.interpolate(seg, size=tuple(self.latent_spatial_shape)) + x = self.conv_init(x) + else: + if ( + z is None and self.z_dim is not None + ): # Even though this network is a VAE (self.is_vae), you should be able to sample from noise as well. + z = torch.randn(seg.size(0), self.z_dim, dtype=torch.float32, device=seg.get_device()) + x = self.fc(z) + x = x.view(*[-1, self.num_channels[0]] + self.latent_spatial_shape) + + for res_block in self.blocks: + x = res_block(x, seg) + x = self.upsampling(x) + + x = self.last_conv(x) + return x + + +class SPADENet(nn.Module): + """ + SPADE Network, implemented based on the code by Park, T et al. in + "Semantic Image Synthesis with Spatially-Adaptive Normalization" + (https://github.com/NVlabs/SPADE) + + Args: + spatial_dims: number of spatial dimensions + in_channels: number of input channels + out_channels: number of output channels + label_nc: number of semantic channels used for the SPADE normalisation blocks + input_shape: spatial input shape of the tensor, necessary to do the reshaping after the linear layers + channels: number of output after each downsampling block + z_dim: latent space dimension of the VAE containing the image sytle information (None if encoder is not used) + is_vae: whether the decoder is going to be coupled to an autoencoder (true) or not (false) + spade_intermediate_channels: number of channels in the intermediate layers of the SPADE normalisation blocks + norm: base normalisation type + act: activation layer type + last_act: activation layer type for the last layer of the network (can differ from previous) + kernel_size: convolutional kernel size + upsampling_mode: upsampling mode (nearest, bilinear etc.) + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + out_channels: int, + label_nc: int, + input_shape: Sequence[int], + channels: list[int], + z_dim: int | None = None, + is_vae: bool = True, + spade_intermediate_channels: int = 128, + norm: str | tuple = "INSTANCE", + act: str | tuple = (Act.LEAKYRELU, {"negative_slope": 0.2}), + last_act: str | tuple | None = (Act.LEAKYRELU, {"negative_slope": 0.2}), + kernel_size: int = 3, + upsampling_mode: str = UpsamplingModes.nearest.value, + ): + super().__init__() + self.is_vae = is_vae + self.in_channels = in_channels + self.out_channels = out_channels + self.channels = channels + self.label_nc = label_nc + self.input_shape = input_shape + + if self.is_vae: + if z_dim is None: + ValueError("The latent space dimension mapped by parameter z_dim cannot be None is is_vae is True.") + else: + self.encoder = SPADEEncoder( + spatial_dims=spatial_dims, + in_channels=in_channels, + z_dim=z_dim, + channels=channels, + input_shape=input_shape, + kernel_size=kernel_size, + norm=norm, + act=act, + ) + + decoder_channels = channels + decoder_channels.reverse() + + self.decoder = SPADEDecoder( + spatial_dims=spatial_dims, + out_channels=out_channels, + label_nc=label_nc, + input_shape=input_shape, + channels=decoder_channels, + z_dim=z_dim, + is_vae=is_vae, + spade_intermediate_channels=spade_intermediate_channels, + norm=norm, + act=act, + last_act=last_act, + kernel_size=kernel_size, + upsampling_mode=upsampling_mode, + ) + + def forward(self, seg: torch.Tensor, x: torch.Tensor | None = None): + z = None + if self.is_vae: + z_mu, z_logvar = self.encoder(x) + z = self.encoder.reparameterize(z_mu, z_logvar) + return self.decoder(seg, z), z_mu, z_logvar + else: + return (self.decoder(seg, z),) + + def encode(self, x: torch.Tensor): + if self.is_vae: + return self.encoder.encode(x) + else: + return None + + def decode(self, seg: torch.Tensor, z: torch.Tensor | None = None): + return self.decoder(seg, z) diff --git a/monai/networks/nets/swin_unetr.py b/monai/networks/nets/swin_unetr.py index 6f96dfd291..3900c866b3 100644 --- a/monai/networks/nets/swin_unetr.py +++ b/monai/networks/nets/swin_unetr.py @@ -347,7 +347,7 @@ def window_partition(x, window_size): x: input tensor. window_size: local window size. """ - x_shape = x.size() + x_shape = x.size() # length 4 or 5 only if len(x_shape) == 5: b, d, h, w, c = x_shape x = x.view( @@ -363,10 +363,11 @@ def window_partition(x, window_size): windows = ( x.permute(0, 1, 3, 5, 2, 4, 6, 7).contiguous().view(-1, window_size[0] * window_size[1] * window_size[2], c) ) - elif len(x_shape) == 4: + else: # if len(x_shape) == 4: b, h, w, c = x.shape x = x.view(b, h // window_size[0], window_size[0], w // window_size[1], window_size[1], c) windows = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(-1, window_size[0] * window_size[1], c) + return windows @@ -613,7 +614,7 @@ def forward_part1(self, x, mask_matrix): _, dp, hp, wp, _ = x.shape dims = [b, dp, hp, wp] - elif len(x_shape) == 4: + else: # elif len(x_shape) == 4 b, h, w, c = x.shape window_size, shift_size = get_window_size((h, w), self.window_size, self.shift_size) pad_l = pad_t = 0 diff --git a/monai/networks/nets/transformer.py b/monai/networks/nets/transformer.py new file mode 100644 index 0000000000..1af725abda --- /dev/null +++ b/monai/networks/nets/transformer.py @@ -0,0 +1,157 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import torch +import torch.nn as nn + +from monai.networks.blocks import TransformerBlock + +__all__ = ["DecoderOnlyTransformer"] + + +class AbsolutePositionalEmbedding(nn.Module): + """Absolute positional embedding. + + Args: + max_seq_len: Maximum sequence length. + embedding_dim: Dimensionality of the embedding. + """ + + def __init__(self, max_seq_len: int, embedding_dim: int) -> None: + super().__init__() + self.max_seq_len = max_seq_len + self.embedding_dim = embedding_dim + self.embedding = nn.Embedding(max_seq_len, embedding_dim) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + batch_size, seq_len = x.size() + positions = torch.arange(seq_len, device=x.device).repeat(batch_size, 1) + embedding: torch.Tensor = self.embedding(positions) + return embedding + + +class DecoderOnlyTransformer(nn.Module): + """Decoder-only (Autoregressive) Transformer model. + + Args: + num_tokens: Number of tokens in the vocabulary. + max_seq_len: Maximum sequence length. + attn_layers_dim: Dimensionality of the attention layers. + attn_layers_depth: Number of attention layers. + attn_layers_heads: Number of attention heads. + with_cross_attention: Whether to use cross attention for conditioning. + embedding_dropout_rate: Dropout rate for the embedding. + """ + + def __init__( + self, + num_tokens: int, + max_seq_len: int, + attn_layers_dim: int, + attn_layers_depth: int, + attn_layers_heads: int, + with_cross_attention: bool = False, + embedding_dropout_rate: float = 0.0, + ) -> None: + super().__init__() + self.num_tokens = num_tokens + self.max_seq_len = max_seq_len + self.attn_layers_dim = attn_layers_dim + self.attn_layers_depth = attn_layers_depth + self.attn_layers_heads = attn_layers_heads + self.with_cross_attention = with_cross_attention + + self.token_embeddings = nn.Embedding(num_tokens, attn_layers_dim) + self.position_embeddings = AbsolutePositionalEmbedding(max_seq_len=max_seq_len, embedding_dim=attn_layers_dim) + self.embedding_dropout = nn.Dropout(embedding_dropout_rate) + + self.blocks = nn.ModuleList( + [ + TransformerBlock( + hidden_size=attn_layers_dim, + mlp_dim=attn_layers_dim * 4, + num_heads=attn_layers_heads, + dropout_rate=0.0, + qkv_bias=False, + causal=True, + sequence_length=max_seq_len, + with_cross_attention=with_cross_attention, + ) + for _ in range(attn_layers_depth) + ] + ) + + self.to_logits = nn.Linear(attn_layers_dim, num_tokens) + + def forward(self, x: torch.Tensor, context: torch.Tensor | None = None) -> torch.Tensor: + tok_emb = self.token_embeddings(x) + pos_emb = self.position_embeddings(x) + x = self.embedding_dropout(tok_emb + pos_emb) + + for block in self.blocks: + x = block(x, context=context) + logits: torch.Tensor = self.to_logits(x) + return logits + + def load_old_state_dict(self, old_state_dict: dict, verbose=False) -> None: + """ + Load a state dict from a DecoderOnlyTransformer trained with + [MONAI Generative](https://github.com/Project-MONAI/GenerativeModels). + + Args: + old_state_dict: state dict from the old DecoderOnlyTransformer model. + """ + + new_state_dict = self.state_dict() + # if all keys match, just load the state dict + if all(k in new_state_dict for k in old_state_dict): + print("All keys match, loading state dict.") + self.load_state_dict(old_state_dict) + return + + if verbose: + # print all new_state_dict keys that are not in old_state_dict + for k in new_state_dict: + if k not in old_state_dict: + print(f"key {k} not found in old state dict") + # and vice versa + print("----------------------------------------------") + for k in old_state_dict: + if k not in new_state_dict: + print(f"key {k} not found in new state dict") + + # copy over all matching keys + for k in new_state_dict: + if k in old_state_dict: + new_state_dict[k] = old_state_dict[k] + + # fix the attention blocks + attention_blocks = [k.replace(".attn.qkv.weight", "") for k in new_state_dict if "attn.qkv.weight" in k] + for block in attention_blocks: + new_state_dict[f"{block}.attn.qkv.weight"] = torch.cat( + [ + old_state_dict[f"{block}.attn.to_q.weight"], + old_state_dict[f"{block}.attn.to_k.weight"], + old_state_dict[f"{block}.attn.to_v.weight"], + ], + dim=0, + ) + + # fix the renamed norm blocks first norm2 -> norm_cross_attention , norm3 -> norm2 + for k in old_state_dict: + if "norm2" in k: + new_state_dict[k.replace("norm2", "norm_cross_attn")] = old_state_dict[k] + if "norm3" in k: + new_state_dict[k.replace("norm3", "norm2")] = old_state_dict[k] + + self.load_state_dict(new_state_dict) diff --git a/monai/networks/nets/vqvae.py b/monai/networks/nets/vqvae.py new file mode 100644 index 0000000000..f198bfbb2b --- /dev/null +++ b/monai/networks/nets/vqvae.py @@ -0,0 +1,472 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from collections.abc import Sequence +from typing import Tuple + +import torch +import torch.nn as nn + +from monai.networks.blocks import Convolution +from monai.networks.layers import Act +from monai.networks.layers.vector_quantizer import EMAQuantizer, VectorQuantizer +from monai.utils import ensure_tuple_rep + +__all__ = ["VQVAE"] + + +class VQVAEResidualUnit(nn.Module): + """ + Implementation of the ResidualLayer used in the VQVAE network as originally used in Morphology-preserving + Autoregressive 3D Generative Modelling of the Brain by Tudosiu et al. (https://arxiv.org/pdf/2209.03177.pdf). + + The original implementation that can be found at + https://github.com/AmigoLab/SynthAnatomy/blob/main/src/networks/vqvae/baseline.py#L150. + + Args: + spatial_dims: number of spatial spatial_dims of the input data. + in_channels: number of input channels. + num_res_channels: number of channels in the residual layers. + act: activation type and arguments. Defaults to RELU. + dropout: dropout ratio. Defaults to no dropout. + bias: whether to have a bias term. Defaults to True. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + num_res_channels: int, + act: tuple | str | None = Act.RELU, + dropout: float = 0.0, + bias: bool = True, + ) -> None: + super().__init__() + + self.spatial_dims = spatial_dims + self.in_channels = in_channels + self.num_res_channels = num_res_channels + self.act = act + self.dropout = dropout + self.bias = bias + + self.conv1 = Convolution( + spatial_dims=self.spatial_dims, + in_channels=self.in_channels, + out_channels=self.num_res_channels, + adn_ordering="DA", + act=self.act, + dropout=self.dropout, + bias=self.bias, + ) + + self.conv2 = Convolution( + spatial_dims=self.spatial_dims, + in_channels=self.num_res_channels, + out_channels=self.in_channels, + bias=self.bias, + conv_only=True, + ) + + def forward(self, x): + return torch.nn.functional.relu(x + self.conv2(self.conv1(x)), True) + + +class Encoder(nn.Module): + """ + Encoder module for VQ-VAE. + + Args: + spatial_dims: number of spatial spatial_dims. + in_channels: number of input channels. + out_channels: number of channels in the latent space (embedding_dim). + channels: sequence containing the number of channels at each level of the encoder. + num_res_layers: number of sequential residual layers at each level. + num_res_channels: number of channels in the residual layers at each level. + downsample_parameters: A Tuple of Tuples for defining the downsampling convolutions. Each Tuple should hold the + following information stride (int), kernel_size (int), dilation (int) and padding (int). + dropout: dropout ratio. + act: activation type and arguments. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + out_channels: int, + channels: Sequence[int], + num_res_layers: int, + num_res_channels: Sequence[int], + downsample_parameters: Sequence[Tuple[int, int, int, int]], + dropout: float, + act: tuple | str | None, + ) -> None: + super().__init__() + self.spatial_dims = spatial_dims + self.in_channels = in_channels + self.out_channels = out_channels + self.channels = channels + self.num_res_layers = num_res_layers + self.num_res_channels = num_res_channels + self.downsample_parameters = downsample_parameters + self.dropout = dropout + self.act = act + + blocks: list[nn.Module] = [] + + for i in range(len(self.channels)): + blocks.append( + Convolution( + spatial_dims=self.spatial_dims, + in_channels=self.in_channels if i == 0 else self.channels[i - 1], + out_channels=self.channels[i], + strides=self.downsample_parameters[i][0], + kernel_size=self.downsample_parameters[i][1], + adn_ordering="DA", + act=self.act, + dropout=None if i == 0 else self.dropout, + dropout_dim=1, + dilation=self.downsample_parameters[i][2], + padding=self.downsample_parameters[i][3], + ) + ) + + for _ in range(self.num_res_layers): + blocks.append( + VQVAEResidualUnit( + spatial_dims=self.spatial_dims, + in_channels=self.channels[i], + num_res_channels=self.num_res_channels[i], + act=self.act, + dropout=self.dropout, + ) + ) + + blocks.append( + Convolution( + spatial_dims=self.spatial_dims, + in_channels=self.channels[len(self.channels) - 1], + out_channels=self.out_channels, + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + ) + + self.blocks = nn.ModuleList(blocks) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + for block in self.blocks: + x = block(x) + return x + + +class Decoder(nn.Module): + """ + Decoder module for VQ-VAE. + + Args: + spatial_dims: number of spatial spatial_dims. + in_channels: number of channels in the latent space (embedding_dim). + out_channels: number of output channels. + channels: sequence containing the number of channels at each level of the decoder. + num_res_layers: number of sequential residual layers at each level. + num_res_channels: number of channels in the residual layers at each level. + upsample_parameters: A Tuple of Tuples for defining the upsampling convolutions. Each Tuple should hold the + following information stride (int), kernel_size (int), dilation (int), padding (int), output_padding (int). + dropout: dropout ratio. + act: activation type and arguments. + output_act: activation type and arguments for the output. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + out_channels: int, + channels: Sequence[int], + num_res_layers: int, + num_res_channels: Sequence[int], + upsample_parameters: Sequence[Tuple[int, int, int, int, int]], + dropout: float, + act: tuple | str | None, + output_act: tuple | str | None, + ) -> None: + super().__init__() + self.spatial_dims = spatial_dims + self.in_channels = in_channels + self.out_channels = out_channels + self.channels = channels + self.num_res_layers = num_res_layers + self.num_res_channels = num_res_channels + self.upsample_parameters = upsample_parameters + self.dropout = dropout + self.act = act + self.output_act = output_act + + reversed_num_channels = list(reversed(self.channels)) + + blocks: list[nn.Module] = [] + blocks.append( + Convolution( + spatial_dims=self.spatial_dims, + in_channels=self.in_channels, + out_channels=reversed_num_channels[0], + strides=1, + kernel_size=3, + padding=1, + conv_only=True, + ) + ) + + reversed_num_res_channels = list(reversed(self.num_res_channels)) + for i in range(len(self.channels)): + for _ in range(self.num_res_layers): + blocks.append( + VQVAEResidualUnit( + spatial_dims=self.spatial_dims, + in_channels=reversed_num_channels[i], + num_res_channels=reversed_num_res_channels[i], + act=self.act, + dropout=self.dropout, + ) + ) + + blocks.append( + Convolution( + spatial_dims=self.spatial_dims, + in_channels=reversed_num_channels[i], + out_channels=self.out_channels if i == len(self.channels) - 1 else reversed_num_channels[i + 1], + strides=self.upsample_parameters[i][0], + kernel_size=self.upsample_parameters[i][1], + adn_ordering="DA", + act=self.act, + dropout=self.dropout if i != len(self.channels) - 1 else None, + norm=None, + dilation=self.upsample_parameters[i][2], + conv_only=i == len(self.channels) - 1, + is_transposed=True, + padding=self.upsample_parameters[i][3], + output_padding=self.upsample_parameters[i][4], + ) + ) + + if self.output_act: + blocks.append(Act[self.output_act]()) + + self.blocks = nn.ModuleList(blocks) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + for block in self.blocks: + x = block(x) + return x + + +class VQVAE(nn.Module): + """ + Vector-Quantised Variational Autoencoder (VQ-VAE) used in Morphology-preserving Autoregressive 3D Generative + Modelling of the Brain by Tudosiu et al. (https://arxiv.org/pdf/2209.03177.pdf) + + The original implementation can be found at + https://github.com/AmigoLab/SynthAnatomy/blob/main/src/networks/vqvae/baseline.py#L163/ + + Args: + spatial_dims: number of spatial spatial_dims. + in_channels: number of input channels. + out_channels: number of output channels. + downsample_parameters: A Tuple of Tuples for defining the downsampling convolutions. Each Tuple should hold the + following information stride (int), kernel_size (int), dilation (int) and padding (int). + upsample_parameters: A Tuple of Tuples for defining the upsampling convolutions. Each Tuple should hold the + following information stride (int), kernel_size (int), dilation (int), padding (int), output_padding (int). + num_res_layers: number of sequential residual layers at each level. + channels: number of channels at each level. + num_res_channels: number of channels in the residual layers at each level. + num_embeddings: VectorQuantization number of atomic elements in the codebook. + embedding_dim: VectorQuantization number of channels of the input and atomic elements. + commitment_cost: VectorQuantization commitment_cost. + decay: VectorQuantization decay. + epsilon: VectorQuantization epsilon. + act: activation type and arguments. + dropout: dropout ratio. + output_act: activation type and arguments for the output. + ddp_sync: whether to synchronize the codebook across processes. + use_checkpointing if True, use activation checkpointing to save memory. + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + out_channels: int, + channels: Sequence[int] = (96, 96, 192), + num_res_layers: int = 3, + num_res_channels: Sequence[int] | int = (96, 96, 192), + downsample_parameters: Sequence[Tuple[int, int, int, int]] | Tuple[int, int, int, int] = ( + (2, 4, 1, 1), + (2, 4, 1, 1), + (2, 4, 1, 1), + ), + upsample_parameters: Sequence[Tuple[int, int, int, int, int]] | Tuple[int, int, int, int, int] = ( + (2, 4, 1, 1, 0), + (2, 4, 1, 1, 0), + (2, 4, 1, 1, 0), + ), + num_embeddings: int = 32, + embedding_dim: int = 64, + embedding_init: str = "normal", + commitment_cost: float = 0.25, + decay: float = 0.5, + epsilon: float = 1e-5, + dropout: float = 0.0, + act: tuple | str | None = Act.RELU, + output_act: tuple | str | None = None, + ddp_sync: bool = True, + use_checkpointing: bool = False, + ): + super().__init__() + + self.in_channels = in_channels + self.out_channels = out_channels + self.spatial_dims = spatial_dims + self.channels = channels + self.num_embeddings = num_embeddings + self.embedding_dim = embedding_dim + self.use_checkpointing = use_checkpointing + + if isinstance(num_res_channels, int): + num_res_channels = ensure_tuple_rep(num_res_channels, len(channels)) + + if len(num_res_channels) != len(channels): + raise ValueError( + "`num_res_channels` should be a single integer or a tuple of integers with the same length as " + "`num_channls`." + ) + if all(isinstance(values, int) for values in upsample_parameters): + upsample_parameters_tuple: Sequence = (upsample_parameters,) * len(channels) + else: + upsample_parameters_tuple = upsample_parameters + + if all(isinstance(values, int) for values in downsample_parameters): + downsample_parameters_tuple: Sequence = (downsample_parameters,) * len(channels) + else: + downsample_parameters_tuple = downsample_parameters + + if not all(all(isinstance(value, int) for value in sub_item) for sub_item in downsample_parameters_tuple): + raise ValueError("`downsample_parameters` should be a single tuple of integer or a tuple of tuples.") + + # check if downsample_parameters is a tuple of ints or a tuple of tuples of ints + if not all(all(isinstance(value, int) for value in sub_item) for sub_item in upsample_parameters_tuple): + raise ValueError("`upsample_parameters` should be a single tuple of integer or a tuple of tuples.") + + for parameter in downsample_parameters_tuple: + if len(parameter) != 4: + raise ValueError("`downsample_parameters` should be a tuple of tuples with 4 integers.") + + for parameter in upsample_parameters_tuple: + if len(parameter) != 5: + raise ValueError("`upsample_parameters` should be a tuple of tuples with 5 integers.") + + if len(downsample_parameters_tuple) != len(channels): + raise ValueError( + "`downsample_parameters` should be a tuple of tuples with the same length as `num_channels`." + ) + + if len(upsample_parameters_tuple) != len(channels): + raise ValueError( + "`upsample_parameters` should be a tuple of tuples with the same length as `num_channels`." + ) + + self.num_res_layers = num_res_layers + self.num_res_channels = num_res_channels + + self.encoder = Encoder( + spatial_dims=spatial_dims, + in_channels=in_channels, + out_channels=embedding_dim, + channels=channels, + num_res_layers=num_res_layers, + num_res_channels=num_res_channels, + downsample_parameters=downsample_parameters_tuple, + dropout=dropout, + act=act, + ) + + self.decoder = Decoder( + spatial_dims=spatial_dims, + in_channels=embedding_dim, + out_channels=out_channels, + channels=channels, + num_res_layers=num_res_layers, + num_res_channels=num_res_channels, + upsample_parameters=upsample_parameters_tuple, + dropout=dropout, + act=act, + output_act=output_act, + ) + + self.quantizer = VectorQuantizer( + quantizer=EMAQuantizer( + spatial_dims=spatial_dims, + num_embeddings=num_embeddings, + embedding_dim=embedding_dim, + commitment_cost=commitment_cost, + decay=decay, + epsilon=epsilon, + embedding_init=embedding_init, + ddp_sync=ddp_sync, + ) + ) + + def encode(self, images: torch.Tensor) -> torch.Tensor: + output: torch.Tensor + if self.use_checkpointing: + output = torch.utils.checkpoint.checkpoint(self.encoder, images, use_reentrant=False) + else: + output = self.encoder(images) + return output + + def quantize(self, encodings: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor]: + x_loss, x = self.quantizer(encodings) + return x, x_loss + + def decode(self, quantizations: torch.Tensor) -> torch.Tensor: + output: torch.Tensor + + if self.use_checkpointing: + output = torch.utils.checkpoint.checkpoint(self.decoder, quantizations, use_reentrant=False) + else: + output = self.decoder(quantizations) + return output + + def index_quantize(self, images: torch.Tensor) -> torch.Tensor: + return self.quantizer.quantize(self.encode(images=images)) + + def decode_samples(self, embedding_indices: torch.Tensor) -> torch.Tensor: + return self.decode(self.quantizer.embed(embedding_indices)) + + def forward(self, images: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor]: + quantizations, quantization_losses = self.quantize(self.encode(images)) + reconstruction = self.decode(quantizations) + + return reconstruction, quantization_losses + + def encode_stage_2_inputs(self, x: torch.Tensor) -> torch.Tensor: + z = self.encode(x) + e, _ = self.quantize(z) + return e + + def decode_stage_2_outputs(self, z: torch.Tensor) -> torch.Tensor: + e, _ = self.quantize(z) + image = self.decode(e) + return image diff --git a/monai/networks/schedulers/__init__.py b/monai/networks/schedulers/__init__.py new file mode 100644 index 0000000000..29e9020d65 --- /dev/null +++ b/monai/networks/schedulers/__init__.py @@ -0,0 +1,17 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from .ddim import DDIMScheduler +from .ddpm import DDPMScheduler +from .pndm import PNDMScheduler +from .scheduler import NoiseSchedules, Scheduler diff --git a/monai/networks/schedulers/ddim.py b/monai/networks/schedulers/ddim.py new file mode 100644 index 0000000000..2a0121d063 --- /dev/null +++ b/monai/networks/schedulers/ddim.py @@ -0,0 +1,294 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ========================================================================= +# Adapted from https://github.com/huggingface/diffusers +# which has the following license: +# https://github.com/huggingface/diffusers/blob/main/LICENSE +# +# Copyright 2022 UC Berkeley Team and The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================================================================= + +from __future__ import annotations + +import numpy as np +import torch + +from .ddpm import DDPMPredictionType +from .scheduler import Scheduler + +DDIMPredictionType = DDPMPredictionType + + +class DDIMScheduler(Scheduler): + """ + Denoising diffusion implicit models is a scheduler that extends the denoising procedure introduced in denoising + diffusion probabilistic models (DDPMs) with non-Markovian guidance. Based on: Song et al. "Denoising Diffusion + Implicit Models" https://arxiv.org/abs/2010.02502 + + Args: + num_train_timesteps: number of diffusion steps used to train the model. + schedule: member of NoiseSchedules, name of noise schedule function in component store + clip_sample: option to clip predicted sample between -1 and 1 for numerical stability. + set_alpha_to_one: each diffusion step uses the value of alphas product at that step and at the previous one. + For the final step there is no previous alpha. When this option is `True` the previous alpha product is + fixed to `1`, otherwise it uses the value of alpha at step 0. + steps_offset: an offset added to the inference steps. You can use a combination of `steps_offset=1` and + `set_alpha_to_one=False`, to make the last step use step 0 for the previous alpha product, as done in + stable diffusion. + prediction_type: member of DDPMPredictionType + clip_sample_min: minimum clipping value when clip_sample equals True + clip_sample_max: maximum clipping value when clip_sample equals True + schedule_args: arguments to pass to the schedule function + + """ + + def __init__( + self, + num_train_timesteps: int = 1000, + schedule: str = "linear_beta", + clip_sample: bool = True, + set_alpha_to_one: bool = True, + steps_offset: int = 0, + prediction_type: str = DDIMPredictionType.EPSILON, + clip_sample_min: float = -1.0, + clip_sample_max: float = 1.0, + **schedule_args, + ) -> None: + super().__init__(num_train_timesteps, schedule, **schedule_args) + + if prediction_type not in DDIMPredictionType.__members__.values(): + raise ValueError("Argument `prediction_type` must be a member of DDIMPredictionType") + + self.prediction_type = prediction_type + + # At every step in ddim, we are looking into the previous alphas_cumprod + # For the final step, there is no previous alphas_cumprod because we are already at 0 + # `set_alpha_to_one` decides whether we set this parameter simply to one or + # whether we use the final alpha of the "non-previous" one. + self.final_alpha_cumprod = torch.tensor(1.0) if set_alpha_to_one else self.alphas_cumprod[0] + + # standard deviation of the initial noise distribution + self.init_noise_sigma = 1.0 + + self.timesteps = torch.from_numpy(np.arange(0, self.num_train_timesteps)[::-1].astype(np.int64)) + + self.clip_sample = clip_sample + self.clip_sample_values = [clip_sample_min, clip_sample_max] + self.steps_offset = steps_offset + + # default the number of inference timesteps to the number of train steps + self.num_inference_steps: int + self.set_timesteps(self.num_train_timesteps) + + def set_timesteps(self, num_inference_steps: int, device: str | torch.device | None = None) -> None: + """ + Sets the discrete timesteps used for the diffusion chain. Supporting function to be run before inference. + + Args: + num_inference_steps: number of diffusion steps used when generating samples with a pre-trained model. + device: target device to put the data. + """ + if num_inference_steps > self.num_train_timesteps: + raise ValueError( + f"`num_inference_steps`: {num_inference_steps} cannot be larger than `self.num_train_timesteps`:" + f" {self.num_train_timesteps} as the unet model trained with this scheduler can only handle" + f" maximal {self.num_train_timesteps} timesteps." + ) + + self.num_inference_steps = num_inference_steps + step_ratio = self.num_train_timesteps // self.num_inference_steps + if self.steps_offset >= step_ratio: + raise ValueError( + f"`steps_offset`: {self.steps_offset} cannot be greater than or equal to " + f"`num_train_timesteps // num_inference_steps : {step_ratio}` as this will cause timesteps to exceed" + f" the max train timestep." + ) + + # creates integer timesteps by multiplying by ratio + # casting to int to avoid issues when num_inference_step is power of 3 + timesteps = (np.arange(0, num_inference_steps) * step_ratio).round()[::-1].copy().astype(np.int64) + self.timesteps = torch.from_numpy(timesteps).to(device) + self.timesteps += self.steps_offset + + def _get_variance(self, timestep: int, prev_timestep: int) -> torch.Tensor: + alpha_prod_t = self.alphas_cumprod[timestep] + alpha_prod_t_prev = self.alphas_cumprod[prev_timestep] if prev_timestep >= 0 else self.final_alpha_cumprod + beta_prod_t = 1 - alpha_prod_t + beta_prod_t_prev = 1 - alpha_prod_t_prev + + variance: torch.Tensor = (beta_prod_t_prev / beta_prod_t) * (1 - alpha_prod_t / alpha_prod_t_prev) + + return variance + + def step( + self, + model_output: torch.Tensor, + timestep: int, + sample: torch.Tensor, + eta: float = 0.0, + generator: torch.Generator | None = None, + ) -> tuple[torch.Tensor, torch.Tensor]: + """ + Predict the sample at the previous timestep by reversing the SDE. Core function to propagate the diffusion + process from the learned model outputs (most often the predicted noise). + + Args: + model_output: direct output from learned diffusion model. + timestep: current discrete timestep in the diffusion chain. + sample: current instance of sample being created by diffusion process. + eta: weight of noise for added noise in diffusion step. + generator: random number generator. + + Returns: + pred_prev_sample: Predicted previous sample + pred_original_sample: Predicted original sample + """ + # See formulas (12) and (16) of DDIM paper https://arxiv.org/pdf/2010.02502.pdf + # Ideally, read DDIM paper in-detail understanding + + # Notation ( -> + # - model_output -> e_theta(x_t, t) + # - pred_original_sample -> f_theta(x_t, t) or x_0 + # - std_dev_t -> sigma_t + # - eta -> η + # - pred_sample_direction -> "direction pointing to x_t" + # - pred_prev_sample -> "x_t-1" + + # 1. get previous step value (=t-1) + prev_timestep = timestep - self.num_train_timesteps // self.num_inference_steps + + # 2. compute alphas, betas + alpha_prod_t = self.alphas_cumprod[timestep] + alpha_prod_t_prev = self.alphas_cumprod[prev_timestep] if prev_timestep >= 0 else self.final_alpha_cumprod + + beta_prod_t = 1 - alpha_prod_t + + # predefinitions satisfy pylint/mypy, these values won't be ultimately used + pred_original_sample = sample + pred_epsilon = model_output + + # 3. compute predicted original sample from predicted noise also called + # "predicted x_0" of formula (12) from https://arxiv.org/pdf/2010.02502.pdf + if self.prediction_type == DDIMPredictionType.EPSILON: + pred_original_sample = (sample - (beta_prod_t**0.5) * model_output) / (alpha_prod_t**0.5) + pred_epsilon = model_output + elif self.prediction_type == DDIMPredictionType.SAMPLE: + pred_original_sample = model_output + pred_epsilon = (sample - (alpha_prod_t**0.5) * pred_original_sample) / (beta_prod_t**0.5) + elif self.prediction_type == DDIMPredictionType.V_PREDICTION: + pred_original_sample = (alpha_prod_t**0.5) * sample - (beta_prod_t**0.5) * model_output + pred_epsilon = (alpha_prod_t**0.5) * model_output + (beta_prod_t**0.5) * sample + + # 4. Clip "predicted x_0" + if self.clip_sample: + pred_original_sample = torch.clamp( + pred_original_sample, self.clip_sample_values[0], self.clip_sample_values[1] + ) + + # 5. compute variance: "sigma_t(η)" -> see formula (16) + # σ_t = sqrt((1 − α_t−1)/(1 − α_t)) * sqrt(1 − α_t/α_t−1) + variance = self._get_variance(timestep, prev_timestep) + std_dev_t = eta * variance**0.5 + + # 6. compute "direction pointing to x_t" of formula (12) from https://arxiv.org/pdf/2010.02502.pdf + pred_sample_direction = (1 - alpha_prod_t_prev - std_dev_t**2) ** 0.5 * pred_epsilon + + # 7. compute x_t-1 without "random noise" of formula (12) from https://arxiv.org/pdf/2010.02502.pdf + pred_prev_sample = alpha_prod_t_prev**0.5 * pred_original_sample + pred_sample_direction + + if eta > 0: + # randn_like does not support generator https://github.com/pytorch/pytorch/issues/27072 + device: torch.device = torch.device(model_output.device if torch.is_tensor(model_output) else "cpu") + noise = torch.randn(model_output.shape, dtype=model_output.dtype, generator=generator).to(device) + variance = self._get_variance(timestep, prev_timestep) ** 0.5 * eta * noise + + pred_prev_sample = pred_prev_sample + variance + + return pred_prev_sample, pred_original_sample + + def reversed_step( + self, model_output: torch.Tensor, timestep: int, sample: torch.Tensor + ) -> tuple[torch.Tensor, torch.Tensor]: + """ + Predict the sample at the next timestep by reversing the SDE. Core function to propagate the diffusion + process from the learned model outputs (most often the predicted noise). + + Args: + model_output: direct output from learned diffusion model. + timestep: current discrete timestep in the diffusion chain. + sample: current instance of sample being created by diffusion process. + + Returns: + pred_prev_sample: Predicted previous sample + pred_original_sample: Predicted original sample + """ + # See Appendix F at https://arxiv.org/pdf/2105.05233.pdf, or Equation (6) in https://arxiv.org/pdf/2203.04306.pdf + + # Notation ( -> + # - model_output -> e_theta(x_t, t) + # - pred_original_sample -> f_theta(x_t, t) or x_0 + # - std_dev_t -> sigma_t + # - eta -> η + # - pred_sample_direction -> "direction pointing to x_t" + # - pred_post_sample -> "x_t+1" + + # 1. get previous step value (=t+1) + prev_timestep = timestep + self.num_train_timesteps // self.num_inference_steps + + # 2. compute alphas, betas at timestep t+1 + alpha_prod_t = self.alphas_cumprod[timestep] + alpha_prod_t_prev = self.alphas_cumprod[prev_timestep] if prev_timestep >= 0 else self.final_alpha_cumprod + + beta_prod_t = 1 - alpha_prod_t + + # predefinitions satisfy pylint/mypy, these values won't be ultimately used + pred_original_sample = sample + pred_epsilon = model_output + + # 3. compute predicted original sample from predicted noise also called + # "predicted x_0" of formula (12) from https://arxiv.org/pdf/2010.02502.pdf + + if self.prediction_type == DDIMPredictionType.EPSILON: + pred_original_sample = (sample - beta_prod_t ** (0.5) * model_output) / alpha_prod_t ** (0.5) + pred_epsilon = model_output + elif self.prediction_type == DDIMPredictionType.SAMPLE: + pred_original_sample = model_output + pred_epsilon = (sample - alpha_prod_t ** (0.5) * pred_original_sample) / beta_prod_t ** (0.5) + elif self.prediction_type == DDIMPredictionType.V_PREDICTION: + pred_original_sample = (alpha_prod_t**0.5) * sample - (beta_prod_t**0.5) * model_output + pred_epsilon = (alpha_prod_t**0.5) * model_output + (beta_prod_t**0.5) * sample + + # 4. Clip "predicted x_0" + if self.clip_sample: + pred_original_sample = torch.clamp( + pred_original_sample, self.clip_sample_values[0], self.clip_sample_values[1] + ) + + # 5. compute "direction pointing to x_t" of formula (12) from https://arxiv.org/pdf/2010.02502.pdf + pred_sample_direction = (1 - alpha_prod_t_prev) ** (0.5) * pred_epsilon + + # 6. compute x_t+1 without "random noise" of formula (12) from https://arxiv.org/pdf/2010.02502.pdf + pred_post_sample = alpha_prod_t_prev ** (0.5) * pred_original_sample + pred_sample_direction + + return pred_post_sample, pred_original_sample diff --git a/monai/networks/schedulers/ddpm.py b/monai/networks/schedulers/ddpm.py new file mode 100644 index 0000000000..93ad833031 --- /dev/null +++ b/monai/networks/schedulers/ddpm.py @@ -0,0 +1,250 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ========================================================================= +# Adapted from https://github.com/huggingface/diffusers +# which has the following license: +# https://github.com/huggingface/diffusers/blob/main/LICENSE +# +# Copyright 2022 UC Berkeley Team and The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================================================================= + +from __future__ import annotations + +import numpy as np +import torch + +from monai.utils import StrEnum + +from .scheduler import Scheduler + + +class DDPMVarianceType(StrEnum): + """ + Valid names for DDPM Scheduler's `variance_type` argument. Options to clip the variance used when adding noise + to the denoised sample. + """ + + FIXED_SMALL = "fixed_small" + FIXED_LARGE = "fixed_large" + LEARNED = "learned" + LEARNED_RANGE = "learned_range" + + +class DDPMPredictionType(StrEnum): + """ + Set of valid prediction type names for the DDPM scheduler's `prediction_type` argument. + + epsilon: predicting the noise of the diffusion process + sample: directly predicting the noisy sample + v_prediction: velocity prediction, see section 2.4 https://imagen.research.google/video/paper.pdf + """ + + EPSILON = "epsilon" + SAMPLE = "sample" + V_PREDICTION = "v_prediction" + + +class DDPMScheduler(Scheduler): + """ + Denoising diffusion probabilistic models (DDPMs) explores the connections between denoising score matching and + Langevin dynamics sampling. Based on: Ho et al., "Denoising Diffusion Probabilistic Models" + https://arxiv.org/abs/2006.11239 + + Args: + num_train_timesteps: number of diffusion steps used to train the model. + schedule: member of NoiseSchedules, name of noise schedule function in component store + variance_type: member of DDPMVarianceType + clip_sample: option to clip predicted sample between -1 and 1 for numerical stability. + prediction_type: member of DDPMPredictionType + clip_sample_min: minimum clipping value when clip_sample equals True + clip_sample_max: maximum clipping value when clip_sample equals True + schedule_args: arguments to pass to the schedule function + """ + + def __init__( + self, + num_train_timesteps: int = 1000, + schedule: str = "linear_beta", + variance_type: str = DDPMVarianceType.FIXED_SMALL, + clip_sample: bool = True, + prediction_type: str = DDPMPredictionType.EPSILON, + clip_sample_min: float = -1.0, + clip_sample_max: float = 1.0, + **schedule_args, + ) -> None: + super().__init__(num_train_timesteps, schedule, **schedule_args) + + if variance_type not in DDPMVarianceType.__members__.values(): + raise ValueError("Argument `variance_type` must be a member of `DDPMVarianceType`") + + if prediction_type not in DDPMPredictionType.__members__.values(): + raise ValueError("Argument `prediction_type` must be a member of `DDPMPredictionType`") + + self.clip_sample = clip_sample + self.clip_sample_values = [clip_sample_min, clip_sample_max] + self.variance_type = variance_type + self.prediction_type = prediction_type + + def set_timesteps(self, num_inference_steps: int, device: str | torch.device | None = None) -> None: + """ + Sets the discrete timesteps used for the diffusion chain. Supporting function to be run before inference. + + Args: + num_inference_steps: number of diffusion steps used when generating samples with a pre-trained model. + device: target device to put the data. + """ + if num_inference_steps > self.num_train_timesteps: + raise ValueError( + f"`num_inference_steps`: {num_inference_steps} cannot be larger than `self.num_train_timesteps`:" + f" {self.num_train_timesteps} as the unet model trained with this scheduler can only handle" + f" maximal {self.num_train_timesteps} timesteps." + ) + + self.num_inference_steps = num_inference_steps + step_ratio = self.num_train_timesteps // self.num_inference_steps + # creates integer timesteps by multiplying by ratio + # casting to int to avoid issues when num_inference_step is power of 3 + timesteps = (np.arange(0, num_inference_steps) * step_ratio).round()[::-1].astype(np.int64) + self.timesteps = torch.from_numpy(timesteps).to(device) + + def _get_mean(self, timestep: int, x_0: torch.Tensor, x_t: torch.Tensor) -> torch.Tensor: + """ + Compute the mean of the posterior at timestep t. + + Args: + timestep: current timestep. + x0: the noise-free input. + x_t: the input noised to timestep t. + + Returns: + Returns the mean + """ + # these attributes are used for calculating the posterior, q(x_{t-1}|x_t,x_0), + # (see formula (5-7) from https://arxiv.org/pdf/2006.11239.pdf) + alpha_t = self.alphas[timestep] + alpha_prod_t = self.alphas_cumprod[timestep] + alpha_prod_t_prev = self.alphas_cumprod[timestep - 1] if timestep > 0 else self.one + + x_0_coefficient = alpha_prod_t_prev.sqrt() * self.betas[timestep] / (1 - alpha_prod_t) + x_t_coefficient = alpha_t.sqrt() * (1 - alpha_prod_t_prev) / (1 - alpha_prod_t) + + mean: torch.Tensor = x_0_coefficient * x_0 + x_t_coefficient * x_t + + return mean + + def _get_variance(self, timestep: int, predicted_variance: torch.Tensor | None = None) -> torch.Tensor: + """ + Compute the variance of the posterior at timestep t. + + Args: + timestep: current timestep. + predicted_variance: variance predicted by the model. + + Returns: + Returns the variance + """ + alpha_prod_t = self.alphas_cumprod[timestep] + alpha_prod_t_prev = self.alphas_cumprod[timestep - 1] if timestep > 0 else self.one + + # For t > 0, compute predicted variance βt (see formula (6) and (7) from https://arxiv.org/pdf/2006.11239.pdf) + # and sample from it to get previous sample + # x_{t-1} ~ N(pred_prev_sample, variance) == add variance to pred_sample + variance: torch.Tensor = (1 - alpha_prod_t_prev) / (1 - alpha_prod_t) * self.betas[timestep] + # hacks - were probably added for training stability + if self.variance_type == DDPMVarianceType.FIXED_SMALL: + variance = torch.clamp(variance, min=1e-20) + elif self.variance_type == DDPMVarianceType.FIXED_LARGE: + variance = self.betas[timestep] + elif self.variance_type == DDPMVarianceType.LEARNED and predicted_variance is not None: + return predicted_variance + elif self.variance_type == DDPMVarianceType.LEARNED_RANGE and predicted_variance is not None: + min_log = variance + max_log = self.betas[timestep] + frac = (predicted_variance + 1) / 2 + variance = frac * max_log + (1 - frac) * min_log + + return variance + + def step( + self, model_output: torch.Tensor, timestep: int, sample: torch.Tensor, generator: torch.Generator | None = None + ) -> tuple[torch.Tensor, torch.Tensor]: + """ + Predict the sample at the previous timestep by reversing the SDE. Core function to propagate the diffusion + process from the learned model outputs (most often the predicted noise). + + Args: + model_output: direct output from learned diffusion model. + timestep: current discrete timestep in the diffusion chain. + sample: current instance of sample being created by diffusion process. + generator: random number generator. + + Returns: + pred_prev_sample: Predicted previous sample + """ + if model_output.shape[1] == sample.shape[1] * 2 and self.variance_type in ["learned", "learned_range"]: + model_output, predicted_variance = torch.split(model_output, sample.shape[1], dim=1) + else: + predicted_variance = None + + # 1. compute alphas, betas + alpha_prod_t = self.alphas_cumprod[timestep] + alpha_prod_t_prev = self.alphas_cumprod[timestep - 1] if timestep > 0 else self.one + beta_prod_t = 1 - alpha_prod_t + beta_prod_t_prev = 1 - alpha_prod_t_prev + + # 2. compute predicted original sample from predicted noise also called + # "predicted x_0" of formula (15) from https://arxiv.org/pdf/2006.11239.pdf + if self.prediction_type == DDPMPredictionType.EPSILON: + pred_original_sample = (sample - beta_prod_t ** (0.5) * model_output) / alpha_prod_t ** (0.5) + elif self.prediction_type == DDPMPredictionType.SAMPLE: + pred_original_sample = model_output + elif self.prediction_type == DDPMPredictionType.V_PREDICTION: + pred_original_sample = (alpha_prod_t**0.5) * sample - (beta_prod_t**0.5) * model_output + + # 3. Clip "predicted x_0" + if self.clip_sample: + pred_original_sample = torch.clamp( + pred_original_sample, self.clip_sample_values[0], self.clip_sample_values[1] + ) + + # 4. Compute coefficients for pred_original_sample x_0 and current sample x_t + # See formula (7) from https://arxiv.org/pdf/2006.11239.pdf + pred_original_sample_coeff = (alpha_prod_t_prev ** (0.5) * self.betas[timestep]) / beta_prod_t + current_sample_coeff = self.alphas[timestep] ** (0.5) * beta_prod_t_prev / beta_prod_t + + # 5. Compute predicted previous sample µ_t + # See formula (7) from https://arxiv.org/pdf/2006.11239.pdf + pred_prev_sample = pred_original_sample_coeff * pred_original_sample + current_sample_coeff * sample + + # 6. Add noise + variance = 0 + if timestep > 0: + noise = torch.randn( + model_output.size(), dtype=model_output.dtype, layout=model_output.layout, generator=generator + ).to(model_output.device) + variance = (self._get_variance(timestep, predicted_variance=predicted_variance) ** 0.5) * noise + + pred_prev_sample = pred_prev_sample + variance + + return pred_prev_sample, pred_original_sample diff --git a/monai/networks/schedulers/pndm.py b/monai/networks/schedulers/pndm.py new file mode 100644 index 0000000000..c0728bbdff --- /dev/null +++ b/monai/networks/schedulers/pndm.py @@ -0,0 +1,316 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ========================================================================= +# Adapted from https://github.com/huggingface/diffusers +# which has the following license: +# https://github.com/huggingface/diffusers/blob/main/LICENSE +# +# Copyright 2022 UC Berkeley Team and The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================================================================= + +from __future__ import annotations + +from typing import Any + +import numpy as np +import torch + +from monai.utils import StrEnum + +from .scheduler import Scheduler + + +class PNDMPredictionType(StrEnum): + """ + Set of valid prediction type names for the PNDM scheduler's `prediction_type` argument. + + epsilon: predicting the noise of the diffusion process + v_prediction: velocity prediction, see section 2.4 https://imagen.research.google/video/paper.pdf + """ + + EPSILON = "epsilon" + V_PREDICTION = "v_prediction" + + +class PNDMScheduler(Scheduler): + """ + Pseudo numerical methods for diffusion models (PNDM) proposes using more advanced ODE integration techniques, + namely Runge-Kutta method and a linear multi-step method. Based on: Liu et al., + "Pseudo Numerical Methods for Diffusion Models on Manifolds" https://arxiv.org/abs/2202.09778 + + Args: + num_train_timesteps: number of diffusion steps used to train the model. + schedule: member of NoiseSchedules, name of noise schedule function in component store + skip_prk_steps: + allows the scheduler to skip the Runge-Kutta steps that are defined in the original paper as being required + before plms step. + set_alpha_to_one: + each diffusion step uses the value of alphas product at that step and at the previous one. For the final + step there is no previous alpha. When this option is `True` the previous alpha product is fixed to `1`, + otherwise it uses the value of alpha at step 0. + prediction_type: member of DDPMPredictionType + steps_offset: + an offset added to the inference steps. You can use a combination of `offset=1` and + `set_alpha_to_one=False`, to make the last step use step 0 for the previous alpha product, as done in + stable diffusion. + schedule_args: arguments to pass to the schedule function + """ + + def __init__( + self, + num_train_timesteps: int = 1000, + schedule: str = "linear_beta", + skip_prk_steps: bool = False, + set_alpha_to_one: bool = False, + prediction_type: str = PNDMPredictionType.EPSILON, + steps_offset: int = 0, + **schedule_args, + ) -> None: + super().__init__(num_train_timesteps, schedule, **schedule_args) + + if prediction_type not in PNDMPredictionType.__members__.values(): + raise ValueError("Argument `prediction_type` must be a member of PNDMPredictionType") + + self.prediction_type = prediction_type + + self.final_alpha_cumprod = torch.tensor(1.0) if set_alpha_to_one else self.alphas_cumprod[0] + + # standard deviation of the initial noise distribution + self.init_noise_sigma = 1.0 + + # For now we only support F-PNDM, i.e. the runge-kutta method + # For more information on the algorithm please take a look at the paper: https://arxiv.org/pdf/2202.09778.pdf + # mainly at formula (9), (12), (13) and the Algorithm 2. + self.pndm_order = 4 + + self.skip_prk_steps = skip_prk_steps + self.steps_offset = steps_offset + + # running values + self.cur_model_output = torch.Tensor() + self.counter = 0 + self.cur_sample = torch.Tensor() + self.ets: list = [] + + # default the number of inference timesteps to the number of train steps + self.set_timesteps(num_train_timesteps) + + def set_timesteps(self, num_inference_steps: int, device: str | torch.device | None = None) -> None: + """ + Sets the discrete timesteps used for the diffusion chain. Supporting function to be run before inference. + + Args: + num_inference_steps: number of diffusion steps used when generating samples with a pre-trained model. + device: target device to put the data. + """ + if num_inference_steps > self.num_train_timesteps: + raise ValueError( + f"`num_inference_steps`: {num_inference_steps} cannot be larger than `self.num_train_timesteps`:" + f" {self.num_train_timesteps} as the unet model trained with this scheduler can only handle" + f" maximal {self.num_train_timesteps} timesteps." + ) + + self.num_inference_steps = num_inference_steps + step_ratio = self.num_train_timesteps // self.num_inference_steps + # creates integer timesteps by multiplying by ratio + # casting to int to avoid issues when num_inference_step is power of 3 + self._timesteps = (np.arange(0, num_inference_steps) * step_ratio).round().astype(np.int64) + self._timesteps += self.steps_offset + + if self.skip_prk_steps: + # for some models like stable diffusion the prk steps can/should be skipped to + # produce better results. When using PNDM with `self.skip_prk_steps` the implementation + # is based on crowsonkb's PLMS sampler implementation: https://github.com/CompVis/latent-diffusion/pull/51 + self.prk_timesteps = np.array([]) + self.plms_timesteps = self._timesteps[::-1] + + else: + prk_timesteps = np.array(self._timesteps[-self.pndm_order :]).repeat(2) + np.tile( + np.array([0, self.num_train_timesteps // num_inference_steps // 2]), self.pndm_order + ) + self.prk_timesteps = (prk_timesteps[:-1].repeat(2)[1:-1])[::-1].copy() + self.plms_timesteps = self._timesteps[:-3][ + ::-1 + ].copy() # we copy to avoid having negative strides which are not supported by torch.from_numpy + + timesteps = np.concatenate([self.prk_timesteps, self.plms_timesteps]).astype(np.int64) + self.timesteps = torch.from_numpy(timesteps).to(device) + # update num_inference_steps - necessary if we use prk steps + self.num_inference_steps = len(self.timesteps) + + self.ets = [] + self.counter = 0 + + def step(self, model_output: torch.Tensor, timestep: int, sample: torch.Tensor) -> tuple[torch.Tensor, Any]: + """ + Predict the sample at the previous timestep by reversing the SDE. Core function to propagate the diffusion + process from the learned model outputs (most often the predicted noise). + This function calls `step_prk()` or `step_plms()` depending on the internal variable `counter`. + + Args: + model_output: direct output from learned diffusion model. + timestep: current discrete timestep in the diffusion chain. + sample: current instance of sample being created by diffusion process. + Returns: + pred_prev_sample: Predicted previous sample + """ + # return a tuple for consistency with samplers that return (previous pred, original sample pred) + + if self.counter < len(self.prk_timesteps) and not self.skip_prk_steps: + return self.step_prk(model_output=model_output, timestep=timestep, sample=sample), None + else: + return self.step_plms(model_output=model_output, timestep=timestep, sample=sample), None + + def step_prk(self, model_output: torch.Tensor, timestep: int, sample: torch.Tensor) -> torch.Tensor: + """ + Step function propagating the sample with the Runge-Kutta method. RK takes 4 forward passes to approximate the + solution to the differential equation. + + Args: + model_output: direct output from learned diffusion model. + timestep: current discrete timestep in the diffusion chain. + sample: current instance of sample being created by diffusion process. + + Returns: + pred_prev_sample: Predicted previous sample + """ + if self.num_inference_steps is None: + raise ValueError( + "Number of inference steps is 'None', you need to run 'set_timesteps' after creating the scheduler" + ) + + diff_to_prev = 0 if self.counter % 2 else self.num_train_timesteps // self.num_inference_steps // 2 + prev_timestep = timestep - diff_to_prev + timestep = self.prk_timesteps[self.counter // 4 * 4] + + if self.counter % 4 == 0: + self.cur_model_output = 1 / 6 * model_output + self.ets.append(model_output) + self.cur_sample = sample + elif (self.counter - 1) % 4 == 0: + self.cur_model_output += 1 / 3 * model_output + elif (self.counter - 2) % 4 == 0: + self.cur_model_output += 1 / 3 * model_output + elif (self.counter - 3) % 4 == 0: + model_output = self.cur_model_output + 1 / 6 * model_output + self.cur_model_output = torch.Tensor() + + # cur_sample should not be an empty torch.Tensor() + cur_sample = self.cur_sample if self.cur_sample.numel() != 0 else sample + + prev_sample: torch.Tensor = self._get_prev_sample(cur_sample, timestep, prev_timestep, model_output) + self.counter += 1 + + return prev_sample + + def step_plms(self, model_output: torch.Tensor, timestep: int, sample: torch.Tensor) -> Any: + """ + Step function propagating the sample with the linear multi-step method. This has one forward pass with multiple + times to approximate the solution. + + Args: + model_output: direct output from learned diffusion model. + timestep: current discrete timestep in the diffusion chain. + sample: current instance of sample being created by diffusion process. + + Returns: + pred_prev_sample: Predicted previous sample + """ + if self.num_inference_steps is None: + raise ValueError( + "Number of inference steps is 'None', you need to run 'set_timesteps' after creating the scheduler" + ) + + if not self.skip_prk_steps and len(self.ets) < 3: + raise ValueError( + f"{self.__class__} can only be run AFTER scheduler has been run " + "in 'prk' mode for at least 12 iterations " + ) + + prev_timestep = timestep - self.num_train_timesteps // self.num_inference_steps + + if self.counter != 1: + self.ets = self.ets[-3:] + self.ets.append(model_output) + else: + prev_timestep = timestep + timestep = timestep + self.num_train_timesteps // self.num_inference_steps + + if len(self.ets) == 1 and self.counter == 0: + model_output = model_output + self.cur_sample = sample + elif len(self.ets) == 1 and self.counter == 1: + model_output = (model_output + self.ets[-1]) / 2 + sample = self.cur_sample + self.cur_sample = torch.Tensor() + elif len(self.ets) == 2: + model_output = (3 * self.ets[-1] - self.ets[-2]) / 2 + elif len(self.ets) == 3: + model_output = (23 * self.ets[-1] - 16 * self.ets[-2] + 5 * self.ets[-3]) / 12 + else: + model_output = (1 / 24) * (55 * self.ets[-1] - 59 * self.ets[-2] + 37 * self.ets[-3] - 9 * self.ets[-4]) + + prev_sample = self._get_prev_sample(sample, timestep, prev_timestep, model_output) + self.counter += 1 + + return prev_sample + + def _get_prev_sample(self, sample: torch.Tensor, timestep: int, prev_timestep: int, model_output: torch.Tensor): + # See formula (9) of PNDM paper https://arxiv.org/pdf/2202.09778.pdf + # this function computes x_(t−δ) using the formula of (9) + # Note that x_t needs to be added to both sides of the equation + + # Notation ( -> + # alpha_prod_t -> α_t + # alpha_prod_t_prev -> α_(t−δ) + # beta_prod_t -> (1 - α_t) + # beta_prod_t_prev -> (1 - α_(t−δ)) + # sample -> x_t + # model_output -> e_θ(x_t, t) + # prev_sample -> x_(t−δ) + alpha_prod_t = self.alphas_cumprod[timestep] + alpha_prod_t_prev = self.alphas_cumprod[prev_timestep] if prev_timestep >= 0 else self.final_alpha_cumprod + beta_prod_t = 1 - alpha_prod_t + beta_prod_t_prev = 1 - alpha_prod_t_prev + + if self.prediction_type == PNDMPredictionType.V_PREDICTION: + model_output = (alpha_prod_t**0.5) * model_output + (beta_prod_t**0.5) * sample + + # corresponds to (α_(t−δ) - α_t) divided by + # denominator of x_t in formula (9) and plus 1 + # Note: (α_(t−δ) - α_t) / (sqrt(α_t) * (sqrt(α_(t−δ)) + sqr(α_t))) = + # sqrt(α_(t−δ)) / sqrt(α_t)) + sample_coeff = (alpha_prod_t_prev / alpha_prod_t) ** (0.5) + + # corresponds to denominator of e_θ(x_t, t) in formula (9) + model_output_denom_coeff = alpha_prod_t * beta_prod_t_prev ** (0.5) + ( + alpha_prod_t * beta_prod_t * alpha_prod_t_prev + ) ** (0.5) + + # full formula (9) + prev_sample = ( + sample_coeff * sample - (alpha_prod_t_prev - alpha_prod_t) * model_output / model_output_denom_coeff + ) + + return prev_sample diff --git a/monai/networks/schedulers/scheduler.py b/monai/networks/schedulers/scheduler.py new file mode 100644 index 0000000000..acdccc60de --- /dev/null +++ b/monai/networks/schedulers/scheduler.py @@ -0,0 +1,205 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ========================================================================= +# Adapted from https://github.com/huggingface/diffusers +# which has the following license: +# https://github.com/huggingface/diffusers/blob/main/LICENSE +# +# Copyright 2022 UC Berkeley Team and The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================================================================= + + +from __future__ import annotations + +import torch +import torch.nn as nn + +from monai.utils import ComponentStore, unsqueeze_right + +NoiseSchedules = ComponentStore("NoiseSchedules", "Functions to generate noise schedules") + + +@NoiseSchedules.add_def("linear_beta", "Linear beta schedule") +def _linear_beta(num_train_timesteps: int, beta_start: float = 1e-4, beta_end: float = 2e-2): + """ + Linear beta noise schedule function. + + Args: + num_train_timesteps: number of timesteps + beta_start: start of beta range, default 1e-4 + beta_end: end of beta range, default 2e-2 + + Returns: + betas: beta schedule tensor + """ + return torch.linspace(beta_start, beta_end, num_train_timesteps, dtype=torch.float32) + + +@NoiseSchedules.add_def("scaled_linear_beta", "Scaled linear beta schedule") +def _scaled_linear_beta(num_train_timesteps: int, beta_start: float = 1e-4, beta_end: float = 2e-2): + """ + Scaled linear beta noise schedule function. + + Args: + num_train_timesteps: number of timesteps + beta_start: start of beta range, default 1e-4 + beta_end: end of beta range, default 2e-2 + + Returns: + betas: beta schedule tensor + """ + return torch.linspace(beta_start**0.5, beta_end**0.5, num_train_timesteps, dtype=torch.float32) ** 2 + + +@NoiseSchedules.add_def("sigmoid_beta", "Sigmoid beta schedule") +def _sigmoid_beta(num_train_timesteps: int, beta_start: float = 1e-4, beta_end: float = 2e-2, sig_range: float = 6): + """ + Sigmoid beta noise schedule function. + + Args: + num_train_timesteps: number of timesteps + beta_start: start of beta range, default 1e-4 + beta_end: end of beta range, default 2e-2 + sig_range: pos/neg range of sigmoid input, default 6 + + Returns: + betas: beta schedule tensor + """ + betas = torch.linspace(-sig_range, sig_range, num_train_timesteps) + return torch.sigmoid(betas) * (beta_end - beta_start) + beta_start + + +@NoiseSchedules.add_def("cosine", "Cosine schedule") +def _cosine_beta(num_train_timesteps: int, s: float = 8e-3): + """ + Cosine noise schedule, see https://arxiv.org/abs/2102.09672 + + Args: + num_train_timesteps: number of timesteps + s: smoothing factor, default 8e-3 (see referenced paper) + + Returns: + (betas, alphas, alpha_cumprod) values + """ + x = torch.linspace(0, num_train_timesteps, num_train_timesteps + 1) + alphas_cumprod = torch.cos(((x / num_train_timesteps) + s) / (1 + s) * torch.pi * 0.5) ** 2 + alphas_cumprod /= alphas_cumprod[0].item() + alphas = torch.clip(alphas_cumprod[1:] / alphas_cumprod[:-1], 0.0001, 0.9999) + betas = 1.0 - alphas + return betas, alphas, alphas_cumprod[:-1] + + +class Scheduler(nn.Module): + """ + Base class for other schedulers based on a noise schedule function. + + This class is meant as the base for other schedulers which implement their own way of sampling or stepping. Here + the class defines beta, alpha, and alpha_cumprod values from a noise schedule function named with `schedule`, + which is the name of a component in NoiseSchedules. These components must all be callables which return either + the beta schedule alone or a triple containing (betas, alphas, alphas_cumprod) values. New schedule functions + can be provided by using the NoiseSchedules.add_def, for example: + + .. code-block:: python + + from monai.networks.schedulers import NoiseSchedules, DDPMScheduler + + @NoiseSchedules.add_def("my_beta_schedule", "Some description of your function") + def _beta_function(num_train_timesteps, beta_start=1e-4, beta_end=2e-2): + return torch.linspace(beta_start, beta_end, num_train_timesteps, dtype=torch.float32) + + scheduler = DDPMScheduler(num_train_timesteps=1000, schedule="my_beta_schedule") + + All such functions should have an initial positional integer argument `num_train_timesteps` stating the number of + timesteps the schedule is for, otherwise any other arguments can be given which will be passed by keyword through + the constructor's `schedule_args` value. To see what noise functions are available, print the object NoiseSchedules + to get a listing of stored objects with their docstring descriptions. + + Note: in previous versions of the schedulers the argument `schedule_beta` was used to state the beta schedule + type, this now replaced with `schedule` and most names used with the previous argument now have "_beta" appended + to them, eg. 'schedule_beta="linear"' -> 'schedule="linear_beta"'. The `beta_start` and `beta_end` arguments are + still used for some schedules but these are provided as keyword arguments now. + + Args: + num_train_timesteps: number of diffusion steps used to train the model. + schedule: member of NoiseSchedules, + a named function returning the beta tensor or (betas, alphas, alphas_cumprod) triple + schedule_args: arguments to pass to the schedule function + """ + + def __init__(self, num_train_timesteps: int = 1000, schedule: str = "linear_beta", **schedule_args) -> None: + super().__init__() + schedule_args["num_train_timesteps"] = num_train_timesteps + noise_sched = NoiseSchedules[schedule](**schedule_args) + + # set betas, alphas, alphas_cumprod based off return value from noise function + if isinstance(noise_sched, tuple): + self.betas, self.alphas, self.alphas_cumprod = noise_sched + else: + self.betas = noise_sched + self.alphas = 1.0 - self.betas + self.alphas_cumprod = torch.cumprod(self.alphas, dim=0) + + self.num_train_timesteps = num_train_timesteps + self.one = torch.tensor(1.0) + + # settable values + self.num_inference_steps: int | None = None + self.timesteps = torch.arange(num_train_timesteps - 1, -1, -1) + + def add_noise(self, original_samples: torch.Tensor, noise: torch.Tensor, timesteps: torch.Tensor) -> torch.Tensor: + """ + Add noise to the original samples. + + Args: + original_samples: original samples + noise: noise to add to samples + timesteps: timesteps tensor indicating the timestep to be computed for each sample. + + Returns: + noisy_samples: sample with added noise + """ + # Make sure alphas_cumprod and timestep have same device and dtype as original_samples + self.alphas_cumprod = self.alphas_cumprod.to(device=original_samples.device, dtype=original_samples.dtype) + timesteps = timesteps.to(original_samples.device) + + sqrt_alpha_cumprod: torch.Tensor = unsqueeze_right(self.alphas_cumprod[timesteps] ** 0.5, original_samples.ndim) + sqrt_one_minus_alpha_prod: torch.Tensor = unsqueeze_right( + (1 - self.alphas_cumprod[timesteps]) ** 0.5, original_samples.ndim + ) + + noisy_samples = sqrt_alpha_cumprod * original_samples + sqrt_one_minus_alpha_prod * noise + return noisy_samples + + def get_velocity(self, sample: torch.Tensor, noise: torch.Tensor, timesteps: torch.Tensor) -> torch.Tensor: + # Make sure alphas_cumprod and timestep have same device and dtype as sample + self.alphas_cumprod = self.alphas_cumprod.to(device=sample.device, dtype=sample.dtype) + timesteps = timesteps.to(sample.device) + + sqrt_alpha_prod: torch.Tensor = unsqueeze_right(self.alphas_cumprod[timesteps] ** 0.5, sample.ndim) + sqrt_one_minus_alpha_prod: torch.Tensor = unsqueeze_right( + (1 - self.alphas_cumprod[timesteps]) ** 0.5, sample.ndim + ) + + velocity = sqrt_alpha_prod * noise - sqrt_one_minus_alpha_prod * sample + return velocity diff --git a/monai/networks/utils.py b/monai/networks/utils.py index 42e537648a..6a97434215 100644 --- a/monai/networks/utils.py +++ b/monai/networks/utils.py @@ -42,6 +42,7 @@ "predict_segmentation", "normalize_transform", "to_norm_affine", + "CastTempType", "normal_init", "icnr_init", "pixelshuffle", @@ -840,7 +841,6 @@ def _onnx_trt_compile( # set up the conversion configuration config = builder.create_builder_config() - config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 1 << 31) config.add_optimization_profile(profile) if precision == "fp16": config.set_flag(trt.BuilderFlag.FP16) @@ -850,7 +850,10 @@ def _onnx_trt_compile( # wrap the serialized TensorRT engine back to a TorchScript module. trt_model = torch_tensorrt.ts.embed_engine_in_new_module( - f.getvalue(), torch.device(f"cuda:{device}"), input_names, output_names + f.getvalue(), + device=torch.device(f"cuda:{device}"), + input_binding_names=input_names, + output_binding_names=output_names, ) return trt_model @@ -984,6 +987,7 @@ def scale_batch_size(input_shape: Sequence[int], scale_num: int): inputs=input_placeholder, enabled_precisions=convert_precision, device=target_device, + ir="torchscript", **kwargs, ) @@ -1164,3 +1168,24 @@ def freeze_layers(model: nn.Module, freeze_vars=None, exclude_vars=None): warnings.warn(f"The exclude_vars includes {param}, but requires_grad is False, change it to True.") logger.info(f"{len(frozen_keys)} of {len(src_dict)} variables frozen.") + + +class CastTempType(nn.Module): + """ + Cast the input tensor to a temporary type before applying the submodule, and then cast it back to the initial type. + """ + + def __init__(self, initial_type, temporary_type, submodule): + super().__init__() + self.initial_type = initial_type + self.temporary_type = temporary_type + self.submodule = submodule + + def forward(self, x): + dtype = x.dtype + if dtype == self.initial_type: + x = x.to(self.temporary_type) + x = self.submodule(x) + if dtype == self.initial_type: + x = x.to(self.initial_type) + return x diff --git a/monai/optimizers/lr_finder.py b/monai/optimizers/lr_finder.py index 045135628d..aa2e4567b3 100644 --- a/monai/optimizers/lr_finder.py +++ b/monai/optimizers/lr_finder.py @@ -524,7 +524,7 @@ def plot( # Plot the LR with steepest gradient if steepest_lr: lr_at_steepest_grad, loss_at_steepest_grad = self.get_steepest_gradient(skip_start, skip_end) - if lr_at_steepest_grad is not None: + if lr_at_steepest_grad is not None and loss_at_steepest_grad is not None: ax.scatter( lr_at_steepest_grad, loss_at_steepest_grad, diff --git a/monai/transforms/__init__.py b/monai/transforms/__init__.py index 2aa8fbf8a1..ef1da2d855 100644 --- a/monai/transforms/__init__.py +++ b/monai/transforms/__init__.py @@ -92,6 +92,7 @@ from .croppad.functional import crop_func, crop_or_pad_nd, pad_func, pad_nd from .intensity.array import ( AdjustContrast, + ClipIntensityPercentiles, ComputeHoVerMaps, DetectEnvelope, ForegroundMask, @@ -135,6 +136,9 @@ AdjustContrastd, AdjustContrastD, AdjustContrastDict, + ClipIntensityPercentilesd, + ClipIntensityPercentilesD, + ClipIntensityPercentilesDict, ComputeHoVerMapsd, ComputeHoVerMapsD, ComputeHoVerMapsDict, @@ -336,6 +340,18 @@ VoteEnsembled, VoteEnsembleDict, ) +from .regularization.array import CutMix, CutOut, MixUp +from .regularization.dictionary import ( + CutMixd, + CutMixD, + CutMixDict, + CutOutd, + CutOutD, + CutOutDict, + MixUpd, + MixUpD, + MixUpDict, +) from .signal.array import ( SignalContinuousWavelet, SignalFillEmpty, @@ -655,6 +671,7 @@ in_bounds, is_empty, is_positive, + map_and_generate_sampling_centers, map_binary_to_indices, map_classes_to_indices, map_spatial_axes, diff --git a/monai/transforms/croppad/array.py b/monai/transforms/croppad/array.py index ce3701b263..813f8c1d44 100644 --- a/monai/transforms/croppad/array.py +++ b/monai/transforms/croppad/array.py @@ -362,10 +362,10 @@ def __init__(self, lazy: bool = False): @staticmethod def compute_slices( - roi_center: Sequence[int] | NdarrayOrTensor | None = None, - roi_size: Sequence[int] | NdarrayOrTensor | None = None, - roi_start: Sequence[int] | NdarrayOrTensor | None = None, - roi_end: Sequence[int] | NdarrayOrTensor | None = None, + roi_center: Sequence[int] | int | NdarrayOrTensor | None = None, + roi_size: Sequence[int] | int | NdarrayOrTensor | None = None, + roi_start: Sequence[int] | int | NdarrayOrTensor | None = None, + roi_end: Sequence[int] | int | NdarrayOrTensor | None = None, roi_slices: Sequence[slice] | None = None, ) -> tuple[slice]: """ @@ -459,10 +459,10 @@ class SpatialCrop(Crop): def __init__( self, - roi_center: Sequence[int] | NdarrayOrTensor | None = None, - roi_size: Sequence[int] | NdarrayOrTensor | None = None, - roi_start: Sequence[int] | NdarrayOrTensor | None = None, - roi_end: Sequence[int] | NdarrayOrTensor | None = None, + roi_center: Sequence[int] | int | NdarrayOrTensor | None = None, + roi_size: Sequence[int] | int | NdarrayOrTensor | None = None, + roi_start: Sequence[int] | int | NdarrayOrTensor | None = None, + roi_end: Sequence[int] | int | NdarrayOrTensor | None = None, roi_slices: Sequence[slice] | None = None, lazy: bool = False, ) -> None: diff --git a/monai/transforms/croppad/dictionary.py b/monai/transforms/croppad/dictionary.py index be9441dc4a..cea11d9676 100644 --- a/monai/transforms/croppad/dictionary.py +++ b/monai/transforms/croppad/dictionary.py @@ -438,10 +438,10 @@ class SpatialCropd(Cropd): def __init__( self, keys: KeysCollection, - roi_center: Sequence[int] | None = None, - roi_size: Sequence[int] | None = None, - roi_start: Sequence[int] | None = None, - roi_end: Sequence[int] | None = None, + roi_center: Sequence[int] | int | None = None, + roi_size: Sequence[int] | int | None = None, + roi_start: Sequence[int] | int | None = None, + roi_end: Sequence[int] | int | None = None, roi_slices: Sequence[slice] | None = None, allow_missing_keys: bool = False, lazy: bool = False, diff --git a/monai/transforms/intensity/array.py b/monai/transforms/intensity/array.py index f9667402c9..3b813809e4 100644 --- a/monai/transforms/intensity/array.py +++ b/monai/transforms/intensity/array.py @@ -30,7 +30,7 @@ from monai.data.utils import get_random_patch, get_valid_patch_size from monai.networks.layers import GaussianFilter, HilbertTransform, MedianFilter, SavitzkyGolayFilter from monai.transforms.transform import RandomizableTransform, Transform -from monai.transforms.utils import Fourier, equalize_hist, is_positive, rescale_array +from monai.transforms.utils import Fourier, equalize_hist, is_positive, rescale_array, soft_clip from monai.transforms.utils_pytorch_numpy_unification import clip, percentile, where from monai.utils.enums import TransformBackends from monai.utils.misc import ensure_tuple, ensure_tuple_rep, ensure_tuple_size, fall_back_tuple @@ -54,6 +54,7 @@ "NormalizeIntensity", "ThresholdIntensity", "ScaleIntensityRange", + "ClipIntensityPercentiles", "AdjustContrast", "RandAdjustContrast", "ScaleIntensityRangePercentiles", @@ -91,24 +92,33 @@ class RandGaussianNoise(RandomizableTransform): mean: Mean or “centre” of the distribution. std: Standard deviation (spread) of distribution. dtype: output data type, if None, same as input image. defaults to float32. + sample_std: If True, sample the spread of the Gaussian distribution uniformly from 0 to std. """ backend = [TransformBackends.TORCH, TransformBackends.NUMPY] - def __init__(self, prob: float = 0.1, mean: float = 0.0, std: float = 0.1, dtype: DtypeLike = np.float32) -> None: + def __init__( + self, + prob: float = 0.1, + mean: float = 0.0, + std: float = 0.1, + dtype: DtypeLike = np.float32, + sample_std: bool = True, + ) -> None: RandomizableTransform.__init__(self, prob) self.mean = mean self.std = std self.dtype = dtype self.noise: np.ndarray | None = None + self.sample_std = sample_std def randomize(self, img: NdarrayOrTensor, mean: float | None = None) -> None: super().randomize(None) if not self._do_transform: return None - rand_std = self.R.uniform(0, self.std) - noise = self.R.normal(self.mean if mean is None else mean, rand_std, size=img.shape) + std = self.R.uniform(0, self.std) if self.sample_std else self.std + noise = self.R.normal(self.mean if mean is None else mean, std, size=img.shape) # noise is float64 array, convert to the output dtype to save memory self.noise, *_ = convert_data_type(noise, dtype=self.dtype) @@ -998,6 +1008,151 @@ def __call__(self, img: NdarrayOrTensor) -> NdarrayOrTensor: return ret +class ClipIntensityPercentiles(Transform): + """ + Apply clip based on the intensity distribution of input image. + If `sharpness_factor` is provided, the intensity values will be soft clipped according to + f(x) = x + (1/sharpness_factor)*softplus(- c(x - minv)) - (1/sharpness_factor)*softplus(c(x - maxv)) + From https://medium.com/life-at-hopper/clip-it-clip-it-good-1f1bf711b291 + + Soft clipping preserves the order of the values and maintains the gradient everywhere. + For example: + + .. code-block:: python + :emphasize-lines: 11, 22 + + image = torch.Tensor( + [[[1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5]]]) + + # Hard clipping from lower and upper image intensity percentiles + hard_clipper = ClipIntensityPercentiles(30, 70) + print(hard_clipper(image)) + metatensor([[[2., 2., 3., 4., 4.], + [2., 2., 3., 4., 4.], + [2., 2., 3., 4., 4.], + [2., 2., 3., 4., 4.], + [2., 2., 3., 4., 4.], + [2., 2., 3., 4., 4.]]]) + + + # Soft clipping from lower and upper image intensity percentiles + soft_clipper = ClipIntensityPercentiles(30, 70, 10.) + print(soft_clipper(image)) + metatensor([[[2.0000, 2.0693, 3.0000, 3.9307, 4.0000], + [2.0000, 2.0693, 3.0000, 3.9307, 4.0000], + [2.0000, 2.0693, 3.0000, 3.9307, 4.0000], + [2.0000, 2.0693, 3.0000, 3.9307, 4.0000], + [2.0000, 2.0693, 3.0000, 3.9307, 4.0000], + [2.0000, 2.0693, 3.0000, 3.9307, 4.0000]]]) + + See Also: + + - :py:class:`monai.transforms.ScaleIntensityRangePercentiles` + """ + + backend = [TransformBackends.TORCH, TransformBackends.NUMPY] + + def __init__( + self, + lower: float | None, + upper: float | None, + sharpness_factor: float | None = None, + channel_wise: bool = False, + return_clipping_values: bool = False, + dtype: DtypeLike = np.float32, + ) -> None: + """ + Args: + lower: lower intensity percentile. In the case of hard clipping, None will have the same effect as 0 by + not clipping the lowest input values. However, in the case of soft clipping, None and zero will have + two different effects: None will not apply clipping to low values, whereas zero will still transform + the lower values according to the soft clipping transformation. Please check for more details: + https://medium.com/life-at-hopper/clip-it-clip-it-good-1f1bf711b291. + upper: upper intensity percentile. The same as for lower, but this time with the highest values. If we + are looking to perform soft clipping, if None then there will be no effect on this side whereas if set + to 100, the values will be passed via the corresponding clipping equation. + sharpness_factor: if not None, the intensity values will be soft clipped according to + f(x) = x + (1/sharpness_factor)*softplus(- c(x - minv)) - (1/sharpness_factor)*softplus(c(x - maxv)). + defaults to None. + channel_wise: if True, compute intensity percentile and normalize every channel separately. + default to False. + return_clipping_values: whether to return the calculated percentiles in tensor meta information. + If soft clipping and requested percentile is None, return None as the corresponding clipping + values in meta information. Clipping values are stored in a list with each element corresponding + to a channel if channel_wise is set to True. defaults to False. + dtype: output data type, if None, same as input image. defaults to float32. + """ + if lower is None and upper is None: + raise ValueError("lower or upper percentiles must be provided") + if lower is not None and (lower < 0.0 or lower > 100.0): + raise ValueError("Percentiles must be in the range [0, 100]") + if upper is not None and (upper < 0.0 or upper > 100.0): + raise ValueError("Percentiles must be in the range [0, 100]") + if upper is not None and lower is not None and upper < lower: + raise ValueError("upper must be greater than or equal to lower") + if sharpness_factor is not None and sharpness_factor <= 0: + raise ValueError("sharpness_factor must be greater than 0") + + self.lower = lower + self.upper = upper + self.sharpness_factor = sharpness_factor + self.channel_wise = channel_wise + if return_clipping_values: + self.clipping_values: list[tuple[float | None, float | None]] = [] + self.return_clipping_values = return_clipping_values + self.dtype = dtype + + def _clip(self, img: NdarrayOrTensor) -> NdarrayOrTensor: + if self.sharpness_factor is not None: + lower_percentile = percentile(img, self.lower) if self.lower is not None else None + upper_percentile = percentile(img, self.upper) if self.upper is not None else None + img = soft_clip(img, self.sharpness_factor, lower_percentile, upper_percentile, self.dtype) + else: + lower_percentile = percentile(img, self.lower) if self.lower is not None else percentile(img, 0) + upper_percentile = percentile(img, self.upper) if self.upper is not None else percentile(img, 100) + img = clip(img, lower_percentile, upper_percentile) + + if self.return_clipping_values: + self.clipping_values.append( + ( + ( + lower_percentile + if lower_percentile is None + else lower_percentile.item() if hasattr(lower_percentile, "item") else lower_percentile + ), + ( + upper_percentile + if upper_percentile is None + else upper_percentile.item() if hasattr(upper_percentile, "item") else upper_percentile + ), + ) + ) + img = convert_to_tensor(img, track_meta=False) + return img + + def __call__(self, img: NdarrayOrTensor) -> NdarrayOrTensor: + """ + Apply the transform to `img`. + """ + img = convert_to_tensor(img, track_meta=get_track_meta()) + img_t = convert_to_tensor(img, track_meta=False) + if self.channel_wise: + img_t = torch.stack([self._clip(img=d) for d in img_t]) # type: ignore + else: + img_t = self._clip(img=img_t) + + img = convert_to_dst_type(img_t, dst=img)[0] + if self.return_clipping_values: + img.meta["clipping_values"] = self.clipping_values # type: ignore + + return img + + class AdjustContrast(Transform): """ Changes image intensity with gamma transform. Each pixel/voxel intensity is updated as:: @@ -1831,15 +1986,19 @@ class RandGibbsNoise(RandomizableTransform): Args: prob (float): probability of applying the transform. - alpha (Sequence(float)): Parametrizes the intensity of the Gibbs noise filter applied. Takes + alpha (float, Sequence(float)): Parametrizes the intensity of the Gibbs noise filter applied. Takes values in the interval [0,1] with alpha = 0 acting as the identity mapping. If a length-2 list is given as [a,b] then the value of alpha will be sampled uniformly from the interval [a,b]. 0 <= a <= b <= 1. + If a float is given, then the value of alpha will be sampled uniformly from the interval [0, alpha]. """ backend = GibbsNoise.backend - def __init__(self, prob: float = 0.1, alpha: Sequence[float] = (0.0, 1.0)) -> None: + def __init__(self, prob: float = 0.1, alpha: float | Sequence[float] = (0.0, 1.0)) -> None: + if isinstance(alpha, float): + alpha = (0, alpha) + alpha = ensure_tuple(alpha) if len(alpha) != 2: raise ValueError("alpha length must be 2.") if alpha[1] > 1 or alpha[0] < 0: @@ -2630,6 +2789,9 @@ class UltrasoundConfidenceMapTransform(Transform): It generates a confidence map by setting source and sink points in the image and computing the probability for random walks to reach the source for each pixel. + The official code is available at: + https://campar.in.tum.de/Main/AthanasiosKaramalisCode + Args: alpha (float, optional): Alpha parameter. Defaults to 2.0. beta (float, optional): Beta parameter. Defaults to 90.0. @@ -2637,14 +2799,32 @@ class UltrasoundConfidenceMapTransform(Transform): mode (str, optional): 'RF' or 'B' mode data. Defaults to 'B'. sink_mode (str, optional): Sink mode. Defaults to 'all'. If 'mask' is selected, a mask must be when calling the transform. Can be one of 'all', 'mid', 'min', 'mask'. + use_cg (bool, optional): Use Conjugate Gradient method for solving the linear system. Defaults to False. + cg_tol (float, optional): Tolerance for the Conjugate Gradient method. Defaults to 1e-6. + Will be used only if `use_cg` is True. + cg_maxiter (int, optional): Maximum number of iterations for the Conjugate Gradient method. Defaults to 200. + Will be used only if `use_cg` is True. """ - def __init__(self, alpha: float = 2.0, beta: float = 90.0, gamma: float = 0.05, mode="B", sink_mode="all") -> None: + def __init__( + self, + alpha: float = 2.0, + beta: float = 90.0, + gamma: float = 0.05, + mode="B", + sink_mode="all", + use_cg=False, + cg_tol: float = 1.0e-6, + cg_maxiter: int = 200, + ): self.alpha = alpha self.beta = beta self.gamma = gamma self.mode = mode self.sink_mode = sink_mode + self.use_cg = use_cg + self.cg_tol = cg_tol + self.cg_maxiter = cg_maxiter if self.mode not in ["B", "RF"]: raise ValueError(f"Unknown mode: {self.mode}. Supported modes are 'B' and 'RF'.") @@ -2654,7 +2834,9 @@ def __init__(self, alpha: float = 2.0, beta: float = 90.0, gamma: float = 0.05, f"Unknown sink mode: {self.sink_mode}. Supported modes are 'all', 'mid', 'min' and 'mask'." ) - self._compute_conf_map = UltrasoundConfidenceMap(self.alpha, self.beta, self.gamma, self.mode, self.sink_mode) + self._compute_conf_map = UltrasoundConfidenceMap( + self.alpha, self.beta, self.gamma, self.mode, self.sink_mode, self.use_cg, self.cg_tol, self.cg_maxiter + ) def __call__(self, img: NdarrayOrTensor, mask: NdarrayOrTensor | None = None) -> NdarrayOrTensor: """Compute confidence map from an ultrasound image. diff --git a/monai/transforms/intensity/dictionary.py b/monai/transforms/intensity/dictionary.py index 058ef87b95..5dbac485fe 100644 --- a/monai/transforms/intensity/dictionary.py +++ b/monai/transforms/intensity/dictionary.py @@ -26,6 +26,7 @@ from monai.data.meta_obj import get_track_meta from monai.transforms.intensity.array import ( AdjustContrast, + ClipIntensityPercentiles, ComputeHoVerMaps, ForegroundMask, GaussianSharpen, @@ -77,6 +78,7 @@ "NormalizeIntensityd", "ThresholdIntensityd", "ScaleIntensityRanged", + "ClipIntensityPercentilesd", "AdjustContrastd", "RandAdjustContrastd", "ScaleIntensityRangePercentilesd", @@ -122,6 +124,8 @@ "ThresholdIntensityDict", "ScaleIntensityRangeD", "ScaleIntensityRangeDict", + "ClipIntensityPercentilesD", + "ClipIntensityPercentilesDict", "AdjustContrastD", "AdjustContrastDict", "RandAdjustContrastD", @@ -172,7 +176,7 @@ class RandGaussianNoised(RandomizableTransform, MapTransform): """ Dictionary-based version :py:class:`monai.transforms.RandGaussianNoise`. - Add Gaussian noise to image. This transform assumes all the expected fields have same shape, if want to add + Add Gaussian noise to image. This transform assumes all the expected fields have same shape, if you want to add different noise for every field, please use this transform separately. Args: @@ -183,6 +187,7 @@ class RandGaussianNoised(RandomizableTransform, MapTransform): std: Standard deviation (spread) of distribution. dtype: output data type, if None, same as input image. defaults to float32. allow_missing_keys: don't raise exception if key is missing. + sample_std: If True, sample the spread of the Gaussian distribution uniformly from 0 to std. """ backend = RandGaussianNoise.backend @@ -195,10 +200,11 @@ def __init__( std: float = 0.1, dtype: DtypeLike = np.float32, allow_missing_keys: bool = False, + sample_std: bool = True, ) -> None: MapTransform.__init__(self, keys, allow_missing_keys) RandomizableTransform.__init__(self, prob) - self.rand_gaussian_noise = RandGaussianNoise(mean=mean, std=std, prob=1.0, dtype=dtype) + self.rand_gaussian_noise = RandGaussianNoise(mean=mean, std=std, prob=1.0, dtype=dtype, sample_std=sample_std) def set_random_state( self, seed: int | None = None, state: np.random.RandomState | None = None @@ -884,6 +890,36 @@ def __call__(self, data: Mapping[Hashable, NdarrayOrTensor]) -> dict[Hashable, N return d +class ClipIntensityPercentilesd(MapTransform): + """ + Dictionary-based wrapper of :py:class:`monai.transforms.ClipIntensityPercentiles`. + Clip the intensity values of input image to a specific range based on the intensity distribution of the input. + If `sharpness_factor` is provided, the intensity values will be soft clipped according to + f(x) = x + (1/sharpness_factor) * softplus(- c(x - minv)) - (1/sharpness_factor)*softplus(c(x - maxv)) + """ + + def __init__( + self, + keys: KeysCollection, + lower: float | None, + upper: float | None, + sharpness_factor: float | None = None, + channel_wise: bool = False, + dtype: DtypeLike = np.float32, + allow_missing_keys: bool = False, + ) -> None: + super().__init__(keys, allow_missing_keys) + self.scaler = ClipIntensityPercentiles( + lower=lower, upper=upper, sharpness_factor=sharpness_factor, channel_wise=channel_wise, dtype=dtype + ) + + def __call__(self, data: dict) -> dict: + d = dict(data) + for key in self.key_iterator(d): + d[key] = self.scaler(d[key]) + return d + + class AdjustContrastd(MapTransform): """ Dictionary-based wrapper of :py:class:`monai.transforms.AdjustContrast`. @@ -1421,10 +1457,11 @@ class RandGibbsNoised(RandomizableTransform, MapTransform): keys: 'image', 'label', or ['image', 'label'] depending on which data you need to transform. prob (float): probability of applying the transform. - alpha (float, List[float]): Parametrizes the intensity of the Gibbs noise filter applied. Takes + alpha (float, Sequence[float]): Parametrizes the intensity of the Gibbs noise filter applied. Takes values in the interval [0,1] with alpha = 0 acting as the identity mapping. If a length-2 list is given as [a,b] then the value of alpha will be sampled uniformly from the interval [a,b]. + If a float is given, then the value of alpha will be sampled uniformly from the interval [0, alpha]. allow_missing_keys: do not raise exception if key is missing. """ @@ -1434,7 +1471,7 @@ def __init__( self, keys: KeysCollection, prob: float = 0.1, - alpha: Sequence[float] = (0.0, 1.0), + alpha: float | Sequence[float] = (0.0, 1.0), allow_missing_keys: bool = False, ) -> None: MapTransform.__init__(self, keys, allow_missing_keys) @@ -1926,6 +1963,7 @@ def __call__(self, data: Mapping[Hashable, NdarrayOrTensor]) -> dict[Hashable, N NormalizeIntensityD = NormalizeIntensityDict = NormalizeIntensityd ThresholdIntensityD = ThresholdIntensityDict = ThresholdIntensityd ScaleIntensityRangeD = ScaleIntensityRangeDict = ScaleIntensityRanged +ClipIntensityPercentilesD = ClipIntensityPercentilesDict = ClipIntensityPercentilesd AdjustContrastD = AdjustContrastDict = AdjustContrastd RandAdjustContrastD = RandAdjustContrastDict = RandAdjustContrastd ScaleIntensityRangePercentilesD = ScaleIntensityRangePercentilesDict = ScaleIntensityRangePercentilesd diff --git a/monai/transforms/io/array.py b/monai/transforms/io/array.py index c9a79e60a6..5463ef42d4 100644 --- a/monai/transforms/io/array.py +++ b/monai/transforms/io/array.py @@ -309,11 +309,11 @@ class SaveImage(Transform): Args: output_dir: output image directory. - Handled by ``folder_layout`` instead, if ``folder_layout`` is not ``None``. + Handled by ``folder_layout`` instead, if ``folder_layout`` is not ``None``. output_postfix: a string appended to all output file names, default to `trans`. - Handled by ``folder_layout`` instead, if ``folder_layout`` is not ``None``. + Handled by ``folder_layout`` instead, if ``folder_layout`` is not ``None``. output_ext: output file extension name. - Handled by ``folder_layout`` instead, if ``folder_layout`` is not ``None``. + Handled by ``folder_layout`` instead, if ``folder_layout`` is not ``None``. output_dtype: data type (if not None) for saving data. Defaults to ``np.float32``. resample: whether to resample image (if needed) before saving the data array, based on the ``"spatial_shape"`` (and ``"original_affine"``) from metadata. diff --git a/monai/transforms/regularization/__init__.py b/monai/transforms/regularization/__init__.py new file mode 100644 index 0000000000..1e97f89407 --- /dev/null +++ b/monai/transforms/regularization/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/monai/transforms/regularization/array.py b/monai/transforms/regularization/array.py new file mode 100644 index 0000000000..4bf6cff649 --- /dev/null +++ b/monai/transforms/regularization/array.py @@ -0,0 +1,196 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from abc import abstractmethod +from math import ceil, sqrt + +import torch + +from monai.data.meta_obj import get_track_meta +from monai.utils.type_conversion import convert_to_dst_type, convert_to_tensor + +from ..transform import RandomizableTransform + +__all__ = ["MixUp", "CutMix", "CutOut", "Mixer"] + + +class Mixer(RandomizableTransform): + + def __init__(self, batch_size: int, alpha: float = 1.0) -> None: + """ + Mixer is a base class providing the basic logic for the mixup-class of + augmentations. In all cases, we need to sample the mixing weights for each + sample (lambda in the notation used in the papers). Also, pairs of samples + being mixed are picked by randomly shuffling the batch samples. + + Args: + batch_size (int): number of samples per batch. That is, samples are expected tp + be of size batchsize x channels [x depth] x height x width. + alpha (float, optional): mixing weights are sampled from the Beta(alpha, alpha) + distribution. Defaults to 1.0, the uniform distribution. + """ + super().__init__() + if alpha <= 0: + raise ValueError(f"Expected positive number, but got {alpha = }") + self.alpha = alpha + self.batch_size = batch_size + + @abstractmethod + def apply(self, data: torch.Tensor): + raise NotImplementedError() + + def randomize(self, data=None) -> None: + """ + Sometimes you need may to apply the same transform to different tensors. + The idea is to get a sample and then apply it with apply() as often + as needed. You need to call this method everytime you apply the transform to a new + batch. + """ + super().randomize(None) + self._params = ( + torch.from_numpy(self.R.beta(self.alpha, self.alpha, self.batch_size)).type(torch.float32), + self.R.permutation(self.batch_size), + [torch.from_numpy(self.R.randint(0, d, size=(1,))) for d in data.shape[2:]] if data is not None else [], + ) + + +class MixUp(Mixer): + """MixUp as described in: + Hongyi Zhang, Moustapha Cisse, Yann N. Dauphin, David Lopez-Paz. + mixup: Beyond Empirical Risk Minimization, ICLR 2018 + + Class derived from :py:class:`monai.transforms.Mixer`. See corresponding + documentation for details on the constructor parameters. + """ + + def apply(self, data: torch.Tensor): + weight, perm, _ = self._params + nsamples, *dims = data.shape + if len(weight) != nsamples: + raise ValueError(f"Expected batch of size: {len(weight)}, but got {nsamples}") + + if len(dims) not in [3, 4]: + raise ValueError("Unexpected number of dimensions") + + mixweight = weight[(Ellipsis,) + (None,) * len(dims)] + return mixweight * data + (1 - mixweight) * data[perm, ...] + + def __call__(self, data: torch.Tensor, labels: torch.Tensor | None = None, randomize=True): + data_t = convert_to_tensor(data, track_meta=get_track_meta()) + labels_t = data_t # will not stay this value, needed to satisfy pylint/mypy + if labels is not None: + labels_t = convert_to_tensor(labels, track_meta=get_track_meta()) + if randomize: + self.randomize() + if labels is None: + return convert_to_dst_type(self.apply(data_t), dst=data)[0] + + return ( + convert_to_dst_type(self.apply(data_t), dst=data)[0], + convert_to_dst_type(self.apply(labels_t), dst=labels)[0], + ) + + +class CutMix(Mixer): + """CutMix augmentation as described in: + Sangdoo Yun, Dongyoon Han, Seong Joon Oh, Sanghyuk Chun, Junsuk Choe, Youngjoon Yoo. + CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features, + ICCV 2019 + + Class derived from :py:class:`monai.transforms.Mixer`. See corresponding + documentation for details on the constructor parameters. Here, alpha not only determines + the mixing weight but also the size of the random rectangles used during for mixing. + Please refer to the paper for details. + + The most common use case is something close to: + + .. code-block:: python + + cm = CutMix(batch_size=8, alpha=0.5) + for batch in loader: + images, labels = batch + augimg, auglabels = cm(images, labels) + output = model(augimg) + loss = loss_function(output, auglabels) + ... + + """ + + def apply(self, data: torch.Tensor): + weights, perm, coords = self._params + nsamples, _, *dims = data.shape + if len(weights) != nsamples: + raise ValueError(f"Expected batch of size: {len(weights)}, but got {nsamples}") + + mask = torch.ones_like(data) + for s, weight in enumerate(weights): + lengths = [d * sqrt(1 - weight) for d in dims] + idx = [slice(None)] + [slice(c, min(ceil(c + ln), d)) for c, ln, d in zip(coords, lengths, dims)] + mask[s][idx] = 0 + + return mask * data + (1 - mask) * data[perm, ...] + + def apply_on_labels(self, labels: torch.Tensor): + weights, perm, _ = self._params + nsamples, *dims = labels.shape + if len(weights) != nsamples: + raise ValueError(f"Expected batch of size: {len(weights)}, but got {nsamples}") + + mixweight = weights[(Ellipsis,) + (None,) * len(dims)] + return mixweight * labels + (1 - mixweight) * labels[perm, ...] + + def __call__(self, data: torch.Tensor, labels: torch.Tensor | None = None, randomize=True): + data_t = convert_to_tensor(data, track_meta=get_track_meta()) + augmented_label = None + if labels is not None: + labels_t = convert_to_tensor(labels, track_meta=get_track_meta()) + if randomize: + self.randomize(data) + augmented = convert_to_dst_type(self.apply(data_t), dst=data)[0] + + if labels is not None: + augmented_label = convert_to_dst_type(self.apply(labels_t), dst=labels)[0] + return (augmented, augmented_label) if labels is not None else augmented + + +class CutOut(Mixer): + """Cutout as described in the paper: + Terrance DeVries, Graham W. Taylor. + Improved Regularization of Convolutional Neural Networks with Cutout, + arXiv:1708.04552 + + Class derived from :py:class:`monai.transforms.Mixer`. See corresponding + documentation for details on the constructor parameters. Here, alpha not only determines + the mixing weight but also the size of the random rectangles being cut put. + Please refer to the paper for details. + """ + + def apply(self, data: torch.Tensor): + weights, _, coords = self._params + nsamples, _, *dims = data.shape + if len(weights) != nsamples: + raise ValueError(f"Expected batch of size: {len(weights)}, but got {nsamples}") + + mask = torch.ones_like(data) + for s, weight in enumerate(weights): + lengths = [d * sqrt(1 - weight) for d in dims] + idx = [slice(None)] + [slice(c, min(ceil(c + ln), d)) for c, ln, d in zip(coords, lengths, dims)] + mask[s][idx] = 0 + + return mask * data + + def __call__(self, data: torch.Tensor, randomize=True): + data_t = convert_to_tensor(data, track_meta=get_track_meta()) + if randomize: + self.randomize(data) + return convert_to_dst_type(self.apply(data_t), dst=data)[0] diff --git a/monai/transforms/regularization/dictionary.py b/monai/transforms/regularization/dictionary.py new file mode 100644 index 0000000000..d8815e47b9 --- /dev/null +++ b/monai/transforms/regularization/dictionary.py @@ -0,0 +1,129 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from collections.abc import Hashable + +import numpy as np + +from monai.config import KeysCollection +from monai.config.type_definitions import NdarrayOrTensor +from monai.data.meta_obj import get_track_meta +from monai.utils import convert_to_tensor +from monai.utils.misc import ensure_tuple + +from ..transform import MapTransform, RandomizableTransform +from .array import CutMix, CutOut, MixUp + +__all__ = ["MixUpd", "MixUpD", "MixUpDict", "CutMixd", "CutMixD", "CutMixDict", "CutOutd", "CutOutD", "CutOutDict"] + + +class MixUpd(MapTransform, RandomizableTransform): + """ + Dictionary-based version :py:class:`monai.transforms.MixUp`. + + Notice that the mixup transformation will be the same for all entries + for consistency, i.e. images and labels must be applied the same augmenation. + """ + + def __init__( + self, keys: KeysCollection, batch_size: int, alpha: float = 1.0, allow_missing_keys: bool = False + ) -> None: + MapTransform.__init__(self, keys, allow_missing_keys) + self.mixup = MixUp(batch_size, alpha) + + def set_random_state(self, seed: int | None = None, state: np.random.RandomState | None = None) -> MixUpd: + super().set_random_state(seed, state) + self.mixup.set_random_state(seed, state) + return self + + def __call__(self, data): + d = dict(data) + # all the keys share the same random state + self.mixup.randomize(None) + for k in self.key_iterator(d): + d[k] = self.mixup(data[k], randomize=False) + return d + + +class CutMixd(MapTransform, RandomizableTransform): + """ + Dictionary-based version :py:class:`monai.transforms.CutMix`. + + Notice that the mixture weights will be the same for all entries + for consistency, i.e. images and labels must be aggregated with the same weights, + but the random crops are not. + """ + + def __init__( + self, + keys: KeysCollection, + batch_size: int, + label_keys: KeysCollection | None = None, + alpha: float = 1.0, + allow_missing_keys: bool = False, + ) -> None: + super().__init__(keys, allow_missing_keys) + self.mixer = CutMix(batch_size, alpha) + self.label_keys = ensure_tuple(label_keys) if label_keys is not None else [] + + def set_random_state(self, seed: int | None = None, state: np.random.RandomState | None = None) -> CutMixd: + super().set_random_state(seed, state) + self.mixer.set_random_state(seed, state) + return self + + def __call__(self, data): + d = dict(data) + first_key: Hashable = self.first_key(d) + if first_key == (): + out: dict[Hashable, NdarrayOrTensor] = convert_to_tensor(d, track_meta=get_track_meta()) + return out + self.mixer.randomize(d[first_key]) + for key, label_key in self.key_iterator(d, self.label_keys): + ret = self.mixer(data[key], data.get(label_key, None), randomize=False) + d[key] = ret[0] + if label_key in d: + d[label_key] = ret[1] + return d + + +class CutOutd(MapTransform, RandomizableTransform): + """ + Dictionary-based version :py:class:`monai.transforms.CutOut`. + + Notice that the cutout is different for every entry in the dictionary. + """ + + def __init__(self, keys: KeysCollection, batch_size: int, allow_missing_keys: bool = False) -> None: + super().__init__(keys, allow_missing_keys) + self.cutout = CutOut(batch_size) + + def set_random_state(self, seed: int | None = None, state: np.random.RandomState | None = None) -> CutOutd: + super().set_random_state(seed, state) + self.cutout.set_random_state(seed, state) + return self + + def __call__(self, data): + d = dict(data) + first_key: Hashable = self.first_key(d) + if first_key == (): + out: dict[Hashable, NdarrayOrTensor] = convert_to_tensor(d, track_meta=get_track_meta()) + return out + self.cutout.randomize(d[first_key]) + for k in self.key_iterator(d): + d[k] = self.cutout(data[k], randomize=False) + return d + + +MixUpD = MixUpDict = MixUpd +CutMixD = CutMixDict = CutMixd +CutOutD = CutOutDict = CutOutd diff --git a/monai/transforms/signal/array.py b/monai/transforms/signal/array.py index 938f42192c..97df04f233 100644 --- a/monai/transforms/signal/array.py +++ b/monai/transforms/signal/array.py @@ -28,7 +28,7 @@ from monai.utils.enums import TransformBackends from monai.utils.type_conversion import convert_data_type, convert_to_tensor -shift, has_shift = optional_import("scipy.ndimage.interpolation", name="shift") +shift, has_shift = optional_import("scipy.ndimage", name="shift") iirnotch, has_iirnotch = optional_import("scipy.signal", name="iirnotch") with warnings.catch_warnings(): warnings.simplefilter("ignore", UserWarning) # project-monai/monai#5204 diff --git a/monai/transforms/spatial/array.py b/monai/transforms/spatial/array.py index 094afdd3c4..3739a83e71 100644 --- a/monai/transforms/spatial/array.py +++ b/monai/transforms/spatial/array.py @@ -3441,7 +3441,7 @@ def filter_count(self, image_np: NdarrayOrTensor, locations: np.ndarray) -> tupl idx = self.R.permutation(image_np.shape[0]) idx = idx[: self.num_patches] idx_np = convert_data_type(idx, np.ndarray)[0] - image_np = image_np[idx] + image_np = image_np[idx] # type: ignore[index] locations = locations[idx_np] return image_np, locations elif self.sort_fn not in (None, GridPatchSort.MIN, GridPatchSort.MAX): diff --git a/monai/transforms/utils.py b/monai/transforms/utils.py index e282ecff24..d8461d927b 100644 --- a/monai/transforms/utils.py +++ b/monai/transforms/utils.py @@ -38,6 +38,7 @@ nonzero, ravel, searchsorted, + softplus, unique, unravel_index, where, @@ -107,6 +108,7 @@ "in_bounds", "is_empty", "is_positive", + "map_and_generate_sampling_centers", "map_binary_to_indices", "map_classes_to_indices", "map_spatial_axes", @@ -131,9 +133,45 @@ "resolves_modes", "has_status_keys", "distance_transform_edt", + "soft_clip", ] +def soft_clip( + arr: NdarrayOrTensor, + sharpness_factor: float = 1.0, + minv: NdarrayOrTensor | float | int | None = None, + maxv: NdarrayOrTensor | float | int | None = None, + dtype: DtypeLike | torch.dtype = np.float32, +) -> NdarrayOrTensor: + """ + Apply soft clip to the input array or tensor. + The intensity values will be soft clipped according to + f(x) = x + (1/sharpness_factor)*softplus(- c(x - minv)) - (1/sharpness_factor)*softplus(c(x - maxv)) + From https://medium.com/life-at-hopper/clip-it-clip-it-good-1f1bf711b291 + + To perform one-sided clipping, set either minv or maxv to None. + Args: + arr: input array to clip. + sharpness_factor: the sharpness of the soft clip function, default to 1. + minv: minimum value of target clipped array. + maxv: maximum value of target clipped array. + dtype: if not None, convert input array to dtype before computation. + + """ + + if dtype is not None: + arr, *_ = convert_data_type(arr, dtype=dtype) + + v = arr + if minv is not None: + v = v + softplus(-sharpness_factor * (arr - minv)) / sharpness_factor + if maxv is not None: + v = v - softplus(sharpness_factor * (arr - maxv)) / sharpness_factor + + return v + + def rand_choice(prob: float = 0.5) -> bool: """ Returns True if a randomly chosen number is less than or equal to `prob`, by default this is a 50/50 chance. @@ -331,6 +369,70 @@ def check_non_lazy_pending_ops( warnings.warn(msg) +def map_and_generate_sampling_centers( + label: NdarrayOrTensor, + spatial_size: Sequence[int] | int, + num_samples: int, + label_spatial_shape: Sequence[int] | None = None, + num_classes: int | None = None, + image: NdarrayOrTensor | None = None, + image_threshold: float = 0.0, + max_samples_per_class: int | None = None, + ratios: list[float | int] | None = None, + rand_state: np.random.RandomState | None = None, + allow_smaller: bool = False, + warn: bool = True, +) -> tuple[tuple]: + """ + Combine "map_classes_to_indices" and "generate_label_classes_crop_centers" functions, return crop center coordinates. + This calls `map_classes_to_indices` to get indices from `label`, gets the shape from `label_spatial_shape` + is given otherwise from the labels, calls `generate_label_classes_crop_centers`, and returns its results. + + Args: + label: use the label data to get the indices of every class. + spatial_size: spatial size of the ROIs to be sampled. + num_samples: total sample centers to be generated. + label_spatial_shape: spatial shape of the original label data to unravel selected centers. + indices: sequence of pre-computed foreground indices of every class in 1 dimension. + num_classes: number of classes for argmax label, not necessary for One-Hot label. + image: if image is not None, only return the indices of every class that are within the valid + region of the image (``image > image_threshold``). + image_threshold: if enabled `image`, use ``image > image_threshold`` to + determine the valid image content area and select class indices only in this area. + max_samples_per_class: maximum length of indices in each class to reduce memory consumption. + Default is None, no subsampling. + ratios: ratios of every class in the label to generate crop centers, including background class. + if None, every class will have the same ratio to generate crop centers. + rand_state: numpy randomState object to align with other modules. + allow_smaller: if `False`, an exception will be raised if the image is smaller than + the requested ROI in any dimension. If `True`, any smaller dimensions will be set to + match the cropped size (i.e., no cropping in that dimension). + warn: if `True` prints a warning if a class is not present in the label. + Returns: + Tuple of crop centres + """ + if label is None: + raise ValueError("label must not be None.") + indices = map_classes_to_indices(label, num_classes, image, image_threshold, max_samples_per_class) + + if label_spatial_shape is not None: + _shape = label_spatial_shape + elif isinstance(label, monai.data.MetaTensor): + _shape = label.peek_pending_shape() + else: + _shape = label.shape[1:] + + if _shape is None: + raise ValueError( + "label_spatial_shape or label with a known shape must be provided to infer the output spatial shape." + ) + centers = generate_label_classes_crop_centers( + spatial_size, num_samples, _shape, indices, ratios, rand_state, allow_smaller, warn + ) + + return ensure_tuple(centers) + + def map_binary_to_indices( label: NdarrayOrTensor, image: NdarrayOrTensor | None = None, image_threshold: float = 0.0 ) -> tuple[NdarrayOrTensor, NdarrayOrTensor]: @@ -625,9 +727,12 @@ def generate_label_classes_crop_centers( for i, array in enumerate(indices): if len(array) == 0: - ratios_[i] = 0 - if warn: - warnings.warn(f"no available indices of class {i} to crop, set the crop ratio of this class to zero.") + if ratios_[i] != 0: + ratios_[i] = 0 + if warn: + warnings.warn( + f"no available indices of class {i} to crop, setting the crop ratio of this class to zero." + ) centers = [] classes = rand_state.choice(len(ratios_), size=num_samples, p=np.asarray(ratios_) / np.sum(ratios_)) @@ -2150,7 +2255,7 @@ def distance_transform_edt( if return_distances: dtype = torch.float64 if float64_distances else torch.float32 if distances is None: - distances = torch.zeros_like(img, dtype=dtype) # type: ignore + distances = torch.zeros_like(img, memory_format=torch.contiguous_format, dtype=dtype) # type: ignore else: if not isinstance(distances, torch.Tensor) and distances.device != img.device: raise TypeError("distances must be a torch.Tensor on the same device as img") diff --git a/monai/transforms/utils_create_transform_ims.py b/monai/transforms/utils_create_transform_ims.py index 4b5990abd3..a29fd4dbf9 100644 --- a/monai/transforms/utils_create_transform_ims.py +++ b/monai/transforms/utils_create_transform_ims.py @@ -269,11 +269,9 @@ def update_docstring(code_path, transform_name): def pre_process_data(data, ndim, is_map, is_post): - """If transform requires 2D data, then convert to 2D""" + """If transform requires 2D data, then convert to 2D by selecting the middle of the last dimension.""" if ndim == 2: - for k in keys: - data[k] = data[k][..., data[k].shape[-1] // 2] - + data = {k: v[..., v.shape[-1] // 2] for k, v in data.items()} if is_map: return data return data[CommonKeys.LABEL] if is_post else data[CommonKeys.IMAGE] diff --git a/monai/transforms/utils_pytorch_numpy_unification.py b/monai/transforms/utils_pytorch_numpy_unification.py index 0774d50314..020d99af16 100644 --- a/monai/transforms/utils_pytorch_numpy_unification.py +++ b/monai/transforms/utils_pytorch_numpy_unification.py @@ -52,9 +52,24 @@ "median", "mean", "std", + "softplus", ] +def softplus(x: NdarrayOrTensor) -> NdarrayOrTensor: + """stable softplus through `np.logaddexp` with equivalent implementation for torch. + + Args: + x: array/tensor. + + Returns: + Softplus of the input. + """ + if isinstance(x, np.ndarray): + return np.logaddexp(np.zeros_like(x), x) + return torch.logaddexp(torch.zeros_like(x), x) + + def allclose(a: NdarrayTensor, b: NdarrayOrTensor, rtol=1e-5, atol=1e-8, equal_nan=False) -> bool: """`np.allclose` with equivalent implementation for torch.""" b, *_ = convert_to_dst_type(b, a, wrap_sequence=True) diff --git a/monai/utils/__init__.py b/monai/utils/__init__.py index 2c32eb2cf4..03fa1ceed1 100644 --- a/monai/utils/__init__.py +++ b/monai/utils/__init__.py @@ -126,6 +126,7 @@ version_leq, ) from .nvtx import Range +from .ordering import Ordering from .profiling import ( PerfContext, ProfileHandler, diff --git a/monai/utils/misc.py b/monai/utils/misc.py index caa7c067df..40370ca2c6 100644 --- a/monai/utils/misc.py +++ b/monai/utils/misc.py @@ -24,7 +24,6 @@ import warnings from ast import literal_eval from collections.abc import Callable, Iterable, Sequence -from distutils.util import strtobool from math import log10 from pathlib import Path from typing import TYPE_CHECKING, Any, TypeVar, cast, overload @@ -78,6 +77,25 @@ "run_cmd", ] + +def _strtobool(val: str) -> bool: + """ + Replaces deprecated (pre python 3.12) + distutils strtobool function. + + True values are y, yes, t, true, on and 1; + False values are n, no, f, false, off and 0. + Raises ValueError if val is anything else. + """ + val = val.lower() + if val in ("y", "yes", "t", "true", "on", "1"): + return True + elif val in ("n", "no", "f", "false", "off", "0"): + return False + else: + raise ValueError(f"invalid truth value {val}") + + _seed = None _flag_deterministic = torch.backends.cudnn.deterministic _flag_cudnn_benchmark = torch.backends.cudnn.benchmark @@ -100,6 +118,7 @@ def star_zip_with(op, *vals): T = TypeVar("T") +NT = TypeVar("NT", np.ndarray, torch.Tensor) @overload @@ -400,7 +419,7 @@ def _parse_var(s): d[key] = literal_eval(value) except ValueError: try: - d[key] = bool(strtobool(str(value))) + d[key] = bool(_strtobool(str(value))) except ValueError: d[key] = value return d @@ -527,7 +546,7 @@ def doc_images() -> str | None: @staticmethod def algo_hash() -> str | None: - return os.environ.get("MONAI_ALGO_HASH", "249bf4b") + return os.environ.get("MONAI_ALGO_HASH", "e4cf5a1") @staticmethod def trace_transform() -> str | None: @@ -796,7 +815,7 @@ def __init__(self, input_unit: str, target_unit: str) -> None: "Both input and target units should be from the same quantity. " f"Input quantity is {input_base} while target quantity is {target_base}" ) - self._calculate_conversion_factor() + self.conversion_factor = self._calculate_conversion_factor() def _get_valid_unit_and_base(self, unit): unit = str(unit).lower() @@ -823,7 +842,7 @@ def _calculate_conversion_factor(self): return 1.0 input_power = self._get_unit_power(self.input_unit) target_power = self._get_unit_power(self.target_unit) - self.conversion_factor = 10 ** (input_power - target_power) + return 10 ** (input_power - target_power) def __call__(self, value: int | float) -> Any: return float(value) * self.conversion_factor @@ -889,11 +908,11 @@ def is_sqrt(num: Sequence[int] | int) -> bool: return ensure_tuple(ret) == num -def unsqueeze_right(arr: NdarrayOrTensor, ndim: int) -> NdarrayOrTensor: +def unsqueeze_right(arr: NT, ndim: int) -> NT: """Append 1-sized dimensions to `arr` to create a result with `ndim` dimensions.""" return arr[(...,) + (None,) * (ndim - arr.ndim)] -def unsqueeze_left(arr: NdarrayOrTensor, ndim: int) -> NdarrayOrTensor: +def unsqueeze_left(arr: NT, ndim: int) -> NT: """Prepend 1-sized dimensions to `arr` to create a result with `ndim` dimensions.""" return arr[(None,) * (ndim - arr.ndim)] diff --git a/monai/utils/module.py b/monai/utils/module.py index 5e058c105b..4d28f8d986 100644 --- a/monai/utils/module.py +++ b/monai/utils/module.py @@ -13,6 +13,7 @@ import enum import functools +import importlib.util import os import pdb import re @@ -208,9 +209,11 @@ def load_submodules( ): if (is_pkg or load_all) and name not in sys.modules and match(exclude_pattern, name) is None: try: - mod = import_module(name) - importer.find_spec(name).loader.load_module(name) # type: ignore - submodules.append(mod) + mod_spec = importer.find_spec(name) # type: ignore + if mod_spec and mod_spec.loader: + mod = importlib.util.module_from_spec(mod_spec) + mod_spec.loader.exec_module(mod) + submodules.append(mod) except OptionalImportError: pass # could not import the optional deps., they are ignored except ImportError as e: @@ -272,7 +275,7 @@ def instantiate(__path: str, __mode: str, **kwargs: Any) -> Any: return pdb.runcall(component, **kwargs) except Exception as e: raise RuntimeError( - f"Failed to instantiate component '{__path}' with kwargs: {kwargs}" + f"Failed to instantiate component '{__path}' with keywords: {','.join(kwargs.keys())}" f"\n set '_mode_={CompInitMode.DEBUG}' to enter the debugging mode." ) from e diff --git a/monai/utils/ordering.py b/monai/utils/ordering.py new file mode 100644 index 0000000000..1be61f98ab --- /dev/null +++ b/monai/utils/ordering.py @@ -0,0 +1,207 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import numpy as np + +from monai.utils.enums import OrderingTransformations, OrderingType + + +class Ordering: + """ + Ordering class that projects a 2D or 3D image into a 1D sequence. It also allows the image to be transformed with + one of the following transformations: + Reflection (see np.flip for more details). + Transposition (see np.transpose for more details). + 90-degree rotation (see np.rot90 for more details). + + The transformations are applied in the order specified by the transformation_order parameter. + + Args: + ordering_type: The ordering type. One of the following: + - 'raster_scan': The image is projected into a 1D sequence by scanning the image from left to right and from + top to bottom. Also called a row major ordering. + - 's_curve': The image is projected into a 1D sequence by scanning the image in a circular snake like + pattern from top left towards right gowing in a spiral towards the center. + - random': The image is projected into a 1D sequence by randomly shuffling the image. + spatial_dims: The number of spatial dimensions of the image. + dimensions: The dimensions of the image. + reflected_spatial_dims: A tuple of booleans indicating whether to reflect the image along each spatial dimension. + transpositions_axes: A tuple of tuples indicating the axes to transpose the image along. + rot90_axes: A tuple of tuples indicating the axes to rotate the image along. + transformation_order: The order in which to apply the transformations. + """ + + def __init__( + self, + ordering_type: str, + spatial_dims: int, + dimensions: tuple[int, int, int] | tuple[int, int, int, int], + reflected_spatial_dims: tuple[bool, bool] | None = None, + transpositions_axes: tuple[tuple[int, int], ...] | tuple[tuple[int, int, int], ...] | None = None, + rot90_axes: tuple[tuple[int, int], ...] | None = None, + transformation_order: tuple[str, ...] = ( + OrderingTransformations.TRANSPOSE.value, + OrderingTransformations.ROTATE_90.value, + OrderingTransformations.REFLECT.value, + ), + ) -> None: + super().__init__() + self.ordering_type = ordering_type + + if self.ordering_type not in list(OrderingType): + raise ValueError( + f"ordering_type must be one of the following {list(OrderingType)}, but got {self.ordering_type}." + ) + + self.spatial_dims = spatial_dims + self.dimensions = dimensions + + if len(dimensions) != self.spatial_dims + 1: + raise ValueError(f"dimensions must be of length {self.spatial_dims + 1}, but got {len(dimensions)}.") + + self.reflected_spatial_dims = reflected_spatial_dims + self.transpositions_axes = transpositions_axes + self.rot90_axes = rot90_axes + if len(set(transformation_order)) != len(transformation_order): + raise ValueError(f"No duplicates are allowed. Received {transformation_order}.") + + for transformation in transformation_order: + if transformation not in list(OrderingTransformations): + raise ValueError( + f"Valid transformations are {list(OrderingTransformations)} but received {transformation}." + ) + self.transformation_order = transformation_order + + self.template = self._create_template() + self._sequence_ordering = self._create_ordering() + self._revert_sequence_ordering = np.argsort(self._sequence_ordering) + + def __call__(self, x: np.ndarray) -> np.ndarray: + x = x[self._sequence_ordering] + + return x + + def get_sequence_ordering(self) -> np.ndarray: + return self._sequence_ordering + + def get_revert_sequence_ordering(self) -> np.ndarray: + return self._revert_sequence_ordering + + def _create_ordering(self) -> np.ndarray: + self.template = self._transform_template() + order = self._order_template(template=self.template) + + return order + + def _create_template(self) -> np.ndarray: + spatial_dimensions = self.dimensions[1:] + template = np.arange(np.prod(spatial_dimensions)).reshape(*spatial_dimensions) + + return template + + def _transform_template(self) -> np.ndarray: + for transformation in self.transformation_order: + if transformation == OrderingTransformations.TRANSPOSE.value: + self.template = self._transpose_template(template=self.template) + elif transformation == OrderingTransformations.ROTATE_90.value: + self.template = self._rot90_template(template=self.template) + elif transformation == OrderingTransformations.REFLECT.value: + self.template = self._flip_template(template=self.template) + + return self.template + + def _transpose_template(self, template: np.ndarray) -> np.ndarray: + if self.transpositions_axes is not None: + for axes in self.transpositions_axes: + template = np.transpose(template, axes=axes) + + return template + + def _flip_template(self, template: np.ndarray) -> np.ndarray: + if self.reflected_spatial_dims is not None: + for axis, to_reflect in enumerate(self.reflected_spatial_dims): + template = np.flip(template, axis=axis) if to_reflect else template + + return template + + def _rot90_template(self, template: np.ndarray) -> np.ndarray: + if self.rot90_axes is not None: + for axes in self.rot90_axes: + template = np.rot90(template, axes=axes) + + return template + + def _order_template(self, template: np.ndarray) -> np.ndarray: + depths = None + if self.spatial_dims == 2: + rows, columns = template.shape[0], template.shape[1] + else: + rows, columns, depths = (template.shape[0], template.shape[1], template.shape[2]) + + sequence = eval(f"self.{self.ordering_type}_idx")(rows, columns, depths) + + ordering = np.array([template[tuple(e)] for e in sequence]) + + return ordering + + @staticmethod + def raster_scan_idx(rows: int, cols: int, depths: int | None = None) -> np.ndarray: + idx: list[tuple] = [] + + for r in range(rows): + for c in range(cols): + if depths is not None: + for d in range(depths): + idx.append((r, c, d)) + else: + idx.append((r, c)) + + idx_np = np.array(idx) + + return idx_np + + @staticmethod + def s_curve_idx(rows: int, cols: int, depths: int | None = None) -> np.ndarray: + idx: list[tuple] = [] + + for r in range(rows): + col_idx = range(cols) if r % 2 == 0 else range(cols - 1, -1, -1) + for c in col_idx: + if depths: + depth_idx = range(depths) if c % 2 == 0 else range(depths - 1, -1, -1) + + for d in depth_idx: + idx.append((r, c, d)) + else: + idx.append((r, c)) + + idx_np = np.array(idx) + + return idx_np + + @staticmethod + def random_idx(rows: int, cols: int, depths: int | None = None) -> np.ndarray: + idx: list[tuple] = [] + + for r in range(rows): + for c in range(cols): + if depths: + for d in range(depths): + idx.append((r, c, d)) + else: + idx.append((r, c)) + + idx_np = np.array(idx) + np.random.shuffle(idx_np) + + return idx_np diff --git a/monai/visualize/class_activation_maps.py b/monai/visualize/class_activation_maps.py index 6d1e8dfd03..489a563818 100644 --- a/monai/visualize/class_activation_maps.py +++ b/monai/visualize/class_activation_maps.py @@ -290,7 +290,7 @@ def __init__( ) self.fc_layers = fc_layers - def compute_map(self, x, class_idx=None, layer_idx=-1, **kwargs): + def compute_map(self, x, class_idx=None, layer_idx=-1, **kwargs): # type: ignore[override] logits, acti, _ = self.nn_module(x, **kwargs) acti = acti[layer_idx] if class_idx is None: @@ -302,7 +302,7 @@ def compute_map(self, x, class_idx=None, layer_idx=-1, **kwargs): output = torch.stack([output[i, b : b + 1] for i, b in enumerate(class_idx)], dim=0) return output.reshape(b, 1, *spatial) # resume the spatial dims on the selected class - def __call__(self, x, class_idx=None, layer_idx=-1, **kwargs): + def __call__(self, x, class_idx=None, layer_idx=-1, **kwargs): # type: ignore[override] """ Compute the activation map with upsampling and postprocessing. @@ -361,7 +361,7 @@ class GradCAM(CAMBase): """ - def compute_map(self, x, class_idx=None, retain_graph=False, layer_idx=-1, **kwargs): + def compute_map(self, x, class_idx=None, retain_graph=False, layer_idx=-1, **kwargs): # type: ignore[override] _, acti, grad = self.nn_module(x, class_idx=class_idx, retain_graph=retain_graph, **kwargs) acti, grad = acti[layer_idx], grad[layer_idx] b, c, *spatial = grad.shape @@ -369,7 +369,7 @@ def compute_map(self, x, class_idx=None, retain_graph=False, layer_idx=-1, **kwa acti_map = (weights * acti).sum(1, keepdim=True) return F.relu(acti_map) - def __call__(self, x, class_idx=None, layer_idx=-1, retain_graph=False, **kwargs): + def __call__(self, x, class_idx=None, layer_idx=-1, retain_graph=False, **kwargs): # type: ignore[override] """ Compute the activation map with upsampling and postprocessing. @@ -401,7 +401,7 @@ class GradCAMpp(GradCAM): """ - def compute_map(self, x, class_idx=None, retain_graph=False, layer_idx=-1, **kwargs): + def compute_map(self, x, class_idx=None, retain_graph=False, layer_idx=-1, **kwargs): # type: ignore[override] _, acti, grad = self.nn_module(x, class_idx=class_idx, retain_graph=retain_graph, **kwargs) acti, grad = acti[layer_idx], grad[layer_idx] b, c, *spatial = grad.shape diff --git a/monai/visualize/utils.py b/monai/visualize/utils.py index f6718fe7a5..88c9a0d66a 100644 --- a/monai/visualize/utils.py +++ b/monai/visualize/utils.py @@ -24,11 +24,9 @@ from monai.utils.type_conversion import convert_data_type, convert_to_dst_type if TYPE_CHECKING: - from matplotlib import cm from matplotlib import pyplot as plt else: plt, _ = optional_import("matplotlib", name="pyplot") - cm, _ = optional_import("matplotlib", name="cm") __all__ = ["matshow3d", "blend_images"] @@ -210,7 +208,7 @@ def blend_images( image = repeat(image, 3, axis=0) def get_label_rgb(cmap: str, label: NdarrayOrTensor) -> NdarrayOrTensor: - _cmap = cm.get_cmap(cmap) + _cmap = plt.colormaps.get_cmap(cmap) label_np, *_ = convert_data_type(label, np.ndarray) label_rgb_np = _cmap(label_np[0]) label_rgb_np = np.moveaxis(label_rgb_np, -1, 0)[:3] diff --git a/pyproject.toml b/pyproject.toml index cd8a510b04..53ca608d20 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,8 +38,7 @@ exclude = "monai/bundle/__main__.py" [tool.ruff] line-length = 133 -ignore-init-module-imports = true -ignore = ["F401", "E741"] +lint.ignore = ["F401", "E741"] [tool.pytype] # Space-separated list of files or directories to exclude. diff --git a/requirements-dev.txt b/requirements-dev.txt index b08fef874b..ced783443e 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -2,7 +2,7 @@ -r requirements-min.txt pytorch-ignite==0.4.11 gdown>=4.7.3 -scipy>=1.7.1 +scipy>=1.12.0; python_version >= '3.9' itk>=5.2 nibabel pillow!=8.3.0 # https://github.com/python-pillow/Pillow/issues/5571 @@ -11,7 +11,7 @@ scikit-image>=0.19.0 tqdm>=4.47.0 lmdb flake8>=3.8.1 -flake8-bugbear +flake8-bugbear<=24.2.6 # https://github.com/Project-MONAI/MONAI/issues/7690 flake8-comprehensions mccabe pep8-naming @@ -26,17 +26,17 @@ mypy>=1.5.0 ninja torchvision psutil -cucim>=23.2.0; platform_system == "Linux" +cucim-cu12; platform_system == "Linux" and python_version >= "3.9" and python_version <= "3.10" openslide-python imagecodecs; platform_system == "Linux" or platform_system == "Darwin" tifffile; platform_system == "Linux" or platform_system == "Darwin" pandas requests einops -transformers>=4.36.0 -mlflow>=1.28.0 +transformers>=4.36.0, <4.41.0; python_version <= '3.10' +mlflow>=2.12.2 clearml>=1.10.0rc0 -matplotlib!=3.5.0 +matplotlib>=3.6.3 tensorboardX types-PyYAML pyyaml @@ -46,14 +46,16 @@ pynrrd pre-commit pydicom h5py -nni; platform_system == "Linux" +nni==2.10.1; platform_system == "Linux" and "arm" not in platform_machine and "aarch" not in platform_machine optuna git+https://github.com/Project-MONAI/MetricsReloaded@monai-support#egg=MetricsReloaded onnx>=1.13.0 onnxruntime; python_version <= '3.10' typeguard<3 # https://github.com/microsoft/nni/issues/5457 -filelock!=3.12.0 # https://github.com/microsoft/nni/issues/5523 +filelock<3.12.0 # https://github.com/microsoft/nni/issues/5523 zarr lpips==0.1.4 nvidia-ml-py huggingface_hub +pyamg>=5.0.0 +git+https://github.com/Project-MONAI/GenerativeModels.git@7428fce193771e9564f29b91d29e523dd1b6b4cd diff --git a/requirements-min.txt b/requirements-min.txt index ad0bb1ef20..a091ef0568 100644 --- a/requirements-min.txt +++ b/requirements-min.txt @@ -1,5 +1,6 @@ # Requirements for minimal tests -r requirements.txt -setuptools>=50.3.0,<66.0.0,!=60.6.0 +setuptools>=50.3.0,<66.0.0,!=60.6.0 ; python_version < "3.12" +setuptools>=70.2.0; python_version >= "3.12" coverage>=5.5 parameterized diff --git a/requirements.txt b/requirements.txt index 1569646794..aae455f58c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ torch>=1.9 -numpy>=1.20 +numpy>=1.20,<=1.26.0 diff --git a/runtests.sh b/runtests.sh index 0c60bc0f58..65e3a2bb6b 100755 --- a/runtests.sh +++ b/runtests.sh @@ -167,7 +167,7 @@ function clang_format { } function is_pip_installed() { - return $("${PY_EXE}" -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader(sys.argv[1]) else 1)" $1) + return $("${PY_EXE}" -c "import sys, importlib.util; sys.exit(0 if importlib.util.find_spec(sys.argv[1]) else 1)" $1) } function clean_py { @@ -738,12 +738,14 @@ fi # network training/inference/eval integration tests if [ $doNetTests = true ] then + set +e # disable exit on failure so that diagnostics can be given on failure echo "${separator}${blue}integration${noColor}" for i in tests/*integration_*.py do echo "$i" ${cmdPrefix}${cmd} "$i" done + set -e # enable exit on failure fi # run model zoo tests diff --git a/setup.cfg b/setup.cfg index 229e2ace56..202e7b0e24 100644 --- a/setup.cfg +++ b/setup.cfg @@ -21,9 +21,9 @@ classifiers = Intended Audience :: Healthcare Industry Programming Language :: C++ Programming Language :: Python :: 3 - Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 + Programming Language :: Python :: 3.11 Topic :: Scientific/Engineering Topic :: Scientific/Engineering :: Artificial Intelligence Topic :: Scientific/Engineering :: Medical Science Apps. @@ -33,7 +33,7 @@ classifiers = Typing :: Typed [options] -python_requires = >= 3.8 +python_requires = >= 3.9 # for compiling and develop setup only # no need to specify the versions so that we could # compile for multiple targeted versions. @@ -49,7 +49,7 @@ all = nibabel ninja scikit-image>=0.14.2 - scipy>=1.7.1 + scipy>=1.12.0; python_version >= '3.9' pillow tensorboard gdown>=4.7.3 @@ -59,16 +59,16 @@ all = tqdm>=4.47.0 lmdb psutil - cucim>=23.2.0 + cucim-cu12; python_version >= '3.9' and python_version <= '3.10' openslide-python tifffile imagecodecs pandas einops - transformers<4.22; python_version <= '3.10' - mlflow>=1.28.0 + transformers>=4.36.0, <4.41.0; python_version <= '3.10' + mlflow>=2.12.2 clearml>=1.10.0rc0 - matplotlib + matplotlib>=3.6.3 tensorboardX pyyaml fire @@ -84,6 +84,7 @@ all = lpips==0.1.4 nvidia-ml-py huggingface_hub + pyamg>=5.0.0 nibabel = nibabel ninja = @@ -91,7 +92,7 @@ ninja = skimage = scikit-image>=0.14.2 scipy = - scipy>=1.7.1 + scipy>=1.12.0; python_version >= '3.9' pillow = pillow!=8.3.0 tensorboard = @@ -111,7 +112,7 @@ lmdb = psutil = psutil cucim = - cucim>=23.2.0 + cucim-cu12 openslide = openslide-python tifffile = @@ -123,11 +124,11 @@ pandas = einops = einops transformers = - transformers<4.22; python_version <= '3.10' + transformers>=4.36.0, <4.41.0; python_version <= '3.10' mlflow = - mlflow + mlflow>=2.12.2 matplotlib = - matplotlib + matplotlib>=3.6.3 clearml = clearml tensorboardX = @@ -162,6 +163,8 @@ pynvml = # MetricsReloaded @ git+https://github.com/Project-MONAI/MetricsReloaded@monai-support#egg=MetricsReloaded huggingface_hub = huggingface_hub +pyamg = + pyamg>=5.0.0 [flake8] select = B,C,E,F,N,P,T4,W,B9 diff --git a/tests/hvd_evenly_divisible_all_gather.py b/tests/hvd_evenly_divisible_all_gather.py index 78c6ca06bc..732ad13b83 100644 --- a/tests/hvd_evenly_divisible_all_gather.py +++ b/tests/hvd_evenly_divisible_all_gather.py @@ -30,10 +30,10 @@ def test_data(self): self._run() def _run(self): - if hvd.rank() == 0: - data1 = torch.tensor([[1, 2], [3, 4]]) - data2 = torch.tensor([[1.0, 2.0]]) - data3 = torch.tensor(7) + # if hvd.rank() == 0: + data1 = torch.tensor([[1, 2], [3, 4]]) + data2 = torch.tensor([[1.0, 2.0]]) + data3 = torch.tensor(7) if hvd.rank() == 1: data1 = torch.tensor([[5, 6]]) diff --git a/tests/min_tests.py b/tests/min_tests.py index 8128bb7b84..3a143df84b 100644 --- a/tests/min_tests.py +++ b/tests/min_tests.py @@ -154,6 +154,7 @@ def run_testsuit(): "test_plot_2d_or_3d_image", "test_png_rw", "test_prepare_batch_default", + "test_prepare_batch_diffusion", "test_prepare_batch_extra_input", "test_prepare_batch_hovernet", "test_rand_grid_patch", diff --git a/tests/nonconfig_workflow.py b/tests/nonconfig_workflow.py index 7b5328bf72..b2c44c12c6 100644 --- a/tests/nonconfig_workflow.py +++ b/tests/nonconfig_workflow.py @@ -36,8 +36,8 @@ class NonConfigWorkflow(BundleWorkflow): """ - def __init__(self, filename, output_dir): - super().__init__(workflow_type="inference") + def __init__(self, filename, output_dir, meta_file=None, logging_file=None): + super().__init__(workflow_type="inference", meta_file=meta_file, logging_file=logging_file) self.filename = filename self.output_dir = output_dir self._bundle_root = "will override" diff --git a/tests/test_affine_transform.py b/tests/test_affine_transform.py index 6ea036bce8..11464070e0 100644 --- a/tests/test_affine_transform.py +++ b/tests/test_affine_transform.py @@ -133,28 +133,17 @@ def test_to_norm_affine_ill(self, affine, src_size, dst_size, align_corners): class TestAffineTransform(unittest.TestCase): - def test_affine_shift(self): - affine = torch.as_tensor([[1.0, 0.0, 0.0], [0.0, 1.0, -1.0]]) - image = torch.as_tensor([[[[4.0, 1.0, 3.0, 2.0], [7.0, 6.0, 8.0, 5.0], [3.0, 5.0, 3.0, 6.0]]]]) - out = AffineTransform(align_corners=False)(image, affine) - out = out.detach().cpu().numpy() - expected = [[[[0, 4, 1, 3], [0, 7, 6, 8], [0, 3, 5, 3]]]] - np.testing.assert_allclose(out, expected, atol=1e-5, rtol=_rtol) - - def test_affine_shift_1(self): - affine = torch.as_tensor([[1.0, 0.0, -1.0], [0.0, 1.0, -1.0]]) - image = torch.as_tensor([[[[4.0, 1.0, 3.0, 2.0], [7.0, 6.0, 8.0, 5.0], [3.0, 5.0, 3.0, 6.0]]]]) - out = AffineTransform(align_corners=False)(image, affine) - out = out.detach().cpu().numpy() - expected = [[[[0, 0, 0, 0], [0, 4, 1, 3], [0, 7, 6, 8]]]] - np.testing.assert_allclose(out, expected, atol=1e-5, rtol=_rtol) - - def test_affine_shift_2(self): - affine = torch.as_tensor([[1.0, 0.0, -1.0], [0.0, 1.0, 0.0]]) + @parameterized.expand( + [ + (torch.as_tensor([[1.0, 0.0, 0.0], [0.0, 1.0, -1.0]]), [[[[0, 4, 1, 3], [0, 7, 6, 8], [0, 3, 5, 3]]]]), + (torch.as_tensor([[1.0, 0.0, -1.0], [0.0, 1.0, -1.0]]), [[[[0, 0, 0, 0], [0, 4, 1, 3], [0, 7, 6, 8]]]]), + (torch.as_tensor([[1.0, 0.0, -1.0], [0.0, 1.0, 0.0]]), [[[[0, 0, 0, 0], [4, 1, 3, 2], [7, 6, 8, 5]]]]), + ] + ) + def test_affine_transforms(self, affine, expected): image = torch.as_tensor([[[[4.0, 1.0, 3.0, 2.0], [7.0, 6.0, 8.0, 5.0], [3.0, 5.0, 3.0, 6.0]]]]) out = AffineTransform(align_corners=False)(image, affine) out = out.detach().cpu().numpy() - expected = [[[[0, 0, 0, 0], [4, 1, 3, 2], [7, 6, 8, 5]]]] np.testing.assert_allclose(out, expected, atol=1e-5, rtol=_rtol) def test_zoom(self): diff --git a/tests/test_arraydataset.py b/tests/test_arraydataset.py index efc014a267..b61b3c139c 100644 --- a/tests/test_arraydataset.py +++ b/tests/test_arraydataset.py @@ -41,7 +41,7 @@ class TestCompose(Compose): - def __call__(self, input_, lazy): + def __call__(self, input_, lazy=False): img = self.transforms[0](input_) metadata = img.meta img = self.transforms[1](img) diff --git a/tests/test_attentionunet.py b/tests/test_attentionunet.py index 83f6cabc5e..6a577f763f 100644 --- a/tests/test_attentionunet.py +++ b/tests/test_attentionunet.py @@ -14,11 +14,17 @@ import unittest import torch +import torch.nn as nn import monai.networks.nets.attentionunet as att from tests.utils import skip_if_no_cuda, skip_if_quick +def get_net_parameters(net: nn.Module) -> int: + """Returns the total number of parameters in a Module.""" + return sum(param.numel() for param in net.parameters()) + + class TestAttentionUnet(unittest.TestCase): def test_attention_block(self): @@ -50,6 +56,20 @@ def test_attentionunet(self): self.assertEqual(output.shape[0], input.shape[0]) self.assertEqual(output.shape[1], 2) + def test_attentionunet_kernel_size(self): + args_dict = { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 2, + "channels": (3, 4, 5), + "up_kernel_size": 5, + "strides": (1, 2), + } + model_a = att.AttentionUnet(**args_dict, kernel_size=5) + model_b = att.AttentionUnet(**args_dict, kernel_size=7) + self.assertEqual(get_net_parameters(model_a), 3534) + self.assertEqual(get_net_parameters(model_b), 5574) + @skip_if_no_cuda def test_attentionunet_gpu(self): for dims in [2, 3]: diff --git a/tests/test_auto3dseg.py b/tests/test_auto3dseg.py index e2097679e2..6be33bf6ca 100644 --- a/tests/test_auto3dseg.py +++ b/tests/test_auto3dseg.py @@ -367,7 +367,6 @@ def test_filename_case_analyzer(self): for batch_data in self.dataset: d = transform(batch_data[0]) assert DataStatsKeys.BY_CASE_IMAGE_PATH in d - assert DataStatsKeys.BY_CASE_IMAGE_PATH in d def test_filename_case_analyzer_image_only(self): analyzer_image = FilenameStats("image", DataStatsKeys.BY_CASE_IMAGE_PATH) diff --git a/tests/test_auto3dseg_hpo.py b/tests/test_auto3dseg_hpo.py index 34d00336ec..53d09defa0 100644 --- a/tests/test_auto3dseg_hpo.py +++ b/tests/test_auto3dseg_hpo.py @@ -181,7 +181,7 @@ def test_get_history(self) -> None: NNIGen().run_algo(obj_filename, self.work_dir) history = import_bundle_algo_history(self.work_dir, only_trained=True) - assert len(history) == 3 + assert len(history) == 1 def tearDown(self) -> None: self.test_dir.cleanup() diff --git a/tests/test_autoencoderkl.py b/tests/test_autoencoderkl.py new file mode 100644 index 0000000000..d15cb79084 --- /dev/null +++ b/tests/test_autoencoderkl.py @@ -0,0 +1,337 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import os +import tempfile +import unittest +from unittest import skipUnless + +import torch +from parameterized import parameterized + +from monai.apps import download_url +from monai.networks import eval_mode +from monai.networks.nets import AutoencoderKL +from monai.utils import optional_import +from tests.utils import SkipIfBeforePyTorchVersion, skip_if_downloading_fails, testing_data_config + +tqdm, has_tqdm = optional_import("tqdm", name="tqdm") +_, has_einops = optional_import("einops") + +device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + + +CASES_NO_ATTENTION = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, False), + "num_res_blocks": 1, + "norm_num_groups": 4, + "with_encoder_nonlocal_attn": False, + "with_decoder_nonlocal_attn": False, + }, + (1, 1, 16, 16), + (1, 1, 16, 16), + (1, 4, 4, 4), + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, False), + "num_res_blocks": 1, + "norm_num_groups": 4, + "with_encoder_nonlocal_attn": False, + "with_decoder_nonlocal_attn": False, + }, + (1, 1, 16, 16, 16), + (1, 1, 16, 16, 16), + (1, 4, 4, 4, 4), + ], +] + +CASES_ATTENTION = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, False), + "num_res_blocks": 1, + "norm_num_groups": 4, + }, + (1, 1, 16, 16), + (1, 1, 16, 16), + (1, 4, 4, 4), + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, False), + "num_res_blocks": (1, 1, 2), + "norm_num_groups": 4, + }, + (1, 1, 16, 16), + (1, 1, 16, 16), + (1, 4, 4, 4), + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, False), + "num_res_blocks": 1, + "norm_num_groups": 4, + }, + (1, 1, 16, 16), + (1, 1, 16, 16), + (1, 4, 4, 4), + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, False), + "num_res_blocks": 1, + "norm_num_groups": 4, + "with_encoder_nonlocal_attn": False, + }, + (1, 1, 16, 16), + (1, 1, 16, 16), + (1, 4, 4, 4), + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, True), + "num_res_blocks": 1, + "norm_num_groups": 4, + }, + (1, 1, 16, 16), + (1, 1, 16, 16), + (1, 4, 4, 4), + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, True), + "num_res_blocks": 1, + "norm_num_groups": 4, + }, + (1, 1, 16, 16, 16), + (1, 1, 16, 16, 16), + (1, 4, 4, 4, 4), + ], +] + +if has_einops: + CASES = CASES_NO_ATTENTION + CASES_ATTENTION +else: + CASES = CASES_NO_ATTENTION + + +class TestAutoEncoderKL(unittest.TestCase): + @parameterized.expand(CASES) + def test_shape(self, input_param, input_shape, expected_shape, expected_latent_shape): + net = AutoencoderKL(**input_param).to(device) + with eval_mode(net): + result = net.forward(torch.randn(input_shape).to(device)) + self.assertEqual(result[0].shape, expected_shape) + self.assertEqual(result[1].shape, expected_latent_shape) + self.assertEqual(result[2].shape, expected_latent_shape) + + @parameterized.expand(CASES) + @SkipIfBeforePyTorchVersion((1, 11)) + def test_shape_with_convtranspose_and_checkpointing( + self, input_param, input_shape, expected_shape, expected_latent_shape + ): + input_param = input_param.copy() + input_param.update({"use_checkpoint": True, "use_convtranspose": True}) + net = AutoencoderKL(**input_param).to(device) + with eval_mode(net): + result = net.forward(torch.randn(input_shape).to(device)) + self.assertEqual(result[0].shape, expected_shape) + self.assertEqual(result[1].shape, expected_latent_shape) + self.assertEqual(result[2].shape, expected_latent_shape) + + def test_model_channels_not_multiple_of_norm_num_group(self): + with self.assertRaises(ValueError): + AutoencoderKL( + spatial_dims=2, + in_channels=1, + out_channels=1, + channels=(24, 24, 24), + attention_levels=(False, False, False), + latent_channels=8, + num_res_blocks=1, + norm_num_groups=16, + ) + + def test_model_num_channels_not_same_size_of_attention_levels(self): + with self.assertRaises(ValueError): + AutoencoderKL( + spatial_dims=2, + in_channels=1, + out_channels=1, + channels=(24, 24, 24), + attention_levels=(False, False), + latent_channels=8, + num_res_blocks=1, + norm_num_groups=16, + ) + + def test_model_num_channels_not_same_size_of_num_res_blocks(self): + with self.assertRaises(ValueError): + AutoencoderKL( + spatial_dims=2, + in_channels=1, + out_channels=1, + channels=(24, 24, 24), + attention_levels=(False, False, False), + latent_channels=8, + num_res_blocks=(8, 8), + norm_num_groups=16, + ) + + def test_shape_reconstruction(self): + input_param, input_shape, expected_shape, _ = CASES[0] + net = AutoencoderKL(**input_param).to(device) + with eval_mode(net): + result = net.reconstruct(torch.randn(input_shape).to(device)) + self.assertEqual(result.shape, expected_shape) + + @SkipIfBeforePyTorchVersion((1, 11)) + def test_shape_reconstruction_with_convtranspose_and_checkpointing(self): + input_param, input_shape, expected_shape, _ = CASES[0] + input_param = input_param.copy() + input_param.update({"use_checkpoint": True, "use_convtranspose": True}) + net = AutoencoderKL(**input_param).to(device) + with eval_mode(net): + result = net.reconstruct(torch.randn(input_shape).to(device)) + self.assertEqual(result.shape, expected_shape) + + def test_shape_encode(self): + input_param, input_shape, _, expected_latent_shape = CASES[0] + net = AutoencoderKL(**input_param).to(device) + with eval_mode(net): + result = net.encode(torch.randn(input_shape).to(device)) + self.assertEqual(result[0].shape, expected_latent_shape) + self.assertEqual(result[1].shape, expected_latent_shape) + + @SkipIfBeforePyTorchVersion((1, 11)) + def test_shape_encode_with_convtranspose_and_checkpointing(self): + input_param, input_shape, _, expected_latent_shape = CASES[0] + input_param = input_param.copy() + input_param.update({"use_checkpoint": True, "use_convtranspose": True}) + net = AutoencoderKL(**input_param).to(device) + with eval_mode(net): + result = net.encode(torch.randn(input_shape).to(device)) + self.assertEqual(result[0].shape, expected_latent_shape) + self.assertEqual(result[1].shape, expected_latent_shape) + + def test_shape_sampling(self): + input_param, _, _, expected_latent_shape = CASES[0] + net = AutoencoderKL(**input_param).to(device) + with eval_mode(net): + result = net.sampling( + torch.randn(expected_latent_shape).to(device), torch.randn(expected_latent_shape).to(device) + ) + self.assertEqual(result.shape, expected_latent_shape) + + @SkipIfBeforePyTorchVersion((1, 11)) + def test_shape_sampling_convtranspose_and_checkpointing(self): + input_param, _, _, expected_latent_shape = CASES[0] + input_param = input_param.copy() + input_param.update({"use_checkpoint": True, "use_convtranspose": True}) + net = AutoencoderKL(**input_param).to(device) + with eval_mode(net): + result = net.sampling( + torch.randn(expected_latent_shape).to(device), torch.randn(expected_latent_shape).to(device) + ) + self.assertEqual(result.shape, expected_latent_shape) + + def test_shape_decode(self): + input_param, expected_input_shape, _, latent_shape = CASES[0] + net = AutoencoderKL(**input_param).to(device) + with eval_mode(net): + result = net.decode(torch.randn(latent_shape).to(device)) + self.assertEqual(result.shape, expected_input_shape) + + @SkipIfBeforePyTorchVersion((1, 11)) + def test_shape_decode_convtranspose_and_checkpointing(self): + input_param, expected_input_shape, _, latent_shape = CASES[0] + input_param = input_param.copy() + input_param.update({"use_checkpoint": True, "use_convtranspose": True}) + net = AutoencoderKL(**input_param).to(device) + with eval_mode(net): + result = net.decode(torch.randn(latent_shape).to(device)) + self.assertEqual(result.shape, expected_input_shape) + + @skipUnless(has_einops, "Requires einops") + def test_compatibility_with_monai_generative(self): + # test loading weights from a model saved in MONAI Generative, version 0.2.3 + with skip_if_downloading_fails(): + net = AutoencoderKL( + spatial_dims=2, + in_channels=1, + out_channels=1, + channels=(4, 4, 4), + latent_channels=4, + attention_levels=(False, False, True), + num_res_blocks=1, + norm_num_groups=4, + ).to(device) + + tmpdir = tempfile.mkdtemp() + key = "autoencoderkl_monai_generative_weights" + url = testing_data_config("models", key, "url") + hash_type = testing_data_config("models", key, "hash_type") + hash_val = testing_data_config("models", key, "hash_val") + filename = "autoencoderkl_monai_generative_weights.pt" + + weight_path = os.path.join(tmpdir, filename) + download_url(url=url, filepath=weight_path, hash_val=hash_val, hash_type=hash_type) + + net.load_old_state_dict(torch.load(weight_path), verbose=False) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_autoencoderkl_maisi.py b/tests/test_autoencoderkl_maisi.py new file mode 100644 index 0000000000..392a3d7db2 --- /dev/null +++ b/tests/test_autoencoderkl_maisi.py @@ -0,0 +1,229 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +import torch +from parameterized import parameterized + +from monai.networks import eval_mode +from monai.utils import optional_import +from tests.utils import SkipIfBeforePyTorchVersion + +tqdm, has_tqdm = optional_import("tqdm", name="tqdm") +_, has_einops = optional_import("einops") +_, has_generative = optional_import("generative") + +if has_generative: + from monai.apps.generation.maisi.networks.autoencoderkl_maisi import AutoencoderKlMaisi + +device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + +CASES_NO_ATTENTION = [ + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, False), + "num_res_blocks": (1, 1, 1), + "norm_num_groups": 4, + "with_encoder_nonlocal_attn": False, + "with_decoder_nonlocal_attn": False, + "num_splits": 2, + "print_info": False, + }, + (1, 1, 32, 32, 32), + (1, 1, 32, 32, 32), + (1, 4, 8, 8, 8), + ] +] + +CASES_ATTENTION = [ + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, True), + "num_res_blocks": (1, 1, 1), + "norm_num_groups": 4, + "with_encoder_nonlocal_attn": True, + "with_decoder_nonlocal_attn": True, + "num_splits": 2, + "print_info": False, + }, + (1, 1, 32, 32, 32), + (1, 1, 32, 32, 32), + (1, 4, 8, 8, 8), + ] +] + +if has_einops: + CASES = CASES_NO_ATTENTION + CASES_ATTENTION +else: + CASES = CASES_NO_ATTENTION + + +@unittest.skipUnless(has_generative, "monai-generative required") +class TestAutoencoderKlMaisi(unittest.TestCase): + + @parameterized.expand(CASES) + def test_shape(self, input_param, input_shape, expected_shape, expected_latent_shape): + net = AutoencoderKlMaisi(**input_param).to(device) + with eval_mode(net): + result = net.forward(torch.randn(input_shape).to(device)) + self.assertEqual(result[0].shape, expected_shape) + self.assertEqual(result[1].shape, expected_latent_shape) + self.assertEqual(result[2].shape, expected_latent_shape) + + @parameterized.expand(CASES) + @SkipIfBeforePyTorchVersion((1, 11)) + def test_shape_with_convtranspose_and_checkpointing( + self, input_param, input_shape, expected_shape, expected_latent_shape + ): + input_param = input_param.copy() + input_param.update({"use_checkpointing": True, "use_convtranspose": True}) + net = AutoencoderKlMaisi(**input_param).to(device) + with eval_mode(net): + result = net.forward(torch.randn(input_shape).to(device)) + self.assertEqual(result[0].shape, expected_shape) + self.assertEqual(result[1].shape, expected_latent_shape) + self.assertEqual(result[2].shape, expected_latent_shape) + + def test_model_channels_not_multiple_of_norm_num_group(self): + with self.assertRaises(ValueError): + AutoencoderKlMaisi( + spatial_dims=3, + in_channels=1, + out_channels=1, + num_channels=(24, 24, 24), + attention_levels=(False, False, False), + latent_channels=8, + num_res_blocks=(1, 1, 1), + norm_num_groups=16, + num_splits=2, + print_info=False, + ) + + def test_model_num_channels_not_same_size_of_attention_levels(self): + with self.assertRaises(ValueError): + AutoencoderKlMaisi( + spatial_dims=3, + in_channels=1, + out_channels=1, + num_channels=(24, 24, 24), + attention_levels=(False, False), + latent_channels=8, + num_res_blocks=(1, 1, 1), + norm_num_groups=16, + num_splits=2, + print_info=False, + ) + + def test_model_num_channels_not_same_size_of_num_res_blocks(self): + with self.assertRaises(ValueError): + AutoencoderKlMaisi( + spatial_dims=3, + in_channels=1, + out_channels=1, + num_channels=(24, 24), + attention_levels=(False, False, False), + latent_channels=8, + num_res_blocks=(8, 8, 8), + norm_num_groups=16, + num_splits=2, + print_info=False, + ) + + def test_shape_reconstruction(self): + input_param, input_shape, expected_shape, _ = CASES[0] + net = AutoencoderKlMaisi(**input_param).to(device) + with eval_mode(net): + result = net.reconstruct(torch.randn(input_shape).to(device)) + self.assertEqual(result.shape, expected_shape) + + @SkipIfBeforePyTorchVersion((1, 11)) + def test_shape_reconstruction_with_convtranspose_and_checkpointing(self): + input_param, input_shape, expected_shape, _ = CASES[0] + input_param = input_param.copy() + input_param.update({"use_checkpointing": True, "use_convtranspose": True}) + net = AutoencoderKlMaisi(**input_param).to(device) + with eval_mode(net): + result = net.reconstruct(torch.randn(input_shape).to(device)) + self.assertEqual(result.shape, expected_shape) + + def test_shape_encode(self): + input_param, input_shape, _, expected_latent_shape = CASES[0] + net = AutoencoderKlMaisi(**input_param).to(device) + with eval_mode(net): + result = net.encode(torch.randn(input_shape).to(device)) + self.assertEqual(result[0].shape, expected_latent_shape) + self.assertEqual(result[1].shape, expected_latent_shape) + + @SkipIfBeforePyTorchVersion((1, 11)) + def test_shape_encode_with_convtranspose_and_checkpointing(self): + input_param, input_shape, _, expected_latent_shape = CASES[0] + input_param = input_param.copy() + input_param.update({"use_checkpointing": True, "use_convtranspose": True}) + net = AutoencoderKlMaisi(**input_param).to(device) + with eval_mode(net): + result = net.encode(torch.randn(input_shape).to(device)) + self.assertEqual(result[0].shape, expected_latent_shape) + self.assertEqual(result[1].shape, expected_latent_shape) + + def test_shape_sampling(self): + input_param, _, _, expected_latent_shape = CASES[0] + net = AutoencoderKlMaisi(**input_param).to(device) + with eval_mode(net): + result = net.sampling( + torch.randn(expected_latent_shape).to(device), torch.randn(expected_latent_shape).to(device) + ) + self.assertEqual(result.shape, expected_latent_shape) + + @SkipIfBeforePyTorchVersion((1, 11)) + def test_shape_sampling_convtranspose_and_checkpointing(self): + input_param, _, _, expected_latent_shape = CASES[0] + input_param = input_param.copy() + input_param.update({"use_checkpointing": True, "use_convtranspose": True}) + net = AutoencoderKlMaisi(**input_param).to(device) + with eval_mode(net): + result = net.sampling( + torch.randn(expected_latent_shape).to(device), torch.randn(expected_latent_shape).to(device) + ) + self.assertEqual(result.shape, expected_latent_shape) + + def test_shape_decode(self): + input_param, expected_input_shape, _, latent_shape = CASES[0] + net = AutoencoderKlMaisi(**input_param).to(device) + with eval_mode(net): + result = net.decode(torch.randn(latent_shape).to(device)) + self.assertEqual(result.shape, expected_input_shape) + + @SkipIfBeforePyTorchVersion((1, 11)) + def test_shape_decode_convtranspose_and_checkpointing(self): + input_param, expected_input_shape, _, latent_shape = CASES[0] + input_param = input_param.copy() + input_param.update({"use_checkpointing": True, "use_convtranspose": True}) + net = AutoencoderKlMaisi(**input_param).to(device) + with eval_mode(net): + result = net.decode(torch.randn(latent_shape).to(device)) + self.assertEqual(result.shape, expected_input_shape) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_barlow_twins_loss.py b/tests/test_barlow_twins_loss.py new file mode 100644 index 0000000000..81f4032e0c --- /dev/null +++ b/tests/test_barlow_twins_loss.py @@ -0,0 +1,109 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +import numpy as np +import torch +from parameterized import parameterized + +from monai.losses import BarlowTwinsLoss + +TEST_CASES = [ + [ # shape: (2, 4), (2, 4) + {"lambd": 5e-3}, + { + "input": torch.tensor([[1.0, 1.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0]]), + "target": torch.tensor([[1.0, 1.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0]]), + }, + 4.0, + ], + [ # shape: (2, 4), (2, 4) + {"lambd": 5e-3}, + { + "input": torch.tensor([[0.0, 0.0, 1.0, 1.0], [0.0, 0.0, 1.0, 1.0]]), + "target": torch.tensor([[1.0, 1.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0]]), + }, + 4.0, + ], + [ # shape: (2, 4), (2, 4) + {"lambd": 5e-3}, + { + "input": torch.tensor([[1.0, 0.0, 1.0, 1.0], [0.0, 1.0, 1.0, 0.0]]), + "target": torch.tensor([[1.0, 1.0, 1.0, 0.0], [1.0, 1.0, 0.0, 1.0]]), + }, + 5.2562, + ], + [ # shape: (2, 4), (2, 4) + {"lambd": 5e-4}, + { + "input": torch.tensor([[2.0, 3.0, 1.0, 2.0], [0.0, 1.0, 2.0, 5.0]]), + "target": torch.tensor([[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0]]), + }, + 5.0015, + ], + [ # shape: (4, 4), (4, 4) + {"lambd": 5e-3}, + { + "input": torch.tensor( + [[1.0, 2.0, 1.0, 1.0], [3.0, 1.0, 1.0, 2.0], [1.0, 1.0, 1.0, 1.0], [2.0, 1.0, 1.0, 0.0]] + ), + "target": torch.tensor( + [ + [0.0, 1.0, -1.0, 0.0], + [1 / 3, 0.0, -2 / 3, 1 / 3], + [-2 / 3, -1.0, 7 / 3, 1 / 3], + [1 / 3, 0.0, 1 / 3, -2 / 3], + ] + ), + }, + 1.4736, + ], +] + + +class TestBarlowTwinsLoss(unittest.TestCase): + + @parameterized.expand(TEST_CASES) + def test_result(self, input_param, input_data, expected_val): + barlowtwinsloss = BarlowTwinsLoss(**input_param) + result = barlowtwinsloss(**input_data) + np.testing.assert_allclose(result.detach().cpu().numpy(), expected_val, atol=1e-4, rtol=1e-4) + + def test_ill_shape(self): + loss = BarlowTwinsLoss(lambd=5e-3) + with self.assertRaises(ValueError): + loss(torch.ones((1, 2, 3)), torch.ones((1, 1, 2, 3))) + + def test_ill_batch_size(self): + loss = BarlowTwinsLoss(lambd=5e-3) + with self.assertRaises(ValueError): + loss(torch.ones((1, 2)), torch.ones((1, 2))) + + def test_with_cuda(self): + loss = BarlowTwinsLoss(lambd=5e-3) + i = torch.ones((2, 10)) + j = torch.ones((2, 10)) + if torch.cuda.is_available(): + i = i.cuda() + j = j.cuda() + output = loss(i, j) + np.testing.assert_allclose(output.detach().cpu().numpy(), 10.0, atol=1e-4, rtol=1e-4) + + def check_warning_raised(self): + with self.assertWarns(Warning): + BarlowTwinsLoss(lambd=5e-3, batch_size=1) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_bundle_ckpt_export.py b/tests/test_bundle_ckpt_export.py index 8f376a06d5..cfcadcfc4c 100644 --- a/tests/test_bundle_ckpt_export.py +++ b/tests/test_bundle_ckpt_export.py @@ -72,9 +72,9 @@ def test_export(self, key_in_ckpt, use_trace): _, metadata, extra_files = load_net_with_metadata( ts_file, more_extra_files=["inference.json", "def_args.json"] ) - self.assertTrue("schema" in metadata) - self.assertTrue("meta_file" in json.loads(extra_files["def_args.json"])) - self.assertTrue("network_def" in json.loads(extra_files["inference.json"])) + self.assertIn("schema", metadata) + self.assertIn("meta_file", json.loads(extra_files["def_args.json"])) + self.assertIn("network_def", json.loads(extra_files["inference.json"])) @parameterized.expand([TEST_CASE_1, TEST_CASE_2, TEST_CASE_3]) def test_default_value(self, key_in_ckpt, use_trace): diff --git a/tests/test_bundle_download.py b/tests/test_bundle_download.py index 89fbe5e8b2..fe7caf5c17 100644 --- a/tests/test_bundle_download.py +++ b/tests/test_bundle_download.py @@ -56,7 +56,7 @@ TEST_CASE_5 = [ ["models/model.pt", "models/model.ts", "configs/train.json"], "brats_mri_segmentation", - "https://api.ngc.nvidia.com/v2/models/nvidia/monaihosting/brats_mri_segmentation/versions/0.3.9/files/brats_mri_segmentation_v0.3.9.zip", + "https://api.ngc.nvidia.com/v2/models/nvidia/monaihosting/brats_mri_segmentation/versions/0.4.0/files/brats_mri_segmentation_v0.4.0.zip", ] TEST_CASE_6 = [["models/model.pt", "configs/train.json"], "renalStructures_CECT_segmentation", "0.1.0"] @@ -173,6 +173,23 @@ def test_monaihosting_url_download_bundle(self, bundle_files, bundle_name, url): file_path = os.path.join(tempdir, bundle_name, file) self.assertTrue(os.path.exists(file_path)) + @parameterized.expand([TEST_CASE_5]) + @skip_if_quick + def test_ngc_private_source_download_bundle(self, bundle_files, bundle_name, _url): + with skip_if_downloading_fails(): + # download a single file from url, also use `args_file` + with tempfile.TemporaryDirectory() as tempdir: + def_args = {"name": bundle_name, "bundle_dir": tempdir} + def_args_file = os.path.join(tempdir, "def_args.json") + parser = ConfigParser() + parser.export_config_file(config=def_args, filepath=def_args_file) + cmd = ["coverage", "run", "-m", "monai.bundle", "download", "--args_file", def_args_file] + cmd += ["--progress", "False", "--source", "ngc_private"] + command_line_tests(cmd) + for file in bundle_files: + file_path = os.path.join(tempdir, bundle_name, file) + self.assertTrue(os.path.exists(file_path)) + @parameterized.expand([TEST_CASE_6]) @skip_if_quick def test_monaihosting_source_download_bundle(self, bundle_files, bundle_name, version): diff --git a/tests/test_bundle_get_data.py b/tests/test_bundle_get_data.py index 605b3945bb..f84713fbe3 100644 --- a/tests/test_bundle_get_data.py +++ b/tests/test_bundle_get_data.py @@ -51,8 +51,8 @@ class TestGetBundleData(unittest.TestCase): def test_get_all_bundles_list(self, params): with skip_if_downloading_fails(): output = get_all_bundles_list(**params) - self.assertTrue(isinstance(output, list)) - self.assertTrue(isinstance(output[0], tuple)) + self.assertIsInstance(output, list) + self.assertIsInstance(output[0], tuple) self.assertTrue(len(output[0]) == 2) @parameterized.expand([TEST_CASE_1, TEST_CASE_5]) @@ -60,16 +60,17 @@ def test_get_all_bundles_list(self, params): def test_get_bundle_versions(self, params): with skip_if_downloading_fails(): output = get_bundle_versions(**params) - self.assertTrue(isinstance(output, dict)) - self.assertTrue("latest_version" in output and "all_versions" in output) - self.assertTrue("0.1.0" in output["all_versions"]) + self.assertIsInstance(output, dict) + self.assertIn("latest_version", output) + self.assertIn("all_versions", output) + self.assertIn("0.1.0", output["all_versions"]) @parameterized.expand([TEST_CASE_1, TEST_CASE_2]) @skip_if_quick def test_get_bundle_info(self, params): with skip_if_downloading_fails(): output = get_bundle_info(**params) - self.assertTrue(isinstance(output, dict)) + self.assertIsInstance(output, dict) for key in ["id", "name", "size", "download_count", "browser_download_url"]: self.assertTrue(key in output) @@ -78,7 +79,7 @@ def test_get_bundle_info(self, params): def test_get_bundle_info_monaihosting(self, params): with skip_if_downloading_fails(): output = get_bundle_info(**params) - self.assertTrue(isinstance(output, dict)) + self.assertIsInstance(output, dict) for key in ["name", "browser_download_url"]: self.assertTrue(key in output) diff --git a/tests/test_bundle_trt_export.py b/tests/test_bundle_trt_export.py index 47034852ef..833a0ca1dc 100644 --- a/tests/test_bundle_trt_export.py +++ b/tests/test_bundle_trt_export.py @@ -91,9 +91,9 @@ def test_trt_export(self, convert_precision, input_shape, dynamic_batch): _, metadata, extra_files = load_net_with_metadata( ts_file, more_extra_files=["inference.json", "def_args.json"] ) - self.assertTrue("schema" in metadata) - self.assertTrue("meta_file" in json.loads(extra_files["def_args.json"])) - self.assertTrue("network_def" in json.loads(extra_files["inference.json"])) + self.assertIn("schema", metadata) + self.assertIn("meta_file", json.loads(extra_files["def_args.json"])) + self.assertIn("network_def", json.loads(extra_files["inference.json"])) @parameterized.expand([TEST_CASE_3, TEST_CASE_4]) @unittest.skipUnless( @@ -129,9 +129,9 @@ def test_onnx_trt_export(self, convert_precision, input_shape, dynamic_batch): _, metadata, extra_files = load_net_with_metadata( ts_file, more_extra_files=["inference.json", "def_args.json"] ) - self.assertTrue("schema" in metadata) - self.assertTrue("meta_file" in json.loads(extra_files["def_args.json"])) - self.assertTrue("network_def" in json.loads(extra_files["inference.json"])) + self.assertIn("schema", metadata) + self.assertIn("meta_file", json.loads(extra_files["def_args.json"])) + self.assertIn("network_def", json.loads(extra_files["inference.json"])) if __name__ == "__main__": diff --git a/tests/test_bundle_workflow.py b/tests/test_bundle_workflow.py index f7da37acef..1727fcdf53 100644 --- a/tests/test_bundle_workflow.py +++ b/tests/test_bundle_workflow.py @@ -35,6 +35,8 @@ TEST_CASE_3 = [os.path.join(os.path.dirname(__file__), "testing_data", "config_fl_train.json")] +TEST_CASE_NON_CONFIG_WRONG_LOG = [None, "logging.conf", "Cannot find the logging config file: logging.conf."] + class TestBundleWorkflow(unittest.TestCase): @@ -103,6 +105,16 @@ def test_inference_config(self, config_file): ) self._test_inferer(inferer) + # test property path + inferer = ConfigWorkflow( + config_file=config_file, + properties_path=os.path.join(os.path.dirname(__file__), "testing_data", "fl_infer_properties.json"), + logging_file=os.path.join(os.path.dirname(__file__), "testing_data", "logging.conf"), + **override, + ) + self._test_inferer(inferer) + self.assertEqual(inferer.workflow_type, None) + @parameterized.expand([TEST_CASE_3]) def test_train_config(self, config_file): # test standard MONAI model-zoo config workflow @@ -126,11 +138,11 @@ def test_train_config(self, config_file): self.assertListEqual(trainer.check_properties(), []) # test read / write the properties dataset = trainer.train_dataset - self.assertTrue(isinstance(dataset, Dataset)) + self.assertIsInstance(dataset, Dataset) inferer = trainer.train_inferer - self.assertTrue(isinstance(inferer, SimpleInferer)) + self.assertIsInstance(inferer, SimpleInferer) # test optional properties get - self.assertTrue(trainer.train_key_metric is None) + self.assertIsNone(trainer.train_key_metric) trainer.train_dataset = deepcopy(dataset) trainer.train_inferer = deepcopy(inferer) # test optional properties set @@ -144,8 +156,14 @@ def test_train_config(self, config_file): def test_non_config(self): # test user defined python style workflow inferer = NonConfigWorkflow(self.filename, self.data_dir) + self.assertEqual(inferer.meta_file, None) self._test_inferer(inferer) + @parameterized.expand([TEST_CASE_NON_CONFIG_WRONG_LOG]) + def test_non_config_wrong_log_cases(self, meta_file, logging_file, expected_error): + with self.assertRaisesRegex(FileNotFoundError, expected_error): + NonConfigWorkflow(self.filename, self.data_dir, meta_file, logging_file) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_clip_intensity_percentiles.py b/tests/test_clip_intensity_percentiles.py new file mode 100644 index 0000000000..77f811db87 --- /dev/null +++ b/tests/test_clip_intensity_percentiles.py @@ -0,0 +1,198 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import annotations + +import unittest + +import torch +from parameterized import parameterized + +from monai.transforms import ClipIntensityPercentiles +from monai.transforms.utils import soft_clip +from monai.transforms.utils_pytorch_numpy_unification import clip, percentile +from monai.utils.type_conversion import convert_to_tensor +from tests.utils import TEST_NDARRAYS, NumpyImageTestCase2D, NumpyImageTestCase3D, assert_allclose + + +def test_hard_clip_func(im, lower, upper): + im_t = convert_to_tensor(im) + if lower is None: + upper = percentile(im_t, upper) + elif upper is None: + lower = percentile(im_t, lower) + else: + lower, upper = percentile(im_t, (lower, upper)) + return clip(im_t, lower, upper) + + +def test_soft_clip_func(im, lower, upper): + im_t = convert_to_tensor(im) + if lower is None: + upper = percentile(im_t, upper) + elif upper is None: + lower = percentile(im_t, lower) + else: + lower, upper = percentile(im_t, (lower, upper)) + return soft_clip(im_t, minv=lower, maxv=upper, sharpness_factor=1.0, dtype=torch.float32) + + +class TestClipIntensityPercentiles2D(NumpyImageTestCase2D): + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_hard_clipping_two_sided(self, p): + hard_clipper = ClipIntensityPercentiles(upper=95, lower=5) + im = p(self.imt) + result = hard_clipper(im) + expected = test_hard_clip_func(im, 5, 95) + assert_allclose(result, p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_hard_clipping_one_sided_high(self, p): + hard_clipper = ClipIntensityPercentiles(upper=95, lower=None) + im = p(self.imt) + result = hard_clipper(im) + expected = test_hard_clip_func(im, 0, 95) + assert_allclose(result, p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_hard_clipping_one_sided_low(self, p): + hard_clipper = ClipIntensityPercentiles(upper=None, lower=5) + im = p(self.imt) + result = hard_clipper(im) + expected = test_hard_clip_func(im, 5, 100) + assert_allclose(result, p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_soft_clipping_two_sided(self, p): + soft_clipper = ClipIntensityPercentiles(upper=95, lower=5, sharpness_factor=1.0) + im = p(self.imt) + result = soft_clipper(im) + expected = test_soft_clip_func(im, 5, 95) + # the rtol is set to 1e-4 because the logaddexp function used in softplus is not stable accross torch and numpy + assert_allclose(result, p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_soft_clipping_one_sided_high(self, p): + soft_clipper = ClipIntensityPercentiles(upper=95, lower=None, sharpness_factor=1.0) + im = p(self.imt) + result = soft_clipper(im) + expected = test_soft_clip_func(im, None, 95) + # the rtol is set to 1e-4 because the logaddexp function used in softplus is not stable accross torch and numpy + assert_allclose(result, p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_soft_clipping_one_sided_low(self, p): + soft_clipper = ClipIntensityPercentiles(upper=None, lower=5, sharpness_factor=1.0) + im = p(self.imt) + result = soft_clipper(im) + expected = test_soft_clip_func(im, 5, None) + # the rtol is set to 1e-4 because the logaddexp function used in softplus is not stable accross torch and numpy + assert_allclose(result, p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_channel_wise(self, p): + clipper = ClipIntensityPercentiles(upper=95, lower=5, channel_wise=True) + im = p(self.imt) + result = clipper(im) + im_t = convert_to_tensor(self.imt) + for i, c in enumerate(im_t): + lower, upper = percentile(c, (5, 95)) + expected = clip(c, lower, upper) + assert_allclose(result[i], p(expected), type_test="tensor", rtol=1e-4, atol=0) + + def test_ill_sharpness_factor(self): + with self.assertRaises(ValueError): + ClipIntensityPercentiles(upper=95, lower=5, sharpness_factor=0.0) + + def test_ill_lower_percentile(self): + with self.assertRaises(ValueError): + ClipIntensityPercentiles(upper=None, lower=-1) + + def test_ill_upper_percentile(self): + with self.assertRaises(ValueError): + ClipIntensityPercentiles(upper=101, lower=None) + + def test_ill_percentiles(self): + with self.assertRaises(ValueError): + ClipIntensityPercentiles(upper=95, lower=96) + + def test_ill_both_none(self): + with self.assertRaises(ValueError): + ClipIntensityPercentiles(upper=None, lower=None) + + +class TestClipIntensityPercentiles3D(NumpyImageTestCase3D): + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_hard_clipping_two_sided(self, p): + hard_clipper = ClipIntensityPercentiles(upper=95, lower=5) + im = p(self.imt) + result = hard_clipper(im) + expected = test_hard_clip_func(im, 5, 95) + assert_allclose(result, p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_hard_clipping_one_sided_high(self, p): + hard_clipper = ClipIntensityPercentiles(upper=95, lower=None) + im = p(self.imt) + result = hard_clipper(im) + expected = test_hard_clip_func(im, 0, 95) + assert_allclose(result, p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_hard_clipping_one_sided_low(self, p): + hard_clipper = ClipIntensityPercentiles(upper=None, lower=5) + im = p(self.imt) + result = hard_clipper(im) + expected = test_hard_clip_func(im, 5, 100) + assert_allclose(result, p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_soft_clipping_two_sided(self, p): + soft_clipper = ClipIntensityPercentiles(upper=95, lower=5, sharpness_factor=1.0) + im = p(self.imt) + result = soft_clipper(im) + expected = test_soft_clip_func(im, 5, 95) + # the rtol is set to 1e-4 because the logaddexp function used in softplus is not stable accross torch and numpy + assert_allclose(result, p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_soft_clipping_one_sided_high(self, p): + soft_clipper = ClipIntensityPercentiles(upper=95, lower=None, sharpness_factor=1.0) + im = p(self.imt) + result = soft_clipper(im) + expected = test_soft_clip_func(im, None, 95) + # the rtol is set to 1e-4 because the logaddexp function used in softplus is not stable accross torch and numpy + assert_allclose(result, p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_soft_clipping_one_sided_low(self, p): + soft_clipper = ClipIntensityPercentiles(upper=None, lower=5, sharpness_factor=1.0) + im = p(self.imt) + result = soft_clipper(im) + expected = test_soft_clip_func(im, 5, None) + # the rtol is set to 1e-4 because the logaddexp function used in softplus is not stable accross torch and numpy + assert_allclose(result, p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_channel_wise(self, p): + clipper = ClipIntensityPercentiles(upper=95, lower=5, channel_wise=True) + im = p(self.imt) + result = clipper(im) + im_t = convert_to_tensor(self.imt) + for i, c in enumerate(im_t): + lower, upper = percentile(c, (5, 95)) + expected = clip(c, lower, upper) + assert_allclose(result[i], p(expected), type_test="tensor", rtol=1e-4, atol=0) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_clip_intensity_percentilesd.py b/tests/test_clip_intensity_percentilesd.py new file mode 100644 index 0000000000..3e06b18418 --- /dev/null +++ b/tests/test_clip_intensity_percentilesd.py @@ -0,0 +1,196 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +from parameterized import parameterized + +from monai.transforms import ClipIntensityPercentilesd +from monai.transforms.utils_pytorch_numpy_unification import clip, percentile +from monai.utils.type_conversion import convert_to_tensor +from tests.utils import TEST_NDARRAYS, NumpyImageTestCase2D, NumpyImageTestCase3D, assert_allclose + +from .test_clip_intensity_percentiles import test_hard_clip_func, test_soft_clip_func + + +class TestClipIntensityPercentilesd2D(NumpyImageTestCase2D): + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_hard_clipping_two_sided(self, p): + key = "img" + hard_clipper = ClipIntensityPercentilesd(keys=[key], upper=95, lower=5) + im = p(self.imt) + result = hard_clipper({key: im}) + expected = test_hard_clip_func(im, 5, 95) + assert_allclose(result[key], p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_hard_clipping_one_sided_high(self, p): + key = "img" + hard_clipper = ClipIntensityPercentilesd(keys=[key], upper=95, lower=None) + im = p(self.imt) + result = hard_clipper({key: im}) + expected = test_hard_clip_func(im, 0, 95) + assert_allclose(result[key], p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_hard_clipping_one_sided_low(self, p): + key = "img" + hard_clipper = ClipIntensityPercentilesd(keys=[key], upper=None, lower=5) + im = p(self.imt) + result = hard_clipper({key: im}) + expected = test_hard_clip_func(im, 5, 100) + assert_allclose(result[key], p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_soft_clipping_two_sided(self, p): + key = "img" + soft_clipper = ClipIntensityPercentilesd(keys=[key], upper=95, lower=5, sharpness_factor=1.0) + im = p(self.imt) + result = soft_clipper({key: im}) + expected = test_soft_clip_func(im, 5, 95) + # the rtol is set to 1e-4 because the logaddexp function used in softplus is not stable accross torch and numpy + assert_allclose(result[key], p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_soft_clipping_one_sided_high(self, p): + key = "img" + soft_clipper = ClipIntensityPercentilesd(keys=[key], upper=95, lower=None, sharpness_factor=1.0) + im = p(self.imt) + result = soft_clipper({key: im}) + expected = test_soft_clip_func(im, None, 95) + # the rtol is set to 1e-4 because the logaddexp function used in softplus is not stable accross torch and numpy + assert_allclose(result[key], p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_soft_clipping_one_sided_low(self, p): + key = "img" + soft_clipper = ClipIntensityPercentilesd(keys=[key], upper=None, lower=5, sharpness_factor=1.0) + im = p(self.imt) + result = soft_clipper({key: im}) + expected = test_soft_clip_func(im, 5, None) + # the rtol is set to 1e-4 because the logaddexp function used in softplus is not stable accross torch and numpy + assert_allclose(result[key], p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_channel_wise(self, p): + key = "img" + clipper = ClipIntensityPercentilesd(keys=[key], upper=95, lower=5, channel_wise=True) + im = p(self.imt) + result = clipper({key: im}) + im_t = convert_to_tensor(self.imt) + for i, c in enumerate(im_t): + lower, upper = percentile(c, (5, 95)) + expected = clip(c, lower, upper) + assert_allclose(result[key][i], p(expected), type_test="tensor", rtol=1e-3, atol=0) + + def test_ill_sharpness_factor(self): + key = "img" + with self.assertRaises(ValueError): + ClipIntensityPercentilesd(keys=[key], upper=95, lower=5, sharpness_factor=0.0) + + def test_ill_lower_percentile(self): + key = "img" + with self.assertRaises(ValueError): + ClipIntensityPercentilesd(keys=[key], upper=None, lower=-1) + + def test_ill_upper_percentile(self): + key = "img" + with self.assertRaises(ValueError): + ClipIntensityPercentilesd(keys=[key], upper=101, lower=None) + + def test_ill_percentiles(self): + key = "img" + with self.assertRaises(ValueError): + ClipIntensityPercentilesd(keys=[key], upper=95, lower=96) + + def test_ill_both_none(self): + key = "img" + with self.assertRaises(ValueError): + ClipIntensityPercentilesd(keys=[key], upper=None, lower=None) + + +class TestClipIntensityPercentilesd3D(NumpyImageTestCase3D): + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_hard_clipping_two_sided(self, p): + key = "img" + hard_clipper = ClipIntensityPercentilesd(keys=[key], upper=95, lower=5) + im = p(self.imt) + result = hard_clipper({key: im}) + expected = test_hard_clip_func(im, 5, 95) + assert_allclose(result[key], p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_hard_clipping_one_sided_high(self, p): + key = "img" + hard_clipper = ClipIntensityPercentilesd(keys=[key], upper=95, lower=None) + im = p(self.imt) + result = hard_clipper({key: im}) + expected = test_hard_clip_func(im, 0, 95) + assert_allclose(result[key], p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_hard_clipping_one_sided_low(self, p): + key = "img" + hard_clipper = ClipIntensityPercentilesd(keys=[key], upper=None, lower=5) + im = p(self.imt) + result = hard_clipper({key: im}) + expected = test_hard_clip_func(im, 5, 100) + assert_allclose(result[key], p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_soft_clipping_two_sided(self, p): + key = "img" + soft_clipper = ClipIntensityPercentilesd(keys=[key], upper=95, lower=5, sharpness_factor=1.0) + im = p(self.imt) + result = soft_clipper({key: im}) + expected = test_soft_clip_func(im, 5, 95) + # the rtol is set to 1e-4 because the logaddexp function used in softplus is not stable accross torch and numpy + assert_allclose(result[key], p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_soft_clipping_one_sided_high(self, p): + key = "img" + soft_clipper = ClipIntensityPercentilesd(keys=[key], upper=95, lower=None, sharpness_factor=1.0) + im = p(self.imt) + result = soft_clipper({key: im}) + expected = test_soft_clip_func(im, None, 95) + # the rtol is set to 1e-4 because the logaddexp function used in softplus is not stable accross torch and numpy + assert_allclose(result[key], p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_soft_clipping_one_sided_low(self, p): + key = "img" + soft_clipper = ClipIntensityPercentilesd(keys=[key], upper=None, lower=5, sharpness_factor=1.0) + im = p(self.imt) + result = soft_clipper({key: im}) + expected = test_soft_clip_func(im, 5, None) + # the rtol is set to 1e-6 because the logaddexp function used in softplus is not stable accross torch and numpy + assert_allclose(result[key], p(expected), type_test="tensor", rtol=1e-4, atol=0) + + @parameterized.expand([[p] for p in TEST_NDARRAYS]) + def test_channel_wise(self, p): + key = "img" + clipper = ClipIntensityPercentilesd(keys=[key], upper=95, lower=5, channel_wise=True) + im = p(self.imt) + result = clipper({key: im}) + im_t = convert_to_tensor(im) + for i, c in enumerate(im_t): + lower, upper = percentile(c, (5, 95)) + expected = clip(c, lower, upper) + assert_allclose(result[key][i], p(expected), type_test="tensor", rtol=1e-4, atol=0) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_component_store.py b/tests/test_component_store.py index 424eceb3d1..7e7c6dd19d 100644 --- a/tests/test_component_store.py +++ b/tests/test_component_store.py @@ -48,17 +48,17 @@ def test_add2(self): self.cs.add("test_obj2", "Test object", test_obj2) self.assertEqual(len(self.cs), 2) - self.assertTrue("test_obj1" in self.cs) - self.assertTrue("test_obj2" in self.cs) + self.assertIn("test_obj1", self.cs) + self.assertIn("test_obj2", self.cs) def test_add_def(self): - self.assertFalse("test_func" in self.cs) + self.assertNotIn("test_func", self.cs) @self.cs.add_def("test_func", "Test function") def test_func(): return 123 - self.assertTrue("test_func" in self.cs) + self.assertIn("test_func", self.cs) self.assertEqual(len(self.cs), 1) self.assertEqual(list(self.cs), [("test_func", test_func)]) diff --git a/tests/test_compose.py b/tests/test_compose.py index 309767833b..3c53ac4a22 100644 --- a/tests/test_compose.py +++ b/tests/test_compose.py @@ -716,15 +716,15 @@ def test_compose_execute_equivalence_with_flags(self, flags, data, pipeline): for k in actual.keys(): self.assertEqual(expected[k], actual[k]) else: - self.assertTrue(expected, actual) + self.assertEqual(expected, actual) p = deepcopy(pipeline) actual = execute_compose(execute_compose(data, p, start=0, end=cutoff, **flags), p, start=cutoff, **flags) if isinstance(actual, dict): for k in actual.keys(): - self.assertTrue(expected[k], actual[k]) + self.assertEqual(expected[k], actual[k]) else: - self.assertTrue(expected, actual) + self.assertEqual(expected, actual) class TestComposeCallableInput(unittest.TestCase): diff --git a/tests/test_compute_f_beta.py b/tests/test_compute_f_beta.py index 85997577cf..43ebb6a6d5 100644 --- a/tests/test_compute_f_beta.py +++ b/tests/test_compute_f_beta.py @@ -15,6 +15,7 @@ import numpy as np import torch +from parameterized import parameterized from monai.metrics import FBetaScore from tests.utils import assert_allclose @@ -33,26 +34,21 @@ def test_expecting_success_and_device(self): assert_allclose(result, torch.Tensor([0.714286]), atol=1e-6, rtol=1e-6) np.testing.assert_equal(result.device, y_pred.device) - def test_expecting_success2(self): - metric = FBetaScore(beta=0.5) - metric( - y_pred=torch.Tensor([[1, 1, 1], [1, 1, 1], [1, 1, 1]]), y=torch.Tensor([[1, 0, 1], [0, 1, 0], [1, 0, 1]]) - ) - assert_allclose(metric.aggregate()[0], torch.Tensor([0.609756]), atol=1e-6, rtol=1e-6) - - def test_expecting_success3(self): - metric = FBetaScore(beta=2) - metric( - y_pred=torch.Tensor([[1, 1, 1], [1, 1, 1], [1, 1, 1]]), y=torch.Tensor([[1, 0, 1], [0, 1, 0], [1, 0, 1]]) - ) - assert_allclose(metric.aggregate()[0], torch.Tensor([0.862069]), atol=1e-6, rtol=1e-6) - - def test_denominator_is_zero(self): - metric = FBetaScore(beta=2) - metric( - y_pred=torch.Tensor([[1, 1, 1], [1, 1, 1], [1, 1, 1]]), y=torch.Tensor([[0, 0, 0], [0, 0, 0], [0, 0, 0]]) - ) - assert_allclose(metric.aggregate()[0], torch.Tensor([0.0]), atol=1e-6, rtol=1e-6) + @parameterized.expand( + [ + (0.5, torch.Tensor([[1, 0, 1], [0, 1, 0], [1, 0, 1]]), torch.Tensor([0.609756])), # success_beta_0_5 + (2, torch.Tensor([[1, 0, 1], [0, 1, 0], [1, 0, 1]]), torch.Tensor([0.862069])), # success_beta_2 + ( + 2, # success_beta_2, denominator_zero + torch.Tensor([[0, 0, 0], [0, 0, 0], [0, 0, 0]]), + torch.Tensor([0.0]), + ), + ] + ) + def test_success_and_zero(self, beta, y, expected_score): + metric = FBetaScore(beta=beta) + metric(y_pred=torch.Tensor([[1, 1, 1], [1, 1, 1], [1, 1, 1]]), y=y) + assert_allclose(metric.aggregate()[0], expected_score, atol=1e-6, rtol=1e-6) def test_number_of_dimensions_less_than_2_should_raise_error(self): metric = FBetaScore() diff --git a/tests/test_compute_ho_ver_maps.py b/tests/test_compute_ho_ver_maps.py index bbd5230f04..6e46cf2b1e 100644 --- a/tests/test_compute_ho_ver_maps.py +++ b/tests/test_compute_ho_ver_maps.py @@ -67,8 +67,8 @@ class ComputeHoVerMapsTests(unittest.TestCase): def test_horizontal_certical_maps(self, in_type, arguments, mask, hv_mask): input_image = in_type(mask) result = ComputeHoVerMaps(**arguments)(input_image) - self.assertTrue(isinstance(result, torch.Tensor)) - self.assertTrue(str(result.dtype).split(".")[1] == arguments.get("dtype", "float32")) + self.assertIsInstance(result, torch.Tensor) + self.assertEqual(str(result.dtype).split(".")[1], arguments.get("dtype", "float32")) assert_allclose(result, hv_mask, type_test="tensor") diff --git a/tests/test_compute_ho_ver_maps_d.py b/tests/test_compute_ho_ver_maps_d.py index 7b5ac0d9d7..0734e2e731 100644 --- a/tests/test_compute_ho_ver_maps_d.py +++ b/tests/test_compute_ho_ver_maps_d.py @@ -71,8 +71,8 @@ def test_horizontal_certical_maps(self, in_type, arguments, mask, hv_mask): for k in mask.keys(): input_image[k] = in_type(mask[k]) result = ComputeHoVerMapsd(keys="mask", **arguments)(input_image)[hv_key] - self.assertTrue(isinstance(result, torch.Tensor)) - self.assertTrue(str(result.dtype).split(".")[1] == arguments.get("dtype", "float32")) + self.assertIsInstance(result, torch.Tensor) + self.assertEqual(str(result.dtype).split(".")[1], arguments.get("dtype", "float32")) assert_allclose(result, hv_mask[hv_key], type_test="tensor") diff --git a/tests/test_compute_regression_metrics.py b/tests/test_compute_regression_metrics.py index a8b7f03e47..c407ab6ba6 100644 --- a/tests/test_compute_regression_metrics.py +++ b/tests/test_compute_regression_metrics.py @@ -70,22 +70,24 @@ def test_shape_reduction(self): mt = mt_fn(reduction="mean") mt(in_tensor, in_tensor) out_tensor = mt.aggregate() - self.assertTrue(len(out_tensor.shape) == 1) + self.assertEqual(len(out_tensor.shape), 1) mt = mt_fn(reduction="sum") mt(in_tensor, in_tensor) out_tensor = mt.aggregate() - self.assertTrue(len(out_tensor.shape) == 0) + self.assertEqual(len(out_tensor.shape), 0) mt = mt_fn(reduction="sum") # test reduction arg overriding mt(in_tensor, in_tensor) out_tensor = mt.aggregate(reduction="mean_channel") - self.assertTrue(len(out_tensor.shape) == 1 and out_tensor.shape[0] == batch) + self.assertEqual(len(out_tensor.shape), 1) + self.assertEqual(out_tensor.shape[0], batch) mt = mt_fn(reduction="sum_channel") mt(in_tensor, in_tensor) out_tensor = mt.aggregate() - self.assertTrue(len(out_tensor.shape) == 1 and out_tensor.shape[0] == batch) + self.assertEqual(len(out_tensor.shape), 1) + self.assertEqual(out_tensor.shape[0], batch) def test_compare_numpy(self): set_determinism(seed=123) diff --git a/tests/test_concat_itemsd.py b/tests/test_concat_itemsd.py index 64c5d6e255..564ddf5c1f 100644 --- a/tests/test_concat_itemsd.py +++ b/tests/test_concat_itemsd.py @@ -30,7 +30,7 @@ def test_tensor_values(self): "img2": torch.tensor([[0, 1], [1, 2]], device=device), } result = ConcatItemsd(keys=["img1", "img2"], name="cat_img")(input_data) - self.assertTrue("cat_img" in result) + self.assertIn("cat_img", result) result["cat_img"] += 1 assert_allclose(result["img1"], torch.tensor([[0, 1], [1, 2]], device=device)) assert_allclose(result["cat_img"], torch.tensor([[1, 2], [2, 3], [1, 2], [2, 3]], device=device)) @@ -42,8 +42,8 @@ def test_metatensor_values(self): "img2": MetaTensor([[0, 1], [1, 2]], device=device), } result = ConcatItemsd(keys=["img1", "img2"], name="cat_img")(input_data) - self.assertTrue("cat_img" in result) - self.assertTrue(isinstance(result["cat_img"], MetaTensor)) + self.assertIn("cat_img", result) + self.assertIsInstance(result["cat_img"], MetaTensor) self.assertEqual(result["img1"].meta, result["cat_img"].meta) result["cat_img"] += 1 assert_allclose(result["img1"], torch.tensor([[0, 1], [1, 2]], device=device)) @@ -52,7 +52,7 @@ def test_metatensor_values(self): def test_numpy_values(self): input_data = {"img1": np.array([[0, 1], [1, 2]]), "img2": np.array([[0, 1], [1, 2]])} result = ConcatItemsd(keys=["img1", "img2"], name="cat_img")(input_data) - self.assertTrue("cat_img" in result) + self.assertIn("cat_img", result) result["cat_img"] += 1 np.testing.assert_allclose(result["img1"], np.array([[0, 1], [1, 2]])) np.testing.assert_allclose(result["cat_img"], np.array([[1, 2], [2, 3], [1, 2], [2, 3]])) diff --git a/tests/test_config_parser.py b/tests/test_config_parser.py index cc890a0522..cf1edc8f08 100644 --- a/tests/test_config_parser.py +++ b/tests/test_config_parser.py @@ -185,7 +185,7 @@ def test_function(self, config): if id in ("compute", "cls_compute"): parser[f"{id}#_mode_"] = "callable" func = parser.get_parsed_content(id=id) - self.assertTrue(id in parser.ref_resolver.resolved_content) + self.assertIn(id, parser.ref_resolver.resolved_content) if id == "error_func": with self.assertRaises(TypeError): func(1, 2) diff --git a/tests/test_conjugate_gradient.py b/tests/test_conjugate_gradient.py new file mode 100644 index 0000000000..64efe3b168 --- /dev/null +++ b/tests/test_conjugate_gradient.py @@ -0,0 +1,56 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +import torch + +from monai.networks.layers import ConjugateGradient + + +class TestConjugateGradient(unittest.TestCase): + + def test_real_valued_inverse(self): + """Test ConjugateGradient with real-valued input: when the input is real + value, the output should be the inverse of the matrix.""" + a_dim = 3 + a_mat = torch.tensor([[1, 2, 3], [2, 1, 2], [3, 2, 1]], dtype=torch.float) + + def a_op(x): + return a_mat @ x + + cg_solver = ConjugateGradient(a_op, num_iter=100) + # define the measurement + y = torch.tensor([1, 2, 3], dtype=torch.float) + # solve for x + x = cg_solver(torch.zeros(a_dim), y) + x_ref = torch.linalg.solve(a_mat, y) + # assert torch.allclose(x, x_ref, atol=1e-6), 'CG solver failed to converge to reference solution' + self.assertTrue(torch.allclose(x, x_ref, atol=1e-6)) + + def test_complex_valued_inverse(self): + a_dim = 3 + a_mat = torch.tensor([[1, 2, 3], [2, 1, 2], [3, 2, 1]], dtype=torch.complex64) + + def a_op(x): + return a_mat @ x + + cg_solver = ConjugateGradient(a_op, num_iter=100) + y = torch.tensor([1, 2, 3], dtype=torch.complex64) + x = cg_solver(torch.zeros(a_dim, dtype=torch.complex64), y) + x_ref = torch.linalg.solve(a_mat, y) + self.assertTrue(torch.allclose(x, x_ref, atol=1e-6)) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_controlnet.py b/tests/test_controlnet.py new file mode 100644 index 0000000000..4746c7ce22 --- /dev/null +++ b/tests/test_controlnet.py @@ -0,0 +1,215 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import os +import tempfile +import unittest +from unittest import skipUnless + +import torch +from parameterized import parameterized + +from monai.apps import download_url +from monai.networks import eval_mode +from monai.networks.nets.controlnet import ControlNet +from monai.utils import optional_import +from tests.utils import skip_if_downloading_fails, testing_data_config + +_, has_einops = optional_import("einops") +UNCOND_CASES_2D = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + }, + (1, 8, 4, 4), + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + "resblock_updown": True, + }, + (1, 8, 4, 4), + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "num_res_blocks": 1, + "channels": (4, 4, 4), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 4, + }, + (1, 4, 4, 4), + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + "resblock_updown": True, + }, + (1, 8, 4, 4), + ], +] + +UNCOND_CASES_3D = [ + [ + { + "spatial_dims": 3, + "in_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + }, + (1, 8, 4, 4, 4), + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "num_res_blocks": 1, + "channels": (4, 4, 4), + "num_head_channels": 4, + "attention_levels": (False, False, False), + "norm_num_groups": 4, + "resblock_updown": True, + }, + (1, 4, 4, 4, 4), + ], +] + +COND_CASES_2D = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + }, + (1, 8, 4, 4), + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + "resblock_updown": True, + }, + (1, 8, 4, 4), + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + "upcast_attention": True, + }, + (1, 8, 4, 4), + ], +] + + +class TestControlNet(unittest.TestCase): + @parameterized.expand(UNCOND_CASES_2D + UNCOND_CASES_3D) + @skipUnless(has_einops, "Requires einops") + def test_shape_unconditioned_models(self, input_param, expected_output_shape): + input_param["conditioning_embedding_in_channels"] = input_param["in_channels"] + input_param["conditioning_embedding_num_channels"] = (input_param["channels"][0],) + net = ControlNet(**input_param) + with eval_mode(net): + x = torch.rand((1, 1) + (16,) * input_param["spatial_dims"]) + timesteps = torch.randint(0, 1000, (1,)).long() + controlnet_cond = torch.rand((1, 1) + (16,) * input_param["spatial_dims"]) + result = net.forward(x, timesteps=timesteps, controlnet_cond=controlnet_cond) + self.assertEqual(len(result[0]), 2 * len(input_param["channels"])) + self.assertEqual(result[1].shape, expected_output_shape) + + @parameterized.expand(COND_CASES_2D) + @skipUnless(has_einops, "Requires einops") + def test_shape_conditioned_models(self, input_param, expected_output_shape): + input_param["conditioning_embedding_in_channels"] = input_param["in_channels"] + input_param["conditioning_embedding_num_channels"] = (input_param["channels"][0],) + net = ControlNet(**input_param) + with eval_mode(net): + x = torch.rand((1, 1) + (16,) * input_param["spatial_dims"]) + timesteps = torch.randint(0, 1000, (1,)).long() + controlnet_cond = torch.rand((1, 1) + (16,) * input_param["spatial_dims"]) + result = net.forward(x, timesteps=timesteps, controlnet_cond=controlnet_cond, context=torch.rand((1, 1, 3))) + self.assertEqual(len(result[0]), 2 * len(input_param["channels"])) + self.assertEqual(result[1].shape, expected_output_shape) + + @skipUnless(has_einops, "Requires einops") + def test_compatibility_with_monai_generative(self): + # test loading weights from a model saved in MONAI Generative, version 0.2.3 + with skip_if_downloading_fails(): + net = ControlNet( + spatial_dims=2, + in_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, True), + norm_num_groups=8, + with_conditioning=True, + transformer_num_layers=1, + cross_attention_dim=3, + resblock_updown=True, + ) + + tmpdir = tempfile.mkdtemp() + key = "controlnet_monai_generative_weights" + url = testing_data_config("models", key, "url") + hash_type = testing_data_config("models", key, "hash_type") + hash_val = testing_data_config("models", key, "hash_val") + filename = "controlnet_monai_generative_weights.pt" + + weight_path = os.path.join(tmpdir, filename) + download_url(url=url, filepath=weight_path, hash_val=hash_val, hash_type=hash_type) + + net.load_old_state_dict(torch.load(weight_path), verbose=False) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_controlnet_inferers.py b/tests/test_controlnet_inferers.py new file mode 100644 index 0000000000..e3b0aeb5a2 --- /dev/null +++ b/tests/test_controlnet_inferers.py @@ -0,0 +1,1310 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest +from unittest import skipUnless + +import torch +from parameterized import parameterized + +from monai.inferers import ControlNetDiffusionInferer, ControlNetLatentDiffusionInferer +from monai.networks.nets import ( + VQVAE, + AutoencoderKL, + ControlNet, + DiffusionModelUNet, + SPADEAutoencoderKL, + SPADEDiffusionModelUNet, +) +from monai.networks.schedulers import DDIMScheduler, DDPMScheduler +from monai.utils import optional_import + +_, has_scipy = optional_import("scipy") +_, has_einops = optional_import("einops") + + +CNDM_TEST_CASES = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": [8], + "norm_num_groups": 8, + "attention_levels": [True], + "num_res_blocks": 1, + "num_head_channels": 8, + }, + { + "spatial_dims": 2, + "in_channels": 1, + "channels": [8], + "attention_levels": [True], + "norm_num_groups": 8, + "num_res_blocks": 1, + "num_head_channels": 8, + "conditioning_embedding_num_channels": [16], + "conditioning_embedding_in_channels": 1, + }, + (2, 1, 8, 8), + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "channels": [8], + "norm_num_groups": 8, + "attention_levels": [True], + "num_res_blocks": 1, + "num_head_channels": 8, + }, + { + "spatial_dims": 3, + "in_channels": 1, + "channels": [8], + "attention_levels": [True], + "num_res_blocks": 1, + "norm_num_groups": 8, + "num_head_channels": 8, + "conditioning_embedding_num_channels": [16], + "conditioning_embedding_in_channels": 1, + }, + (2, 1, 8, 8, 8), + ], +] +LATENT_CNDM_TEST_CASES = [ + [ + "AutoencoderKL", + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4), + "latent_channels": 3, + "attention_levels": [False, False], + "num_res_blocks": 1, + "with_encoder_nonlocal_attn": False, + "with_decoder_nonlocal_attn": False, + "norm_num_groups": 4, + }, + "DiffusionModelUNet", + { + "spatial_dims": 2, + "in_channels": 3, + "out_channels": 3, + "channels": [4, 4], + "norm_num_groups": 4, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 4, + }, + { + "spatial_dims": 2, + "in_channels": 3, + "channels": [4, 4], + "attention_levels": [False, False], + "num_res_blocks": 1, + "norm_num_groups": 4, + "num_head_channels": 4, + "conditioning_embedding_num_channels": [16], + "conditioning_embedding_in_channels": 1, + }, + (1, 1, 8, 8), + (1, 3, 4, 4), + ], + [ + "VQVAE", + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": [4, 4], + "num_res_layers": 1, + "num_res_channels": [4, 4], + "downsample_parameters": ((2, 4, 1, 1), (2, 4, 1, 1)), + "upsample_parameters": ((2, 4, 1, 1, 0), (2, 4, 1, 1, 0)), + "num_embeddings": 16, + "embedding_dim": 3, + }, + "DiffusionModelUNet", + { + "spatial_dims": 2, + "in_channels": 3, + "out_channels": 3, + "channels": [8, 8], + "norm_num_groups": 8, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 8, + }, + { + "spatial_dims": 2, + "in_channels": 3, + "channels": [8, 8], + "attention_levels": [False, False], + "num_res_blocks": 1, + "norm_num_groups": 8, + "num_head_channels": 8, + "conditioning_embedding_num_channels": [16], + "conditioning_embedding_in_channels": 1, + }, + (1, 1, 16, 16), + (1, 3, 4, 4), + ], + [ + "VQVAE", + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "channels": [4, 4], + "num_res_layers": 1, + "num_res_channels": [4, 4], + "downsample_parameters": ((2, 4, 1, 1), (2, 4, 1, 1)), + "upsample_parameters": ((2, 4, 1, 1, 0), (2, 4, 1, 1, 0)), + "num_embeddings": 16, + "embedding_dim": 3, + }, + "DiffusionModelUNet", + { + "spatial_dims": 3, + "in_channels": 3, + "out_channels": 3, + "channels": [8, 8], + "norm_num_groups": 8, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 8, + }, + { + "spatial_dims": 3, + "in_channels": 3, + "channels": [8, 8], + "attention_levels": [False, False], + "num_res_blocks": 1, + "norm_num_groups": 8, + "num_head_channels": 8, + "conditioning_embedding_num_channels": [16], + "conditioning_embedding_in_channels": 1, + }, + (1, 1, 16, 16, 16), + (1, 3, 4, 4, 4), + ], +] +LATENT_CNDM_TEST_CASES_DIFF_SHAPES = [ + [ + "AutoencoderKL", + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4), + "latent_channels": 3, + "attention_levels": [False, False], + "num_res_blocks": 1, + "with_encoder_nonlocal_attn": False, + "with_decoder_nonlocal_attn": False, + "norm_num_groups": 4, + }, + "DiffusionModelUNet", + { + "spatial_dims": 2, + "in_channels": 3, + "out_channels": 3, + "channels": [4, 4], + "norm_num_groups": 4, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 4, + }, + { + "spatial_dims": 2, + "in_channels": 3, + "channels": [4, 4], + "attention_levels": [False, False], + "num_res_blocks": 1, + "norm_num_groups": 4, + "num_head_channels": 4, + "conditioning_embedding_num_channels": [16], + "conditioning_embedding_in_channels": 1, + }, + (1, 1, 12, 12), + (1, 3, 8, 8), + ], + [ + "VQVAE", + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": [4, 4], + "num_res_layers": 1, + "num_res_channels": [4, 4], + "downsample_parameters": ((2, 4, 1, 1), (2, 4, 1, 1)), + "upsample_parameters": ((2, 4, 1, 1, 0), (2, 4, 1, 1, 0)), + "num_embeddings": 16, + "embedding_dim": 3, + }, + "DiffusionModelUNet", + { + "spatial_dims": 2, + "in_channels": 3, + "out_channels": 3, + "channels": [8, 8], + "norm_num_groups": 8, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 8, + }, + { + "spatial_dims": 2, + "in_channels": 3, + "channels": [8, 8], + "attention_levels": [False, False], + "num_res_blocks": 1, + "norm_num_groups": 8, + "num_head_channels": 8, + "conditioning_embedding_num_channels": [16], + "conditioning_embedding_in_channels": 1, + }, + (1, 1, 12, 12), + (1, 3, 8, 8), + ], + [ + "VQVAE", + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "channels": [4, 4], + "num_res_layers": 1, + "num_res_channels": [4, 4], + "downsample_parameters": ((2, 4, 1, 1), (2, 4, 1, 1)), + "upsample_parameters": ((2, 4, 1, 1, 0), (2, 4, 1, 1, 0)), + "num_embeddings": 16, + "embedding_dim": 3, + }, + "DiffusionModelUNet", + { + "spatial_dims": 3, + "in_channels": 3, + "out_channels": 3, + "channels": [8, 8], + "norm_num_groups": 8, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 8, + }, + { + "spatial_dims": 3, + "in_channels": 3, + "channels": [8, 8], + "attention_levels": [False, False], + "num_res_blocks": 1, + "norm_num_groups": 8, + "num_head_channels": 8, + "conditioning_embedding_num_channels": [16], + "conditioning_embedding_in_channels": 1, + }, + (1, 1, 12, 12, 12), + (1, 3, 8, 8, 8), + ], + [ + "SPADEAutoencoderKL", + { + "spatial_dims": 2, + "label_nc": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4), + "latent_channels": 3, + "attention_levels": [False, False], + "num_res_blocks": 1, + "with_encoder_nonlocal_attn": False, + "with_decoder_nonlocal_attn": False, + "norm_num_groups": 4, + }, + "DiffusionModelUNet", + { + "spatial_dims": 2, + "in_channels": 3, + "out_channels": 3, + "channels": [4, 4], + "norm_num_groups": 4, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 4, + }, + { + "spatial_dims": 2, + "in_channels": 3, + "channels": [4, 4], + "attention_levels": [False, False], + "num_res_blocks": 1, + "norm_num_groups": 4, + "num_head_channels": 4, + "conditioning_embedding_num_channels": [16], + "conditioning_embedding_in_channels": 1, + }, + (1, 1, 8, 8), + (1, 3, 4, 4), + ], + [ + "AutoencoderKL", + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4), + "latent_channels": 3, + "attention_levels": [False, False], + "num_res_blocks": 1, + "with_encoder_nonlocal_attn": False, + "with_decoder_nonlocal_attn": False, + "norm_num_groups": 4, + }, + "SPADEDiffusionModelUNet", + { + "spatial_dims": 2, + "label_nc": 3, + "in_channels": 3, + "out_channels": 3, + "channels": [4, 4], + "norm_num_groups": 4, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 4, + }, + { + "spatial_dims": 2, + "in_channels": 3, + "channels": [4, 4], + "attention_levels": [False, False], + "num_res_blocks": 1, + "norm_num_groups": 4, + "num_head_channels": 4, + "conditioning_embedding_num_channels": [16], + "conditioning_embedding_in_channels": 1, + }, + (1, 1, 8, 8), + (1, 3, 4, 4), + ], + [ + "SPADEAutoencoderKL", + { + "spatial_dims": 2, + "label_nc": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4), + "latent_channels": 3, + "attention_levels": [False, False], + "num_res_blocks": 1, + "with_encoder_nonlocal_attn": False, + "with_decoder_nonlocal_attn": False, + "norm_num_groups": 4, + }, + "SPADEDiffusionModelUNet", + { + "spatial_dims": 2, + "label_nc": 3, + "in_channels": 3, + "out_channels": 3, + "channels": [4, 4], + "norm_num_groups": 4, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 4, + }, + { + "spatial_dims": 2, + "in_channels": 3, + "channels": [4, 4], + "attention_levels": [False, False], + "num_res_blocks": 1, + "norm_num_groups": 4, + "num_head_channels": 4, + "conditioning_embedding_num_channels": [16], + "conditioning_embedding_in_channels": 1, + }, + (1, 1, 8, 8), + (1, 3, 4, 4), + ], +] + + +class ControlNetTestDiffusionSamplingInferer(unittest.TestCase): + @parameterized.expand(CNDM_TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_call(self, model_params, controlnet_params, input_shape): + model = DiffusionModelUNet(**model_params) + controlnet = ControlNet(**controlnet_params) + device = "cuda:0" if torch.cuda.is_available() else "cpu" + model.to(device) + model.eval() + controlnet.to(device) + controlnet.eval() + input = torch.randn(input_shape).to(device) + mask = torch.randn(input_shape).to(device) + noise = torch.randn(input_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = ControlNetDiffusionInferer(scheduler=scheduler) + scheduler.set_timesteps(num_inference_steps=10) + timesteps = torch.randint(0, scheduler.num_train_timesteps, (input_shape[0],), device=input.device).long() + sample = inferer( + inputs=input, noise=noise, diffusion_model=model, controlnet=controlnet, timesteps=timesteps, cn_cond=mask + ) + self.assertEqual(sample.shape, input_shape) + + @parameterized.expand(CNDM_TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_sample_intermediates(self, model_params, controlnet_params, input_shape): + model = DiffusionModelUNet(**model_params) + controlnet = ControlNet(**controlnet_params) + device = "cuda:0" if torch.cuda.is_available() else "cpu" + model.to(device) + model.eval() + controlnet.to(device) + controlnet.eval() + noise = torch.randn(input_shape).to(device) + mask = torch.randn(input_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = ControlNetDiffusionInferer(scheduler=scheduler) + scheduler.set_timesteps(num_inference_steps=10) + sample, intermediates = inferer.sample( + input_noise=noise, + diffusion_model=model, + scheduler=scheduler, + controlnet=controlnet, + cn_cond=mask, + save_intermediates=True, + intermediate_steps=1, + ) + self.assertEqual(len(intermediates), 10) + + @parameterized.expand(CNDM_TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_ddpm_sampler(self, model_params, controlnet_params, input_shape): + model = DiffusionModelUNet(**model_params) + controlnet = ControlNet(**controlnet_params) + device = "cuda:0" if torch.cuda.is_available() else "cpu" + model.to(device) + model.eval() + controlnet.to(device) + controlnet.eval() + mask = torch.randn(input_shape).to(device) + noise = torch.randn(input_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=1000) + inferer = ControlNetDiffusionInferer(scheduler=scheduler) + scheduler.set_timesteps(num_inference_steps=10) + sample, intermediates = inferer.sample( + input_noise=noise, + diffusion_model=model, + scheduler=scheduler, + controlnet=controlnet, + cn_cond=mask, + save_intermediates=True, + intermediate_steps=1, + ) + self.assertEqual(len(intermediates), 10) + + @parameterized.expand(CNDM_TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_ddim_sampler(self, model_params, controlnet_params, input_shape): + model = DiffusionModelUNet(**model_params) + controlnet = ControlNet(**controlnet_params) + device = "cuda:0" if torch.cuda.is_available() else "cpu" + model.to(device) + model.eval() + controlnet.to(device) + controlnet.eval() + mask = torch.randn(input_shape).to(device) + noise = torch.randn(input_shape).to(device) + scheduler = DDIMScheduler(num_train_timesteps=1000) + inferer = ControlNetDiffusionInferer(scheduler=scheduler) + scheduler.set_timesteps(num_inference_steps=10) + sample, intermediates = inferer.sample( + input_noise=noise, + diffusion_model=model, + scheduler=scheduler, + controlnet=controlnet, + cn_cond=mask, + save_intermediates=True, + intermediate_steps=1, + ) + self.assertEqual(len(intermediates), 10) + + @parameterized.expand(CNDM_TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_sampler_conditioned(self, model_params, controlnet_params, input_shape): + model_params["with_conditioning"] = True + model_params["cross_attention_dim"] = 3 + model = DiffusionModelUNet(**model_params) + controlnet = ControlNet(**controlnet_params) + device = "cuda:0" if torch.cuda.is_available() else "cpu" + model.to(device) + model.eval() + controlnet.to(device) + controlnet.eval() + mask = torch.randn(input_shape).to(device) + noise = torch.randn(input_shape).to(device) + scheduler = DDIMScheduler(num_train_timesteps=1000) + inferer = ControlNetDiffusionInferer(scheduler=scheduler) + scheduler.set_timesteps(num_inference_steps=10) + conditioning = torch.randn([input_shape[0], 1, 3]).to(device) + sample, intermediates = inferer.sample( + input_noise=noise, + diffusion_model=model, + controlnet=controlnet, + cn_cond=mask, + scheduler=scheduler, + save_intermediates=True, + intermediate_steps=1, + conditioning=conditioning, + ) + self.assertEqual(len(intermediates), 10) + + @parameterized.expand(CNDM_TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_get_likelihood(self, model_params, controlnet_params, input_shape): + model = DiffusionModelUNet(**model_params) + device = "cuda:0" if torch.cuda.is_available() else "cpu" + model.to(device) + model.eval() + controlnet = ControlNet(**controlnet_params) + controlnet.to(device) + controlnet.eval() + input = torch.randn(input_shape).to(device) + mask = torch.randn(input_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = ControlNetDiffusionInferer(scheduler=scheduler) + scheduler.set_timesteps(num_inference_steps=10) + likelihood, intermediates = inferer.get_likelihood( + inputs=input, + diffusion_model=model, + scheduler=scheduler, + controlnet=controlnet, + cn_cond=mask, + save_intermediates=True, + ) + self.assertEqual(intermediates[0].shape, input.shape) + self.assertEqual(likelihood.shape[0], input.shape[0]) + + @unittest.skipUnless(has_scipy, "Requires scipy library.") + def test_normal_cdf(self): + from scipy.stats import norm + + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = ControlNetDiffusionInferer(scheduler=scheduler) + x = torch.linspace(-10, 10, 20) + cdf_approx = inferer._approx_standard_normal_cdf(x) + cdf_true = norm.cdf(x) + torch.testing.assert_allclose(cdf_approx, cdf_true, atol=1e-3, rtol=1e-5) + + @parameterized.expand(CNDM_TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_sampler_conditioned_concat(self, model_params, controlnet_params, input_shape): + # copy the model_params dict to prevent from modifying test cases + model_params = model_params.copy() + n_concat_channel = 2 + model_params["in_channels"] = model_params["in_channels"] + n_concat_channel + model_params["cross_attention_dim"] = None + model_params["with_conditioning"] = False + model = DiffusionModelUNet(**model_params) + device = "cuda:0" if torch.cuda.is_available() else "cpu" + model.to(device) + model.eval() + controlnet = ControlNet(**controlnet_params) + controlnet.to(device) + controlnet.eval() + noise = torch.randn(input_shape).to(device) + mask = torch.randn(input_shape).to(device) + conditioning_shape = list(input_shape) + conditioning_shape[1] = n_concat_channel + conditioning = torch.randn(conditioning_shape).to(device) + scheduler = DDIMScheduler(num_train_timesteps=1000) + inferer = ControlNetDiffusionInferer(scheduler=scheduler) + scheduler.set_timesteps(num_inference_steps=10) + sample, intermediates = inferer.sample( + input_noise=noise, + diffusion_model=model, + controlnet=controlnet, + cn_cond=mask, + scheduler=scheduler, + save_intermediates=True, + intermediate_steps=1, + conditioning=conditioning, + mode="concat", + ) + self.assertEqual(len(intermediates), 10) + + +class LatentControlNetTestDiffusionSamplingInferer(unittest.TestCase): + @parameterized.expand(LATENT_CNDM_TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_prediction_shape( + self, + ae_model_type, + autoencoder_params, + dm_model_type, + stage_2_params, + controlnet_params, + input_shape, + latent_shape, + ): + stage_1 = None + + if ae_model_type == "AutoencoderKL": + stage_1 = AutoencoderKL(**autoencoder_params) + if ae_model_type == "VQVAE": + stage_1 = VQVAE(**autoencoder_params) + if dm_model_type == "SPADEDiffusionModelUNet": + stage_2 = SPADEDiffusionModelUNet(**stage_2_params) + else: + stage_2 = DiffusionModelUNet(**stage_2_params) + controlnet = ControlNet(**controlnet_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + controlnet.to(device) + stage_1.eval() + stage_2.eval() + controlnet.eval() + + input = torch.randn(input_shape).to(device) + mask = torch.randn(input_shape).to(device) + noise = torch.randn(latent_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = ControlNetLatentDiffusionInferer(scheduler=scheduler, scale_factor=1.0) + scheduler.set_timesteps(num_inference_steps=10) + timesteps = torch.randint(0, scheduler.num_train_timesteps, (input_shape[0],), device=input.device).long() + + if dm_model_type == "SPADEDiffusionModelUNet": + input_shape_seg = list(input_shape) + if "label_nc" in stage_2_params.keys(): + input_shape_seg[1] = stage_2_params["label_nc"] + else: + input_shape_seg[1] = autoencoder_params["label_nc"] + input_seg = torch.randn(input_shape_seg).to(device) + prediction = inferer( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + controlnet=controlnet, + cn_cond=mask, + seg=input_seg, + noise=noise, + timesteps=timesteps, + ) + else: + prediction = inferer( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + noise=noise, + timesteps=timesteps, + controlnet=controlnet, + cn_cond=mask, + ) + self.assertEqual(prediction.shape, latent_shape) + + @parameterized.expand(LATENT_CNDM_TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_sample_shape( + self, + ae_model_type, + autoencoder_params, + dm_model_type, + stage_2_params, + controlnet_params, + input_shape, + latent_shape, + ): + stage_1 = None + + if ae_model_type == "AutoencoderKL": + stage_1 = AutoencoderKL(**autoencoder_params) + if ae_model_type == "VQVAE": + stage_1 = VQVAE(**autoencoder_params) + if dm_model_type == "SPADEDiffusionModelUNet": + stage_2 = SPADEDiffusionModelUNet(**stage_2_params) + else: + stage_2 = DiffusionModelUNet(**stage_2_params) + controlnet = ControlNet(**controlnet_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + controlnet.to(device) + stage_1.eval() + stage_2.eval() + controlnet.eval() + + noise = torch.randn(latent_shape).to(device) + mask = torch.randn(input_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = ControlNetLatentDiffusionInferer(scheduler=scheduler, scale_factor=1.0) + scheduler.set_timesteps(num_inference_steps=10) + + if ae_model_type == "SPADEAutoencoderKL" or dm_model_type == "SPADEDiffusionModelUNet": + input_shape_seg = list(input_shape) + if "label_nc" in stage_2_params.keys(): + input_shape_seg[1] = stage_2_params["label_nc"] + else: + input_shape_seg[1] = autoencoder_params["label_nc"] + input_seg = torch.randn(input_shape_seg).to(device) + sample = inferer.sample( + input_noise=noise, + autoencoder_model=stage_1, + diffusion_model=stage_2, + controlnet=controlnet, + cn_cond=mask, + scheduler=scheduler, + seg=input_seg, + ) + else: + sample = inferer.sample( + input_noise=noise, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + controlnet=controlnet, + cn_cond=mask, + ) + self.assertEqual(sample.shape, input_shape) + + @parameterized.expand(LATENT_CNDM_TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_sample_intermediates( + self, + ae_model_type, + autoencoder_params, + dm_model_type, + stage_2_params, + controlnet_params, + input_shape, + latent_shape, + ): + stage_1 = None + + if ae_model_type == "AutoencoderKL": + stage_1 = AutoencoderKL(**autoencoder_params) + if ae_model_type == "VQVAE": + stage_1 = VQVAE(**autoencoder_params) + if ae_model_type == "SPADEAutoencoderKL": + stage_1 = SPADEAutoencoderKL(**autoencoder_params) + if dm_model_type == "SPADEDiffusionModelUNet": + stage_2 = SPADEDiffusionModelUNet(**stage_2_params) + else: + stage_2 = DiffusionModelUNet(**stage_2_params) + controlnet = ControlNet(**controlnet_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + controlnet.to(device) + stage_1.eval() + stage_2.eval() + controlnet.eval() + + noise = torch.randn(latent_shape).to(device) + mask = torch.randn(input_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = ControlNetLatentDiffusionInferer(scheduler=scheduler, scale_factor=1.0) + scheduler.set_timesteps(num_inference_steps=10) + + if ae_model_type == "SPADEAutoencoderKL" or dm_model_type == "SPADEDiffusionModelUNet": + input_shape_seg = list(input_shape) + if "label_nc" in stage_2_params.keys(): + input_shape_seg[1] = stage_2_params["label_nc"] + else: + input_shape_seg[1] = autoencoder_params["label_nc"] + input_seg = torch.randn(input_shape_seg).to(device) + sample = inferer.sample( + input_noise=noise, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + seg=input_seg, + controlnet=controlnet, + cn_cond=mask, + ) + + # TODO: this isn't correct, should the above produce intermediates as well? + # This test has always passed so is this branch not being used? + intermediates = None + else: + sample, intermediates = inferer.sample( + input_noise=noise, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + save_intermediates=True, + intermediate_steps=1, + controlnet=controlnet, + cn_cond=mask, + ) + + self.assertEqual(len(intermediates), 10) + self.assertEqual(intermediates[0].shape, input_shape) + + @parameterized.expand(LATENT_CNDM_TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_get_likelihoods( + self, + ae_model_type, + autoencoder_params, + dm_model_type, + stage_2_params, + controlnet_params, + input_shape, + latent_shape, + ): + stage_1 = None + + if ae_model_type == "AutoencoderKL": + stage_1 = AutoencoderKL(**autoencoder_params) + if ae_model_type == "VQVAE": + stage_1 = VQVAE(**autoencoder_params) + if ae_model_type == "SPADEAutoencoderKL": + stage_1 = SPADEAutoencoderKL(**autoencoder_params) + if dm_model_type == "SPADEDiffusionModelUNet": + stage_2 = SPADEDiffusionModelUNet(**stage_2_params) + else: + stage_2 = DiffusionModelUNet(**stage_2_params) + controlnet = ControlNet(**controlnet_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + controlnet.to(device) + stage_1.eval() + stage_2.eval() + controlnet.eval() + + input = torch.randn(input_shape).to(device) + mask = torch.randn(input_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = ControlNetLatentDiffusionInferer(scheduler=scheduler, scale_factor=1.0) + scheduler.set_timesteps(num_inference_steps=10) + + if dm_model_type == "SPADEDiffusionModelUNet": + input_shape_seg = list(input_shape) + if "label_nc" in stage_2_params.keys(): + input_shape_seg[1] = stage_2_params["label_nc"] + else: + input_shape_seg[1] = autoencoder_params["label_nc"] + input_seg = torch.randn(input_shape_seg).to(device) + sample, intermediates = inferer.get_likelihood( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + controlnet=controlnet, + cn_cond=mask, + scheduler=scheduler, + save_intermediates=True, + seg=input_seg, + ) + else: + sample, intermediates = inferer.get_likelihood( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + controlnet=controlnet, + cn_cond=mask, + save_intermediates=True, + ) + self.assertEqual(len(intermediates), 10) + self.assertEqual(intermediates[0].shape, latent_shape) + + @parameterized.expand(LATENT_CNDM_TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_resample_likelihoods( + self, + ae_model_type, + autoencoder_params, + dm_model_type, + stage_2_params, + controlnet_params, + input_shape, + latent_shape, + ): + stage_1 = None + + if ae_model_type == "AutoencoderKL": + stage_1 = AutoencoderKL(**autoencoder_params) + if ae_model_type == "VQVAE": + stage_1 = VQVAE(**autoencoder_params) + if ae_model_type == "SPADEAutoencoderKL": + stage_1 = SPADEAutoencoderKL(**autoencoder_params) + if dm_model_type == "SPADEDiffusionModelUNet": + stage_2 = SPADEDiffusionModelUNet(**stage_2_params) + else: + stage_2 = DiffusionModelUNet(**stage_2_params) + controlnet = ControlNet(**controlnet_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + controlnet.to(device) + stage_1.eval() + stage_2.eval() + controlnet.eval() + + input = torch.randn(input_shape).to(device) + mask = torch.randn(input_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = ControlNetLatentDiffusionInferer(scheduler=scheduler, scale_factor=1.0) + scheduler.set_timesteps(num_inference_steps=10) + + if dm_model_type == "SPADEDiffusionModelUNet": + input_shape_seg = list(input_shape) + if "label_nc" in stage_2_params.keys(): + input_shape_seg[1] = stage_2_params["label_nc"] + else: + input_shape_seg[1] = autoencoder_params["label_nc"] + input_seg = torch.randn(input_shape_seg).to(device) + sample, intermediates = inferer.get_likelihood( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + controlnet=controlnet, + cn_cond=mask, + save_intermediates=True, + resample_latent_likelihoods=True, + seg=input_seg, + ) + else: + sample, intermediates = inferer.get_likelihood( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + controlnet=controlnet, + cn_cond=mask, + save_intermediates=True, + resample_latent_likelihoods=True, + ) + self.assertEqual(len(intermediates), 10) + self.assertEqual(intermediates[0].shape[2:], input_shape[2:]) + + @parameterized.expand(LATENT_CNDM_TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_prediction_shape_conditioned_concat( + self, + ae_model_type, + autoencoder_params, + dm_model_type, + stage_2_params, + controlnet_params, + input_shape, + latent_shape, + ): + stage_1 = None + + if ae_model_type == "AutoencoderKL": + stage_1 = AutoencoderKL(**autoencoder_params) + if ae_model_type == "VQVAE": + stage_1 = VQVAE(**autoencoder_params) + if ae_model_type == "SPADEAutoencoderKL": + stage_1 = SPADEAutoencoderKL(**autoencoder_params) + stage_2_params = stage_2_params.copy() + n_concat_channel = 3 + stage_2_params["in_channels"] = stage_2_params["in_channels"] + n_concat_channel + if dm_model_type == "SPADEDiffusionModelUNet": + stage_2 = SPADEDiffusionModelUNet(**stage_2_params) + else: + stage_2 = DiffusionModelUNet(**stage_2_params) + controlnet = ControlNet(**controlnet_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + controlnet.to(device) + stage_1.eval() + stage_2.eval() + controlnet.eval() + + input = torch.randn(input_shape).to(device) + mask = torch.randn(input_shape).to(device) + noise = torch.randn(latent_shape).to(device) + conditioning_shape = list(latent_shape) + conditioning_shape[1] = n_concat_channel + conditioning = torch.randn(conditioning_shape).to(device) + + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = ControlNetLatentDiffusionInferer(scheduler=scheduler, scale_factor=1.0) + scheduler.set_timesteps(num_inference_steps=10) + + timesteps = torch.randint(0, scheduler.num_train_timesteps, (input_shape[0],), device=input.device).long() + + if dm_model_type == "SPADEDiffusionModelUNet": + input_shape_seg = list(input_shape) + if "label_nc" in stage_2_params.keys(): + input_shape_seg[1] = stage_2_params["label_nc"] + else: + input_shape_seg[1] = autoencoder_params["label_nc"] + input_seg = torch.randn(input_shape_seg).to(device) + prediction = inferer( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + noise=noise, + controlnet=controlnet, + cn_cond=mask, + timesteps=timesteps, + condition=conditioning, + mode="concat", + seg=input_seg, + ) + else: + prediction = inferer( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + noise=noise, + controlnet=controlnet, + cn_cond=mask, + timesteps=timesteps, + condition=conditioning, + mode="concat", + ) + self.assertEqual(prediction.shape, latent_shape) + + @parameterized.expand(LATENT_CNDM_TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_sample_shape_conditioned_concat( + self, + ae_model_type, + autoencoder_params, + dm_model_type, + stage_2_params, + controlnet_params, + input_shape, + latent_shape, + ): + stage_1 = None + + if ae_model_type == "AutoencoderKL": + stage_1 = AutoencoderKL(**autoencoder_params) + if ae_model_type == "VQVAE": + stage_1 = VQVAE(**autoencoder_params) + if ae_model_type == "SPADEAutoencoderKL": + stage_1 = SPADEAutoencoderKL(**autoencoder_params) + stage_2_params = stage_2_params.copy() + n_concat_channel = 3 + stage_2_params["in_channels"] = stage_2_params["in_channels"] + n_concat_channel + if dm_model_type == "SPADEDiffusionModelUNet": + stage_2 = SPADEDiffusionModelUNet(**stage_2_params) + else: + stage_2 = DiffusionModelUNet(**stage_2_params) + controlnet = ControlNet(**controlnet_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + controlnet.to(device) + stage_1.eval() + stage_2.eval() + controlnet.eval() + + noise = torch.randn(latent_shape).to(device) + mask = torch.randn(input_shape).to(device) + conditioning_shape = list(latent_shape) + conditioning_shape[1] = n_concat_channel + conditioning = torch.randn(conditioning_shape).to(device) + + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = ControlNetLatentDiffusionInferer(scheduler=scheduler, scale_factor=1.0) + scheduler.set_timesteps(num_inference_steps=10) + + if dm_model_type == "SPADEDiffusionModelUNet": + input_shape_seg = list(input_shape) + if "label_nc" in stage_2_params.keys(): + input_shape_seg[1] = stage_2_params["label_nc"] + else: + input_shape_seg[1] = autoencoder_params["label_nc"] + input_seg = torch.randn(input_shape_seg).to(device) + sample = inferer.sample( + input_noise=noise, + autoencoder_model=stage_1, + diffusion_model=stage_2, + controlnet=controlnet, + cn_cond=mask, + scheduler=scheduler, + conditioning=conditioning, + mode="concat", + seg=input_seg, + ) + else: + sample = inferer.sample( + input_noise=noise, + autoencoder_model=stage_1, + diffusion_model=stage_2, + controlnet=controlnet, + cn_cond=mask, + scheduler=scheduler, + conditioning=conditioning, + mode="concat", + ) + self.assertEqual(sample.shape, input_shape) + + @parameterized.expand(LATENT_CNDM_TEST_CASES_DIFF_SHAPES) + @skipUnless(has_einops, "Requires einops") + def test_sample_shape_different_latents( + self, + ae_model_type, + autoencoder_params, + dm_model_type, + stage_2_params, + controlnet_params, + input_shape, + latent_shape, + ): + stage_1 = None + + if ae_model_type == "AutoencoderKL": + stage_1 = AutoencoderKL(**autoencoder_params) + if ae_model_type == "VQVAE": + stage_1 = VQVAE(**autoencoder_params) + if ae_model_type == "SPADEAutoencoderKL": + stage_1 = SPADEAutoencoderKL(**autoencoder_params) + if dm_model_type == "SPADEDiffusionModelUNet": + stage_2 = SPADEDiffusionModelUNet(**stage_2_params) + else: + stage_2 = DiffusionModelUNet(**stage_2_params) + controlnet = ControlNet(**controlnet_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + controlnet.to(device) + stage_1.eval() + stage_2.eval() + controlnet.eval() + + input = torch.randn(input_shape).to(device) + noise = torch.randn(latent_shape).to(device) + mask = torch.randn(input_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + # We infer the VAE shape + autoencoder_latent_shape = [i // (2 ** (len(autoencoder_params["channels"]) - 1)) for i in input_shape[2:]] + inferer = ControlNetLatentDiffusionInferer( + scheduler=scheduler, + scale_factor=1.0, + ldm_latent_shape=list(latent_shape[2:]), + autoencoder_latent_shape=autoencoder_latent_shape, + ) + scheduler.set_timesteps(num_inference_steps=10) + + timesteps = torch.randint(0, scheduler.num_train_timesteps, (input_shape[0],), device=input.device).long() + + if dm_model_type == "SPADEDiffusionModelUNet": + input_shape_seg = list(input_shape) + if "label_nc" in stage_2_params.keys(): + input_shape_seg[1] = stage_2_params["label_nc"] + else: + input_shape_seg[1] = autoencoder_params["label_nc"] + input_seg = torch.randn(input_shape_seg).to(device) + prediction = inferer( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + controlnet=controlnet, + cn_cond=mask, + noise=noise, + timesteps=timesteps, + seg=input_seg, + ) + else: + prediction = inferer( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + noise=noise, + controlnet=controlnet, + cn_cond=mask, + timesteps=timesteps, + ) + self.assertEqual(prediction.shape, latent_shape) + + @skipUnless(has_einops, "Requires einops") + def test_incompatible_spade_setup(self): + stage_1 = SPADEAutoencoderKL( + spatial_dims=2, + label_nc=6, + in_channels=1, + out_channels=1, + channels=(4, 4), + latent_channels=3, + attention_levels=[False, False], + num_res_blocks=1, + with_encoder_nonlocal_attn=False, + with_decoder_nonlocal_attn=False, + norm_num_groups=4, + ) + stage_2 = SPADEDiffusionModelUNet( + spatial_dims=2, + label_nc=3, + in_channels=3, + out_channels=3, + channels=[4, 4], + norm_num_groups=4, + attention_levels=[False, False], + num_res_blocks=1, + num_head_channels=4, + ) + controlnet = ControlNet( + spatial_dims=2, + in_channels=1, + channels=[4, 4], + norm_num_groups=4, + attention_levels=[False, False], + num_res_blocks=1, + num_head_channels=4, + conditioning_embedding_num_channels=[16], + ) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + controlnet.to(device) + controlnet.to(device) + stage_1.eval() + stage_2.eval() + controlnet.eval() + noise = torch.randn((1, 3, 4, 4)).to(device) + mask = torch.randn((1, 1, 4, 4)).to(device) + input_seg = torch.randn((1, 3, 8, 8)).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = ControlNetLatentDiffusionInferer(scheduler=scheduler, scale_factor=1.0) + scheduler.set_timesteps(num_inference_steps=10) + + with self.assertRaises(ValueError): + _ = inferer.sample( + input_noise=noise, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + controlnet=controlnet, + cn_cond=mask, + seg=input_seg, + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_controlnet_maisi.py b/tests/test_controlnet_maisi.py new file mode 100644 index 0000000000..7b0e69f2c8 --- /dev/null +++ b/tests/test_controlnet_maisi.py @@ -0,0 +1,170 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest +from unittest import skipUnless + +import torch +from parameterized import parameterized + +from monai.networks import eval_mode +from monai.utils import optional_import +from tests.utils import SkipIfBeforePyTorchVersion + +_, has_generative = optional_import("generative") + +if has_generative: + from monai.apps.generation.maisi.networks.controlnet_maisi import ControlNetMaisi + +TEST_CASES = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + "conditioning_embedding_in_channels": 1, + "conditioning_embedding_num_channels": (8, 8), + "use_checkpointing": False, + }, + 6, + (1, 8, 4, 4), + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + "conditioning_embedding_in_channels": 1, + "conditioning_embedding_num_channels": (8, 8), + "use_checkpointing": True, + }, + 6, + (1, 8, 4, 4, 4), + ], +] + +TEST_CASES_CONDITIONAL = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + "conditioning_embedding_in_channels": 1, + "conditioning_embedding_num_channels": (8, 8), + "use_checkpointing": False, + "with_conditioning": True, + "cross_attention_dim": 2, + }, + 6, + (1, 8, 4, 4), + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + "conditioning_embedding_in_channels": 1, + "conditioning_embedding_num_channels": (8, 8), + "use_checkpointing": True, + "with_conditioning": True, + "cross_attention_dim": 2, + }, + 6, + (1, 8, 4, 4, 4), + ], +] + +TEST_CASES_ERROR = [ + [ + {"spatial_dims": 2, "in_channels": 1, "with_conditioning": True, "cross_attention_dim": None}, + "ControlNet expects dimension of the cross-attention conditioning " + "(cross_attention_dim) when using with_conditioning.", + ], + [ + {"spatial_dims": 2, "in_channels": 1, "with_conditioning": False, "cross_attention_dim": 2}, + "ControlNet expects with_conditioning=True when specifying the cross_attention_dim.", + ], + [ + {"spatial_dims": 2, "in_channels": 1, "num_channels": (8, 16), "norm_num_groups": 16}, + "ControlNet expects all num_channels being multiple of norm_num_groups", + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "num_channels": (8, 16), + "attention_levels": (True,), + "norm_num_groups": 8, + }, + "ControlNet expects num_channels being same size of attention_levels", + ], +] + + +@SkipIfBeforePyTorchVersion((2, 0)) +@skipUnless(has_generative, "monai-generative required") +class TestControlNet(unittest.TestCase): + + @parameterized.expand(TEST_CASES) + def test_shape_unconditioned_models(self, input_param, expected_num_down_blocks_residuals, expected_shape): + net = ControlNetMaisi(**input_param) + with eval_mode(net): + x = torch.rand((1, 1, 16, 16)) if input_param["spatial_dims"] == 2 else torch.rand((1, 1, 16, 16, 16)) + timesteps = torch.randint(0, 1000, (1,)).long() + controlnet_cond = ( + torch.rand((1, 1, 32, 32)) if input_param["spatial_dims"] == 2 else torch.rand((1, 1, 32, 32, 32)) + ) + result = net.forward(x, timesteps, controlnet_cond) + self.assertEqual(len(result[0]), expected_num_down_blocks_residuals) + self.assertEqual(result[1].shape, expected_shape) + + @parameterized.expand(TEST_CASES_CONDITIONAL) + def test_shape_conditioned_models(self, input_param, expected_num_down_blocks_residuals, expected_shape): + net = ControlNetMaisi(**input_param) + with eval_mode(net): + x = torch.rand((1, 1, 16, 16)) if input_param["spatial_dims"] == 2 else torch.rand((1, 1, 16, 16, 16)) + timesteps = torch.randint(0, 1000, (1,)).long() + controlnet_cond = ( + torch.rand((1, 1, 32, 32)) if input_param["spatial_dims"] == 2 else torch.rand((1, 1, 32, 32, 32)) + ) + context = torch.randn((1, 1, input_param["cross_attention_dim"])) + result = net.forward(x, timesteps, controlnet_cond, context=context) + self.assertEqual(len(result[0]), expected_num_down_blocks_residuals) + self.assertEqual(result[1].shape, expected_shape) + + @parameterized.expand(TEST_CASES_ERROR) + def test_error_input(self, input_param, expected_error): + with self.assertRaises(ValueError) as context: # output shape too small + _ = ControlNetMaisi(**input_param) + runtime_error = context.exception + self.assertEqual(str(runtime_error), expected_error) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_convert_to_onnx.py b/tests/test_convert_to_onnx.py index 398d260c52..798c510800 100644 --- a/tests/test_convert_to_onnx.py +++ b/tests/test_convert_to_onnx.py @@ -12,6 +12,7 @@ from __future__ import annotations import itertools +import platform import unittest import torch @@ -29,6 +30,12 @@ TESTS = list(itertools.product(TORCH_DEVICE_OPTIONS, [True, False], [True, False])) TESTS_ORT = list(itertools.product(TORCH_DEVICE_OPTIONS, [True])) +ON_AARCH64 = platform.machine() == "aarch64" +if ON_AARCH64: + rtol, atol = 1e-1, 1e-2 +else: + rtol, atol = 1e-3, 1e-4 + onnx, _ = optional_import("onnx") @@ -56,8 +63,8 @@ def test_unet(self, device, use_trace, use_ort): device=device, use_ort=use_ort, use_trace=use_trace, - rtol=1e-3, - atol=1e-4, + rtol=rtol, + atol=atol, ) else: # https://github.com/pytorch/pytorch/blob/release/1.9/torch/onnx/__init__.py#L182 @@ -72,8 +79,8 @@ def test_unet(self, device, use_trace, use_ort): device=device, use_ort=use_ort, use_trace=use_trace, - rtol=1e-3, - atol=1e-4, + rtol=rtol, + atol=atol, ) self.assertTrue(isinstance(onnx_model, onnx.ModelProto)) @@ -107,8 +114,8 @@ def test_seg_res_net(self, device, use_ort): device=device, use_ort=use_ort, use_trace=True, - rtol=1e-3, - atol=1e-4, + rtol=rtol, + atol=atol, ) self.assertTrue(isinstance(onnx_model, onnx.ModelProto)) diff --git a/tests/test_crossattention.py b/tests/test_crossattention.py new file mode 100644 index 0000000000..4ab0ab1823 --- /dev/null +++ b/tests/test_crossattention.py @@ -0,0 +1,131 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest +from unittest import skipUnless + +import numpy as np +import torch +from parameterized import parameterized + +from monai.networks import eval_mode +from monai.networks.blocks.crossattention import CrossAttentionBlock +from monai.networks.layers.factories import RelPosEmbedding +from monai.utils import optional_import + +einops, has_einops = optional_import("einops") + +TEST_CASE_CABLOCK = [] +for dropout_rate in np.linspace(0, 1, 4): + for hidden_size in [360, 480, 600, 768]: + for num_heads in [4, 6, 8, 12]: + for rel_pos_embedding in [None, RelPosEmbedding.DECOMPOSED]: + for input_size in [(16, 32), (8, 8, 8)]: + test_case = [ + { + "hidden_size": hidden_size, + "num_heads": num_heads, + "dropout_rate": dropout_rate, + "rel_pos_embedding": rel_pos_embedding, + "input_size": input_size, + }, + (2, 512, hidden_size), + (2, 512, hidden_size), + ] + TEST_CASE_CABLOCK.append(test_case) + + +class TestResBlock(unittest.TestCase): + + @parameterized.expand(TEST_CASE_CABLOCK) + @skipUnless(has_einops, "Requires einops") + def test_shape(self, input_param, input_shape, expected_shape): + net = CrossAttentionBlock(**input_param) + with eval_mode(net): + result = net(torch.randn(input_shape), context=torch.randn(2, 512, input_param["hidden_size"])) + self.assertEqual(result.shape, expected_shape) + + def test_ill_arg(self): + with self.assertRaises(ValueError): + CrossAttentionBlock(hidden_size=128, num_heads=12, dropout_rate=6.0) + + with self.assertRaises(ValueError): + CrossAttentionBlock(hidden_size=620, num_heads=8, dropout_rate=0.4) + + @skipUnless(has_einops, "Requires einops") + def test_attention_dim_not_multiple_of_heads(self): + with self.assertRaises(ValueError): + CrossAttentionBlock(hidden_size=128, num_heads=3, dropout_rate=0.1) + + @skipUnless(has_einops, "Requires einops") + def test_inner_dim_different(self): + CrossAttentionBlock(hidden_size=128, num_heads=4, dropout_rate=0.1, dim_head=30) + + def test_causal_no_sequence_length(self): + with self.assertRaises(ValueError): + CrossAttentionBlock(hidden_size=128, num_heads=4, dropout_rate=0.1, causal=True) + + @skipUnless(has_einops, "Requires einops") + def test_causal(self): + block = CrossAttentionBlock( + hidden_size=128, num_heads=1, dropout_rate=0.1, causal=True, sequence_length=16, save_attn=True + ) + input_shape = (1, 16, 128) + block(torch.randn(input_shape)) + # check upper triangular part of the attention matrix is zero + assert torch.triu(block.att_mat, diagonal=1).sum() == 0 + + @skipUnless(has_einops, "Requires einops") + def test_context_input(self): + block = CrossAttentionBlock( + hidden_size=128, num_heads=1, dropout_rate=0.1, causal=True, sequence_length=16, context_input_size=12 + ) + input_shape = (1, 16, 128) + block(torch.randn(input_shape), context=torch.randn(1, 3, 12)) + + @skipUnless(has_einops, "Requires einops") + def test_context_wrong_input_size(self): + block = CrossAttentionBlock( + hidden_size=128, num_heads=1, dropout_rate=0.1, causal=True, sequence_length=16, context_input_size=12 + ) + input_shape = (1, 16, 128) + with self.assertRaises(RuntimeError): + block(torch.randn(input_shape), context=torch.randn(1, 3, 24)) + + @skipUnless(has_einops, "Requires einops") + def test_access_attn_matrix(self): + # input format + hidden_size = 128 + num_heads = 2 + dropout_rate = 0 + input_shape = (2, 256, hidden_size) + + # be not able to access the matrix + no_matrix_acess_blk = CrossAttentionBlock( + hidden_size=hidden_size, num_heads=num_heads, dropout_rate=dropout_rate + ) + no_matrix_acess_blk(torch.randn(input_shape)) + assert isinstance(no_matrix_acess_blk.att_mat, torch.Tensor) + # no of elements is zero + assert no_matrix_acess_blk.att_mat.nelement() == 0 + + # be able to acess the attention matrix + matrix_acess_blk = CrossAttentionBlock( + hidden_size=hidden_size, num_heads=num_heads, dropout_rate=dropout_rate, save_attn=True + ) + matrix_acess_blk(torch.randn(input_shape)) + assert matrix_acess_blk.att_mat.shape == (input_shape[0], input_shape[0], input_shape[1], input_shape[1]) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_cucim_dict_transform.py b/tests/test_cucim_dict_transform.py index d2dcc6aa5f..3c5703a34c 100644 --- a/tests/test_cucim_dict_transform.py +++ b/tests/test_cucim_dict_transform.py @@ -80,8 +80,8 @@ class TestCuCIMDict(unittest.TestCase): def test_tramsforms_numpy_single(self, params, input, expected): input = {"image": input} output = CuCIMd(keys="image", **params)(input)["image"] - self.assertTrue(output.dtype == expected.dtype) - self.assertTrue(isinstance(output, np.ndarray)) + self.assertEqual(output.dtype, expected.dtype) + self.assertIsInstance(output, np.ndarray) cp.testing.assert_allclose(output, expected) @parameterized.expand( @@ -98,8 +98,8 @@ def test_tramsforms_numpy_batch(self, params, input, expected): input = {"image": input[cp.newaxis, ...]} expected = expected[cp.newaxis, ...] output = CuCIMd(keys="image", **params)(input)["image"] - self.assertTrue(output.dtype == expected.dtype) - self.assertTrue(isinstance(output, np.ndarray)) + self.assertEqual(output.dtype, expected.dtype) + self.assertIsInstance(output, np.ndarray) cp.testing.assert_allclose(output, expected) @parameterized.expand( @@ -116,8 +116,8 @@ def test_tramsforms_cupy_single(self, params, input, expected): input = {"image": cp.asarray(input)} expected = cp.asarray(expected) output = CuCIMd(keys="image", **params)(input)["image"] - self.assertTrue(output.dtype == expected.dtype) - self.assertTrue(isinstance(output, cp.ndarray)) + self.assertEqual(output.dtype, expected.dtype) + self.assertIsInstance(output, cp.ndarray) cp.testing.assert_allclose(output, expected) @parameterized.expand( @@ -134,8 +134,8 @@ def test_tramsforms_cupy_batch(self, params, input, expected): input = {"image": cp.asarray(input)[cp.newaxis, ...]} expected = cp.asarray(expected)[cp.newaxis, ...] output = CuCIMd(keys="image", **params)(input)["image"] - self.assertTrue(output.dtype == expected.dtype) - self.assertTrue(isinstance(output, cp.ndarray)) + self.assertEqual(output.dtype, expected.dtype) + self.assertIsInstance(output, cp.ndarray) cp.testing.assert_allclose(output, expected) diff --git a/tests/test_cucim_transform.py b/tests/test_cucim_transform.py index 5f16c11589..162e16b52a 100644 --- a/tests/test_cucim_transform.py +++ b/tests/test_cucim_transform.py @@ -79,8 +79,8 @@ class TestCuCIM(unittest.TestCase): ) def test_tramsforms_numpy_single(self, params, input, expected): output = CuCIM(**params)(input) - self.assertTrue(output.dtype == expected.dtype) - self.assertTrue(isinstance(output, np.ndarray)) + self.assertEqual(output.dtype, expected.dtype) + self.assertIsInstance(output, np.ndarray) cp.testing.assert_allclose(output, expected) @parameterized.expand( @@ -97,8 +97,8 @@ def test_tramsforms_numpy_batch(self, params, input, expected): input = input[cp.newaxis, ...] expected = expected[cp.newaxis, ...] output = CuCIM(**params)(input) - self.assertTrue(output.dtype == expected.dtype) - self.assertTrue(isinstance(output, np.ndarray)) + self.assertEqual(output.dtype, expected.dtype) + self.assertIsInstance(output, np.ndarray) cp.testing.assert_allclose(output, expected) @parameterized.expand( @@ -115,8 +115,8 @@ def test_tramsforms_cupy_single(self, params, input, expected): input = cp.asarray(input) expected = cp.asarray(expected) output = CuCIM(**params)(input) - self.assertTrue(output.dtype == expected.dtype) - self.assertTrue(isinstance(output, cp.ndarray)) + self.assertEqual(output.dtype, expected.dtype) + self.assertIsInstance(output, cp.ndarray) cp.testing.assert_allclose(output, expected) @parameterized.expand( @@ -133,8 +133,8 @@ def test_tramsforms_cupy_batch(self, params, input, expected): input = cp.asarray(input)[cp.newaxis, ...] expected = cp.asarray(expected)[cp.newaxis, ...] output = CuCIM(**params)(input) - self.assertTrue(output.dtype == expected.dtype) - self.assertTrue(isinstance(output, cp.ndarray)) + self.assertEqual(output.dtype, expected.dtype) + self.assertIsInstance(output, cp.ndarray) cp.testing.assert_allclose(output, expected) diff --git a/tests/test_dataset.py b/tests/test_dataset.py index 1398009c63..0d37ae2efd 100644 --- a/tests/test_dataset.py +++ b/tests/test_dataset.py @@ -23,7 +23,7 @@ from parameterized import parameterized from monai.data import Dataset -from monai.transforms import Compose, LoadImaged, SimulateDelayd +from monai.transforms import Compose, Lambda, LoadImage, LoadImaged, SimulateDelay, SimulateDelayd from tests.test_compose import TEST_COMPOSE_LAZY_ON_CALL_LOGGING_TEST_CASES, data_from_keys TEST_CASE_1 = [(128, 128, 128)] @@ -99,6 +99,72 @@ def test_dataset_lazy_on_call(self): data[0, 0:2, 0:2] = 1 +class TestTupleDataset(unittest.TestCase): + + @parameterized.expand([TEST_CASE_1]) + def test_shape(self, expected_shape): + test_image = nib.Nifti1Image(np.random.randint(0, 2, size=[128, 128, 128]).astype(float), np.eye(4)) + with tempfile.TemporaryDirectory() as tempdir: + nib.save(test_image, os.path.join(tempdir, "test_image1.nii.gz")) + nib.save(test_image, os.path.join(tempdir, "test_label1.nii.gz")) + nib.save(test_image, os.path.join(tempdir, "test_image2.nii.gz")) + nib.save(test_image, os.path.join(tempdir, "test_label2.nii.gz")) + test_data = [ + (os.path.join(tempdir, "test_image1.nii.gz"), os.path.join(tempdir, "test_label1.nii.gz")), + (os.path.join(tempdir, "test_image2.nii.gz"), os.path.join(tempdir, "test_label2.nii.gz")), + ] + + test_transform = Compose([LoadImage(), SimulateDelay(delay_time=1e-5)]) + + # Here test_transform is applied element by element for the tuple. + dataset = Dataset(data=test_data, transform=test_transform) + data1 = dataset[0] + data2 = dataset[1] + + # Output is a list/tuple + self.assertTrue(isinstance(data1, (list, tuple))) + self.assertTrue(isinstance(data2, (list, tuple))) + + # Number of elements are 2 + self.assertEqual(len(data1), 2) + self.assertEqual(len(data2), 2) + + # Output shapes are as expected + self.assertTupleEqual(data1[0].shape, expected_shape) + self.assertTupleEqual(data1[1].shape, expected_shape) + self.assertTupleEqual(data2[0].shape, expected_shape) + self.assertTupleEqual(data2[1].shape, expected_shape) + + # Here test_transform is applied to the tuple as a whole. + test_transform = Compose( + [ + # LoadImage creates a channel-stacked image when applied to a tuple + LoadImage(), + # Get the channel-stacked image and the label + Lambda(func=lambda x: (x[0].permute(2, 1, 0), x[1])), + ], + map_items=False, + ) + + dataset = Dataset(data=test_data, transform=test_transform) + data1 = dataset[0] + data2 = dataset[1] + + # Output is a list/tuple + self.assertTrue(isinstance(data1, (list, tuple))) + self.assertTrue(isinstance(data2, (list, tuple))) + + # Number of elements are 2 + self.assertEqual(len(data1), 2) + self.assertEqual(len(data2), 2) + + # Output shapes are as expected + self.assertTupleEqual(data1[0].shape, expected_shape) + self.assertTupleEqual(data1[1].shape, expected_shape) + self.assertTupleEqual(data2[0].shape, expected_shape) + self.assertTupleEqual(data2[1].shape, expected_shape) + + class TestDatsesetWithLazy(unittest.TestCase): LOGGER_NAME = "a_logger_name" diff --git a/tests/test_decathlondataset.py b/tests/test_decathlondataset.py index d220cd9097..70a2a6c06c 100644 --- a/tests/test_decathlondataset.py +++ b/tests/test_decathlondataset.py @@ -80,7 +80,7 @@ def _test_dataset(dataset): self.assertDictEqual(properties["labels"], {"0": "background", "1": "Anterior", "2": "Posterior"}) shutil.rmtree(os.path.join(testing_dir, "Task04_Hippocampus")) - try: + with self.assertRaisesRegex(RuntimeError, "^Cannot find dataset directory"): DecathlonDataset( root_dir=testing_dir, task="Task04_Hippocampus", @@ -88,9 +88,6 @@ def _test_dataset(dataset): section="validation", download=False, ) - except RuntimeError as e: - print(str(e)) - self.assertTrue(str(e).startswith("Cannot find dataset directory")) if __name__ == "__main__": diff --git a/tests/test_detect_envelope.py b/tests/test_detect_envelope.py index e2efefeb77..f9c2b5ac53 100644 --- a/tests/test_detect_envelope.py +++ b/tests/test_detect_envelope.py @@ -147,7 +147,7 @@ def test_value_error(self, arguments, image, method): elif method == "__call__": self.assertRaises(ValueError, DetectEnvelope(**arguments), image) else: - raise ValueError("Expected raising method invalid. Should be __init__ or __call__.") + self.fail("Expected raising method invalid. Should be __init__ or __call__.") @SkipIfModule("torch.fft") diff --git a/tests/test_dice_ce_loss.py b/tests/test_dice_ce_loss.py index 225618ed2c..97c7ae5050 100644 --- a/tests/test_dice_ce_loss.py +++ b/tests/test_dice_ce_loss.py @@ -93,10 +93,20 @@ def test_result(self, input_param, input_data, expected_val): result = diceceloss(**input_data) np.testing.assert_allclose(result.detach().cpu().numpy(), expected_val, atol=1e-4, rtol=1e-4) - # def test_ill_shape(self): - # loss = DiceCELoss() - # with self.assertRaisesRegex(ValueError, ""): - # loss(torch.ones((1, 2, 3)), torch.ones((1, 1, 2, 3))) + def test_ill_shape(self): + loss = DiceCELoss() + with self.assertRaises(AssertionError): + loss.forward(torch.ones((1, 2, 3)), torch.ones((1, 2, 5))) + + def test_ill_shape2(self): + loss = DiceCELoss() + with self.assertRaises(ValueError): + loss.forward(torch.ones((1, 2, 3)), torch.ones((1, 1, 2, 3))) + + def test_ill_shape3(self): + loss = DiceCELoss() + with self.assertRaises(ValueError): + loss.forward(torch.ones((1, 3, 4, 4)), torch.ones((1, 2, 4, 4))) # def test_ill_reduction(self): # with self.assertRaisesRegex(ValueError, ""): diff --git a/tests/test_dice_focal_loss.py b/tests/test_dice_focal_loss.py index 13899da003..f769aac69f 100644 --- a/tests/test_dice_focal_loss.py +++ b/tests/test_dice_focal_loss.py @@ -69,8 +69,18 @@ def test_result_no_onehot_no_bg(self, size, onehot): def test_ill_shape(self): loss = DiceFocalLoss() - with self.assertRaisesRegex(ValueError, ""): - loss(torch.ones((1, 2, 3)), torch.ones((1, 1, 2, 3))) + with self.assertRaises(AssertionError): + loss.forward(torch.ones((1, 2, 3)), torch.ones((1, 2, 5))) + + def test_ill_shape2(self): + loss = DiceFocalLoss() + with self.assertRaises(ValueError): + loss.forward(torch.ones((1, 2, 3)), torch.ones((1, 1, 2, 3))) + + def test_ill_shape3(self): + loss = DiceFocalLoss() + with self.assertRaises(ValueError): + loss.forward(torch.ones((1, 3, 4, 4)), torch.ones((1, 2, 4, 4))) def test_ill_lambda(self): with self.assertRaisesRegex(ValueError, ""): @@ -81,6 +91,35 @@ def test_script(self): test_input = torch.ones(2, 1, 8, 8) test_script_save(loss, test_input, test_input) + @parameterized.expand( + [ + ("sum_None_0.5_0.25", "sum", None, 0.5, 0.25), + ("sum_weight_0.5_0.25", "sum", torch.tensor([1.0, 1.0, 2.0]), 0.5, 0.25), + ("sum_weight_tuple_0.5_0.25", "sum", (3, 2.0, 1), 0.5, 0.25), + ("mean_None_0.5_0.25", "mean", None, 0.5, 0.25), + ("mean_weight_0.5_0.25", "mean", torch.tensor([1.0, 1.0, 2.0]), 0.5, 0.25), + ("mean_weight_tuple_0.5_0.25", "mean", (3, 2.0, 1), 0.5, 0.25), + ("none_None_0.5_0.25", "none", None, 0.5, 0.25), + ("none_weight_0.5_0.25", "none", torch.tensor([1.0, 1.0, 2.0]), 0.5, 0.25), + ("none_weight_tuple_0.5_0.25", "none", (3, 2.0, 1), 0.5, 0.25), + ] + ) + def test_with_alpha(self, name, reduction, weight, lambda_focal, alpha): + size = [3, 3, 5, 5] + label = torch.randint(low=0, high=2, size=size) + pred = torch.randn(size) + + common_params = {"include_background": True, "to_onehot_y": False, "reduction": reduction, "weight": weight} + + dice_focal = DiceFocalLoss(gamma=1.0, lambda_focal=lambda_focal, alpha=alpha, **common_params) + dice = DiceLoss(**common_params) + focal = FocalLoss(gamma=1.0, alpha=alpha, **common_params) + + result = dice_focal(pred, label) + expected_val = dice(pred, label) + lambda_focal * focal(pred, label) + + np.testing.assert_allclose(result, expected_val, err_msg=f"Failed on case: {name}") + if __name__ == "__main__": unittest.main() diff --git a/tests/test_diffusion_inferer.py b/tests/test_diffusion_inferer.py new file mode 100644 index 0000000000..7f37025d3c --- /dev/null +++ b/tests/test_diffusion_inferer.py @@ -0,0 +1,236 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest +from unittest import skipUnless + +import torch +from parameterized import parameterized + +from monai.inferers import DiffusionInferer +from monai.networks.nets import DiffusionModelUNet +from monai.networks.schedulers import DDIMScheduler, DDPMScheduler +from monai.utils import optional_import + +_, has_scipy = optional_import("scipy") +_, has_einops = optional_import("einops") + +TEST_CASES = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": [8], + "norm_num_groups": 8, + "attention_levels": [True], + "num_res_blocks": 1, + "num_head_channels": 8, + }, + (2, 1, 8, 8), + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "channels": [8], + "norm_num_groups": 8, + "attention_levels": [True], + "num_res_blocks": 1, + "num_head_channels": 8, + }, + (2, 1, 8, 8, 8), + ], +] + + +class TestDiffusionSamplingInferer(unittest.TestCase): + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_call(self, model_params, input_shape): + model = DiffusionModelUNet(**model_params) + device = "cuda:0" if torch.cuda.is_available() else "cpu" + model.to(device) + model.eval() + input = torch.randn(input_shape).to(device) + noise = torch.randn(input_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = DiffusionInferer(scheduler=scheduler) + scheduler.set_timesteps(num_inference_steps=10) + timesteps = torch.randint(0, scheduler.num_train_timesteps, (input_shape[0],), device=input.device).long() + sample = inferer(inputs=input, noise=noise, diffusion_model=model, timesteps=timesteps) + self.assertEqual(sample.shape, input_shape) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_sample_intermediates(self, model_params, input_shape): + model = DiffusionModelUNet(**model_params) + device = "cuda:0" if torch.cuda.is_available() else "cpu" + model.to(device) + model.eval() + noise = torch.randn(input_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = DiffusionInferer(scheduler=scheduler) + scheduler.set_timesteps(num_inference_steps=10) + sample, intermediates = inferer.sample( + input_noise=noise, diffusion_model=model, scheduler=scheduler, save_intermediates=True, intermediate_steps=1 + ) + self.assertEqual(len(intermediates), 10) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_ddpm_sampler(self, model_params, input_shape): + model = DiffusionModelUNet(**model_params) + device = "cuda:0" if torch.cuda.is_available() else "cpu" + model.to(device) + model.eval() + noise = torch.randn(input_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=1000) + inferer = DiffusionInferer(scheduler=scheduler) + scheduler.set_timesteps(num_inference_steps=10) + sample, intermediates = inferer.sample( + input_noise=noise, diffusion_model=model, scheduler=scheduler, save_intermediates=True, intermediate_steps=1 + ) + self.assertEqual(len(intermediates), 10) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_ddim_sampler(self, model_params, input_shape): + model = DiffusionModelUNet(**model_params) + device = "cuda:0" if torch.cuda.is_available() else "cpu" + model.to(device) + model.eval() + noise = torch.randn(input_shape).to(device) + scheduler = DDIMScheduler(num_train_timesteps=1000) + inferer = DiffusionInferer(scheduler=scheduler) + scheduler.set_timesteps(num_inference_steps=10) + sample, intermediates = inferer.sample( + input_noise=noise, diffusion_model=model, scheduler=scheduler, save_intermediates=True, intermediate_steps=1 + ) + self.assertEqual(len(intermediates), 10) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_sampler_conditioned(self, model_params, input_shape): + model_params["with_conditioning"] = True + model_params["cross_attention_dim"] = 3 + model = DiffusionModelUNet(**model_params) + device = "cuda:0" if torch.cuda.is_available() else "cpu" + model.to(device) + model.eval() + noise = torch.randn(input_shape).to(device) + scheduler = DDIMScheduler(num_train_timesteps=1000) + inferer = DiffusionInferer(scheduler=scheduler) + scheduler.set_timesteps(num_inference_steps=10) + conditioning = torch.randn([input_shape[0], 1, 3]).to(device) + sample, intermediates = inferer.sample( + input_noise=noise, + diffusion_model=model, + scheduler=scheduler, + save_intermediates=True, + intermediate_steps=1, + conditioning=conditioning, + ) + self.assertEqual(len(intermediates), 10) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_get_likelihood(self, model_params, input_shape): + model = DiffusionModelUNet(**model_params) + device = "cuda:0" if torch.cuda.is_available() else "cpu" + model.to(device) + model.eval() + input = torch.randn(input_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = DiffusionInferer(scheduler=scheduler) + scheduler.set_timesteps(num_inference_steps=10) + likelihood, intermediates = inferer.get_likelihood( + inputs=input, diffusion_model=model, scheduler=scheduler, save_intermediates=True + ) + self.assertEqual(intermediates[0].shape, input.shape) + self.assertEqual(likelihood.shape[0], input.shape[0]) + + @unittest.skipUnless(has_scipy, "Requires scipy library.") + def test_normal_cdf(self): + from scipy.stats import norm + + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = DiffusionInferer(scheduler=scheduler) + + x = torch.linspace(-10, 10, 20) + cdf_approx = inferer._approx_standard_normal_cdf(x) + cdf_true = norm.cdf(x) + torch.testing.assert_allclose(cdf_approx, cdf_true, atol=1e-3, rtol=1e-5) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_sampler_conditioned_concat(self, model_params, input_shape): + # copy the model_params dict to prevent from modifying test cases + model_params = model_params.copy() + n_concat_channel = 2 + model_params["in_channels"] = model_params["in_channels"] + n_concat_channel + model_params["cross_attention_dim"] = None + model_params["with_conditioning"] = False + model = DiffusionModelUNet(**model_params) + device = "cuda:0" if torch.cuda.is_available() else "cpu" + model.to(device) + model.eval() + noise = torch.randn(input_shape).to(device) + conditioning_shape = list(input_shape) + conditioning_shape[1] = n_concat_channel + conditioning = torch.randn(conditioning_shape).to(device) + scheduler = DDIMScheduler(num_train_timesteps=1000) + inferer = DiffusionInferer(scheduler=scheduler) + scheduler.set_timesteps(num_inference_steps=10) + sample, intermediates = inferer.sample( + input_noise=noise, + diffusion_model=model, + scheduler=scheduler, + save_intermediates=True, + intermediate_steps=1, + conditioning=conditioning, + mode="concat", + ) + self.assertEqual(len(intermediates), 10) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_call_conditioned_concat(self, model_params, input_shape): + # copy the model_params dict to prevent from modifying test cases + model_params = model_params.copy() + n_concat_channel = 2 + model_params["in_channels"] = model_params["in_channels"] + n_concat_channel + model_params["cross_attention_dim"] = None + model_params["with_conditioning"] = False + model = DiffusionModelUNet(**model_params) + device = "cuda:0" if torch.cuda.is_available() else "cpu" + model.to(device) + model.eval() + input = torch.randn(input_shape).to(device) + noise = torch.randn(input_shape).to(device) + conditioning_shape = list(input_shape) + conditioning_shape[1] = n_concat_channel + conditioning = torch.randn(conditioning_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = DiffusionInferer(scheduler=scheduler) + scheduler.set_timesteps(num_inference_steps=10) + timesteps = torch.randint(0, scheduler.num_train_timesteps, (input_shape[0],), device=input.device).long() + sample = inferer( + inputs=input, noise=noise, diffusion_model=model, timesteps=timesteps, condition=conditioning, mode="concat" + ) + self.assertEqual(sample.shape, input_shape) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_diffusion_model_unet.py b/tests/test_diffusion_model_unet.py new file mode 100644 index 0000000000..7f764d85de --- /dev/null +++ b/tests/test_diffusion_model_unet.py @@ -0,0 +1,585 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import os +import tempfile +import unittest +from unittest import skipUnless + +import torch +from parameterized import parameterized + +from monai.apps import download_url +from monai.networks import eval_mode +from monai.networks.nets import DiffusionModelUNet +from monai.utils import optional_import +from tests.utils import skip_if_downloading_fails, testing_data_config + +_, has_einops = optional_import("einops") + +UNCOND_CASES_2D = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": (1, 1, 2), + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + "resblock_updown": True, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + "resblock_updown": True, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, True, True), + "num_head_channels": (0, 2, 4), + "norm_num_groups": 8, + } + ], +] + +UNCOND_CASES_3D = [ + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + } + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + "resblock_updown": True, + } + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + } + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + "resblock_updown": True, + } + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + } + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": (0, 0, 4), + "norm_num_groups": 8, + } + ], +] + +COND_CASES_2D = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + "resblock_updown": True, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + "upcast_attention": True, + } + ], +] + +DROPOUT_OK = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + "dropout_cattn": 0.25, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + } + ], +] + +DROPOUT_WRONG = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + "dropout_cattn": 3.0, + } + ] +] + + +class TestDiffusionModelUNet2D(unittest.TestCase): + @parameterized.expand(UNCOND_CASES_2D) + @skipUnless(has_einops, "Requires einops") + def test_shape_unconditioned_models(self, input_param): + net = DiffusionModelUNet(**input_param) + with eval_mode(net): + result = net.forward(torch.rand((1, 1, 16, 16)), torch.randint(0, 1000, (1,)).long()) + self.assertEqual(result.shape, (1, 1, 16, 16)) + + @skipUnless(has_einops, "Requires einops") + def test_timestep_with_wrong_shape(self): + net = DiffusionModelUNet( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, False), + norm_num_groups=8, + ) + with self.assertRaises(ValueError): + with eval_mode(net): + net.forward(torch.rand((1, 1, 16, 16)), torch.randint(0, 1000, (1, 1)).long()) + + @skipUnless(has_einops, "Requires einops") + def test_shape_with_different_in_channel_out_channel(self): + in_channels = 6 + out_channels = 3 + net = DiffusionModelUNet( + spatial_dims=2, + in_channels=in_channels, + out_channels=out_channels, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, False), + norm_num_groups=8, + ) + with eval_mode(net): + result = net.forward(torch.rand((1, in_channels, 16, 16)), torch.randint(0, 1000, (1,)).long()) + self.assertEqual(result.shape, (1, out_channels, 16, 16)) + + def test_model_channels_not_multiple_of_norm_num_group(self): + with self.assertRaises(ValueError): + DiffusionModelUNet( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 12), + attention_levels=(False, False, False), + norm_num_groups=8, + ) + + def test_attention_levels_with_different_length_num_head_channels(self): + with self.assertRaises(ValueError): + DiffusionModelUNet( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, False), + num_head_channels=(0, 2), + norm_num_groups=8, + ) + + def test_num_res_blocks_with_different_length_channels(self): + with self.assertRaises(ValueError): + DiffusionModelUNet( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=(1, 1), + channels=(8, 8, 8), + attention_levels=(False, False, False), + norm_num_groups=8, + ) + + @skipUnless(has_einops, "Requires einops") + def test_shape_conditioned_models(self): + net = DiffusionModelUNet( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, True), + with_conditioning=True, + transformer_num_layers=1, + cross_attention_dim=3, + norm_num_groups=8, + num_head_channels=8, + ) + with eval_mode(net): + result = net.forward( + x=torch.rand((1, 1, 16, 32)), + timesteps=torch.randint(0, 1000, (1,)).long(), + context=torch.rand((1, 1, 3)), + ) + self.assertEqual(result.shape, (1, 1, 16, 32)) + + def test_with_conditioning_cross_attention_dim_none(self): + with self.assertRaises(ValueError): + DiffusionModelUNet( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, True), + with_conditioning=True, + transformer_num_layers=1, + cross_attention_dim=None, + norm_num_groups=8, + ) + + @skipUnless(has_einops, "Requires einops") + def test_context_with_conditioning_none(self): + net = DiffusionModelUNet( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, True), + with_conditioning=False, + transformer_num_layers=1, + norm_num_groups=8, + ) + + with self.assertRaises(ValueError): + with eval_mode(net): + net.forward( + x=torch.rand((1, 1, 16, 32)), + timesteps=torch.randint(0, 1000, (1,)).long(), + context=torch.rand((1, 1, 3)), + ) + + @skipUnless(has_einops, "Requires einops") + def test_shape_conditioned_models_class_conditioning(self): + net = DiffusionModelUNet( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, True), + norm_num_groups=8, + num_head_channels=8, + num_class_embeds=2, + ) + with eval_mode(net): + result = net.forward( + x=torch.rand((1, 1, 16, 32)), + timesteps=torch.randint(0, 1000, (1,)).long(), + class_labels=torch.randint(0, 2, (1,)).long(), + ) + self.assertEqual(result.shape, (1, 1, 16, 32)) + + @skipUnless(has_einops, "Requires einops") + def test_conditioned_models_no_class_labels(self): + net = DiffusionModelUNet( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, True), + norm_num_groups=8, + num_head_channels=8, + num_class_embeds=2, + ) + + with self.assertRaises(ValueError): + net.forward(x=torch.rand((1, 1, 16, 32)), timesteps=torch.randint(0, 1000, (1,)).long()) + + @skipUnless(has_einops, "Requires einops") + def test_model_channels_not_same_size_of_attention_levels(self): + with self.assertRaises(ValueError): + DiffusionModelUNet( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False), + norm_num_groups=8, + num_head_channels=8, + num_class_embeds=2, + ) + + @parameterized.expand(COND_CASES_2D) + @skipUnless(has_einops, "Requires einops") + def test_conditioned_2d_models_shape(self, input_param): + net = DiffusionModelUNet(**input_param) + with eval_mode(net): + result = net.forward(torch.rand((1, 1, 16, 16)), torch.randint(0, 1000, (1,)).long(), torch.rand((1, 1, 3))) + self.assertEqual(result.shape, (1, 1, 16, 16)) + + +class TestDiffusionModelUNet3D(unittest.TestCase): + @parameterized.expand(UNCOND_CASES_3D) + @skipUnless(has_einops, "Requires einops") + def test_shape_unconditioned_models(self, input_param): + net = DiffusionModelUNet(**input_param) + with eval_mode(net): + result = net.forward(torch.rand((1, 1, 16, 16, 16)), torch.randint(0, 1000, (1,)).long()) + self.assertEqual(result.shape, (1, 1, 16, 16, 16)) + + @skipUnless(has_einops, "Requires einops") + def test_shape_with_different_in_channel_out_channel(self): + in_channels = 6 + out_channels = 3 + net = DiffusionModelUNet( + spatial_dims=3, + in_channels=in_channels, + out_channels=out_channels, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, True), + norm_num_groups=4, + ) + with eval_mode(net): + result = net.forward(torch.rand((1, in_channels, 16, 16, 16)), torch.randint(0, 1000, (1,)).long()) + self.assertEqual(result.shape, (1, out_channels, 16, 16, 16)) + + @skipUnless(has_einops, "Requires einops") + def test_shape_conditioned_models(self): + net = DiffusionModelUNet( + spatial_dims=3, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(16, 16, 16), + attention_levels=(False, False, True), + norm_num_groups=16, + with_conditioning=True, + transformer_num_layers=1, + cross_attention_dim=3, + ) + with eval_mode(net): + result = net.forward( + x=torch.rand((1, 1, 16, 16, 16)), + timesteps=torch.randint(0, 1000, (1,)).long(), + context=torch.rand((1, 1, 3)), + ) + self.assertEqual(result.shape, (1, 1, 16, 16, 16)) + + # Test dropout specification for cross-attention blocks + @parameterized.expand(DROPOUT_WRONG) + def test_wrong_dropout(self, input_param): + with self.assertRaises(ValueError): + _ = DiffusionModelUNet(**input_param) + + @parameterized.expand(DROPOUT_OK) + @skipUnless(has_einops, "Requires einops") + def test_right_dropout(self, input_param): + _ = DiffusionModelUNet(**input_param) + + @skipUnless(has_einops, "Requires einops") + def test_compatibility_with_monai_generative(self): + # test loading weights from a model saved in MONAI Generative, version 0.2.3 + with skip_if_downloading_fails(): + net = DiffusionModelUNet( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, True), + with_conditioning=True, + cross_attention_dim=3, + transformer_num_layers=1, + norm_num_groups=8, + ) + + tmpdir = tempfile.mkdtemp() + key = "diffusion_model_unet_monai_generative_weights" + url = testing_data_config("models", key, "url") + hash_type = testing_data_config("models", key, "hash_type") + hash_val = testing_data_config("models", key, "hash_val") + filename = "diffusion_model_unet_monai_generative_weights.pt" + + weight_path = os.path.join(tmpdir, filename) + download_url(url=url, filepath=weight_path, hash_val=hash_val, hash_type=hash_type) + + net.load_old_state_dict(torch.load(weight_path), verbose=False) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_diffusion_model_unet_maisi.py b/tests/test_diffusion_model_unet_maisi.py new file mode 100644 index 0000000000..059a4a4ba8 --- /dev/null +++ b/tests/test_diffusion_model_unet_maisi.py @@ -0,0 +1,593 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest +from unittest import skipUnless + +import torch +from parameterized import parameterized + +from monai.networks import eval_mode +from monai.utils import optional_import + +_, has_einops = optional_import("einops") +_, has_generative = optional_import("generative") + +if has_generative: + from monai.apps.generation.maisi.networks.diffusion_model_unet_maisi import DiffusionModelUNetMaisi + +UNCOND_CASES_2D = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": (1, 1, 2), + "num_channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + "resblock_updown": True, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + "resblock_updown": True, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, True, True), + "num_head_channels": (0, 2, 4), + "norm_num_groups": 8, + } + ], +] + +UNCOND_CASES_3D = [ + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + } + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + "resblock_updown": True, + } + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + } + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + "resblock_updown": True, + } + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + } + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": (0, 0, 4), + "norm_num_groups": 8, + } + ], +] + +COND_CASES_2D = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + "resblock_updown": True, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + "upcast_attention": True, + } + ], +] + +DROPOUT_OK = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + "dropout_cattn": 0.25, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + } + ], +] + +DROPOUT_WRONG = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "num_channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + "dropout_cattn": 3.0, + } + ] +] + + +@skipUnless(has_generative, "monai-generative required") +class TestDiffusionModelUNetMaisi2D(unittest.TestCase): + + @parameterized.expand(UNCOND_CASES_2D) + @skipUnless(has_einops, "Requires einops") + def test_shape_unconditioned_models(self, input_param): + net = DiffusionModelUNetMaisi(**input_param) + with eval_mode(net): + result = net.forward(torch.rand((1, 1, 16, 16)), torch.randint(0, 1000, (1,)).long()) + self.assertEqual(result.shape, (1, 1, 16, 16)) + + @skipUnless(has_einops, "Requires einops") + def test_timestep_with_wrong_shape(self): + net = DiffusionModelUNetMaisi( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + num_channels=(8, 8, 8), + attention_levels=(False, False, False), + norm_num_groups=8, + ) + with self.assertRaises(ValueError): + with eval_mode(net): + net.forward(torch.rand((1, 1, 16, 16)), torch.randint(0, 1000, (1, 1)).long()) + + @skipUnless(has_einops, "Requires einops") + def test_shape_with_different_in_channel_out_channel(self): + in_channels = 6 + out_channels = 3 + net = DiffusionModelUNetMaisi( + spatial_dims=2, + in_channels=in_channels, + out_channels=out_channels, + num_res_blocks=1, + num_channels=(8, 8, 8), + attention_levels=(False, False, False), + norm_num_groups=8, + ) + with eval_mode(net): + result = net.forward(torch.rand((1, in_channels, 16, 16)), torch.randint(0, 1000, (1,)).long()) + self.assertEqual(result.shape, (1, out_channels, 16, 16)) + + def test_model_channels_not_multiple_of_norm_num_group(self): + with self.assertRaises(ValueError): + DiffusionModelUNetMaisi( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + num_channels=(8, 8, 12), + attention_levels=(False, False, False), + norm_num_groups=8, + ) + + def test_attention_levels_with_different_length_num_head_channels(self): + with self.assertRaises(ValueError): + DiffusionModelUNetMaisi( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + num_channels=(8, 8, 8), + attention_levels=(False, False, False), + num_head_channels=(0, 2), + norm_num_groups=8, + ) + + def test_num_res_blocks_with_different_length_channels(self): + with self.assertRaises(ValueError): + DiffusionModelUNetMaisi( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=(1, 1), + num_channels=(8, 8, 8), + attention_levels=(False, False, False), + norm_num_groups=8, + ) + + @skipUnless(has_einops, "Requires einops") + def test_shape_conditioned_models(self): + net = DiffusionModelUNetMaisi( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + num_channels=(8, 8, 8), + attention_levels=(False, False, True), + with_conditioning=True, + transformer_num_layers=1, + cross_attention_dim=3, + norm_num_groups=8, + num_head_channels=8, + ) + with eval_mode(net): + result = net.forward( + x=torch.rand((1, 1, 16, 32)), + timesteps=torch.randint(0, 1000, (1,)).long(), + context=torch.rand((1, 1, 3)), + ) + self.assertEqual(result.shape, (1, 1, 16, 32)) + + def test_with_conditioning_cross_attention_dim_none(self): + with self.assertRaises(ValueError): + DiffusionModelUNetMaisi( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + num_channels=(8, 8, 8), + attention_levels=(False, False, True), + with_conditioning=True, + transformer_num_layers=1, + cross_attention_dim=None, + norm_num_groups=8, + ) + + @skipUnless(has_einops, "Requires einops") + def test_context_with_conditioning_none(self): + net = DiffusionModelUNetMaisi( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + num_channels=(8, 8, 8), + attention_levels=(False, False, True), + with_conditioning=False, + transformer_num_layers=1, + norm_num_groups=8, + ) + + with self.assertRaises(ValueError): + with eval_mode(net): + net.forward( + x=torch.rand((1, 1, 16, 32)), + timesteps=torch.randint(0, 1000, (1,)).long(), + context=torch.rand((1, 1, 3)), + ) + + @skipUnless(has_einops, "Requires einops") + def test_shape_conditioned_models_class_conditioning(self): + net = DiffusionModelUNetMaisi( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + num_channels=(8, 8, 8), + attention_levels=(False, False, True), + norm_num_groups=8, + num_head_channels=8, + num_class_embeds=2, + ) + with eval_mode(net): + result = net.forward( + x=torch.rand((1, 1, 16, 32)), + timesteps=torch.randint(0, 1000, (1,)).long(), + class_labels=torch.randint(0, 2, (1,)).long(), + ) + self.assertEqual(result.shape, (1, 1, 16, 32)) + + @skipUnless(has_einops, "Requires einops") + def test_conditioned_models_no_class_labels(self): + net = DiffusionModelUNetMaisi( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + num_channels=(8, 8, 8), + attention_levels=(False, False, True), + norm_num_groups=8, + num_head_channels=8, + num_class_embeds=2, + ) + + with self.assertRaises(ValueError): + net.forward(x=torch.rand((1, 1, 16, 32)), timesteps=torch.randint(0, 1000, (1,)).long()) + + @skipUnless(has_einops, "Requires einops") + def test_model_channels_not_same_size_of_attention_levels(self): + with self.assertRaises(ValueError): + DiffusionModelUNetMaisi( + spatial_dims=2, + in_channels=1, + out_channels=1, + num_res_blocks=1, + num_channels=(8, 8, 8), + attention_levels=(False, False), + norm_num_groups=8, + num_head_channels=8, + num_class_embeds=2, + ) + + @parameterized.expand(COND_CASES_2D) + @skipUnless(has_einops, "Requires einops") + def test_conditioned_2d_models_shape(self, input_param): + net = DiffusionModelUNetMaisi(**input_param) + with eval_mode(net): + result = net.forward(torch.rand((1, 1, 16, 16)), torch.randint(0, 1000, (1,)).long(), torch.rand((1, 1, 3))) + self.assertEqual(result.shape, (1, 1, 16, 16)) + + @parameterized.expand(UNCOND_CASES_2D) + @skipUnless(has_einops, "Requires einops") + def test_shape_with_additional_inputs(self, input_param): + input_param["include_top_region_index_input"] = True + input_param["include_bottom_region_index_input"] = True + input_param["include_spacing_input"] = True + net = DiffusionModelUNetMaisi(**input_param) + with eval_mode(net): + result = net.forward( + x=torch.rand((1, 1, 16, 16)), + timesteps=torch.randint(0, 1000, (1,)).long(), + top_region_index_tensor=torch.rand((1, 4)), + bottom_region_index_tensor=torch.rand((1, 4)), + spacing_tensor=torch.rand((1, 3)), + ) + self.assertEqual(result.shape, (1, 1, 16, 16)) + + +@skipUnless(has_generative, "monai-generative required") +class TestDiffusionModelUNetMaisi3D(unittest.TestCase): + + @parameterized.expand(UNCOND_CASES_3D) + @skipUnless(has_einops, "Requires einops") + def test_shape_unconditioned_models(self, input_param): + net = DiffusionModelUNetMaisi(**input_param) + with eval_mode(net): + result = net.forward(torch.rand((1, 1, 16, 16, 16)), torch.randint(0, 1000, (1,)).long()) + self.assertEqual(result.shape, (1, 1, 16, 16, 16)) + + @skipUnless(has_einops, "Requires einops") + def test_shape_with_different_in_channel_out_channel(self): + in_channels = 6 + out_channels = 3 + net = DiffusionModelUNetMaisi( + spatial_dims=3, + in_channels=in_channels, + out_channels=out_channels, + num_res_blocks=1, + num_channels=(8, 8, 8), + attention_levels=(False, False, True), + norm_num_groups=4, + ) + with eval_mode(net): + result = net.forward(torch.rand((1, in_channels, 16, 16, 16)), torch.randint(0, 1000, (1,)).long()) + self.assertEqual(result.shape, (1, out_channels, 16, 16, 16)) + + @skipUnless(has_einops, "Requires einops") + def test_shape_conditioned_models(self): + net = DiffusionModelUNetMaisi( + spatial_dims=3, + in_channels=1, + out_channels=1, + num_res_blocks=1, + num_channels=(16, 16, 16), + attention_levels=(False, False, True), + norm_num_groups=16, + with_conditioning=True, + transformer_num_layers=1, + cross_attention_dim=3, + ) + with eval_mode(net): + result = net.forward( + x=torch.rand((1, 1, 16, 16, 16)), + timesteps=torch.randint(0, 1000, (1,)).long(), + context=torch.rand((1, 1, 3)), + ) + self.assertEqual(result.shape, (1, 1, 16, 16, 16)) + + # Test dropout specification for cross-attention blocks + @parameterized.expand(DROPOUT_WRONG) + def test_wrong_dropout(self, input_param): + with self.assertRaises(ValueError): + _ = DiffusionModelUNetMaisi(**input_param) + + @parameterized.expand(DROPOUT_OK) + @skipUnless(has_einops, "Requires einops") + def test_right_dropout(self, input_param): + _ = DiffusionModelUNetMaisi(**input_param) + + @parameterized.expand(UNCOND_CASES_3D) + @skipUnless(has_einops, "Requires einops") + def test_shape_with_additional_inputs(self, input_param): + input_param["include_top_region_index_input"] = True + input_param["include_bottom_region_index_input"] = True + input_param["include_spacing_input"] = True + net = DiffusionModelUNetMaisi(**input_param) + with eval_mode(net): + result = net.forward( + x=torch.rand((1, 1, 16, 16, 16)), + timesteps=torch.randint(0, 1000, (1,)).long(), + top_region_index_tensor=torch.rand((1, 4)), + bottom_region_index_tensor=torch.rand((1, 4)), + spacing_tensor=torch.rand((1, 3)), + ) + self.assertEqual(result.shape, (1, 1, 16, 16, 16)) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_dynunet.py b/tests/test_dynunet.py index b0137ae245..f3c982056c 100644 --- a/tests/test_dynunet.py +++ b/tests/test_dynunet.py @@ -11,6 +11,7 @@ from __future__ import annotations +import platform import unittest from typing import Any, Sequence @@ -24,6 +25,12 @@ InstanceNorm3dNVFuser, _ = optional_import("apex.normalization", name="InstanceNorm3dNVFuser") +ON_AARCH64 = platform.machine() == "aarch64" +if ON_AARCH64: + rtol, atol = 1e-2, 1e-2 +else: + rtol, atol = 1e-4, 1e-4 + device = "cuda" if torch.cuda.is_available() else "cpu" strides: Sequence[Sequence[int] | int] @@ -159,7 +166,7 @@ def test_consistency(self, input_param, input_shape, _): with eval_mode(net_fuser): result_fuser = net_fuser(input_tensor) - assert_allclose(result, result_fuser, rtol=1e-4, atol=1e-4) + assert_allclose(result, result_fuser, rtol=rtol, atol=atol) class TestDynUNetDeepSupervision(unittest.TestCase): diff --git a/tests/test_ensure_channel_first.py b/tests/test_ensure_channel_first.py index 0c9ad5869e..fe046a4cdf 100644 --- a/tests/test_ensure_channel_first.py +++ b/tests/test_ensure_channel_first.py @@ -50,9 +50,10 @@ class TestEnsureChannelFirst(unittest.TestCase): @parameterized.expand([TEST_CASE_1, TEST_CASE_2, TEST_CASE_3, TEST_CASE_4, TEST_CASE_5, TEST_CASE_6]) @unittest.skipUnless(has_itk, "itk not installed") def test_load_nifti(self, input_param, filenames, original_channel_dim): - if original_channel_dim is None: - test_image = np.random.rand(8, 8, 8) - elif original_channel_dim == -1: + # if original_channel_dim is None + test_image = np.random.rand(8, 8, 8) + + if original_channel_dim == -1: test_image = np.random.rand(8, 8, 8, 1) with tempfile.TemporaryDirectory() as tempdir: diff --git a/tests/test_ensure_channel_firstd.py b/tests/test_ensure_channel_firstd.py index 63a437894b..e9effad951 100644 --- a/tests/test_ensure_channel_firstd.py +++ b/tests/test_ensure_channel_firstd.py @@ -35,9 +35,10 @@ class TestEnsureChannelFirstd(unittest.TestCase): @parameterized.expand([TEST_CASE_1, TEST_CASE_2, TEST_CASE_3]) def test_load_nifti(self, input_param, filenames, original_channel_dim): - if original_channel_dim is None: - test_image = np.random.rand(8, 8, 8) - elif original_channel_dim == -1: + # if original_channel_dim is None: + test_image = np.random.rand(8, 8, 8) + + if original_channel_dim == -1: test_image = np.random.rand(8, 8, 8, 1) with tempfile.TemporaryDirectory() as tempdir: diff --git a/tests/test_ensure_typed.py b/tests/test_ensure_typed.py index 09aa1f04b5..fe543347de 100644 --- a/tests/test_ensure_typed.py +++ b/tests/test_ensure_typed.py @@ -33,8 +33,8 @@ def test_array_input(self): keys="data", data_type=dtype, dtype=np.float32 if dtype == "NUMPY" else None, device="cpu" )({"data": test_data})["data"] if dtype == "NUMPY": - self.assertTrue(result.dtype == np.float32) - self.assertTrue(isinstance(result, torch.Tensor if dtype == "tensor" else np.ndarray)) + self.assertEqual(result.dtype, np.float32) + self.assertIsInstance(result, torch.Tensor if dtype == "tensor" else np.ndarray) assert_allclose(result, test_data, type_test=False) self.assertTupleEqual(result.shape, (2, 2)) @@ -45,7 +45,7 @@ def test_single_input(self): for test_data in test_datas: for dtype in ("tensor", "numpy"): result = EnsureTyped(keys="data", data_type=dtype)({"data": test_data})["data"] - self.assertTrue(isinstance(result, torch.Tensor if dtype == "tensor" else np.ndarray)) + self.assertIsInstance(result, torch.Tensor if dtype == "tensor" else np.ndarray) if isinstance(test_data, bool): self.assertFalse(result) else: @@ -56,11 +56,11 @@ def test_string(self): for dtype in ("tensor", "numpy"): # string input result = EnsureTyped(keys="data", data_type=dtype)({"data": "test_string"})["data"] - self.assertTrue(isinstance(result, str)) + self.assertIsInstance(result, str) self.assertEqual(result, "test_string") # numpy array of string result = EnsureTyped(keys="data", data_type=dtype)({"data": np.array(["test_string"])})["data"] - self.assertTrue(isinstance(result, np.ndarray)) + self.assertIsInstance(result, np.ndarray) self.assertEqual(result[0], "test_string") def test_list_tuple(self): @@ -68,15 +68,15 @@ def test_list_tuple(self): result = EnsureTyped(keys="data", data_type=dtype, wrap_sequence=False, track_meta=True)( {"data": [[1, 2], [3, 4]]} )["data"] - self.assertTrue(isinstance(result, list)) - self.assertTrue(isinstance(result[0][1], MetaTensor if dtype == "tensor" else np.ndarray)) + self.assertIsInstance(result, list) + self.assertIsInstance(result[0][1], MetaTensor if dtype == "tensor" else np.ndarray) assert_allclose(result[1][0], torch.as_tensor(3), type_test=False) # tuple of numpy arrays result = EnsureTyped(keys="data", data_type=dtype, wrap_sequence=False)( {"data": (np.array([1, 2]), np.array([3, 4]))} )["data"] - self.assertTrue(isinstance(result, tuple)) - self.assertTrue(isinstance(result[0], torch.Tensor if dtype == "tensor" else np.ndarray)) + self.assertIsInstance(result, tuple) + self.assertIsInstance(result[0], torch.Tensor if dtype == "tensor" else np.ndarray) assert_allclose(result[1], torch.as_tensor([3, 4]), type_test=False) def test_dict(self): @@ -92,19 +92,19 @@ def test_dict(self): ) for key in ("data", "label"): result = trans[key] - self.assertTrue(isinstance(result, dict)) - self.assertTrue(isinstance(result["img"], torch.Tensor if dtype == "tensor" else np.ndarray)) - self.assertTrue(isinstance(result["meta"]["size"], torch.Tensor if dtype == "tensor" else np.ndarray)) + self.assertIsInstance(result, dict) + self.assertIsInstance(result["img"], torch.Tensor if dtype == "tensor" else np.ndarray) + self.assertIsInstance(result["meta"]["size"], torch.Tensor if dtype == "tensor" else np.ndarray) self.assertEqual(result["meta"]["path"], "temp/test") self.assertEqual(result["extra"], None) assert_allclose(result["img"], torch.as_tensor([1.0, 2.0]), type_test=False) assert_allclose(result["meta"]["size"], torch.as_tensor([1, 2, 3]), type_test=False) if dtype == "numpy": - self.assertTrue(trans["data"]["img"].dtype == np.float32) - self.assertTrue(trans["label"]["img"].dtype == np.int8) + self.assertEqual(trans["data"]["img"].dtype, np.float32) + self.assertEqual(trans["label"]["img"].dtype, np.int8) else: - self.assertTrue(trans["data"]["img"].dtype == torch.float32) - self.assertTrue(trans["label"]["img"].dtype == torch.int8) + self.assertEqual(trans["data"]["img"].dtype, torch.float32) + self.assertEqual(trans["label"]["img"].dtype, torch.int8) if __name__ == "__main__": diff --git a/tests/test_evenly_divisible_all_gather_dist.py b/tests/test_evenly_divisible_all_gather_dist.py index d6d26c7e23..f1d45ba48f 100644 --- a/tests/test_evenly_divisible_all_gather_dist.py +++ b/tests/test_evenly_divisible_all_gather_dist.py @@ -27,10 +27,10 @@ def test_data(self): self._run() def _run(self): - if dist.get_rank() == 0: - data1 = torch.tensor([[1, 2], [3, 4]]) - data2 = torch.tensor([[1.0, 2.0]]) - data3 = torch.tensor(7) + # if dist.get_rank() == 0 + data1 = torch.tensor([[1, 2], [3, 4]]) + data2 = torch.tensor([[1.0, 2.0]]) + data3 = torch.tensor(7) if dist.get_rank() == 1: data1 = torch.tensor([[5, 6]]) diff --git a/tests/test_fl_monai_algo.py b/tests/test_fl_monai_algo.py index 54bec24b98..c8cb3451fc 100644 --- a/tests/test_fl_monai_algo.py +++ b/tests/test_fl_monai_algo.py @@ -75,7 +75,7 @@ tracking={ "handlers_id": DEFAULT_HANDLERS_ID, "configs": { - "execute_config": f"{_data_dir}/config_executed.json", + "save_execute_config": f"{_data_dir}/config_executed.json", "trainer": { "_target_": "MLFlowHandler", "tracking_uri": path_to_uri(_data_dir) + "/mlflow_override", @@ -201,7 +201,7 @@ def test_train(self, input_params): algo.finalize() # test experiment management - if "execute_config" in algo.train_workflow.parser: + if "save_execute_config" in algo.train_workflow.parser: self.assertTrue(os.path.exists(f"{_data_dir}/mlflow_override")) shutil.rmtree(f"{_data_dir}/mlflow_override") self.assertTrue(os.path.exists(f"{_data_dir}/config_executed.json")) @@ -224,7 +224,7 @@ def test_evaluate(self, input_params): algo.evaluate(data=data, extra={}) # test experiment management - if "execute_config" in algo.eval_workflow.parser: + if "save_execute_config" in algo.eval_workflow.parser: self.assertGreater(len(list(glob.glob(f"{_data_dir}/mlflow_*"))), 0) for f in list(glob.glob(f"{_data_dir}/mlflow_*")): shutil.rmtree(f) diff --git a/tests/test_flexible_unet.py b/tests/test_flexible_unet.py index 404855c9a8..42baa28b71 100644 --- a/tests/test_flexible_unet.py +++ b/tests/test_flexible_unet.py @@ -23,12 +23,11 @@ EfficientNetBNFeatures, FlexibleUNet, FlexUNetEncoderRegister, - ResNet, - ResNetBlock, - ResNetBottleneck, + ResNetEncoder, + ResNetFeatures, ) from monai.utils import optional_import -from tests.utils import skip_if_downloading_fails, skip_if_quick +from tests.utils import SkipIfNoModule, skip_if_downloading_fails, skip_if_quick torchvision, has_torchvision = optional_import("torchvision") PIL, has_pil = optional_import("PIL") @@ -59,101 +58,6 @@ def get_encoder_names(cls): return ["encoder_wrong_channels", "encoder_no_param1", "encoder_no_param2", "encoder_no_param3"] -class ResNetEncoder(ResNet, BaseEncoder): - backbone_names = ["resnet10", "resnet18", "resnet34", "resnet50", "resnet101", "resnet152", "resnet200"] - output_feature_channels = [(64, 128, 256, 512)] * 3 + [(256, 512, 1024, 2048)] * 4 - parameter_layers = [ - [1, 1, 1, 1], - [2, 2, 2, 2], - [3, 4, 6, 3], - [3, 4, 6, 3], - [3, 4, 23, 3], - [3, 8, 36, 3], - [3, 24, 36, 3], - ] - - def __init__(self, in_channels, pretrained, **kargs): - super().__init__(**kargs, n_input_channels=in_channels) - if pretrained: - # Author of paper zipped the state_dict on googledrive, - # so would need to download, unzip and read (2.8gb file for a ~150mb state dict). - # Would like to load dict from url but need somewhere to save the state dicts. - raise NotImplementedError( - "Currently not implemented. You need to manually download weights provided by the paper's author" - " and load then to the model with `state_dict`. See https://github.com/Tencent/MedicalNet" - ) - - @staticmethod - def get_inplanes(): - return [64, 128, 256, 512] - - @classmethod - def get_encoder_parameters(cls) -> list[dict]: - """ - Get parameter list to initialize encoder networks. - Each parameter dict must have `spatial_dims`, `in_channels` - and `pretrained` parameters. - """ - parameter_list = [] - res_type: type[ResNetBlock] | type[ResNetBottleneck] - for backbone in range(len(cls.backbone_names)): - if backbone < 3: - res_type = ResNetBlock - else: - res_type = ResNetBottleneck - parameter_list.append( - { - "block": res_type, - "layers": cls.parameter_layers[backbone], - "block_inplanes": ResNetEncoder.get_inplanes(), - "spatial_dims": 2, - "in_channels": 3, - "pretrained": False, - } - ) - return parameter_list - - @classmethod - def num_channels_per_output(cls): - """ - Get number of output features' channel. - """ - return cls.output_feature_channels - - @classmethod - def num_outputs(cls): - """ - Get number of output feature. - """ - return [4] * 7 - - @classmethod - def get_encoder_names(cls): - """ - Get the name string of backbones which will be used to initialize flexible unet. - """ - return cls.backbone_names - - def forward(self, x: torch.Tensor): - feature_list = [] - x = self.conv1(x) - x = self.bn1(x) - x = self.relu(x) - if not self.no_max_pool: - x = self.maxpool(x) - x = self.layer1(x) - feature_list.append(x) - x = self.layer2(x) - feature_list.append(x) - x = self.layer3(x) - feature_list.append(x) - x = self.layer4(x) - feature_list.append(x) - - return feature_list - - -FLEXUNET_BACKBONE.register_class(ResNetEncoder) FLEXUNET_BACKBONE.register_class(DummyEncoder) @@ -204,9 +108,7 @@ def make_shape_cases( def make_error_case(): - error_dummy_backbones = DummyEncoder.get_encoder_names() - error_resnet_backbones = ResNetEncoder.get_encoder_names() - error_backbones = error_dummy_backbones + error_resnet_backbones + error_backbones = DummyEncoder.get_encoder_names() error_param_list = [] for backbone in error_backbones: error_param_list.append( @@ -232,7 +134,7 @@ def make_error_case(): norm="instance", ) CASES_3D = make_shape_cases( - models=[SEL_MODELS[0]], + models=[SEL_MODELS[0], SEL_MODELS[2]], spatial_dims=[3], batches=[1], pretrained=[False], @@ -345,6 +247,7 @@ def make_error_case(): "spatial_dims": 2, "norm": ("batch", {"eps": 1e-3, "momentum": 0.01}), }, + EfficientNetBNFeatures, { "in_channels": 3, "num_classes": 10, @@ -354,7 +257,20 @@ def make_error_case(): "norm": ("batch", {"eps": 1e-3, "momentum": 0.01}), }, ["_conv_stem.weight"], - ) + ), + ( + { + "in_channels": 1, + "out_channels": 10, + "backbone": SEL_MODELS[2], + "pretrained": True, + "spatial_dims": 3, + "norm": ("batch", {"eps": 1e-3, "momentum": 0.01}), + }, + ResNetFeatures, + {"model_name": SEL_MODELS[2], "pretrained": True, "spatial_dims": 3, "in_channels": 1}, + ["conv1.weight"], + ), ] CASE_ERRORS = make_error_case() @@ -363,6 +279,7 @@ def make_error_case(): CASE_REGISTER_ENCODER = ["EfficientNetEncoder", "monai.networks.nets.EfficientNetEncoder"] +@SkipIfNoModule("hf_hub_download") @skip_if_quick class TestFLEXIBLEUNET(unittest.TestCase): @@ -381,19 +298,19 @@ def test_shape(self, input_param, input_shape, expected_shape): self.assertEqual(result.shape, expected_shape) @parameterized.expand(CASES_PRETRAIN) - def test_pretrain(self, input_param, efficient_input_param, weight_list): + def test_pretrain(self, flexunet_input_param, feature_extractor_class, feature_extractor_input_param, weight_list): device = "cuda" if torch.cuda.is_available() else "cpu" with skip_if_downloading_fails(): - net = FlexibleUNet(**input_param).to(device) + net = FlexibleUNet(**flexunet_input_param).to(device) with skip_if_downloading_fails(): - eff_net = EfficientNetBNFeatures(**efficient_input_param).to(device) + feature_extractor_net = feature_extractor_class(**feature_extractor_input_param).to(device) for weight_name in weight_list: - if weight_name in net.encoder.state_dict() and weight_name in eff_net.state_dict(): + if weight_name in net.encoder.state_dict() and weight_name in feature_extractor_net.state_dict(): net_weight = net.encoder.state_dict()[weight_name] - download_weight = eff_net.state_dict()[weight_name] + download_weight = feature_extractor_net.state_dict()[weight_name] weight_diff = torch.abs(net_weight - download_weight) diff_sum = torch.sum(weight_diff) # check if a weight in weight_list equals to the downloaded weight. diff --git a/tests/test_flipd.py b/tests/test_flipd.py index 277f387051..1df6d34056 100644 --- a/tests/test_flipd.py +++ b/tests/test_flipd.py @@ -78,7 +78,7 @@ def test_torch(self, spatial_axis, img: torch.Tensor, track_meta: bool, device): def test_meta_dict(self): xform = Flipd("image", [0, 1]) res = xform({"image": torch.zeros(1, 3, 4)}) - self.assertTrue(res["image"].applied_operations == res["image_transforms"]) + self.assertEqual(res["image"].applied_operations, res["image_transforms"]) if __name__ == "__main__": diff --git a/tests/test_focal_loss.py b/tests/test_focal_loss.py index de8d625058..0bb8a078ae 100644 --- a/tests/test_focal_loss.py +++ b/tests/test_focal_loss.py @@ -132,7 +132,7 @@ def test_consistency_with_cross_entropy_2d_no_reduction(self): error = np.abs(a - b) max_error = np.maximum(error, max_error) - assert np.allclose(max_error, 0) + assert np.allclose(max_error, 0, atol=1e-6) def test_consistency_with_cross_entropy_2d_onehot_label(self): """For gamma=0 the focal loss reduces to the cross entropy loss""" diff --git a/tests/test_freeze_layers.py b/tests/test_freeze_layers.py index 1bea4ed1b5..7be8e576bf 100644 --- a/tests/test_freeze_layers.py +++ b/tests/test_freeze_layers.py @@ -40,9 +40,9 @@ def test_freeze_vars(self, device): for name, param in model.named_parameters(): if "class_layer" in name: - self.assertEqual(param.requires_grad, False) + self.assertFalse(param.requires_grad) else: - self.assertEqual(param.requires_grad, True) + self.assertTrue(param.requires_grad) @parameterized.expand(TEST_CASES) def test_exclude_vars(self, device): @@ -53,9 +53,9 @@ def test_exclude_vars(self, device): for name, param in model.named_parameters(): if "class_layer" in name: - self.assertEqual(param.requires_grad, True) + self.assertTrue(param.requires_grad) else: - self.assertEqual(param.requires_grad, False) + self.assertFalse(param.requires_grad) if __name__ == "__main__": diff --git a/tests/test_generalized_dice_focal_loss.py b/tests/test_generalized_dice_focal_loss.py index 8a0a80865e..65252611ca 100644 --- a/tests/test_generalized_dice_focal_loss.py +++ b/tests/test_generalized_dice_focal_loss.py @@ -59,8 +59,18 @@ def test_result_no_onehot_no_bg(self): def test_ill_shape(self): loss = GeneralizedDiceFocalLoss() - with self.assertRaisesRegex(ValueError, ""): - loss(torch.ones((1, 2, 3)), torch.ones((1, 1, 2, 3))) + with self.assertRaises(AssertionError): + loss.forward(torch.ones((1, 2, 3)), torch.ones((1, 2, 5))) + + def test_ill_shape2(self): + loss = GeneralizedDiceFocalLoss() + with self.assertRaises(ValueError): + loss.forward(torch.ones((1, 2, 3)), torch.ones((1, 1, 2, 3))) + + def test_ill_shape3(self): + loss = GeneralizedDiceFocalLoss() + with self.assertRaises(ValueError): + loss.forward(torch.ones((1, 3, 4, 4)), torch.ones((1, 2, 4, 4))) def test_ill_lambda(self): with self.assertRaisesRegex(ValueError, ""): diff --git a/tests/test_generalized_dice_loss.py b/tests/test_generalized_dice_loss.py index 7499507129..5738f4a089 100644 --- a/tests/test_generalized_dice_loss.py +++ b/tests/test_generalized_dice_loss.py @@ -184,7 +184,7 @@ def test_differentiability(self): generalized_dice_loss = GeneralizedDiceLoss() loss = generalized_dice_loss(prediction, target) - self.assertNotEqual(loss.grad_fn, None) + self.assertIsNotNone(loss.grad_fn) def test_batch(self): prediction = torch.zeros(2, 3, 3, 3) @@ -194,7 +194,7 @@ def test_batch(self): generalized_dice_loss = GeneralizedDiceLoss(batch=True) loss = generalized_dice_loss(prediction, target) - self.assertNotEqual(loss.grad_fn, None) + self.assertIsNotNone(loss.grad_fn) def test_script(self): loss = GeneralizedDiceLoss() diff --git a/tests/test_get_package_version.py b/tests/test_get_package_version.py index ab9e69cd31..e9e1d8eca6 100644 --- a/tests/test_get_package_version.py +++ b/tests/test_get_package_version.py @@ -20,14 +20,14 @@ class TestGetVersion(unittest.TestCase): def test_default(self): output = get_package_version("42foobarnoexist") - self.assertTrue("UNKNOWN" in output) + self.assertIn("UNKNOWN", output) output = get_package_version("numpy") - self.assertFalse("UNKNOWN" in output) + self.assertNotIn("UNKNOWN", output) def test_msg(self): output = get_package_version("42foobarnoexist", "test") - self.assertTrue("test" in output) + self.assertIn("test", output) if __name__ == "__main__": diff --git a/tests/test_global_mutual_information_loss.py b/tests/test_global_mutual_information_loss.py index 36a1978c93..22f5e88431 100644 --- a/tests/test_global_mutual_information_loss.py +++ b/tests/test_global_mutual_information_loss.py @@ -15,6 +15,7 @@ import numpy as np import torch +from parameterized import parameterized from monai import transforms from monai.losses.image_dissimilarity import GlobalMutualInformationLoss @@ -116,24 +117,33 @@ def transformation(translate_params=(0.0, 0.0, 0.0), rotate_params=(0.0, 0.0, 0. class TestGlobalMutualInformationLossIll(unittest.TestCase): - def test_ill_shape(self): + @parameterized.expand( + [ + (torch.ones((1, 2), dtype=torch.float), torch.ones((1, 3), dtype=torch.float)), # mismatched_simple_dims + ( + torch.ones((1, 3, 3), dtype=torch.float), + torch.ones((1, 3), dtype=torch.float), + ), # mismatched_advanced_dims + ] + ) + def test_ill_shape(self, input1, input2): loss = GlobalMutualInformationLoss() - with self.assertRaisesRegex(ValueError, ""): - loss.forward(torch.ones((1, 2), dtype=torch.float), torch.ones((1, 3), dtype=torch.float, device=device)) - with self.assertRaisesRegex(ValueError, ""): - loss.forward(torch.ones((1, 3, 3), dtype=torch.float), torch.ones((1, 3), dtype=torch.float, device=device)) - - def test_ill_opts(self): + with self.assertRaises(ValueError): + loss.forward(input1, input2) + + @parameterized.expand( + [ + (0, "mean", ValueError, ""), # num_bins_zero + (-1, "mean", ValueError, ""), # num_bins_negative + (64, "unknown", ValueError, ""), # reduction_unknown + (64, None, ValueError, ""), # reduction_none + ] + ) + def test_ill_opts(self, num_bins, reduction, expected_exception, expected_message): pred = torch.ones((1, 3, 3, 3, 3), dtype=torch.float, device=device) target = torch.ones((1, 3, 3, 3, 3), dtype=torch.float, device=device) - with self.assertRaisesRegex(ValueError, ""): - GlobalMutualInformationLoss(num_bins=0)(pred, target) - with self.assertRaisesRegex(ValueError, ""): - GlobalMutualInformationLoss(num_bins=-1)(pred, target) - with self.assertRaisesRegex(ValueError, ""): - GlobalMutualInformationLoss(reduction="unknown")(pred, target) - with self.assertRaisesRegex(ValueError, ""): - GlobalMutualInformationLoss(reduction=None)(pred, target) + with self.assertRaisesRegex(expected_exception, expected_message): + GlobalMutualInformationLoss(num_bins=num_bins, reduction=reduction)(pred, target) if __name__ == "__main__": diff --git a/tests/test_grid_patch.py b/tests/test_grid_patch.py index 4b324eda1a..56af123548 100644 --- a/tests/test_grid_patch.py +++ b/tests/test_grid_patch.py @@ -124,11 +124,11 @@ def test_grid_patch_meta(self, input_parameters, image, expected, expected_meta) self.assertTrue(output.meta["path"] == expected_meta[0]["path"]) for output_patch, expected_patch, expected_patch_meta in zip(output, expected, expected_meta): assert_allclose(output_patch, expected_patch, type_test=False) - self.assertTrue(isinstance(output_patch, MetaTensor)) - self.assertTrue(output_patch.meta["location"] == expected_patch_meta["location"]) + self.assertIsInstance(output_patch, MetaTensor) + self.assertEqual(output_patch.meta["location"], expected_patch_meta["location"]) self.assertTrue(output_patch.meta["spatial_shape"], list(output_patch.shape[1:])) if "path" in expected_meta[0]: - self.assertTrue(output_patch.meta["path"] == expected_patch_meta["path"]) + self.assertEqual(output_patch.meta["path"], expected_patch_meta["path"]) if __name__ == "__main__": diff --git a/tests/test_handler_metrics_saver_dist.py b/tests/test_handler_metrics_saver_dist.py index 46c9ad27d7..2e12b08aa9 100644 --- a/tests/test_handler_metrics_saver_dist.py +++ b/tests/test_handler_metrics_saver_dist.py @@ -51,8 +51,10 @@ def _val_func(engine, batch): engine = Engine(_val_func) + # define here to ensure symbol always exists regardless of the following if conditions + data = [{PostFix.meta("image"): {"filename_or_obj": [fnames[0]]}}] + if my_rank == 0: - data = [{PostFix.meta("image"): {"filename_or_obj": [fnames[0]]}}] @engine.on(Events.EPOCH_COMPLETED) def _save_metrics0(engine): diff --git a/tests/test_handler_stats.py b/tests/test_handler_stats.py index f876cff2a3..52da5c179b 100644 --- a/tests/test_handler_stats.py +++ b/tests/test_handler_stats.py @@ -76,9 +76,9 @@ def _update_metric(engine): if has_key_word.match(line): content_count += 1 if epoch_log is True: - self.assertTrue(content_count == max_epochs) + self.assertEqual(content_count, max_epochs) else: - self.assertTrue(content_count == 2) # 2 = len([1, 2]) from event_filter + self.assertEqual(content_count, 2) # 2 = len([1, 2]) from event_filter @parameterized.expand([[True], [get_event_filter([1, 3])]]) def test_loss_print(self, iteration_log): @@ -116,9 +116,9 @@ def _train_func(engine, batch): if has_key_word.match(line): content_count += 1 if iteration_log is True: - self.assertTrue(content_count == num_iters * max_epochs) + self.assertEqual(content_count, num_iters * max_epochs) else: - self.assertTrue(content_count == 2) # 2 = len([1, 3]) from event_filter + self.assertEqual(content_count, 2) # 2 = len([1, 3]) from event_filter def test_loss_dict(self): log_stream = StringIO() @@ -150,7 +150,7 @@ def _train_func(engine, batch): for line in output_str.split("\n"): if has_key_word.match(line): content_count += 1 - self.assertTrue(content_count > 0) + self.assertGreater(content_count, 0) def test_loss_file(self): key_to_handler = "test_logging" @@ -184,7 +184,7 @@ def _train_func(engine, batch): for line in output_str.split("\n"): if has_key_word.match(line): content_count += 1 - self.assertTrue(content_count > 0) + self.assertGreater(content_count, 0) def test_exception(self): # set up engine @@ -239,7 +239,7 @@ def _update_metric(engine): for line in output_str.split("\n"): if has_key_word.match(line): content_count += 1 - self.assertTrue(content_count > 0) + self.assertGreater(content_count, 0) def test_default_logger(self): log_stream = StringIO() @@ -274,7 +274,7 @@ def _train_func(engine, batch): for line in output_str.split("\n"): if has_key_word.match(line): content_count += 1 - self.assertTrue(content_count > 0) + self.assertGreater(content_count, 0) if __name__ == "__main__": diff --git a/tests/test_hausdorff_loss.py b/tests/test_hausdorff_loss.py index f279d45b14..f2211008c2 100644 --- a/tests/test_hausdorff_loss.py +++ b/tests/test_hausdorff_loss.py @@ -219,17 +219,12 @@ def test_ill_opts(self): with self.assertRaisesRegex(ValueError, ""): HausdorffDTLoss(reduction=None)(chn_input, chn_target) - def test_input_warnings(self): + @parameterized.expand([(False, False, False), (False, True, False), (False, False, True)]) + def test_input_warnings(self, include_background, softmax, to_onehot_y): chn_input = torch.ones((1, 1, 1, 3)) chn_target = torch.ones((1, 1, 1, 3)) with self.assertWarns(Warning): - loss = HausdorffDTLoss(include_background=False) - loss.forward(chn_input, chn_target) - with self.assertWarns(Warning): - loss = HausdorffDTLoss(softmax=True) - loss.forward(chn_input, chn_target) - with self.assertWarns(Warning): - loss = HausdorffDTLoss(to_onehot_y=True) + loss = HausdorffDTLoss(include_background=include_background, softmax=softmax, to_onehot_y=to_onehot_y) loss.forward(chn_input, chn_target) @@ -256,17 +251,12 @@ def test_ill_opts(self): with self.assertRaisesRegex(ValueError, ""): LogHausdorffDTLoss(reduction=None)(chn_input, chn_target) - def test_input_warnings(self): + @parameterized.expand([(False, False, False), (False, True, False), (False, False, True)]) + def test_input_warnings(self, include_background, softmax, to_onehot_y): chn_input = torch.ones((1, 1, 1, 3)) chn_target = torch.ones((1, 1, 1, 3)) with self.assertWarns(Warning): - loss = LogHausdorffDTLoss(include_background=False) - loss.forward(chn_input, chn_target) - with self.assertWarns(Warning): - loss = LogHausdorffDTLoss(softmax=True) - loss.forward(chn_input, chn_target) - with self.assertWarns(Warning): - loss = LogHausdorffDTLoss(to_onehot_y=True) + loss = LogHausdorffDTLoss(include_background=include_background, softmax=softmax, to_onehot_y=to_onehot_y) loss.forward(chn_input, chn_target) diff --git a/tests/test_hilbert_transform.py b/tests/test_hilbert_transform.py index 879a74969d..b91ba3f6b7 100644 --- a/tests/test_hilbert_transform.py +++ b/tests/test_hilbert_transform.py @@ -19,11 +19,11 @@ from monai.networks.layers import HilbertTransform from monai.utils import OptionalImportError -from tests.utils import SkipIfModule, SkipIfNoModule, skip_if_no_cuda +from tests.utils import SkipIfModule, SkipIfNoModule def create_expected_numpy_output(input_datum, **kwargs): - x = np.fft.fft(input_datum.cpu().numpy() if input_datum.device.type == "cuda" else input_datum.numpy(), **kwargs) + x = np.fft.fft(input_datum.cpu().numpy(), **kwargs) f = np.fft.fftfreq(x.shape[kwargs["axis"]]) u = np.heaviside(f, 0.5) new_dims_before = kwargs["axis"] @@ -44,19 +44,15 @@ def create_expected_numpy_output(input_datum, **kwargs): # CPU TEST DATA cpu_input_data = {} -cpu_input_data["1D"] = torch.as_tensor(hann_windowed_sine, device=cpu).unsqueeze(0).unsqueeze(0) -cpu_input_data["2D"] = ( - torch.as_tensor(np.stack([hann_windowed_sine] * 10, axis=1), device=cpu).unsqueeze(0).unsqueeze(0) -) -cpu_input_data["3D"] = ( - torch.as_tensor(np.stack([np.stack([hann_windowed_sine] * 10, axis=1)] * 10, axis=2), device=cpu) - .unsqueeze(0) - .unsqueeze(0) -) -cpu_input_data["1D 2CH"] = torch.as_tensor(np.stack([hann_windowed_sine] * 10, axis=1), device=cpu).unsqueeze(0) +cpu_input_data["1D"] = torch.as_tensor(hann_windowed_sine, device=cpu)[None, None] +cpu_input_data["2D"] = torch.as_tensor(np.stack([hann_windowed_sine] * 10, axis=1), device=cpu)[None, None] +cpu_input_data["3D"] = torch.as_tensor( + np.stack([np.stack([hann_windowed_sine] * 10, axis=1)] * 10, axis=2), device=cpu +)[None, None] +cpu_input_data["1D 2CH"] = torch.as_tensor(np.stack([hann_windowed_sine] * 10, axis=1), device=cpu)[None] cpu_input_data["2D 2CH"] = torch.as_tensor( np.stack([np.stack([hann_windowed_sine] * 10, axis=1)] * 10, axis=2), device=cpu -).unsqueeze(0) +)[None] # SINGLE-CHANNEL CPU VALUE TESTS @@ -97,64 +93,21 @@ def create_expected_numpy_output(input_datum, **kwargs): 1e-5, # absolute tolerance ] +TEST_CASES_CPU = [ + TEST_CASE_1D_SINE_CPU, + TEST_CASE_2D_SINE_CPU, + TEST_CASE_3D_SINE_CPU, + TEST_CASE_1D_2CH_SINE_CPU, + TEST_CASE_2D_2CH_SINE_CPU, +] + # GPU TEST DATA if torch.cuda.is_available(): gpu = torch.device("cuda") - - gpu_input_data = {} - gpu_input_data["1D"] = torch.as_tensor(hann_windowed_sine, device=gpu).unsqueeze(0).unsqueeze(0) - gpu_input_data["2D"] = ( - torch.as_tensor(np.stack([hann_windowed_sine] * 10, axis=1), device=gpu).unsqueeze(0).unsqueeze(0) - ) - gpu_input_data["3D"] = ( - torch.as_tensor(np.stack([np.stack([hann_windowed_sine] * 10, axis=1)] * 10, axis=2), device=gpu) - .unsqueeze(0) - .unsqueeze(0) - ) - gpu_input_data["1D 2CH"] = torch.as_tensor(np.stack([hann_windowed_sine] * 10, axis=1), device=gpu).unsqueeze(0) - gpu_input_data["2D 2CH"] = torch.as_tensor( - np.stack([np.stack([hann_windowed_sine] * 10, axis=1)] * 10, axis=2), device=gpu - ).unsqueeze(0) - - # SINGLE CHANNEL GPU VALUE TESTS - - TEST_CASE_1D_SINE_GPU = [ - {}, # args (empty, so use default) - gpu_input_data["1D"], # Input data: Random 1D signal - create_expected_numpy_output(gpu_input_data["1D"], axis=2), # Expected output: FFT of signal - 1e-5, # absolute tolerance - ] - - TEST_CASE_2D_SINE_GPU = [ - {}, # args (empty, so use default) - gpu_input_data["2D"], # Input data: Random 1D signal - create_expected_numpy_output(gpu_input_data["2D"], axis=2), # Expected output: FFT of signal - 1e-5, # absolute tolerance - ] - - TEST_CASE_3D_SINE_GPU = [ - {}, # args (empty, so use default) - gpu_input_data["3D"], # Input data: Random 1D signal - create_expected_numpy_output(gpu_input_data["3D"], axis=2), # Expected output: FFT of signal - 1e-5, # absolute tolerance - ] - - # MULTICHANNEL GPU VALUE TESTS, PROCESS ALONG FIRST SPATIAL AXIS - - TEST_CASE_1D_2CH_SINE_GPU = [ - {}, # args (empty, so use default) - gpu_input_data["1D 2CH"], # Input data: Random 1D signal - create_expected_numpy_output(gpu_input_data["1D 2CH"], axis=2), - 1e-5, # absolute tolerance - ] - - TEST_CASE_2D_2CH_SINE_GPU = [ - {}, # args (empty, so use default) - gpu_input_data["2D 2CH"], # Input data: Random 1D signal - create_expected_numpy_output(gpu_input_data["2D 2CH"], axis=2), - 1e-5, # absolute tolerance - ] + TEST_CASES_GPU = [[args, image.to(gpu), exp_data, atol] for args, image, exp_data, atol in TEST_CASES_CPU] +else: + TEST_CASES_GPU = [] # TESTS CHECKING PADDING, AXIS SELECTION ETC ARE COVERED BY test_detect_envelope.py @@ -162,42 +115,10 @@ def create_expected_numpy_output(input_datum, **kwargs): @SkipIfNoModule("torch.fft") class TestHilbertTransformCPU(unittest.TestCase): - @parameterized.expand( - [ - TEST_CASE_1D_SINE_CPU, - TEST_CASE_2D_SINE_CPU, - TEST_CASE_3D_SINE_CPU, - TEST_CASE_1D_2CH_SINE_CPU, - TEST_CASE_2D_2CH_SINE_CPU, - ] - ) - def test_value(self, arguments, image, expected_data, atol): - result = HilbertTransform(**arguments)(image) - result = result.squeeze(0).squeeze(0).numpy() - np.testing.assert_allclose(result, expected_data.squeeze(), atol=atol) - - -@skip_if_no_cuda -@SkipIfNoModule("torch.fft") -class TestHilbertTransformGPU(unittest.TestCase): - - @parameterized.expand( - ( - [] - if not torch.cuda.is_available() - else [ - TEST_CASE_1D_SINE_GPU, - TEST_CASE_2D_SINE_GPU, - TEST_CASE_3D_SINE_GPU, - TEST_CASE_1D_2CH_SINE_GPU, - TEST_CASE_2D_2CH_SINE_GPU, - ] - ), - skip_on_empty=True, - ) + @parameterized.expand(TEST_CASES_CPU + TEST_CASES_GPU) def test_value(self, arguments, image, expected_data, atol): result = HilbertTransform(**arguments)(image) - result = result.squeeze(0).squeeze(0).cpu().numpy() + result = np.squeeze(result.cpu().numpy()) np.testing.assert_allclose(result, expected_data.squeeze(), atol=atol) diff --git a/tests/test_integration_bundle_run.py b/tests/test_integration_bundle_run.py index c2e0fb55b7..60aaef05bf 100644 --- a/tests/test_integration_bundle_run.py +++ b/tests/test_integration_bundle_run.py @@ -135,9 +135,8 @@ def test_scripts_fold(self): command_run = cmd + ["run", "training", "--config_file", config_file, "--meta_file", meta_file] completed_process = subprocess.run(command_run, check=True, capture_output=True, text=True) output = repr(completed_process.stdout).replace("\\n", "\n").replace("\\t", "\t") # Get the captured output - print(output) - self.assertTrue(expected_condition in output) + self.assertIn(expected_condition, output) command_run_workflow = cmd + [ "run_workflow", "--run_id", @@ -149,8 +148,7 @@ def test_scripts_fold(self): ] completed_process = subprocess.run(command_run_workflow, check=True, capture_output=True, text=True) output = repr(completed_process.stdout).replace("\\n", "\n").replace("\\t", "\t") # Get the captured output - print(output) - self.assertTrue(expected_condition in output) + self.assertIn(expected_condition, output) # test missing meta file self.assertIn("ERROR", command_line_tests(cmd + ["run", "training", "--config_file", config_file])) diff --git a/tests/test_integration_unet_2d.py b/tests/test_integration_unet_2d.py index 918190775c..3b40682de0 100644 --- a/tests/test_integration_unet_2d.py +++ b/tests/test_integration_unet_2d.py @@ -35,6 +35,7 @@ def __getitem__(self, _unused_id): def __len__(self): return train_steps + net = None if net_name == "basicunet": net = BasicUNet(spatial_dims=2, in_channels=1, out_channels=1, features=(4, 8, 8, 16, 16, 32)) elif net_name == "unet": diff --git a/tests/test_integration_workflows_adversarial.py b/tests/test_integration_workflows_adversarial.py new file mode 100644 index 0000000000..f323fc9917 --- /dev/null +++ b/tests/test_integration_workflows_adversarial.py @@ -0,0 +1,173 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import os +import shutil +import tempfile +import unittest +from glob import glob + +import numpy as np +import torch + +import monai +from monai.data import create_test_image_2d +from monai.engines import AdversarialTrainer +from monai.handlers import CheckpointSaver, StatsHandler, TensorBoardStatsHandler +from monai.networks.nets import AutoEncoder, Discriminator +from monai.transforms import Compose, EnsureChannelFirstd, LoadImaged, RandFlipd, ScaleIntensityd +from monai.utils import AdversarialKeys as Keys +from monai.utils import CommonKeys, optional_import, set_determinism +from tests.utils import DistTestCase, TimedCall, skip_if_quick + +nib, has_nibabel = optional_import("nibabel") + + +def run_training_test(root_dir, device="cuda:0"): + learning_rate = 2e-4 + real_label = 1 + fake_label = 0 + + real_images = sorted(glob(os.path.join(root_dir, "img*.nii.gz"))) + train_files = [{CommonKeys.IMAGE: img, CommonKeys.LABEL: img} for img in zip(real_images)] + + # prepare real data + train_transforms = Compose( + [ + LoadImaged(keys=[CommonKeys.IMAGE, CommonKeys.LABEL]), + EnsureChannelFirstd(keys=[CommonKeys.IMAGE, CommonKeys.LABEL], channel_dim=2), + ScaleIntensityd(keys=[CommonKeys.IMAGE]), + RandFlipd(keys=[CommonKeys.IMAGE, CommonKeys.LABEL], prob=0.5), + ] + ) + train_ds = monai.data.CacheDataset(data=train_files, transform=train_transforms, cache_rate=0.5) + train_loader = monai.data.DataLoader(train_ds, batch_size=2, shuffle=True, num_workers=4) + + # Create Discriminator + discriminator_net = Discriminator( + in_shape=(1, 64, 64), channels=(8, 16, 32, 64, 1), strides=(2, 2, 2, 2, 1), num_res_units=1, kernel_size=5 + ).to(device) + discriminator_opt = torch.optim.Adam(discriminator_net.parameters(), learning_rate) + discriminator_loss_criterion = torch.nn.BCELoss() + + def discriminator_loss(real_logits, fake_logits): + real_target = real_logits.new_full((real_logits.shape[0], 1), real_label) + fake_target = fake_logits.new_full((fake_logits.shape[0], 1), fake_label) + real_loss = discriminator_loss_criterion(real_logits, real_target) + fake_loss = discriminator_loss_criterion(fake_logits.detach(), fake_target) + return torch.div(torch.add(real_loss, fake_loss), 2) + + # Create Generator + generator_network = AutoEncoder( + spatial_dims=2, + in_channels=1, + out_channels=1, + channels=(8, 16, 32, 64), + strides=(2, 2, 2, 2), + num_res_units=1, + num_inter_units=1, + ) + generator_network = generator_network.to(device) + generator_optimiser = torch.optim.Adam(generator_network.parameters(), learning_rate) + generator_loss_criterion = torch.nn.MSELoss() + + def reconstruction_loss(recon_images, real_images): + return generator_loss_criterion(recon_images, real_images) + + def generator_loss(fake_logits): + fake_target = fake_logits.new_full((fake_logits.shape[0], 1), real_label) + recon_loss = discriminator_loss_criterion(fake_logits.detach(), fake_target) + return recon_loss + + key_train_metric = None + + train_handlers = [ + StatsHandler( + name="training_loss", + output_transform=lambda x: { + Keys.RECONSTRUCTION_LOSS: x[Keys.RECONSTRUCTION_LOSS], + Keys.DISCRIMINATOR_LOSS: x[Keys.DISCRIMINATOR_LOSS], + Keys.GENERATOR_LOSS: x[Keys.GENERATOR_LOSS], + }, + ), + TensorBoardStatsHandler( + log_dir=root_dir, + tag_name="training_loss", + output_transform=lambda x: { + Keys.RECONSTRUCTION_LOSS: x[Keys.RECONSTRUCTION_LOSS], + Keys.DISCRIMINATOR_LOSS: x[Keys.DISCRIMINATOR_LOSS], + Keys.GENERATOR_LOSS: x[Keys.GENERATOR_LOSS], + }, + ), + CheckpointSaver( + save_dir=root_dir, + save_dict={"g_net": generator_network, "d_net": discriminator_net}, + save_interval=2, + epoch_level=True, + ), + ] + + num_epochs = 5 + + trainer = AdversarialTrainer( + device=device, + max_epochs=num_epochs, + train_data_loader=train_loader, + g_network=generator_network, + g_optimizer=generator_optimiser, + g_loss_function=generator_loss, + recon_loss_function=reconstruction_loss, + d_network=discriminator_net, + d_optimizer=discriminator_opt, + d_loss_function=discriminator_loss, + non_blocking=True, + key_train_metric=key_train_metric, + train_handlers=train_handlers, + ) + trainer.run() + + return trainer.state + + +@skip_if_quick +@unittest.skipUnless(has_nibabel, "Requires nibabel library.") +class IntegrationWorkflowsAdversarialTrainer(DistTestCase): + def setUp(self): + set_determinism(seed=0) + + self.data_dir = tempfile.mkdtemp() + for i in range(40): + im, _ = create_test_image_2d(64, 64, num_objs=3, rad_max=14, num_seg_classes=1, channel_dim=-1) + n = nib.Nifti1Image(im, np.eye(4)) + nib.save(n, os.path.join(self.data_dir, f"img{i:d}.nii.gz")) + + self.device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu:0") + monai.config.print_config() + + def tearDown(self): + set_determinism(seed=None) + shutil.rmtree(self.data_dir) + + @TimedCall(seconds=200, daemon=False) + def test_training(self): + torch.manual_seed(0) + + finish_state = run_training_test(self.data_dir, device=self.device) + + # Assert AdversarialTrainer training finished + self.assertEqual(finish_state.iteration, 100) + self.assertEqual(finish_state.epoch, 5) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_inverse_collation.py b/tests/test_inverse_collation.py index f33b5c67eb..bf3972e6bd 100644 --- a/tests/test_inverse_collation.py +++ b/tests/test_inverse_collation.py @@ -133,7 +133,7 @@ def test_collation(self, _, transform, collate_fn, ndim): d = decollate_batch(item) self.assertTrue(len(d) <= self.batch_size) for b in d: - self.assertTrue(isinstance(b["image"], MetaTensor)) + self.assertIsInstance(b["image"], MetaTensor) np.testing.assert_array_equal( b["image"].applied_operations[-1]["orig_size"], b["label"].applied_operations[-1]["orig_size"] ) diff --git a/tests/test_invertd.py b/tests/test_invertd.py index c32a3af643..f6e8fc40e7 100644 --- a/tests/test_invertd.py +++ b/tests/test_invertd.py @@ -134,7 +134,7 @@ def test_invert(self): # 25300: 2 workers (cpu, non-macos) # 1812: 0 workers (gpu or macos) # 1821: windows torch 1.10.0 - self.assertTrue((reverted.size - n_good) < 40000, f"diff. {reverted.size - n_good}") + self.assertLess((reverted.size - n_good), 40000, f"diff. {reverted.size - n_good}") set_determinism(seed=None) diff --git a/tests/test_latent_diffusion_inferer.py b/tests/test_latent_diffusion_inferer.py new file mode 100644 index 0000000000..2e04ad6c5c --- /dev/null +++ b/tests/test_latent_diffusion_inferer.py @@ -0,0 +1,824 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest +from unittest import skipUnless + +import torch +from parameterized import parameterized + +from monai.inferers import LatentDiffusionInferer +from monai.networks.nets import VQVAE, AutoencoderKL, DiffusionModelUNet, SPADEAutoencoderKL, SPADEDiffusionModelUNet +from monai.networks.schedulers import DDPMScheduler +from monai.utils import optional_import + +_, has_einops = optional_import("einops") +TEST_CASES = [ + [ + "AutoencoderKL", + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4), + "latent_channels": 3, + "attention_levels": [False, False], + "num_res_blocks": 1, + "with_encoder_nonlocal_attn": False, + "with_decoder_nonlocal_attn": False, + "norm_num_groups": 4, + }, + "DiffusionModelUNet", + { + "spatial_dims": 2, + "in_channels": 3, + "out_channels": 3, + "channels": [4, 4], + "norm_num_groups": 4, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 4, + }, + (1, 1, 8, 8), + (1, 3, 4, 4), + ], + [ + "VQVAE", + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": [4, 4], + "num_res_layers": 1, + "num_res_channels": [4, 4], + "downsample_parameters": ((2, 4, 1, 1), (2, 4, 1, 1)), + "upsample_parameters": ((2, 4, 1, 1, 0), (2, 4, 1, 1, 0)), + "num_embeddings": 16, + "embedding_dim": 3, + }, + "DiffusionModelUNet", + { + "spatial_dims": 2, + "in_channels": 3, + "out_channels": 3, + "channels": [8, 8], + "norm_num_groups": 8, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 8, + }, + (1, 1, 16, 16), + (1, 3, 4, 4), + ], + [ + "VQVAE", + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "channels": [4, 4], + "num_res_layers": 1, + "num_res_channels": [4, 4], + "downsample_parameters": ((2, 4, 1, 1), (2, 4, 1, 1)), + "upsample_parameters": ((2, 4, 1, 1, 0), (2, 4, 1, 1, 0)), + "num_embeddings": 16, + "embedding_dim": 3, + }, + "DiffusionModelUNet", + { + "spatial_dims": 3, + "in_channels": 3, + "out_channels": 3, + "channels": [8, 8], + "norm_num_groups": 8, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 8, + }, + (1, 1, 16, 16, 16), + (1, 3, 4, 4, 4), + ], + [ + "AutoencoderKL", + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4), + "latent_channels": 3, + "attention_levels": [False, False], + "num_res_blocks": 1, + "with_encoder_nonlocal_attn": False, + "with_decoder_nonlocal_attn": False, + "norm_num_groups": 4, + }, + "SPADEDiffusionModelUNet", + { + "spatial_dims": 2, + "label_nc": 3, + "in_channels": 3, + "out_channels": 3, + "channels": [4, 4], + "norm_num_groups": 4, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 4, + }, + (1, 1, 8, 8), + (1, 3, 4, 4), + ], +] +TEST_CASES_DIFF_SHAPES = [ + [ + "AutoencoderKL", + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4), + "latent_channels": 3, + "attention_levels": [False, False], + "num_res_blocks": 1, + "with_encoder_nonlocal_attn": False, + "with_decoder_nonlocal_attn": False, + "norm_num_groups": 4, + }, + "DiffusionModelUNet", + { + "spatial_dims": 2, + "in_channels": 3, + "out_channels": 3, + "channels": [4, 4], + "norm_num_groups": 4, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 4, + }, + (1, 1, 12, 12), + (1, 3, 8, 8), + ], + [ + "VQVAE", + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": [4, 4], + "num_res_layers": 1, + "num_res_channels": [4, 4], + "downsample_parameters": ((2, 4, 1, 1), (2, 4, 1, 1)), + "upsample_parameters": ((2, 4, 1, 1, 0), (2, 4, 1, 1, 0)), + "num_embeddings": 16, + "embedding_dim": 3, + }, + "DiffusionModelUNet", + { + "spatial_dims": 2, + "in_channels": 3, + "out_channels": 3, + "channels": [8, 8], + "norm_num_groups": 8, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 8, + }, + (1, 1, 12, 12), + (1, 3, 8, 8), + ], + [ + "VQVAE", + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "channels": [4, 4], + "num_res_layers": 1, + "num_res_channels": [4, 4], + "downsample_parameters": ((2, 4, 1, 1), (2, 4, 1, 1)), + "upsample_parameters": ((2, 4, 1, 1, 0), (2, 4, 1, 1, 0)), + "num_embeddings": 16, + "embedding_dim": 3, + }, + "DiffusionModelUNet", + { + "spatial_dims": 3, + "in_channels": 3, + "out_channels": 3, + "channels": [8, 8], + "norm_num_groups": 8, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 8, + }, + (1, 1, 12, 12, 12), + (1, 3, 8, 8, 8), + ], + [ + "SPADEAutoencoderKL", + { + "spatial_dims": 2, + "label_nc": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4), + "latent_channels": 3, + "attention_levels": [False, False], + "num_res_blocks": 1, + "with_encoder_nonlocal_attn": False, + "with_decoder_nonlocal_attn": False, + "norm_num_groups": 4, + }, + "DiffusionModelUNet", + { + "spatial_dims": 2, + "in_channels": 3, + "out_channels": 3, + "channels": [4, 4], + "norm_num_groups": 4, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 4, + }, + (1, 1, 8, 8), + (1, 3, 4, 4), + ], + [ + "AutoencoderKL", + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4), + "latent_channels": 3, + "attention_levels": [False, False], + "num_res_blocks": 1, + "with_encoder_nonlocal_attn": False, + "with_decoder_nonlocal_attn": False, + "norm_num_groups": 4, + }, + "SPADEDiffusionModelUNet", + { + "spatial_dims": 2, + "label_nc": 3, + "in_channels": 3, + "out_channels": 3, + "channels": [4, 4], + "norm_num_groups": 4, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 4, + }, + (1, 1, 8, 8), + (1, 3, 4, 4), + ], + [ + "SPADEAutoencoderKL", + { + "spatial_dims": 2, + "label_nc": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4), + "latent_channels": 3, + "attention_levels": [False, False], + "num_res_blocks": 1, + "with_encoder_nonlocal_attn": False, + "with_decoder_nonlocal_attn": False, + "norm_num_groups": 4, + }, + "SPADEDiffusionModelUNet", + { + "spatial_dims": 2, + "label_nc": 3, + "in_channels": 3, + "out_channels": 3, + "channels": [4, 4], + "norm_num_groups": 4, + "attention_levels": [False, False], + "num_res_blocks": 1, + "num_head_channels": 4, + }, + (1, 1, 8, 8), + (1, 3, 4, 4), + ], +] + + +class TestDiffusionSamplingInferer(unittest.TestCase): + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_prediction_shape( + self, ae_model_type, autoencoder_params, dm_model_type, stage_2_params, input_shape, latent_shape + ): + stage_1 = None + + if ae_model_type == "AutoencoderKL": + stage_1 = AutoencoderKL(**autoencoder_params) + if ae_model_type == "VQVAE": + stage_1 = VQVAE(**autoencoder_params) + if dm_model_type == "SPADEDiffusionModelUNet": + stage_2 = SPADEDiffusionModelUNet(**stage_2_params) + else: + stage_2 = DiffusionModelUNet(**stage_2_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + stage_1.eval() + stage_2.eval() + + input = torch.randn(input_shape).to(device) + noise = torch.randn(latent_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = LatentDiffusionInferer(scheduler=scheduler, scale_factor=1.0) + scheduler.set_timesteps(num_inference_steps=10) + timesteps = torch.randint(0, scheduler.num_train_timesteps, (input_shape[0],), device=input.device).long() + + if dm_model_type == "SPADEDiffusionModelUNet": + input_shape_seg = list(input_shape) + if "label_nc" in stage_2_params.keys(): + input_shape_seg[1] = stage_2_params["label_nc"] + else: + input_shape_seg[1] = autoencoder_params["label_nc"] + input_seg = torch.randn(input_shape_seg).to(device) + prediction = inferer( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + seg=input_seg, + noise=noise, + timesteps=timesteps, + ) + else: + prediction = inferer( + inputs=input, autoencoder_model=stage_1, diffusion_model=stage_2, noise=noise, timesteps=timesteps + ) + self.assertEqual(prediction.shape, latent_shape) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_sample_shape( + self, ae_model_type, autoencoder_params, dm_model_type, stage_2_params, input_shape, latent_shape + ): + stage_1 = None + + if ae_model_type == "AutoencoderKL": + stage_1 = AutoencoderKL(**autoencoder_params) + if ae_model_type == "VQVAE": + stage_1 = VQVAE(**autoencoder_params) + if dm_model_type == "SPADEDiffusionModelUNet": + stage_2 = SPADEDiffusionModelUNet(**stage_2_params) + else: + stage_2 = DiffusionModelUNet(**stage_2_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + stage_1.eval() + stage_2.eval() + + noise = torch.randn(latent_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = LatentDiffusionInferer(scheduler=scheduler, scale_factor=1.0) + scheduler.set_timesteps(num_inference_steps=10) + + if ae_model_type == "SPADEAutoencoderKL" or dm_model_type == "SPADEDiffusionModelUNet": + input_shape_seg = list(input_shape) + if "label_nc" in stage_2_params.keys(): + input_shape_seg[1] = stage_2_params["label_nc"] + else: + input_shape_seg[1] = autoencoder_params["label_nc"] + input_seg = torch.randn(input_shape_seg).to(device) + sample = inferer.sample( + input_noise=noise, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + seg=input_seg, + ) + else: + sample = inferer.sample( + input_noise=noise, autoencoder_model=stage_1, diffusion_model=stage_2, scheduler=scheduler + ) + self.assertEqual(sample.shape, input_shape) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_sample_intermediates( + self, ae_model_type, autoencoder_params, dm_model_type, stage_2_params, input_shape, latent_shape + ): + stage_1 = None + + if ae_model_type == "AutoencoderKL": + stage_1 = AutoencoderKL(**autoencoder_params) + if ae_model_type == "VQVAE": + stage_1 = VQVAE(**autoencoder_params) + if ae_model_type == "SPADEAutoencoderKL": + stage_1 = SPADEAutoencoderKL(**autoencoder_params) + if dm_model_type == "SPADEDiffusionModelUNet": + stage_2 = SPADEDiffusionModelUNet(**stage_2_params) + else: + stage_2 = DiffusionModelUNet(**stage_2_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + stage_1.eval() + stage_2.eval() + + noise = torch.randn(latent_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = LatentDiffusionInferer(scheduler=scheduler, scale_factor=1.0) + scheduler.set_timesteps(num_inference_steps=10) + + if ae_model_type == "SPADEAutoencoderKL" or dm_model_type == "SPADEDiffusionModelUNet": + input_shape_seg = list(input_shape) + if "label_nc" in stage_2_params.keys(): + input_shape_seg[1] = stage_2_params["label_nc"] + else: + input_shape_seg[1] = autoencoder_params["label_nc"] + input_seg = torch.randn(input_shape_seg).to(device) + sample, intermediates = inferer.sample( + input_noise=noise, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + seg=input_seg, + save_intermediates=True, + intermediate_steps=1, + ) + else: + sample, intermediates = inferer.sample( + input_noise=noise, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + save_intermediates=True, + intermediate_steps=1, + ) + self.assertEqual(len(intermediates), 10) + self.assertEqual(intermediates[0].shape, input_shape) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_get_likelihoods( + self, ae_model_type, autoencoder_params, dm_model_type, stage_2_params, input_shape, latent_shape + ): + stage_1 = None + + if ae_model_type == "AutoencoderKL": + stage_1 = AutoencoderKL(**autoencoder_params) + if ae_model_type == "VQVAE": + stage_1 = VQVAE(**autoencoder_params) + if ae_model_type == "SPADEAutoencoderKL": + stage_1 = SPADEAutoencoderKL(**autoencoder_params) + if dm_model_type == "SPADEDiffusionModelUNet": + stage_2 = SPADEDiffusionModelUNet(**stage_2_params) + else: + stage_2 = DiffusionModelUNet(**stage_2_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + stage_1.eval() + stage_2.eval() + + input = torch.randn(input_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = LatentDiffusionInferer(scheduler=scheduler, scale_factor=1.0) + scheduler.set_timesteps(num_inference_steps=10) + + if dm_model_type == "SPADEDiffusionModelUNet": + input_shape_seg = list(input_shape) + if "label_nc" in stage_2_params.keys(): + input_shape_seg[1] = stage_2_params["label_nc"] + else: + input_shape_seg[1] = autoencoder_params["label_nc"] + input_seg = torch.randn(input_shape_seg).to(device) + sample, intermediates = inferer.get_likelihood( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + save_intermediates=True, + seg=input_seg, + ) + else: + sample, intermediates = inferer.get_likelihood( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + save_intermediates=True, + ) + self.assertEqual(len(intermediates), 10) + self.assertEqual(intermediates[0].shape, latent_shape) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_resample_likelihoods( + self, ae_model_type, autoencoder_params, dm_model_type, stage_2_params, input_shape, latent_shape + ): + stage_1 = None + + if ae_model_type == "AutoencoderKL": + stage_1 = AutoencoderKL(**autoencoder_params) + if ae_model_type == "VQVAE": + stage_1 = VQVAE(**autoencoder_params) + if ae_model_type == "SPADEAutoencoderKL": + stage_1 = SPADEAutoencoderKL(**autoencoder_params) + if dm_model_type == "SPADEDiffusionModelUNet": + stage_2 = SPADEDiffusionModelUNet(**stage_2_params) + else: + stage_2 = DiffusionModelUNet(**stage_2_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + stage_1.eval() + stage_2.eval() + + input = torch.randn(input_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = LatentDiffusionInferer(scheduler=scheduler, scale_factor=1.0) + scheduler.set_timesteps(num_inference_steps=10) + + if dm_model_type == "SPADEDiffusionModelUNet": + input_shape_seg = list(input_shape) + if "label_nc" in stage_2_params.keys(): + input_shape_seg[1] = stage_2_params["label_nc"] + else: + input_shape_seg[1] = autoencoder_params["label_nc"] + input_seg = torch.randn(input_shape_seg).to(device) + sample, intermediates = inferer.get_likelihood( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + save_intermediates=True, + resample_latent_likelihoods=True, + seg=input_seg, + ) + else: + sample, intermediates = inferer.get_likelihood( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + save_intermediates=True, + resample_latent_likelihoods=True, + ) + self.assertEqual(len(intermediates), 10) + self.assertEqual(intermediates[0].shape[2:], input_shape[2:]) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_prediction_shape_conditioned_concat( + self, ae_model_type, autoencoder_params, dm_model_type, stage_2_params, input_shape, latent_shape + ): + stage_1 = None + + if ae_model_type == "AutoencoderKL": + stage_1 = AutoencoderKL(**autoencoder_params) + if ae_model_type == "VQVAE": + stage_1 = VQVAE(**autoencoder_params) + if ae_model_type == "SPADEAutoencoderKL": + stage_1 = SPADEAutoencoderKL(**autoencoder_params) + stage_2_params = stage_2_params.copy() + n_concat_channel = 3 + stage_2_params["in_channels"] = stage_2_params["in_channels"] + n_concat_channel + if dm_model_type == "SPADEDiffusionModelUNet": + stage_2 = SPADEDiffusionModelUNet(**stage_2_params) + else: + stage_2 = DiffusionModelUNet(**stage_2_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + stage_1.eval() + stage_2.eval() + + input = torch.randn(input_shape).to(device) + noise = torch.randn(latent_shape).to(device) + conditioning_shape = list(latent_shape) + conditioning_shape[1] = n_concat_channel + conditioning = torch.randn(conditioning_shape).to(device) + + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = LatentDiffusionInferer(scheduler=scheduler, scale_factor=1.0) + scheduler.set_timesteps(num_inference_steps=10) + + timesteps = torch.randint(0, scheduler.num_train_timesteps, (input_shape[0],), device=input.device).long() + + if dm_model_type == "SPADEDiffusionModelUNet": + input_shape_seg = list(input_shape) + if "label_nc" in stage_2_params.keys(): + input_shape_seg[1] = stage_2_params["label_nc"] + else: + input_shape_seg[1] = autoencoder_params["label_nc"] + input_seg = torch.randn(input_shape_seg).to(device) + prediction = inferer( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + noise=noise, + timesteps=timesteps, + condition=conditioning, + mode="concat", + seg=input_seg, + ) + else: + prediction = inferer( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + noise=noise, + timesteps=timesteps, + condition=conditioning, + mode="concat", + ) + self.assertEqual(prediction.shape, latent_shape) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_sample_shape_conditioned_concat( + self, ae_model_type, autoencoder_params, dm_model_type, stage_2_params, input_shape, latent_shape + ): + stage_1 = None + + if ae_model_type == "AutoencoderKL": + stage_1 = AutoencoderKL(**autoencoder_params) + if ae_model_type == "VQVAE": + stage_1 = VQVAE(**autoencoder_params) + if ae_model_type == "SPADEAutoencoderKL": + stage_1 = SPADEAutoencoderKL(**autoencoder_params) + stage_2_params = stage_2_params.copy() + n_concat_channel = 3 + stage_2_params["in_channels"] = stage_2_params["in_channels"] + n_concat_channel + if dm_model_type == "SPADEDiffusionModelUNet": + stage_2 = SPADEDiffusionModelUNet(**stage_2_params) + else: + stage_2 = DiffusionModelUNet(**stage_2_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + stage_1.eval() + stage_2.eval() + + noise = torch.randn(latent_shape).to(device) + conditioning_shape = list(latent_shape) + conditioning_shape[1] = n_concat_channel + conditioning = torch.randn(conditioning_shape).to(device) + + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = LatentDiffusionInferer(scheduler=scheduler, scale_factor=1.0) + scheduler.set_timesteps(num_inference_steps=10) + + if dm_model_type == "SPADEDiffusionModelUNet": + input_shape_seg = list(input_shape) + if "label_nc" in stage_2_params.keys(): + input_shape_seg[1] = stage_2_params["label_nc"] + else: + input_shape_seg[1] = autoencoder_params["label_nc"] + input_seg = torch.randn(input_shape_seg).to(device) + sample = inferer.sample( + input_noise=noise, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + conditioning=conditioning, + mode="concat", + seg=input_seg, + ) + else: + sample = inferer.sample( + input_noise=noise, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + conditioning=conditioning, + mode="concat", + ) + self.assertEqual(sample.shape, input_shape) + + @parameterized.expand(TEST_CASES_DIFF_SHAPES) + @skipUnless(has_einops, "Requires einops") + def test_sample_shape_different_latents( + self, ae_model_type, autoencoder_params, dm_model_type, stage_2_params, input_shape, latent_shape + ): + stage_1 = None + + if ae_model_type == "AutoencoderKL": + stage_1 = AutoencoderKL(**autoencoder_params) + if ae_model_type == "VQVAE": + stage_1 = VQVAE(**autoencoder_params) + if ae_model_type == "SPADEAutoencoderKL": + stage_1 = SPADEAutoencoderKL(**autoencoder_params) + if dm_model_type == "SPADEDiffusionModelUNet": + stage_2 = SPADEDiffusionModelUNet(**stage_2_params) + else: + stage_2 = DiffusionModelUNet(**stage_2_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + stage_1.eval() + stage_2.eval() + + input = torch.randn(input_shape).to(device) + noise = torch.randn(latent_shape).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + # We infer the VAE shape + autoencoder_latent_shape = [i // (2 ** (len(autoencoder_params["channels"]) - 1)) for i in input_shape[2:]] + inferer = LatentDiffusionInferer( + scheduler=scheduler, + scale_factor=1.0, + ldm_latent_shape=list(latent_shape[2:]), + autoencoder_latent_shape=autoencoder_latent_shape, + ) + scheduler.set_timesteps(num_inference_steps=10) + + timesteps = torch.randint(0, scheduler.num_train_timesteps, (input_shape[0],), device=input.device).long() + + if dm_model_type == "SPADEDiffusionModelUNet": + input_shape_seg = list(input_shape) + if "label_nc" in stage_2_params.keys(): + input_shape_seg[1] = stage_2_params["label_nc"] + else: + input_shape_seg[1] = autoencoder_params["label_nc"] + input_seg = torch.randn(input_shape_seg).to(device) + prediction = inferer( + inputs=input, + autoencoder_model=stage_1, + diffusion_model=stage_2, + noise=noise, + timesteps=timesteps, + seg=input_seg, + ) + else: + prediction = inferer( + inputs=input, autoencoder_model=stage_1, diffusion_model=stage_2, noise=noise, timesteps=timesteps + ) + self.assertEqual(prediction.shape, latent_shape) + + @skipUnless(has_einops, "Requires einops") + def test_incompatible_spade_setup(self): + stage_1 = SPADEAutoencoderKL( + spatial_dims=2, + label_nc=6, + in_channels=1, + out_channels=1, + channels=(4, 4), + latent_channels=3, + attention_levels=[False, False], + num_res_blocks=1, + with_encoder_nonlocal_attn=False, + with_decoder_nonlocal_attn=False, + norm_num_groups=4, + ) + stage_2 = SPADEDiffusionModelUNet( + spatial_dims=2, + label_nc=3, + in_channels=3, + out_channels=3, + channels=[4, 4], + norm_num_groups=4, + attention_levels=[False, False], + num_res_blocks=1, + num_head_channels=4, + ) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + stage_1.eval() + stage_2.eval() + noise = torch.randn((1, 3, 4, 4)).to(device) + input_seg = torch.randn((1, 3, 8, 8)).to(device) + scheduler = DDPMScheduler(num_train_timesteps=10) + inferer = LatentDiffusionInferer(scheduler=scheduler, scale_factor=1.0) + scheduler.set_timesteps(num_inference_steps=10) + + with self.assertRaises(ValueError): + _ = inferer.sample( + input_noise=noise, + autoencoder_model=stage_1, + diffusion_model=stage_2, + scheduler=scheduler, + seg=input_seg, + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_load_imaged.py b/tests/test_load_imaged.py index 699ed70059..914240c705 100644 --- a/tests/test_load_imaged.py +++ b/tests/test_load_imaged.py @@ -190,7 +190,7 @@ def test_correct(self, input_p, expected_shape, track_meta): self.assertTrue(hasattr(r, "affine")) self.assertIsInstance(r.affine, torch.Tensor) self.assertEqual(r.meta["space"], "RAS") - self.assertTrue("qform_code" not in r.meta) + self.assertNotIn("qform_code", r.meta) else: self.assertIsInstance(r, torch.Tensor) self.assertNotIsInstance(r, MetaTensor) diff --git a/tests/test_load_spacing_orientation.py b/tests/test_load_spacing_orientation.py index 63422761ca..cbc730e1bb 100644 --- a/tests/test_load_spacing_orientation.py +++ b/tests/test_load_spacing_orientation.py @@ -48,7 +48,7 @@ def test_load_spacingd(self, filename): ref = resample_to_output(anat, (1, 0.2, 1), order=1) t2 = time.time() print(f"time scipy: {t2 - t1}") - self.assertTrue(t2 >= t1) + self.assertGreaterEqual(t2, t1) np.testing.assert_allclose(res_dict["image"].affine, ref.affine) np.testing.assert_allclose(res_dict["image"].shape[1:], ref.shape) np.testing.assert_allclose(ref.get_fdata(), res_dict["image"][0], atol=0.05) @@ -68,7 +68,7 @@ def test_load_spacingd_rotate(self, filename): ref = resample_to_output(anat, (1, 2, 3), order=1) t2 = time.time() print(f"time scipy: {t2 - t1}") - self.assertTrue(t2 >= t1) + self.assertGreaterEqual(t2, t1) np.testing.assert_allclose(res_dict["image"].affine, ref.affine) if "anatomical" not in filename: np.testing.assert_allclose(res_dict["image"].shape[1:], ref.shape) diff --git a/tests/test_look_up_option.py b/tests/test_look_up_option.py index d40b7eaa8c..75560b4ac4 100644 --- a/tests/test_look_up_option.py +++ b/tests/test_look_up_option.py @@ -56,7 +56,7 @@ def test_default(self): def test_str_enum(self): output = look_up_option("C", {"A", "B"}, default=None) - self.assertEqual(output, None) + self.assertIsNone(output) self.assertEqual(list(_CaseStrEnum), ["A", "B"]) self.assertEqual(_CaseStrEnum.MODE_A, "A") self.assertEqual(str(_CaseStrEnum.MODE_A), "A") diff --git a/tests/test_map_and_generate_sampling_centers.py b/tests/test_map_and_generate_sampling_centers.py new file mode 100644 index 0000000000..ff74f974b9 --- /dev/null +++ b/tests/test_map_and_generate_sampling_centers.py @@ -0,0 +1,87 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest +from copy import deepcopy + +import numpy as np +from parameterized import parameterized + +from monai.transforms import map_and_generate_sampling_centers +from monai.utils.misc import set_determinism +from tests.utils import TEST_NDARRAYS, assert_allclose + +TEST_CASE_1 = [ + # test Argmax data + { + "label": (np.array([[[0, 1, 2], [2, 0, 1], [1, 2, 0]]])), + "spatial_size": [2, 2, 2], + "num_samples": 2, + "label_spatial_shape": [3, 3, 3], + "num_classes": 3, + "image": None, + "ratios": [0, 1, 2], + "image_threshold": 0.0, + }, + tuple, + 2, + 3, +] + +TEST_CASE_2 = [ + { + "label": ( + np.array( + [ + [[1, 0, 0], [0, 1, 0], [0, 0, 1]], + [[0, 1, 0], [0, 0, 1], [1, 0, 0]], + [[0, 0, 1], [1, 0, 0], [0, 1, 0]], + ] + ) + ), + "spatial_size": [2, 2, 2], + "num_samples": 1, + "ratios": None, + "label_spatial_shape": [3, 3, 3], + "image": None, + "image_threshold": 0.0, + }, + tuple, + 1, + 3, +] + + +class TestMapAndGenerateSamplingCenters(unittest.TestCase): + + @parameterized.expand([TEST_CASE_1, TEST_CASE_2]) + def test_map_and_generate_sampling_centers(self, input_data, expected_type, expected_count, expected_shape): + results = [] + for p in TEST_NDARRAYS + (None,): + input_data = deepcopy(input_data) + if p is not None: + input_data["label"] = p(input_data["label"]) + set_determinism(0) + result = map_and_generate_sampling_centers(**input_data) + self.assertIsInstance(result, expected_type) + self.assertEqual(len(result), expected_count) + self.assertEqual(len(result[0]), expected_shape) + # check for consistency between numpy, torch and torch.cuda + results.append(result) + if len(results) > 1: + for x, y in zip(result[0], result[-1]): + assert_allclose(x, y, type_test=False) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_matshow3d.py b/tests/test_matshow3d.py index e513025e69..2eba310f4e 100644 --- a/tests/test_matshow3d.py +++ b/tests/test_matshow3d.py @@ -78,7 +78,7 @@ def test_samples(self): fig, mat = matshow3d( [im[keys] for im in ims], title=f"testing {keys}", figsize=(2, 2), frames_per_row=5, every_n=2, show=False ) - self.assertTrue(mat.dtype == np.float32) + self.assertEqual(mat.dtype, np.float32) with tempfile.TemporaryDirectory() as tempdir: tempimg = f"{tempdir}/matshow3d_patch_test.png" @@ -114,6 +114,7 @@ def test_3d_rgb(self): every_n=2, frame_dim=-1, channel_dim=0, + fill_value=0, show=False, ) diff --git a/tests/test_median_filter.py b/tests/test_median_filter.py index 1f5e623260..02fa812380 100644 --- a/tests/test_median_filter.py +++ b/tests/test_median_filter.py @@ -15,27 +15,21 @@ import numpy as np import torch +from parameterized import parameterized from monai.networks.layers import MedianFilter class MedianFilterTestCase(unittest.TestCase): - def test_3d_big(self): - a = torch.ones(1, 1, 2, 3, 5) - g = MedianFilter([1, 2, 4]).to(torch.device("cpu:0")) + @parameterized.expand([(torch.ones(1, 1, 2, 3, 5), [1, 2, 4]), (torch.ones(1, 1, 4, 3, 4), 1)]) # 3d_big # 3d + def test_3d(self, input_tensor, radius): + filter = MedianFilter(radius).to(torch.device("cpu:0")) - expected = a.numpy() - out = g(a).cpu().numpy() - np.testing.assert_allclose(out, expected, rtol=1e-5) - - def test_3d(self): - a = torch.ones(1, 1, 4, 3, 4) - g = MedianFilter(1).to(torch.device("cpu:0")) + expected = input_tensor.numpy() + output = filter(input_tensor).cpu().numpy() - expected = a.numpy() - out = g(a).cpu().numpy() - np.testing.assert_allclose(out, expected, rtol=1e-5) + np.testing.assert_allclose(output, expected, rtol=1e-5) def test_3d_radii(self): a = torch.ones(1, 1, 4, 3, 2) diff --git a/tests/test_mednistdataset.py b/tests/test_mednistdataset.py index baf3bf4f2d..c1b21e9373 100644 --- a/tests/test_mednistdataset.py +++ b/tests/test_mednistdataset.py @@ -41,7 +41,7 @@ def _test_dataset(dataset): self.assertEqual(len(dataset), int(MEDNIST_FULL_DATASET_LENGTH * dataset.test_frac)) self.assertTrue("image" in dataset[0]) self.assertTrue("label" in dataset[0]) - self.assertTrue(isinstance(dataset[0]["image"], MetaTensor)) + self.assertIsInstance(dataset[0]["image"], MetaTensor) self.assertTupleEqual(dataset[0]["image"].shape, (1, 64, 64)) with skip_if_downloading_fails(): @@ -65,11 +65,8 @@ def _test_dataset(dataset): self.assertEqual(data[0]["class_name"], "AbdomenCT") self.assertEqual(data[0]["label"], 0) shutil.rmtree(os.path.join(testing_dir, "MedNIST")) - try: + with self.assertRaisesRegex(RuntimeError, "^Cannot find dataset directory"): MedNISTDataset(root_dir=testing_dir, transform=transform, section="test", download=False) - except RuntimeError as e: - print(str(e)) - self.assertTrue(str(e).startswith("Cannot find dataset directory")) if __name__ == "__main__": diff --git a/tests/test_meta_affine.py b/tests/test_meta_affine.py index 95764a0c89..890734391f 100644 --- a/tests/test_meta_affine.py +++ b/tests/test_meta_affine.py @@ -160,7 +160,7 @@ def test_linear_consistent(self, xform_cls, input_dict, atol): diff = np.abs(itk.GetArrayFromImage(ref_2) - itk.GetArrayFromImage(expected)) avg_diff = np.mean(diff) - self.assertTrue(avg_diff < atol, f"{xform_cls} avg_diff: {avg_diff}, tol: {atol}") + self.assertLess(avg_diff, atol, f"{xform_cls} avg_diff: {avg_diff}, tol: {atol}") @parameterized.expand(TEST_CASES_DICT) def test_linear_consistent_dict(self, xform_cls, input_dict, atol): @@ -175,7 +175,7 @@ def test_linear_consistent_dict(self, xform_cls, input_dict, atol): diff = {k: np.abs(itk.GetArrayFromImage(ref_2[k]) - itk.GetArrayFromImage(expected[k])) for k in keys} avg_diff = {k: np.mean(diff[k]) for k in keys} for k in keys: - self.assertTrue(avg_diff[k] < atol, f"{xform_cls} avg_diff: {avg_diff}, tol: {atol}") + self.assertLess(avg_diff[k], atol, f"{xform_cls} avg_diff: {avg_diff}, tol: {atol}") if __name__ == "__main__": diff --git a/tests/test_meta_tensor.py b/tests/test_meta_tensor.py index 1815d3ea73..a80a00be93 100644 --- a/tests/test_meta_tensor.py +++ b/tests/test_meta_tensor.py @@ -221,9 +221,9 @@ def test_stack(self, device, dtype): def test_get_set_meta_fns(self): set_track_meta(False) - self.assertEqual(get_track_meta(), False) + self.assertFalse(get_track_meta()) set_track_meta(True) - self.assertEqual(get_track_meta(), True) + self.assertTrue(get_track_meta()) @parameterized.expand(TEST_DEVICES) def test_torchscript(self, device): diff --git a/tests/test_mmar_download.py b/tests/test_mmar_download.py index 6af3d09fb2..2ac73a8149 100644 --- a/tests/test_mmar_download.py +++ b/tests/test_mmar_download.py @@ -142,7 +142,7 @@ def test_load_ckpt(self, input_args, expected_name, expected_val): def test_unique(self): # model ids are unique keys = sorted(m["id"] for m in MODEL_DESC) - self.assertTrue(keys == sorted(set(keys))) + self.assertEqual(keys, sorted(set(keys))) def test_search(self): self.assertEqual(_get_val({"a": 1, "b": 2}, key="b"), 2) diff --git a/tests/test_monai_utils_misc.py b/tests/test_monai_utils_misc.py index a2a4ed62f7..f4eb5d3956 100644 --- a/tests/test_monai_utils_misc.py +++ b/tests/test_monai_utils_misc.py @@ -92,12 +92,11 @@ def test_run_cmd(self): cmd2 = "-c" cmd3 = 'import sys; print("\\tThis is on stderr\\n", file=sys.stderr); sys.exit(1)' os.environ["MONAI_DEBUG"] = str(True) - try: + with self.assertRaises(RuntimeError) as cm: run_cmd([cmd1, cmd2, cmd3], check=True) - except RuntimeError as err: - self.assertIn("This is on stderr", str(err)) - self.assertNotIn("\\n", str(err)) - self.assertNotIn("\\t", str(err)) + self.assertIn("This is on stderr", str(cm.exception)) + self.assertNotIn("\\n", str(cm.exception)) + self.assertNotIn("\\t", str(cm.exception)) if __name__ == "__main__": diff --git a/tests/test_morphological_ops.py b/tests/test_morphological_ops.py new file mode 100644 index 0000000000..6f29415759 --- /dev/null +++ b/tests/test_morphological_ops.py @@ -0,0 +1,102 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +import torch +from parameterized import parameterized + +from monai.apps.generation.maisi.utils.morphological_ops import dilate, erode, get_morphological_filter_result_t +from tests.utils import TEST_NDARRAYS, assert_allclose + +TESTS_SHAPE = [] +for p in TEST_NDARRAYS: + mask = torch.zeros(1, 1, 5, 5, 5) + filter_size = 3 + TESTS_SHAPE.append([{"mask": p(mask), "filter_size": filter_size}, [1, 1, 5, 5, 5]]) + mask = torch.zeros(3, 2, 5, 5, 5) + filter_size = 5 + TESTS_SHAPE.append([{"mask": p(mask), "filter_size": filter_size}, [3, 2, 5, 5, 5]]) + mask = torch.zeros(1, 1, 1, 1, 1) + filter_size = 5 + TESTS_SHAPE.append([{"mask": p(mask), "filter_size": filter_size}, [1, 1, 1, 1, 1]]) + mask = torch.zeros(1, 1, 1, 1) + filter_size = 5 + TESTS_SHAPE.append([{"mask": p(mask), "filter_size": filter_size}, [1, 1, 1, 1]]) + +TESTS_VALUE_T = [] +filter_size = 3 +mask = torch.ones(3, 2, 3, 3, 3) +TESTS_VALUE_T.append([{"mask": mask, "filter_size": filter_size, "pad_value": 1.0}, torch.ones(3, 2, 3, 3, 3)]) +mask = torch.zeros(3, 2, 3, 3, 3) +TESTS_VALUE_T.append([{"mask": mask, "filter_size": filter_size, "pad_value": 0.0}, torch.zeros(3, 2, 3, 3, 3)]) +mask = torch.ones(3, 2, 3, 3) +TESTS_VALUE_T.append([{"mask": mask, "filter_size": filter_size, "pad_value": 1.0}, torch.ones(3, 2, 3, 3)]) +mask = torch.zeros(3, 2, 3, 3) +TESTS_VALUE_T.append([{"mask": mask, "filter_size": filter_size, "pad_value": 0.0}, torch.zeros(3, 2, 3, 3)]) + +TESTS_VALUE = [] +for p in TEST_NDARRAYS: + mask = torch.zeros(3, 2, 5, 5, 5) + filter_size = 3 + TESTS_VALUE.append( + [{"mask": p(mask), "filter_size": filter_size}, p(torch.zeros(3, 2, 5, 5, 5)), p(torch.zeros(3, 2, 5, 5, 5))] + ) + mask = torch.ones(1, 1, 3, 3, 3) + filter_size = 3 + TESTS_VALUE.append( + [{"mask": p(mask), "filter_size": filter_size}, p(torch.ones(1, 1, 3, 3, 3)), p(torch.ones(1, 1, 3, 3, 3))] + ) + mask = torch.ones(1, 2, 3, 3, 3) + filter_size = 3 + TESTS_VALUE.append( + [{"mask": p(mask), "filter_size": filter_size}, p(torch.ones(1, 2, 3, 3, 3)), p(torch.ones(1, 2, 3, 3, 3))] + ) + mask = torch.zeros(3, 2, 3, 3, 3) + mask[:, :, 1, 1, 1] = 1.0 + filter_size = 3 + TESTS_VALUE.append( + [{"mask": p(mask), "filter_size": filter_size}, p(torch.zeros(3, 2, 3, 3, 3)), p(torch.ones(3, 2, 3, 3, 3))] + ) + mask = torch.zeros(3, 2, 3, 3) + mask[:, :, 1, 1] = 1.0 + filter_size = 3 + TESTS_VALUE.append( + [{"mask": p(mask), "filter_size": filter_size}, p(torch.zeros(3, 2, 3, 3)), p(torch.ones(3, 2, 3, 3))] + ) + + +class TestMorph(unittest.TestCase): + + @parameterized.expand(TESTS_SHAPE) + def test_shape(self, input_data, expected_result): + result1 = erode(input_data["mask"], input_data["filter_size"]) + assert_allclose(result1.shape, expected_result, type_test=False, device_test=False, atol=0.0) + + @parameterized.expand(TESTS_VALUE_T) + def test_value_t(self, input_data, expected_result): + result1 = get_morphological_filter_result_t( + input_data["mask"], input_data["filter_size"], input_data["pad_value"] + ) + assert_allclose(result1, expected_result, type_test=False, device_test=False, atol=0.0) + + @parameterized.expand(TESTS_VALUE) + def test_value(self, input_data, expected_erode_result, expected_dilate_result): + result1 = erode(input_data["mask"], input_data["filter_size"]) + assert_allclose(result1, expected_erode_result, type_test=True, device_test=True, atol=0.0) + result2 = dilate(input_data["mask"], input_data["filter_size"]) + assert_allclose(result2, expected_dilate_result, type_test=True, device_test=True, atol=0.0) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_multi_scale.py b/tests/test_multi_scale.py index 6681f266a8..0b49087216 100644 --- a/tests/test_multi_scale.py +++ b/tests/test_multi_scale.py @@ -58,17 +58,24 @@ def test_shape(self, input_param, input_data, expected_val): result = MultiScaleLoss(**input_param).forward(**input_data) np.testing.assert_allclose(result.detach().cpu().numpy(), expected_val, rtol=1e-5) - def test_ill_opts(self): - with self.assertRaisesRegex(ValueError, ""): - MultiScaleLoss(loss=dice_loss, kernel="none") - with self.assertRaisesRegex(ValueError, ""): - MultiScaleLoss(loss=dice_loss, scales=[-1])( - torch.ones((1, 1, 3), device=device), torch.ones((1, 1, 3), device=device) - ) - with self.assertRaisesRegex(ValueError, ""): - MultiScaleLoss(loss=dice_loss, scales=[-1], reduction="none")( - torch.ones((1, 1, 3), device=device), torch.ones((1, 1, 3), device=device) - ) + @parameterized.expand( + [ + ({"loss": dice_loss, "kernel": "none"}, None, None), # kernel_none + ({"loss": dice_loss, "scales": [-1]}, torch.ones((1, 1, 3)), torch.ones((1, 1, 3))), # scales_negative + ( + {"loss": dice_loss, "scales": [-1], "reduction": "none"}, + torch.ones((1, 1, 3)), + torch.ones((1, 1, 3)), + ), # scales_negative_reduction_none + ] + ) + def test_ill_opts(self, kwargs, input, target): + if input is None and target is None: + with self.assertRaisesRegex(ValueError, ""): + MultiScaleLoss(**kwargs) + else: + with self.assertRaisesRegex(ValueError, ""): + MultiScaleLoss(**kwargs)(input, target) def test_script(self): input_param, input_data, expected_val = TEST_CASES[0] diff --git a/tests/test_optional_import.py b/tests/test_optional_import.py index e7e1c03fd0..2f640f88d0 100644 --- a/tests/test_optional_import.py +++ b/tests/test_optional_import.py @@ -13,22 +13,20 @@ import unittest +from parameterized import parameterized + from monai.utils import OptionalImportError, exact_version, optional_import class TestOptionalImport(unittest.TestCase): - def test_default(self): - my_module, flag = optional_import("not_a_module") + @parameterized.expand(["not_a_module", "torch.randint"]) + def test_default(self, import_module): + my_module, flag = optional_import(import_module) self.assertFalse(flag) with self.assertRaises(OptionalImportError): my_module.test - my_module, flag = optional_import("torch.randint") - with self.assertRaises(OptionalImportError): - self.assertFalse(flag) - print(my_module.test) - def test_import_valid(self): my_module, flag = optional_import("torch") self.assertTrue(flag) @@ -47,18 +45,9 @@ def test_import_wrong_number(self): self.assertTrue(flag) print(my_module.randint(1, 2, (1, 2))) - def test_import_good_number(self): - my_module, flag = optional_import("torch", "0") - my_module.nn - self.assertTrue(flag) - print(my_module.randint(1, 2, (1, 2))) - - my_module, flag = optional_import("torch", "0.0.0.1") - my_module.nn - self.assertTrue(flag) - print(my_module.randint(1, 2, (1, 2))) - - my_module, flag = optional_import("torch", "1.1.0") + @parameterized.expand(["0", "0.0.0.1", "1.1.0"]) + def test_import_good_number(self, version_number): + my_module, flag = optional_import("torch", version_number) my_module.nn self.assertTrue(flag) print(my_module.randint(1, 2, (1, 2))) diff --git a/tests/test_ordering.py b/tests/test_ordering.py new file mode 100644 index 0000000000..e6b235e179 --- /dev/null +++ b/tests/test_ordering.py @@ -0,0 +1,289 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +import numpy as np +from parameterized import parameterized + +from monai.utils.enums import OrderingTransformations, OrderingType +from monai.utils.ordering import Ordering + +TEST_2D_NON_RANDOM = [ + [ + { + "ordering_type": OrderingType.RASTER_SCAN, + "spatial_dims": 2, + "dimensions": (1, 2, 2), + "reflected_spatial_dims": (), + "transpositions_axes": (), + "rot90_axes": (), + "transformation_order": ( + OrderingTransformations.TRANSPOSE.value, + OrderingTransformations.ROTATE_90.value, + OrderingTransformations.REFLECT.value, + ), + }, + [0, 1, 2, 3], + ], + [ + { + "ordering_type": OrderingType.S_CURVE, + "spatial_dims": 2, + "dimensions": (1, 2, 2), + "reflected_spatial_dims": (), + "transpositions_axes": (), + "rot90_axes": (), + "transformation_order": ( + OrderingTransformations.TRANSPOSE.value, + OrderingTransformations.ROTATE_90.value, + OrderingTransformations.REFLECT.value, + ), + }, + [0, 1, 3, 2], + ], + [ + { + "ordering_type": OrderingType.RASTER_SCAN, + "spatial_dims": 2, + "dimensions": (1, 2, 2), + "reflected_spatial_dims": (True, False), + "transpositions_axes": (), + "rot90_axes": (), + "transformation_order": ( + OrderingTransformations.TRANSPOSE.value, + OrderingTransformations.ROTATE_90.value, + OrderingTransformations.REFLECT.value, + ), + }, + [2, 3, 0, 1], + ], + [ + { + "ordering_type": OrderingType.S_CURVE, + "spatial_dims": 2, + "dimensions": (1, 2, 2), + "reflected_spatial_dims": (True, False), + "transpositions_axes": (), + "rot90_axes": (), + "transformation_order": ( + OrderingTransformations.TRANSPOSE.value, + OrderingTransformations.ROTATE_90.value, + OrderingTransformations.REFLECT.value, + ), + }, + [2, 3, 1, 0], + ], + [ + { + "ordering_type": OrderingType.RASTER_SCAN, + "spatial_dims": 2, + "dimensions": (1, 2, 2), + "reflected_spatial_dims": (), + "transpositions_axes": ((1, 0),), + "rot90_axes": (), + "transformation_order": ( + OrderingTransformations.TRANSPOSE.value, + OrderingTransformations.ROTATE_90.value, + OrderingTransformations.REFLECT.value, + ), + }, + [0, 2, 1, 3], + ], + [ + { + "ordering_type": OrderingType.S_CURVE, + "spatial_dims": 2, + "dimensions": (1, 2, 2), + "reflected_spatial_dims": (), + "transpositions_axes": ((1, 0),), + "rot90_axes": (), + "transformation_order": ( + OrderingTransformations.TRANSPOSE.value, + OrderingTransformations.ROTATE_90.value, + OrderingTransformations.REFLECT.value, + ), + }, + [0, 2, 3, 1], + ], + [ + { + "ordering_type": OrderingType.RASTER_SCAN, + "spatial_dims": 2, + "dimensions": (1, 2, 2), + "reflected_spatial_dims": (), + "transpositions_axes": (), + "rot90_axes": ((0, 1),), + "transformation_order": ( + OrderingTransformations.TRANSPOSE.value, + OrderingTransformations.ROTATE_90.value, + OrderingTransformations.REFLECT.value, + ), + }, + [1, 3, 0, 2], + ], + [ + { + "ordering_type": OrderingType.S_CURVE, + "spatial_dims": 2, + "dimensions": (1, 2, 2), + "reflected_spatial_dims": (), + "transpositions_axes": (), + "rot90_axes": ((0, 1),), + "transformation_order": ( + OrderingTransformations.TRANSPOSE.value, + OrderingTransformations.ROTATE_90.value, + OrderingTransformations.REFLECT.value, + ), + }, + [1, 3, 2, 0], + ], + [ + { + "ordering_type": OrderingType.RASTER_SCAN, + "spatial_dims": 2, + "dimensions": (1, 2, 2), + "reflected_spatial_dims": (True, False), + "transpositions_axes": ((1, 0),), + "rot90_axes": ((0, 1),), + "transformation_order": ( + OrderingTransformations.TRANSPOSE.value, + OrderingTransformations.ROTATE_90.value, + OrderingTransformations.REFLECT.value, + ), + }, + [0, 1, 2, 3], + ], + [ + { + "ordering_type": OrderingType.S_CURVE, + "spatial_dims": 2, + "dimensions": (1, 2, 2), + "reflected_spatial_dims": (True, False), + "transpositions_axes": ((1, 0),), + "rot90_axes": ((0, 1),), + "transformation_order": ( + OrderingTransformations.TRANSPOSE.value, + OrderingTransformations.ROTATE_90.value, + OrderingTransformations.REFLECT.value, + ), + }, + [0, 1, 3, 2], + ], +] + + +TEST_3D = [ + [ + { + "ordering_type": OrderingType.RASTER_SCAN, + "spatial_dims": 3, + "dimensions": (1, 2, 2, 2), + "reflected_spatial_dims": (), + "transpositions_axes": (), + "rot90_axes": (), + "transformation_order": ( + OrderingTransformations.TRANSPOSE.value, + OrderingTransformations.ROTATE_90.value, + OrderingTransformations.REFLECT.value, + ), + }, + [0, 1, 2, 3, 4, 5, 6, 7], + ] +] + +TEST_ORDERING_TYPE_FAILURE = [ + [ + { + "ordering_type": "hilbert", + "spatial_dims": 2, + "dimensions": (1, 2, 2), + "reflected_spatial_dims": (True, False), + "transpositions_axes": ((1, 0),), + "rot90_axes": ((0, 1),), + "transformation_order": ( + OrderingTransformations.TRANSPOSE.value, + OrderingTransformations.ROTATE_90.value, + OrderingTransformations.REFLECT.value, + ), + } + ] +] + +TEST_ORDERING_TRANSFORMATION_FAILURE = [ + [ + { + "ordering_type": OrderingType.S_CURVE, + "spatial_dims": 2, + "dimensions": (1, 2, 2), + "reflected_spatial_dims": (True, False), + "transpositions_axes": ((1, 0),), + "rot90_axes": ((0, 1),), + "transformation_order": ( + OrderingTransformations.TRANSPOSE.value, + OrderingTransformations.ROTATE_90.value, + "flip", + ), + } + ] +] + +TEST_REVERT = [ + [ + { + "ordering_type": OrderingType.S_CURVE, + "spatial_dims": 2, + "dimensions": (1, 2, 2), + "reflected_spatial_dims": (True, False), + "transpositions_axes": (), + "rot90_axes": (), + "transformation_order": ( + OrderingTransformations.TRANSPOSE.value, + OrderingTransformations.ROTATE_90.value, + OrderingTransformations.REFLECT.value, + ), + } + ] +] + + +class TestOrdering(unittest.TestCase): + @parameterized.expand(TEST_2D_NON_RANDOM + TEST_3D) + def test_ordering(self, input_param, expected_sequence_ordering): + ordering = Ordering(**input_param) + self.assertTrue(np.array_equal(ordering.get_sequence_ordering(), expected_sequence_ordering, equal_nan=True)) + + @parameterized.expand(TEST_ORDERING_TYPE_FAILURE) + def test_ordering_type_failure(self, input_param): + with self.assertRaises(ValueError): + Ordering(**input_param) + + @parameterized.expand(TEST_ORDERING_TRANSFORMATION_FAILURE) + def test_ordering_transformation_failure(self, input_param): + with self.assertRaises(ValueError): + Ordering(**input_param) + + @parameterized.expand(TEST_REVERT) + def test_revert(self, input_param): + sequence = np.random.randint(0, 100, size=input_param["dimensions"]).flatten() + + ordering = Ordering(**input_param) + + reverted_sequence = sequence[ordering.get_sequence_ordering()] + reverted_sequence = reverted_sequence[ordering.get_revert_sequence_ordering()] + + self.assertTrue(np.array_equal(sequence, reverted_sequence, equal_nan=True)) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_pad_collation.py b/tests/test_pad_collation.py index ee6e001438..9d5012c9a3 100644 --- a/tests/test_pad_collation.py +++ b/tests/test_pad_collation.py @@ -89,7 +89,7 @@ def tearDown(self) -> None: @parameterized.expand(TESTS) def test_pad_collation(self, t_type, collate_method, transform): - if t_type == dict: + if t_type is dict: dataset = CacheDataset(self.dict_data, transform, progress=False) else: dataset = _Dataset(self.list_data, self.list_labels, transform) @@ -104,7 +104,7 @@ def test_pad_collation(self, t_type, collate_method, transform): loader = DataLoader(dataset, batch_size=10, collate_fn=collate_method) # check collation in forward direction for data in loader: - if t_type == dict: + if t_type is dict: shapes = [] decollated_data = decollate_batch(data) for d in decollated_data: @@ -113,11 +113,11 @@ def test_pad_collation(self, t_type, collate_method, transform): self.assertTrue(len(output["image"].applied_operations), len(dataset.transform.transforms)) self.assertTrue(len(set(shapes)) > 1) # inverted shapes must be different because of random xforms - if t_type == dict: + if t_type is dict: batch_inverse = BatchInverseTransform(dataset.transform, loader) for data in loader: output = batch_inverse(data) - self.assertTrue(output[0]["image"].shape, (1, 10, 9)) + self.assertEqual(output[0]["image"].shape, (1, 10, 9)) if __name__ == "__main__": diff --git a/tests/test_patch_gan_dicriminator.py b/tests/test_patch_gan_dicriminator.py new file mode 100644 index 0000000000..c19898e70d --- /dev/null +++ b/tests/test_patch_gan_dicriminator.py @@ -0,0 +1,179 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +import torch +from parameterized import parameterized + +from monai.networks import eval_mode +from monai.networks.nets import MultiScalePatchDiscriminator, PatchDiscriminator +from tests.utils import test_script_save + +TEST_PATCHGAN = [ + [ + { + "num_layers_d": 3, + "spatial_dims": 2, + "channels": 8, + "in_channels": 3, + "out_channels": 1, + "kernel_size": 3, + "activation": "LEAKYRELU", + "norm": "instance", + "bias": False, + "dropout": 0.1, + }, + torch.rand([1, 3, 256, 512]), + (1, 8, 128, 256), + (1, 1, 32, 64), + ], + [ + { + "num_layers_d": 3, + "spatial_dims": 3, + "channels": 8, + "in_channels": 3, + "out_channels": 1, + "kernel_size": 3, + "activation": "LEAKYRELU", + "norm": "instance", + "bias": False, + "dropout": 0.1, + }, + torch.rand([1, 3, 256, 512, 256]), + (1, 8, 128, 256, 128), + (1, 1, 32, 64, 32), + ], +] + +TEST_MULTISCALE_PATCHGAN = [ + [ + { + "num_d": 2, + "num_layers_d": 3, + "spatial_dims": 2, + "channels": 8, + "in_channels": 3, + "out_channels": 1, + "kernel_size": 3, + "activation": "LEAKYRELU", + "norm": "instance", + "bias": False, + "dropout": 0.1, + "minimum_size_im": 256, + }, + torch.rand([1, 3, 256, 512]), + [(1, 1, 32, 64), (1, 1, 4, 8)], + [4, 7], + ], + [ + { + "num_d": 2, + "num_layers_d": 3, + "spatial_dims": 3, + "channels": 8, + "in_channels": 3, + "out_channels": 1, + "kernel_size": 3, + "activation": "LEAKYRELU", + "norm": "instance", + "bias": False, + "dropout": 0.1, + "minimum_size_im": 256, + }, + torch.rand([1, 3, 256, 512, 256]), + [(1, 1, 32, 64, 32), (1, 1, 4, 8, 4)], + [4, 7], + ], +] +TEST_TOO_SMALL_SIZE = [ + { + "num_d": 2, + "num_layers_d": 6, + "spatial_dims": 2, + "channels": 8, + "in_channels": 3, + "out_channels": 1, + "kernel_size": 3, + "activation": "LEAKYRELU", + "norm": "instance", + "bias": False, + "dropout": 0.1, + "minimum_size_im": 256, + } +] + + +class TestPatchGAN(unittest.TestCase): + @parameterized.expand(TEST_PATCHGAN) + def test_shape(self, input_param, input_data, expected_shape_feature, expected_shape_output): + net = PatchDiscriminator(**input_param) + with eval_mode(net): + result = net.forward(input_data) + self.assertEqual(tuple(result[0].shape), expected_shape_feature) + self.assertEqual(tuple(result[-1].shape), expected_shape_output) + + def test_script(self): + net = PatchDiscriminator( + num_layers_d=3, + spatial_dims=2, + channels=8, + in_channels=3, + out_channels=1, + kernel_size=3, + activation="LEAKYRELU", + norm="instance", + bias=False, + dropout=0.1, + ) + i = torch.rand([1, 3, 256, 512]) + test_script_save(net, i) + + +class TestMultiscalePatchGAN(unittest.TestCase): + @parameterized.expand(TEST_MULTISCALE_PATCHGAN) + def test_shape(self, input_param, input_data, expected_shape, features_lengths=None): + net = MultiScalePatchDiscriminator(**input_param) + with eval_mode(net): + result, features = net.forward(input_data) + for r_ind, r in enumerate(result): + self.assertEqual(tuple(r.shape), expected_shape[r_ind]) + for o_d_ind, o_d in enumerate(features): + self.assertEqual(len(o_d), features_lengths[o_d_ind]) + + def test_too_small_shape(self): + with self.assertRaises(AssertionError): + MultiScalePatchDiscriminator(**TEST_TOO_SMALL_SIZE[0]) + + def test_script(self): + net = MultiScalePatchDiscriminator( + num_d=2, + num_layers_d=3, + spatial_dims=2, + channels=8, + in_channels=3, + out_channels=1, + kernel_size=3, + activation="LEAKYRELU", + norm="instance", + bias=False, + dropout=0.1, + minimum_size_im=256, + ) + i = torch.rand([1, 3, 256, 512]) + test_script_save(net, i) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_patchembedding.py b/tests/test_patchembedding.py index f8610d9214..d059145033 100644 --- a/tests/test_patchembedding.py +++ b/tests/test_patchembedding.py @@ -93,6 +93,32 @@ def test_shape(self, input_param, input_shape, expected_shape): result = net(torch.randn(input_shape)) self.assertEqual(result.shape, expected_shape) + def test_sincos_pos_embed(self): + net = PatchEmbeddingBlock( + in_channels=1, + img_size=(32, 32, 32), + patch_size=(8, 8, 8), + hidden_size=96, + num_heads=8, + pos_embed_type="sincos", + dropout_rate=0.5, + ) + + self.assertEqual(net.position_embeddings.requires_grad, False) + + def test_learnable_pos_embed(self): + net = PatchEmbeddingBlock( + in_channels=1, + img_size=(32, 32, 32), + patch_size=(8, 8, 8), + hidden_size=96, + num_heads=8, + pos_embed_type="learnable", + dropout_rate=0.5, + ) + + self.assertEqual(net.position_embeddings.requires_grad, True) + def test_ill_arg(self): with self.assertRaises(ValueError): PatchEmbeddingBlock( diff --git a/tests/test_perceptual_loss.py b/tests/test_perceptual_loss.py index ba204af697..b8aa2e5982 100644 --- a/tests/test_perceptual_loss.py +++ b/tests/test_perceptual_loss.py @@ -18,7 +18,7 @@ from monai.losses import PerceptualLoss from monai.utils import optional_import -from tests.utils import SkipIfBeforePyTorchVersion, skip_if_downloading_fails, skip_if_quick +from tests.utils import SkipIfBeforePyTorchVersion, assert_allclose, skip_if_downloading_fails, skip_if_quick _, has_torchvision = optional_import("torchvision") TEST_CASES = [ @@ -40,6 +40,31 @@ (2, 1, 64, 64, 64), (2, 1, 64, 64, 64), ], + [ + {"spatial_dims": 3, "network_type": "medicalnet_resnet10_23datasets", "is_fake_3d": False}, + (2, 6, 64, 64, 64), + (2, 6, 64, 64, 64), + ], + [ + { + "spatial_dims": 3, + "network_type": "medicalnet_resnet10_23datasets", + "is_fake_3d": False, + "channel_wise": True, + }, + (2, 6, 64, 64, 64), + (2, 6, 64, 64, 64), + ], + [ + {"spatial_dims": 3, "network_type": "medicalnet_resnet50_23datasets", "is_fake_3d": False}, + (2, 1, 64, 64, 64), + (2, 1, 64, 64, 64), + ], + [ + {"spatial_dims": 3, "network_type": "medicalnet_resnet50_23datasets", "is_fake_3d": False}, + (2, 6, 64, 64, 64), + (2, 6, 64, 64, 64), + ], [ {"spatial_dims": 3, "network_type": "resnet50", "is_fake_3d": True, "pretrained": True, "fake_3d_ratio": 0.2}, (2, 1, 64, 64, 64), @@ -58,7 +83,11 @@ def test_shape(self, input_param, input_shape, target_shape): with skip_if_downloading_fails(): loss = PerceptualLoss(**input_param) result = loss(torch.randn(input_shape), torch.randn(target_shape)) - self.assertEqual(result.shape, torch.Size([])) + + if "channel_wise" in input_param.keys() and input_param["channel_wise"]: + self.assertEqual(result.shape, torch.Size([input_shape[1]])) + else: + self.assertEqual(result.shape, torch.Size([])) @parameterized.expand(TEST_CASES) def test_identical_input(self, input_param, input_shape, target_shape): @@ -66,7 +95,11 @@ def test_identical_input(self, input_param, input_shape, target_shape): loss = PerceptualLoss(**input_param) tensor = torch.randn(input_shape) result = loss(tensor, tensor) - self.assertEqual(result, torch.Tensor([0.0])) + + if "channel_wise" in input_param.keys() and input_param["channel_wise"]: + assert_allclose(result, torch.Tensor([0.0] * input_shape[1])) + else: + self.assertEqual(result, torch.Tensor([0.0])) def test_different_shape(self): with skip_if_downloading_fails(): @@ -80,12 +113,10 @@ def test_1d(self): with self.assertRaises(NotImplementedError): PerceptualLoss(spatial_dims=1) - def test_medicalnet_on_2d_data(self): - with self.assertRaises(ValueError): - PerceptualLoss(spatial_dims=2, network_type="medicalnet_resnet10_23datasets") - + @parameterized.expand(["medicalnet_resnet10_23datasets", "medicalnet_resnet50_23datasets"]) + def test_medicalnet_on_2d_data(self, network_type): with self.assertRaises(ValueError): - PerceptualLoss(spatial_dims=2, network_type="medicalnet_resnet50_23datasets") + PerceptualLoss(spatial_dims=2, network_type=network_type) if __name__ == "__main__": diff --git a/tests/test_persistentdataset.py b/tests/test_persistentdataset.py index b7bf2fbb11..7c4969e283 100644 --- a/tests/test_persistentdataset.py +++ b/tests/test_persistentdataset.py @@ -165,7 +165,7 @@ def test_different_transforms(self): im1 = PersistentDataset([im], Identity(), cache_dir=path, hash_transform=json_hashing)[0] im2 = PersistentDataset([im], Flip(1), cache_dir=path, hash_transform=json_hashing)[0] l2 = ((im1 - im2) ** 2).sum() ** 0.5 - self.assertTrue(l2 > 1) + self.assertGreater(l2, 1) if __name__ == "__main__": diff --git a/tests/test_prepare_batch_default.py b/tests/test_prepare_batch_default.py index d5a5fbf57e..9aa498866f 100644 --- a/tests/test_prepare_batch_default.py +++ b/tests/test_prepare_batch_default.py @@ -14,6 +14,7 @@ import unittest import torch +from parameterized import parameterized from monai.engines import PrepareBatchDefault, SupervisedEvaluator from tests.utils import assert_allclose @@ -27,85 +28,48 @@ def forward(self, x: torch.Tensor): class TestPrepareBatchDefault(unittest.TestCase): - def test_dict_content(self): - device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - dataloader = [ - { - "image": torch.tensor([1, 2]), - "label": torch.tensor([3, 4]), - "extra1": torch.tensor([5, 6]), - "extra2": 16, - "extra3": "test", - } + @parameterized.expand( + [ + ( + [ + { + "image": torch.tensor([1, 2]), + "label": torch.tensor([3, 4]), + "extra1": torch.tensor([5, 6]), + "extra2": 16, + "extra3": "test", + } + ], + TestNet(), + True, + ), # dict_content + ([torch.tensor([1, 2])], torch.nn.Identity(), True), # tensor_content + ([(torch.tensor([1, 2]), torch.tensor([3, 4]))], torch.nn.Identity(), True), # pair_content + ([], TestNet(), False), # empty_data ] - # set up engine - evaluator = SupervisedEvaluator( - device=device, - val_data_loader=dataloader, - epoch_length=1, - network=TestNet(), - non_blocking=False, - prepare_batch=PrepareBatchDefault(), - decollate=False, - mode="eval", - ) - evaluator.run() - output = evaluator.state.output - assert_allclose(output["image"], torch.tensor([1, 2], device=device)) - assert_allclose(output["label"], torch.tensor([3, 4], device=device)) - - def test_tensor_content(self): + ) + def test_prepare_batch(self, dataloader, network, should_run): device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - dataloader = [torch.tensor([1, 2])] - - # set up engine evaluator = SupervisedEvaluator( device=device, val_data_loader=dataloader, - epoch_length=1, - network=torch.nn.Identity(), + epoch_length=len(dataloader) if should_run else 0, + network=network, non_blocking=False, prepare_batch=PrepareBatchDefault(), decollate=False, - mode="eval", + mode="eval" if should_run else "train", ) evaluator.run() - output = evaluator.state.output - assert_allclose(output["image"], torch.tensor([1, 2], device=device)) - self.assertTrue(output["label"] is None) - def test_pair_content(self): - device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - dataloader = [(torch.tensor([1, 2]), torch.tensor([3, 4]))] - - # set up engine - evaluator = SupervisedEvaluator( - device=device, - val_data_loader=dataloader, - epoch_length=1, - network=torch.nn.Identity(), - non_blocking=False, - prepare_batch=PrepareBatchDefault(), - decollate=False, - mode="eval", - ) - evaluator.run() - output = evaluator.state.output - assert_allclose(output["image"], torch.tensor([1, 2], device=device)) - assert_allclose(output["label"], torch.tensor([3, 4], device=device)) - - def test_empty_data(self): - dataloader = [] - evaluator = SupervisedEvaluator( - val_data_loader=dataloader, - device=torch.device("cpu"), - epoch_length=0, - network=TestNet(), - non_blocking=False, - prepare_batch=PrepareBatchDefault(), - decollate=False, - ) - evaluator.run() + if should_run: + output = evaluator.state.output + if isinstance(dataloader[0], dict) or isinstance(dataloader[0], tuple): + assert_allclose(output["image"], torch.tensor([1, 2], device=device)) + assert_allclose(output["label"], torch.tensor([3, 4], device=device)) + else: + assert_allclose(output["image"], torch.tensor([1, 2], device=device)) + self.assertTrue(output["label"] is None) if __name__ == "__main__": diff --git a/tests/test_prepare_batch_diffusion.py b/tests/test_prepare_batch_diffusion.py new file mode 100644 index 0000000000..d969c06368 --- /dev/null +++ b/tests/test_prepare_batch_diffusion.py @@ -0,0 +1,104 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +import torch +from parameterized import parameterized + +from monai.engines import SupervisedEvaluator +from monai.engines.utils import DiffusionPrepareBatch +from monai.inferers import DiffusionInferer +from monai.networks.nets import DiffusionModelUNet +from monai.networks.schedulers import DDPMScheduler + +TEST_CASES = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": [8], + "norm_num_groups": 8, + "attention_levels": [True], + "num_res_blocks": 1, + "num_head_channels": 8, + }, + (2, 1, 8, 8), + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "channels": [8], + "norm_num_groups": 8, + "attention_levels": [True], + "num_res_blocks": 1, + "num_head_channels": 8, + }, + (2, 1, 8, 8, 8), + ], +] + + +class TestPrepareBatchDiffusion(unittest.TestCase): + @parameterized.expand(TEST_CASES) + def test_output_sizes(self, input_args, image_size): + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + dataloader = [{"image": torch.randn(image_size).to(device)}] + scheduler = DDPMScheduler(num_train_timesteps=20) + inferer = DiffusionInferer(scheduler=scheduler) + network = DiffusionModelUNet(**input_args).to(device) + evaluator = SupervisedEvaluator( + device=device, + val_data_loader=dataloader, + epoch_length=1, + network=network, + inferer=inferer, + non_blocking=True, + prepare_batch=DiffusionPrepareBatch(num_train_timesteps=20), + decollate=False, + ) + evaluator.run() + output = evaluator.state.output + # check shapes are the same + self.assertEqual(output["pred"].shape, image_size) + self.assertEqual(output["label"].shape, output["image"].shape) + + @parameterized.expand(TEST_CASES) + def test_conditioning(self, input_args, image_size): + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + dataloader = [{"image": torch.randn(image_size).to(device), "context": torch.randn((2, 4, 3)).to(device)}] + scheduler = DDPMScheduler(num_train_timesteps=20) + inferer = DiffusionInferer(scheduler=scheduler) + network = DiffusionModelUNet(**input_args, with_conditioning=True, cross_attention_dim=3).to(device) + evaluator = SupervisedEvaluator( + device=device, + val_data_loader=dataloader, + epoch_length=1, + network=network, + inferer=inferer, + non_blocking=True, + prepare_batch=DiffusionPrepareBatch(num_train_timesteps=20, condition_name="context"), + decollate=False, + ) + evaluator.run() + output = evaluator.state.output + # check shapes are the same + self.assertEqual(output["pred"].shape, image_size) + self.assertEqual(output["label"].shape, output["image"].shape) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_profiling.py b/tests/test_profiling.py index 6bee7ba262..649d980ebf 100644 --- a/tests/test_profiling.py +++ b/tests/test_profiling.py @@ -35,6 +35,7 @@ def setUp(self): self.scale = mt.ScaleIntensity() self.scale_call_name = "ScaleIntensity.__call__" + self.compose_call_name = "Compose.__call__" self.test_comp = mt.Compose([mt.ScaleIntensity(), mt.RandAxisFlip(0.5)]) self.test_image = torch.rand(1, 16, 16, 16) self.pid = os.getpid() @@ -82,7 +83,7 @@ def test_profile_multithread(self): self.assertSequenceEqual(batch.shape, (4, 1, 16, 16, 16)) results = wp.get_results() - self.assertSequenceEqual(list(results), [self.scale_call_name]) + self.assertSequenceEqual(list(results), [self.scale_call_name, self.compose_call_name]) prs = results[self.scale_call_name] @@ -98,6 +99,7 @@ def test_profile_context(self): self.scale(self.test_image) results = wp.get_results() + self.assertSequenceEqual(set(results), {"ScaleIntensity.__call__", "context"}) prs = results["context"] diff --git a/tests/test_rand_affine.py b/tests/test_rand_affine.py index f37f7827bb..2c827b7426 100644 --- a/tests/test_rand_affine.py +++ b/tests/test_rand_affine.py @@ -147,16 +147,15 @@ def test_rand_affine(self, input_param, input_data, expected_val): g.set_random_state(123) result = g(**input_data) g.rand_affine_grid.affine = torch.eye(4, dtype=torch.float64) # reset affine - test_resampler_lazy(g, result, input_param, input_data, seed=123) + test_resampler_lazy(g, result, input_param, input_data, seed=123, rtol=_rtol) if input_param.get("cache_grid", False): self.assertTrue(g._cached_grid is not None) assert_allclose(result, expected_val, rtol=_rtol, atol=1e-4, type_test="tensor") - def test_ill_cache(self): + @parameterized.expand([(None,), ((1, 1, -1),)]) + def test_ill_cache(self, spatial_size): with self.assertWarns(UserWarning): - RandAffine(cache_grid=True) - with self.assertWarns(UserWarning): - RandAffine(cache_grid=True, spatial_size=(1, 1, -1)) + RandAffine(cache_grid=True, spatial_size=spatial_size) @parameterized.expand(TEST_CASES_SKIPPED_CONSISTENCY) def test_skipped_transform_consistency(self, im, in_dtype): diff --git a/tests/test_rand_affined.py b/tests/test_rand_affined.py index 20c50954e2..eb8ebd06c5 100644 --- a/tests/test_rand_affined.py +++ b/tests/test_rand_affined.py @@ -234,11 +234,13 @@ def test_rand_affined(self, input_param, input_data, expected_val, track_meta): lazy_init_param["keys"], lazy_init_param["mode"] = key, mode resampler = RandAffined(**lazy_init_param).set_random_state(123) expected_output = resampler(**call_param) - test_resampler_lazy(resampler, expected_output, lazy_init_param, call_param, seed=123, output_key=key) + test_resampler_lazy( + resampler, expected_output, lazy_init_param, call_param, seed=123, output_key=key, rtol=_rtol + ) resampler.lazy = False if input_param.get("cache_grid", False): - self.assertTrue(g.rand_affine._cached_grid is not None) + self.assertIsNotNone(g.rand_affine._cached_grid) for key in res: if isinstance(key, str) and key.endswith("_transforms"): continue @@ -270,13 +272,10 @@ def test_rand_affined(self, input_param, input_data, expected_val, track_meta): self.assertEqual(len(v.applied_operations), 0) self.assertTupleEqual(v.shape, input_data[k].shape) - def test_ill_cache(self): + @parameterized.expand([(None,), ((2, -1),)]) # spatial size is None # spatial size is dynamic + def test_ill_cache(self, spatial_size): with self.assertWarns(UserWarning): - # spatial size is None - RandAffined(device=device, spatial_size=None, prob=1.0, cache_grid=True, keys=("img", "seg")) - with self.assertWarns(UserWarning): - # spatial size is dynamic - RandAffined(device=device, spatial_size=(2, -1), prob=1.0, cache_grid=True, keys=("img", "seg")) + RandAffined(device=device, spatial_size=spatial_size, prob=1.0, cache_grid=True, keys=("img", "seg")) if __name__ == "__main__": diff --git a/tests/test_rand_bias_field.py b/tests/test_rand_bias_field.py index 333a9ecba5..328f46b7ee 100644 --- a/tests/test_rand_bias_field.py +++ b/tests/test_rand_bias_field.py @@ -39,7 +39,7 @@ def test_output_shape(self, class_args, img_shape): img = p(np.random.rand(*img_shape)) output = bias_field(img) np.testing.assert_equal(output.shape, img_shape) - self.assertTrue(output.dtype in (np.float32, torch.float32)) + self.assertIn(output.dtype, (np.float32, torch.float32)) img_zero = np.zeros([*img_shape]) output_zero = bias_field(img_zero) diff --git a/tests/test_rand_gaussian_noise.py b/tests/test_rand_gaussian_noise.py index a56e54fe31..233b4dd1b6 100644 --- a/tests/test_rand_gaussian_noise.py +++ b/tests/test_rand_gaussian_noise.py @@ -22,22 +22,24 @@ TESTS = [] for p in TEST_NDARRAYS: - TESTS.append(("test_zero_mean", p, 0, 0.1)) - TESTS.append(("test_non_zero_mean", p, 1, 0.5)) + TESTS.append(("test_zero_mean", p, 0, 0.1, True)) + TESTS.append(("test_non_zero_mean", p, 1, 0.5, True)) + TESTS.append(("test_no_sample_std", p, 1, 0.5, False)) class TestRandGaussianNoise(NumpyImageTestCase2D): @parameterized.expand(TESTS) - def test_correct_results(self, _, im_type, mean, std): + def test_correct_results(self, _, im_type, mean, std, sample_std): seed = 0 - gaussian_fn = RandGaussianNoise(prob=1.0, mean=mean, std=std) + gaussian_fn = RandGaussianNoise(prob=1.0, mean=mean, std=std, sample_std=sample_std) gaussian_fn.set_random_state(seed) im = im_type(self.imt) noised = gaussian_fn(im) np.random.seed(seed) np.random.random() - expected = self.imt + np.random.normal(mean, np.random.uniform(0, std), size=self.imt.shape) + _std = np.random.uniform(0, std) if sample_std else std + expected = self.imt + np.random.normal(mean, _std, size=self.imt.shape) if isinstance(noised, torch.Tensor): noised = noised.cpu() np.testing.assert_allclose(expected, noised, atol=1e-5) diff --git a/tests/test_rand_gaussian_noised.py b/tests/test_rand_gaussian_noised.py index bcbed98b5a..e3df196be2 100644 --- a/tests/test_rand_gaussian_noised.py +++ b/tests/test_rand_gaussian_noised.py @@ -22,8 +22,9 @@ TESTS = [] for p in TEST_NDARRAYS: - TESTS.append(["test_zero_mean", p, ["img1", "img2"], 0, 0.1]) - TESTS.append(["test_non_zero_mean", p, ["img1", "img2"], 1, 0.5]) + TESTS.append(["test_zero_mean", p, ["img1", "img2"], 0, 0.1, True]) + TESTS.append(["test_non_zero_mean", p, ["img1", "img2"], 1, 0.5, True]) + TESTS.append(["test_no_sample_std", p, ["img1", "img2"], 1, 0.5, False]) seed = 0 @@ -31,15 +32,18 @@ class TestRandGaussianNoised(NumpyImageTestCase2D): @parameterized.expand(TESTS) - def test_correct_results(self, _, im_type, keys, mean, std): - gaussian_fn = RandGaussianNoised(keys=keys, prob=1.0, mean=mean, std=std, dtype=np.float64) + def test_correct_results(self, _, im_type, keys, mean, std, sample_std): + gaussian_fn = RandGaussianNoised( + keys=keys, prob=1.0, mean=mean, std=std, dtype=np.float64, sample_std=sample_std + ) gaussian_fn.set_random_state(seed) im = im_type(self.imt) noised = gaussian_fn({k: im for k in keys}) np.random.seed(seed) # simulate the randomize() of transform np.random.random() - noise = np.random.normal(mean, np.random.uniform(0, std), size=self.imt.shape) + _std = np.random.uniform(0, std) if sample_std else std + noise = np.random.normal(mean, _std, size=self.imt.shape) for k in keys: expected = self.imt + noise if isinstance(noised[k], torch.Tensor): diff --git a/tests/test_rand_gibbs_noise.py b/tests/test_rand_gibbs_noise.py index 4befeffbe2..5ef249a1f4 100644 --- a/tests/test_rand_gibbs_noise.py +++ b/tests/test_rand_gibbs_noise.py @@ -90,6 +90,15 @@ def test_alpha(self, im_shape, input_type): self.assertGreaterEqual(t.sampled_alpha, 0.5) self.assertLessEqual(t.sampled_alpha, 0.51) + @parameterized.expand(TEST_CASES) + def test_alpha_single_value(self, im_shape, input_type): + im = self.get_data(im_shape, input_type) + alpha = 0.01 + t = RandGibbsNoise(1.0, alpha) + _ = t(deepcopy(im)) + self.assertGreaterEqual(t.sampled_alpha, 0) + self.assertLessEqual(t.sampled_alpha, 0.01) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_rand_gibbs_noised.py b/tests/test_rand_gibbs_noised.py index 6580189af6..382290dd39 100644 --- a/tests/test_rand_gibbs_noised.py +++ b/tests/test_rand_gibbs_noised.py @@ -105,6 +105,14 @@ def test_alpha(self, im_shape, input_type): _ = t(deepcopy(data)) self.assertTrue(0.5 <= t.rand_gibbs_noise.sampled_alpha <= 0.51) + @parameterized.expand(TEST_CASES) + def test_alpha_single_value(self, im_shape, input_type): + data = self.get_data(im_shape, input_type) + alpha = 0.01 + t = RandGibbsNoised(KEYS, 1.0, alpha) + _ = t(deepcopy(data)) + self.assertTrue(0 <= t.rand_gibbs_noise.sampled_alpha <= 0.01) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_rand_weighted_cropd.py b/tests/test_rand_weighted_cropd.py index 1524442f61..a1414df0ac 100644 --- a/tests/test_rand_weighted_cropd.py +++ b/tests/test_rand_weighted_cropd.py @@ -154,7 +154,7 @@ def test_rand_weighted_cropd(self, _, init_params, input_data, expected_shape, e crop = RandWeightedCropd(**init_params) crop.set_random_state(10) result = crop(input_data) - self.assertTrue(len(result) == init_params["num_samples"]) + self.assertEqual(len(result), init_params["num_samples"]) _len = len(tuple(input_data.keys())) self.assertTupleEqual(tuple(result[0].keys())[:_len], tuple(input_data.keys())) diff --git a/tests/test_recon_net_utils.py b/tests/test_recon_net_utils.py index 1815000777..48d3b59a17 100644 --- a/tests/test_recon_net_utils.py +++ b/tests/test_recon_net_utils.py @@ -64,7 +64,7 @@ def test_reshape_channel_complex(self, test_data): def test_complex_normalize(self, test_data): result, mean, std = complex_normalize(test_data) result = result * std + mean - self.assertTrue((((result - test_data) ** 2).mean() ** 0.5).item() < 1e-5) + self.assertLess((((result - test_data) ** 2).mean() ** 0.5).item(), 1e-5) @parameterized.expand(TEST_PAD) def test_pad(self, test_data): diff --git a/tests/test_reg_loss_integration.py b/tests/test_reg_loss_integration.py index e8f82eb0c2..8afc2da6ad 100644 --- a/tests/test_reg_loss_integration.py +++ b/tests/test_reg_loss_integration.py @@ -83,6 +83,9 @@ def forward(self, x): # initialize a SGD optimizer optimizer = optim.Adam(net.parameters(), lr=learning_rate) + # declare first for pylint + init_loss = None + # train the network for it in range(max_iter): # set the gradient to zero @@ -99,7 +102,7 @@ def forward(self, x): # backward pass loss_val.backward() optimizer.step() - self.assertTrue(init_loss > loss_val, "loss did not decrease") + self.assertGreater(init_loss, loss_val, "loss did not decrease") if __name__ == "__main__": diff --git a/tests/test_regularization.py b/tests/test_regularization.py new file mode 100644 index 0000000000..12d64637d5 --- /dev/null +++ b/tests/test_regularization.py @@ -0,0 +1,142 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +import numpy as np +import torch + +from monai.transforms import CutMix, CutMixd, CutOut, CutOutd, MixUp, MixUpd +from tests.utils import assert_allclose + + +class TestMixup(unittest.TestCase): + + def test_mixup(self): + for dims in [2, 3]: + shape = (6, 3) + (32,) * dims + sample = torch.rand(*shape, dtype=torch.float32) + mixup = MixUp(6, 1.0) + mixup.set_random_state(seed=0) + output = mixup(sample) + np.random.seed(0) + # simulate the randomize() of transform + np.random.random() + weight = torch.from_numpy(np.random.beta(1.0, 1.0, 6)).type(torch.float32) + perm = np.random.permutation(6) + self.assertEqual(output.shape, sample.shape) + mixweight = weight[(Ellipsis,) + (None,) * (dims + 1)] + expected = mixweight * sample + (1 - mixweight) * sample[perm, ...] + assert_allclose(output, expected, type_test=False, atol=1e-7) + + with self.assertRaises(ValueError): + MixUp(6, -0.5) + + mixup = MixUp(6, 0.5) + for dims in [2, 3]: + with self.assertRaises(ValueError): + shape = (5, 3) + (32,) * dims + sample = torch.rand(*shape, dtype=torch.float32) + mixup(sample) + + def test_mixupd(self): + for dims in [2, 3]: + shape = (6, 3) + (32,) * dims + t = torch.rand(*shape, dtype=torch.float32) + sample = {"a": t, "b": t} + mixup = MixUpd(["a", "b"], 6) + mixup.set_random_state(seed=0) + output = mixup(sample) + np.random.seed(0) + # simulate the randomize() of transform + np.random.random() + weight = torch.from_numpy(np.random.beta(1.0, 1.0, 6)).type(torch.float32) + perm = np.random.permutation(6) + self.assertEqual(output["a"].shape, sample["a"].shape) + mixweight = weight[(Ellipsis,) + (None,) * (dims + 1)] + expected = mixweight * sample["a"] + (1 - mixweight) * sample["a"][perm, ...] + assert_allclose(output["a"], expected, type_test=False, atol=1e-7) + assert_allclose(output["a"], output["b"], type_test=False, atol=1e-7) + # self.assertTrue(torch.allclose(output["a"], output["b"])) + + with self.assertRaises(ValueError): + MixUpd(["k1", "k2"], 6, -0.5) + + +class TestCutMix(unittest.TestCase): + + def test_cutmix(self): + for dims in [2, 3]: + shape = (6, 3) + (32,) * dims + sample = torch.rand(*shape, dtype=torch.float32) + cutmix = CutMix(6, 1.0) + cutmix.set_random_state(seed=0) + output = cutmix(sample) + self.assertEqual(output.shape, sample.shape) + self.assertTrue(any(not torch.allclose(sample, cutmix(sample)) for _ in range(10))) + + def test_cutmixd(self): + for dims in [2, 3]: + shape = (6, 3) + (32,) * dims + t = torch.rand(*shape, dtype=torch.float32) + label = torch.randint(0, 1, shape) + sample = {"a": t, "b": t, "lbl1": label, "lbl2": label} + cutmix = CutMixd(["a", "b"], 6, label_keys=("lbl1", "lbl2")) + cutmix.set_random_state(seed=123) + output = cutmix(sample) + # but mixing of labels is not affected by it + self.assertTrue(torch.allclose(output["lbl1"], output["lbl2"])) + + +class TestCutOut(unittest.TestCase): + + def test_cutout(self): + for dims in [2, 3]: + shape = (6, 3) + (32,) * dims + sample = torch.rand(*shape, dtype=torch.float32) + cutout = CutOut(6, 1.0) + cutout.set_random_state(seed=123) + output = cutout(sample) + np.random.seed(123) + # simulate the randomize() of transform + np.random.random() + weight = torch.from_numpy(np.random.beta(1.0, 1.0, 6)).type(torch.float32) + perm = np.random.permutation(6) + coords = [torch.from_numpy(np.random.randint(0, d, size=(1,))) for d in sample.shape[2:]] + assert_allclose(weight, cutout._params[0]) + assert_allclose(perm, cutout._params[1]) + self.assertSequenceEqual(coords, cutout._params[2]) + self.assertEqual(output.shape, sample.shape) + + def test_cutoutd(self): + for dims in [2, 3]: + shape = (6, 3) + (32,) * dims + t = torch.rand(*shape, dtype=torch.float32) + sample = {"a": t, "b": t} + cutout = CutOutd(["a", "b"], 6, 1.0) + cutout.set_random_state(seed=123) + output = cutout(sample) + np.random.seed(123) + # simulate the randomize() of transform + np.random.random() + weight = torch.from_numpy(np.random.beta(1.0, 1.0, 6)).type(torch.float32) + perm = np.random.permutation(6) + coords = [torch.from_numpy(np.random.randint(0, d, size=(1,))) for d in t.shape[2:]] + assert_allclose(weight, cutout.cutout._params[0]) + assert_allclose(perm, cutout.cutout._params[1]) + self.assertSequenceEqual(coords, cutout.cutout._params[2]) + self.assertEqual(output["a"].shape, sample["a"].shape) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_resize.py b/tests/test_resize.py index 65b33ea649..d4c57e2742 100644 --- a/tests/test_resize.py +++ b/tests/test_resize.py @@ -46,6 +46,7 @@ class TestResize(NumpyImageTestCase2D): + def test_invalid_inputs(self): with self.assertRaises(ValueError): resize = Resize(spatial_size=(128, 128, 3), mode="order") diff --git a/tests/test_resized.py b/tests/test_resized.py index d62f29ab5c..243a4e6622 100644 --- a/tests/test_resized.py +++ b/tests/test_resized.py @@ -66,6 +66,7 @@ @SkipIfAtLeastPyTorchVersion((2, 2, 0)) # https://github.com/Project-MONAI/MONAI/issues/7445 class TestResized(NumpyImageTestCase2D): + def test_invalid_inputs(self): with self.assertRaises(ValueError): resize = Resized(keys="img", spatial_size=(128, 128, 3), mode="order") diff --git a/tests/test_resnet.py b/tests/test_resnet.py index ad1aad8fc6..a55d18f5de 100644 --- a/tests/test_resnet.py +++ b/tests/test_resnet.py @@ -24,6 +24,7 @@ from monai.networks import eval_mode from monai.networks.nets import ( ResNet, + ResNetFeatures, get_medicalnet_pretrained_resnet_args, get_pretrained_resnet_medicalnet, resnet10, @@ -36,7 +37,14 @@ ) from monai.networks.nets.resnet import ResNetBlock from monai.utils import optional_import -from tests.utils import equal_state_dict, skip_if_downloading_fails, skip_if_no_cuda, skip_if_quick, test_script_save +from tests.utils import ( + SkipIfNoModule, + equal_state_dict, + skip_if_downloading_fails, + skip_if_no_cuda, + skip_if_quick, + test_script_save, +) if TYPE_CHECKING: import torchvision @@ -99,6 +107,7 @@ "num_classes": 3, "conv1_t_size": [3], "conv1_t_stride": 1, + "act": ("relu", {"inplace": False}), }, (1, 2, 32), (1, 3), @@ -177,19 +186,60 @@ (1, 3), ] +TEST_CASE_8 = [ + { + "block": "bottleneck", + "layers": [3, 4, 6, 3], + "block_inplanes": [64, 128, 256, 512], + "spatial_dims": 1, + "n_input_channels": 2, + "num_classes": 3, + "conv1_t_size": [3], + "conv1_t_stride": 1, + "act": ("relu", {"inplace": False}), + }, + (1, 2, 32), + (1, 3), +] + +TEST_CASE_9 = [ # Layer norm + { + "block": ResNetBlock, + "layers": [3, 4, 6, 3], + "block_inplanes": [64, 128, 256, 512], + "spatial_dims": 1, + "n_input_channels": 2, + "num_classes": 3, + "conv1_t_size": [3], + "conv1_t_stride": 1, + "act": ("relu", {"inplace": False}), + "norm": ("layer", {"normalized_shape": (64, 32)}), + }, + (1, 2, 32), + (1, 3), +] + TEST_CASES = [] PRETRAINED_TEST_CASES = [] for case in [TEST_CASE_1, TEST_CASE_2, TEST_CASE_3, TEST_CASE_2_A, TEST_CASE_3_A]: for model in [resnet10, resnet18, resnet34, resnet50, resnet101, resnet152, resnet200]: TEST_CASES.append([model, *case]) PRETRAINED_TEST_CASES.append([model, *case]) -for case in [TEST_CASE_5, TEST_CASE_5_A, TEST_CASE_6, TEST_CASE_7]: +for case in [TEST_CASE_5, TEST_CASE_5_A, TEST_CASE_6, TEST_CASE_7, TEST_CASE_8, TEST_CASE_9]: TEST_CASES.append([ResNet, *case]) TEST_SCRIPT_CASES = [ [model, *TEST_CASE_1] for model in [resnet10, resnet18, resnet34, resnet50, resnet101, resnet152, resnet200] ] +CASE_EXTRACT_FEATURES = [ + ( + {"model_name": "resnet10", "pretrained": True, "spatial_dims": 3, "in_channels": 1}, + [1, 1, 64, 64, 64], + ([1, 64, 32, 32, 32], [1, 64, 16, 16, 16], [1, 128, 8, 8, 8], [1, 256, 4, 4, 4], [1, 512, 2, 2, 2]), + ) +] + class TestResNet(unittest.TestCase): @@ -211,12 +261,12 @@ def test_resnet_shape(self, model, input_param, input_shape, expected_shape): if input_param.get("feed_forward", True): self.assertEqual(result.shape, expected_shape) else: - self.assertTrue(result.shape in expected_shape) + self.assertIn(result.shape, expected_shape) @parameterized.expand(PRETRAINED_TEST_CASES) @skip_if_quick @skip_if_no_cuda - def test_resnet_pretrained(self, model, input_param, input_shape, expected_shape): + def test_resnet_pretrained(self, model, input_param, _input_shape, _expected_shape): net = model(**input_param).to(device) # Save ckpt torch.save(net.state_dict(), self.tmp_ckpt_filename) @@ -240,9 +290,7 @@ def test_resnet_pretrained(self, model, input_param, input_shape, expected_shape and input_param.get("n_input_channels", 3) == 1 and input_param.get("feed_forward", True) is False and input_param.get("shortcut_type", "B") == shortcut_type - and ( - input_param.get("bias_downsample", True) == bool(bias_downsample) if bias_downsample != -1 else True - ) + and (input_param.get("bias_downsample", True) == bias_downsample) ): model(**cp_input_param) else: @@ -253,7 +301,7 @@ def test_resnet_pretrained(self, model, input_param, input_shape, expected_shape cp_input_param["n_input_channels"] = 1 cp_input_param["feed_forward"] = False cp_input_param["shortcut_type"] = shortcut_type - cp_input_param["bias_downsample"] = bool(bias_downsample) if bias_downsample != -1 else True + cp_input_param["bias_downsample"] = bias_downsample if cp_input_param.get("spatial_dims", 3) == 3: with skip_if_downloading_fails(): pretrained_net = model(**cp_input_param).to(device) @@ -270,5 +318,25 @@ def test_script(self, model, input_param, input_shape, expected_shape): test_script_save(net, test_data) +@SkipIfNoModule("hf_hub_download") +class TestExtractFeatures(unittest.TestCase): + + @parameterized.expand(CASE_EXTRACT_FEATURES) + def test_shape(self, input_param, input_shape, expected_shapes): + device = "cuda" if torch.cuda.is_available() else "cpu" + + with skip_if_downloading_fails(): + net = ResNetFeatures(**input_param).to(device) + + # run inference with random tensor + with eval_mode(net): + features = net(torch.randn(input_shape).to(device)) + + # check output shape + self.assertEqual(len(features), len(expected_shapes)) + for feature, expected_shape in zip(features, expected_shapes): + self.assertEqual(feature.shape, torch.Size(expected_shape)) + + if __name__ == "__main__": unittest.main() diff --git a/tests/test_scheduler_ddim.py b/tests/test_scheduler_ddim.py new file mode 100644 index 0000000000..1a8f8cab67 --- /dev/null +++ b/tests/test_scheduler_ddim.py @@ -0,0 +1,83 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +import torch +from parameterized import parameterized + +from monai.networks.schedulers import DDIMScheduler +from tests.utils import assert_allclose + +TEST_2D_CASE = [] +for beta_schedule in ["linear_beta", "scaled_linear_beta"]: + TEST_2D_CASE.append([{"schedule": beta_schedule}, (2, 6, 16, 16), (2, 6, 16, 16)]) + +TEST_3D_CASE = [] +for beta_schedule in ["linear_beta", "scaled_linear_beta"]: + TEST_3D_CASE.append([{"schedule": beta_schedule}, (2, 6, 16, 16, 16), (2, 6, 16, 16, 16)]) + +TEST_CASES = TEST_2D_CASE + TEST_3D_CASE + +TEST_FULl_LOOP = [ + [{"schedule": "linear_beta"}, (1, 1, 2, 2), torch.Tensor([[[[-0.9579, -0.6457], [0.4684, -0.9694]]]])] +] + + +class TestDDPMScheduler(unittest.TestCase): + @parameterized.expand(TEST_CASES) + def test_add_noise(self, input_param, input_shape, expected_shape): + scheduler = DDIMScheduler(**input_param) + scheduler.set_timesteps(num_inference_steps=100) + original_sample = torch.zeros(input_shape) + noise = torch.randn_like(original_sample) + timesteps = torch.randint(0, scheduler.num_train_timesteps, (original_sample.shape[0],)).long() + + noisy = scheduler.add_noise(original_samples=original_sample, noise=noise, timesteps=timesteps) + self.assertEqual(noisy.shape, expected_shape) + + @parameterized.expand(TEST_CASES) + def test_step_shape(self, input_param, input_shape, expected_shape): + scheduler = DDIMScheduler(**input_param) + scheduler.set_timesteps(num_inference_steps=100) + model_output = torch.randn(input_shape) + sample = torch.randn(input_shape) + output_step = scheduler.step(model_output=model_output, timestep=500, sample=sample) + self.assertEqual(output_step[0].shape, expected_shape) + self.assertEqual(output_step[1].shape, expected_shape) + + @parameterized.expand(TEST_FULl_LOOP) + def test_full_timestep_loop(self, input_param, input_shape, expected_output): + scheduler = DDIMScheduler(**input_param) + scheduler.set_timesteps(50) + torch.manual_seed(42) + model_output = torch.randn(input_shape) + sample = torch.randn(input_shape) + for t in range(50): + sample, _ = scheduler.step(model_output=model_output, timestep=t, sample=sample) + assert_allclose(sample, expected_output, rtol=1e-3, atol=1e-3) + + def test_set_timesteps(self): + scheduler = DDIMScheduler(num_train_timesteps=1000) + scheduler.set_timesteps(num_inference_steps=100) + self.assertEqual(scheduler.num_inference_steps, 100) + self.assertEqual(len(scheduler.timesteps), 100) + + def test_set_timesteps_with_num_inference_steps_bigger_than_num_train_timesteps(self): + scheduler = DDIMScheduler(num_train_timesteps=1000) + with self.assertRaises(ValueError): + scheduler.set_timesteps(num_inference_steps=2000) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_scheduler_ddpm.py b/tests/test_scheduler_ddpm.py new file mode 100644 index 0000000000..f0447aded2 --- /dev/null +++ b/tests/test_scheduler_ddpm.py @@ -0,0 +1,104 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +import torch +from parameterized import parameterized + +from monai.networks.schedulers import DDPMScheduler +from tests.utils import assert_allclose + +TEST_2D_CASE = [] +for beta_schedule in ["linear_beta", "scaled_linear_beta"]: + for variance_type in ["fixed_small", "fixed_large"]: + TEST_2D_CASE.append( + [{"schedule": beta_schedule, "variance_type": variance_type}, (2, 6, 16, 16), (2, 6, 16, 16)] + ) + +TEST_3D_CASE = [] +for beta_schedule in ["linear_beta", "scaled_linear_beta"]: + for variance_type in ["fixed_small", "fixed_large"]: + TEST_3D_CASE.append( + [{"schedule": beta_schedule, "variance_type": variance_type}, (2, 6, 16, 16, 16), (2, 6, 16, 16, 16)] + ) + +TEST_CASES = TEST_2D_CASE + TEST_3D_CASE + +TEST_FULl_LOOP = [ + [{"schedule": "linear_beta"}, (1, 1, 2, 2), torch.Tensor([[[[-1.0153, -0.3218], [0.8454, -0.7870]]]])] +] + + +class TestDDPMScheduler(unittest.TestCase): + @parameterized.expand(TEST_CASES) + def test_add_noise(self, input_param, input_shape, expected_shape): + scheduler = DDPMScheduler(**input_param) + original_sample = torch.zeros(input_shape) + noise = torch.randn_like(original_sample) + timesteps = torch.randint(0, scheduler.num_train_timesteps, (original_sample.shape[0],)).long() + + noisy = scheduler.add_noise(original_samples=original_sample, noise=noise, timesteps=timesteps) + self.assertEqual(noisy.shape, expected_shape) + + @parameterized.expand(TEST_CASES) + def test_step_shape(self, input_param, input_shape, expected_shape): + scheduler = DDPMScheduler(**input_param) + model_output = torch.randn(input_shape) + sample = torch.randn(input_shape) + output_step = scheduler.step(model_output=model_output, timestep=500, sample=sample) + self.assertEqual(output_step[0].shape, expected_shape) + self.assertEqual(output_step[1].shape, expected_shape) + + @parameterized.expand(TEST_FULl_LOOP) + def test_full_timestep_loop(self, input_param, input_shape, expected_output): + scheduler = DDPMScheduler(**input_param) + scheduler.set_timesteps(50) + torch.manual_seed(42) + model_output = torch.randn(input_shape) + sample = torch.randn(input_shape) + for t in range(50): + sample, _ = scheduler.step(model_output=model_output, timestep=t, sample=sample) + assert_allclose(sample, expected_output, rtol=1e-3, atol=1e-3) + + @parameterized.expand(TEST_CASES) + def test_get_velocity_shape(self, input_param, input_shape, expected_shape): + scheduler = DDPMScheduler(**input_param) + sample = torch.randn(input_shape) + timesteps = torch.randint(0, scheduler.num_train_timesteps, (input_shape[0],)).long() + velocity = scheduler.get_velocity(sample=sample, noise=sample, timesteps=timesteps) + self.assertEqual(velocity.shape, expected_shape) + + def test_step_learned(self): + for variance_type in ["learned", "learned_range"]: + scheduler = DDPMScheduler(variance_type=variance_type) + model_output = torch.randn(2, 6, 16, 16) + sample = torch.randn(2, 3, 16, 16) + output_step = scheduler.step(model_output=model_output, timestep=500, sample=sample) + self.assertEqual(output_step[0].shape, sample.shape) + self.assertEqual(output_step[1].shape, sample.shape) + + def test_set_timesteps(self): + scheduler = DDPMScheduler(num_train_timesteps=1000) + scheduler.set_timesteps(num_inference_steps=100) + self.assertEqual(scheduler.num_inference_steps, 100) + self.assertEqual(len(scheduler.timesteps), 100) + + def test_set_timesteps_with_num_inference_steps_bigger_than_num_train_timesteps(self): + scheduler = DDPMScheduler(num_train_timesteps=1000) + with self.assertRaises(ValueError): + scheduler.set_timesteps(num_inference_steps=2000) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_scheduler_pndm.py b/tests/test_scheduler_pndm.py new file mode 100644 index 0000000000..69e5e403f5 --- /dev/null +++ b/tests/test_scheduler_pndm.py @@ -0,0 +1,108 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +import torch +from parameterized import parameterized + +from monai.networks.schedulers import PNDMScheduler +from tests.utils import assert_allclose + +TEST_2D_CASE = [] +for beta_schedule in ["linear_beta", "scaled_linear_beta"]: + TEST_2D_CASE.append([{"schedule": beta_schedule}, (2, 6, 16, 16), (2, 6, 16, 16)]) + +TEST_3D_CASE = [] +for beta_schedule in ["linear_beta", "scaled_linear_beta"]: + TEST_3D_CASE.append([{"schedule": beta_schedule}, (2, 6, 16, 16, 16), (2, 6, 16, 16, 16)]) + +TEST_CASES = TEST_2D_CASE + TEST_3D_CASE + +TEST_FULl_LOOP = [ + [ + {"schedule": "linear_beta"}, + (1, 1, 2, 2), + torch.Tensor([[[[-2123055.2500, -459014.2812], [2863438.0000, -1263401.7500]]]]), + ] +] + + +class TestDDPMScheduler(unittest.TestCase): + @parameterized.expand(TEST_CASES) + def test_add_noise(self, input_param, input_shape, expected_shape): + scheduler = PNDMScheduler(**input_param) + original_sample = torch.zeros(input_shape) + noise = torch.randn_like(original_sample) + timesteps = torch.randint(0, scheduler.num_train_timesteps, (original_sample.shape[0],)).long() + noisy = scheduler.add_noise(original_samples=original_sample, noise=noise, timesteps=timesteps) + self.assertEqual(noisy.shape, expected_shape) + + @parameterized.expand(TEST_CASES) + def test_step_shape(self, input_param, input_shape, expected_shape): + scheduler = PNDMScheduler(**input_param) + scheduler.set_timesteps(600) + model_output = torch.randn(input_shape) + sample = torch.randn(input_shape) + output_step = scheduler.step(model_output=model_output, timestep=500, sample=sample) + self.assertEqual(output_step[0].shape, expected_shape) + self.assertEqual(output_step[1], None) + + @parameterized.expand(TEST_FULl_LOOP) + def test_full_timestep_loop(self, input_param, input_shape, expected_output): + scheduler = PNDMScheduler(**input_param) + scheduler.set_timesteps(50) + torch.manual_seed(42) + model_output = torch.randn(input_shape) + sample = torch.randn(input_shape) + for t in range(50): + sample, _ = scheduler.step(model_output=model_output, timestep=t, sample=sample) + assert_allclose(sample, expected_output, rtol=1e-3, atol=1e-3) + + @parameterized.expand(TEST_FULl_LOOP) + def test_timestep_two_loops(self, input_param, input_shape, expected_output): + scheduler = PNDMScheduler(**input_param) + scheduler.set_timesteps(50) + torch.manual_seed(42) + model_output = torch.randn(input_shape) + sample = torch.randn(input_shape) + for t in range(50): + sample, _ = scheduler.step(model_output=model_output, timestep=t, sample=sample) + torch.manual_seed(42) + model_output2 = torch.randn(input_shape) + sample2 = torch.randn(input_shape) + scheduler.set_timesteps(50) + for t in range(50): + sample2, _ = scheduler.step(model_output=model_output2, timestep=t, sample=sample2) + assert_allclose(sample, sample2, rtol=1e-3, atol=1e-3) + + def test_set_timesteps(self): + scheduler = PNDMScheduler(num_train_timesteps=1000, skip_prk_steps=True) + scheduler.set_timesteps(num_inference_steps=100) + self.assertEqual(scheduler.num_inference_steps, 100) + self.assertEqual(len(scheduler.timesteps), 100) + + def test_set_timesteps_prk(self): + scheduler = PNDMScheduler(num_train_timesteps=1000, skip_prk_steps=False) + scheduler.set_timesteps(num_inference_steps=100) + self.assertEqual(scheduler.num_inference_steps, 109) + self.assertEqual(len(scheduler.timesteps), 109) + + def test_set_timesteps_with_num_inference_steps_bigger_than_num_train_timesteps(self): + scheduler = PNDMScheduler(num_train_timesteps=1000) + with self.assertRaises(ValueError): + scheduler.set_timesteps(num_inference_steps=2000) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_selfattention.py b/tests/test_selfattention.py index b8be4fd1b6..d069d6aa30 100644 --- a/tests/test_selfattention.py +++ b/tests/test_selfattention.py @@ -20,6 +20,7 @@ from monai.networks import eval_mode from monai.networks.blocks.selfattention import SABlock +from monai.networks.layers.factories import RelPosEmbedding from monai.utils import optional_import einops, has_einops = optional_import("einops") @@ -28,12 +29,20 @@ for dropout_rate in np.linspace(0, 1, 4): for hidden_size in [360, 480, 600, 768]: for num_heads in [4, 6, 8, 12]: - test_case = [ - {"hidden_size": hidden_size, "num_heads": num_heads, "dropout_rate": dropout_rate}, - (2, 512, hidden_size), - (2, 512, hidden_size), - ] - TEST_CASE_SABLOCK.append(test_case) + for rel_pos_embedding in [None, RelPosEmbedding.DECOMPOSED]: + for input_size in [(16, 32), (8, 8, 8)]: + test_case = [ + { + "hidden_size": hidden_size, + "num_heads": num_heads, + "dropout_rate": dropout_rate, + "rel_pos_embedding": rel_pos_embedding, + "input_size": input_size, + }, + (2, 512, hidden_size), + (2, 512, hidden_size), + ] + TEST_CASE_SABLOCK.append(test_case) class TestResBlock(unittest.TestCase): @@ -53,6 +62,27 @@ def test_ill_arg(self): with self.assertRaises(ValueError): SABlock(hidden_size=620, num_heads=8, dropout_rate=0.4) + def test_attention_dim_not_multiple_of_heads(self): + with self.assertRaises(ValueError): + SABlock(hidden_size=128, num_heads=3, dropout_rate=0.1) + + @skipUnless(has_einops, "Requires einops") + def test_inner_dim_different(self): + SABlock(hidden_size=128, num_heads=4, dropout_rate=0.1, dim_head=30) + + def test_causal_no_sequence_length(self): + with self.assertRaises(ValueError): + SABlock(hidden_size=128, num_heads=4, dropout_rate=0.1, causal=True) + + @skipUnless(has_einops, "Requires einops") + def test_causal(self): + block = SABlock(hidden_size=128, num_heads=1, dropout_rate=0.1, causal=True, sequence_length=16, save_attn=True) + input_shape = (1, 16, 128) + block(torch.randn(input_shape)) + # check upper triangular part of the attention matrix is zero + assert torch.triu(block.att_mat, diagonal=1).sum() == 0 + + @skipUnless(has_einops, "Requires einops") def test_access_attn_matrix(self): # input format hidden_size = 128 @@ -74,6 +104,40 @@ def test_access_attn_matrix(self): matrix_acess_blk(torch.randn(input_shape)) assert matrix_acess_blk.att_mat.shape == (input_shape[0], input_shape[0], input_shape[1], input_shape[1]) + def test_number_of_parameters(self): + + def count_sablock_params(*args, **kwargs): + """Count the number of parameters in a SABlock.""" + sablock = SABlock(*args, **kwargs) + return sum([x.numel() for x in sablock.parameters() if x.requires_grad]) + + hidden_size = 128 + num_heads = 8 + default_dim_head = hidden_size // num_heads + + # Default dim_head is hidden_size // num_heads + nparams_default = count_sablock_params(hidden_size=hidden_size, num_heads=num_heads) + nparams_like_default = count_sablock_params( + hidden_size=hidden_size, num_heads=num_heads, dim_head=default_dim_head + ) + self.assertEqual(nparams_default, nparams_like_default) + + # Increasing dim_head should increase the number of parameters + nparams_custom_large = count_sablock_params( + hidden_size=hidden_size, num_heads=num_heads, dim_head=default_dim_head * 2 + ) + self.assertGreater(nparams_custom_large, nparams_default) + + # Decreasing dim_head should decrease the number of parameters + nparams_custom_small = count_sablock_params( + hidden_size=hidden_size, num_heads=num_heads, dim_head=default_dim_head // 2 + ) + self.assertGreater(nparams_default, nparams_custom_small) + + # Increasing the number of heads with the default behaviour should not change the number of params. + nparams_default_more_heads = count_sablock_params(hidden_size=hidden_size, num_heads=num_heads * 2) + self.assertEqual(nparams_default, nparams_default_more_heads) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_set_visible_devices.py b/tests/test_set_visible_devices.py index 7860656b3d..b4f44957a2 100644 --- a/tests/test_set_visible_devices.py +++ b/tests/test_set_visible_devices.py @@ -14,7 +14,7 @@ import os import unittest -from tests.utils import skip_if_no_cuda +from tests.utils import SkipIfAtLeastPyTorchVersion, skip_if_no_cuda class TestVisibleDevices(unittest.TestCase): @@ -25,6 +25,7 @@ def run_process_and_get_exit_code(code_to_execute): return int(bin(value).replace("0b", "").rjust(16, "0")[:8], 2) @skip_if_no_cuda + @SkipIfAtLeastPyTorchVersion((2, 2, 1)) def test_visible_devices(self): num_gpus_before = self.run_process_and_get_exit_code( 'python -c "import os; import torch; ' diff --git a/tests/test_sobel_gradient.py b/tests/test_sobel_gradient.py index 3d995a60c9..a0d7cf5a8b 100644 --- a/tests/test_sobel_gradient.py +++ b/tests/test_sobel_gradient.py @@ -164,8 +164,8 @@ def test_sobel_gradients(self, image, arguments, expected_grad): ) def test_sobel_kernels(self, arguments, expected_kernels): sobel = SobelGradients(**arguments) - self.assertTrue(sobel.kernel_diff.dtype == expected_kernels[0].dtype) - self.assertTrue(sobel.kernel_smooth.dtype == expected_kernels[0].dtype) + self.assertEqual(sobel.kernel_diff.dtype, expected_kernels[0].dtype) + self.assertEqual(sobel.kernel_smooth.dtype, expected_kernels[0].dtype) assert_allclose(sobel.kernel_diff, expected_kernels[0]) assert_allclose(sobel.kernel_smooth, expected_kernels[1]) diff --git a/tests/test_sobel_gradientd.py b/tests/test_sobel_gradientd.py index 7499a0410b..03524823a5 100644 --- a/tests/test_sobel_gradientd.py +++ b/tests/test_sobel_gradientd.py @@ -187,8 +187,8 @@ def test_sobel_gradients(self, image_dict, arguments, expected_grad): ) def test_sobel_kernels(self, arguments, expected_kernels): sobel = SobelGradientsd(**arguments) - self.assertTrue(sobel.kernel_diff.dtype == expected_kernels[0].dtype) - self.assertTrue(sobel.kernel_smooth.dtype == expected_kernels[0].dtype) + self.assertEqual(sobel.kernel_diff.dtype, expected_kernels[0].dtype) + self.assertEqual(sobel.kernel_smooth.dtype, expected_kernels[0].dtype) assert_allclose(sobel.kernel_diff, expected_kernels[0]) assert_allclose(sobel.kernel_smooth, expected_kernels[1]) diff --git a/tests/test_soft_clip.py b/tests/test_soft_clip.py new file mode 100644 index 0000000000..de5122e982 --- /dev/null +++ b/tests/test_soft_clip.py @@ -0,0 +1,125 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +import numpy as np +import torch +from parameterized import parameterized + +from monai.transforms.utils import soft_clip + +TEST_CASES = [ + [ + {"minv": 2, "maxv": 8, "sharpness_factor": 10}, + { + "input": torch.arange(10).float(), + "clipped": torch.tensor([2.0000, 2.0000, 2.0693, 3.0000, 4.0000, 5.0000, 6.0000, 7.0000, 7.9307, 8.0000]), + }, + ], + [ + {"minv": 2, "maxv": None, "sharpness_factor": 10}, + { + "input": torch.arange(10).float(), + "clipped": torch.tensor([2.0000, 2.0000, 2.0693, 3.0000, 4.0000, 5.0000, 6.0000, 7.0000, 8.0000, 9.0000]), + }, + ], + [ + {"minv": None, "maxv": 7, "sharpness_factor": 10}, + { + "input": torch.arange(10).float(), + "clipped": torch.tensor([0.0000, 1.0000, 2.0000, 3.0000, 4.0000, 5.0000, 6.0000, 6.9307, 7.0000, 7.0000]), + }, + ], + [ + {"minv": 2, "maxv": 8, "sharpness_factor": 1.0}, + { + "input": torch.arange(10).float(), + "clipped": torch.tensor([2.1266, 2.3124, 2.6907, 3.3065, 4.1088, 5.0000, 5.8912, 6.6935, 7.3093, 7.6877]), + }, + ], + [ + {"minv": 2, "maxv": 8, "sharpness_factor": 3.0}, + { + "input": torch.arange(10).float(), + "clipped": torch.tensor([2.0008, 2.0162, 2.2310, 3.0162, 4.0008, 5.0000, 5.9992, 6.9838, 7.7690, 7.9838]), + }, + ], + [ + {"minv": 2, "maxv": 8, "sharpness_factor": 5.0}, + { + "input": torch.arange(10).float(), + "clipped": torch.tensor([2.0000, 2.0013, 2.1386, 3.0013, 4.0000, 5.0000, 6.0000, 6.9987, 7.8614, 7.9987]), + }, + ], + [ + {"minv": 2, "maxv": 8, "sharpness_factor": 10}, + { + "input": np.arange(10).astype(np.float32), + "clipped": np.array([2.0000, 2.0000, 2.0693, 3.0000, 4.0000, 5.0000, 6.0000, 7.0000, 7.9307, 8.0000]), + }, + ], + [ + {"minv": 2, "maxv": None, "sharpness_factor": 10}, + { + "input": np.arange(10).astype(float), + "clipped": np.array([2.0000, 2.0000, 2.0693, 3.0000, 4.0000, 5.0000, 6.0000, 7.0000, 8.0000, 9.0000]), + }, + ], + [ + {"minv": None, "maxv": 7, "sharpness_factor": 10}, + { + "input": np.arange(10).astype(float), + "clipped": np.array([0.0000, 1.0000, 2.0000, 3.0000, 4.0000, 5.0000, 6.0000, 6.9307, 7.0000, 7.0000]), + }, + ], + [ + {"minv": 2, "maxv": 8, "sharpness_factor": 1.0}, + { + "input": np.arange(10).astype(float), + "clipped": np.array([2.1266, 2.3124, 2.6907, 3.3065, 4.1088, 5.0000, 5.8912, 6.6935, 7.3093, 7.6877]), + }, + ], + [ + {"minv": 2, "maxv": 8, "sharpness_factor": 3.0}, + { + "input": np.arange(10).astype(float), + "clipped": np.array([2.0008, 2.0162, 2.2310, 3.0162, 4.0008, 5.0000, 5.9992, 6.9838, 7.7690, 7.9838]), + }, + ], + [ + {"minv": 2, "maxv": 8, "sharpness_factor": 5.0}, + { + "input": np.arange(10).astype(float), + "clipped": np.array([2.0000, 2.0013, 2.1386, 3.0013, 4.0000, 5.0000, 6.0000, 6.9987, 7.8614, 7.9987]), + }, + ], +] + + +class TestSoftClip(unittest.TestCase): + + @parameterized.expand(TEST_CASES) + def test_result(self, input_param, input_data): + outputs = soft_clip(input_data["input"], **input_param) + expected_val = input_data["clipped"] + if isinstance(outputs, torch.Tensor): + np.testing.assert_allclose( + outputs.detach().cpu().numpy(), expected_val.detach().cpu().numpy(), atol=1e-4, rtol=1e-4 + ) + else: + np.testing.assert_allclose(outputs, expected_val, atol=1e-4, rtol=1e-4) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_spade_autoencoderkl.py b/tests/test_spade_autoencoderkl.py new file mode 100644 index 0000000000..9353ceedc2 --- /dev/null +++ b/tests/test_spade_autoencoderkl.py @@ -0,0 +1,295 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest +from unittest import skipUnless + +import torch +from parameterized import parameterized + +from monai.networks import eval_mode +from monai.networks.nets import SPADEAutoencoderKL +from monai.utils import optional_import + +einops, has_einops = optional_import("einops") + +CASES_NO_ATTENTION = [ + [ + { + "spatial_dims": 2, + "label_nc": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, False), + "num_res_blocks": 1, + "norm_num_groups": 4, + "with_encoder_nonlocal_attn": False, + "with_decoder_nonlocal_attn": False, + }, + (1, 1, 16, 16), + (1, 3, 16, 16), + (1, 1, 16, 16), + (1, 4, 4, 4), + ], + [ + { + "spatial_dims": 3, + "label_nc": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, False), + "num_res_blocks": 1, + "norm_num_groups": 4, + "with_encoder_nonlocal_attn": False, + "with_decoder_nonlocal_attn": False, + }, + (1, 1, 16, 16, 16), + (1, 3, 16, 16, 16), + (1, 1, 16, 16, 16), + (1, 4, 4, 4, 4), + ], +] + +CASES_ATTENTION = [ + [ + { + "spatial_dims": 2, + "label_nc": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, False), + "num_res_blocks": 1, + "norm_num_groups": 4, + }, + (1, 1, 16, 16), + (1, 3, 16, 16), + (1, 1, 16, 16), + (1, 4, 4, 4), + ], + [ + { + "spatial_dims": 2, + "label_nc": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, False), + "num_res_blocks": (1, 1, 2), + "norm_num_groups": 4, + }, + (1, 1, 16, 16), + (1, 3, 16, 16), + (1, 1, 16, 16), + (1, 4, 4, 4), + ], + [ + { + "spatial_dims": 2, + "label_nc": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, False), + "num_res_blocks": 1, + "norm_num_groups": 4, + }, + (1, 1, 16, 16), + (1, 3, 16, 16), + (1, 1, 16, 16), + (1, 4, 4, 4), + ], + [ + { + "spatial_dims": 2, + "label_nc": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, True), + "num_res_blocks": 1, + "norm_num_groups": 4, + }, + (1, 1, 16, 16), + (1, 3, 16, 16), + (1, 1, 16, 16), + (1, 4, 4, 4), + ], + [ + { + "spatial_dims": 2, + "label_nc": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, False), + "num_res_blocks": 1, + "norm_num_groups": 4, + "with_encoder_nonlocal_attn": False, + }, + (1, 1, 16, 16), + (1, 3, 16, 16), + (1, 1, 16, 16), + (1, 4, 4, 4), + ], + [ + { + "spatial_dims": 3, + "label_nc": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, True), + "num_res_blocks": 1, + "norm_num_groups": 4, + }, + (1, 1, 16, 16, 16), + (1, 3, 16, 16, 16), + (1, 1, 16, 16, 16), + (1, 4, 4, 4, 4), + ], + [ + { + "spatial_dims": 2, + "label_nc": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4, 4), + "latent_channels": 4, + "attention_levels": (False, False, True), + "num_res_blocks": 1, + "norm_num_groups": 4, + "spade_intermediate_channels": 32, + }, + (1, 1, 16, 16), + (1, 3, 16, 16), + (1, 1, 16, 16), + (1, 4, 4, 4), + ], +] + +device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + +if has_einops: + CASES = CASES_ATTENTION + CASES_NO_ATTENTION +else: + CASES = CASES_NO_ATTENTION + + +class TestSPADEAutoEncoderKL(unittest.TestCase): + @parameterized.expand(CASES) + def test_shape(self, input_param, input_shape, input_seg, expected_shape, expected_latent_shape): + net = SPADEAutoencoderKL(**input_param).to(device) + with eval_mode(net): + result = net.forward(torch.randn(input_shape).to(device), torch.randn(input_seg).to(device)) + self.assertEqual(result[0].shape, expected_shape) + self.assertEqual(result[1].shape, expected_latent_shape) + + @skipUnless(has_einops, "Requires einops") + def test_model_channels_not_multiple_of_norm_num_group(self): + with self.assertRaises(ValueError): + SPADEAutoencoderKL( + spatial_dims=2, + label_nc=3, + in_channels=1, + out_channels=1, + channels=(24, 24, 24), + attention_levels=(False, False, False), + latent_channels=8, + num_res_blocks=1, + norm_num_groups=16, + ) + + @skipUnless(has_einops, "Requires einops") + def test_model_channels_not_same_size_of_attention_levels(self): + with self.assertRaises(ValueError): + SPADEAutoencoderKL( + spatial_dims=2, + label_nc=3, + in_channels=1, + out_channels=1, + channels=(24, 24, 24), + attention_levels=(False, False), + latent_channels=8, + num_res_blocks=1, + norm_num_groups=16, + ) + + @skipUnless(has_einops, "Requires einops") + def test_model_channels_not_same_size_of_num_res_blocks(self): + with self.assertRaises(ValueError): + SPADEAutoencoderKL( + spatial_dims=2, + label_nc=3, + in_channels=1, + out_channels=1, + channels=(24, 24, 24), + attention_levels=(False, False, False), + latent_channels=8, + num_res_blocks=(8, 8), + norm_num_groups=16, + ) + + def test_shape_encode(self): + input_param, input_shape, _, _, expected_latent_shape = CASES[0] + net = SPADEAutoencoderKL(**input_param).to(device) + with eval_mode(net): + result = net.encode(torch.randn(input_shape).to(device)) + self.assertEqual(result[0].shape, expected_latent_shape) + self.assertEqual(result[1].shape, expected_latent_shape) + + def test_shape_sampling(self): + input_param, _, _, _, expected_latent_shape = CASES[0] + net = SPADEAutoencoderKL(**input_param).to(device) + with eval_mode(net): + result = net.sampling( + torch.randn(expected_latent_shape).to(device), torch.randn(expected_latent_shape).to(device) + ) + self.assertEqual(result.shape, expected_latent_shape) + + def test_shape_decode(self): + input_param, _, input_seg_shape, expected_input_shape, latent_shape = CASES[0] + net = SPADEAutoencoderKL(**input_param).to(device) + with eval_mode(net): + result = net.decode(torch.randn(latent_shape).to(device), torch.randn(input_seg_shape).to(device)) + self.assertEqual(result.shape, expected_input_shape) + + @skipUnless(has_einops, "Requires einops") + def test_wrong_shape_decode(self): + net = SPADEAutoencoderKL( + spatial_dims=2, + label_nc=3, + in_channels=1, + out_channels=1, + channels=(4, 4, 4), + latent_channels=4, + attention_levels=(False, False, False), + num_res_blocks=1, + norm_num_groups=4, + ) + with self.assertRaises(RuntimeError): + _ = net.decode(torch.randn((1, 1, 16, 16)).to(device), torch.randn((1, 6, 16, 16)).to(device)) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_spade_diffusion_model_unet.py b/tests/test_spade_diffusion_model_unet.py new file mode 100644 index 0000000000..481705f56f --- /dev/null +++ b/tests/test_spade_diffusion_model_unet.py @@ -0,0 +1,574 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest +from unittest import skipUnless + +import torch +from parameterized import parameterized + +from monai.networks import eval_mode +from monai.networks.nets import SPADEDiffusionModelUNet +from monai.utils import optional_import + +einops, has_einops = optional_import("einops") +UNCOND_CASES_2D = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + "label_nc": 3, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": (1, 1, 2), + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + "label_nc": 3, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + "resblock_updown": True, + "label_nc": 3, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + "label_nc": 3, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + "resblock_updown": True, + "label_nc": 3, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "label_nc": 3, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, True, True), + "num_head_channels": (0, 2, 4), + "norm_num_groups": 8, + "label_nc": 3, + } + ], +] + +UNCOND_CASES_3D = [ + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + "label_nc": 3, + "spade_intermediate_channels": 256, + } + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + "label_nc": 3, + } + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, False), + "norm_num_groups": 8, + "resblock_updown": True, + "label_nc": 3, + } + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + "label_nc": 3, + } + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 8, + "norm_num_groups": 8, + "resblock_updown": True, + "label_nc": 3, + } + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "label_nc": 3, + } + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": (0, 0, 4), + "norm_num_groups": 8, + "label_nc": 3, + } + ], +] + +COND_CASES_2D = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + "label_nc": 3, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + "resblock_updown": True, + "label_nc": 3, + } + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "num_res_blocks": 1, + "channels": (8, 8, 8), + "attention_levels": (False, False, True), + "num_head_channels": 4, + "norm_num_groups": 8, + "with_conditioning": True, + "transformer_num_layers": 1, + "cross_attention_dim": 3, + "upcast_attention": True, + "label_nc": 3, + } + ], +] + + +class TestSPADEDiffusionModelUNet2D(unittest.TestCase): + @parameterized.expand(UNCOND_CASES_2D) + @skipUnless(has_einops, "Requires einops") + def test_shape_unconditioned_models(self, input_param): + net = SPADEDiffusionModelUNet(**input_param) + with eval_mode(net): + result = net.forward( + torch.rand((1, 1, 16, 16)), + torch.randint(0, 1000, (1,)).long(), + torch.rand((1, input_param["label_nc"], 16, 16)), + ) + self.assertEqual(result.shape, (1, 1, 16, 16)) + + @skipUnless(has_einops, "Requires einops") + def test_timestep_with_wrong_shape(self): + net = SPADEDiffusionModelUNet( + spatial_dims=2, + label_nc=3, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, False), + norm_num_groups=8, + ) + with self.assertRaises(ValueError): + with eval_mode(net): + net.forward( + torch.rand((1, 1, 16, 16)), torch.randint(0, 1000, (1, 1)).long(), torch.rand((1, 3, 16, 16)) + ) + + @skipUnless(has_einops, "Requires einops") + def test_label_with_wrong_shape(self): + net = SPADEDiffusionModelUNet( + spatial_dims=2, + label_nc=3, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, False), + norm_num_groups=8, + ) + with self.assertRaises(RuntimeError): + with eval_mode(net): + net.forward(torch.rand((1, 1, 16, 16)), torch.randint(0, 1000, (1,)).long(), torch.rand((1, 6, 16, 16))) + + @skipUnless(has_einops, "Requires einops") + def test_shape_with_different_in_channel_out_channel(self): + in_channels = 6 + out_channels = 3 + net = SPADEDiffusionModelUNet( + spatial_dims=2, + label_nc=3, + in_channels=in_channels, + out_channels=out_channels, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, False), + norm_num_groups=8, + ) + with eval_mode(net): + result = net.forward( + torch.rand((1, in_channels, 16, 16)), torch.randint(0, 1000, (1,)).long(), torch.rand((1, 3, 16, 16)) + ) + self.assertEqual(result.shape, (1, out_channels, 16, 16)) + + def test_model_channels_not_multiple_of_norm_num_group(self): + with self.assertRaises(ValueError): + SPADEDiffusionModelUNet( + spatial_dims=2, + label_nc=3, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 12), + attention_levels=(False, False, False), + norm_num_groups=8, + ) + + def test_attention_levels_with_different_length_num_head_channels(self): + with self.assertRaises(ValueError): + SPADEDiffusionModelUNet( + spatial_dims=2, + label_nc=3, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, False), + num_head_channels=(0, 2), + norm_num_groups=8, + ) + + def test_num_res_blocks_with_different_length_channels(self): + with self.assertRaises(ValueError): + SPADEDiffusionModelUNet( + spatial_dims=2, + label_nc=3, + in_channels=1, + out_channels=1, + num_res_blocks=(1, 1), + channels=(8, 8, 8), + attention_levels=(False, False, False), + norm_num_groups=8, + ) + + @skipUnless(has_einops, "Requires einops") + def test_shape_conditioned_models(self): + net = SPADEDiffusionModelUNet( + spatial_dims=2, + label_nc=3, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, True), + with_conditioning=True, + transformer_num_layers=1, + cross_attention_dim=3, + norm_num_groups=8, + num_head_channels=8, + ) + with eval_mode(net): + result = net.forward( + x=torch.rand((1, 1, 16, 32)), + timesteps=torch.randint(0, 1000, (1,)).long(), + seg=torch.rand((1, 3, 16, 32)), + context=torch.rand((1, 1, 3)), + ) + self.assertEqual(result.shape, (1, 1, 16, 32)) + + @skipUnless(has_einops, "Requires einops") + def test_with_conditioning_cross_attention_dim_none(self): + with self.assertRaises(ValueError): + SPADEDiffusionModelUNet( + spatial_dims=2, + label_nc=3, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, True), + with_conditioning=True, + transformer_num_layers=1, + cross_attention_dim=None, + norm_num_groups=8, + ) + + @skipUnless(has_einops, "Requires einops") + def test_context_with_conditioning_none(self): + net = SPADEDiffusionModelUNet( + spatial_dims=2, + label_nc=3, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, True), + with_conditioning=False, + transformer_num_layers=1, + norm_num_groups=8, + ) + + with self.assertRaises(ValueError): + with eval_mode(net): + net.forward( + x=torch.rand((1, 1, 16, 32)), + timesteps=torch.randint(0, 1000, (1,)).long(), + seg=torch.rand((1, 3, 16, 32)), + context=torch.rand((1, 1, 3)), + ) + + @skipUnless(has_einops, "Requires einops") + def test_shape_conditioned_models_class_conditioning(self): + net = SPADEDiffusionModelUNet( + spatial_dims=2, + label_nc=3, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, True), + norm_num_groups=8, + num_head_channels=8, + num_class_embeds=2, + ) + with eval_mode(net): + result = net.forward( + x=torch.rand((1, 1, 16, 32)), + timesteps=torch.randint(0, 1000, (1,)).long(), + seg=torch.rand((1, 3, 16, 32)), + class_labels=torch.randint(0, 2, (1,)).long(), + ) + self.assertEqual(result.shape, (1, 1, 16, 32)) + + @skipUnless(has_einops, "Requires einops") + def test_conditioned_models_no_class_labels(self): + net = SPADEDiffusionModelUNet( + spatial_dims=2, + label_nc=3, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, True), + norm_num_groups=8, + num_head_channels=8, + num_class_embeds=2, + ) + + with self.assertRaises(ValueError): + net.forward( + x=torch.rand((1, 1, 16, 32)), + timesteps=torch.randint(0, 1000, (1,)).long(), + seg=torch.rand((1, 3, 16, 32)), + ) + + def test_model_channels_not_same_size_of_attention_levels(self): + with self.assertRaises(ValueError): + SPADEDiffusionModelUNet( + spatial_dims=2, + label_nc=3, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False), + norm_num_groups=8, + num_head_channels=8, + num_class_embeds=2, + ) + + @parameterized.expand(COND_CASES_2D) + @skipUnless(has_einops, "Requires einops") + def test_conditioned_2d_models_shape(self, input_param): + net = SPADEDiffusionModelUNet(**input_param) + with eval_mode(net): + result = net.forward( + torch.rand((1, 1, 16, 16)), + torch.randint(0, 1000, (1,)).long(), + torch.rand((1, input_param["label_nc"], 16, 16)), + torch.rand((1, 1, 3)), + ) + self.assertEqual(result.shape, (1, 1, 16, 16)) + + +class TestDiffusionModelUNet3D(unittest.TestCase): + @parameterized.expand(UNCOND_CASES_3D) + @skipUnless(has_einops, "Requires einops") + def test_shape_unconditioned_models(self, input_param): + net = SPADEDiffusionModelUNet(**input_param) + with eval_mode(net): + result = net.forward( + torch.rand((1, 1, 16, 16, 16)), + torch.randint(0, 1000, (1,)).long(), + torch.rand((1, input_param["label_nc"], 16, 16, 16)), + ) + self.assertEqual(result.shape, (1, 1, 16, 16, 16)) + + @skipUnless(has_einops, "Requires einops") + def test_shape_with_different_in_channel_out_channel(self): + in_channels = 6 + out_channels = 3 + net = SPADEDiffusionModelUNet( + spatial_dims=3, + label_nc=3, + in_channels=in_channels, + out_channels=out_channels, + num_res_blocks=1, + channels=(8, 8, 8), + attention_levels=(False, False, True), + norm_num_groups=4, + ) + with eval_mode(net): + result = net.forward( + torch.rand((1, in_channels, 16, 16, 16)), + torch.randint(0, 1000, (1,)).long(), + torch.rand((1, 3, 16, 16, 16)), + ) + self.assertEqual(result.shape, (1, out_channels, 16, 16, 16)) + + @skipUnless(has_einops, "Requires einops") + def test_shape_conditioned_models(self): + net = SPADEDiffusionModelUNet( + spatial_dims=3, + label_nc=3, + in_channels=1, + out_channels=1, + num_res_blocks=1, + channels=(16, 16, 16), + attention_levels=(False, False, True), + norm_num_groups=16, + with_conditioning=True, + transformer_num_layers=1, + cross_attention_dim=3, + ) + with eval_mode(net): + result = net.forward( + x=torch.rand((1, 1, 16, 16, 16)), + timesteps=torch.randint(0, 1000, (1,)).long(), + seg=torch.rand((1, 3, 16, 16, 16)), + context=torch.rand((1, 1, 3)), + ) + self.assertEqual(result.shape, (1, 1, 16, 16, 16)) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_spade_vaegan.py b/tests/test_spade_vaegan.py new file mode 100644 index 0000000000..3fdb9b74cb --- /dev/null +++ b/tests/test_spade_vaegan.py @@ -0,0 +1,140 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +import numpy as np +import torch +from parameterized import parameterized + +from monai.networks import eval_mode +from monai.networks.nets import SPADENet + +CASE_2D = [ + [[2, 1, 1, 3, [64, 64], [16, 32, 64, 128], 16, True]], + [[2, 1, 1, 3, [64, 64], [16, 32, 64, 128], None, False]], +] +CASE_3D = [ + [[3, 1, 1, 3, [64, 64, 64], [16, 32, 64, 128], 16, True]], + [[3, 1, 1, 3, [64, 64, 64], [16, 32, 64, 128], None, False]], +] + + +def create_semantic_data(shape: list, semantic_regions: int): + """ + To create semantic and image mock inputs for the network. + Args: + shape: input shape + semantic_regions: number of semantic region + Returns: + """ + out_label = torch.zeros(shape) + out_image = torch.zeros(shape) + torch.randn(shape) * 0.01 + for i in range(1, semantic_regions): + shape_square = [i // np.random.choice(list(range(2, i // 2))) for i in shape] + start_point = [np.random.choice(list(range(shape[ind] - shape_square[ind]))) for ind, i in enumerate(shape)] + if len(shape) == 2: + out_label[ + start_point[0] : (start_point[0] + shape_square[0]), start_point[1] : (start_point[1] + shape_square[1]) + ] = i + base_intensity = torch.ones(shape_square) * np.random.randn() + out_image[ + start_point[0] : (start_point[0] + shape_square[0]), start_point[1] : (start_point[1] + shape_square[1]) + ] = (base_intensity + torch.randn(shape_square) * 0.1) + elif len(shape) == 3: + out_label[ + start_point[0] : (start_point[0] + shape_square[0]), + start_point[1] : (start_point[1] + shape_square[1]), + start_point[2] : (start_point[2] + shape_square[2]), + ] = i + base_intensity = torch.ones(shape_square) * np.random.randn() + out_image[ + start_point[0] : (start_point[0] + shape_square[0]), + start_point[1] : (start_point[1] + shape_square[1]), + start_point[2] : (start_point[2] + shape_square[2]), + ] = (base_intensity + torch.randn(shape_square) * 0.1) + else: + ValueError("Supports only 2D and 3D tensors") + + # One hot encode label + out_label_ = torch.zeros([semantic_regions] + list(out_label.shape)) + for ch in range(semantic_regions): + out_label_[ch, ...] = out_label == ch + + return out_label_.unsqueeze(0), out_image.unsqueeze(0).unsqueeze(0) + + +class TestSpadeNet(unittest.TestCase): + @parameterized.expand(CASE_2D) + def test_forward_2d(self, input_param): + """ + Check that forward method is called correctly and output shape matches. + """ + net = SPADENet(*input_param) + in_label, in_image = create_semantic_data(input_param[4], input_param[3]) + with eval_mode(net): + if not net.is_vae: + out = net(in_label, in_image) + out = out[0] + else: + out, z_mu, z_logvar = net(in_label, in_image) + self.assertTrue(torch.all(torch.isfinite(z_mu))) + self.assertTrue(torch.all(torch.isfinite(z_logvar))) + + self.assertTrue(torch.all(torch.isfinite(out))) + self.assertEqual(list(out.shape), [1, 1, 64, 64]) + + @parameterized.expand(CASE_2D) + def test_encoder_decoder(self, input_param): + """ + Check that forward method is called correctly and output shape matches. + """ + net = SPADENet(*input_param) + in_label, in_image = create_semantic_data(input_param[4], input_param[3]) + with eval_mode(net): + out_z = net.encode(in_image) + if net.is_vae: + self.assertEqual(list(out_z.shape), [1, 16]) + else: + self.assertEqual(out_z, None) + out_i = net.decode(in_label, out_z) + self.assertEqual(list(out_i.shape), [1, 1, 64, 64]) + + @parameterized.expand(CASE_3D) + def test_forward_3d(self, input_param): + """ + Check that forward method is called correctly and output shape matches. + """ + net = SPADENet(*input_param) + in_label, in_image = create_semantic_data(input_param[4], input_param[3]) + with eval_mode(net): + if net.is_vae: + out, z_mu, z_logvar = net(in_label, in_image) + self.assertTrue(torch.all(torch.isfinite(z_mu))) + self.assertTrue(torch.all(torch.isfinite(z_logvar))) + else: + out = net(in_label, in_image) + out = out[0] + self.assertTrue(torch.all(torch.isfinite(out))) + self.assertEqual(list(out.shape), [1, 1, 64, 64, 64]) + + def test_shape_wrong(self): + """ + We input an input shape that isn't divisible by 2**(n downstream steps) + """ + with self.assertRaises(ValueError): + _ = SPADENet(1, 1, 8, [16, 16], [16, 32, 64, 128], 16, True) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_spatial_resampled.py b/tests/test_spatial_resampled.py index 541015cc34..d5c86258d7 100644 --- a/tests/test_spatial_resampled.py +++ b/tests/test_spatial_resampled.py @@ -11,6 +11,7 @@ from __future__ import annotations +import platform import unittest import numpy as np @@ -23,6 +24,12 @@ from tests.lazy_transforms_utils import test_resampler_lazy from tests.utils import TEST_DEVICES, assert_allclose +ON_AARCH64 = platform.machine() == "aarch64" +if ON_AARCH64: + rtol, atol = 1e-1, 1e-2 +else: + rtol, atol = 1e-3, 1e-4 + TESTS = [] destinations_3d = [ @@ -104,7 +111,7 @@ def test_flips_inverse(self, img, device, dst_affine, kwargs, expected_output): # check lazy lazy_xform = SpatialResampled(**init_param) - test_resampler_lazy(lazy_xform, output_data, init_param, call_param, output_key="img") + test_resampler_lazy(lazy_xform, output_data, init_param, call_param, output_key="img", rtol=rtol, atol=atol) # check inverse inverted = xform.inverse(output_data)["img"] diff --git a/tests/test_spatialattention.py b/tests/test_spatialattention.py new file mode 100644 index 0000000000..70b78263c5 --- /dev/null +++ b/tests/test_spatialattention.py @@ -0,0 +1,55 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest +from unittest import skipUnless + +import torch +from parameterized import parameterized + +from monai.networks import eval_mode +from monai.networks.blocks.spatialattention import SpatialAttentionBlock +from monai.utils import optional_import + +einops, has_einops = optional_import("einops") + +TEST_CASES = [ + [ + {"spatial_dims": 2, "num_channels": 128, "num_head_channels": 32, "norm_num_groups": 32, "norm_eps": 1e-6}, + (1, 128, 32, 32), + (1, 128, 32, 32), + ], + [ + {"spatial_dims": 3, "num_channels": 16, "num_head_channels": 8, "norm_num_groups": 8, "norm_eps": 1e-6}, + (1, 16, 8, 8, 8), + (1, 16, 8, 8, 8), + ], +] + + +class TestBlock(unittest.TestCase): + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_shape(self, input_param, input_shape, expected_shape): + net = SpatialAttentionBlock(**input_param) + with eval_mode(net): + result = net(torch.randn(input_shape)) + self.assertEqual(result.shape, expected_shape) + + def test_attention_dim_not_multiple_of_heads(self): + with self.assertRaises(ValueError): + SpatialAttentionBlock(spatial_dims=2, num_channels=128, num_head_channels=33) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_subpixel_upsample.py b/tests/test_subpixel_upsample.py index 5abbe57e11..fe9fb1c328 100644 --- a/tests/test_subpixel_upsample.py +++ b/tests/test_subpixel_upsample.py @@ -55,9 +55,9 @@ (2, 1, 32, 16, 8), ] -TEST_CASE_SUBPIXEL.append(TEST_CASE_SUBPIXEL_2D_EXTRA) -TEST_CASE_SUBPIXEL.append(TEST_CASE_SUBPIXEL_3D_EXTRA) -TEST_CASE_SUBPIXEL.append(TEST_CASE_SUBPIXEL_CONV_BLOCK_EXTRA) +TEST_CASE_SUBPIXEL.append(TEST_CASE_SUBPIXEL_2D_EXTRA) # type: ignore +TEST_CASE_SUBPIXEL.append(TEST_CASE_SUBPIXEL_3D_EXTRA) # type: ignore +TEST_CASE_SUBPIXEL.append(TEST_CASE_SUBPIXEL_CONV_BLOCK_EXTRA) # type: ignore # add every test back with the pad/pool sequential component omitted for tests in list(TEST_CASE_SUBPIXEL): diff --git a/tests/test_sure_loss.py b/tests/test_sure_loss.py new file mode 100644 index 0000000000..903f9bd2ca --- /dev/null +++ b/tests/test_sure_loss.py @@ -0,0 +1,72 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +import torch + +from monai.losses import SURELoss + + +class TestSURELoss(unittest.TestCase): + + def test_real_value(self): + """Test SURELoss with real-valued input: when the input is real value, the loss should be 0.0.""" + sure_loss_real = SURELoss(perturb_noise=torch.zeros(2, 1, 128, 128), eps=0.1) + + def operator(x): + return x + + y_pseudo_gt = torch.randn(2, 1, 128, 128) + x = torch.randn(2, 1, 128, 128) + loss = sure_loss_real(operator, x, y_pseudo_gt, complex_input=False) + self.assertAlmostEqual(loss.item(), 0.0) + + def test_complex_value(self): + """Test SURELoss with complex-valued input: when the input is complex value, the loss should be 0.0.""" + + def operator(x): + return x + + sure_loss_complex = SURELoss(perturb_noise=torch.zeros(2, 2, 128, 128), eps=0.1) + y_pseudo_gt = torch.randn(2, 2, 128, 128) + x = torch.randn(2, 2, 128, 128) + loss = sure_loss_complex(operator, x, y_pseudo_gt, complex_input=True) + self.assertAlmostEqual(loss.item(), 0.0) + + def test_complex_general_input(self): + """Test SURELoss with complex-valued input: when the input is general complex value, the loss should be 0.0.""" + + def operator(x): + return x + + perturb_noise_real = torch.randn(2, 1, 128, 128) + perturb_noise_complex = torch.zeros(2, 2, 128, 128) + perturb_noise_complex[:, 0, :, :] = perturb_noise_real.squeeze() + y_pseudo_gt_real = torch.randn(2, 1, 128, 128) + y_pseudo_gt_complex = torch.zeros(2, 2, 128, 128) + y_pseudo_gt_complex[:, 0, :, :] = y_pseudo_gt_real.squeeze() + x_real = torch.randn(2, 1, 128, 128) + x_complex = torch.zeros(2, 2, 128, 128) + x_complex[:, 0, :, :] = x_real.squeeze() + + sure_loss_real = SURELoss(perturb_noise=perturb_noise_real, eps=0.1) + sure_loss_complex = SURELoss(perturb_noise=perturb_noise_complex, eps=0.1) + + loss_real = sure_loss_real(operator, x_real, y_pseudo_gt_real, complex_input=False) + loss_complex = sure_loss_complex(operator, x_complex, y_pseudo_gt_complex, complex_input=True) + self.assertAlmostEqual(loss_real.item(), loss_complex.abs().item(), places=6) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_synthetic.py b/tests/test_synthetic.py index 7db3c3e77a..4ab2144568 100644 --- a/tests/test_synthetic.py +++ b/tests/test_synthetic.py @@ -47,7 +47,7 @@ def test_create_test_image(self, dim, input_param, expected_img, expected_seg, e set_determinism(seed=0) if dim == 2: img, seg = create_test_image_2d(**input_param) - elif dim == 3: + else: # dim == 3 img, seg = create_test_image_3d(**input_param) self.assertEqual(img.shape, expected_shape) self.assertEqual(seg.max(), expected_max_cls) diff --git a/tests/test_tciadataset.py b/tests/test_tciadataset.py index d996922e20..5a16bb4816 100644 --- a/tests/test_tciadataset.py +++ b/tests/test_tciadataset.py @@ -108,7 +108,7 @@ def _test_dataset(dataset): )[0] shutil.rmtree(os.path.join(testing_dir, collection)) - try: + with self.assertRaisesRegex(RuntimeError, "^Cannot find dataset directory"): TciaDataset( root_dir=testing_dir, collection=collection, @@ -117,8 +117,6 @@ def _test_dataset(dataset): download=False, val_frac=val_frac, ) - except RuntimeError as e: - self.assertTrue(str(e).startswith("Cannot find dataset directory")) if __name__ == "__main__": diff --git a/tests/test_threadcontainer.py b/tests/test_threadcontainer.py index 9551dec703..568461748b 100644 --- a/tests/test_threadcontainer.py +++ b/tests/test_threadcontainer.py @@ -62,7 +62,7 @@ def test_container(self): self.assertTrue(con.is_alive) self.assertIsNotNone(con.status()) - self.assertTrue(len(con.status_dict) > 0) + self.assertGreater(len(con.status_dict), 0) con.join() diff --git a/tests/test_to_cupy.py b/tests/test_to_cupy.py index 5a1754e7c5..38400f0d3f 100644 --- a/tests/test_to_cupy.py +++ b/tests/test_to_cupy.py @@ -62,8 +62,8 @@ def test_numpy_input_dtype(self): test_data = np.rot90(test_data) self.assertFalse(test_data.flags["C_CONTIGUOUS"]) result = ToCupy(np.uint8)(test_data) - self.assertTrue(result.dtype == cp.uint8) - self.assertTrue(isinstance(result, cp.ndarray)) + self.assertEqual(result.dtype, cp.uint8) + self.assertIsInstance(result, cp.ndarray) self.assertTrue(result.flags["C_CONTIGUOUS"]) cp.testing.assert_allclose(result, test_data) @@ -72,8 +72,8 @@ def test_tensor_input(self): test_data = test_data.rot90() self.assertFalse(test_data.is_contiguous()) result = ToCupy()(test_data) - self.assertTrue(result.dtype == cp.float32) - self.assertTrue(isinstance(result, cp.ndarray)) + self.assertEqual(result.dtype, cp.float32) + self.assertIsInstance(result, cp.ndarray) self.assertTrue(result.flags["C_CONTIGUOUS"]) cp.testing.assert_allclose(result, test_data) @@ -83,8 +83,8 @@ def test_tensor_cuda_input(self): test_data = test_data.rot90() self.assertFalse(test_data.is_contiguous()) result = ToCupy()(test_data) - self.assertTrue(result.dtype == cp.float32) - self.assertTrue(isinstance(result, cp.ndarray)) + self.assertEqual(result.dtype, cp.float32) + self.assertIsInstance(result, cp.ndarray) self.assertTrue(result.flags["C_CONTIGUOUS"]) cp.testing.assert_allclose(result, test_data) @@ -95,8 +95,8 @@ def test_tensor_cuda_input_dtype(self): self.assertFalse(test_data.is_contiguous()) result = ToCupy(dtype="float32")(test_data) - self.assertTrue(result.dtype == cp.float32) - self.assertTrue(isinstance(result, cp.ndarray)) + self.assertEqual(result.dtype, cp.float32) + self.assertIsInstance(result, cp.ndarray) self.assertTrue(result.flags["C_CONTIGUOUS"]) cp.testing.assert_allclose(result, test_data) diff --git a/tests/test_to_numpy.py b/tests/test_to_numpy.py index 8f7cf34865..f4e5f80a29 100644 --- a/tests/test_to_numpy.py +++ b/tests/test_to_numpy.py @@ -32,7 +32,7 @@ def test_cupy_input(self): test_data = cp.rot90(test_data) self.assertFalse(test_data.flags["C_CONTIGUOUS"]) result = ToNumpy()(test_data) - self.assertTrue(isinstance(result, np.ndarray)) + self.assertIsInstance(result, np.ndarray) self.assertTrue(result.flags["C_CONTIGUOUS"]) assert_allclose(result, test_data.get(), type_test=False) @@ -41,8 +41,8 @@ def test_numpy_input(self): test_data = np.rot90(test_data) self.assertFalse(test_data.flags["C_CONTIGUOUS"]) result = ToNumpy(dtype="float32")(test_data) - self.assertTrue(isinstance(result, np.ndarray)) - self.assertTrue(result.dtype == np.float32) + self.assertIsInstance(result, np.ndarray) + self.assertEqual(result.dtype, np.float32) self.assertTrue(result.flags["C_CONTIGUOUS"]) assert_allclose(result, test_data, type_test=False) @@ -51,7 +51,7 @@ def test_tensor_input(self): test_data = test_data.rot90() self.assertFalse(test_data.is_contiguous()) result = ToNumpy(dtype=torch.uint8)(test_data) - self.assertTrue(isinstance(result, np.ndarray)) + self.assertIsInstance(result, np.ndarray) self.assertTrue(result.flags["C_CONTIGUOUS"]) assert_allclose(result, test_data, type_test=False) @@ -61,7 +61,7 @@ def test_tensor_cuda_input(self): test_data = test_data.rot90() self.assertFalse(test_data.is_contiguous()) result = ToNumpy()(test_data) - self.assertTrue(isinstance(result, np.ndarray)) + self.assertIsInstance(result, np.ndarray) self.assertTrue(result.flags["C_CONTIGUOUS"]) assert_allclose(result, test_data, type_test=False) @@ -71,13 +71,13 @@ def test_list_tuple(self): assert_allclose(result, np.asarray(test_data), type_test=False) test_data = ((1, 2), (3, 4)) result = ToNumpy(wrap_sequence=False)(test_data) - self.assertTrue(type(result), tuple) + self.assertIsInstance(result, tuple) assert_allclose(result, ((np.asarray(1), np.asarray(2)), (np.asarray(3), np.asarray(4)))) def test_single_value(self): for test_data in [5, np.array(5), torch.tensor(5)]: result = ToNumpy(dtype=np.uint8)(test_data) - self.assertTrue(isinstance(result, np.ndarray)) + self.assertIsInstance(result, np.ndarray) assert_allclose(result, np.asarray(test_data), type_test=False) self.assertEqual(result.ndim, 0) diff --git a/tests/test_torchvision_fc_model.py b/tests/test_torchvision_fc_model.py index 322cce1161..9cc19db62c 100644 --- a/tests/test_torchvision_fc_model.py +++ b/tests/test_torchvision_fc_model.py @@ -195,8 +195,8 @@ def test_get_module(self): mod = look_up_named_module("model.1.submodule.1.submodule.1.submodule.0.conv", net) self.assertTrue(str(mod).startswith("Conv2d")) self.assertIsInstance(set_named_module(net, "model", torch.nn.Identity()).model, torch.nn.Identity) - self.assertEqual(look_up_named_module("model.1.submodule.1.submodule.1.submodule.conv", net), None) - self.assertEqual(look_up_named_module("test attribute", net), None) + self.assertIsNone(look_up_named_module("model.1.submodule.1.submodule.1.submodule.conv", net)) + self.assertIsNone(look_up_named_module("test attribute", net)) if __name__ == "__main__": diff --git a/tests/test_traceable_transform.py b/tests/test_traceable_transform.py index dd139053e3..6a499b2dd9 100644 --- a/tests/test_traceable_transform.py +++ b/tests/test_traceable_transform.py @@ -33,12 +33,12 @@ def test_default(self): expected_key = "_transforms" a = _TraceTest() for x in a.transform_info_keys(): - self.assertTrue(x in a.get_transform_info()) + self.assertIn(x, a.get_transform_info()) self.assertEqual(a.trace_key(), expected_key) data = {"image": "test"} data = a(data) # adds to the stack - self.assertTrue(isinstance(data[expected_key], list)) + self.assertIsInstance(data[expected_key], list) self.assertEqual(data[expected_key][0]["class"], "_TraceTest") data = a(data) # adds to the stack diff --git a/tests/test_transformer.py b/tests/test_transformer.py new file mode 100644 index 0000000000..b371809d47 --- /dev/null +++ b/tests/test_transformer.py @@ -0,0 +1,109 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import os +import tempfile +import unittest +from unittest import skipUnless + +import numpy as np +import torch +from parameterized import parameterized + +from monai.apps import download_url +from monai.networks import eval_mode +from monai.networks.nets import DecoderOnlyTransformer +from monai.utils import optional_import +from tests.utils import skip_if_downloading_fails, testing_data_config + +_, has_einops = optional_import("einops") +TEST_CASES = [] +for dropout_rate in np.linspace(0, 1, 2): + for attention_layer_dim in [360, 480, 600, 768]: + for num_heads in [4, 6, 8, 12]: + TEST_CASES.append( + [ + { + "num_tokens": 10, + "max_seq_len": 16, + "attn_layers_dim": attention_layer_dim, + "attn_layers_depth": 2, + "attn_layers_heads": num_heads, + "embedding_dropout_rate": dropout_rate, + } + ] + ) + + +class TestDecoderOnlyTransformer(unittest.TestCase): + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_unconditioned_models(self, input_param): + net = DecoderOnlyTransformer(**input_param) + with eval_mode(net): + net.forward(torch.randint(0, 10, (1, 16))) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_conditioned_models(self, input_param): + net = DecoderOnlyTransformer(**input_param, with_cross_attention=True) + with eval_mode(net): + net.forward(torch.randint(0, 10, (1, 16)), context=torch.randn(1, 3, input_param["attn_layers_dim"])) + + def test_attention_dim_not_multiple_of_heads(self): + with self.assertRaises(ValueError): + DecoderOnlyTransformer( + num_tokens=10, max_seq_len=16, attn_layers_dim=8, attn_layers_depth=2, attn_layers_heads=3 + ) + + @skipUnless(has_einops, "Requires einops") + def test_dropout_rate_negative(self): + + with self.assertRaises(ValueError): + DecoderOnlyTransformer( + num_tokens=10, + max_seq_len=16, + attn_layers_dim=8, + attn_layers_depth=2, + attn_layers_heads=2, + embedding_dropout_rate=-1, + ) + + @skipUnless(has_einops, "Requires einops") + def test_compatibility_with_monai_generative(self): + # test loading weights from a model saved in MONAI Generative, version 0.2.3 + with skip_if_downloading_fails(): + net = DecoderOnlyTransformer( + num_tokens=10, + max_seq_len=16, + attn_layers_dim=8, + attn_layers_depth=2, + attn_layers_heads=2, + with_cross_attention=True, + embedding_dropout_rate=0, + ) + + tmpdir = tempfile.mkdtemp() + key = "decoder_only_transformer_monai_generative_weights" + url = testing_data_config("models", key, "url") + hash_type = testing_data_config("models", key, "hash_type") + hash_val = testing_data_config("models", key, "hash_val") + filename = "decoder_only_transformer_monai_generative_weights.pt" + weight_path = os.path.join(tmpdir, filename) + download_url(url=url, filepath=weight_path, hash_val=hash_val, hash_type=hash_type) + + net.load_old_state_dict(torch.load(weight_path), verbose=False) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_transformerblock.py b/tests/test_transformerblock.py index 5a8dbba83c..a850cc6f74 100644 --- a/tests/test_transformerblock.py +++ b/tests/test_transformerblock.py @@ -12,6 +12,7 @@ from __future__ import annotations import unittest +from unittest import skipUnless import numpy as np import torch @@ -19,28 +20,33 @@ from monai.networks import eval_mode from monai.networks.blocks.transformerblock import TransformerBlock +from monai.utils import optional_import +einops, has_einops = optional_import("einops") TEST_CASE_TRANSFORMERBLOCK = [] for dropout_rate in np.linspace(0, 1, 4): for hidden_size in [360, 480, 600, 768]: for num_heads in [4, 8, 12]: for mlp_dim in [1024, 3072]: - test_case = [ - { - "hidden_size": hidden_size, - "num_heads": num_heads, - "mlp_dim": mlp_dim, - "dropout_rate": dropout_rate, - }, - (2, 512, hidden_size), - (2, 512, hidden_size), - ] - TEST_CASE_TRANSFORMERBLOCK.append(test_case) + for cross_attention in [False, True]: + test_case = [ + { + "hidden_size": hidden_size, + "num_heads": num_heads, + "mlp_dim": mlp_dim, + "dropout_rate": dropout_rate, + "with_cross_attention": cross_attention, + }, + (2, 512, hidden_size), + (2, 512, hidden_size), + ] + TEST_CASE_TRANSFORMERBLOCK.append(test_case) class TestTransformerBlock(unittest.TestCase): @parameterized.expand(TEST_CASE_TRANSFORMERBLOCK) + @skipUnless(has_einops, "Requires einops") def test_shape(self, input_param, input_shape, expected_shape): net = TransformerBlock(**input_param) with eval_mode(net): @@ -54,6 +60,7 @@ def test_ill_arg(self): with self.assertRaises(ValueError): TransformerBlock(hidden_size=622, num_heads=8, mlp_dim=3072, dropout_rate=0.4) + @skipUnless(has_einops, "Requires einops") def test_access_attn_matrix(self): # input format hidden_size = 128 diff --git a/tests/test_tversky_loss.py b/tests/test_tversky_loss.py index efe1f2cdf3..0365503ea2 100644 --- a/tests/test_tversky_loss.py +++ b/tests/test_tversky_loss.py @@ -165,17 +165,12 @@ def test_ill_shape(self): with self.assertRaisesRegex(ValueError, ""): TverskyLoss(reduction=None)(chn_input, chn_target) - def test_input_warnings(self): + @parameterized.expand([(False, False, False), (False, True, False), (False, False, True)]) + def test_input_warnings(self, include_background, softmax, to_onehot_y): chn_input = torch.ones((1, 1, 3)) chn_target = torch.ones((1, 1, 3)) with self.assertWarns(Warning): - loss = TverskyLoss(include_background=False) - loss.forward(chn_input, chn_target) - with self.assertWarns(Warning): - loss = TverskyLoss(softmax=True) - loss.forward(chn_input, chn_target) - with self.assertWarns(Warning): - loss = TverskyLoss(to_onehot_y=True) + loss = TverskyLoss(include_background=include_background, softmax=softmax, to_onehot_y=to_onehot_y) loss.forward(chn_input, chn_target) def test_script(self): diff --git a/tests/test_ultrasound_confidence_map_transform.py b/tests/test_ultrasound_confidence_map_transform.py index f672961700..1c6b8f7635 100644 --- a/tests/test_ultrasound_confidence_map_transform.py +++ b/tests/test_ultrasound_confidence_map_transform.py @@ -11,14 +11,20 @@ from __future__ import annotations +import os import unittest import numpy as np import torch +from parameterized import parameterized +from PIL import Image from monai.transforms import UltrasoundConfidenceMapTransform +from monai.utils import optional_import from tests.utils import assert_allclose +_, has_scipy = optional_import("scipy") + TEST_INPUT = np.array( [ [1, 2, 3, 23, 13, 22, 5, 1, 2, 3], @@ -31,7 +37,8 @@ [1, 2, 3, 32, 33, 34, 35, 1, 2, 3], [1, 2, 3, 36, 37, 38, 39, 1, 2, 3], [1, 2, 3, 40, 41, 42, 43, 1, 2, 3], - ] + ], + dtype=np.float32, ) TEST_MASK = np.array( @@ -46,477 +53,439 @@ [1, 1, 1, 0, 0, 0, 1, 1, 1, 0], [1, 1, 1, 0, 0, 0, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - ] + ], + dtype=np.float32, ) SINK_ALL_OUTPUT = np.array( [ [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [ - 0.97514489, - 0.96762971, - 0.96164186, - 0.95463443, - 0.9941512, - 0.99023054, - 0.98559401, - 0.98230057, - 0.96601224, - 0.95119599, - ], - [ - 0.92960533, - 0.92638451, - 0.9056675, - 0.9487176, - 0.9546961, - 0.96165853, - 0.96172303, - 0.92686401, - 0.92122613, - 0.89957239, - ], - [ - 0.86490963, - 0.85723665, - 0.83798141, - 0.90816201, - 0.90816097, - 0.90815301, - 0.9081427, - 0.85933627, - 0.85146935, - 0.82948586, - ], - [ - 0.77430346, - 0.76731372, - 0.74372311, - 0.89128774, - 0.89126885, - 0.89125066, - 0.89123521, - 0.76858589, - 0.76106647, - 0.73807776, - ], - [ - 0.66098109, - 0.65327697, - 0.63090644, - 0.33086588, - 0.3308383, - 0.33081937, - 0.33080718, - 0.6557468, - 0.64825099, - 0.62593375, - ], - [ - 0.52526945, - 0.51832586, - 0.49709412, - 0.25985059, - 0.25981009, - 0.25977729, - 0.25975222, - 0.52118958, - 0.51426328, - 0.49323164, - ], - [ - 0.3697845, - 0.36318971, - 0.34424661, - 0.17386804, - 0.17382046, - 0.17377993, - 0.17374668, - 0.36689317, - 0.36036096, - 0.3415582, - ], - [ - 0.19546374, - 0.1909659, - 0.17319999, - 0.08423318, - 0.08417993, - 0.08413242, - 0.08409104, - 0.19393909, - 0.18947485, - 0.17185031, + 0.8884930952884654, + 0.8626656901726876, + 0.8301161870669913, + 0.9757179300830185, + 0.9989819637626414, + 0.9994717624885747, + 0.9954377526794013, + 0.8898638133944221, + 0.862604343021387, + 0.8277862494812598, + ], + [ + 0.7765718877433174, + 0.7363731552518268, + 0.6871875923653379, + 0.9753673327387775, + 0.9893175316399789, + 0.9944181334242039, + 0.9936979128319371, + 0.7778001700035326, + 0.7362622619974832, + 0.6848377775329241, + ], + [ + 0.6648416226360719, + 0.6178079903692397, + 0.5630152545966568, + 0.8278402502498404, + 0.82790391019578, + 0.8289702087149963, + 0.8286730258710652, + 0.6658773633169731, + 0.6176836507071695, + 0.5609165245633834, + ], + [ + 0.5534420483956817, + 0.5055401989946189, + 0.451865872383879, + 0.7541423053657541, + 0.7544115886347456, + 0.7536884376055174, + 0.7524927915364896, + 0.5542943466824017, + 0.505422678400297, + 0.4502051549732117, + ], + [ + 0.4423657561928356, + 0.398221575954319, + 0.35030055029978124, + 0.4793202144786371, + 0.48057175662074125, + 0.4812057229564038, + 0.48111949176149327, + 0.44304092606050766, + 0.39812149713417405, + 0.34902458531143377, + ], + [ + 0.3315561576450342, + 0.29476346732036784, + 0.2558303772864961, + 0.35090405668257535, + 0.3515225984307705, + 0.35176548159366317, + 0.3516979775419521, + 0.33205839061494885, + 0.2946859567272435, + 0.2549042599220772, + ], + [ + 0.22094175240967673, + 0.19431840633358133, + 0.16672448058324435, + 0.22716195845848167, + 0.22761996456848282, + 0.22782525614780919, + 0.22781876632199002, + 0.22127471252104777, + 0.19426593309729956, + 0.16612306610996525, + ], + [ + 0.11044782531624744, + 0.09623229814933323, + 0.08174664901235043, + 0.11081911718888311, + 0.11102310514207447, + 0.1111041051969924, + 0.11108329076967229, + 0.11061376973431204, + 0.09620592927336903, + 0.08145227209865454, ], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], - ] + ], + dtype=np.float32, ) SINK_MID_OUTPUT = np.array( [ + [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [ - 1.00000000e00, - 1.00000000e00, - 1.00000000e00, - 1.00000000e00, - 1.00000000e00, - 1.00000000e00, - 1.00000000e00, - 1.00000000e00, - 1.00000000e00, - 1.00000000e00, - ], - [ - 9.99996103e-01, - 9.99994823e-01, - 9.99993550e-01, - 9.99930863e-01, - 9.99990782e-01, - 9.99984683e-01, - 9.99979000e-01, - 9.99997804e-01, - 9.99995985e-01, - 9.99994325e-01, - ], - [ - 9.99989344e-01, - 9.99988600e-01, - 9.99984099e-01, - 9.99930123e-01, - 9.99926598e-01, - 9.99824297e-01, - 9.99815032e-01, - 9.99991228e-01, - 9.99990881e-01, - 9.99988462e-01, - ], - [ - 9.99980787e-01, - 9.99979264e-01, - 9.99975828e-01, - 9.59669286e-01, - 9.59664779e-01, - 9.59656566e-01, - 9.59648332e-01, - 9.99983882e-01, - 9.99983038e-01, - 9.99980732e-01, - ], - [ - 9.99970181e-01, - 9.99969032e-01, - 9.99965730e-01, - 9.45197806e-01, - 9.45179593e-01, - 9.45163629e-01, - 9.45151458e-01, - 9.99973352e-01, - 9.99973254e-01, - 9.99971098e-01, - ], - [ - 9.99958608e-01, - 9.99957307e-01, - 9.99953444e-01, - 4.24743523e-01, - 4.24713305e-01, - 4.24694646e-01, - 4.24685271e-01, - 9.99960948e-01, - 9.99961829e-01, - 9.99960347e-01, - ], - [ - 9.99946675e-01, - 9.99945139e-01, - 9.99940312e-01, - 3.51353224e-01, - 3.51304003e-01, - 3.51268260e-01, - 3.51245366e-01, - 9.99947688e-01, - 9.99950165e-01, - 9.99949512e-01, - ], - [ - 9.99935877e-01, - 9.99934088e-01, - 9.99928982e-01, - 2.51197134e-01, - 2.51130273e-01, - 2.51080014e-01, - 2.51045852e-01, - 9.99936187e-01, - 9.99939716e-01, - 9.99940022e-01, - ], - [ - 9.99927846e-01, - 9.99925911e-01, - 9.99920188e-01, - 1.31550973e-01, - 1.31462736e-01, - 1.31394558e-01, - 1.31346069e-01, - 9.99927275e-01, - 9.99932142e-01, - 9.99933313e-01, - ], - [ - 9.99924204e-01, - 9.99922004e-01, - 9.99915767e-01, - 3.04861147e-04, - 1.95998056e-04, - 0.00000000e00, - 2.05182682e-05, - 9.99923115e-01, - 9.99928835e-01, - 9.99930535e-01, - ], - ] + 0.9999957448889315, + 0.9999781044114231, + 0.9999142422442185, + 0.999853253199584, + 0.9999918403054282, + 0.9999874855193227, + 0.9999513619364747, + 0.9999589247003497, + 0.9999861765528631, + 0.9999939213967494, + ], + [ + 0.9999918011366045, + 0.9999588498417253, + 0.9998388659316617, + 0.9998496524281603, + 0.9999154673258592, + 0.9997827845182361, + 0.9998160234579786, + 0.9999163964511287, + 0.9999743435786168, + 0.9999894752861168, + ], + [ + 0.9999883847481621, + 0.9999427334014465, + 0.9997703972600652, + 0.9853967608835997, + 0.9852517829915376, + 0.9853308520519438, + 0.9854102394414211, + 0.9998728503298413, + 0.9999642585978225, + 0.999986204909933, + ], + [ + 0.999985544721449, + 0.9999296195017368, + 0.9997066149628903, + 0.9753803016111353, + 0.9750688049429371, + 0.9749211929217173, + 0.9750052047129354, + 0.9998284130289159, + 0.9999558481338295, + 0.9999837966320273, + ], + [ + 0.9999832723447848, + 0.9999192263814408, + 0.9996472692076177, + 0.90541293509353, + 0.9049945536526819, + 0.9051142437853055, + 0.9057005861296792, + 0.9997839348839027, + 0.9999490318922627, + 0.9999820419085812, + ], + [ + 0.9999815409510937, + 0.9999113168889934, + 0.9995930143319085, + 0.8370025145062345, + 0.8358345435164332, + 0.8358231468627223, + 0.8369430449157075, + 0.9997408260265034, + 0.9999437526409107, + 0.9999808010740554, + ], + [ + 0.9999803198262347, + 0.9999057164296593, + 0.9995461103528891, + 0.7047260555380003, + 0.7023346743490383, + 0.7022946969603594, + 0.7045662738042475, + 0.9997017258131392, + 0.9999399744001316, + 0.9999799785302944, + ], + [ + 0.9999795785255197, + 0.9999022923125928, + 0.999510772973329, + 0.46283993237260707, + 0.4577365087549323, + 0.4571888733219068, + 0.4614967878524538, + 0.9996710272733927, + 0.9999376682163403, + 0.9999795067125865, + ], + [ + 0.9999792877553907, + 0.9999009179811408, + 0.9994950057121632, + 0.05049460567213739, + 0.030946131978013824, + 0.0, + 0.019224121648385283, + 0.9996568912408903, + 0.9999367861122628, + 0.9999793358521326, + ], + ], + dtype=np.float32, ) SINK_MIN_OUTPUT = np.array( [ [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [ - 0.99997545, - 0.99996582, - 0.99995245, - 0.99856594, - 0.99898314, - 0.99777223, - 0.99394423, - 0.98588113, - 0.97283215, - 0.96096504, - ], - [ - 0.99993872, - 0.99993034, - 0.9998832, - 0.9986147, - 0.99848741, - 0.9972981, - 0.99723719, - 0.94157173, - 0.9369832, - 0.91964243, - ], - [ - 0.99990802, - 0.99989475, - 0.99986873, - 0.98610197, - 0.98610047, - 0.98609749, - 0.98609423, - 0.88741275, - 0.88112911, - 0.86349156, - ], - [ - 0.99988924, - 0.99988509, - 0.99988698, - 0.98234089, - 0.98233591, - 0.98233065, - 0.98232562, - 0.81475172, - 0.80865978, - 0.79033138, - ], - [ - 0.99988418, - 0.99988484, - 0.99988323, - 0.86796555, - 0.86795874, - 0.86795283, - 0.86794756, - 0.72418193, - 0.71847704, - 0.70022037, - ], - [ - 0.99988241, - 0.99988184, - 0.99988103, - 0.85528225, - 0.85527303, - 0.85526389, - 0.85525499, - 0.61716519, - 0.61026209, - 0.59503671, - ], - [ - 0.99988015, - 0.99987985, - 0.99987875, - 0.84258114, - 0.84257121, - 0.84256042, - 0.84254897, - 0.48997924, - 0.49083978, - 0.46891561, - ], - [ - 0.99987865, - 0.99987827, - 0.9998772, - 0.83279589, - 0.83278624, - 0.83277384, - 0.83275897, - 0.36345545, - 0.33690244, - 0.35696828, - ], - [ - 0.99987796, - 0.99987756, - 0.99987643, - 0.82873223, - 0.82872648, - 0.82871803, - 0.82870711, - 0.0, - 0.26106012, - 0.29978657, - ], - ] + 0.9999961997987318, + 0.9999801752476248, + 0.9999185667341594, + 0.9993115972922259, + 0.9999536433504382, + 0.9997590064584757, + 0.9963282396026231, + 0.9020645423682648, + 0.965641014946897, + 0.9847003633599846, + ], + [ + 0.9999926824858815, + 0.9999628275604145, + 0.9998472915971415, + 0.9992953054409239, + 0.9995550237000549, + 0.9972853256638443, + 0.9958871482234863, + 0.8006505271617617, + 0.9360757301263053, + 0.9734843475613124, + ], + [ + 0.9999896427490426, + 0.9999484707116104, + 0.9997841142091455, + 0.9321779021295554, + 0.9308591506422442, + 0.9299937642438358, + 0.9286536283468563, + 0.6964658886602826, + 0.9106656689679997, + 0.9652109119709528, + ], + [ + 0.9999871227708508, + 0.9999369646510842, + 0.9997276125796202, + 0.9006206490361908, + 0.8987968702587018, + 0.8965696900664386, + 0.8941507574801211, + 0.5892568658180841, + 0.8892240419729905, + 0.9590996257620853, + ], + [ + 0.9999851119906539, + 0.9999280075234918, + 0.9996788394671484, + 0.778755271203017, + 0.7763917808258874, + 0.7737517385551721, + 0.7707980517990098, + 0.4788014936236403, + 0.8715671104783401, + 0.954632732759503, + ], + [ + 0.9999835837292402, + 0.999921323618806, + 0.9996389455307461, + 0.7222961578407286, + 0.7186158832946955, + 0.7146983167265393, + 0.7105768254632475, + 0.3648911004360315, + 0.8575943501305144, + 0.9514642802768379, + ], + [ + 0.9999825081019064, + 0.999916683268467, + 0.9996093996776352, + 0.6713490686473397, + 0.6664914636518112, + 0.6613110504728309, + 0.6558325489984669, + 0.247299682539502, + 0.8473037957967624, + 0.9493580587294981, + ], + [ + 0.999981856118739, + 0.9999138938063622, + 0.9995907248497593, + 0.6331535096751639, + 0.6271637176135582, + 0.6206687804556549, + 0.6136262027168252, + 0.12576864809108962, + 0.8407892431959736, + 0.9481472656653798, + ], + [ + 0.9999816006081851, + 0.9999127861527936, + 0.9995832399159849, + 0.6133274396648696, + 0.6086364734302403, + 0.6034602717119345, + 0.5978473214165134, + 0.0, + 0.8382338778894218, + 0.9477082231321966, + ], + ], + dtype=np.float32, ) SINK_MASK_OUTPUT = np.array( [ + [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], + [0.0, 0.0, 0.0, 0.9047934405899283, 0.9936046284605553, 0.9448690902377527, 0.0, 0.0, 0.0, 0.8363773255131761], + [0.0, 0.0, 0.0, 0.90375200446097, 0.9434594475474036, 0.4716831449516178, 0.0, 0.0, 0.0, 0.7364197333910302], + [ + 0.0, + 0.0, + 0.0, + 0.09080438801405301, + 0.06774182873204163, + 0.038207095016625024, + 0.0, + 0.0, + 0.0, + 0.6745641479264269, + ], + [ + 0.0, + 0.0, + 0.0, + 0.01731082802870267, + 0.013540929458217351, + 0.007321202161532623, + 0.0, + 0.0, + 0.0, + 0.6341231654271253, + ], + [ + 0.0, + 0.0, + 0.0, + 0.0006444251665178544, + 0.0005397129128756325, + 0.0003048384803626333, + 0.0, + 0.0, + 0.0, + 0.6070178708536365, + ], + [ + 0.0, + 0.0, + 0.0, + 5.406078586212675e-05, + 4.416783924970537e-05, + 2.4597362039020103e-05, + 0.0, + 0.0, + 0.0, + 0.5889413683184284, + ], [ - 1.00000000e00, - 1.00000000e00, - 1.00000000e00, - 1.00000000e00, - 1.00000000e00, - 1.00000000e00, - 1.00000000e00, - 1.00000000e00, - 1.00000000e00, - 1.00000000e00, - ], - [ - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 2.86416400e-01, - 7.93271181e-01, - 5.81341234e-01, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 1.98395623e-01, - ], - [ - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 2.66733297e-01, - 2.80741490e-01, - 4.14078784e-02, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 7.91676486e-04, - ], - [ - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 1.86244537e-04, - 1.53413401e-04, - 7.85806495e-05, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 5.09797387e-06, - ], - [ - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 9.62904581e-07, - 7.23946225e-07, - 3.68824440e-07, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 4.79525316e-08, - ], - [ - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 1.50939343e-10, - 1.17724874e-10, - 6.21760843e-11, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 6.08922784e-10, - ], - [ - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 2.57593754e-13, - 1.94066716e-13, - 9.83784370e-14, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 9.80828665e-12, - ], - [ - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 4.22323494e-16, - 3.17556633e-16, - 1.60789400e-16, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 1.90789819e-13, - ], - [ - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 7.72677888e-19, - 5.83029424e-19, - 2.95946659e-19, - 0.00000000e00, - 0.00000000e00, - 0.00000000e00, - 4.97038275e-15, - ], - [ - 2.71345908e-24, - 5.92006757e-24, - 2.25580089e-23, - 3.82601970e-18, - 3.82835349e-18, - 3.83302158e-18, - 3.84002606e-18, - 8.40760586e-16, - 1.83433696e-15, - 1.11629633e-15, - ], - ] + 0.0, + 0.0, + 0.0, + 4.39259327223233e-06, + 3.6050656774754658e-06, + 2.0127120155893425e-06, + 0.0, + 0.0, + 0.0, + 0.5774279920364456, + ], + [ + 0.0, + 0.0, + 0.0, + 4.0740501726718113e-07, + 3.374875487404489e-07, + 1.9113630985667455e-07, + 0.0, + 0.0, + 0.0, + 0.5709897726747111, + ], + [ + 3.2266922388030425e-17, + 1.801110982679718e-14, + 9.325899448306927e-12, + 3.913608442133728e-07, + 3.9581822403393465e-07, + 4.02383505118481e-07, + 4.14820241328287e-07, + 4.281640797396309e-06, + 0.0023900192231620593, + 0.5686882523793125, + ], + ], + dtype=np.float32, ) +@unittest.skipUnless(has_scipy, "Requires scipy") class TestUltrasoundConfidenceMapTransform(unittest.TestCase): def setUp(self): @@ -526,6 +495,21 @@ def setUp(self): self.input_img_torch = torch.from_numpy(TEST_INPUT).unsqueeze(0) # mock image (torch tensor) self.input_mask_torch = torch.from_numpy(TEST_MASK).unsqueeze(0) # mock mask (torch tensor) + self.real_input_img_paths = [ + os.path.join(os.path.dirname(__file__), "testing_data", "ultrasound_confidence_map", "neck_input.png"), + os.path.join(os.path.dirname(__file__), "testing_data", "ultrasound_confidence_map", "femur_input.png"), + ] + + self.real_result_npy_paths = [ + os.path.join(os.path.dirname(__file__), "testing_data", "ultrasound_confidence_map", "neck_result.npy"), + os.path.join(os.path.dirname(__file__), "testing_data", "ultrasound_confidence_map", "femur_result.npy"), + ] + + self.real_input_paramaters = [ + {"alpha": 2.0, "beta": 90, "gamma": 0.03}, + {"alpha": 2.0, "beta": 90, "gamma": 0.06}, + ] + def test_parameters(self): # Unknown mode with self.assertRaises(ValueError): @@ -535,162 +519,92 @@ def test_parameters(self): with self.assertRaises(ValueError): UltrasoundConfidenceMapTransform(sink_mode="unknown") - def test_rgb(self): + @parameterized.expand( + [("all", SINK_ALL_OUTPUT), ("mid", SINK_MID_OUTPUT), ("min", SINK_MIN_OUTPUT), ("mask", SINK_MASK_OUTPUT, True)] + ) + def test_ultrasound_confidence_map_transform(self, sink_mode, expected_output, use_mask=False): # RGB image input_img_rgb = np.expand_dims(np.repeat(self.input_img_np, 3, axis=0), axis=0) input_img_rgb_torch = torch.from_numpy(input_img_rgb) - transform = UltrasoundConfidenceMapTransform(sink_mode="all") - result_torch = transform(input_img_rgb_torch) - self.assertIsInstance(result_torch, torch.Tensor) - assert_allclose(result_torch, torch.tensor(SINK_ALL_OUTPUT), rtol=1e-4, atol=1e-4) - result_np = transform(input_img_rgb) - self.assertIsInstance(result_np, np.ndarray) - assert_allclose(result_np, SINK_ALL_OUTPUT, rtol=1e-4, atol=1e-4) - - transform = UltrasoundConfidenceMapTransform(sink_mode="mid") - result_torch = transform(input_img_rgb_torch) - self.assertIsInstance(result_torch, torch.Tensor) - assert_allclose(result_torch, torch.tensor(SINK_MID_OUTPUT), rtol=1e-4, atol=1e-4) - result_np = transform(input_img_rgb) - self.assertIsInstance(result_np, np.ndarray) - assert_allclose(result_np, SINK_MID_OUTPUT, rtol=1e-4, atol=1e-4) + transform = UltrasoundConfidenceMapTransform(sink_mode=sink_mode) - transform = UltrasoundConfidenceMapTransform(sink_mode="min") - result_torch = transform(input_img_rgb_torch) - self.assertIsInstance(result_torch, torch.Tensor) - assert_allclose(result_torch, torch.tensor(SINK_MIN_OUTPUT), rtol=1e-4, atol=1e-4) - result_np = transform(input_img_rgb) - self.assertIsInstance(result_np, np.ndarray) - assert_allclose(result_np, SINK_MIN_OUTPUT, rtol=1e-4, atol=1e-4) + if use_mask: + result_torch = transform(input_img_rgb_torch, self.input_mask_torch) + result_np = transform(input_img_rgb, self.input_mask_np) + else: + result_torch = transform(input_img_rgb_torch) + result_np = transform(input_img_rgb) - transform = UltrasoundConfidenceMapTransform(sink_mode="mask") - result_torch = transform(input_img_rgb_torch, self.input_mask_torch) self.assertIsInstance(result_torch, torch.Tensor) - assert_allclose(result_torch, torch.tensor(SINK_MASK_OUTPUT), rtol=1e-4, atol=1e-4) - result_np = transform(input_img_rgb, self.input_mask_np) + assert_allclose(result_torch, torch.tensor(expected_output), rtol=1e-4, atol=1e-4) self.assertIsInstance(result_np, np.ndarray) - assert_allclose(result_np, SINK_MASK_OUTPUT, rtol=1e-4, atol=1e-4) + assert_allclose(result_np, expected_output, rtol=1e-4, atol=1e-4) - def test_multi_channel_2d(self): - # 2D multi-channel image + @parameterized.expand( + [ + ("all", SINK_ALL_OUTPUT), + ("mid", SINK_MID_OUTPUT), + ("min", SINK_MIN_OUTPUT), + ("mask", SINK_MASK_OUTPUT, True), # Adding a flag for mask cases + ] + ) + def test_multi_channel_2d(self, sink_mode, expected_output, use_mask=False): input_img_rgb = np.expand_dims(np.repeat(self.input_img_np, 17, axis=0), axis=0) input_img_rgb_torch = torch.from_numpy(input_img_rgb) - transform = UltrasoundConfidenceMapTransform(sink_mode="all") - result_torch = transform(input_img_rgb_torch) - self.assertIsInstance(result_torch, torch.Tensor) - assert_allclose(result_torch, torch.tensor(SINK_ALL_OUTPUT), rtol=1e-4, atol=1e-4) - result_np = transform(input_img_rgb) - self.assertIsInstance(result_np, np.ndarray) - assert_allclose(result_np, SINK_ALL_OUTPUT, rtol=1e-4, atol=1e-4) - - transform = UltrasoundConfidenceMapTransform(sink_mode="mid") - result_torch = transform(input_img_rgb_torch) - self.assertIsInstance(result_torch, torch.Tensor) - assert_allclose(result_torch, torch.tensor(SINK_MID_OUTPUT), rtol=1e-4, atol=1e-4) - result_np = transform(input_img_rgb) - self.assertIsInstance(result_np, np.ndarray) - assert_allclose(result_np, SINK_MID_OUTPUT, rtol=1e-4, atol=1e-4) + transform = UltrasoundConfidenceMapTransform(sink_mode=sink_mode) - transform = UltrasoundConfidenceMapTransform(sink_mode="min") - result_torch = transform(input_img_rgb_torch) - self.assertIsInstance(result_torch, torch.Tensor) - assert_allclose(result_torch, torch.tensor(SINK_MIN_OUTPUT), rtol=1e-4, atol=1e-4) - result_np = transform(input_img_rgb) - self.assertIsInstance(result_np, np.ndarray) - assert_allclose(result_np, SINK_MIN_OUTPUT, rtol=1e-4, atol=1e-4) + if use_mask: + result_torch = transform(input_img_rgb_torch, self.input_mask_torch) + result_np = transform(input_img_rgb, self.input_mask_np) + else: + result_torch = transform(input_img_rgb_torch) + result_np = transform(input_img_rgb) - transform = UltrasoundConfidenceMapTransform(sink_mode="mask") - result_torch = transform(input_img_rgb_torch, self.input_mask_torch) self.assertIsInstance(result_torch, torch.Tensor) - assert_allclose(result_torch, torch.tensor(SINK_MASK_OUTPUT), rtol=1e-4, atol=1e-4) - result_np = transform(input_img_rgb, self.input_mask_np) + assert_allclose(result_torch, torch.tensor(expected_output), rtol=1e-4, atol=1e-4) self.assertIsInstance(result_np, np.ndarray) - assert_allclose(result_np, SINK_MASK_OUTPUT, rtol=1e-4, atol=1e-4) + assert_allclose(result_np, expected_output, rtol=1e-4, atol=1e-4) - def test_non_one_first_dim(self): - # Image without first dimension as 1 + @parameterized.expand([("all",), ("mid",), ("min",), ("mask",)]) + def test_non_one_first_dim(self, sink_mode): + transform = UltrasoundConfidenceMapTransform(sink_mode=sink_mode) input_img_rgb = np.repeat(self.input_img_np, 3, axis=0) input_img_rgb_torch = torch.from_numpy(input_img_rgb) - transform = UltrasoundConfidenceMapTransform(sink_mode="all") - with self.assertRaises(ValueError): - transform(input_img_rgb_torch) - with self.assertRaises(ValueError): - transform(input_img_rgb) - - transform = UltrasoundConfidenceMapTransform(sink_mode="mid") - with self.assertRaises(ValueError): - transform(input_img_rgb_torch) - with self.assertRaises(ValueError): - transform(input_img_rgb) - - transform = UltrasoundConfidenceMapTransform(sink_mode="min") - with self.assertRaises(ValueError): - transform(input_img_rgb_torch) - with self.assertRaises(ValueError): - transform(input_img_rgb) - - transform = UltrasoundConfidenceMapTransform(sink_mode="mask") - with self.assertRaises(ValueError): - transform(input_img_rgb_torch, self.input_mask_torch) - with self.assertRaises(ValueError): - transform(input_img_rgb, self.input_mask_np) - - def test_no_first_dim(self): - # Image without first dimension + if sink_mode == "mask": + with self.assertRaises(ValueError): + transform(input_img_rgb_torch, self.input_mask_torch) + with self.assertRaises(ValueError): + transform(input_img_rgb, self.input_mask_np) + else: + with self.assertRaises(ValueError): + transform(input_img_rgb_torch) + with self.assertRaises(ValueError): + transform(input_img_rgb) + + @parameterized.expand([("all",), ("mid",), ("min",), ("mask",)]) + def test_no_first_dim(self, sink_mode): input_img_rgb = self.input_img_np[0] input_img_rgb_torch = torch.from_numpy(input_img_rgb) - transform = UltrasoundConfidenceMapTransform(sink_mode="all") - with self.assertRaises(ValueError): - transform(input_img_rgb_torch) - with self.assertRaises(ValueError): - transform(input_img_rgb) - - transform = UltrasoundConfidenceMapTransform(sink_mode="mid") - with self.assertRaises(ValueError): - transform(input_img_rgb_torch) - with self.assertRaises(ValueError): - transform(input_img_rgb) + transform = UltrasoundConfidenceMapTransform(sink_mode=sink_mode) - transform = UltrasoundConfidenceMapTransform(sink_mode="min") with self.assertRaises(ValueError): transform(input_img_rgb_torch) with self.assertRaises(ValueError): transform(input_img_rgb) - transform = UltrasoundConfidenceMapTransform(sink_mode="mask") - with self.assertRaises(ValueError): - transform(input_img_rgb_torch, self.input_mask_torch) - with self.assertRaises(ValueError): - transform(input_img_rgb, self.input_mask_np) + if sink_mode == "mask": + with self.assertRaises(ValueError): + transform(input_img_rgb_torch, self.input_mask_torch) + with self.assertRaises(ValueError): + transform(input_img_rgb, self.input_mask_np) - def test_sink_all(self): - transform = UltrasoundConfidenceMapTransform(sink_mode="all") - - # This should not raise an exception for torch tensor - result_torch = transform(self.input_img_torch) - self.assertIsInstance(result_torch, torch.Tensor) - - # This should not raise an exception for numpy array - result_np = transform(self.input_img_np) - self.assertIsInstance(result_np, np.ndarray) - - def test_sink_mid(self): - transform = UltrasoundConfidenceMapTransform(sink_mode="mid") - - # This should not raise an exception for torch tensor - result_torch = transform(self.input_img_torch) - self.assertIsInstance(result_torch, torch.Tensor) - - # This should not raise an exception for numpy array - result_np = transform(self.input_img_np) - self.assertIsInstance(result_np, np.ndarray) - - def test_sink_min(self): - transform = UltrasoundConfidenceMapTransform(sink_mode="min") + @parameterized.expand([("all",), ("mid",), ("min",)]) + def test_sink_mode(self, mode): + transform = UltrasoundConfidenceMapTransform(sink_mode=mode) # This should not raise an exception for torch tensor result_torch = transform(self.input_img_torch) @@ -752,6 +666,44 @@ def test_func(self): output = transform(self.input_img_torch, self.input_mask_torch) assert_allclose(output, torch.tensor(SINK_MASK_OUTPUT), rtol=1e-4, atol=1e-4) + def test_against_official_code(self): + # This test is to compare the output of the transform with the official code + # The official code is available at: + # https://campar.in.tum.de/Main/AthanasiosKaramalisCode + + for input_img_path, result_npy_path, params in zip( + self.real_input_img_paths, self.real_result_npy_paths, self.real_input_paramaters + ): + input_img = np.array(Image.open(input_img_path)) + input_img = np.expand_dims(input_img, axis=0) + + result_img = np.load(result_npy_path) + + transform = UltrasoundConfidenceMapTransform(sink_mode="all", **params) + output = transform(input_img) + + assert_allclose(output, result_img, rtol=1e-4, atol=1e-4) + + def test_against_official_code_using_cg(self): + # This test is to compare the output of the transform with the official code + # The official code is available at: + # https://campar.in.tum.de/Main/AthanasiosKaramalisCode + + for input_img_path, result_npy_path, params in zip( + self.real_input_img_paths, self.real_result_npy_paths, self.real_input_paramaters + ): + input_img = np.array(Image.open(input_img_path)) + input_img = np.expand_dims(input_img, axis=0) + + result_img = np.load(result_npy_path) + + transform = UltrasoundConfidenceMapTransform( + sink_mode="all", use_cg=True, cg_tol=1.0e-6, cg_maxiter=300, **params + ) + output = transform(input_img) + + assert_allclose(output, result_img, rtol=1e-2, atol=1e-2) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_vector_quantizer.py b/tests/test_vector_quantizer.py new file mode 100644 index 0000000000..43533d0377 --- /dev/null +++ b/tests/test_vector_quantizer.py @@ -0,0 +1,89 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest +from math import prod + +import torch +from parameterized import parameterized + +from monai.networks.layers import EMAQuantizer, VectorQuantizer + +TEST_CASES = [ + [{"spatial_dims": 2, "num_embeddings": 16, "embedding_dim": 8}, (1, 8, 4, 4), (1, 4, 4)], + [{"spatial_dims": 3, "num_embeddings": 16, "embedding_dim": 8}, (1, 8, 4, 4, 4), (1, 4, 4, 4)], +] + + +class TestEMA(unittest.TestCase): + @parameterized.expand(TEST_CASES) + def test_ema_shape(self, input_param, input_shape, output_shape): + layer = EMAQuantizer(**input_param) + x = torch.randn(input_shape) + layer = layer.train() + outputs = layer(x) + self.assertEqual(outputs[0].shape, input_shape) + self.assertEqual(outputs[2].shape, output_shape) + + layer = layer.eval() + outputs = layer(x) + self.assertEqual(outputs[0].shape, input_shape) + self.assertEqual(outputs[2].shape, output_shape) + + @parameterized.expand(TEST_CASES) + def test_ema_quantize(self, input_param, input_shape, output_shape): + layer = EMAQuantizer(**input_param) + x = torch.randn(input_shape) + outputs = layer.quantize(x) + self.assertEqual(outputs[0].shape, (prod(input_shape[2:]), input_shape[1])) # (HxW[xD], C) + self.assertEqual(outputs[1].shape, (prod(input_shape[2:]), input_param["num_embeddings"])) # (HxW[xD], E) + self.assertEqual(outputs[2].shape, (input_shape[0],) + input_shape[2:]) # (1, H, W, [D]) + + def test_ema(self): + layer = EMAQuantizer(spatial_dims=2, num_embeddings=2, embedding_dim=2, epsilon=0, decay=0) + original_weight_0 = layer.embedding.weight[0].clone() + original_weight_1 = layer.embedding.weight[1].clone() + x_0 = original_weight_0 + x_0 = x_0.unsqueeze(0).unsqueeze(-1).unsqueeze(-1) + x_0 = x_0.repeat(1, 1, 1, 2) + 0.001 + + x_1 = original_weight_1 + x_1 = x_1.unsqueeze(0).unsqueeze(-1).unsqueeze(-1) + x_1 = x_1.repeat(1, 1, 1, 2) + + x = torch.cat([x_0, x_1], dim=0) + layer = layer.train() + _ = layer(x) + + self.assertTrue(all(layer.embedding.weight[0] != original_weight_0)) + self.assertTrue(all(layer.embedding.weight[1] == original_weight_1)) + + +class TestVectorQuantizer(unittest.TestCase): + @parameterized.expand(TEST_CASES) + def test_vector_quantizer_shape(self, input_param, input_shape, output_shape): + layer = VectorQuantizer(EMAQuantizer(**input_param)) + x = torch.randn(input_shape) + outputs = layer(x) + self.assertEqual(outputs[1].shape, input_shape) + + @parameterized.expand(TEST_CASES) + def test_vector_quantizer_quantize(self, input_param, input_shape, output_shape): + layer = VectorQuantizer(EMAQuantizer(**input_param)) + x = torch.randn(input_shape) + outputs = layer.quantize(x) + self.assertEqual(outputs.shape, output_shape) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_vis_cam.py b/tests/test_vis_cam.py index b641599af2..68b12de2f8 100644 --- a/tests/test_vis_cam.py +++ b/tests/test_vis_cam.py @@ -70,6 +70,8 @@ class TestClassActivationMap(unittest.TestCase): @parameterized.expand([TEST_CASE_0, TEST_CASE_1, TEST_CASE_2, TEST_CASE_3]) def test_shape(self, input_data, expected_shape): + model = None + if input_data["model"] == "densenet2d": model = DenseNet121(spatial_dims=2, in_channels=1, out_channels=3) if input_data["model"] == "densenet3d": @@ -80,6 +82,7 @@ def test_shape(self, input_data, expected_shape): model = SEResNet50(spatial_dims=2, in_channels=3, num_classes=4) if input_data["model"] == "senet3d": model = SEResNet50(spatial_dims=3, in_channels=3, num_classes=4) + device = "cuda:0" if torch.cuda.is_available() else "cpu" model.to(device) model.eval() diff --git a/tests/test_vis_gradcam.py b/tests/test_vis_gradcam.py index 325b74b3ce..f77d916a5b 100644 --- a/tests/test_vis_gradcam.py +++ b/tests/test_vis_gradcam.py @@ -153,6 +153,8 @@ class TestGradientClassActivationMap(unittest.TestCase): @parameterized.expand(TESTS) def test_shape(self, cam_class, input_data, expected_shape): + model = None + if input_data["model"] == "densenet2d": model = DenseNet121(spatial_dims=2, in_channels=1, out_channels=3) elif input_data["model"] == "densenet2d_bin": diff --git a/tests/test_vit.py b/tests/test_vit.py index a84883cba0..d27c10f95e 100644 --- a/tests/test_vit.py +++ b/tests/test_vit.py @@ -69,75 +69,40 @@ def test_shape(self, input_param, input_shape, expected_shape): result, _ = net(torch.randn(input_shape)) self.assertEqual(result.shape, expected_shape) - def test_ill_arg(self): + @parameterized.expand( + [ + (1, (128, 128, 128), (16, 16, 16), 128, 3072, 12, 12, "conv", False, 5.0), + (1, (32, 32, 32), (64, 64, 64), 512, 3072, 12, 8, "perceptron", False, 0.3), + (1, (96, 96, 96), (8, 8, 8), 512, 3072, 12, 14, "conv", False, 0.3), + (1, (97, 97, 97), (4, 4, 4), 768, 3072, 12, 8, "perceptron", True, 0.3), + (4, (96, 96, 96), (16, 16, 16), 768, 3072, 12, 12, "perc", False, 0.3), + ] + ) + def test_ill_arg( + self, + in_channels, + img_size, + patch_size, + hidden_size, + mlp_dim, + num_layers, + num_heads, + pos_embed, + classification, + dropout_rate, + ): with self.assertRaises(ValueError): ViT( - in_channels=1, - img_size=(128, 128, 128), - patch_size=(16, 16, 16), - hidden_size=128, - mlp_dim=3072, - num_layers=12, - num_heads=12, - pos_embed="conv", - classification=False, - dropout_rate=5.0, - ) - - with self.assertRaises(ValueError): - ViT( - in_channels=1, - img_size=(32, 32, 32), - patch_size=(64, 64, 64), - hidden_size=512, - mlp_dim=3072, - num_layers=12, - num_heads=8, - pos_embed="perceptron", - classification=False, - dropout_rate=0.3, - ) - - with self.assertRaises(ValueError): - ViT( - in_channels=1, - img_size=(96, 96, 96), - patch_size=(8, 8, 8), - hidden_size=512, - mlp_dim=3072, - num_layers=12, - num_heads=14, - pos_embed="conv", - classification=False, - dropout_rate=0.3, - ) - - with self.assertRaises(ValueError): - ViT( - in_channels=1, - img_size=(97, 97, 97), - patch_size=(4, 4, 4), - hidden_size=768, - mlp_dim=3072, - num_layers=12, - num_heads=8, - pos_embed="perceptron", - classification=True, - dropout_rate=0.3, - ) - - with self.assertRaises(ValueError): - ViT( - in_channels=4, - img_size=(96, 96, 96), - patch_size=(16, 16, 16), - hidden_size=768, - mlp_dim=3072, - num_layers=12, - num_heads=12, - pos_embed="perc", - classification=False, - dropout_rate=0.3, + in_channels=in_channels, + img_size=img_size, + patch_size=patch_size, + hidden_size=hidden_size, + mlp_dim=mlp_dim, + num_layers=num_layers, + num_heads=num_heads, + pos_embed=pos_embed, + classification=classification, + dropout_rate=dropout_rate, ) @parameterized.expand(TEST_CASE_Vit) diff --git a/tests/test_vitautoenc.py b/tests/test_vitautoenc.py index cc3d493bb3..c68c583a0e 100644 --- a/tests/test_vitautoenc.py +++ b/tests/test_vitautoenc.py @@ -82,83 +82,30 @@ def test_shape(self, input_param, input_shape, expected_shape): result, _ = net(torch.randn(input_shape)) self.assertEqual(result.shape, expected_shape) - def test_ill_arg(self): + @parameterized.expand( + [ + (1, (32, 32, 32), (64, 64, 64), 512, 3072, 12, 8, "perceptron", 0.3), # img_size_too_large_for_patch_size + (1, (96, 96, 96), (8, 8, 8), 512, 3072, 12, 14, "conv", 0.3), # num_heads_out_of_bound + (1, (97, 97, 97), (4, 4, 4), 768, 3072, 12, 8, "perceptron", 0.3), # img_size_not_divisible_by_patch_size + (4, (96, 96, 96), (16, 16, 16), 768, 3072, 12, 12, "perc", 0.3), # invalid_pos_embed + (4, (96, 96, 96), (9, 9, 9), 768, 3072, 12, 12, "perc", 0.3), # patch_size_not_divisible + # Add more test cases as needed + ] + ) + def test_ill_arg( + self, in_channels, img_size, patch_size, hidden_size, mlp_dim, num_layers, num_heads, pos_embed, dropout_rate + ): with self.assertRaises(ValueError): ViTAutoEnc( - in_channels=1, - img_size=(128, 128, 128), - patch_size=(16, 16, 16), - hidden_size=128, - mlp_dim=3072, - num_layers=12, - num_heads=12, - pos_embed="conv", - dropout_rate=5.0, - ) - - with self.assertRaises(ValueError): - ViTAutoEnc( - in_channels=1, - img_size=(32, 32, 32), - patch_size=(64, 64, 64), - hidden_size=512, - mlp_dim=3072, - num_layers=12, - num_heads=8, - pos_embed="perceptron", - dropout_rate=0.3, - ) - - with self.assertRaises(ValueError): - ViTAutoEnc( - in_channels=1, - img_size=(96, 96, 96), - patch_size=(8, 8, 8), - hidden_size=512, - mlp_dim=3072, - num_layers=12, - num_heads=14, - pos_embed="conv", - dropout_rate=0.3, - ) - - with self.assertRaises(ValueError): - ViTAutoEnc( - in_channels=1, - img_size=(97, 97, 97), - patch_size=(4, 4, 4), - hidden_size=768, - mlp_dim=3072, - num_layers=12, - num_heads=8, - pos_embed="perceptron", - dropout_rate=0.3, - ) - - with self.assertRaises(ValueError): - ViTAutoEnc( - in_channels=4, - img_size=(96, 96, 96), - patch_size=(16, 16, 16), - hidden_size=768, - mlp_dim=3072, - num_layers=12, - num_heads=12, - pos_embed="perc", - dropout_rate=0.3, - ) - - with self.assertRaises(ValueError): - ViTAutoEnc( - in_channels=4, - img_size=(96, 96, 96), - patch_size=(9, 9, 9), - hidden_size=768, - mlp_dim=3072, - num_layers=12, - num_heads=12, - pos_embed="perc", - dropout_rate=0.3, + in_channels=in_channels, + img_size=img_size, + patch_size=patch_size, + hidden_size=hidden_size, + mlp_dim=mlp_dim, + num_layers=num_layers, + num_heads=num_heads, + pos_embed=pos_embed, + dropout_rate=dropout_rate, ) diff --git a/tests/test_vqvae.py b/tests/test_vqvae.py new file mode 100644 index 0000000000..4916dc2faa --- /dev/null +++ b/tests/test_vqvae.py @@ -0,0 +1,274 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +import torch +from parameterized import parameterized + +from monai.networks import eval_mode +from monai.networks.nets.vqvae import VQVAE +from tests.utils import SkipIfBeforePyTorchVersion + +TEST_CASES = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4), + "num_res_layers": 1, + "num_res_channels": (4, 4), + "downsample_parameters": ((2, 4, 1, 1),) * 2, + "upsample_parameters": ((2, 4, 1, 1, 0),) * 2, + "num_embeddings": 8, + "embedding_dim": 8, + }, + (1, 1, 8, 8), + (1, 1, 8, 8), + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4), + "num_res_layers": 1, + "num_res_channels": 4, + "downsample_parameters": ((2, 4, 1, 1),) * 2, + "upsample_parameters": ((2, 4, 1, 1, 0),) * 2, + "num_embeddings": 8, + "embedding_dim": 8, + }, + (1, 1, 8, 8, 8), + (1, 1, 8, 8, 8), + ], + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4), + "num_res_layers": 1, + "num_res_channels": (4, 4), + "downsample_parameters": (2, 4, 1, 1), + "upsample_parameters": ((2, 4, 1, 1, 0),) * 2, + "num_embeddings": 8, + "embedding_dim": 8, + }, + (1, 1, 8, 8), + (1, 1, 8, 8), + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (4, 4), + "num_res_layers": 1, + "num_res_channels": (4, 4), + "downsample_parameters": ((2, 4, 1, 1),) * 2, + "upsample_parameters": (2, 4, 1, 1, 0), + "num_embeddings": 8, + "embedding_dim": 8, + }, + (1, 1, 8, 8, 8), + (1, 1, 8, 8, 8), + ], +] + +TEST_LATENT_SHAPE = { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "downsample_parameters": ((2, 4, 1, 1),) * 2, + "upsample_parameters": ((2, 4, 1, 1, 0),) * 2, + "num_res_layers": 1, + "channels": (8, 8), + "num_res_channels": (8, 8), + "num_embeddings": 16, + "embedding_dim": 8, +} + + +class TestVQVAE(unittest.TestCase): + @parameterized.expand(TEST_CASES) + def test_shape(self, input_param, input_shape, expected_shape): + device = "cuda" if torch.cuda.is_available() else "cpu" + + net = VQVAE(**input_param).to(device) + + with eval_mode(net): + result, _ = net(torch.randn(input_shape).to(device)) + + self.assertEqual(result.shape, expected_shape) + + @parameterized.expand(TEST_CASES) + @SkipIfBeforePyTorchVersion((1, 11)) + def test_shape_with_checkpoint(self, input_param, input_shape, expected_shape): + device = "cuda" if torch.cuda.is_available() else "cpu" + input_param = input_param.copy() + input_param.update({"use_checkpointing": True}) + + net = VQVAE(**input_param).to(device) + + with eval_mode(net): + result, _ = net(torch.randn(input_shape).to(device)) + + self.assertEqual(result.shape, expected_shape) + + # Removed this test case since TorchScript currently does not support activation checkpoint. + # def test_script(self): + # net = VQVAE( + # spatial_dims=2, + # in_channels=1, + # out_channels=1, + # downsample_parameters=((2, 4, 1, 1),) * 2, + # upsample_parameters=((2, 4, 1, 1, 0),) * 2, + # num_res_layers=1, + # channels=(8, 8), + # num_res_channels=(8, 8), + # num_embeddings=16, + # embedding_dim=8, + # ddp_sync=False, + # ) + # test_data = torch.randn(1, 1, 16, 16) + # test_script_save(net, test_data) + + def test_channels_not_same_size_of_num_res_channels(self): + with self.assertRaises(ValueError): + VQVAE( + spatial_dims=2, + in_channels=1, + out_channels=1, + channels=(16, 16), + num_res_channels=(16, 16, 16), + downsample_parameters=((2, 4, 1, 1),) * 2, + upsample_parameters=((2, 4, 1, 1, 0),) * 2, + ) + + def test_channels_not_same_size_of_downsample_parameters(self): + with self.assertRaises(ValueError): + VQVAE( + spatial_dims=2, + in_channels=1, + out_channels=1, + channels=(16, 16), + num_res_channels=(16, 16), + downsample_parameters=((2, 4, 1, 1),) * 3, + upsample_parameters=((2, 4, 1, 1, 0),) * 2, + ) + + def test_channels_not_same_size_of_upsample_parameters(self): + with self.assertRaises(ValueError): + VQVAE( + spatial_dims=2, + in_channels=1, + out_channels=1, + channels=(16, 16), + num_res_channels=(16, 16), + downsample_parameters=((2, 4, 1, 1),) * 2, + upsample_parameters=((2, 4, 1, 1, 0),) * 3, + ) + + def test_downsample_parameters_not_sequence_or_int(self): + with self.assertRaises(ValueError): + VQVAE( + spatial_dims=2, + in_channels=1, + out_channels=1, + channels=(16, 16), + num_res_channels=(16, 16), + downsample_parameters=(("test", 4, 1, 1),) * 2, + upsample_parameters=((2, 4, 1, 1, 0),) * 2, + ) + + def test_upsample_parameters_not_sequence_or_int(self): + with self.assertRaises(ValueError): + VQVAE( + spatial_dims=2, + in_channels=1, + out_channels=1, + channels=(16, 16), + num_res_channels=(16, 16), + downsample_parameters=((2, 4, 1, 1),) * 2, + upsample_parameters=(("test", 4, 1, 1, 0),) * 2, + ) + + def test_downsample_parameter_length_different_4(self): + with self.assertRaises(ValueError): + VQVAE( + spatial_dims=2, + in_channels=1, + out_channels=1, + channels=(16, 16), + num_res_channels=(16, 16), + downsample_parameters=((2, 4, 1),) * 3, + upsample_parameters=((2, 4, 1, 1, 0),) * 2, + ) + + def test_upsample_parameter_length_different_5(self): + with self.assertRaises(ValueError): + VQVAE( + spatial_dims=2, + in_channels=1, + out_channels=1, + channels=(16, 16), + num_res_channels=(16, 16, 16), + downsample_parameters=((2, 4, 1, 1),) * 2, + upsample_parameters=((2, 4, 1, 1, 0, 1),) * 3, + ) + + def test_encode_shape(self): + device = "cuda" if torch.cuda.is_available() else "cpu" + + net = VQVAE(**TEST_LATENT_SHAPE).to(device) + + with eval_mode(net): + latent = net.encode(torch.randn(1, 1, 32, 32).to(device)) + + self.assertEqual(latent.shape, (1, 8, 8, 8)) + + def test_index_quantize_shape(self): + device = "cuda" if torch.cuda.is_available() else "cpu" + + net = VQVAE(**TEST_LATENT_SHAPE).to(device) + + with eval_mode(net): + latent = net.index_quantize(torch.randn(1, 1, 32, 32).to(device)) + + self.assertEqual(latent.shape, (1, 8, 8)) + + def test_decode_shape(self): + device = "cuda" if torch.cuda.is_available() else "cpu" + + net = VQVAE(**TEST_LATENT_SHAPE).to(device) + + with eval_mode(net): + latent = net.decode(torch.randn(1, 8, 8, 8).to(device)) + + self.assertEqual(latent.shape, (1, 1, 32, 32)) + + def test_decode_samples_shape(self): + device = "cuda" if torch.cuda.is_available() else "cpu" + + net = VQVAE(**TEST_LATENT_SHAPE).to(device) + + with eval_mode(net): + latent = net.decode_samples(torch.randint(low=0, high=16, size=(1, 8, 8)).to(device)) + + self.assertEqual(latent.shape, (1, 1, 32, 32)) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_vqvaetransformer_inferer.py b/tests/test_vqvaetransformer_inferer.py new file mode 100644 index 0000000000..36b715f588 --- /dev/null +++ b/tests/test_vqvaetransformer_inferer.py @@ -0,0 +1,295 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest +from unittest import skipUnless + +import torch +from parameterized import parameterized + +from monai.inferers import VQVAETransformerInferer +from monai.networks.nets import VQVAE, DecoderOnlyTransformer +from monai.utils import optional_import +from monai.utils.ordering import Ordering, OrderingType + +einops, has_einops = optional_import("einops") +TEST_CASES = [ + [ + { + "spatial_dims": 2, + "in_channels": 1, + "out_channels": 1, + "channels": (8, 8), + "num_res_channels": (8, 8), + "downsample_parameters": ((2, 4, 1, 1),) * 2, + "upsample_parameters": ((2, 4, 1, 1, 0),) * 2, + "num_res_layers": 1, + "num_embeddings": 16, + "embedding_dim": 8, + }, + { + "num_tokens": 16 + 1, + "max_seq_len": 4, + "attn_layers_dim": 4, + "attn_layers_depth": 2, + "attn_layers_heads": 1, + "with_cross_attention": False, + }, + {"ordering_type": OrderingType.RASTER_SCAN.value, "spatial_dims": 2, "dimensions": (2, 2, 2)}, + (2, 1, 8, 8), + (2, 4, 17), + (2, 2, 2), + ], + [ + { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 1, + "channels": (8, 8), + "num_res_channels": (8, 8), + "downsample_parameters": ((2, 4, 1, 1),) * 2, + "upsample_parameters": ((2, 4, 1, 1, 0),) * 2, + "num_res_layers": 1, + "num_embeddings": 16, + "embedding_dim": 8, + }, + { + "num_tokens": 16 + 1, + "max_seq_len": 8, + "attn_layers_dim": 4, + "attn_layers_depth": 2, + "attn_layers_heads": 1, + "with_cross_attention": False, + }, + {"ordering_type": OrderingType.RASTER_SCAN.value, "spatial_dims": 3, "dimensions": (2, 2, 2, 2)}, + (2, 1, 8, 8, 8), + (2, 8, 17), + (2, 2, 2, 2), + ], +] + + +class TestVQVAETransformerInferer(unittest.TestCase): + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_prediction_shape( + self, stage_1_params, stage_2_params, ordering_params, input_shape, logits_shape, latent_shape + ): + stage_1 = VQVAE(**stage_1_params) + stage_2 = DecoderOnlyTransformer(**stage_2_params) + ordering = Ordering(**ordering_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + stage_1.eval() + stage_2.eval() + + input = torch.randn(input_shape).to(device) + + inferer = VQVAETransformerInferer() + prediction = inferer(inputs=input, vqvae_model=stage_1, transformer_model=stage_2, ordering=ordering) + self.assertEqual(prediction.shape, logits_shape) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_prediction_shape_shorter_sequence( + self, stage_1_params, stage_2_params, ordering_params, input_shape, logits_shape, latent_shape + ): + stage_1 = VQVAE(**stage_1_params) + max_seq_len = 3 + stage_2_params_shorter = dict(stage_2_params) + stage_2_params_shorter["max_seq_len"] = max_seq_len + stage_2 = DecoderOnlyTransformer(**stage_2_params_shorter) + ordering = Ordering(**ordering_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + stage_1.eval() + stage_2.eval() + + input = torch.randn(input_shape).to(device) + + inferer = VQVAETransformerInferer() + prediction = inferer(inputs=input, vqvae_model=stage_1, transformer_model=stage_2, ordering=ordering) + cropped_logits_shape = (logits_shape[0], max_seq_len, logits_shape[2]) + self.assertEqual(prediction.shape, cropped_logits_shape) + + @skipUnless(has_einops, "Requires einops") + def test_sample(self): + + stage_1 = VQVAE( + spatial_dims=2, + in_channels=1, + out_channels=1, + channels=(8, 8), + num_res_channels=(8, 8), + downsample_parameters=((2, 4, 1, 1),) * 2, + upsample_parameters=((2, 4, 1, 1, 0),) * 2, + num_res_layers=1, + num_embeddings=16, + embedding_dim=8, + ) + stage_2 = DecoderOnlyTransformer( + num_tokens=16 + 1, + max_seq_len=4, + attn_layers_dim=4, + attn_layers_depth=2, + attn_layers_heads=1, + with_cross_attention=False, + ) + ordering = Ordering(ordering_type=OrderingType.RASTER_SCAN.value, spatial_dims=2, dimensions=(2, 2, 2)) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + stage_1.eval() + stage_2.eval() + + inferer = VQVAETransformerInferer() + + starting_token = 16 # from stage_1 num_embeddings + + sample = inferer.sample( + latent_spatial_dim=(2, 2), + starting_tokens=starting_token * torch.ones((2, 1), device=device), + vqvae_model=stage_1, + transformer_model=stage_2, + ordering=ordering, + ) + self.assertEqual(sample.shape, (2, 1, 8, 8)) + + @skipUnless(has_einops, "Requires einops") + def test_sample_shorter_sequence(self): + stage_1 = VQVAE( + spatial_dims=2, + in_channels=1, + out_channels=1, + channels=(8, 8), + num_res_channels=(8, 8), + downsample_parameters=((2, 4, 1, 1),) * 2, + upsample_parameters=((2, 4, 1, 1, 0),) * 2, + num_res_layers=1, + num_embeddings=16, + embedding_dim=8, + ) + stage_2 = DecoderOnlyTransformer( + num_tokens=16 + 1, + max_seq_len=2, + attn_layers_dim=4, + attn_layers_depth=2, + attn_layers_heads=1, + with_cross_attention=False, + ) + ordering = Ordering(ordering_type=OrderingType.RASTER_SCAN.value, spatial_dims=2, dimensions=(2, 2, 2)) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + stage_1.eval() + stage_2.eval() + + inferer = VQVAETransformerInferer() + + starting_token = 16 # from stage_1 num_embeddings + + sample = inferer.sample( + latent_spatial_dim=(2, 2), + starting_tokens=starting_token * torch.ones((2, 1), device=device), + vqvae_model=stage_1, + transformer_model=stage_2, + ordering=ordering, + ) + self.assertEqual(sample.shape, (2, 1, 8, 8)) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_get_likelihood( + self, stage_1_params, stage_2_params, ordering_params, input_shape, logits_shape, latent_shape + ): + stage_1 = VQVAE(**stage_1_params) + stage_2 = DecoderOnlyTransformer(**stage_2_params) + ordering = Ordering(**ordering_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + stage_1.eval() + stage_2.eval() + + input = torch.randn(input_shape).to(device) + + inferer = VQVAETransformerInferer() + likelihood = inferer.get_likelihood( + inputs=input, vqvae_model=stage_1, transformer_model=stage_2, ordering=ordering + ) + self.assertEqual(likelihood.shape, latent_shape) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_get_likelihood_shorter_sequence( + self, stage_1_params, stage_2_params, ordering_params, input_shape, logits_shape, latent_shape + ): + stage_1 = VQVAE(**stage_1_params) + max_seq_len = 3 + stage_2_params_shorter = dict(stage_2_params) + stage_2_params_shorter["max_seq_len"] = max_seq_len + stage_2 = DecoderOnlyTransformer(**stage_2_params_shorter) + ordering = Ordering(**ordering_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + stage_1.eval() + stage_2.eval() + + input = torch.randn(input_shape).to(device) + + inferer = VQVAETransformerInferer() + likelihood = inferer.get_likelihood( + inputs=input, vqvae_model=stage_1, transformer_model=stage_2, ordering=ordering + ) + self.assertEqual(likelihood.shape, latent_shape) + + @parameterized.expand(TEST_CASES) + @skipUnless(has_einops, "Requires einops") + def test_get_likelihood_resampling( + self, stage_1_params, stage_2_params, ordering_params, input_shape, logits_shape, latent_shape + ): + stage_1 = VQVAE(**stage_1_params) + stage_2 = DecoderOnlyTransformer(**stage_2_params) + ordering = Ordering(**ordering_params) + + device = "cuda:0" if torch.cuda.is_available() else "cpu" + stage_1.to(device) + stage_2.to(device) + stage_1.eval() + stage_2.eval() + + input = torch.randn(input_shape).to(device) + + inferer = VQVAETransformerInferer() + likelihood = inferer.get_likelihood( + inputs=input, + vqvae_model=stage_1, + transformer_model=stage_2, + ordering=ordering, + resample_latent_likelihoods=True, + resample_interpolation_mode="nearest", + ) + self.assertEqual(likelihood.shape, input_shape) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_warp.py b/tests/test_warp.py index bac595224f..0e5f2466db 100644 --- a/tests/test_warp.py +++ b/tests/test_warp.py @@ -124,7 +124,7 @@ def test_itk_benchmark(self): relative_diff = np.mean( np.divide(monai_result - itk_result, itk_result, out=np.zeros_like(itk_result), where=(itk_result != 0)) ) - self.assertTrue(relative_diff < 0.01) + self.assertLess(relative_diff, 0.01) @parameterized.expand(TEST_CASES, skip_on_empty=True) def test_resample(self, input_param, input_data, expected_val): @@ -217,6 +217,7 @@ def itk_warp(img, ddf): # warp warp_filter.SetDisplacementField(displacement_field) warp_filter.SetInput(itk_img) + warp_filter.Update() warped_img = warp_filter.GetOutput() warped_img = np.asarray(warped_img) diff --git a/tests/testing_data/data_config.json b/tests/testing_data/data_config.json index a570c787ba..8b1d2868b7 100644 --- a/tests/testing_data/data_config.json +++ b/tests/testing_data/data_config.json @@ -138,6 +138,26 @@ "url": "https://github.com/Project-MONAI/MONAI-extra-test-data/releases/download/0.8.1/ssl_pretrained_weights.pth", "hash_type": "sha256", "hash_val": "c3564f40a6a051d3753a6d8fae5cc8eaf21ce8d82a9a3baf80748d15664055e8" + }, + "decoder_only_transformer_monai_generative_weights": { + "url": "https://github.com/Project-MONAI/MONAI-extra-test-data/releases/download/0.8.1/decoder_only_transformer.pth", + "hash_type": "sha256", + "hash_val": "f93de37d64d77cf91f3bde95cdf93d161aee800074c89a92aff9d5699120ec0d" + }, + "diffusion_model_unet_monai_generative_weights": { + "url": "https://github.com/Project-MONAI/MONAI-extra-test-data/releases/download/0.8.1/diffusion_model_unet.pth", + "hash_type": "sha256", + "hash_val": "0d2171b386902f5b4fd3e967b4024f63e353694ca45091b114970019d045beee" + }, + "autoencoderkl_monai_generative_weights": { + "url": "https://github.com/Project-MONAI/MONAI-extra-test-data/releases/download/0.8.1/autoencoderkl.pth", + "hash_type": "sha256", + "hash_val": "6e02c9540c51b16b9ba98b5c0c75d6b84b430afe9a3237df1d67a520f8d34184" + }, + "controlnet_monai_generative_weights": { + "url": "https://github.com/Project-MONAI/MONAI-extra-test-data/releases/download/0.8.1/controlnet.pth", + "hash_type": "sha256", + "hash_val": "cd100d0c69f47569ae5b4b7df653a1cb19f5e02eff1630db3210e2646fb1ab2e" } }, "configs": { diff --git a/tests/testing_data/fl_infer_properties.json b/tests/testing_data/fl_infer_properties.json new file mode 100644 index 0000000000..72e97cd2c6 --- /dev/null +++ b/tests/testing_data/fl_infer_properties.json @@ -0,0 +1,67 @@ +{ + "bundle_root": { + "description": "root path of the bundle.", + "required": true, + "id": "bundle_root" + }, + "device": { + "description": "target device to execute the bundle workflow.", + "required": true, + "id": "device" + }, + "dataset_dir": { + "description": "directory path of the dataset.", + "required": true, + "id": "dataset_dir" + }, + "dataset": { + "description": "PyTorch dataset object for the inference / evaluation logic.", + "required": true, + "id": "dataset" + }, + "evaluator": { + "description": "inference / evaluation workflow engine.", + "required": true, + "id": "evaluator" + }, + "network_def": { + "description": "network module for the inference.", + "required": true, + "id": "network_def" + }, + "inferer": { + "description": "MONAI Inferer object to execute the model computation in inference.", + "required": true, + "id": "inferer" + }, + "dataset_data": { + "description": "data source for the inference / evaluation dataset.", + "required": false, + "id": "dataset::data", + "refer_id": null + }, + "handlers": { + "description": "event-handlers for the inference / evaluation logic.", + "required": false, + "id": "handlers", + "refer_id": "evaluator::val_handlers" + }, + "preprocessing": { + "description": "preprocessing for the input data.", + "required": false, + "id": "preprocessing", + "refer_id": "dataset::transform" + }, + "postprocessing": { + "description": "postprocessing for the model output data.", + "required": false, + "id": "postprocessing", + "refer_id": "evaluator::postprocessing" + }, + "key_metric": { + "description": "the key metric during evaluation.", + "required": false, + "id": "key_metric", + "refer_id": "evaluator::key_val_metric" + } +} diff --git a/tests/testing_data/integration_answers.py b/tests/testing_data/integration_answers.py index c0dd973418..e02b9ae995 100644 --- a/tests/testing_data/integration_answers.py +++ b/tests/testing_data/integration_answers.py @@ -600,6 +600,62 @@ ], } }, + { # test answers for 24.03 + "integration_segmentation_3d": { + "losses": [ + 0.5442982316017151, + 0.4741817444562912, + 0.4535954713821411, + 0.44163046181201937, + 0.4307525992393494, + 0.428487154841423, + ], + "best_metric": 0.9314384460449219, + "infer_metric": 0.9315622448921204, + "output_sums": [ + 0.14268704426414708, + 0.1528672845845743, + 0.1521782248125706, + 0.14028769128068194, + 0.1889830671664784, + 0.16999075690664475, + 0.14736282992708227, + 0.16877952654821815, + 0.15779597155181269, + 0.17987829927082263, + 0.16320253928314676, + 0.16854299322173155, + 0.14497470986956967, + 0.11437140546369519, + 0.1624117412960871, + 0.20156009294443875, + 0.1764654154256958, + 0.0982348259217418, + 0.1942436068604293, + 0.20359421536407518, + 0.19661953116976483, + 0.2088326101468625, + 0.16273043545239807, + 0.1326107887439663, + 0.1489245275752285, + 0.143107476635514, + 0.23189027677929547, + 0.1613818424566088, + 0.14889532196775188, + 0.10332622984492143, + 0.11940054688302351, + 0.13040496302762658, + 0.11472123087193181, + 0.15307044007394474, + 0.16371989575844717, + 0.1942898223272055, + 0.2230120930471398, + 0.1814679187634795, + 0.19069496508164732, + 0.07537197031940022, + ], + } + }, ] diff --git a/tests/testing_data/ultrasound_confidence_map/femur_input.png b/tests/testing_data/ultrasound_confidence_map/femur_input.png new file mode 100644 index 0000000000000000000000000000000000000000..0343e58720d7bf2dd741d273111170f75de8ed34 GIT binary patch literal 125674 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%0AID%iysadggH_yvv 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%0DNOa$ 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

j3{}mDpfv6 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%0A@uuFhTcLm7g`+@wr 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ʬ%UXh7cH+bZEc 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

{j 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®M)iE3hVtH}0 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 literal 0 HcmV?d00001 diff --git a/tests/testing_data/ultrasound_confidence_map/neck_input.png b/tests/testing_data/ultrasound_confidence_map/neck_input.png new file mode 100644 index 0000000000000000000000000000000000000000..74a64a9d90402a11b82073ec824a828a854d8876 GIT binary patch literal 100996 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
U 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 z

i{P6&A!K#n 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

GTj%|6U$no^^qtPSF^8{Z>xx5_xw0&xF&F~ zxle^FzE-$Ew%PgC44rb!5MOA9*>2|O+tD1SH7)SDrv>U>TR_Lw5}O=2o3W>^n78NE z)KHLX-tpFmI@LeL)ULiV$M!SqTRP0_7iwIMsc}s^P2KGX6AV9Zg8L0jsjV~NF2V#I z7MNh}TocaexmV&@wEIRw{KxtGZ?z%%=NYgE*8qj@3^3t=0Yc7`Z338i_Cp^T8})E7 zy;|xms*{gb|BCsmzhY&fz`b21(l+zA+-&n(W<-?Bdfz|Nd6@>Laz^0OMGxr=x` z?aee(474W4j8UL)`(GJYtia9ZJbUlg!?1KcI0Y#&IaUcjvdslvDzZ(>KlG*W`Qy3v z|MEO8x`C8x({$**-;qEEhw`j91^`+k-6#`KG%~v5bHBOIG<5$$rlw@#hs7R3zO(izMNAkyK?A$^7VInW8F| zixDOAxI>9F8&D#x7L|zEp%R&Rfj{dXB~qqWDvj()qbEPDIsgy73Kl1O@DtUUdN@kK(4zJZ>x2+bk{?no_S{u1tIOplDja`GNUn$l` z#cj@f$Ps-_w4hz0iP>eEu&yPSG}FRRzO5Z+LRFU3xl~i5!+DNYr8fJ`xFb^Npf+C{ zfg3c~39i8&t~%MGStSH}!7<)b0K7#hLA!U!kS zM%mx_U`?O2HCB*s{6eXVOKXHWl@0D(wt?qKTO4dcZ(~0PbkKFg+41aI@8X1idN^TI zGbhYbI$?^I6I$pxVK&(Zob4Q2!g&t$$h$bp>3qhCIpWM5=Nu>W5jjXhh2Urvb7WO0 zk5nUXlMCwce7ZTFth3e?U#T-tvP13ygMtT+cR@s*8os=1r=}q= ztRDhnvQF3+X6LjI#$7%J@7)uG9@J|5q5s2(TAM_24hNLTbF-+juzlO`NZ|agXG=mOMi?nYo9W;zV|9o{YjK6I26HCFomfF@_KXM66Ydd( zD>m$EFpR>dYI4g@W-Wi>Z02DkT3?7nB)wCY*3kz(oB72fBJsRSB=mwJaYDsin-ROI z%GpDa&P>;P5qN);yQvKkJUd6=M{nl&1xBDgvkrSyh2!Z5c1@l8Unhg@sBi>?Q+sV2 zj-}QFAu}k?(~M!7vAk2dp1soqK0|?F|MKL!=LZ13-s5JZ^Ak;!F5`zBROD=iMj>m(+?0^c!Ozx#lQd7Eo3AM%DgOJ8u ziRgFoM&Qc+|N`>RI z_`Psv_Nu}KsY~2&CD;Rc^Z0S~z4-g{!i=z{*u^TH&I6Qz^Qm?7O*#iVC*)`Ufdi~L%_`rRnXHqDJ z7=__`r!eNAhT#b{UG;WFpo)KcD-V#r{i4tznw&#^cjtNHZe}Qg()f8EGRF1@AA&Bi zYck6YA%^rqU0~-m`Nrmp8GOh$N>_8l#G1pAnv$SB%&w`jKrr`BmuxICoP5)Od{e+# zjTdJ(Z9ZARNW%il3eAyzpZ@5R=Ez`HZ)l=9?{ns;qF>s&wF%M(n&6%uXDKkjmuE`o z+%&@IX+|h;GD7Q@)C{jTL?(ArEw~>zagn*L-3^%2t&f90^>8?e8U*k9m~T}dQ4guh zonI}dn$(Hk*g9#vtVEhdm&lOUMKW%7kxV>VBq39ZB(YPWZ1c;JzB98WAu&t-L}rP` zpIW(T_E#=KfeTu-^27hH6!Lkk%QFpJJEx72wt8s!P7h<6ac0vq;c03%Z#ODpa9mp3Q)+pekseuP-P5LD@ z5#2`%Ti8UFT$ROVgBj5b^sf8Nyjb)WK{wvppW~ny5bLP`G zm7ek}E%fW8f#e;3#U`a(u3pQN1%oO?vs<-zBq%WakOJS1aZhzZ!RKuSTAf#L&i_BY zN&cyT7WrmLi2@!K3RLp@x^1I@xotgC*9xiB;p`&c=(V;+6Lx!=t)w3Blr7%7*kM{nJ8b>W4lg|%kTA0` zZZ~m4wYC#7^qgR2Z!^_&%Km&;~?A` z9E4qZ^jCQWL*p!U$Cb=sc@7j6&_`txhI_-pkd+(;zb4`6_$nOz%&AdfF3jP#>^P{2 z#As8p1$R_Nf!rH)GH;{!@&nFo`tt2MN69nPCZF3Kg(UJ(*?MYkmh*NVcUfeo%u)2F58zI$3*Rq- zdY)E%Usv{GSu@{HFN#_xdQ`q~|MZ@{Klj)RdX{?P1ZEYlrrvmFB#MSc;%vuAWcV@H z*pa&_{Yb?BCex%a-{uy3H4jDL*J}1?PGbH|cj_ftL}0E3=R2k3o7dr3c_JLD72$9k z8jkEB_D5SV&$y6Y@Q0k=> z+|`l!en!kN{=%M(!-5^u-ZazW9OpK5Rn%C72ZZ3+?_d;NWiL2)h)+U-VUQn$-505C zjR|5lRuB$R3p?UaAX<$M#Co+qu6*%B`}eKTFs>!N3N7%rjW22sHph+N=IlRhj^k~8 zv2lto3Y+`FVR2K8WOw4+pB@-+lWcR>6L0Q&q9NH~9-r@1>v>^h4{GQ&n!t}5oCXOV zxSHXPf-_{2{jRvo%Y7q#Q7c`sGsYFsBV6hCRHLhz8dvgFcpjz3m&a;CV#egpHw&$(hIH8=ywF6%ShutCF}9oFs?V7nuF9%n6M-07`yNA^!Q zoasf4PK_(~(yrJw+m+rLvQDHM%=xw%5$=ee=>h%y9&p^j8IHCGdaYKW&Pau4dc0rG zRl&GY1?%bTb>xn$m4zD~G2?S@lm~PkdB9%B3&WZHqs>0Re*2r@2|Jo6D4S#L17E~7 zXvzC4b=WWH4{&RR`;+{TUe6!>{|f7 zv5Ui=J4y>5)hDUttdwt6sZ--hid&>e2(@xPqLdJkok6#cbQ`*87GBo6QOT{7rDmhbJmz= zae8j4*Zk!QF`267;&RGDJeT0qmj-n7d_w)l2m;&RQQSd3tEktv&`c zWtMA|E}Gw}mSml3342r{9Y!xrmK^&c(W-c@Zus3G%(S@yjeU`Kcb#>X@yJ* zDHl(@a(S9y0PhioaBE|P@l%+O%N)6v{D0^)%##g6vL(mvvNUOUQf>sCkTzrYNX5AX z3Ei+;#u@Tj9WO1s;^l94oIJS|C*Lo{$?l(7GTk6kl6t>~KkKt>AN*PFy~>bB zAJgTvc9w)1lbL2_$(A`;a&1wTd~5wfHa*D^t!p{5gM5>ABvl?AN|lB)QpHX;Ri107 zO8>eP8DEhieachBu`ESa74qc|De|vXsuXoe6{Aky_zWI5AbDXP1ZM>=e-lE>$&#B{V4HcZz-@i;Ab4t%>`$G%=TaQ=fbjPu-8tS1pv8QL|H~jX}I# zmS|%>uMyw1nZ>A$X52MttyZAL&cCuFsaygs=gIMXRieFHfk_7y%;!>|oYz(IO%w8s z8~Nt=Z3TPn`MLtW%y8QFzZL9$BkPnYu&j@099)<)$6ZA_@Yi5vPPM!4Sue-K{IAuS-aZdYn!Cgr!RL_MZByx(r132nSeK)kn@nU zpD#|>VxmGXM-?2Fs4z8Kh5pOb=(vR4x{X}nYE8YRo(uaEIivrpM&ArIbJeyu%-fXFVAkrrXu}2{YVaI}T@e#EcpZ>=|&%|qmIvw zeY*zX3FiT4OoQ=idkAjl2o|gWb-wKHyusX-+E9$k35DZHo;&Zcb5qIZ{eBThcoKnH z?x@1`dFFKBPRN&%TShF|-xiu*1L>NV?;o5~{5lJljMNQ6><^ENWZpOX!l$uka}Z}X|3u<- z3$l-WBwTgb?Oa4Z_>=N(9*^M`MRVM7yEToS385t)r90L}G z!>2#9i(7_clQJ9*d0|i|h2he+FuWd5)(Hq>Ry6xj`7`{wjr*w?q3Fb&g)TFt!`S0K zZ7FkaI2v^PN?-96_DxZHlQo(@dmX{NQ}oJpXPyy#`yZ&iNjVw}HTQ{%AnqBnxtrP% z1W#9T>GwdqzRE89m_TaM0KWyar1@Ob07Tc#ZI+V9&qN~ zrw`{E^Ct7(i#%Xi?uNu9?u9r5@ww)SLuWma7UPK#$2_s`4|g}Msd>rqf<=NS_3`f5 z@Yoe;iLMyMxlP?xSKJ|^_;5aXkvTWrMsw#x@AuEGDqMfBLi=WFoG(#9BTo$@{{3e) zalxb&E_ed!bf&qYlplMDd=t#9oG9jOynN?|w-s*e!*<8<;qI6)-W}7Z#W~%;o&Cpd z_~q$_l#iVCT%hN?rz>vq-$qT{(EbzWFfHBbnec$!P7gfZ;(7OXG8ObWN2;6YibKT(8kgMhf%`Ta4bE@8n_%mdrU+iz40r6jF}R)&X1`+x z`9WXyoV9=(yCL2&^P$}sdLK3Y5y5=UE0zJc-#-X%`8%n+Nw4+@W{&%Wz=4d~zm%EA zvw>CQo1o5|-1pkI~g6Y3ARN+nwb|=qv zz*1KS%w~Sc**WYa{$ch1yiRkESzsw=HHyycYWix1c-!zBIU<;IzZ*)p5aFLqh zX-&*!Hg z&07Oww4-)6wA=`jw;N$9Sz${@BUI5#b0EqP2fuP&(?=g4#^_;hm>w2V7vs5!Gy4wp z;Y1H}vjSbbeNSDdR+ac3uau4hD`n85-}3EDkzC-eI-OMc zt4NjR9HTRz|NC>NG*Sya#&T}cvrZJo zb+Vv)tt{ADD?{RIMaR2N78z-xFZrek`Nn04CJIN>vouZSKYU9wrWDe^yg{X6fo4V&Fg@d>0F$lLt^egIdzBj^!EFSBLyPX4Yyf3|}Qq-G$PxWg&=_Q8-qM{6RqIuJh;E&RZQLK3tsjMse@b*1P`9~9|i=WgB5c- z6wE5y5r}o{g~+)dh{Rbz5bizZQq!}H^L339c2%tgrgjX4@3~Oyq=qEYA`E5^!ttVx zS*+BgEG6G4a+n{(9aTThO&pri{}E1IFLy?>hI4K+g*&PR)YPmb(`@E!WheQCd#Wlj z&OOd?#vUh!kY`qNUek!zdA>Z5Y||)_J16d?QsT)!HAt5-O>Hw(vY-EeHkWETI$FuYj9=dK}PNNpMhpEBx-uZQyf5{ixC)NI#h zzh*kn{~+i`q(;L5=s=!abWu>SRxp};(=CKKi~B-Q=NH0kQO@CRFzazgFr0gmZLNc` z`3N<|WYXihL7XiFV(~WSwea`obU6SCI{tXK#}7N!vD@HIOWdKhtEvez_%``4|=nuK2ZwOtYPPDKbi*`K}l@-4(ORH<3eJ;m7$*Mn7kCZR`#4jVpS$;k+o+6^(CEoBYfLo?P;Mi*Vza(H*u99!R%i-u+i6#2z0_itHKbQ;b?Te|(7Pyi`ztwkkrVnGcg~A`Vj<73>KC8Kx0#G?15O=vR{K4PT6wXi$ zmN8#*lzWo~r<`DTA7cCB*8w=$SoHf?rr4v0Vy=YrkYxw~y0^Ub$gBlW5k zMl`X)d<*W`|5zezqvikW#?G8b-w0Y@c3~E01DFd0)%e<18 z%z1fs)(qRdO)yo{1cB#y4ou))e<3{@gN$L&mizt|#`srl%zP&1h}AR3=@NRE=&PRL zVvO7=+~xG*`+ZcR>t!Xrwo$TM&xmt*BjkD;(aT|onks!v*rty*`g&+Ot6D7csw8$+ zm2~y0k_FUTuH$YhH%}LBQvb;1fIm_jSs@P=m5Xv=nT&KPmZqvA=|8JbKAz8)k(a^@BJS9IIUPzelM=2SYA}{80J`$TE=gQv8-G!&+NBz^X>gY*X z>9Sw!Uha_#ianBx-EvrCwYP2WLrLKhA!*Yujs+A*bJ^ z%B8WK<&bXzHBx1LO^W1_XZ&BK$b+XTvW{2Z*PP#|QsrUSRC(L#n*<*JAuBHBOM2TP zImCV5mwD9MBo>J`=QiUww+VPrB+DQDl4W_nB)(p;BpcFWu2(G8M)~4*@2525b=Idq zdJQU)J7<5(9Pe^@*t%RMwkenKZOg@GcDa0-^+%@ds**cjHL;w#tE%a>;(4G}j1Sk! z(e`!Hg|nJRUbWOt*Gk2#TA6i>Gn{A*6m_J|g?g7`cH9>>*1%FX4d~O)y*!J&!g)%c zYVMcFH%-VkUwP%%Xds$g^O2gH{AZe2=9MY?>V1_dGrr1AbI#Ugc1FY*|`~_VsxS9C2r%BT`p6Qsc?o<041+mOG-yA4g2$ z4Cj|VcT%=a_|l&G8*)y^!%o}}IN|dr>W+UgLy&yau&E0FbyUG=k_z8fs?h0`3NA$| z7*wn9(pZfkPiijPtKmO}OcSF<+x2Q}KcGg%Wi^gc7tpAa3p8R~U|F9U zbPEc?u^vItXcUCQnn5Ti45Vh1&x;{}7`ZGEr+EJCNk7g@>U6fxqi#7}(4k6@@`jl> zYQW`8C_;4T4Z0tWh5Fo24Wm!ofO)^~s4?a)DA$x-Q*O-QBWv90%+Acg%p0D-InEsV zy_Zrm!~N2$ZS+8qS=`7j|HnAT4zqKUJd?|7DKDQRWEIYBZg7vaKY_j~^3YArZmQQt zVbC(_E$4A|KaIT%W7z93h}{k3D5ti}(+T>&K4yMx2XSQ1;e`;;9z(rtg5GyMg6{fftRL<)0~Irq{nw7JrB9xK}g`qSq)85my44?;A)hQ~-J%2teU0Kg>#Qg|6dTA?HR* zSiWt6^PJy|Ywd$zFAwDGbw?8QETw(jajwJ-$+z6lBi;@3V%^|6*$tyP!&ztIiQYXu zsZI98(Vd>yPao4DLr+|$&Ub>H8;&uHxQ4TvdAnWV!ud@RcT?^QT&W#$#Q^fna`Mfh zNNUZRI%AoSGtLZl#=mc!QMr>E{CqX8?pMR|G`&^l)cksCoJvun;deDozvagaBHw5= zLge;_*ph0EW);@xf1?pbe6&H|Aoc+~wMG5wc8F~6fM#zRotehyH%dHTJ`gQ`8#U(D!&S z03q!IF(oY!xd%8KHU6LGc=Hu9YCCq{o)g6GWIlji7~-SC@GU$HPEF{kGG(_Ev& zrs&ns6lWBs%rWOV&$R)rv}=HDX4EVUF=56r^(UX{&3I$XE;wU$%aLuUV+?O@%uFA? zjd`yptCcvFr$iF-#U7d%BZq!f$@?xk^~KRid_to~hMF$YVa)0zU)9r0L^I zL5&o&t&u1S$P_QDQ6WZt0xkM{sy0tm|G_${q+TzclUxcYH>sc z-8>|An-9s~`}^g=p#ActXpi*Rvs*$k?(ynf&^n15U0$1#k z$4__4Rr1Y3@{Q_mhA7E4&#JkXN>7*c+;k}&m@ev^G->cXP2L-1i8J|T2Kh#he6yQ; zQ$@a+NWSqP-|U~6Dqdq!Mg4E83?G&%8+}uyta++&yAg;-B)Ie4|61O(6NElzd~ktVntvD-!c7MbhkLkr+SuC4X{%NmA)AiKC9G(llRm zJAap+b~%#hkRv}GbL3%EzC^V8B>^4F#VDvkaG+Ack5tN;Q`8d&RLPX1ns{})Sf*0z z9Fm_S=c@{&>Fh!o^{7ZDQQz#7_(wdN)=C=r=G&24*&42a)~*_OZJ~kFe-*I%slffO z3S8mb#w1h0-e(2YRVr|ve3PzrwM+=Ek>=OxS4kWJ%l+kUvVyTf?n&xj(pRQeA9+}^N4(7+}8*`cetObFv34x)Q0s|;`Kr$ zIvrDD3h#Tnd0!mWjQSh$%|@O@e3?_+YzIAlHyWV#5i^`4-?XLvru?x5WilWpQIhH=!*?f#&t;WKw)MQ?u-uST^Gb+_MzQKk1 z5f}7o<%-Zr%(17x^}Kr^Gv?UANe!th=Q+Rob05)-I>+9Du=*T`Lp6b@M}A3m2|^A% zHIu2cIn^`>eYuZnN1n;b4n#!-XEp`AQuw|mf#_q*&)J8wp-^VD#s(q%M-UuFhG5uQ zX6L?Tz8rhWSu+f+;lPtWp*VRa97m1lEgHl8-%XLQd`^8XSt5%*kd@9+xaQCOQTr%F z_9xGfL&kI761j+aIJ+_A$Ie^K9TZvV=VZ=lM$$(43<@LB zHk~?~r;*UQ8i~b;?3>y`FBQGvJH}C4+&dDZ!l@tfBA;1M+gTR@|F04FhgyjF^oHN2 zzNl_4{osSCzX@j#l@qh|H6vjDIUEPBha+oyIDSuNFGG7~A3Brys@NC)ifnU;UbETs zgi}B9+d2$uvP04MFuOFzvTxBhlzma5*zyvXz|QcPfj~>{rxv6M)*okX$}&OAUVJfKSWZe7KWZyURfd}|ww>SA_ zQ!6MOS~2&tC6b@FfWNCRwv>CrR^@>&rq4bg0gHFK`4*?-pv
4n!PPtci3V9_sMOo9H9HSF}v5eBTlo$=1q3U zZ)J~RN%n9Y?toU=4zSwO7{^;VGHcTbr+PVK*eMk{&*KbrmkWE0Tv2G{hO^vxJ>>l6 z7X4PA>5HEp*950VG)1DS89g7((E1a5c3%5n{;lTlWCxw@QF`dF-fa%6yzl!HD7SQlGm13E%wjs>&0yO>I&4 z#0CqySR;!%!H?stI7?=?WhHa>ODyr}wI%wIZ{|IqS1R{^`Wc@m7C5=v0y)&tjGAwX zXB|w@-i28)*7O2t(?eZgg1u=b2smN_hn~E3GQlPC%}Mf2SMp6C^34rCcIGoj>@?4b zpRA4P_cTUGu@ZYZA5XiZg!VpO)B^l>SBYtplxR|C1Z(qiH6LaOIUXEO8@L3-9NRtWYpUAkePozk3UmjZA zlb;2*B>(*tnRNHE6s24gk2V)%)x7ia@bg(2e)o)wxqMod7oU>NKBpvU=Lvb#`GQI1;&b=cdWPt@HRMBK6Q*0zvP`V z=GRV%i`gmNax-Nfxn{<~bZH-#E+^yDlO4P=sAINmoG+fE^5yXKd{NTB6}tR?IXv!{3dE!N zFX=|MIsZCGJT1SYJWupf;>uzrG{`qy==IZ?V2o%J6HH-Vu`_!;2HiG=A+s%=V;aDU*?v~k;?%^j z(<6bo+w?omW0pf(=KVcyXMuUOR`l9iLv@P2arZ{B*lr8;31(#du*FF7O;(U23VJ!> z+(btlS-^c1XE^)suz&rLBTBie^5NrlUp>yd$v2amIAKu;HOL*E;5Ud~^2tt^%AHlK z%T9={klFeyVdpDAf;!lOOW{`!O5vcrXsL)B0dE;84uG`OV?bHXCt6X~TL!R+F`)Y)|Aek+{453Q(a zc4PicBYLe2$V}CdNchQ~sT5}0JdVV+OOdcR$Zl}*Sl{{djq`i&*fSEJ5y@WCNZ6W1 z^88A!`4WNI+_`N!9f31jBXBQ<`>6gAm?-R=vZuzlmcH=Ra40T^Lx(?y_v6B`HHteb zJ8ExAxsQ4rhW@+55HUFnDPimnrvbakmC|^n|?(TfrSGyWpLf z>vw~m@Ll{FPZ#R&LYPAmjA^ONRY_(y$G%`Zm`bh*55`w>>Tm9oZz9;?aW@c676u}a zʪ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%0DXW$zNWk#7{pH!Vg>Fw|rT5_wy;=~8sxz6@SR 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∾kpM*BH%+$ts?x!pwwAm%9jaAN*@MO{?xJv7y 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

l3Lq@t&1JGnb+Z-5 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π$$9IzU&Rrzvxtm_-B~kSBJrw2wo;mKP|K9B< z*qKfK3OV$rJcoAb^UThjTvFBL`Q)>CbcFA-CPp8i{QCz;P&%I^ZSuMAJfAjS%BReh ze5&uxC-L9;)HeDx8~yMVle2lnjxKx2B6qxE=iat5^XIK>Sz{~9ebma1erRQ`0qrdH zNe9#R>tq@GJJ`expIF%N7gm_Hkl$hK!AWl&2>9{76-URKyxVbp2W|f8z-L2RQ58Aq-w9Zvy8-Tj2!nR5n-bgyE%0Ae);E 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%0DrC8@hhYC|5!dU8_aQy<9%4wvIwqvlcYt{R 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

r~pPSGF4f|{-({qF0)A#Au$Zw;V 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%0DBXo` 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