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,355 @@
|
|
|
1
|
+
import torch
|
|
2
|
+
import torch.nn as nn
|
|
3
|
+
import torch.nn.functional as F
|
|
4
|
+
from torchvision import models
|
|
5
|
+
from einops import rearrange
|
|
6
|
+
import copy
|
|
7
|
+
from .loss_function import TripletLoss
|
|
8
|
+
from torchvision.ops import RoIAlign, roi_align
|
|
9
|
+
|
|
10
|
+
class SingleScaleD(nn.Module):
|
|
11
|
+
def __init__(self, loadweights=False):
|
|
12
|
+
super().__init__()
|
|
13
|
+
model = models.vgg19(pretrained = loadweights)
|
|
14
|
+
self.backbone = model.features
|
|
15
|
+
self.gap = nn.AdaptiveAvgPool2d(1)
|
|
16
|
+
self.fc = nn.Linear(in_features=512, out_features=1, bias=True)
|
|
17
|
+
self.sigmoid = nn.Sigmoid()
|
|
18
|
+
|
|
19
|
+
def forward(self, x):
|
|
20
|
+
f3 = self.backbone[:19](x)
|
|
21
|
+
f4 = self.backbone[19:28](f3)
|
|
22
|
+
f5 = self.backbone[28:](f4)
|
|
23
|
+
fv = self.gap(f5).flatten(1)
|
|
24
|
+
out = self.sigmoid(self.fc(fv)).flatten()
|
|
25
|
+
return [f5, fv], out
|
|
26
|
+
|
|
27
|
+
def conv_relu_x2(in_ch, out_ch):
|
|
28
|
+
convs = nn.Sequential(
|
|
29
|
+
nn.Conv2d(in_ch, out_ch, 3, 1, 1),
|
|
30
|
+
nn.ReLU(),
|
|
31
|
+
nn.Conv2d(out_ch, out_ch, 3, 1, 1),
|
|
32
|
+
nn.ReLU())
|
|
33
|
+
return convs
|
|
34
|
+
|
|
35
|
+
def binary_classifier(in_ch):
|
|
36
|
+
classifier = nn.Sequential(
|
|
37
|
+
nn.AdaptiveAvgPool2d(1),
|
|
38
|
+
nn.Conv2d(in_ch, 1, 1, 1),
|
|
39
|
+
nn.Sigmoid())
|
|
40
|
+
return classifier
|
|
41
|
+
|
|
42
|
+
def get_distillation_module(distill_type, in_ch, out_ch, alignsize, downsample):
|
|
43
|
+
if distill_type == 'roiconcat':
|
|
44
|
+
return RoIConcatDistillation(in_ch, out_ch, alignsize, downsample)
|
|
45
|
+
elif distill_type == 'roicropresize':
|
|
46
|
+
return CropResizeDistillation(in_ch, out_ch, alignsize, downsample)
|
|
47
|
+
elif distill_type == 'gloablconcat':
|
|
48
|
+
return GlobalConcatDistillation(in_ch, out_ch)
|
|
49
|
+
elif distill_type == 'roivectorconcat':
|
|
50
|
+
return RoIVectorConcatDistillation(in_ch, out_ch, downsample)
|
|
51
|
+
elif distill_type in ['gapconcat', 'onlyclassify']:
|
|
52
|
+
return VectorConcatDistillation(in_ch, out_ch)
|
|
53
|
+
else:
|
|
54
|
+
return None
|
|
55
|
+
|
|
56
|
+
class CropResizeDistillation(nn.Module):
|
|
57
|
+
def __init__(self, in_ch, out_ch, alignsize, downsample):
|
|
58
|
+
super().__init__()
|
|
59
|
+
# self.RoIAlign = RoIAlignAvg(alignsize, alignsize, 1.0 / 2 ** downsample)
|
|
60
|
+
self.RoIAlign = RoIAlign(alignsize, 1.0 / 2 ** downsample, -1)
|
|
61
|
+
self.convs = conv_relu_x2(in_ch, out_ch)
|
|
62
|
+
# self.scale = 1.0 / 2 ** downsample
|
|
63
|
+
self.alignsize = alignsize
|
|
64
|
+
self.classifier = binary_classifier(out_ch)
|
|
65
|
+
|
|
66
|
+
def forward(self, bg_feat, fg_feat, q_box, c_box, num_bg):
|
|
67
|
+
'''
|
|
68
|
+
:param bg_feat: b,c,h,w
|
|
69
|
+
:param fg_feat: b,c,h,w
|
|
70
|
+
:param q_box: query box, b,4
|
|
71
|
+
:param c_box: cropped bounding box, b,4
|
|
72
|
+
:return:
|
|
73
|
+
'''
|
|
74
|
+
B = bg_feat.shape[0]
|
|
75
|
+
index = torch.arange(B).view(-1, 1).to(q_box.device)
|
|
76
|
+
idx_cbox = torch.cat((index, c_box), dim=-1).contiguous()
|
|
77
|
+
# obtain the feature of cropped background region
|
|
78
|
+
roi_feat = self.RoIAlign(bg_feat, idx_cbox) # b,c,roi_size,roi_size
|
|
79
|
+
# compute the target bounding box for foreground feature
|
|
80
|
+
tar_box = torch.zeros_like(q_box)
|
|
81
|
+
crop_w = c_box[:,2] - c_box[:,0]
|
|
82
|
+
crop_h = c_box[:,3] - c_box[:,1]
|
|
83
|
+
tar_box[:, 0] = torch.floor((q_box[:,0] - c_box[:,0]) / crop_w * self.alignsize)
|
|
84
|
+
tar_box[:, 1] = torch.floor((q_box[:,1] - c_box[:,1]) / crop_h * self.alignsize)
|
|
85
|
+
tar_box[:, 2] = torch.ceil((q_box[:,2] - c_box[:,0]) / crop_w * self.alignsize)
|
|
86
|
+
tar_box[:, 3] = torch.ceil((q_box[:,3] - c_box[:,1]) / crop_h * self.alignsize)
|
|
87
|
+
tar_box = tar_box.int()
|
|
88
|
+
assert tar_box.min() >= 0 and tar_box.max() <= self.alignsize, \
|
|
89
|
+
f'tar box coordinates max={tar_box.max()}, min={tar_box.min()}'
|
|
90
|
+
# as the target size of foreground feature varies with background image,
|
|
91
|
+
# we separately process different backgrounds.
|
|
92
|
+
|
|
93
|
+
roi_feat = rearrange(roi_feat, '(b n) c h w -> b n c h w', b=num_bg)
|
|
94
|
+
fg_feat = rearrange(fg_feat, '(b n) c h w -> b n c h w', b=num_bg)
|
|
95
|
+
tar_box = rearrange(tar_box, '(b n) d -> b n d', b=num_bg)
|
|
96
|
+
|
|
97
|
+
feat_collect = []
|
|
98
|
+
for i in range(num_bg):
|
|
99
|
+
comp_feat = roi_feat[i].clone()
|
|
100
|
+
per_fg_feat = fg_feat[i]
|
|
101
|
+
x1,y1,x2,y2 = tar_box[i, 0]
|
|
102
|
+
rs_w, rs_h = x2 - x1, y2 - y1
|
|
103
|
+
per_fg_feat = F.interpolate(per_fg_feat, (rs_h, rs_w))
|
|
104
|
+
comp_feat[:, :, y1:y2, x1:x2] = per_fg_feat
|
|
105
|
+
feat_collect.append(comp_feat)
|
|
106
|
+
feat_collect = torch.stack(feat_collect, dim=0)
|
|
107
|
+
feat_collect = rearrange(feat_collect, 'b n c h w -> (b n) c h w')
|
|
108
|
+
out_feat = self.convs(feat_collect)
|
|
109
|
+
score = self.classifier(out_feat)
|
|
110
|
+
return out_feat, score
|
|
111
|
+
|
|
112
|
+
class GlobalConcatDistillation(nn.Module):
|
|
113
|
+
def __init__(self, in_ch, out_ch):
|
|
114
|
+
super().__init__()
|
|
115
|
+
self.convs = conv_relu_x2(in_ch*2, out_ch)
|
|
116
|
+
self.classifier = binary_classifier(out_ch)
|
|
117
|
+
|
|
118
|
+
def forward(self, bg_feat, fg_feat, q_box, c_box, num_bg):
|
|
119
|
+
'''
|
|
120
|
+
:param bg_feat: b,c,h,w
|
|
121
|
+
:param fg_feat: b,c,h,w
|
|
122
|
+
:param q_box: query box, b,4
|
|
123
|
+
:param c_box: cropped bounding box, b,4
|
|
124
|
+
:return:
|
|
125
|
+
'''
|
|
126
|
+
concat_feat = torch.cat([bg_feat, fg_feat], dim=1)
|
|
127
|
+
out_feat = self.convs(concat_feat)
|
|
128
|
+
score = self.classifier(out_feat)
|
|
129
|
+
return out_feat, score
|
|
130
|
+
|
|
131
|
+
class RoIConcatDistillation(nn.Module):
|
|
132
|
+
def __init__(self, in_ch, out_ch, alignsize, downsample):
|
|
133
|
+
super().__init__()
|
|
134
|
+
self.RoIAlign = RoIAlign(alignsize, 1.0 / 2 ** downsample, -1)
|
|
135
|
+
self.convs = conv_relu_x2(in_ch*2, out_ch)
|
|
136
|
+
self.alignsize = alignsize
|
|
137
|
+
self.classifier = binary_classifier(out_ch)
|
|
138
|
+
|
|
139
|
+
def forward(self, bg_feat, fg_feat, q_box, c_box, num_bg):
|
|
140
|
+
'''
|
|
141
|
+
:param bg_feat: b,c,h,w
|
|
142
|
+
:param fg_feat: b,c,h,w
|
|
143
|
+
:param q_box: query box, b,4
|
|
144
|
+
:param c_box: cropped bounding box, b,4
|
|
145
|
+
:return:
|
|
146
|
+
'''
|
|
147
|
+
B = bg_feat.shape[0]
|
|
148
|
+
index = torch.arange(B).view(-1, 1).to(q_box.device)
|
|
149
|
+
idx_cbox = torch.cat((index, c_box), dim=-1).contiguous()
|
|
150
|
+
# obtain the feature of cropped background region
|
|
151
|
+
roi_feat = self.RoIAlign(bg_feat, idx_cbox) # b,c,h,w
|
|
152
|
+
fg_feat_rs = F.interpolate(fg_feat, (self.alignsize, self.alignsize))
|
|
153
|
+
concat_feat = torch.cat([roi_feat, fg_feat_rs], dim=1)
|
|
154
|
+
out_feat = self.convs(concat_feat)
|
|
155
|
+
score = self.classifier(out_feat)
|
|
156
|
+
return out_feat, score
|
|
157
|
+
|
|
158
|
+
class VectorConcatDistillation(nn.Module):
|
|
159
|
+
def __init__(self, in_ch, out_ch):
|
|
160
|
+
super().__init__()
|
|
161
|
+
self.fc = nn.Sequential(
|
|
162
|
+
nn.Linear(2 * in_ch, out_ch),
|
|
163
|
+
nn.ReLU(),
|
|
164
|
+
nn.Linear(out_ch, out_ch),
|
|
165
|
+
nn.ReLU())
|
|
166
|
+
self.gap = nn.AdaptiveAvgPool2d(1)
|
|
167
|
+
self.classifier = binary_classifier(out_ch)
|
|
168
|
+
|
|
169
|
+
def forward(self, bg_feat, fg_feat, q_box, c_box, num_bg):
|
|
170
|
+
'''
|
|
171
|
+
:param bg_feat: b,c,h,w
|
|
172
|
+
:param fg_feat: b,c,h,w
|
|
173
|
+
:param q_box: query box, b,4
|
|
174
|
+
:param c_box: cropped bounding box, b,4
|
|
175
|
+
:return:
|
|
176
|
+
'''
|
|
177
|
+
bg_feat = self.gap(bg_feat)
|
|
178
|
+
fg_feat = self.gap(fg_feat)
|
|
179
|
+
bg_vec = bg_feat.flatten(1)
|
|
180
|
+
fg_vec = fg_feat.flatten(1)
|
|
181
|
+
out_vec = self.fc(torch.concat([bg_vec, fg_vec], dim=1))
|
|
182
|
+
out_feat = out_vec.unsqueeze(-1).unsqueeze(-1)
|
|
183
|
+
score = self.classifier(out_feat)
|
|
184
|
+
return out_feat, score
|
|
185
|
+
|
|
186
|
+
class RoIVectorConcatDistillation(nn.Module):
|
|
187
|
+
def __init__(self, in_ch, out_ch, downsample):
|
|
188
|
+
super().__init__()
|
|
189
|
+
self.RoIAlign = RoIAlign(1, 1.0 / 2 ** downsample, -1)
|
|
190
|
+
self.fc = nn.Sequential(
|
|
191
|
+
nn.Linear(2*in_ch, out_ch),
|
|
192
|
+
nn.ReLU(),
|
|
193
|
+
nn.Linear(out_ch, out_ch),
|
|
194
|
+
nn.ReLU())
|
|
195
|
+
self.gap = nn.AdaptiveAvgPool2d(1)
|
|
196
|
+
self.classifier = binary_classifier(out_ch)
|
|
197
|
+
|
|
198
|
+
def forward(self, bg_feat, fg_feat, q_box, c_box, num_bg):
|
|
199
|
+
'''
|
|
200
|
+
:param bg_feat: b,c,h,w
|
|
201
|
+
:param fg_feat: b,c,h,w
|
|
202
|
+
:param q_box: query box, b,4
|
|
203
|
+
:param c_box: cropped bounding box, b,4
|
|
204
|
+
:return:
|
|
205
|
+
'''
|
|
206
|
+
B = bg_feat.shape[0]
|
|
207
|
+
index = torch.arange(B).view(-1, 1).to(q_box.device)
|
|
208
|
+
idx_cbox = torch.cat((index, c_box), dim=-1).contiguous()
|
|
209
|
+
# obtain the feature of cropped background region
|
|
210
|
+
roi_feat = self.RoIAlign(bg_feat, idx_cbox) # b,c,h,w
|
|
211
|
+
bg_vec = roi_feat.flatten(1)
|
|
212
|
+
fg_vec = self.gap(fg_feat).flatten(1)
|
|
213
|
+
out_vec = self.fc(torch.concat([bg_vec, fg_vec], dim=1))
|
|
214
|
+
out_feat = out_vec.unsqueeze(-1).unsqueeze(-1)
|
|
215
|
+
score = self.classifier(out_feat)
|
|
216
|
+
return out_feat, score
|
|
217
|
+
|
|
218
|
+
class StudentModel(nn.Module):
|
|
219
|
+
def __init__(self, cfg, loadweights=True):
|
|
220
|
+
super().__init__()
|
|
221
|
+
assert cfg.backbone == 'vgg19', cfg.backbone
|
|
222
|
+
model = models.vgg19(pretrained=loadweights)
|
|
223
|
+
backbone = model.features
|
|
224
|
+
self.base_dim = 512
|
|
225
|
+
self.bg_encoder = nn.ModuleList([
|
|
226
|
+
nn.Sequential(backbone[:23]),
|
|
227
|
+
nn.Sequential(backbone[23:30]),
|
|
228
|
+
nn.Sequential(backbone[30:])
|
|
229
|
+
])
|
|
230
|
+
backbone_copy = copy.deepcopy(backbone)
|
|
231
|
+
self.fg_encoder = nn.ModuleList([
|
|
232
|
+
nn.Sequential(backbone_copy[:23]),
|
|
233
|
+
nn.Sequential(backbone_copy[23:30]),
|
|
234
|
+
nn.Sequential(backbone_copy[30:])
|
|
235
|
+
])
|
|
236
|
+
self.gap = nn.AdaptiveAvgPool2d(1)
|
|
237
|
+
self.out_dim = cfg.feature_dim
|
|
238
|
+
out_ch = 512
|
|
239
|
+
# branch of feature distillation
|
|
240
|
+
'''
|
|
241
|
+
encoder_feature: gap or roi
|
|
242
|
+
encoder_classify: true or false
|
|
243
|
+
distill_type: roiconcat, roicropresize, gloablconcat, roivectorconcat, gapconcat, onlyclassify, none
|
|
244
|
+
'''
|
|
245
|
+
self.encoder_feat = cfg.encoder_feature
|
|
246
|
+
self.encoder_classify = cfg.encoder_classify
|
|
247
|
+
self.distill_type = cfg.distill_type
|
|
248
|
+
|
|
249
|
+
if self.encoder_classify:
|
|
250
|
+
self.auxiliary_classifier = nn.Sequential(
|
|
251
|
+
nn.Linear(out_ch * 2, out_ch),
|
|
252
|
+
nn.ReLU(),
|
|
253
|
+
nn.Linear(out_ch, 1, bias=False),
|
|
254
|
+
nn.Sigmoid())
|
|
255
|
+
|
|
256
|
+
alignsize, downsample = 7, 5
|
|
257
|
+
self.distill_module = get_distillation_module(self.distill_type,
|
|
258
|
+
out_ch, out_ch,
|
|
259
|
+
alignsize, downsample)
|
|
260
|
+
self.triplet_loss = TripletLoss(cfg.triplet_margin)
|
|
261
|
+
|
|
262
|
+
def forward_bg_encoder(self, bg_im, crop_box):
|
|
263
|
+
bg_f1 = self.bg_encoder[0](bg_im)
|
|
264
|
+
bg_f2 = self.bg_encoder[1](bg_f1)
|
|
265
|
+
bg_f3 = self.bg_encoder[2](bg_f2)
|
|
266
|
+
if self.encoder_feat == 'gap':
|
|
267
|
+
bg_emb = self.gap(bg_f3).flatten(1)
|
|
268
|
+
else:
|
|
269
|
+
bg_emb = self.extract_bg_roi(bg_f3, crop_box)
|
|
270
|
+
return bg_emb
|
|
271
|
+
|
|
272
|
+
def forward_fg_encoder(self, fg_im):
|
|
273
|
+
fg_f1 = self.fg_encoder[0](fg_im)
|
|
274
|
+
fg_f2 = self.fg_encoder[1](fg_f1)
|
|
275
|
+
fg_f3 = self.fg_encoder[2](fg_f2)
|
|
276
|
+
fg_emb = self.gap(fg_f3).flatten(1)
|
|
277
|
+
return fg_emb
|
|
278
|
+
|
|
279
|
+
def extract_bg_roi(self, bg_fm, crop_box):
|
|
280
|
+
# extract background RoI feature
|
|
281
|
+
B = bg_fm.shape[0]
|
|
282
|
+
index = torch.arange(B).view(-1, 1).to(crop_box.device)
|
|
283
|
+
idx_cbox = torch.cat((index, crop_box), dim=-1).contiguous()
|
|
284
|
+
bg_roi = roi_align(bg_fm, idx_cbox, output_size=1,
|
|
285
|
+
spatial_scale=1. / 2 ** 5)
|
|
286
|
+
bg_emb = bg_roi.flatten(1)
|
|
287
|
+
return bg_emb
|
|
288
|
+
|
|
289
|
+
def forward(self, bg_im, fg_im, query_box, crop_box, num_bg=1):
|
|
290
|
+
bg_f1 = self.bg_encoder[0](bg_im)
|
|
291
|
+
bg_f2 = self.bg_encoder[1](bg_f1)
|
|
292
|
+
bg_f3 = self.bg_encoder[2](bg_f2)
|
|
293
|
+
if self.encoder_feat == 'gap':
|
|
294
|
+
self.bg_emb = self.gap(bg_f3).flatten(1)
|
|
295
|
+
else:
|
|
296
|
+
self.bg_emb = self.extract_bg_roi(bg_f3, crop_box)
|
|
297
|
+
|
|
298
|
+
fg_f1 = self.fg_encoder[0](fg_im)
|
|
299
|
+
fg_f2 = self.fg_encoder[1](fg_f1)
|
|
300
|
+
fg_f3 = self.fg_encoder[2](fg_f2)
|
|
301
|
+
self.fg_emb = self.gap(fg_f3).flatten(1)
|
|
302
|
+
|
|
303
|
+
if self.encoder_classify:
|
|
304
|
+
self.aux_score = self.auxiliary_classifier(torch.cat([self.bg_emb, self.fg_emb], dim=1))
|
|
305
|
+
|
|
306
|
+
if self.distill_type == 'none':
|
|
307
|
+
self.distill_feat, self.score = None, torch.empty([])
|
|
308
|
+
else:
|
|
309
|
+
if num_bg == None:
|
|
310
|
+
num_bg = bg_im.shape[0]
|
|
311
|
+
self.distill_feat, self.score = self.distill_module(bg_f3, fg_f3, query_box, crop_box, num_bg)
|
|
312
|
+
self.score = self.score.flatten()
|
|
313
|
+
return self.bg_emb, self.fg_emb, self.score
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def calcu_classify_loss(self, gt_label):
|
|
317
|
+
gt_label = gt_label.reshape(-1,1)
|
|
318
|
+
loss = 0.
|
|
319
|
+
if self.distill_type != 'none':
|
|
320
|
+
pr_score = self.score.reshape(-1,1)
|
|
321
|
+
loss += F.binary_cross_entropy(pr_score, gt_label)
|
|
322
|
+
if self.encoder_classify:
|
|
323
|
+
pr_score2 = self.aux_score.reshape(-1,1)
|
|
324
|
+
loss += F.binary_cross_entropy(pr_score2, gt_label)
|
|
325
|
+
if self.distill_type != 'none':
|
|
326
|
+
loss /= 2
|
|
327
|
+
return loss
|
|
328
|
+
|
|
329
|
+
def calcu_triplet_loss(self, gt_label, num_bg):
|
|
330
|
+
pos_index = (gt_label > 0.5)
|
|
331
|
+
neg_index = (gt_label < 0.5)
|
|
332
|
+
pos_emb, neg_emb = self.fg_emb[pos_index], self.fg_emb[neg_index]
|
|
333
|
+
bg_emb = rearrange(self.bg_emb, '(b n) c -> b n c', b=num_bg)
|
|
334
|
+
bg_emb = bg_emb[:, 0]
|
|
335
|
+
pos_emb = rearrange(pos_emb, '(b n) d -> b n d', b=num_bg)
|
|
336
|
+
neg_emb = rearrange(neg_emb, '(b n) d -> b n d', b=num_bg)
|
|
337
|
+
loss = self.triplet_loss(bg_emb, pos_emb, neg_emb)
|
|
338
|
+
return loss
|
|
339
|
+
|
|
340
|
+
def calcu_distillation_loss(self, feat_list, loss_type='l1'):
|
|
341
|
+
if self.distill_type in ['none', 'onlyclassify']:
|
|
342
|
+
return 0.
|
|
343
|
+
if loss_type.lower() == 'l1':
|
|
344
|
+
loss_func = F.l1_loss
|
|
345
|
+
elif loss_type.lower() == 'l2':
|
|
346
|
+
loss_func = F.mse_loss
|
|
347
|
+
elif loss_type.lower() == 'smoothl1':
|
|
348
|
+
loss_func = F.smooth_l1_loss
|
|
349
|
+
else:
|
|
350
|
+
raise Exception(f'undefined loss type {loss_type}')
|
|
351
|
+
gt_featmap, gt_featvec = feat_list
|
|
352
|
+
if gt_featmap.shape[2:] != self.distill_feat.shape[2:]:
|
|
353
|
+
gt_featmap = F.interpolate(gt_featmap, self.distill_feat.shape[2:])
|
|
354
|
+
kd_loss = loss_func(self.distill_feat, gt_featmap)
|
|
355
|
+
return kd_loss
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import torch
|
|
2
|
+
import torchvision
|
|
3
|
+
from libcom.utils.model_download import download_pretrained_model
|
|
4
|
+
from libcom.utils.process_image import *
|
|
5
|
+
from libcom.utils.environment import *
|
|
6
|
+
from libcom.harmony_score.source.bargainnet import StyleEncoder
|
|
7
|
+
import torch
|
|
8
|
+
import os
|
|
9
|
+
import torchvision.transforms as transforms
|
|
10
|
+
import math
|
|
11
|
+
|
|
12
|
+
cur_dir = os.path.dirname(os.path.abspath(__file__))
|
|
13
|
+
model_dir = os.environ.get('LIBCOM_MODEL_DIR',cur_dir)
|
|
14
|
+
model_set = ['BargainNet']
|
|
15
|
+
|
|
16
|
+
class HarmonyScoreModel:
|
|
17
|
+
"""
|
|
18
|
+
Foreground object search score prediction model.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
device (str | torch.device): gpu id
|
|
22
|
+
model_type (str): predefined model type.
|
|
23
|
+
kwargs (dict): other parameters for building model
|
|
24
|
+
|
|
25
|
+
Examples:
|
|
26
|
+
>>> from libcom import HarmonyScoreModel
|
|
27
|
+
>>> from libcom.utils.process_image import make_image_grid
|
|
28
|
+
>>> import cv2
|
|
29
|
+
>>> net = HarmonyScoreModel(device=0, model_type='BargainNet')
|
|
30
|
+
>>> test_dir = '../tests/harmony_score_prediction/'
|
|
31
|
+
>>> img_names = ['vaulted-cellar-247391_inharm.jpg', 'ameland-5651866_harm.jpg']
|
|
32
|
+
>>> vis_list,scores = [], []
|
|
33
|
+
>>> for img_name in img_names:
|
|
34
|
+
>>> comp_img = test_dir + 'composite/' + img_name
|
|
35
|
+
>>> comp_mask = test_dir + 'composite_mask/' + img_name
|
|
36
|
+
>>> score = net(comp_img, comp_mask)
|
|
37
|
+
>>> vis_list += [comp_img, comp_mask]
|
|
38
|
+
>>> scores.append(score)
|
|
39
|
+
>>> grid_img = make_image_grid(vis_list, text_list=[f'harmony_score:{scores[0]:.2f}', 'composite-mask', f'harmony_score:{scores[1]:.2f}', 'composite-mask'])
|
|
40
|
+
>>> cv2.imwrite('../docs/_static/image/harmonyscore_result1.jpg', grid_img)
|
|
41
|
+
|
|
42
|
+
Expected result:
|
|
43
|
+
|
|
44
|
+
.. image:: _static/image/harmonyscore_result1.jpg
|
|
45
|
+
:scale: 38 %
|
|
46
|
+
|
|
47
|
+
"""
|
|
48
|
+
def __init__(self, device=0, model_type='BargainNet', **kwargs):
|
|
49
|
+
assert model_type in model_set, f'Not implementation for {model_type}'
|
|
50
|
+
self.model_type = model_type
|
|
51
|
+
self.option = kwargs
|
|
52
|
+
weight_path = os.path.join(model_dir, 'pretrained_models', 'BargainNet.pth')
|
|
53
|
+
download_pretrained_model(weight_path)
|
|
54
|
+
self.device = check_gpu_device(device)
|
|
55
|
+
self.build_pretrained_model(weight_path)
|
|
56
|
+
self.build_data_transformer()
|
|
57
|
+
|
|
58
|
+
def build_pretrained_model(self, weight_path):
|
|
59
|
+
model = StyleEncoder(style_dim=16)
|
|
60
|
+
model.load_state_dict(torch.load(weight_path, map_location='cpu', weights_only=True))
|
|
61
|
+
self.model = model.to(self.device).eval()
|
|
62
|
+
|
|
63
|
+
def build_data_transformer(self):
|
|
64
|
+
self.image_size = 256
|
|
65
|
+
self.transform = transforms.Compose([
|
|
66
|
+
transforms.Resize((self.image_size, self.image_size)),
|
|
67
|
+
transforms.ToTensor(),
|
|
68
|
+
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
|
|
69
|
+
])
|
|
70
|
+
self.mask_transform = transforms.Compose([
|
|
71
|
+
transforms.Resize((self.image_size, self.image_size)),
|
|
72
|
+
transforms.ToTensor(),
|
|
73
|
+
])
|
|
74
|
+
|
|
75
|
+
def inputs_preprocess(self, composite_image, composite_mask):
|
|
76
|
+
image = read_image_opencv(composite_image)
|
|
77
|
+
mask = read_mask_opencv(composite_mask)
|
|
78
|
+
fg_mask = mask.astype(np.float32) / 255.
|
|
79
|
+
bg_mask = 1 - fg_mask
|
|
80
|
+
fg_mask = self.mask_transform(Image.fromarray(fg_mask))
|
|
81
|
+
fg_mask = fg_mask.unsqueeze(0).to(self.device)
|
|
82
|
+
bg_mask = self.mask_transform(Image.fromarray(bg_mask))
|
|
83
|
+
bg_mask = bg_mask.unsqueeze(0).to(self.device)
|
|
84
|
+
|
|
85
|
+
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
|
|
86
|
+
image = self.transform(Image.fromarray(image))
|
|
87
|
+
image = image.unsqueeze(0).to(self.device)
|
|
88
|
+
return image, bg_mask, fg_mask
|
|
89
|
+
|
|
90
|
+
def outputs_postprocess(self, bg_style, fg_style):
|
|
91
|
+
eucl_dist = self.Euclidean_distance(bg_style, fg_style)
|
|
92
|
+
# convert distance to harmony level which lies in 0 and 1
|
|
93
|
+
harm_level = math.exp(-0.04212 * eucl_dist)
|
|
94
|
+
return harm_level
|
|
95
|
+
|
|
96
|
+
def Euclidean_distance(self, vec1, vec2):
|
|
97
|
+
vec1 = vec1.cpu().numpy()
|
|
98
|
+
vec2 = vec2.cpu().numpy()
|
|
99
|
+
dist = np.sqrt(np.sum((vec1 - vec2)**2))
|
|
100
|
+
return dist
|
|
101
|
+
|
|
102
|
+
@torch.no_grad()
|
|
103
|
+
def __call__(self, composite_image, composite_mask):
|
|
104
|
+
"""
|
|
105
|
+
Predicting the compatibility score between background and foreground in the given composite image.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
composite_image (str | numpy.ndarray): The path to composite image or the compposite image in ndarray form.
|
|
109
|
+
composite_mask (str | numpy.ndarray): Mask of composite image which indicates the foreground object region in the composite image.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
harmony_score (float): Predicted harmony score within [0,1] between background region and foreground region of the given composite image. Larger harmony score implies more harmonious composite image.
|
|
113
|
+
|
|
114
|
+
"""
|
|
115
|
+
im, bg_mask, fg_mask = self.inputs_preprocess(composite_image, composite_mask)
|
|
116
|
+
bg_style = self.model(im, bg_mask)
|
|
117
|
+
fg_style = self.model(im, fg_mask)
|
|
118
|
+
preds = self.outputs_postprocess(bg_style, fg_style)
|
|
119
|
+
return preds
|
|
File without changes
|