libcom 0.1.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- libcom/__init__.py +23 -0
- libcom/color_transfer/__init__.py +3 -0
- libcom/color_transfer/reinhard.py +57 -0
- libcom/fopa_heat_map/__init__.py +4 -0
- libcom/fopa_heat_map/fopa_heat_map.py +212 -0
- libcom/fopa_heat_map/source/__init__.py +0 -0
- libcom/fopa_heat_map/source/backbone/ResNet.py +229 -0
- libcom/fopa_heat_map/source/backbone/__init__.py +0 -0
- libcom/fopa_heat_map/source/data/OBdataset.py +292 -0
- libcom/fopa_heat_map/source/data/__init__.py +0 -0
- libcom/fopa_heat_map/source/data/all_transforms.py +25 -0
- libcom/fopa_heat_map/source/network/BaseBlocks.py +26 -0
- libcom/fopa_heat_map/source/network/DynamicModules.py +43 -0
- libcom/fopa_heat_map/source/network/ObPlaNet_simple.py +112 -0
- libcom/fopa_heat_map/source/network/__init__.py +1 -0
- libcom/fopa_heat_map/source/network/tensor_ops.py +37 -0
- libcom/fopa_heat_map/source/prepare_multi_fg_scales.py +85 -0
- libcom/fos_score/__init__.py +4 -0
- libcom/fos_score/fos_score_prediction.py +218 -0
- libcom/fos_score/source/__init__.py +0 -0
- libcom/fos_score/source/config/__init__.py +1 -0
- libcom/fos_score/source/config/config.py +68 -0
- libcom/fos_score/source/config/config.sfosd.yaml +43 -0
- libcom/fos_score/source/config/config_rfosd.yaml +43 -0
- libcom/fos_score/source/loss_function.py +118 -0
- libcom/fos_score/source/networks.py +355 -0
- libcom/harmony_score/__init__.py +3 -0
- libcom/harmony_score/harmony_score_prediction.py +119 -0
- libcom/harmony_score/source/__init__.py +0 -0
- libcom/harmony_score/source/bargainnet.py +226 -0
- libcom/image_harmonization/__init__.py +4 -0
- libcom/image_harmonization/image_harmonization.py +193 -0
- libcom/image_harmonization/source/__init__.py +0 -0
- libcom/image_harmonization/source/functions.py +747 -0
- libcom/image_harmonization/source/pct_net.py +85 -0
- libcom/image_harmonization/source/src/__init__.py +0 -0
- libcom/image_harmonization/source/src/lbm/__init__.py +0 -0
- libcom/image_harmonization/source/src/lbm/config.py +141 -0
- libcom/image_harmonization/source/src/lbm/data/__init__.py +62 -0
- libcom/image_harmonization/source/src/lbm/data/datasets/__init__.py +9 -0
- libcom/image_harmonization/source/src/lbm/data/datasets/collation_fn.py +41 -0
- libcom/image_harmonization/source/src/lbm/data/datasets/dataset.py +243 -0
- libcom/image_harmonization/source/src/lbm/data/datasets/datasets_config.py +42 -0
- libcom/image_harmonization/source/src/lbm/data/filters/__init__.py +12 -0
- libcom/image_harmonization/source/src/lbm/data/filters/base.py +21 -0
- libcom/image_harmonization/source/src/lbm/data/filters/filter_wrapper.py +36 -0
- libcom/image_harmonization/source/src/lbm/data/filters/filters.py +33 -0
- libcom/image_harmonization/source/src/lbm/data/filters/filters_config.py +32 -0
- libcom/image_harmonization/source/src/lbm/data/mappers/__init__.py +19 -0
- libcom/image_harmonization/source/src/lbm/data/mappers/base.py +26 -0
- libcom/image_harmonization/source/src/lbm/data/mappers/mappers.py +135 -0
- libcom/image_harmonization/source/src/lbm/data/mappers/mappers_config.py +109 -0
- libcom/image_harmonization/source/src/lbm/data/mappers/mappers_wrapper.py +31 -0
- libcom/image_harmonization/source/src/lbm/inference/__init__.py +4 -0
- libcom/image_harmonization/source/src/lbm/inference/inference.py +70 -0
- libcom/image_harmonization/source/src/lbm/inference/utils.py +222 -0
- libcom/image_harmonization/source/src/lbm/models/__init__.py +0 -0
- libcom/image_harmonization/source/src/lbm/models/base/__init__.py +4 -0
- libcom/image_harmonization/source/src/lbm/models/base/base_model.py +66 -0
- libcom/image_harmonization/source/src/lbm/models/base/model_config.py +8 -0
- libcom/image_harmonization/source/src/lbm/models/embedders/__init__.py +4 -0
- libcom/image_harmonization/source/src/lbm/models/embedders/base/__init__.py +4 -0
- libcom/image_harmonization/source/src/lbm/models/embedders/base/base_conditioner.py +60 -0
- libcom/image_harmonization/source/src/lbm/models/embedders/base/base_conditioner_config.py +27 -0
- libcom/image_harmonization/source/src/lbm/models/embedders/conditioners_wrapper.py +114 -0
- libcom/image_harmonization/source/src/lbm/models/embedders/latents_concat/__init__.py +4 -0
- libcom/image_harmonization/source/src/lbm/models/embedders/latents_concat/latents_concat_embedder_config.py +31 -0
- libcom/image_harmonization/source/src/lbm/models/embedders/latents_concat/latents_concat_embedder_model.py +80 -0
- libcom/image_harmonization/source/src/lbm/models/lbm/__init__.py +4 -0
- libcom/image_harmonization/source/src/lbm/models/lbm/lbm_config.py +101 -0
- libcom/image_harmonization/source/src/lbm/models/lbm/lbm_model.py +359 -0
- libcom/image_harmonization/source/src/lbm/models/unets/__init__.py +14 -0
- libcom/image_harmonization/source/src/lbm/models/unets/unet.py +148 -0
- libcom/image_harmonization/source/src/lbm/models/utils.py +377 -0
- libcom/image_harmonization/source/src/lbm/models/vae/__init__.py +4 -0
- libcom/image_harmonization/source/src/lbm/models/vae/autoencoderKL.py +136 -0
- libcom/image_harmonization/source/src/lbm/models/vae/autoencoderKL_config.py +27 -0
- libcom/image_harmonization/source/src/lbm/trainer/__init__.py +85 -0
- libcom/image_harmonization/source/src/lbm/trainer/loggers.py +324 -0
- libcom/image_harmonization/source/src/lbm/trainer/trainer.py +199 -0
- libcom/image_harmonization/source/src/lbm/trainer/training_config.py +82 -0
- libcom/image_harmonization/source/src/lbm/trainer/utils.py +193 -0
- libcom/inharmonious_region_localization/__init__.py +4 -0
- libcom/inharmonious_region_localization/inharmonious_region_localization.py +97 -0
- libcom/inharmonious_region_localization/source/__init__.py +0 -0
- libcom/inharmonious_region_localization/source/blocks.py +368 -0
- libcom/inharmonious_region_localization/source/functions.py +679 -0
- libcom/inharmonious_region_localization/source/madis_net.py +79 -0
- libcom/kontext_blending_harmonization/__init__.py +3 -0
- libcom/kontext_blending_harmonization/kontext_blending_harmonization.py +148 -0
- libcom/kontext_blending_harmonization/source/__init__.py +0 -0
- libcom/kontext_blending_harmonization/source/pipeline.py +1135 -0
- libcom/naive_composition/__init__.py +3 -0
- libcom/naive_composition/generate_composite_image.py +116 -0
- libcom/opa_score/__init__.py +3 -0
- libcom/opa_score/opa_score_prediction.py +101 -0
- libcom/opa_score/source/__init__.py +3 -0
- libcom/opa_score/source/object_place_net.py +55 -0
- libcom/opa_score/source/oblect_place_config.py +66 -0
- libcom/opa_score/source/resnet_4ch.py +213 -0
- libcom/os_insert/__init__.py +3 -0
- libcom/os_insert/diffusers_osinsert/__init__.py +78 -0
- libcom/os_insert/diffusers_osinsert/_patched_pipeline_flux_fill.py +878 -0
- libcom/os_insert/os_insert.py +534 -0
- libcom/os_insert/source/__init__.py +1 -0
- libcom/os_insert/source/ia_utils.py +183 -0
- libcom/os_insert/source/insertanything_infer.py +529 -0
- libcom/os_insert/source/ldm/__init__.py +0 -0
- libcom/os_insert/source/ldm/data/__init__.py +0 -0
- libcom/os_insert/source/ldm/data/base.py +23 -0
- libcom/os_insert/source/ldm/data/datamodule.py +128 -0
- libcom/os_insert/source/ldm/data/imagenet.py +394 -0
- libcom/os_insert/source/ldm/data/lsun.py +92 -0
- libcom/os_insert/source/ldm/data/open_images.py +728 -0
- libcom/os_insert/source/ldm/lr_scheduler.py +98 -0
- libcom/os_insert/source/ldm/models/__init__.py +0 -0
- libcom/os_insert/source/ldm/models/autoencoder.py +443 -0
- libcom/os_insert/source/ldm/models/diffusion/__init__.py +0 -0
- libcom/os_insert/source/ldm/models/diffusion/classifier.py +267 -0
- libcom/os_insert/source/ldm/models/diffusion/ddim.py +263 -0
- libcom/os_insert/source/ldm/models/diffusion/ddpm.py +1417 -0
- libcom/os_insert/source/ldm/models/diffusion/plms.py +252 -0
- libcom/os_insert/source/ldm/modules/__init__.py +0 -0
- libcom/os_insert/source/ldm/modules/attention.py +261 -0
- libcom/os_insert/source/ldm/modules/diffusionmodules/__init__.py +0 -0
- libcom/os_insert/source/ldm/modules/diffusionmodules/model.py +835 -0
- libcom/os_insert/source/ldm/modules/diffusionmodules/openaimodel.py +1108 -0
- libcom/os_insert/source/ldm/modules/diffusionmodules/util.py +267 -0
- libcom/os_insert/source/ldm/modules/distributions/__init__.py +0 -0
- libcom/os_insert/source/ldm/modules/distributions/distributions.py +92 -0
- libcom/os_insert/source/ldm/modules/ema.py +76 -0
- libcom/os_insert/source/ldm/modules/encoders/__init__.py +0 -0
- libcom/os_insert/source/ldm/modules/encoders/modules.py +190 -0
- libcom/os_insert/source/ldm/modules/encoders/xf.py +130 -0
- libcom/os_insert/source/ldm/modules/losses/__init__.py +1 -0
- libcom/os_insert/source/ldm/modules/losses/contperceptual.py +111 -0
- libcom/os_insert/source/ldm/modules/losses/vqperceptual.py +167 -0
- libcom/os_insert/source/ldm/modules/x_transformer.py +641 -0
- libcom/os_insert/source/ldm/util.py +203 -0
- libcom/os_insert/source/objectstitch_data.py +66 -0
- libcom/os_insert/source/objectstitch_infer.py +618 -0
- libcom/os_insert/source/sam_on_objectstitch.py +253 -0
- libcom/os_insert/source/utils.py +41 -0
- libcom/os_insert/source/v1.yaml +108 -0
- libcom/painterly_image_harmonization/__init__.py +4 -0
- libcom/painterly_image_harmonization/painterly_image_harmonization.py +215 -0
- libcom/painterly_image_harmonization/source/PHDNet/__init__.py +0 -0
- libcom/painterly_image_harmonization/source/PHDNet/networks.py +202 -0
- libcom/painterly_image_harmonization/source/PHDNet/phdnet.py +47 -0
- libcom/painterly_image_harmonization/source/PHDNet/phdnet_config.py +18 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/__init__.py +0 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/__init__.py +0 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/inference_base.py +300 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/lr_scheduler.py +98 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/__init__.py +0 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/autoencoder.py +211 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/diffusion/__init__.py +3 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/diffusion/ddim.py +336 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/diffusion/ddpm.py +1400 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/diffusion/dpm_solver/__init__.py +1 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/diffusion/dpm_solver/dpm_solver.py +1217 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/diffusion/dpm_solver/sampler.py +87 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/diffusion/plms.py +243 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/diffusion/scheduling_pndm.py +518 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/__init__.py +0 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/attention.py +378 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/diffusionmodules/__init__.py +0 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/diffusionmodules/model.py +857 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/diffusionmodules/openaimodel.py +823 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/diffusionmodules/util.py +270 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/distributions/__init__.py +0 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/distributions/distributions.py +92 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/ema.py +80 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/encoders/__init__.py +0 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/encoders/adapter.py +213 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/encoders/modules.py +82 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/__init__.py +1 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/api.py +269 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/__init__.py +0 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/api.py +175 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/midas/__init__.py +0 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/midas/base_model.py +16 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/midas/blocks.py +342 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/midas/dpt_depth.py +109 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/midas/midas_net.py +76 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/midas/midas_net_custom.py +128 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/midas/transforms.py +234 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/midas/vit.py +491 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/utils.py +189 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/model_edge.py +653 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/openpose/__init__.py +0 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/openpose/api.py +35 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/openpose/body.py +209 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/openpose/hand.py +75 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/openpose/model.py +178 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/openpose/util.py +203 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/utils.py +72 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/fusion/__init__.py +0 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/fusion/dual_encoder_fusion.py +93 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/image_degradation/__init__.py +2 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/image_degradation/bsrgan.py +730 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/image_degradation/bsrgan_light.py +651 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/image_degradation/utils_image.py +916 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/ldm/util.py +200 -0
- libcom/painterly_image_harmonization/source/PHDiffusion/stable_diffusion.yaml +75 -0
- libcom/painterly_image_harmonization/source/__init__.py +0 -0
- libcom/reflection_generation/__init__.py +3 -0
- libcom/reflection_generation/reflection_generation.py +174 -0
- libcom/reflection_generation/source/PostProcessModel.py +513 -0
- libcom/reflection_generation/source/__init__.py +0 -0
- libcom/reflection_generation/source/cldm/__init__.py +0 -0
- libcom/reflection_generation/source/cldm/base_network.py +166 -0
- libcom/reflection_generation/source/cldm/cldm.py +509 -0
- libcom/reflection_generation/source/cldm/ddim_hacked.py +317 -0
- libcom/reflection_generation/source/cldm/hack.py +111 -0
- libcom/reflection_generation/source/cldm/logger.py +127 -0
- libcom/reflection_generation/source/cldm/model.py +26 -0
- libcom/reflection_generation/source/cldm_v15.yaml +81 -0
- libcom/reflection_generation/source/cluster_feature.py +109 -0
- libcom/reflection_generation/source/ldm/__init__.py +0 -0
- libcom/reflection_generation/source/ldm/models/__init__.py +0 -0
- libcom/reflection_generation/source/ldm/models/autoencoder.py +219 -0
- libcom/reflection_generation/source/ldm/models/diffusion/__init__.py +0 -0
- libcom/reflection_generation/source/ldm/models/diffusion/attention_processor.py +188 -0
- libcom/reflection_generation/source/ldm/models/diffusion/ddim.py +340 -0
- libcom/reflection_generation/source/ldm/models/diffusion/ddpm.py +1892 -0
- libcom/reflection_generation/source/ldm/models/diffusion/dpm_solver/__init__.py +1 -0
- libcom/reflection_generation/source/ldm/models/diffusion/dpm_solver/dpm_solver.py +1154 -0
- libcom/reflection_generation/source/ldm/models/diffusion/dpm_solver/sampler.py +87 -0
- libcom/reflection_generation/source/ldm/models/diffusion/ip_adapter.py +57 -0
- libcom/reflection_generation/source/ldm/models/diffusion/plms.py +244 -0
- libcom/reflection_generation/source/ldm/models/diffusion/sampling_util.py +22 -0
- libcom/reflection_generation/source/ldm/modules/__init__.py +0 -0
- libcom/reflection_generation/source/ldm/modules/attention.py +341 -0
- libcom/reflection_generation/source/ldm/modules/diffusionmodules/__init__.py +0 -0
- libcom/reflection_generation/source/ldm/modules/diffusionmodules/model.py +852 -0
- libcom/reflection_generation/source/ldm/modules/diffusionmodules/openaimodel.py +786 -0
- libcom/reflection_generation/source/ldm/modules/diffusionmodules/upscaling.py +81 -0
- libcom/reflection_generation/source/ldm/modules/diffusionmodules/util.py +280 -0
- libcom/reflection_generation/source/ldm/modules/distributions/__init__.py +0 -0
- libcom/reflection_generation/source/ldm/modules/distributions/distributions.py +92 -0
- libcom/reflection_generation/source/ldm/modules/ema.py +80 -0
- libcom/reflection_generation/source/ldm/modules/encoders/__init__.py +0 -0
- libcom/reflection_generation/source/ldm/modules/encoders/modules.py +214 -0
- libcom/reflection_generation/source/ldm/modules/image_degradation/__init__.py +0 -0
- libcom/reflection_generation/source/ldm/modules/image_degradation/bsrgan.py +730 -0
- libcom/reflection_generation/source/ldm/modules/image_degradation/bsrgan_light.py +651 -0
- libcom/reflection_generation/source/ldm/modules/image_degradation/utils_image.py +916 -0
- libcom/reflection_generation/source/ldm/util.py +198 -0
- libcom/reflection_generation/source/local_clip.py +749 -0
- libcom/reflection_generation/source/tool_add_control.py +49 -0
- libcom/shadow_generation/__init__.py +3 -0
- libcom/shadow_generation/shadow_generation.py +754 -0
- libcom/shadow_generation/source/PostProcessModel.py +511 -0
- libcom/shadow_generation/source/__init__.py +0 -0
- libcom/shadow_generation/source/attention_processor.py +234 -0
- libcom/shadow_generation/source/cldm/__init__.py +0 -0
- libcom/shadow_generation/source/cldm/base_network.py +166 -0
- libcom/shadow_generation/source/cldm/cldm.py +524 -0
- libcom/shadow_generation/source/cldm/model.py +28 -0
- libcom/shadow_generation/source/ldm/__init__.py +0 -0
- libcom/shadow_generation/source/ldm/models/__init__.py +0 -0
- libcom/shadow_generation/source/ldm/models/autoencoder.py +219 -0
- libcom/shadow_generation/source/ldm/models/diffusion/__init__.py +0 -0
- libcom/shadow_generation/source/ldm/models/diffusion/attention_processor.py +188 -0
- libcom/shadow_generation/source/ldm/models/diffusion/ddim.py +340 -0
- libcom/shadow_generation/source/ldm/models/diffusion/ddpm.py +1893 -0
- libcom/shadow_generation/source/ldm/models/diffusion/dpm_solver/__init__.py +1 -0
- libcom/shadow_generation/source/ldm/models/diffusion/dpm_solver/dpm_solver.py +1154 -0
- libcom/shadow_generation/source/ldm/models/diffusion/dpm_solver/sampler.py +87 -0
- libcom/shadow_generation/source/ldm/models/diffusion/ip_adapter.py +57 -0
- libcom/shadow_generation/source/ldm/models/diffusion/plms.py +244 -0
- libcom/shadow_generation/source/ldm/models/diffusion/sampling_util.py +22 -0
- libcom/shadow_generation/source/ldm/modules/__init__.py +0 -0
- libcom/shadow_generation/source/ldm/modules/attention.py +341 -0
- libcom/shadow_generation/source/ldm/modules/diffusionmodules/__init__.py +0 -0
- libcom/shadow_generation/source/ldm/modules/diffusionmodules/model.py +852 -0
- libcom/shadow_generation/source/ldm/modules/diffusionmodules/openaimodel.py +786 -0
- libcom/shadow_generation/source/ldm/modules/diffusionmodules/upscaling.py +81 -0
- libcom/shadow_generation/source/ldm/modules/diffusionmodules/util.py +270 -0
- libcom/shadow_generation/source/ldm/modules/distributions/__init__.py +0 -0
- libcom/shadow_generation/source/ldm/modules/distributions/distributions.py +92 -0
- libcom/shadow_generation/source/ldm/modules/ema.py +80 -0
- libcom/shadow_generation/source/ldm/modules/encoders/__init__.py +0 -0
- libcom/shadow_generation/source/ldm/modules/encoders/modules.py +214 -0
- libcom/shadow_generation/source/ldm/modules/image_degradation/__init__.py +2 -0
- libcom/shadow_generation/source/ldm/modules/image_degradation/bsrgan.py +730 -0
- libcom/shadow_generation/source/ldm/modules/image_degradation/bsrgan_light.py +651 -0
- libcom/shadow_generation/source/ldm/modules/image_degradation/utils_image.py +916 -0
- libcom/shadow_generation/source/ldm/modules/midas/__init__.py +0 -0
- libcom/shadow_generation/source/ldm/modules/midas/api.py +170 -0
- libcom/shadow_generation/source/ldm/modules/midas/midas/__init__.py +0 -0
- libcom/shadow_generation/source/ldm/modules/midas/midas/base_model.py +16 -0
- libcom/shadow_generation/source/ldm/modules/midas/midas/blocks.py +342 -0
- libcom/shadow_generation/source/ldm/modules/midas/midas/dpt_depth.py +109 -0
- libcom/shadow_generation/source/ldm/modules/midas/midas/midas_net.py +76 -0
- libcom/shadow_generation/source/ldm/modules/midas/midas/midas_net_custom.py +128 -0
- libcom/shadow_generation/source/ldm/modules/midas/midas/transforms.py +234 -0
- libcom/shadow_generation/source/ldm/modules/midas/midas/vit.py +491 -0
- libcom/shadow_generation/source/ldm/modules/midas/utils.py +189 -0
- libcom/shadow_generation/source/ldm/util.py +199 -0
- libcom/utils/__init__.py +0 -0
- libcom/utils/environment.py +12 -0
- libcom/utils/model_download.py +67 -0
- libcom/utils/process_image.py +108 -0
- libcom-0.1.8.dist-info/METADATA +157 -0
- libcom-0.1.8.dist-info/RECORD +310 -0
- libcom-0.1.8.dist-info/WHEEL +5 -0
- libcom-0.1.8.dist-info/licenses/LICENSE +201 -0
- libcom-0.1.8.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
import torch
|
|
6
|
+
import yaml
|
|
7
|
+
from diffusers import FlowMatchEulerDiscreteScheduler
|
|
8
|
+
from huggingface_hub import snapshot_download
|
|
9
|
+
from safetensors.torch import load_file
|
|
10
|
+
|
|
11
|
+
from lbm.models.embedders import (
|
|
12
|
+
ConditionerWrapper,
|
|
13
|
+
LatentsConcatEmbedder,
|
|
14
|
+
LatentsConcatEmbedderConfig,
|
|
15
|
+
)
|
|
16
|
+
from lbm.models.lbm import LBMConfig, LBMModel
|
|
17
|
+
from lbm.models.unets import DiffusersUNet2DCondWrapper
|
|
18
|
+
from lbm.models.vae import AutoencoderKLDiffusers, AutoencoderKLDiffusersConfig
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def get_model(
|
|
22
|
+
model_dir: str,
|
|
23
|
+
save_dir: Optional[str] = None,
|
|
24
|
+
torch_dtype: torch.dtype = torch.bfloat16,
|
|
25
|
+
device: str = "cuda",
|
|
26
|
+
) -> LBMModel:
|
|
27
|
+
"""Download the model from the model directory using either a local path or a path to HuggingFace Hub
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
model_dir (str): The path to the model directory containing the model weights and config, can be a local path or a path to HuggingFace Hub
|
|
31
|
+
save_dir (Optional[str]): The local path to save the model if downloading from HuggingFace Hub. Defaults to None.
|
|
32
|
+
torch_dtype (torch.dtype): The torch dtype to use for the model. Defaults to torch.bfloat16.
|
|
33
|
+
device (str): The device to use for the model. Defaults to "cuda".
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
LBMModel: The loaded model
|
|
37
|
+
"""
|
|
38
|
+
if not os.path.exists(model_dir):
|
|
39
|
+
local_dir = snapshot_download(
|
|
40
|
+
model_dir,
|
|
41
|
+
local_dir=save_dir,
|
|
42
|
+
)
|
|
43
|
+
model_dir = local_dir
|
|
44
|
+
|
|
45
|
+
model_files = os.listdir(model_dir)
|
|
46
|
+
|
|
47
|
+
# check yaml config file is present
|
|
48
|
+
yaml_file = [f for f in model_files if f.endswith(".yaml")]
|
|
49
|
+
if len(yaml_file) == 0:
|
|
50
|
+
raise ValueError("No yaml file found in the model directory.")
|
|
51
|
+
|
|
52
|
+
# check safetensors weights file is present
|
|
53
|
+
safetensors_files = sorted([f for f in model_files if f.endswith(".safetensors")])
|
|
54
|
+
ckpt_files = sorted([f for f in model_files if f.endswith(".ckpt")])
|
|
55
|
+
if len(safetensors_files) == 0 and len(ckpt_files) == 0:
|
|
56
|
+
raise ValueError("No safetensors or ckpt file found in the model directory")
|
|
57
|
+
|
|
58
|
+
if len(model_files) == 0:
|
|
59
|
+
raise ValueError("No model files found in the model directory")
|
|
60
|
+
|
|
61
|
+
with open(os.path.join(model_dir, yaml_file[0]), "r") as f:
|
|
62
|
+
config = yaml.safe_load(f)
|
|
63
|
+
|
|
64
|
+
model = _get_model_from_config(**config, torch_dtype=torch_dtype)
|
|
65
|
+
|
|
66
|
+
if len(safetensors_files) > 0:
|
|
67
|
+
logging.info(f"Loading safetensors file: {safetensors_files[-1]}")
|
|
68
|
+
sd = load_file(os.path.join(model_dir, safetensors_files[-1]))
|
|
69
|
+
model.load_state_dict(sd, strict=True)
|
|
70
|
+
elif len(ckpt_files) > 0:
|
|
71
|
+
logging.info(f"Loading ckpt file: {ckpt_files[-1]}")
|
|
72
|
+
sd = torch.load(
|
|
73
|
+
os.path.join(model_dir, ckpt_files[-1]),
|
|
74
|
+
map_location="cpu",
|
|
75
|
+
)["state_dict"]
|
|
76
|
+
sd = {k[6:]: v for k, v in sd.items() if k.startswith("model.")}
|
|
77
|
+
model.load_state_dict(
|
|
78
|
+
sd,
|
|
79
|
+
strict=True,
|
|
80
|
+
)
|
|
81
|
+
model.to(device).to(torch_dtype)
|
|
82
|
+
|
|
83
|
+
model.eval()
|
|
84
|
+
|
|
85
|
+
return model
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _get_model_from_config(
|
|
89
|
+
backbone_signature: str = "stabilityai/stable-diffusion-xl-base-1.0",
|
|
90
|
+
vae_num_channels: int = 4,
|
|
91
|
+
unet_input_channels: int = 4,
|
|
92
|
+
timestep_sampling: str = "log_normal",
|
|
93
|
+
selected_timesteps: Optional[List[float]] = None,
|
|
94
|
+
prob: Optional[List[float]] = None,
|
|
95
|
+
conditioning_images_keys: Optional[List[str]] = [],
|
|
96
|
+
conditioning_masks_keys: Optional[List[str]] = [],
|
|
97
|
+
source_key: str = "source_image",
|
|
98
|
+
target_key: str = "source_image_paste",
|
|
99
|
+
bridge_noise_sigma: float = 0.0,
|
|
100
|
+
logit_mean: float = 0.0,
|
|
101
|
+
logit_std: float = 1.0,
|
|
102
|
+
pixel_loss_type: str = "lpips",
|
|
103
|
+
latent_loss_type: str = "l2",
|
|
104
|
+
latent_loss_weight: float = 1.0,
|
|
105
|
+
pixel_loss_weight: float = 0.0,
|
|
106
|
+
torch_dtype: torch.dtype = torch.bfloat16,
|
|
107
|
+
**kwargs,
|
|
108
|
+
):
|
|
109
|
+
|
|
110
|
+
conditioners = []
|
|
111
|
+
|
|
112
|
+
denoiser = DiffusersUNet2DCondWrapper(
|
|
113
|
+
in_channels=unet_input_channels, # Add downsampled_image
|
|
114
|
+
out_channels=vae_num_channels,
|
|
115
|
+
center_input_sample=False,
|
|
116
|
+
flip_sin_to_cos=True,
|
|
117
|
+
freq_shift=0,
|
|
118
|
+
down_block_types=[
|
|
119
|
+
"DownBlock2D",
|
|
120
|
+
"CrossAttnDownBlock2D",
|
|
121
|
+
"CrossAttnDownBlock2D",
|
|
122
|
+
],
|
|
123
|
+
mid_block_type="UNetMidBlock2DCrossAttn",
|
|
124
|
+
up_block_types=["CrossAttnUpBlock2D", "CrossAttnUpBlock2D", "UpBlock2D"],
|
|
125
|
+
only_cross_attention=False,
|
|
126
|
+
block_out_channels=[320, 640, 1280],
|
|
127
|
+
layers_per_block=2,
|
|
128
|
+
downsample_padding=1,
|
|
129
|
+
mid_block_scale_factor=1,
|
|
130
|
+
dropout=0.0,
|
|
131
|
+
act_fn="silu",
|
|
132
|
+
norm_num_groups=32,
|
|
133
|
+
norm_eps=1e-05,
|
|
134
|
+
cross_attention_dim=[320, 640, 1280],
|
|
135
|
+
transformer_layers_per_block=[1, 2, 10],
|
|
136
|
+
reverse_transformer_layers_per_block=None,
|
|
137
|
+
encoder_hid_dim=None,
|
|
138
|
+
encoder_hid_dim_type=None,
|
|
139
|
+
attention_head_dim=[5, 10, 20],
|
|
140
|
+
num_attention_heads=None,
|
|
141
|
+
dual_cross_attention=False,
|
|
142
|
+
use_linear_projection=True,
|
|
143
|
+
class_embed_type=None,
|
|
144
|
+
addition_embed_type=None,
|
|
145
|
+
addition_time_embed_dim=None,
|
|
146
|
+
num_class_embeds=None,
|
|
147
|
+
upcast_attention=None,
|
|
148
|
+
resnet_time_scale_shift="default",
|
|
149
|
+
resnet_skip_time_act=False,
|
|
150
|
+
resnet_out_scale_factor=1.0,
|
|
151
|
+
time_embedding_type="positional",
|
|
152
|
+
time_embedding_dim=None,
|
|
153
|
+
time_embedding_act_fn=None,
|
|
154
|
+
timestep_post_act=None,
|
|
155
|
+
time_cond_proj_dim=None,
|
|
156
|
+
conv_in_kernel=3,
|
|
157
|
+
conv_out_kernel=3,
|
|
158
|
+
projection_class_embeddings_input_dim=None,
|
|
159
|
+
attention_type="default",
|
|
160
|
+
class_embeddings_concat=False,
|
|
161
|
+
mid_block_only_cross_attention=None,
|
|
162
|
+
cross_attention_norm=None,
|
|
163
|
+
addition_embed_type_num_heads=64,
|
|
164
|
+
).to(torch_dtype)
|
|
165
|
+
|
|
166
|
+
if conditioning_images_keys != [] or conditioning_masks_keys != []:
|
|
167
|
+
|
|
168
|
+
latents_concat_embedder_config = LatentsConcatEmbedderConfig(
|
|
169
|
+
image_keys=conditioning_images_keys,
|
|
170
|
+
mask_keys=conditioning_masks_keys,
|
|
171
|
+
)
|
|
172
|
+
latent_concat_embedder = LatentsConcatEmbedder(latents_concat_embedder_config)
|
|
173
|
+
latent_concat_embedder.freeze()
|
|
174
|
+
conditioners.append(latent_concat_embedder)
|
|
175
|
+
|
|
176
|
+
# Wrap conditioners and set to device
|
|
177
|
+
conditioner = ConditionerWrapper(
|
|
178
|
+
conditioners=conditioners,
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
## VAE ##
|
|
182
|
+
# Get VAE model
|
|
183
|
+
vae_config = AutoencoderKLDiffusersConfig(
|
|
184
|
+
version=backbone_signature,
|
|
185
|
+
subfolder="vae",
|
|
186
|
+
tiling_size=(128, 128),
|
|
187
|
+
)
|
|
188
|
+
vae = AutoencoderKLDiffusers(vae_config).to(torch_dtype)
|
|
189
|
+
vae.freeze()
|
|
190
|
+
vae.to(torch_dtype)
|
|
191
|
+
|
|
192
|
+
## Diffusion Model ##
|
|
193
|
+
# Get diffusion model
|
|
194
|
+
config = LBMConfig(
|
|
195
|
+
source_key=source_key,
|
|
196
|
+
target_key=target_key,
|
|
197
|
+
latent_loss_weight=latent_loss_weight,
|
|
198
|
+
latent_loss_type=latent_loss_type,
|
|
199
|
+
pixel_loss_type=pixel_loss_type,
|
|
200
|
+
pixel_loss_weight=pixel_loss_weight,
|
|
201
|
+
timestep_sampling=timestep_sampling,
|
|
202
|
+
logit_mean=logit_mean,
|
|
203
|
+
logit_std=logit_std,
|
|
204
|
+
selected_timesteps=selected_timesteps,
|
|
205
|
+
prob=prob,
|
|
206
|
+
bridge_noise_sigma=bridge_noise_sigma,
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
sampling_noise_scheduler = FlowMatchEulerDiscreteScheduler.from_pretrained(
|
|
210
|
+
backbone_signature,
|
|
211
|
+
subfolder="scheduler",
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
model = LBMModel(
|
|
215
|
+
config,
|
|
216
|
+
denoiser=denoiser,
|
|
217
|
+
sampling_noise_scheduler=sampling_noise_scheduler,
|
|
218
|
+
vae=vae,
|
|
219
|
+
conditioner=conditioner,
|
|
220
|
+
).to(torch_dtype)
|
|
221
|
+
|
|
222
|
+
return model
|
|
File without changes
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
from typing import Any, Dict
|
|
2
|
+
|
|
3
|
+
import torch
|
|
4
|
+
import torch.nn as nn
|
|
5
|
+
|
|
6
|
+
from .model_config import ModelConfig
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class BaseModel(nn.Module):
|
|
10
|
+
def __init__(self, config: ModelConfig):
|
|
11
|
+
nn.Module.__init__(self)
|
|
12
|
+
self.config = config
|
|
13
|
+
self.input_key = config.input_key
|
|
14
|
+
self.device = torch.device("cpu")
|
|
15
|
+
self.dtype = torch.float32
|
|
16
|
+
|
|
17
|
+
def on_fit_start(self, device: torch.device | None = None, *args, **kwargs):
|
|
18
|
+
"""Called when the training starts
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
device (Optional[torch.device], optional): The device to use. Usefull to set
|
|
22
|
+
relevant parameters on the model and embedder to the right device only
|
|
23
|
+
once at the start of the training. Defaults to None.
|
|
24
|
+
"""
|
|
25
|
+
if device is not None:
|
|
26
|
+
self.device = device
|
|
27
|
+
self.to(self.device)
|
|
28
|
+
|
|
29
|
+
def forward(self, batch: Dict[str, Any], *args, **kwargs):
|
|
30
|
+
raise NotImplementedError("forward method is not implemented")
|
|
31
|
+
|
|
32
|
+
def freeze(self):
|
|
33
|
+
"""Freeze the model"""
|
|
34
|
+
self.eval()
|
|
35
|
+
for param in self.parameters():
|
|
36
|
+
param.requires_grad = False
|
|
37
|
+
|
|
38
|
+
def to(self, *args, **kwargs):
|
|
39
|
+
device, dtype, non_blocking, _ = torch._C._nn._parse_to(*args, **kwargs)
|
|
40
|
+
self = super().to(
|
|
41
|
+
device=device,
|
|
42
|
+
dtype=dtype,
|
|
43
|
+
non_blocking=non_blocking,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
if device is not None:
|
|
47
|
+
self.device = device
|
|
48
|
+
if dtype is not None:
|
|
49
|
+
self.dtype = dtype
|
|
50
|
+
return self
|
|
51
|
+
|
|
52
|
+
def compute_metrics(self, batch: Dict[str, Any], *args, **kwargs):
|
|
53
|
+
"""Compute the metrics"""
|
|
54
|
+
return {}
|
|
55
|
+
|
|
56
|
+
def sample(self, batch: Dict[str, Any], *args, **kwargs):
|
|
57
|
+
"""Sample from the model"""
|
|
58
|
+
return {}
|
|
59
|
+
|
|
60
|
+
def log_samples(self, batch: Dict[str, Any], *args, **kwargs):
|
|
61
|
+
"""Log the samples"""
|
|
62
|
+
return None
|
|
63
|
+
|
|
64
|
+
def on_train_batch_end(self, batch: Dict[str, Any], *args, **kwargs):
|
|
65
|
+
"""Update the model an optimization is perforned on a batch."""
|
|
66
|
+
pass
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
from typing import Any, Dict, List, Optional, Union
|
|
2
|
+
|
|
3
|
+
import torch
|
|
4
|
+
|
|
5
|
+
from ...base.base_model import BaseModel
|
|
6
|
+
from .base_conditioner_config import BaseConditionerConfig
|
|
7
|
+
|
|
8
|
+
DIM2CONDITIONING = {
|
|
9
|
+
2: "vector",
|
|
10
|
+
3: "crossattn",
|
|
11
|
+
4: "concat",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class BaseConditioner(BaseModel):
|
|
16
|
+
"""This is the base class for all the conditioners. This absctacts the conditioning process
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
|
|
20
|
+
config (BaseConditionerConfig): The configuration of the conditioner
|
|
21
|
+
|
|
22
|
+
Examples
|
|
23
|
+
########
|
|
24
|
+
|
|
25
|
+
To use the conditioner, you can import the class and use it as follows:
|
|
26
|
+
|
|
27
|
+
.. code-block:: python
|
|
28
|
+
|
|
29
|
+
from cr.models.embedders import BaseConditioner, BaseConditionerConfig
|
|
30
|
+
|
|
31
|
+
# Create the conditioner config
|
|
32
|
+
config = BaseConditionerConfig(
|
|
33
|
+
input_key="text", # The key for the input
|
|
34
|
+
unconditional_conditioning_rate=0.3, # Drops the conditioning with 30% probability during training
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
# Create the conditioner
|
|
38
|
+
conditioner = BaseConditioner(config)
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def __init__(self, config: BaseConditionerConfig):
|
|
42
|
+
BaseModel.__init__(self, config)
|
|
43
|
+
self.config = config
|
|
44
|
+
self.input_key = config.input_key
|
|
45
|
+
self.dim2outputkey = DIM2CONDITIONING
|
|
46
|
+
self.ucg_rate = config.unconditional_conditioning_rate
|
|
47
|
+
|
|
48
|
+
def forward(
|
|
49
|
+
self, batch: Dict[str, Any], force_zero_embedding: bool = False, *args, **kwargs
|
|
50
|
+
):
|
|
51
|
+
"""
|
|
52
|
+
Forward pass of the embedder.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
|
|
56
|
+
batch (Dict[str, Any]): A dictionary containing the input data.
|
|
57
|
+
force_zero_embedding (bool): Whether to force zero embedding.
|
|
58
|
+
This will return an embedding with all entries set to 0. Defaults to False.
|
|
59
|
+
"""
|
|
60
|
+
raise NotImplementedError("Forward pass must be implemented in child class")
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from typing import Literal
|
|
2
|
+
|
|
3
|
+
from pydantic.dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
from ....config import BaseConfig
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass
|
|
9
|
+
class BaseConditionerConfig(BaseConfig):
|
|
10
|
+
"""This is the ClipEmbedderConfig class which defines all the useful parameters to instantiate the model
|
|
11
|
+
|
|
12
|
+
Args:
|
|
13
|
+
|
|
14
|
+
input_key (str): The key for the input. Defaults to "text".
|
|
15
|
+
unconditional_conditioning_rate (float): Drops the conditioning with this probability during training. Defaults to 0.0.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
input_key: str = "text"
|
|
19
|
+
unconditional_conditioning_rate: float = 0.0
|
|
20
|
+
|
|
21
|
+
def __post_init__(self):
|
|
22
|
+
super().__post_init__()
|
|
23
|
+
|
|
24
|
+
assert (
|
|
25
|
+
self.unconditional_conditioning_rate >= 0.0
|
|
26
|
+
and self.unconditional_conditioning_rate <= 1.0
|
|
27
|
+
), "Unconditional conditioning rate should be between 0 and 1"
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any, Dict, List, Union
|
|
3
|
+
|
|
4
|
+
import torch
|
|
5
|
+
import torch.nn as nn
|
|
6
|
+
|
|
7
|
+
from .base import BaseConditioner
|
|
8
|
+
|
|
9
|
+
KEY2CATDIM = {
|
|
10
|
+
"vector": 1,
|
|
11
|
+
"crossattn": 2,
|
|
12
|
+
"concat": 1,
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ConditionerWrapper(nn.Module):
|
|
17
|
+
"""
|
|
18
|
+
Wrapper for conditioners. This class allows to apply multiple conditioners in a single forward pass.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
|
|
22
|
+
conditioners (List[BaseConditioner]): List of conditioners to apply in the forward pass.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(
|
|
26
|
+
self,
|
|
27
|
+
conditioners: Union[List[BaseConditioner], None] = None,
|
|
28
|
+
):
|
|
29
|
+
nn.Module.__init__(self)
|
|
30
|
+
self.conditioners = nn.ModuleList(conditioners)
|
|
31
|
+
self.device = torch.device("cpu")
|
|
32
|
+
self.dtype = torch.float32
|
|
33
|
+
|
|
34
|
+
def conditioner_sanity_check(self):
|
|
35
|
+
cond_input_keys = []
|
|
36
|
+
for conditioner in self.conditioners:
|
|
37
|
+
cond_input_keys.append(conditioner.input_key)
|
|
38
|
+
|
|
39
|
+
assert all([key in set(cond_input_keys) for key in self.ucg_keys])
|
|
40
|
+
|
|
41
|
+
def on_fit_start(self, device: torch.device | None = None, *args, **kwargs):
|
|
42
|
+
"""Called when the training starts"""
|
|
43
|
+
for conditioner in self.conditioners:
|
|
44
|
+
conditioner.on_fit_start(device=device, *args, **kwargs)
|
|
45
|
+
|
|
46
|
+
def forward(
|
|
47
|
+
self,
|
|
48
|
+
batch: Dict[str, Any],
|
|
49
|
+
ucg_keys: List[str] = None,
|
|
50
|
+
set_ucg_rate_zero=False,
|
|
51
|
+
*args,
|
|
52
|
+
**kwargs,
|
|
53
|
+
):
|
|
54
|
+
"""
|
|
55
|
+
Forward pass through all conditioners
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
|
|
59
|
+
batch: batch of data
|
|
60
|
+
ucg_keys: keys to use for ucg. This will force zero conditioning in all the
|
|
61
|
+
conditioners that have input_keys in ucg_keys
|
|
62
|
+
set_ucg_rate_zero: set the ucg rate to zero for all the conditioners except the ones in ucg_keys
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
|
|
66
|
+
Dict[str, Any]: The output of the conditioner. The output of the conditioner is a dictionary with the main key "cond" and value
|
|
67
|
+
is a dictionary with the keys as the type of conditioning and the value as the conditioning tensor.
|
|
68
|
+
"""
|
|
69
|
+
if ucg_keys is None:
|
|
70
|
+
ucg_keys = []
|
|
71
|
+
wrapper_outputs = dict(cond={})
|
|
72
|
+
for conditioner in self.conditioners:
|
|
73
|
+
if conditioner.input_key in ucg_keys:
|
|
74
|
+
force_zero_embedding = True
|
|
75
|
+
elif conditioner.ucg_rate > 0 and not set_ucg_rate_zero:
|
|
76
|
+
force_zero_embedding = bool(torch.rand(1) < conditioner.ucg_rate)
|
|
77
|
+
else:
|
|
78
|
+
force_zero_embedding = False
|
|
79
|
+
|
|
80
|
+
conditioner_output = conditioner.forward(
|
|
81
|
+
batch, force_zero_embedding=force_zero_embedding, *args, **kwargs
|
|
82
|
+
)
|
|
83
|
+
logging.debug(
|
|
84
|
+
f"conditioner:{conditioner.__class__.__name__}, input_key:{conditioner.input_key}, force_ucg_zero_embedding:{force_zero_embedding}"
|
|
85
|
+
)
|
|
86
|
+
for key in conditioner_output:
|
|
87
|
+
logging.debug(
|
|
88
|
+
f"conditioner_output:{key}:{conditioner_output[key].shape}"
|
|
89
|
+
)
|
|
90
|
+
if key in wrapper_outputs["cond"]:
|
|
91
|
+
wrapper_outputs["cond"][key] = torch.cat(
|
|
92
|
+
[wrapper_outputs["cond"][key], conditioner_output[key]],
|
|
93
|
+
KEY2CATDIM[key],
|
|
94
|
+
)
|
|
95
|
+
else:
|
|
96
|
+
wrapper_outputs["cond"][key] = conditioner_output[key]
|
|
97
|
+
|
|
98
|
+
return wrapper_outputs
|
|
99
|
+
|
|
100
|
+
def to(self, *args, **kwargs):
|
|
101
|
+
"""
|
|
102
|
+
Move all conditioners to device and dtype
|
|
103
|
+
"""
|
|
104
|
+
device, dtype, non_blocking, _ = torch._C._nn._parse_to(*args, **kwargs)
|
|
105
|
+
self = super().to(device=device, dtype=dtype, non_blocking=non_blocking)
|
|
106
|
+
for conditioner in self.conditioners:
|
|
107
|
+
conditioner.to(device=device, dtype=dtype, non_blocking=non_blocking)
|
|
108
|
+
|
|
109
|
+
if device is not None:
|
|
110
|
+
self.device = device
|
|
111
|
+
if dtype is not None:
|
|
112
|
+
self.dtype = dtype
|
|
113
|
+
|
|
114
|
+
return self
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from dataclasses import field
|
|
2
|
+
from typing import List, Union
|
|
3
|
+
|
|
4
|
+
from pydantic.dataclasses import dataclass
|
|
5
|
+
|
|
6
|
+
from ..base import BaseConditionerConfig
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class LatentsConcatEmbedderConfig(BaseConditionerConfig):
|
|
11
|
+
"""
|
|
12
|
+
Configs for the LatentsConcatEmbedder embedder
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
image_keys (Union[List[str], None]): Keys of the images to compute the VAE embeddings
|
|
16
|
+
mask_keys (Union[List[str], None]): Keys of the masks to resize
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
image_keys: Union[List[str], None] = field(default_factory=lambda: ["image"])
|
|
20
|
+
mask_keys: Union[List[str], None] = field(default_factory=lambda: ["mask"])
|
|
21
|
+
|
|
22
|
+
def __post_init__(self):
|
|
23
|
+
super().__post_init__()
|
|
24
|
+
|
|
25
|
+
# Make sure that at least one of the image_keys or mask_keys is provided
|
|
26
|
+
assert (self.image_keys is not None) or (
|
|
27
|
+
self.mask_keys is not None
|
|
28
|
+
), "At least one of the image_keys or mask_keys must be provided."
|
|
29
|
+
|
|
30
|
+
self.image_keys = self.image_keys if self.image_keys is not None else []
|
|
31
|
+
self.mask_keys = self.mask_keys if self.mask_keys is not None else []
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
from typing import Any, Dict
|
|
2
|
+
|
|
3
|
+
import torch
|
|
4
|
+
import torchvision.transforms.functional as F
|
|
5
|
+
|
|
6
|
+
from lbm.models.vae import AutoencoderKLDiffusers
|
|
7
|
+
|
|
8
|
+
from ..base import BaseConditioner
|
|
9
|
+
from .latents_concat_embedder_config import LatentsConcatEmbedderConfig
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class LatentsConcatEmbedder(BaseConditioner):
|
|
13
|
+
"""
|
|
14
|
+
Class computing VAE embeddings from given images and resizing the masks.
|
|
15
|
+
Then outputs are then concatenated to the noise in the latent space.
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
config (LatentsConcatEmbedderConfig): Configs to create the embedder
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self, config: LatentsConcatEmbedderConfig):
|
|
22
|
+
BaseConditioner.__init__(self, config)
|
|
23
|
+
|
|
24
|
+
def forward(
|
|
25
|
+
self, batch: Dict[str, Any], vae: AutoencoderKLDiffusers, *args, **kwargs
|
|
26
|
+
) -> dict:
|
|
27
|
+
"""
|
|
28
|
+
Args:
|
|
29
|
+
batch (dict): A batch of images to be processed by this embedder. In the batch,
|
|
30
|
+
the images must range between [-1, 1] and the masks range between [0, 1].
|
|
31
|
+
vae (AutoencoderKLDiffusers): VAE
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
output (dict): outputs
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
# Check if image are of the same size
|
|
38
|
+
dims_list = []
|
|
39
|
+
for image_key in self.config.image_keys:
|
|
40
|
+
dims_list.append(batch[image_key].shape[-2:])
|
|
41
|
+
for mask_key in self.config.mask_keys:
|
|
42
|
+
dims_list.append(batch[mask_key].shape[-2:])
|
|
43
|
+
assert all(
|
|
44
|
+
dims == dims_list[0] for dims in dims_list
|
|
45
|
+
), "All images and masks must have the same dimensions."
|
|
46
|
+
|
|
47
|
+
# Find the latent dimensions
|
|
48
|
+
if len(self.config.image_keys) > 0:
|
|
49
|
+
latent_dims = (
|
|
50
|
+
batch[self.config.image_keys[0]].shape[-2] // vae.downsampling_factor,
|
|
51
|
+
batch[self.config.image_keys[0]].shape[-1] // vae.downsampling_factor,
|
|
52
|
+
)
|
|
53
|
+
else:
|
|
54
|
+
latent_dims = (
|
|
55
|
+
batch[self.config.mask_keys[0]].shape[-2] // vae.downsampling_factor,
|
|
56
|
+
batch[self.config.mask_keys[0]].shape[-1] // vae.downsampling_factor,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
outputs = []
|
|
60
|
+
|
|
61
|
+
# Resize the masks and concat them
|
|
62
|
+
for mask_key in self.config.mask_keys:
|
|
63
|
+
curr_latents = F.resize(
|
|
64
|
+
batch[mask_key],
|
|
65
|
+
size=latent_dims,
|
|
66
|
+
interpolation=F.InterpolationMode.BILINEAR,
|
|
67
|
+
)
|
|
68
|
+
outputs.append(curr_latents)
|
|
69
|
+
|
|
70
|
+
# Compute VAE embeddings from the images
|
|
71
|
+
for image_key in self.config.image_keys:
|
|
72
|
+
vae_embs = vae.encode(batch[image_key])
|
|
73
|
+
outputs.append(vae_embs)
|
|
74
|
+
|
|
75
|
+
# Concat all the outputs
|
|
76
|
+
outputs = torch.concat(outputs, dim=1)
|
|
77
|
+
|
|
78
|
+
outputs = {self.dim2outputkey[outputs.dim()]: outputs}
|
|
79
|
+
|
|
80
|
+
return outputs
|