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,292 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
import json
|
|
3
|
+
import os
|
|
4
|
+
import torch
|
|
5
|
+
import numpy as np
|
|
6
|
+
|
|
7
|
+
from PIL import Image
|
|
8
|
+
from torch.utils.data import DataLoader, Dataset
|
|
9
|
+
from torchvision import transforms
|
|
10
|
+
from libcom.fopa_heat_map.source.data.all_transforms import Compose, JointResize
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class CPDataset(Dataset):
|
|
14
|
+
def __init__(self, file, bg_dir, fg_dir, mask_dir, in_size, datatype='train'):
|
|
15
|
+
"""
|
|
16
|
+
initialize dataset
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
file(str): file with training/test data information
|
|
20
|
+
bg_dir(str): folder with background images
|
|
21
|
+
fg_dir(str): folder with foreground images
|
|
22
|
+
mask_dir(str): folder with mask images
|
|
23
|
+
in_size(int): input size of network
|
|
24
|
+
datatype(str): "train" or "test"
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
self.datatype = datatype
|
|
28
|
+
self.data = _collect_info(file, bg_dir, fg_dir, mask_dir, datatype)
|
|
29
|
+
self.insize = in_size
|
|
30
|
+
|
|
31
|
+
self.train_triple_transform = Compose([JointResize(in_size)])
|
|
32
|
+
self.train_img_transform = transforms.Compose(
|
|
33
|
+
[
|
|
34
|
+
transforms.ToTensor(),
|
|
35
|
+
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), # 处理的是Tensor
|
|
36
|
+
]
|
|
37
|
+
)
|
|
38
|
+
self.train_mask_transform = transforms.ToTensor()
|
|
39
|
+
|
|
40
|
+
self.transforms_flip = transforms.Compose([
|
|
41
|
+
transforms.RandomHorizontalFlip(p=1)
|
|
42
|
+
])
|
|
43
|
+
|
|
44
|
+
def __len__(self):
|
|
45
|
+
return len(self.data)
|
|
46
|
+
|
|
47
|
+
def __getitem__(self, index):
|
|
48
|
+
"""
|
|
49
|
+
load each item
|
|
50
|
+
return:
|
|
51
|
+
i: the image index,
|
|
52
|
+
bg_t:(1 * 3 * in_size * in_size) background image,
|
|
53
|
+
mask_t:(1 * 1 * in_size * in_size) scaled foreground mask
|
|
54
|
+
fg_t:(1 * 3 * in_size * in_size) scaled foreground image
|
|
55
|
+
target_t: (1 * in_size * in_size) pixel-wise binary labels
|
|
56
|
+
labels_num: (int) the number of annotated pixels
|
|
57
|
+
"""
|
|
58
|
+
i, _, bg_path, fg_path, mask_path, scale, pos_label, neg_label, fg_path_2, mask_path_2, w, h = self.data[index]
|
|
59
|
+
|
|
60
|
+
fg_name = fg_path.split('/')[-1][:-4]
|
|
61
|
+
## save_name: fg_bg_w_h_scale.jpg
|
|
62
|
+
save_name = fg_name + '_' + str(scale) + '.jpg'
|
|
63
|
+
|
|
64
|
+
bg_img = Image.open(bg_path)
|
|
65
|
+
fg_img = Image.open(fg_path)
|
|
66
|
+
mask = Image.open(mask_path)
|
|
67
|
+
if len(bg_img.split()) != 3:
|
|
68
|
+
bg_img = bg_img.convert("RGB")
|
|
69
|
+
if len(fg_img.split()) == 3:
|
|
70
|
+
fg_img = fg_img.convert("RGB")
|
|
71
|
+
if len(mask.split()) == 3:
|
|
72
|
+
mask = mask.convert("L")
|
|
73
|
+
|
|
74
|
+
is_flip = False
|
|
75
|
+
if self.datatype == 'train' and np.random.uniform() < 0.5:
|
|
76
|
+
is_flip = True
|
|
77
|
+
|
|
78
|
+
# make composite images which are used in feature mimicking
|
|
79
|
+
fg_tocp = Image.open(fg_path_2).convert("RGB")
|
|
80
|
+
mask_tocp = Image.open(mask_path_2).convert("L")
|
|
81
|
+
composite_list = []
|
|
82
|
+
for pos in pos_label:
|
|
83
|
+
x_, y_ = pos
|
|
84
|
+
x = int(x_ - w / 2)
|
|
85
|
+
y = int(y_ - h / 2)
|
|
86
|
+
composite_list.append(make_composite(fg_tocp, mask_tocp, bg_img, [x, y, w, h], is_flip))
|
|
87
|
+
|
|
88
|
+
for pos in neg_label:
|
|
89
|
+
x_, y_ = pos
|
|
90
|
+
x = int(x_ - w / 2)
|
|
91
|
+
y = int(y_ - h / 2)
|
|
92
|
+
composite_list.append(make_composite(fg_tocp, mask_tocp, bg_img, [x, y, w, h], is_flip))
|
|
93
|
+
|
|
94
|
+
composite_list_ = torch.stack(composite_list, dim=0)
|
|
95
|
+
composite_cat = torch.zeros(50 - len(composite_list), 4, 256, 256)
|
|
96
|
+
composite_list = torch.cat((composite_list_, composite_cat), dim=0)
|
|
97
|
+
|
|
98
|
+
# positive pixels are 1, negative pixels are 0, other pixels are 255
|
|
99
|
+
# feature_pos: record the positions of annotated pixels
|
|
100
|
+
target, feature_pos = _obtain_target(bg_img.size[0], bg_img.size[1], self.insize, pos_label, neg_label, is_flip)
|
|
101
|
+
for i in range(50 - len(feature_pos)):
|
|
102
|
+
feature_pos.append((0, 0)) # pad the length to 50
|
|
103
|
+
feature_pos = torch.Tensor(feature_pos)
|
|
104
|
+
|
|
105
|
+
# resize the foreground/background to 256, convert them to tensors
|
|
106
|
+
bg_t, fg_t, mask_t = self.train_triple_transform(bg_img, fg_img, mask)
|
|
107
|
+
mask_t = self.train_mask_transform(mask_t)
|
|
108
|
+
fg_t = self.train_img_transform(fg_t)
|
|
109
|
+
bg_t = self.train_img_transform(bg_t)
|
|
110
|
+
|
|
111
|
+
if is_flip == True:
|
|
112
|
+
fg_t = self.transforms_flip(fg_t)
|
|
113
|
+
bg_t = self.transforms_flip(bg_t)
|
|
114
|
+
mask_t = self.transforms_flip(mask_t)
|
|
115
|
+
|
|
116
|
+
# tensor is normalized to [0,1],map back to [0, 255] for ease of computation
|
|
117
|
+
target_t = self.train_mask_transform(target) * 255
|
|
118
|
+
labels_num = (target_t != 255).sum()
|
|
119
|
+
|
|
120
|
+
return i, bg_t, mask_t, fg_t, target_t.squeeze(), labels_num, composite_list, feature_pos, w, h, save_name
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _obtain_target(original_width, original_height, in_size, pos_label, neg_label, isflip=False):
|
|
124
|
+
"""
|
|
125
|
+
put 0, 1 labels on a 256x256 score map
|
|
126
|
+
Args:
|
|
127
|
+
original_width(int): width of original background
|
|
128
|
+
original_height(int): height of original background
|
|
129
|
+
in_size(int): input size of network
|
|
130
|
+
pos_label(list): positive pixels in original background
|
|
131
|
+
neg_label(list): negative pixels in original background
|
|
132
|
+
return:
|
|
133
|
+
target_r: score map with ground-truth labels
|
|
134
|
+
"""
|
|
135
|
+
target = np.uint8(np.ones((in_size, in_size)) * 255)
|
|
136
|
+
feature_pos = []
|
|
137
|
+
for pos in pos_label:
|
|
138
|
+
x, y = pos
|
|
139
|
+
x_new = int(x * in_size / original_width)
|
|
140
|
+
y_new = int(y * in_size / original_height)
|
|
141
|
+
target[y_new, x_new] = 1.
|
|
142
|
+
if isflip:
|
|
143
|
+
x_new = 256 - x_new
|
|
144
|
+
feature_pos.append((x_new, y_new))
|
|
145
|
+
for pos in neg_label:
|
|
146
|
+
x, y = pos
|
|
147
|
+
x_new = int(x * in_size / original_width)
|
|
148
|
+
y_new = int(y * in_size / original_height)
|
|
149
|
+
target[y_new, x_new] = 0.
|
|
150
|
+
if isflip:
|
|
151
|
+
x_new = 256 - x_new
|
|
152
|
+
feature_pos.append((x_new, y_new))
|
|
153
|
+
target_r = Image.fromarray(target)
|
|
154
|
+
if isflip:
|
|
155
|
+
target_r = transforms.RandomHorizontalFlip(p=1)(target_r)
|
|
156
|
+
return target_r, feature_pos
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _collect_info(json_file, bg_dir, fg_dir, mask_dir, datatype='train'):
|
|
160
|
+
"""
|
|
161
|
+
load json file and return required information
|
|
162
|
+
Args:
|
|
163
|
+
json_file(str): json file with train/test information
|
|
164
|
+
bg_dir(str): folder with background images
|
|
165
|
+
fg_dir(str): folder with foreground images
|
|
166
|
+
mask_dir(str): folder with foreground masks
|
|
167
|
+
datatype(str): "train" or "test"
|
|
168
|
+
return:
|
|
169
|
+
index(int): the sample index
|
|
170
|
+
background image path, foreground image path, foreground mask image
|
|
171
|
+
foreground scale, the locations of positive/negative pixels
|
|
172
|
+
"""
|
|
173
|
+
f_json = json.load(open(json_file, 'r'))
|
|
174
|
+
return [
|
|
175
|
+
(
|
|
176
|
+
index,
|
|
177
|
+
row['scID'].rjust(12,'0'),
|
|
178
|
+
os.path.join(bg_dir, "%012d.jpg" % int(row['scID'])), # background image path
|
|
179
|
+
os.path.join(fg_dir, "{}/{}_{}_{}_{}.jpg".format(datatype, int(row['annID']), int(row['scID']), # scaled foreground image path
|
|
180
|
+
int(row['newWidth']), int(row['newHeight']))),
|
|
181
|
+
|
|
182
|
+
os.path.join(mask_dir, "{}/{}_{}_{}_{}.jpg".format(datatype, int(row['annID']), int(row['scID']), # scaled foreground mask path
|
|
183
|
+
int(row['newWidth']), int(row['newHeight']))),
|
|
184
|
+
row['scale'],
|
|
185
|
+
row['pos_label'], row['neg_label'],
|
|
186
|
+
os.path.join(fg_dir, "foreground/{}.jpg".format(int(row['annID']))), # original foreground image path
|
|
187
|
+
os.path.join(fg_dir, "foreground/mask_{}.jpg".format(int(row['annID']))), # original foreground mask path
|
|
188
|
+
int(row['newWidth']), int(row['newHeight']) # scaled foreground width and height
|
|
189
|
+
)
|
|
190
|
+
for index, row in enumerate(f_json)
|
|
191
|
+
]
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def _to_center(bbox):
|
|
195
|
+
"""conver bbox to center pixel"""
|
|
196
|
+
x, y, width, height = bbox
|
|
197
|
+
return x + width // 2, y + height // 2
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def create_loader(table_path, bg_dir, fg_dir, mask_dir, in_size, datatype, batch_size, num_workers, shuffle):
|
|
201
|
+
dset = CPDataset(table_path, bg_dir, fg_dir, mask_dir, in_size, datatype)
|
|
202
|
+
data_loader = DataLoader(dset, batch_size=batch_size, num_workers=num_workers, shuffle=shuffle)
|
|
203
|
+
|
|
204
|
+
return data_loader
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def make_composite(fg_img, mask_img, bg_img, pos, isflip=False):
|
|
208
|
+
x, y, w, h = pos
|
|
209
|
+
bg_h = bg_img.height
|
|
210
|
+
bg_w = bg_img.width
|
|
211
|
+
# resize foreground to expected size [h, w]
|
|
212
|
+
fg_transform = transforms.Compose([
|
|
213
|
+
transforms.Resize((h, w)),
|
|
214
|
+
transforms.ToTensor(),
|
|
215
|
+
])
|
|
216
|
+
top = max(y, 0)
|
|
217
|
+
bottom = min(y + h, bg_h)
|
|
218
|
+
left = max(x, 0)
|
|
219
|
+
right = min(x + w, bg_w)
|
|
220
|
+
fg_img_ = fg_transform(fg_img)
|
|
221
|
+
mask_img_ = fg_transform(mask_img)
|
|
222
|
+
fg_img = torch.zeros(3, bg_h, bg_w)
|
|
223
|
+
mask_img = torch.zeros(3, bg_h, bg_w)
|
|
224
|
+
fg_img[:, top:bottom, left:right] = fg_img_[:, top - y:bottom - y, left - x:right - x]
|
|
225
|
+
mask_img[:, top:bottom, left:right] = mask_img_[:, top - y:bottom - y, left - x:right - x]
|
|
226
|
+
bg_img = transforms.ToTensor()(bg_img)
|
|
227
|
+
blended = fg_img * mask_img + bg_img * (1 - mask_img)
|
|
228
|
+
com_pic = transforms.ToPILImage()(blended).convert('RGB')
|
|
229
|
+
if isflip == False:
|
|
230
|
+
com_pic = transforms.Compose(
|
|
231
|
+
[
|
|
232
|
+
transforms.Resize((256, 256)),
|
|
233
|
+
transforms.ToTensor()
|
|
234
|
+
]
|
|
235
|
+
)(com_pic)
|
|
236
|
+
mask_img = transforms.ToPILImage()(mask_img).convert('L')
|
|
237
|
+
mask_img = transforms.Compose(
|
|
238
|
+
[
|
|
239
|
+
transforms.Resize((256, 256)),
|
|
240
|
+
transforms.ToTensor()
|
|
241
|
+
]
|
|
242
|
+
)(mask_img)
|
|
243
|
+
com_pic = torch.cat((com_pic, mask_img), dim=0)
|
|
244
|
+
else:
|
|
245
|
+
com_pic = transforms.Compose(
|
|
246
|
+
[
|
|
247
|
+
transforms.Resize((256, 256)),
|
|
248
|
+
transforms.RandomHorizontalFlip(p=1),
|
|
249
|
+
transforms.ToTensor()
|
|
250
|
+
]
|
|
251
|
+
)(com_pic)
|
|
252
|
+
mask_img = transforms.ToPILImage()(mask_img).convert('L')
|
|
253
|
+
mask_img = transforms.Compose(
|
|
254
|
+
[
|
|
255
|
+
transforms.Resize((256, 256)),
|
|
256
|
+
transforms.RandomHorizontalFlip(p=1),
|
|
257
|
+
transforms.ToTensor()
|
|
258
|
+
]
|
|
259
|
+
)(mask_img)
|
|
260
|
+
com_pic = torch.cat((com_pic, mask_img), dim=0)
|
|
261
|
+
return com_pic
|
|
262
|
+
|
|
263
|
+
def make_composite_PIL(fg_img, mask_img, bg_img, pos, return_mask=False):
|
|
264
|
+
x, y, w, h = pos
|
|
265
|
+
bg_h = bg_img.height
|
|
266
|
+
bg_w = bg_img.width
|
|
267
|
+
|
|
268
|
+
top = max(y, 0)
|
|
269
|
+
bottom = min(y + h, bg_h)
|
|
270
|
+
left = max(x, 0)
|
|
271
|
+
right = min(x + w, bg_w)
|
|
272
|
+
fg_img_ = fg_img.resize((w,h))
|
|
273
|
+
mask_img_ = mask_img.resize((w,h))
|
|
274
|
+
|
|
275
|
+
fg_img_ = np.array(fg_img_)
|
|
276
|
+
mask_img_ = np.array(mask_img_, dtype=np.float64)/255
|
|
277
|
+
bg_img = np.array(bg_img)
|
|
278
|
+
|
|
279
|
+
fg_img = np.zeros((bg_h, bg_w, 3), dtype=np.uint8)
|
|
280
|
+
mask_img = np.zeros((bg_h, bg_w, 3), dtype=np.float64)
|
|
281
|
+
|
|
282
|
+
fg_img[top:bottom, left:right, :] = fg_img_[top - y:bottom - y, left - x:right - x, :]
|
|
283
|
+
mask_img[top:bottom, left:right, :] = mask_img_[top - y:bottom - y, left - x:right - x, :]
|
|
284
|
+
composite_img = fg_img * mask_img + bg_img * (1 - mask_img)
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
composite_img = Image.fromarray(composite_img.astype(np.uint8))
|
|
288
|
+
if return_mask==False:
|
|
289
|
+
return composite_img
|
|
290
|
+
else:
|
|
291
|
+
composite_msk = Image.fromarray((mask_img*255).astype(np.uint8))
|
|
292
|
+
return composite_img, composite_msk
|
|
File without changes
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from PIL import Image
|
|
2
|
+
|
|
3
|
+
class JointResize(object):
|
|
4
|
+
def __init__(self, size):
|
|
5
|
+
if isinstance(size, int):
|
|
6
|
+
self.size = (size, size)
|
|
7
|
+
elif isinstance(size, tuple):
|
|
8
|
+
self.size = size
|
|
9
|
+
else:
|
|
10
|
+
raise RuntimeError("size should be int or tuple")
|
|
11
|
+
|
|
12
|
+
def __call__(self, bg, fg, mask):
|
|
13
|
+
bg = bg.resize(self.size, Image.BILINEAR)
|
|
14
|
+
fg = fg.resize(self.size, Image.BILINEAR)
|
|
15
|
+
mask = mask.resize(self.size, Image.NEAREST)
|
|
16
|
+
return bg, fg, mask
|
|
17
|
+
|
|
18
|
+
class Compose(object):
|
|
19
|
+
def __init__(self, transforms):
|
|
20
|
+
self.transforms = transforms
|
|
21
|
+
|
|
22
|
+
def __call__(self, bg, fg, mask):
|
|
23
|
+
for t in self.transforms:
|
|
24
|
+
bg, fg, mask = t(bg, fg, mask)
|
|
25
|
+
return bg, fg, mask
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import torch.nn as nn
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class BasicConv2d(nn.Module):
|
|
5
|
+
def __init__(
|
|
6
|
+
self, in_planes, out_planes, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=False,
|
|
7
|
+
):
|
|
8
|
+
super(BasicConv2d, self).__init__()
|
|
9
|
+
|
|
10
|
+
self.basicconv = nn.Sequential(
|
|
11
|
+
nn.Conv2d(
|
|
12
|
+
in_planes,
|
|
13
|
+
out_planes,
|
|
14
|
+
kernel_size=kernel_size,
|
|
15
|
+
stride=stride,
|
|
16
|
+
padding=padding,
|
|
17
|
+
dilation=dilation,
|
|
18
|
+
groups=groups,
|
|
19
|
+
bias=bias,
|
|
20
|
+
),
|
|
21
|
+
nn.BatchNorm2d(out_planes),
|
|
22
|
+
nn.ReLU(inplace=True),
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
def forward(self, x):
|
|
26
|
+
return self.basicconv(x)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import torch.nn as nn
|
|
2
|
+
import torch.nn.functional as F
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class simpleDFN(nn.Module):
|
|
6
|
+
def __init__(self, in_xC, in_yC, out_C, kernel_size=3, down_factor=4):
|
|
7
|
+
"""use nn.Unfold to realize dynamic convolution
|
|
8
|
+
|
|
9
|
+
Args:
|
|
10
|
+
in_xC (int): channel number of first input
|
|
11
|
+
in_yC (int): channel number of second input
|
|
12
|
+
out_C (int): channel number of output
|
|
13
|
+
kernel_size (int): the size of generated conv kernel
|
|
14
|
+
down_factor (int): reduce the model parameters when generating conv kernel
|
|
15
|
+
"""
|
|
16
|
+
super(simpleDFN, self).__init__()
|
|
17
|
+
self.kernel_size = kernel_size
|
|
18
|
+
self.fuse = nn.Conv2d(in_xC, out_C, 3, 1, 1)
|
|
19
|
+
self.out_C = out_C
|
|
20
|
+
self.gernerate_kernel = nn.Sequential(
|
|
21
|
+
# nn.Conv2d(in_yC, in_yC, 3, 1, 1),
|
|
22
|
+
# DenseLayer(in_yC, in_yC, k=down_factor),
|
|
23
|
+
nn.Conv2d(in_yC, in_xC, 1),
|
|
24
|
+
)
|
|
25
|
+
self.unfold = nn.Unfold(kernel_size=3, dilation=1, padding=1, stride=1)
|
|
26
|
+
self.pool = nn.AdaptiveAvgPool2d(self.kernel_size)
|
|
27
|
+
self.in_planes = in_yC
|
|
28
|
+
|
|
29
|
+
def forward(self, x, y): # x:bg y:fg
|
|
30
|
+
kernel = self.gernerate_kernel(self.pool(y))
|
|
31
|
+
batch_size, in_planes, height, width = x.size()
|
|
32
|
+
x = x.view(1, -1, height, width)
|
|
33
|
+
kernel = kernel.view(-1, 1, self.kernel_size, self.kernel_size)
|
|
34
|
+
if self.kernel_size == 3:
|
|
35
|
+
output = F.conv2d(x, kernel, bias=None, stride=1, padding=1, groups=self.in_planes * batch_size)
|
|
36
|
+
elif self.kernel_size == 1:
|
|
37
|
+
output = F.conv2d(x, kernel, bias=None, stride=1, padding=0, groups=self.in_planes * batch_size)
|
|
38
|
+
elif self.kernel_size == 5:
|
|
39
|
+
output = F.conv2d(x, kernel, bias=None, stride=1, padding=2, groups=self.in_planes * batch_size)
|
|
40
|
+
else:
|
|
41
|
+
output = F.conv2d(x, kernel, bias=None, stride=1, padding=3, groups=self.in_planes * batch_size)
|
|
42
|
+
output = output.view(batch_size, -1, height, width)
|
|
43
|
+
return self.fuse(output)
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import torch
|
|
3
|
+
import torch.nn as nn
|
|
4
|
+
from torchvision import transforms
|
|
5
|
+
|
|
6
|
+
sys.path.append("..")
|
|
7
|
+
from ..backbone.ResNet import Backbone_ResNet18_in3, Backbone_ResNet18_in3_1
|
|
8
|
+
from .BaseBlocks import BasicConv2d
|
|
9
|
+
from .DynamicModules import simpleDFN
|
|
10
|
+
from .tensor_ops import cus_sample, upsample_add
|
|
11
|
+
|
|
12
|
+
class ObPlaNet_resnet18(nn.Module):
|
|
13
|
+
def __init__(self, pretrained=True, ks=3, scale=3, weight_path=None):
|
|
14
|
+
super(ObPlaNet_resnet18, self).__init__()
|
|
15
|
+
self.Eiters = 0
|
|
16
|
+
self.upsample_add = upsample_add
|
|
17
|
+
self.upsample = cus_sample
|
|
18
|
+
self.to_pil = transforms.ToPILImage()
|
|
19
|
+
self.scale = scale
|
|
20
|
+
|
|
21
|
+
self.add_mask = True
|
|
22
|
+
|
|
23
|
+
(
|
|
24
|
+
self.bg_encoder1,
|
|
25
|
+
self.bg_encoder2,
|
|
26
|
+
self.bg_encoder4,
|
|
27
|
+
self.bg_encoder8,
|
|
28
|
+
self.bg_encoder16,
|
|
29
|
+
) = Backbone_ResNet18_in3(pretrained, weight_path)
|
|
30
|
+
|
|
31
|
+
# freeze background encoder
|
|
32
|
+
for p in self.parameters():
|
|
33
|
+
p.requires_grad = False
|
|
34
|
+
|
|
35
|
+
(
|
|
36
|
+
self.fg_encoder1,
|
|
37
|
+
self.fg_encoder2,
|
|
38
|
+
self.fg_encoder4,
|
|
39
|
+
self.fg_encoder8,
|
|
40
|
+
self.fg_encoder16,
|
|
41
|
+
self.fg_encoder32,
|
|
42
|
+
) = Backbone_ResNet18_in3_1(pretrained=pretrained)
|
|
43
|
+
|
|
44
|
+
if self.add_mask:
|
|
45
|
+
self.mask_conv = nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3, bias=False)
|
|
46
|
+
|
|
47
|
+
# dynamic conv
|
|
48
|
+
self.fg_trans16 = nn.Conv2d(512, 64, 1)
|
|
49
|
+
self.fg_trans8 = nn.Conv2d(256, 64, 1)
|
|
50
|
+
self.selfdc_16 = simpleDFN(64, 64, 512, ks, 4)
|
|
51
|
+
self.selfdc_8 = simpleDFN(64, 64, 512, ks, 4)
|
|
52
|
+
|
|
53
|
+
self.upconv16 = BasicConv2d(512, 256, kernel_size=3, stride=1, padding=1)
|
|
54
|
+
self.upconv8 = BasicConv2d(256, 128, kernel_size=3, stride=1, padding=1)
|
|
55
|
+
self.upconv4 = BasicConv2d(128, 64, kernel_size=3, stride=1, padding=1)
|
|
56
|
+
self.upconv2 = BasicConv2d(64, 64, kernel_size=3, stride=1, padding=1)
|
|
57
|
+
self.upconv1 = BasicConv2d(64, 64, kernel_size=3, stride=1, padding=1)
|
|
58
|
+
|
|
59
|
+
self.classifier = nn.Conv2d(512, 2, 1)
|
|
60
|
+
|
|
61
|
+
def forward(self, bg_in_data, fg_in_data, mask_in_data=None, mode='test'):
|
|
62
|
+
"""
|
|
63
|
+
Args:
|
|
64
|
+
bg_in_data: (batch_size * 3 * H * W) background image
|
|
65
|
+
fg_in_data: (batch_size * 3 * H * W) scaled foreground image
|
|
66
|
+
mask_in_data: (batch_size * 1 * H * W) scaled foreground mask
|
|
67
|
+
mode: "train" or "test"
|
|
68
|
+
"""
|
|
69
|
+
if ('train' == mode):
|
|
70
|
+
self.Eiters += 1
|
|
71
|
+
|
|
72
|
+
# extract background and foreground features
|
|
73
|
+
black_mask = torch.zeros(mask_in_data.size()).to(mask_in_data.device)
|
|
74
|
+
bg_in_data_ = torch.cat([bg_in_data, black_mask], dim=1)
|
|
75
|
+
bg_in_data_1 = self.bg_encoder1(bg_in_data_) # torch.Size([2, 64, 128, 128])
|
|
76
|
+
fg_cat_mask = torch.cat([fg_in_data, mask_in_data], dim=1)
|
|
77
|
+
fg_in_data_1 = self.fg_encoder1(fg_cat_mask) # torch.Size([2, 64, 128, 128])
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
bg_in_data_2 = self.bg_encoder2(bg_in_data_1) # torch.Size([2, 64, 64, 64])
|
|
81
|
+
fg_in_data_2 = self.fg_encoder2(fg_in_data_1) # torch.Size([2, 64, 128, 128])
|
|
82
|
+
bg_in_data_4 = self.bg_encoder4(bg_in_data_2) # torch.Size([2, 128, 32, 32])
|
|
83
|
+
fg_in_data_4 = self.fg_encoder4(fg_in_data_2) # torch.Size([2, 64, 64, 64])
|
|
84
|
+
del fg_in_data_1, fg_in_data_2
|
|
85
|
+
|
|
86
|
+
bg_in_data_8 = self.bg_encoder8(bg_in_data_4) # torch.Size([2, 256, 16, 16])
|
|
87
|
+
fg_in_data_8 = self.fg_encoder8(fg_in_data_4) # torch.Size([2, 128, 32, 32])
|
|
88
|
+
bg_in_data_16 = self.bg_encoder16(bg_in_data_8) # torch.Size([2, 512, 8, 8])
|
|
89
|
+
fg_in_data_16 = self.fg_encoder16(fg_in_data_8) # torch.Size([2, 256, 16, 16])
|
|
90
|
+
fg_in_data_32 = self.fg_encoder32(fg_in_data_16) # torch.Size([2, 512, 8, 8])
|
|
91
|
+
|
|
92
|
+
in_data_8_aux = self.fg_trans8(fg_in_data_16) # torch.Size([2, 64, 16, 16])
|
|
93
|
+
in_data_16_aux = self.fg_trans16(fg_in_data_32) # torch.Size([2, 64, 8, 8])
|
|
94
|
+
|
|
95
|
+
# Unet decoder
|
|
96
|
+
bg_out_data_16 = bg_in_data_16 # torch.Size([2, 512, 8, 8])
|
|
97
|
+
|
|
98
|
+
bg_out_data_8 = self.upsample_add(self.upconv16(bg_out_data_16), bg_in_data_8) # torch.Size([2, 256, 16, 16])
|
|
99
|
+
bg_out_data_4 = self.upsample_add(self.upconv8(bg_out_data_8), bg_in_data_4) # torch.Size([2, 128, 32, 32])
|
|
100
|
+
bg_out_data_2 = self.upsample_add(self.upconv4(bg_out_data_4), bg_in_data_2) # torch.Size([2, 64, 64, 64])
|
|
101
|
+
bg_out_data_1 = self.upsample_add(self.upconv2(bg_out_data_2), bg_in_data_1) # torch.Size([2, 64, 128, 128])
|
|
102
|
+
del bg_out_data_2, bg_out_data_4, bg_out_data_8, bg_out_data_16
|
|
103
|
+
|
|
104
|
+
bg_out_data = self.upconv1(self.upsample(bg_out_data_1, scale_factor=2)) # torch.Size([2, 64, 256, 256])
|
|
105
|
+
|
|
106
|
+
# fuse foreground and background features using dynamic conv
|
|
107
|
+
fuse_out = self.upsample_add(self.selfdc_16(bg_out_data_1, in_data_8_aux), \
|
|
108
|
+
self.selfdc_8(bg_out_data, in_data_16_aux)) # torch.Size([2, 64, 256, 256])
|
|
109
|
+
|
|
110
|
+
out_data = self.classifier(fuse_out) # torch.Size([2, 2, 256, 256])
|
|
111
|
+
|
|
112
|
+
return out_data, fuse_out
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .ObPlaNet_simple import *
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import torch
|
|
2
|
+
import torch.nn.functional as F
|
|
3
|
+
|
|
4
|
+
def cus_sample(feat, **kwargs):
|
|
5
|
+
assert len(kwargs.keys()) == 1 and list(kwargs.keys())[0] in ["size", "scale_factor"]
|
|
6
|
+
return F.interpolate(feat, mode="bilinear", align_corners=True,**kwargs)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def upsample_add(*xs):
|
|
10
|
+
y = xs[-1]
|
|
11
|
+
for x in xs[:-1]:
|
|
12
|
+
y = y + F.interpolate(x, size=y.size()[2:], mode="bilinear", align_corners=False)
|
|
13
|
+
return y
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def upsample_cat(*xs):
|
|
17
|
+
y = xs[-1]
|
|
18
|
+
out = []
|
|
19
|
+
for x in xs[:-1]:
|
|
20
|
+
out.append(F.interpolate(x, size=y.size()[2:], mode="bilinear", align_corners=False))
|
|
21
|
+
return torch.cat([out, y], dim=1)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def upsample_reduce(b, a):
|
|
25
|
+
_, C, _, _ = b.size()
|
|
26
|
+
N, _, H, W = a.size()
|
|
27
|
+
|
|
28
|
+
b = F.interpolate(b, size=(H, W), mode="bilinear", align_corners=False)
|
|
29
|
+
a = a.reshape(N, -1, C, H, W).mean(1)
|
|
30
|
+
|
|
31
|
+
return b + a
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def shuffle_channels(x, groups):
|
|
35
|
+
N, C, H, W = x.size()
|
|
36
|
+
x = x.reshape(N, groups, C // groups, H, W).permute(0, 2, 1, 3, 4)
|
|
37
|
+
return x.reshape(N, C, H, W)
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import csv
|
|
3
|
+
import numpy as np
|
|
4
|
+
from PIL import Image
|
|
5
|
+
import cv2
|
|
6
|
+
|
|
7
|
+
fg_scale_num = 16
|
|
8
|
+
|
|
9
|
+
def fill_image_by_mask(image, mask, fill_pixel=0, thresh=127):
|
|
10
|
+
image = np.asarray(image).copy()
|
|
11
|
+
mask = np.asarray(mask)
|
|
12
|
+
fill_img = (np.ones_like(image) * fill_pixel).astype(np.uint8)
|
|
13
|
+
image = np.where(mask > thresh, image, fill_img)
|
|
14
|
+
return Image.fromarray(image)
|
|
15
|
+
|
|
16
|
+
def prepare_multi_fg_scales(cache_dir,fg_path,mask_path,bg_path,fg_scale_num):
|
|
17
|
+
os.makedirs(cache_dir, exist_ok=True)
|
|
18
|
+
fg_name = os.path.splitext(os.path.basename(fg_path))[0]
|
|
19
|
+
bg_name = os.path.splitext(os.path.basename(bg_path))[0]
|
|
20
|
+
fg_scales = list(range(1, fg_scale_num+1))
|
|
21
|
+
fg_scales = [i/(1+fg_scale_num+1) for i in fg_scales]
|
|
22
|
+
|
|
23
|
+
scaled_fg_dir = os.path.join(cache_dir, f'fg_{fg_scale_num}scales')
|
|
24
|
+
scaled_mask_dir = os.path.join(cache_dir, f'mask_{fg_scale_num}scales')
|
|
25
|
+
csv_file = os.path.join(cache_dir, f'{fg_scale_num}scales.csv')
|
|
26
|
+
os.makedirs(scaled_fg_dir, exist_ok=True)
|
|
27
|
+
os.makedirs(scaled_mask_dir, exist_ok=True)
|
|
28
|
+
|
|
29
|
+
file = open(csv_file, mode='w', newline='')
|
|
30
|
+
writer = csv.writer(file)
|
|
31
|
+
csv_head = ['fg_name', 'mask_name', 'bg_name', 'scale', 'newWidth', 'newHeight', 'pos_label', 'neg_label']
|
|
32
|
+
writer.writerow(csv_head)
|
|
33
|
+
|
|
34
|
+
bg_img = Image.open(bg_path).convert("RGB")
|
|
35
|
+
bg_img_aspect = bg_img.height / bg_img.width
|
|
36
|
+
fg_tocp = Image.open(fg_path).convert("RGB")
|
|
37
|
+
mask_tocp = Image.open(mask_path).convert("RGB")
|
|
38
|
+
fg_tocp = fill_image_by_mask(fg_tocp, mask_tocp)
|
|
39
|
+
fg_tocp_aspect = fg_tocp.height / fg_tocp.width
|
|
40
|
+
|
|
41
|
+
for fg_scale in fg_scales:
|
|
42
|
+
if fg_tocp_aspect > bg_img_aspect:
|
|
43
|
+
new_height = int(bg_img.height * fg_scale)
|
|
44
|
+
new_width = int(new_height / fg_tocp.height * fg_tocp.width)
|
|
45
|
+
else:
|
|
46
|
+
new_width = int(bg_img.width * fg_scale)
|
|
47
|
+
new_height = int(new_width / fg_tocp.width * fg_tocp.height)
|
|
48
|
+
|
|
49
|
+
top = int((bg_img.height - new_height) / 2)
|
|
50
|
+
bottom = top + new_height
|
|
51
|
+
left = int((bg_img.width - new_width) / 2)
|
|
52
|
+
right = left + new_width
|
|
53
|
+
|
|
54
|
+
fg_img_ = np.asarray(fg_tocp.resize((new_width, new_height)))
|
|
55
|
+
mask_ = np.asarray(mask_tocp.resize((new_width, new_height)))
|
|
56
|
+
fg_img = np.zeros((bg_img.height, bg_img.width, 3), dtype=np.uint8)
|
|
57
|
+
mask = np.zeros((bg_img.height, bg_img.width, 3), dtype=np.uint8)
|
|
58
|
+
fg_img[top:bottom, left:right, :] = fg_img_
|
|
59
|
+
mask[top:bottom, left:right, :] = mask_
|
|
60
|
+
fg_img = Image.fromarray(fg_img.astype(np.uint8))
|
|
61
|
+
mask = Image.fromarray(mask.astype(np.uint8))
|
|
62
|
+
|
|
63
|
+
basename = f'{fg_name}_{bg_name}_{new_width}_{new_height}.jpg'
|
|
64
|
+
fg_img_path = os.path.join(scaled_fg_dir, basename)
|
|
65
|
+
mask_path = os.path.join(scaled_mask_dir, basename)
|
|
66
|
+
fg_img.save(fg_img_path)
|
|
67
|
+
mask.save(mask_path)
|
|
68
|
+
writer.writerow([os.path.basename(fg_path),
|
|
69
|
+
os.path.basename(mask_path),
|
|
70
|
+
os.path.basename(bg_path),
|
|
71
|
+
fg_scale, new_width, new_height,
|
|
72
|
+
None, None])
|
|
73
|
+
file.close()
|
|
74
|
+
csv_data = []
|
|
75
|
+
with open(csv_file, mode='r') as file:
|
|
76
|
+
reader = csv.DictReader(file)
|
|
77
|
+
for row in reader:
|
|
78
|
+
if row['pos_label']=="":
|
|
79
|
+
row['pos_label'] = [[0,0]]
|
|
80
|
+
if row['neg_label']=="":
|
|
81
|
+
row['neg_label'] = [[0,0]]
|
|
82
|
+
csv_data.append(row)
|
|
83
|
+
return scaled_fg_dir, scaled_mask_dir, csv_file
|
|
84
|
+
|
|
85
|
+
|