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
libcom/__init__.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from .color_transfer import *
|
|
2
|
+
from .naive_composition import *
|
|
3
|
+
from .opa_score import *
|
|
4
|
+
from .harmony_score import *
|
|
5
|
+
from .inharmonious_region_localization import *
|
|
6
|
+
from .image_harmonization import *
|
|
7
|
+
from .painterly_image_harmonization import *
|
|
8
|
+
from .fopa_heat_map import *
|
|
9
|
+
from .fos_score import *
|
|
10
|
+
from .kontext_blending_harmonization import *
|
|
11
|
+
from .shadow_generation import *
|
|
12
|
+
from .reflection_generation import *
|
|
13
|
+
from .os_insert import *
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
'color_transfer', 'get_composite_image', 'OPAScoreModel',
|
|
17
|
+
'HarmonyScoreModel', 'InharmoniousLocalizationModel',
|
|
18
|
+
'ImageHarmonizationModel', 'PainterlyHarmonizationModel',
|
|
19
|
+
'FOPAHeatMapModel', 'FOSScoreModel',
|
|
20
|
+
'KontextBlendingHarmonizationModel',
|
|
21
|
+
'ShadowGenerationModel', 'ReflectionGenerationModel',
|
|
22
|
+
'OSInsertModel'
|
|
23
|
+
]
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import os
|
|
3
|
+
import cv2
|
|
4
|
+
from libcom.utils.process_image import *
|
|
5
|
+
|
|
6
|
+
def color_transfer(composite_image, composite_mask):
|
|
7
|
+
"""
|
|
8
|
+
Generate composite image through copy-and-paste.
|
|
9
|
+
|
|
10
|
+
Args:
|
|
11
|
+
composite_image (str | numpy.ndarray): The path to composite image or the compposite image in ndarray form.
|
|
12
|
+
composite_mask (str | numpy.ndarray): Mask of composite image which indicates the foreground object region in the composite image.
|
|
13
|
+
|
|
14
|
+
Returns:
|
|
15
|
+
transfered image (numpy.ndarray): Transfered image with the same resolution as input image.
|
|
16
|
+
|
|
17
|
+
Examples:
|
|
18
|
+
>>> from libcom import color_transfer
|
|
19
|
+
>>> from libcom.utils.process_image import make_image_grid
|
|
20
|
+
>>> import cv2
|
|
21
|
+
>>> comp_img1 = '../tests/source/composite/1.jpg'
|
|
22
|
+
>>> comp_mask1 = '../tests/source/composite_mask/1.png'
|
|
23
|
+
>>> trans_img1 = color_transfer(comp_img1, comp_mask1)
|
|
24
|
+
>>> comp_img2 = '../tests/source/composite/8.jpg'
|
|
25
|
+
>>> comp_mask2 = '../tests/source/composite_mask/8.png'
|
|
26
|
+
>>> trans_img2 = color_transfer(comp_img2, comp_mask2)
|
|
27
|
+
>>> # visualization results
|
|
28
|
+
>>> grid_img = make_image_grid([comp_img1, comp_mask1, trans_img1,
|
|
29
|
+
>>> comp_img2, comp_mask2, trans_img2], cols=3)
|
|
30
|
+
>>> cv2.imwrite('../docs/_static/image/colortransfer_result1.jpg', grid_img)
|
|
31
|
+
|
|
32
|
+
Expected result:
|
|
33
|
+
|
|
34
|
+
.. image:: _static/image/colortransfer_result1.jpg
|
|
35
|
+
:scale: 50 %
|
|
36
|
+
|
|
37
|
+
"""
|
|
38
|
+
comp_img = read_image_opencv(composite_image)
|
|
39
|
+
comp_mask = read_mask_opencv(composite_mask)
|
|
40
|
+
if comp_mask.shape[:2] != comp_img.shape[:2]:
|
|
41
|
+
comp_mask = cv2.resize(comp_mask, (comp_img.shape[1], comp_img.shape[0]))
|
|
42
|
+
trans_comp = reinhard(comp_img, comp_mask)
|
|
43
|
+
return trans_comp
|
|
44
|
+
|
|
45
|
+
def reinhard(comp_img, comp_mask):
|
|
46
|
+
# reinhard is a classical color transfer algorithm
|
|
47
|
+
# paper: https://www.cs.tau.ac.il/~turkel/imagepapers/ColorTransfer.pdf
|
|
48
|
+
comp_mask = np.where(comp_mask > 127, 255, 0).astype(np.uint8)
|
|
49
|
+
comp_lab = cv2.cvtColor(comp_img, cv2.COLOR_BGR2Lab)
|
|
50
|
+
bg_mean, bg_std = cv2.meanStdDev(comp_lab, mask=255 - comp_mask)
|
|
51
|
+
fg_mean, fg_std = cv2.meanStdDev(comp_lab, mask=comp_mask)
|
|
52
|
+
ratio = (bg_std / fg_std).reshape(-1)
|
|
53
|
+
offset = (bg_mean - fg_mean * bg_std / fg_std).reshape(-1)
|
|
54
|
+
trans_lab = cv2.convertScaleAbs(comp_lab * ratio + offset)
|
|
55
|
+
trans_img = cv2.cvtColor(trans_lab, cv2.COLOR_Lab2BGR)
|
|
56
|
+
trans_comp = np.where(comp_mask[:,:,np.newaxis] > 127, trans_img, comp_img)
|
|
57
|
+
return trans_comp
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import csv
|
|
2
|
+
import random
|
|
3
|
+
import shutil
|
|
4
|
+
import torch
|
|
5
|
+
from libcom.utils.model_download import download_pretrained_model
|
|
6
|
+
from libcom.utils.process_image import *
|
|
7
|
+
from libcom.utils.environment import *
|
|
8
|
+
import torch
|
|
9
|
+
import os
|
|
10
|
+
import torchvision.transforms as transforms
|
|
11
|
+
|
|
12
|
+
import numpy as np
|
|
13
|
+
from PIL import Image
|
|
14
|
+
import libcom.fopa_heat_map.source.network.ObPlaNet_simple as network
|
|
15
|
+
from libcom.fopa_heat_map.source.data.OBdataset import make_composite_PIL
|
|
16
|
+
from libcom.fopa_heat_map.source.prepare_multi_fg_scales import prepare_multi_fg_scales
|
|
17
|
+
from libcom.fopa_heat_map.source.data.all_transforms import Compose, JointResize
|
|
18
|
+
|
|
19
|
+
cur_dir = os.path.dirname(os.path.abspath(__file__))
|
|
20
|
+
model_dir = os.environ.get('LIBCOM_MODEL_DIR',cur_dir)
|
|
21
|
+
model_set = ['fopa']
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class FOPAHeatMapModel:
|
|
25
|
+
"""
|
|
26
|
+
Generate a heatmap for a pair of scaled foreground and background.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
device (str | torch.device): gpu id
|
|
30
|
+
model_type (str): predefined model type
|
|
31
|
+
|
|
32
|
+
Examples:
|
|
33
|
+
>>> test_set = get_test_list_fopa_heatmap()
|
|
34
|
+
>>> result_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'results', task_name)
|
|
35
|
+
>>> if os.path.exists(result_dir):
|
|
36
|
+
>>> shutil.rmtree(result_dir)
|
|
37
|
+
>>> os.makedirs(result_dir, exist_ok=True)
|
|
38
|
+
>>> os.makedirs(os.path.join(result_dir, 'grid'), exist_ok=True)
|
|
39
|
+
>>> print(f'begin testing {task_name}...')
|
|
40
|
+
>>> net = FOPAHeatMapModel(device=0)
|
|
41
|
+
>>> for pair in test_set[:1]:
|
|
42
|
+
>>> fg_img, fg_mask, bg_img = pair['foreground'], pair['foreground_mask'], pair['background']
|
|
43
|
+
>>> bboxes, heatmaps = net(fg_img, fg_mask, bg_img, cache_dir=os.path.join(result_dir, 'cache'), heatmap_dir=os.path.join(result_dir, 'heatmap'))
|
|
44
|
+
>>> img_name = os.path.basename(bg_img).replace('.png', '.jpg')
|
|
45
|
+
>>> grid_img = make_image_grid([bg_img, fg_img, heatmaps[0]])
|
|
46
|
+
>>> res_path = os.path.join(result_dir, 'grid', img_name)
|
|
47
|
+
>>> cv2.imwrite(res_path, grid_img)
|
|
48
|
+
>>> print('save result to ', res_path)
|
|
49
|
+
>>> print(f'end testing {task_name}!')
|
|
50
|
+
|
|
51
|
+
Expected result:
|
|
52
|
+
|
|
53
|
+
.. image:: _static/image/fopa_heatmap_FOPA_result1.png
|
|
54
|
+
:scale: 72 %
|
|
55
|
+
|
|
56
|
+
.. image:: _static/image/fopa_heatmap_FOPA_result3.png
|
|
57
|
+
:scale: 52 %
|
|
58
|
+
|
|
59
|
+
"""
|
|
60
|
+
def __init__(self, device=0, model_type='fopa', **kwargs):
|
|
61
|
+
|
|
62
|
+
assert model_type in model_set, f'Not implementation for {model_type}'
|
|
63
|
+
self.model_type = model_type
|
|
64
|
+
self.option = kwargs
|
|
65
|
+
self.device = check_gpu_device(device)
|
|
66
|
+
fopa_weight = os.path.join(model_dir, 'pretrained_models', 'FOPA.pth')
|
|
67
|
+
download_pretrained_model(fopa_weight)
|
|
68
|
+
sopa_weight = os.path.join(model_dir, 'pretrained_models', 'SOPA.pth')
|
|
69
|
+
download_pretrained_model(sopa_weight)
|
|
70
|
+
self.build_pretrained_model(sopa_weight, fopa_weight)
|
|
71
|
+
self.build_data_transformer()
|
|
72
|
+
|
|
73
|
+
def build_pretrained_model(self, sopa_weight, fopa_weight):
|
|
74
|
+
model = getattr(network, "ObPlaNet_resnet18")(pretrained=False, weight_path=sopa_weight).to(self.device)
|
|
75
|
+
model.load_state_dict(torch.load(fopa_weight, map_location='cpu'))
|
|
76
|
+
self.model = model.to(self.device).eval()
|
|
77
|
+
|
|
78
|
+
def build_data_transformer(self):
|
|
79
|
+
self.triple_transform = Compose([JointResize(256)])
|
|
80
|
+
self.image_transform = transforms.Compose(
|
|
81
|
+
[transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),]
|
|
82
|
+
)
|
|
83
|
+
self.mask_transform = transforms.ToTensor()
|
|
84
|
+
|
|
85
|
+
def generate_heatmap(self, background_image, csv_path, scaled_fg_dir, scaled_mask_dir, heatmap_dir):
|
|
86
|
+
os.makedirs(heatmap_dir, exist_ok=True)
|
|
87
|
+
heatmap_list = []
|
|
88
|
+
with open(csv_path, mode='r', newline='') as csv_file:
|
|
89
|
+
csv_reader = csv.DictReader(csv_file)
|
|
90
|
+
for row in csv_reader:
|
|
91
|
+
fg_name = '{}_{}_{}_{}.jpg'.format(row["fg_name"].split(".")[0],row["bg_name"].split(".")[0],int(row["newWidth"]),int(row["newHeight"]))
|
|
92
|
+
mask_name = '{}_{}_{}_{}.jpg'.format(row["fg_name"].split(".")[0],row["bg_name"].split(".")[0],int(row["newWidth"]),int(row["newHeight"]))
|
|
93
|
+
scale = row['scale']
|
|
94
|
+
save_name = fg_name.split(".")[0] + '_' + str(scale) + '.jpg'
|
|
95
|
+
|
|
96
|
+
bg_img = read_image_pil(background_image)
|
|
97
|
+
fg_img = read_image_pil(os.path.join(scaled_fg_dir, fg_name))
|
|
98
|
+
mask = read_mask_pil(os.path.join(scaled_mask_dir, mask_name))
|
|
99
|
+
bg_t, fg_t, mask_t = self.triple_transform(bg_img, fg_img, mask)
|
|
100
|
+
mask_t = self.mask_transform(mask_t).to(self.device)
|
|
101
|
+
fg_t = self.image_transform(fg_t).to(self.device)
|
|
102
|
+
bg_t = self.image_transform(bg_t).to(self.device)
|
|
103
|
+
|
|
104
|
+
outs, _ = self.model(bg_t.unsqueeze(0), fg_t.unsqueeze(0), mask_t.unsqueeze(0), 'test')
|
|
105
|
+
outs = torch.softmax(outs, dim=1)[:,1,:,:]
|
|
106
|
+
outs = transforms.ToPILImage()(outs)
|
|
107
|
+
out_file = os.path.join(heatmap_dir, save_name)
|
|
108
|
+
outs.save(out_file)
|
|
109
|
+
heatmap_list.append(out_file)
|
|
110
|
+
return heatmap_list
|
|
111
|
+
|
|
112
|
+
def generate_bounding_box(self, foreground_image, foreground_mask, background_image, csv_path,
|
|
113
|
+
cache_dir, heatmap_dir, fg_scale_num, composite_num_choose, composite_num):
|
|
114
|
+
icount = 0
|
|
115
|
+
with open(csv_path, mode='r', newline='') as csv_file:
|
|
116
|
+
csv_reader = csv.DictReader(csv_file)
|
|
117
|
+
for row in csv_reader:
|
|
118
|
+
scale = row['scale']
|
|
119
|
+
w = int(row['newWidth'])
|
|
120
|
+
h = int(row['newHeight'])
|
|
121
|
+
save_name = row['fg_name'].split(".")[0] + '_' + str(scale) + '.jpg'
|
|
122
|
+
fg_name = '{}_{}_{}_{}.jpg'.format(row["fg_name"].split(".")[0],row["bg_name"].split(".")[0],int(row["newWidth"]),int(row["newHeight"]))
|
|
123
|
+
save_name = fg_name.split(".")[0] + '_' + str(scale) + '.jpg'
|
|
124
|
+
|
|
125
|
+
if icount == 0:
|
|
126
|
+
bg_img = read_image_pil(background_image)
|
|
127
|
+
fg_tocp = read_image_pil(foreground_image)
|
|
128
|
+
mask_tocp = read_image_pil(foreground_mask)
|
|
129
|
+
|
|
130
|
+
composite_dir = os.path.join(cache_dir, f'{fg_scale_num}scales_composite', f'{row["fg_name"].split(".")[0]}_{row["bg_name"].split(".")[0]}')
|
|
131
|
+
os.makedirs(composite_dir, exist_ok=True)
|
|
132
|
+
heatmap_center_list = []
|
|
133
|
+
fg_size_list = []
|
|
134
|
+
|
|
135
|
+
icount += 1
|
|
136
|
+
heatmap = Image.open(os.path.join(heatmap_dir, save_name))
|
|
137
|
+
heatmap = np.array(heatmap)
|
|
138
|
+
heatmap_center = np.zeros_like(heatmap, dtype=np.float64)
|
|
139
|
+
hb = int(h / bg_img.height * heatmap.shape[0] / 2)
|
|
140
|
+
wb = int(w / bg_img.width * heatmap.shape[1] / 2)
|
|
141
|
+
heatmap_center[hb:-hb, wb:-wb] = heatmap[hb:-hb, wb:-wb]
|
|
142
|
+
heatmap_center_list.append(heatmap_center)
|
|
143
|
+
fg_size_list.append((h,w))
|
|
144
|
+
|
|
145
|
+
if icount == fg_scale_num:
|
|
146
|
+
icount = 0
|
|
147
|
+
heatmap_center_stack = np.stack(heatmap_center_list)
|
|
148
|
+
sorted_indices = np.argsort(-heatmap_center_stack, axis=None)
|
|
149
|
+
sorted_indices = np.unravel_index(sorted_indices, heatmap_center_stack.shape)
|
|
150
|
+
|
|
151
|
+
for i in range(composite_num):
|
|
152
|
+
iscale, y_, x_ = sorted_indices[0][i], sorted_indices[1][i], sorted_indices[2][i]
|
|
153
|
+
h, w = fg_size_list[iscale]
|
|
154
|
+
x_ = x_/heatmap.shape[1]*bg_img.width
|
|
155
|
+
y_ = y_/heatmap.shape[0]*bg_img.height
|
|
156
|
+
x = int(x_ - w / 2)
|
|
157
|
+
y = int(y_ - h / 2)
|
|
158
|
+
|
|
159
|
+
composite_img, composite_msk = make_composite_PIL(fg_tocp, mask_tocp, bg_img, [x, y, w, h], return_mask=True)
|
|
160
|
+
save_img_path = os.path.join(composite_dir, f'{row["fg_name"].split(".")[0]}_{row["bg_name"].split(".")[0]}_{x}_{y}_{w}_{h}.jpg')
|
|
161
|
+
save_msk_path = os.path.join(composite_dir, f'{row["fg_name"].split(".")[0]}_{row["bg_name"].split(".")[0]}_{x}_{y}_{w}_{h}.png')
|
|
162
|
+
composite_img.save(save_img_path)
|
|
163
|
+
composite_msk.save(save_msk_path)
|
|
164
|
+
|
|
165
|
+
source_folder = composite_dir
|
|
166
|
+
composite_dir_choose = os.path.join(cache_dir, f'{fg_scale_num}scales_composite_RandomSelect_{composite_num_choose}', f'{row["fg_name"].split(".")[0]}_{row["bg_name"].split(".")[0]}')
|
|
167
|
+
os.makedirs(composite_dir_choose, exist_ok=True)
|
|
168
|
+
|
|
169
|
+
bbox_list = []
|
|
170
|
+
image_files = [f for f in os.listdir(composite_dir) if f.endswith((".jpg"))]
|
|
171
|
+
selected_images = random.sample(image_files, composite_num_choose)
|
|
172
|
+
for image in selected_images:
|
|
173
|
+
source_path = os.path.join(source_folder, image)
|
|
174
|
+
destination_path = os.path.join(composite_dir_choose, image)
|
|
175
|
+
png_source_path = source_path.replace(".jpg", ".png")
|
|
176
|
+
destination_path_png = os.path.join(composite_dir_choose, image.replace(".jpg", ".png"))
|
|
177
|
+
shutil.copyfile(source_path, destination_path)
|
|
178
|
+
shutil.copyfile(png_source_path, destination_path_png)
|
|
179
|
+
bbox_list_parts = os.path.splitext(os.path.split(source_path)[1])[0].split('_')
|
|
180
|
+
x_box, y_box, w_box, h_box = int(bbox_list_parts[2]), int(bbox_list_parts[3]), int(bbox_list_parts[4]), int(bbox_list_parts[5])
|
|
181
|
+
last_four_numbers = [x_box, y_box, w_box, h_box]
|
|
182
|
+
bbox_list.append(last_four_numbers)
|
|
183
|
+
return bbox_list
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
@torch.no_grad()
|
|
187
|
+
def __call__(self, foreground_image, foreground_mask, background_image, cache_dir, heatmap_dir,
|
|
188
|
+
fg_scale_num=16, composite_num_choose=3, composite_num=50):
|
|
189
|
+
"""
|
|
190
|
+
Generate a heatmap for a pair of scaled foreground and background.
|
|
191
|
+
|
|
192
|
+
Args:
|
|
193
|
+
foreground_image: foreground image path
|
|
194
|
+
foreground_mask: foreground mask path
|
|
195
|
+
background_image: background image path
|
|
196
|
+
cache_dir: folder path where scaled foreground images, scaled mask images and composite images are stored
|
|
197
|
+
heatmap_dir: folder path where heatmaps are stored
|
|
198
|
+
fg_scale_num: number of scales of scaled foreground images and mask images
|
|
199
|
+
composite_num_choose: the number of chosen composite images
|
|
200
|
+
composite_num: the number of composite images with the highest score
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
box_list: the path of concatenated background image, foreground image and corresponding heatmap
|
|
204
|
+
heatmap_list: the path of heatmaps
|
|
205
|
+
|
|
206
|
+
"""
|
|
207
|
+
scaled_fg_dir, scaled_mask_dir, csv_file = prepare_multi_fg_scales(cache_dir, foreground_image, foreground_mask, background_image, fg_scale_num)
|
|
208
|
+
heatmap_list = self.generate_heatmap(background_image, csv_file,
|
|
209
|
+
scaled_fg_dir, scaled_mask_dir, heatmap_dir)
|
|
210
|
+
box_list = self.generate_bounding_box(foreground_image, foreground_mask, background_image, csv_file,
|
|
211
|
+
cache_dir, heatmap_dir, fg_scale_num, composite_num_choose, composite_num)
|
|
212
|
+
return box_list, heatmap_list
|
|
File without changes
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# import torchvision.models as models
|
|
2
|
+
# import torch.nn as nn
|
|
3
|
+
# # https://pytorch.org/docs/stable/torchvision/models.html#id3
|
|
4
|
+
#
|
|
5
|
+
import os
|
|
6
|
+
import torch
|
|
7
|
+
import torch.nn as nn
|
|
8
|
+
import torch.utils.model_zoo as model_zoo
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
model_urls = {
|
|
12
|
+
"resnet18": "https://download.pytorch.org/models/resnet18-5c106cde.pth",
|
|
13
|
+
"resnet34": "https://download.pytorch.org/models/resnet34-333f7ec4.pth",
|
|
14
|
+
"resnet50": "https://download.pytorch.org/models/resnet50-19c8e357.pth",
|
|
15
|
+
"resnet101": "https://download.pytorch.org/models/resnet101-5d3b4d8f.pth",
|
|
16
|
+
"resnet152": "https://download.pytorch.org/models/resnet152-b121ed2d.pth",
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
def conv3x3(in_planes, out_planes, stride=1):
|
|
20
|
+
"""3x3 convolution with padding"""
|
|
21
|
+
return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=False)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def conv1x1(in_planes, out_planes, stride=1):
|
|
25
|
+
"""1x1 convolution"""
|
|
26
|
+
return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class BasicBlock(nn.Module):
|
|
30
|
+
expansion = 1
|
|
31
|
+
|
|
32
|
+
def __init__(self, inplanes, planes, stride=1, downsample=None):
|
|
33
|
+
super(BasicBlock, self).__init__()
|
|
34
|
+
self.conv1 = conv3x3(inplanes, planes, stride)
|
|
35
|
+
self.bn1 = nn.BatchNorm2d(planes)
|
|
36
|
+
self.relu = nn.ReLU(inplace=True)
|
|
37
|
+
self.conv2 = conv3x3(planes, planes)
|
|
38
|
+
self.bn2 = nn.BatchNorm2d(planes)
|
|
39
|
+
self.downsample = downsample
|
|
40
|
+
self.stride = stride
|
|
41
|
+
|
|
42
|
+
def forward(self, x):
|
|
43
|
+
identity = x
|
|
44
|
+
|
|
45
|
+
out = self.conv1(x)
|
|
46
|
+
out = self.bn1(out)
|
|
47
|
+
out = self.relu(out)
|
|
48
|
+
|
|
49
|
+
out = self.conv2(out)
|
|
50
|
+
out = self.bn2(out)
|
|
51
|
+
|
|
52
|
+
if self.downsample is not None:
|
|
53
|
+
identity = self.downsample(x)
|
|
54
|
+
|
|
55
|
+
out += identity
|
|
56
|
+
out = self.relu(out)
|
|
57
|
+
|
|
58
|
+
return out
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class Bottleneck(nn.Module):
|
|
62
|
+
expansion = 4
|
|
63
|
+
|
|
64
|
+
def __init__(self, inplanes, planes, stride=1, downsample=None):
|
|
65
|
+
super(Bottleneck, self).__init__()
|
|
66
|
+
self.conv1 = conv1x1(inplanes, planes)
|
|
67
|
+
self.bn1 = nn.BatchNorm2d(planes)
|
|
68
|
+
self.conv2 = conv3x3(planes, planes, stride)
|
|
69
|
+
self.bn2 = nn.BatchNorm2d(planes)
|
|
70
|
+
self.conv3 = conv1x1(planes, planes * self.expansion)
|
|
71
|
+
self.bn3 = nn.BatchNorm2d(planes * self.expansion)
|
|
72
|
+
self.relu = nn.ReLU(inplace=True)
|
|
73
|
+
self.downsample = downsample
|
|
74
|
+
self.stride = stride
|
|
75
|
+
|
|
76
|
+
def forward(self, x):
|
|
77
|
+
identity = x
|
|
78
|
+
|
|
79
|
+
out = self.conv1(x)
|
|
80
|
+
out = self.bn1(out)
|
|
81
|
+
out = self.relu(out)
|
|
82
|
+
|
|
83
|
+
out = self.conv2(out)
|
|
84
|
+
out = self.bn2(out)
|
|
85
|
+
out = self.relu(out)
|
|
86
|
+
|
|
87
|
+
out = self.conv3(out)
|
|
88
|
+
out = self.bn3(out)
|
|
89
|
+
|
|
90
|
+
if self.downsample is not None:
|
|
91
|
+
identity = self.downsample(x)
|
|
92
|
+
|
|
93
|
+
out += identity
|
|
94
|
+
out = self.relu(out)
|
|
95
|
+
|
|
96
|
+
return out
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class ResNet(nn.Module):
|
|
100
|
+
def __init__(self, block, layers, zero_init_residual=False):
|
|
101
|
+
super(ResNet, self).__init__()
|
|
102
|
+
self.inplanes = 64
|
|
103
|
+
self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False)
|
|
104
|
+
self.bn1 = nn.BatchNorm2d(64)
|
|
105
|
+
self.relu = nn.ReLU(inplace=True)
|
|
106
|
+
self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
|
|
107
|
+
self.layer1 = self._make_layer(block, 64, layers[0])
|
|
108
|
+
self.layer2 = self._make_layer(block, 128, layers[1], stride=2)
|
|
109
|
+
self.layer3 = self._make_layer(block, 256, layers[2], stride=2) # 6
|
|
110
|
+
self.layer4 = self._make_layer(block, 512, layers[3], stride=2) # 3
|
|
111
|
+
|
|
112
|
+
for m in self.modules():
|
|
113
|
+
if isinstance(m, nn.Conv2d):
|
|
114
|
+
nn.init.kaiming_normal_(m.weight, mode="fan_out", nonlinearity="relu")
|
|
115
|
+
elif isinstance(m, nn.BatchNorm2d):
|
|
116
|
+
nn.init.constant_(m.weight, 1)
|
|
117
|
+
nn.init.constant_(m.bias, 0)
|
|
118
|
+
|
|
119
|
+
# Zero-initialize the last BN in each residual branch,
|
|
120
|
+
# so that the residual branch starts with zeros, and each residual block behaves like an identity.
|
|
121
|
+
# This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677
|
|
122
|
+
if zero_init_residual:
|
|
123
|
+
for m in self.modules():
|
|
124
|
+
if isinstance(m, Bottleneck):
|
|
125
|
+
nn.init.constant_(m.bn3.weight, 0)
|
|
126
|
+
elif isinstance(m, BasicBlock):
|
|
127
|
+
nn.init.constant_(m.bn2.weight, 0)
|
|
128
|
+
|
|
129
|
+
def _make_layer(self, block, planes, blocks, stride=1):
|
|
130
|
+
downsample = None
|
|
131
|
+
if stride != 1 or self.inplanes != planes * block.expansion:
|
|
132
|
+
downsample = nn.Sequential(
|
|
133
|
+
conv1x1(self.inplanes, planes * block.expansion, stride), nn.BatchNorm2d(planes * block.expansion),
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
layers = []
|
|
137
|
+
layers.append(block(self.inplanes, planes, stride, downsample))
|
|
138
|
+
self.inplanes = planes * block.expansion
|
|
139
|
+
for _ in range(1, blocks):
|
|
140
|
+
layers.append(block(self.inplanes, planes))
|
|
141
|
+
|
|
142
|
+
return nn.Sequential(*layers)
|
|
143
|
+
|
|
144
|
+
def forward(self, x):
|
|
145
|
+
x = self.conv1(x)
|
|
146
|
+
x = self.bn1(x)
|
|
147
|
+
x = self.relu(x)
|
|
148
|
+
x = self.maxpool(x)
|
|
149
|
+
|
|
150
|
+
x = self.layer1(x)
|
|
151
|
+
x = self.layer2(x)
|
|
152
|
+
x = self.layer3(x)
|
|
153
|
+
x = self.layer4(x)
|
|
154
|
+
|
|
155
|
+
return x
|
|
156
|
+
|
|
157
|
+
def resnet18(pretrained=False, **kwargs):
|
|
158
|
+
"""Constructs a ResNet-18 model.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
pretrained (bool): If True, returns a model pre-trained on ImageNet
|
|
162
|
+
"""
|
|
163
|
+
model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs)
|
|
164
|
+
if pretrained:
|
|
165
|
+
pretrained_dict = model_zoo.load_url(model_urls["resnet18"])
|
|
166
|
+
|
|
167
|
+
model_dict = model.state_dict()
|
|
168
|
+
# 1. filter out unnecessary keys
|
|
169
|
+
pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict}
|
|
170
|
+
# 2. overwrite entries in the existing state dict
|
|
171
|
+
model_dict.update(pretrained_dict)
|
|
172
|
+
# 3. load the new state dict
|
|
173
|
+
model.load_state_dict(model_dict)
|
|
174
|
+
return model
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def Backbone_ResNet18_in3(pretrained=True, weight_path=None):
|
|
178
|
+
if pretrained:
|
|
179
|
+
print("The backbone model loads the pretrained parameters...")
|
|
180
|
+
net = pretrained_resnet18_4ch(pretrained=True, weight_path=weight_path)
|
|
181
|
+
div_2 = nn.Sequential(*list(net.children())[:3])
|
|
182
|
+
div_4 = nn.Sequential(*list(net.children())[3:5])
|
|
183
|
+
div_8 = net.layer2
|
|
184
|
+
div_16 = net.layer3
|
|
185
|
+
div_32 = net.layer4
|
|
186
|
+
|
|
187
|
+
return div_2, div_4, div_8, div_16, div_32
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def Backbone_ResNet18_in3_1(pretrained=True):
|
|
191
|
+
if pretrained:
|
|
192
|
+
print("The backbone model loads the pretrained parameters...")
|
|
193
|
+
net = resnet18(pretrained=pretrained)
|
|
194
|
+
|
|
195
|
+
model_dict = net.state_dict()
|
|
196
|
+
conv1 = model_dict['conv1.weight']
|
|
197
|
+
new = torch.zeros(64, 1, 7, 7)
|
|
198
|
+
for i, output_channel in enumerate(conv1):
|
|
199
|
+
new[i] = 0.299 * output_channel[0] + 0.587 * output_channel[1] + 0.114 * output_channel[2]
|
|
200
|
+
net.conv1 = nn.Conv2d(4, 64, kernel_size=(7, 7), stride=(2, 2), padding=3, bias=False)
|
|
201
|
+
model_dict['conv1.weight'] = torch.cat((conv1, new), dim=1)
|
|
202
|
+
net.load_state_dict(model_dict)
|
|
203
|
+
|
|
204
|
+
div_1 = nn.Sequential(*list(net.children())[:1])
|
|
205
|
+
div_2 = nn.Sequential(*list(net.children())[1:3])
|
|
206
|
+
div_4 = nn.Sequential(*list(net.children())[3:5])
|
|
207
|
+
div_8 = net.layer2
|
|
208
|
+
div_16 = net.layer3
|
|
209
|
+
# div_32 = make_layer_4(BasicBlock, 448, 2, stride=2)
|
|
210
|
+
div_32 = net.layer4
|
|
211
|
+
return div_1, div_2, div_4, div_8, div_16, div_32
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def pretrained_resnet18_4ch(pretrained=True, weight_path=None, **kwargs):
|
|
216
|
+
model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs)
|
|
217
|
+
model.conv1 = nn.Conv2d(4, 64, kernel_size=(7, 7), stride=(2, 2), padding=3, bias=False)
|
|
218
|
+
|
|
219
|
+
if pretrained:
|
|
220
|
+
# load the pretrained binary classification model for slow object placement assessment (SOPA)
|
|
221
|
+
# checkpoint = torch.load('./pretrained_models/SOPA.pth.tar')
|
|
222
|
+
current_directory = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
223
|
+
checkpoint = torch.load(weight_path)
|
|
224
|
+
model.load_state_dict(checkpoint['state_dict'], strict=False)
|
|
225
|
+
|
|
226
|
+
return model
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
|
|
File without changes
|