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.
Files changed (310) hide show
  1. libcom/__init__.py +23 -0
  2. libcom/color_transfer/__init__.py +3 -0
  3. libcom/color_transfer/reinhard.py +57 -0
  4. libcom/fopa_heat_map/__init__.py +4 -0
  5. libcom/fopa_heat_map/fopa_heat_map.py +212 -0
  6. libcom/fopa_heat_map/source/__init__.py +0 -0
  7. libcom/fopa_heat_map/source/backbone/ResNet.py +229 -0
  8. libcom/fopa_heat_map/source/backbone/__init__.py +0 -0
  9. libcom/fopa_heat_map/source/data/OBdataset.py +292 -0
  10. libcom/fopa_heat_map/source/data/__init__.py +0 -0
  11. libcom/fopa_heat_map/source/data/all_transforms.py +25 -0
  12. libcom/fopa_heat_map/source/network/BaseBlocks.py +26 -0
  13. libcom/fopa_heat_map/source/network/DynamicModules.py +43 -0
  14. libcom/fopa_heat_map/source/network/ObPlaNet_simple.py +112 -0
  15. libcom/fopa_heat_map/source/network/__init__.py +1 -0
  16. libcom/fopa_heat_map/source/network/tensor_ops.py +37 -0
  17. libcom/fopa_heat_map/source/prepare_multi_fg_scales.py +85 -0
  18. libcom/fos_score/__init__.py +4 -0
  19. libcom/fos_score/fos_score_prediction.py +218 -0
  20. libcom/fos_score/source/__init__.py +0 -0
  21. libcom/fos_score/source/config/__init__.py +1 -0
  22. libcom/fos_score/source/config/config.py +68 -0
  23. libcom/fos_score/source/config/config.sfosd.yaml +43 -0
  24. libcom/fos_score/source/config/config_rfosd.yaml +43 -0
  25. libcom/fos_score/source/loss_function.py +118 -0
  26. libcom/fos_score/source/networks.py +355 -0
  27. libcom/harmony_score/__init__.py +3 -0
  28. libcom/harmony_score/harmony_score_prediction.py +119 -0
  29. libcom/harmony_score/source/__init__.py +0 -0
  30. libcom/harmony_score/source/bargainnet.py +226 -0
  31. libcom/image_harmonization/__init__.py +4 -0
  32. libcom/image_harmonization/image_harmonization.py +193 -0
  33. libcom/image_harmonization/source/__init__.py +0 -0
  34. libcom/image_harmonization/source/functions.py +747 -0
  35. libcom/image_harmonization/source/pct_net.py +85 -0
  36. libcom/image_harmonization/source/src/__init__.py +0 -0
  37. libcom/image_harmonization/source/src/lbm/__init__.py +0 -0
  38. libcom/image_harmonization/source/src/lbm/config.py +141 -0
  39. libcom/image_harmonization/source/src/lbm/data/__init__.py +62 -0
  40. libcom/image_harmonization/source/src/lbm/data/datasets/__init__.py +9 -0
  41. libcom/image_harmonization/source/src/lbm/data/datasets/collation_fn.py +41 -0
  42. libcom/image_harmonization/source/src/lbm/data/datasets/dataset.py +243 -0
  43. libcom/image_harmonization/source/src/lbm/data/datasets/datasets_config.py +42 -0
  44. libcom/image_harmonization/source/src/lbm/data/filters/__init__.py +12 -0
  45. libcom/image_harmonization/source/src/lbm/data/filters/base.py +21 -0
  46. libcom/image_harmonization/source/src/lbm/data/filters/filter_wrapper.py +36 -0
  47. libcom/image_harmonization/source/src/lbm/data/filters/filters.py +33 -0
  48. libcom/image_harmonization/source/src/lbm/data/filters/filters_config.py +32 -0
  49. libcom/image_harmonization/source/src/lbm/data/mappers/__init__.py +19 -0
  50. libcom/image_harmonization/source/src/lbm/data/mappers/base.py +26 -0
  51. libcom/image_harmonization/source/src/lbm/data/mappers/mappers.py +135 -0
  52. libcom/image_harmonization/source/src/lbm/data/mappers/mappers_config.py +109 -0
  53. libcom/image_harmonization/source/src/lbm/data/mappers/mappers_wrapper.py +31 -0
  54. libcom/image_harmonization/source/src/lbm/inference/__init__.py +4 -0
  55. libcom/image_harmonization/source/src/lbm/inference/inference.py +70 -0
  56. libcom/image_harmonization/source/src/lbm/inference/utils.py +222 -0
  57. libcom/image_harmonization/source/src/lbm/models/__init__.py +0 -0
  58. libcom/image_harmonization/source/src/lbm/models/base/__init__.py +4 -0
  59. libcom/image_harmonization/source/src/lbm/models/base/base_model.py +66 -0
  60. libcom/image_harmonization/source/src/lbm/models/base/model_config.py +8 -0
  61. libcom/image_harmonization/source/src/lbm/models/embedders/__init__.py +4 -0
  62. libcom/image_harmonization/source/src/lbm/models/embedders/base/__init__.py +4 -0
  63. libcom/image_harmonization/source/src/lbm/models/embedders/base/base_conditioner.py +60 -0
  64. libcom/image_harmonization/source/src/lbm/models/embedders/base/base_conditioner_config.py +27 -0
  65. libcom/image_harmonization/source/src/lbm/models/embedders/conditioners_wrapper.py +114 -0
  66. libcom/image_harmonization/source/src/lbm/models/embedders/latents_concat/__init__.py +4 -0
  67. libcom/image_harmonization/source/src/lbm/models/embedders/latents_concat/latents_concat_embedder_config.py +31 -0
  68. libcom/image_harmonization/source/src/lbm/models/embedders/latents_concat/latents_concat_embedder_model.py +80 -0
  69. libcom/image_harmonization/source/src/lbm/models/lbm/__init__.py +4 -0
  70. libcom/image_harmonization/source/src/lbm/models/lbm/lbm_config.py +101 -0
  71. libcom/image_harmonization/source/src/lbm/models/lbm/lbm_model.py +359 -0
  72. libcom/image_harmonization/source/src/lbm/models/unets/__init__.py +14 -0
  73. libcom/image_harmonization/source/src/lbm/models/unets/unet.py +148 -0
  74. libcom/image_harmonization/source/src/lbm/models/utils.py +377 -0
  75. libcom/image_harmonization/source/src/lbm/models/vae/__init__.py +4 -0
  76. libcom/image_harmonization/source/src/lbm/models/vae/autoencoderKL.py +136 -0
  77. libcom/image_harmonization/source/src/lbm/models/vae/autoencoderKL_config.py +27 -0
  78. libcom/image_harmonization/source/src/lbm/trainer/__init__.py +85 -0
  79. libcom/image_harmonization/source/src/lbm/trainer/loggers.py +324 -0
  80. libcom/image_harmonization/source/src/lbm/trainer/trainer.py +199 -0
  81. libcom/image_harmonization/source/src/lbm/trainer/training_config.py +82 -0
  82. libcom/image_harmonization/source/src/lbm/trainer/utils.py +193 -0
  83. libcom/inharmonious_region_localization/__init__.py +4 -0
  84. libcom/inharmonious_region_localization/inharmonious_region_localization.py +97 -0
  85. libcom/inharmonious_region_localization/source/__init__.py +0 -0
  86. libcom/inharmonious_region_localization/source/blocks.py +368 -0
  87. libcom/inharmonious_region_localization/source/functions.py +679 -0
  88. libcom/inharmonious_region_localization/source/madis_net.py +79 -0
  89. libcom/kontext_blending_harmonization/__init__.py +3 -0
  90. libcom/kontext_blending_harmonization/kontext_blending_harmonization.py +148 -0
  91. libcom/kontext_blending_harmonization/source/__init__.py +0 -0
  92. libcom/kontext_blending_harmonization/source/pipeline.py +1135 -0
  93. libcom/naive_composition/__init__.py +3 -0
  94. libcom/naive_composition/generate_composite_image.py +116 -0
  95. libcom/opa_score/__init__.py +3 -0
  96. libcom/opa_score/opa_score_prediction.py +101 -0
  97. libcom/opa_score/source/__init__.py +3 -0
  98. libcom/opa_score/source/object_place_net.py +55 -0
  99. libcom/opa_score/source/oblect_place_config.py +66 -0
  100. libcom/opa_score/source/resnet_4ch.py +213 -0
  101. libcom/os_insert/__init__.py +3 -0
  102. libcom/os_insert/diffusers_osinsert/__init__.py +78 -0
  103. libcom/os_insert/diffusers_osinsert/_patched_pipeline_flux_fill.py +878 -0
  104. libcom/os_insert/os_insert.py +534 -0
  105. libcom/os_insert/source/__init__.py +1 -0
  106. libcom/os_insert/source/ia_utils.py +183 -0
  107. libcom/os_insert/source/insertanything_infer.py +529 -0
  108. libcom/os_insert/source/ldm/__init__.py +0 -0
  109. libcom/os_insert/source/ldm/data/__init__.py +0 -0
  110. libcom/os_insert/source/ldm/data/base.py +23 -0
  111. libcom/os_insert/source/ldm/data/datamodule.py +128 -0
  112. libcom/os_insert/source/ldm/data/imagenet.py +394 -0
  113. libcom/os_insert/source/ldm/data/lsun.py +92 -0
  114. libcom/os_insert/source/ldm/data/open_images.py +728 -0
  115. libcom/os_insert/source/ldm/lr_scheduler.py +98 -0
  116. libcom/os_insert/source/ldm/models/__init__.py +0 -0
  117. libcom/os_insert/source/ldm/models/autoencoder.py +443 -0
  118. libcom/os_insert/source/ldm/models/diffusion/__init__.py +0 -0
  119. libcom/os_insert/source/ldm/models/diffusion/classifier.py +267 -0
  120. libcom/os_insert/source/ldm/models/diffusion/ddim.py +263 -0
  121. libcom/os_insert/source/ldm/models/diffusion/ddpm.py +1417 -0
  122. libcom/os_insert/source/ldm/models/diffusion/plms.py +252 -0
  123. libcom/os_insert/source/ldm/modules/__init__.py +0 -0
  124. libcom/os_insert/source/ldm/modules/attention.py +261 -0
  125. libcom/os_insert/source/ldm/modules/diffusionmodules/__init__.py +0 -0
  126. libcom/os_insert/source/ldm/modules/diffusionmodules/model.py +835 -0
  127. libcom/os_insert/source/ldm/modules/diffusionmodules/openaimodel.py +1108 -0
  128. libcom/os_insert/source/ldm/modules/diffusionmodules/util.py +267 -0
  129. libcom/os_insert/source/ldm/modules/distributions/__init__.py +0 -0
  130. libcom/os_insert/source/ldm/modules/distributions/distributions.py +92 -0
  131. libcom/os_insert/source/ldm/modules/ema.py +76 -0
  132. libcom/os_insert/source/ldm/modules/encoders/__init__.py +0 -0
  133. libcom/os_insert/source/ldm/modules/encoders/modules.py +190 -0
  134. libcom/os_insert/source/ldm/modules/encoders/xf.py +130 -0
  135. libcom/os_insert/source/ldm/modules/losses/__init__.py +1 -0
  136. libcom/os_insert/source/ldm/modules/losses/contperceptual.py +111 -0
  137. libcom/os_insert/source/ldm/modules/losses/vqperceptual.py +167 -0
  138. libcom/os_insert/source/ldm/modules/x_transformer.py +641 -0
  139. libcom/os_insert/source/ldm/util.py +203 -0
  140. libcom/os_insert/source/objectstitch_data.py +66 -0
  141. libcom/os_insert/source/objectstitch_infer.py +618 -0
  142. libcom/os_insert/source/sam_on_objectstitch.py +253 -0
  143. libcom/os_insert/source/utils.py +41 -0
  144. libcom/os_insert/source/v1.yaml +108 -0
  145. libcom/painterly_image_harmonization/__init__.py +4 -0
  146. libcom/painterly_image_harmonization/painterly_image_harmonization.py +215 -0
  147. libcom/painterly_image_harmonization/source/PHDNet/__init__.py +0 -0
  148. libcom/painterly_image_harmonization/source/PHDNet/networks.py +202 -0
  149. libcom/painterly_image_harmonization/source/PHDNet/phdnet.py +47 -0
  150. libcom/painterly_image_harmonization/source/PHDNet/phdnet_config.py +18 -0
  151. libcom/painterly_image_harmonization/source/PHDiffusion/__init__.py +0 -0
  152. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/__init__.py +0 -0
  153. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/inference_base.py +300 -0
  154. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/lr_scheduler.py +98 -0
  155. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/__init__.py +0 -0
  156. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/autoencoder.py +211 -0
  157. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/diffusion/__init__.py +3 -0
  158. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/diffusion/ddim.py +336 -0
  159. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/diffusion/ddpm.py +1400 -0
  160. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/diffusion/dpm_solver/__init__.py +1 -0
  161. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/diffusion/dpm_solver/dpm_solver.py +1217 -0
  162. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/diffusion/dpm_solver/sampler.py +87 -0
  163. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/diffusion/plms.py +243 -0
  164. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/models/diffusion/scheduling_pndm.py +518 -0
  165. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/__init__.py +0 -0
  166. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/attention.py +378 -0
  167. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/diffusionmodules/__init__.py +0 -0
  168. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/diffusionmodules/model.py +857 -0
  169. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/diffusionmodules/openaimodel.py +823 -0
  170. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/diffusionmodules/util.py +270 -0
  171. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/distributions/__init__.py +0 -0
  172. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/distributions/distributions.py +92 -0
  173. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/ema.py +80 -0
  174. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/encoders/__init__.py +0 -0
  175. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/encoders/adapter.py +213 -0
  176. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/encoders/modules.py +82 -0
  177. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/__init__.py +1 -0
  178. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/api.py +269 -0
  179. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/__init__.py +0 -0
  180. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/api.py +175 -0
  181. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/midas/__init__.py +0 -0
  182. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/midas/base_model.py +16 -0
  183. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/midas/blocks.py +342 -0
  184. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/midas/dpt_depth.py +109 -0
  185. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/midas/midas_net.py +76 -0
  186. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/midas/midas_net_custom.py +128 -0
  187. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/midas/transforms.py +234 -0
  188. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/midas/vit.py +491 -0
  189. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/midas/utils.py +189 -0
  190. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/model_edge.py +653 -0
  191. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/openpose/__init__.py +0 -0
  192. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/openpose/api.py +35 -0
  193. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/openpose/body.py +209 -0
  194. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/openpose/hand.py +75 -0
  195. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/openpose/model.py +178 -0
  196. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/openpose/util.py +203 -0
  197. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/extra_condition/utils.py +72 -0
  198. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/fusion/__init__.py +0 -0
  199. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/fusion/dual_encoder_fusion.py +93 -0
  200. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/image_degradation/__init__.py +2 -0
  201. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/image_degradation/bsrgan.py +730 -0
  202. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/image_degradation/bsrgan_light.py +651 -0
  203. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/modules/image_degradation/utils_image.py +916 -0
  204. libcom/painterly_image_harmonization/source/PHDiffusion/ldm/util.py +200 -0
  205. libcom/painterly_image_harmonization/source/PHDiffusion/stable_diffusion.yaml +75 -0
  206. libcom/painterly_image_harmonization/source/__init__.py +0 -0
  207. libcom/reflection_generation/__init__.py +3 -0
  208. libcom/reflection_generation/reflection_generation.py +174 -0
  209. libcom/reflection_generation/source/PostProcessModel.py +513 -0
  210. libcom/reflection_generation/source/__init__.py +0 -0
  211. libcom/reflection_generation/source/cldm/__init__.py +0 -0
  212. libcom/reflection_generation/source/cldm/base_network.py +166 -0
  213. libcom/reflection_generation/source/cldm/cldm.py +509 -0
  214. libcom/reflection_generation/source/cldm/ddim_hacked.py +317 -0
  215. libcom/reflection_generation/source/cldm/hack.py +111 -0
  216. libcom/reflection_generation/source/cldm/logger.py +127 -0
  217. libcom/reflection_generation/source/cldm/model.py +26 -0
  218. libcom/reflection_generation/source/cldm_v15.yaml +81 -0
  219. libcom/reflection_generation/source/cluster_feature.py +109 -0
  220. libcom/reflection_generation/source/ldm/__init__.py +0 -0
  221. libcom/reflection_generation/source/ldm/models/__init__.py +0 -0
  222. libcom/reflection_generation/source/ldm/models/autoencoder.py +219 -0
  223. libcom/reflection_generation/source/ldm/models/diffusion/__init__.py +0 -0
  224. libcom/reflection_generation/source/ldm/models/diffusion/attention_processor.py +188 -0
  225. libcom/reflection_generation/source/ldm/models/diffusion/ddim.py +340 -0
  226. libcom/reflection_generation/source/ldm/models/diffusion/ddpm.py +1892 -0
  227. libcom/reflection_generation/source/ldm/models/diffusion/dpm_solver/__init__.py +1 -0
  228. libcom/reflection_generation/source/ldm/models/diffusion/dpm_solver/dpm_solver.py +1154 -0
  229. libcom/reflection_generation/source/ldm/models/diffusion/dpm_solver/sampler.py +87 -0
  230. libcom/reflection_generation/source/ldm/models/diffusion/ip_adapter.py +57 -0
  231. libcom/reflection_generation/source/ldm/models/diffusion/plms.py +244 -0
  232. libcom/reflection_generation/source/ldm/models/diffusion/sampling_util.py +22 -0
  233. libcom/reflection_generation/source/ldm/modules/__init__.py +0 -0
  234. libcom/reflection_generation/source/ldm/modules/attention.py +341 -0
  235. libcom/reflection_generation/source/ldm/modules/diffusionmodules/__init__.py +0 -0
  236. libcom/reflection_generation/source/ldm/modules/diffusionmodules/model.py +852 -0
  237. libcom/reflection_generation/source/ldm/modules/diffusionmodules/openaimodel.py +786 -0
  238. libcom/reflection_generation/source/ldm/modules/diffusionmodules/upscaling.py +81 -0
  239. libcom/reflection_generation/source/ldm/modules/diffusionmodules/util.py +280 -0
  240. libcom/reflection_generation/source/ldm/modules/distributions/__init__.py +0 -0
  241. libcom/reflection_generation/source/ldm/modules/distributions/distributions.py +92 -0
  242. libcom/reflection_generation/source/ldm/modules/ema.py +80 -0
  243. libcom/reflection_generation/source/ldm/modules/encoders/__init__.py +0 -0
  244. libcom/reflection_generation/source/ldm/modules/encoders/modules.py +214 -0
  245. libcom/reflection_generation/source/ldm/modules/image_degradation/__init__.py +0 -0
  246. libcom/reflection_generation/source/ldm/modules/image_degradation/bsrgan.py +730 -0
  247. libcom/reflection_generation/source/ldm/modules/image_degradation/bsrgan_light.py +651 -0
  248. libcom/reflection_generation/source/ldm/modules/image_degradation/utils_image.py +916 -0
  249. libcom/reflection_generation/source/ldm/util.py +198 -0
  250. libcom/reflection_generation/source/local_clip.py +749 -0
  251. libcom/reflection_generation/source/tool_add_control.py +49 -0
  252. libcom/shadow_generation/__init__.py +3 -0
  253. libcom/shadow_generation/shadow_generation.py +754 -0
  254. libcom/shadow_generation/source/PostProcessModel.py +511 -0
  255. libcom/shadow_generation/source/__init__.py +0 -0
  256. libcom/shadow_generation/source/attention_processor.py +234 -0
  257. libcom/shadow_generation/source/cldm/__init__.py +0 -0
  258. libcom/shadow_generation/source/cldm/base_network.py +166 -0
  259. libcom/shadow_generation/source/cldm/cldm.py +524 -0
  260. libcom/shadow_generation/source/cldm/model.py +28 -0
  261. libcom/shadow_generation/source/ldm/__init__.py +0 -0
  262. libcom/shadow_generation/source/ldm/models/__init__.py +0 -0
  263. libcom/shadow_generation/source/ldm/models/autoencoder.py +219 -0
  264. libcom/shadow_generation/source/ldm/models/diffusion/__init__.py +0 -0
  265. libcom/shadow_generation/source/ldm/models/diffusion/attention_processor.py +188 -0
  266. libcom/shadow_generation/source/ldm/models/diffusion/ddim.py +340 -0
  267. libcom/shadow_generation/source/ldm/models/diffusion/ddpm.py +1893 -0
  268. libcom/shadow_generation/source/ldm/models/diffusion/dpm_solver/__init__.py +1 -0
  269. libcom/shadow_generation/source/ldm/models/diffusion/dpm_solver/dpm_solver.py +1154 -0
  270. libcom/shadow_generation/source/ldm/models/diffusion/dpm_solver/sampler.py +87 -0
  271. libcom/shadow_generation/source/ldm/models/diffusion/ip_adapter.py +57 -0
  272. libcom/shadow_generation/source/ldm/models/diffusion/plms.py +244 -0
  273. libcom/shadow_generation/source/ldm/models/diffusion/sampling_util.py +22 -0
  274. libcom/shadow_generation/source/ldm/modules/__init__.py +0 -0
  275. libcom/shadow_generation/source/ldm/modules/attention.py +341 -0
  276. libcom/shadow_generation/source/ldm/modules/diffusionmodules/__init__.py +0 -0
  277. libcom/shadow_generation/source/ldm/modules/diffusionmodules/model.py +852 -0
  278. libcom/shadow_generation/source/ldm/modules/diffusionmodules/openaimodel.py +786 -0
  279. libcom/shadow_generation/source/ldm/modules/diffusionmodules/upscaling.py +81 -0
  280. libcom/shadow_generation/source/ldm/modules/diffusionmodules/util.py +270 -0
  281. libcom/shadow_generation/source/ldm/modules/distributions/__init__.py +0 -0
  282. libcom/shadow_generation/source/ldm/modules/distributions/distributions.py +92 -0
  283. libcom/shadow_generation/source/ldm/modules/ema.py +80 -0
  284. libcom/shadow_generation/source/ldm/modules/encoders/__init__.py +0 -0
  285. libcom/shadow_generation/source/ldm/modules/encoders/modules.py +214 -0
  286. libcom/shadow_generation/source/ldm/modules/image_degradation/__init__.py +2 -0
  287. libcom/shadow_generation/source/ldm/modules/image_degradation/bsrgan.py +730 -0
  288. libcom/shadow_generation/source/ldm/modules/image_degradation/bsrgan_light.py +651 -0
  289. libcom/shadow_generation/source/ldm/modules/image_degradation/utils_image.py +916 -0
  290. libcom/shadow_generation/source/ldm/modules/midas/__init__.py +0 -0
  291. libcom/shadow_generation/source/ldm/modules/midas/api.py +170 -0
  292. libcom/shadow_generation/source/ldm/modules/midas/midas/__init__.py +0 -0
  293. libcom/shadow_generation/source/ldm/modules/midas/midas/base_model.py +16 -0
  294. libcom/shadow_generation/source/ldm/modules/midas/midas/blocks.py +342 -0
  295. libcom/shadow_generation/source/ldm/modules/midas/midas/dpt_depth.py +109 -0
  296. libcom/shadow_generation/source/ldm/modules/midas/midas/midas_net.py +76 -0
  297. libcom/shadow_generation/source/ldm/modules/midas/midas/midas_net_custom.py +128 -0
  298. libcom/shadow_generation/source/ldm/modules/midas/midas/transforms.py +234 -0
  299. libcom/shadow_generation/source/ldm/modules/midas/midas/vit.py +491 -0
  300. libcom/shadow_generation/source/ldm/modules/midas/utils.py +189 -0
  301. libcom/shadow_generation/source/ldm/util.py +199 -0
  302. libcom/utils/__init__.py +0 -0
  303. libcom/utils/environment.py +12 -0
  304. libcom/utils/model_download.py +67 -0
  305. libcom/utils/process_image.py +108 -0
  306. libcom-0.1.8.dist-info/METADATA +157 -0
  307. libcom-0.1.8.dist-info/RECORD +310 -0
  308. libcom-0.1.8.dist-info/WHEEL +5 -0
  309. libcom-0.1.8.dist-info/licenses/LICENSE +201 -0
  310. libcom-0.1.8.dist-info/top_level.txt +1 -0
@@ -0,0 +1,355 @@
1
+ import torch
2
+ import torch.nn as nn
3
+ import torch.nn.functional as F
4
+ from torchvision import models
5
+ from einops import rearrange
6
+ import copy
7
+ from .loss_function import TripletLoss
8
+ from torchvision.ops import RoIAlign, roi_align
9
+
10
+ class SingleScaleD(nn.Module):
11
+ def __init__(self, loadweights=False):
12
+ super().__init__()
13
+ model = models.vgg19(pretrained = loadweights)
14
+ self.backbone = model.features
15
+ self.gap = nn.AdaptiveAvgPool2d(1)
16
+ self.fc = nn.Linear(in_features=512, out_features=1, bias=True)
17
+ self.sigmoid = nn.Sigmoid()
18
+
19
+ def forward(self, x):
20
+ f3 = self.backbone[:19](x)
21
+ f4 = self.backbone[19:28](f3)
22
+ f5 = self.backbone[28:](f4)
23
+ fv = self.gap(f5).flatten(1)
24
+ out = self.sigmoid(self.fc(fv)).flatten()
25
+ return [f5, fv], out
26
+
27
+ def conv_relu_x2(in_ch, out_ch):
28
+ convs = nn.Sequential(
29
+ nn.Conv2d(in_ch, out_ch, 3, 1, 1),
30
+ nn.ReLU(),
31
+ nn.Conv2d(out_ch, out_ch, 3, 1, 1),
32
+ nn.ReLU())
33
+ return convs
34
+
35
+ def binary_classifier(in_ch):
36
+ classifier = nn.Sequential(
37
+ nn.AdaptiveAvgPool2d(1),
38
+ nn.Conv2d(in_ch, 1, 1, 1),
39
+ nn.Sigmoid())
40
+ return classifier
41
+
42
+ def get_distillation_module(distill_type, in_ch, out_ch, alignsize, downsample):
43
+ if distill_type == 'roiconcat':
44
+ return RoIConcatDistillation(in_ch, out_ch, alignsize, downsample)
45
+ elif distill_type == 'roicropresize':
46
+ return CropResizeDistillation(in_ch, out_ch, alignsize, downsample)
47
+ elif distill_type == 'gloablconcat':
48
+ return GlobalConcatDistillation(in_ch, out_ch)
49
+ elif distill_type == 'roivectorconcat':
50
+ return RoIVectorConcatDistillation(in_ch, out_ch, downsample)
51
+ elif distill_type in ['gapconcat', 'onlyclassify']:
52
+ return VectorConcatDistillation(in_ch, out_ch)
53
+ else:
54
+ return None
55
+
56
+ class CropResizeDistillation(nn.Module):
57
+ def __init__(self, in_ch, out_ch, alignsize, downsample):
58
+ super().__init__()
59
+ # self.RoIAlign = RoIAlignAvg(alignsize, alignsize, 1.0 / 2 ** downsample)
60
+ self.RoIAlign = RoIAlign(alignsize, 1.0 / 2 ** downsample, -1)
61
+ self.convs = conv_relu_x2(in_ch, out_ch)
62
+ # self.scale = 1.0 / 2 ** downsample
63
+ self.alignsize = alignsize
64
+ self.classifier = binary_classifier(out_ch)
65
+
66
+ def forward(self, bg_feat, fg_feat, q_box, c_box, num_bg):
67
+ '''
68
+ :param bg_feat: b,c,h,w
69
+ :param fg_feat: b,c,h,w
70
+ :param q_box: query box, b,4
71
+ :param c_box: cropped bounding box, b,4
72
+ :return:
73
+ '''
74
+ B = bg_feat.shape[0]
75
+ index = torch.arange(B).view(-1, 1).to(q_box.device)
76
+ idx_cbox = torch.cat((index, c_box), dim=-1).contiguous()
77
+ # obtain the feature of cropped background region
78
+ roi_feat = self.RoIAlign(bg_feat, idx_cbox) # b,c,roi_size,roi_size
79
+ # compute the target bounding box for foreground feature
80
+ tar_box = torch.zeros_like(q_box)
81
+ crop_w = c_box[:,2] - c_box[:,0]
82
+ crop_h = c_box[:,3] - c_box[:,1]
83
+ tar_box[:, 0] = torch.floor((q_box[:,0] - c_box[:,0]) / crop_w * self.alignsize)
84
+ tar_box[:, 1] = torch.floor((q_box[:,1] - c_box[:,1]) / crop_h * self.alignsize)
85
+ tar_box[:, 2] = torch.ceil((q_box[:,2] - c_box[:,0]) / crop_w * self.alignsize)
86
+ tar_box[:, 3] = torch.ceil((q_box[:,3] - c_box[:,1]) / crop_h * self.alignsize)
87
+ tar_box = tar_box.int()
88
+ assert tar_box.min() >= 0 and tar_box.max() <= self.alignsize, \
89
+ f'tar box coordinates max={tar_box.max()}, min={tar_box.min()}'
90
+ # as the target size of foreground feature varies with background image,
91
+ # we separately process different backgrounds.
92
+
93
+ roi_feat = rearrange(roi_feat, '(b n) c h w -> b n c h w', b=num_bg)
94
+ fg_feat = rearrange(fg_feat, '(b n) c h w -> b n c h w', b=num_bg)
95
+ tar_box = rearrange(tar_box, '(b n) d -> b n d', b=num_bg)
96
+
97
+ feat_collect = []
98
+ for i in range(num_bg):
99
+ comp_feat = roi_feat[i].clone()
100
+ per_fg_feat = fg_feat[i]
101
+ x1,y1,x2,y2 = tar_box[i, 0]
102
+ rs_w, rs_h = x2 - x1, y2 - y1
103
+ per_fg_feat = F.interpolate(per_fg_feat, (rs_h, rs_w))
104
+ comp_feat[:, :, y1:y2, x1:x2] = per_fg_feat
105
+ feat_collect.append(comp_feat)
106
+ feat_collect = torch.stack(feat_collect, dim=0)
107
+ feat_collect = rearrange(feat_collect, 'b n c h w -> (b n) c h w')
108
+ out_feat = self.convs(feat_collect)
109
+ score = self.classifier(out_feat)
110
+ return out_feat, score
111
+
112
+ class GlobalConcatDistillation(nn.Module):
113
+ def __init__(self, in_ch, out_ch):
114
+ super().__init__()
115
+ self.convs = conv_relu_x2(in_ch*2, out_ch)
116
+ self.classifier = binary_classifier(out_ch)
117
+
118
+ def forward(self, bg_feat, fg_feat, q_box, c_box, num_bg):
119
+ '''
120
+ :param bg_feat: b,c,h,w
121
+ :param fg_feat: b,c,h,w
122
+ :param q_box: query box, b,4
123
+ :param c_box: cropped bounding box, b,4
124
+ :return:
125
+ '''
126
+ concat_feat = torch.cat([bg_feat, fg_feat], dim=1)
127
+ out_feat = self.convs(concat_feat)
128
+ score = self.classifier(out_feat)
129
+ return out_feat, score
130
+
131
+ class RoIConcatDistillation(nn.Module):
132
+ def __init__(self, in_ch, out_ch, alignsize, downsample):
133
+ super().__init__()
134
+ self.RoIAlign = RoIAlign(alignsize, 1.0 / 2 ** downsample, -1)
135
+ self.convs = conv_relu_x2(in_ch*2, out_ch)
136
+ self.alignsize = alignsize
137
+ self.classifier = binary_classifier(out_ch)
138
+
139
+ def forward(self, bg_feat, fg_feat, q_box, c_box, num_bg):
140
+ '''
141
+ :param bg_feat: b,c,h,w
142
+ :param fg_feat: b,c,h,w
143
+ :param q_box: query box, b,4
144
+ :param c_box: cropped bounding box, b,4
145
+ :return:
146
+ '''
147
+ B = bg_feat.shape[0]
148
+ index = torch.arange(B).view(-1, 1).to(q_box.device)
149
+ idx_cbox = torch.cat((index, c_box), dim=-1).contiguous()
150
+ # obtain the feature of cropped background region
151
+ roi_feat = self.RoIAlign(bg_feat, idx_cbox) # b,c,h,w
152
+ fg_feat_rs = F.interpolate(fg_feat, (self.alignsize, self.alignsize))
153
+ concat_feat = torch.cat([roi_feat, fg_feat_rs], dim=1)
154
+ out_feat = self.convs(concat_feat)
155
+ score = self.classifier(out_feat)
156
+ return out_feat, score
157
+
158
+ class VectorConcatDistillation(nn.Module):
159
+ def __init__(self, in_ch, out_ch):
160
+ super().__init__()
161
+ self.fc = nn.Sequential(
162
+ nn.Linear(2 * in_ch, out_ch),
163
+ nn.ReLU(),
164
+ nn.Linear(out_ch, out_ch),
165
+ nn.ReLU())
166
+ self.gap = nn.AdaptiveAvgPool2d(1)
167
+ self.classifier = binary_classifier(out_ch)
168
+
169
+ def forward(self, bg_feat, fg_feat, q_box, c_box, num_bg):
170
+ '''
171
+ :param bg_feat: b,c,h,w
172
+ :param fg_feat: b,c,h,w
173
+ :param q_box: query box, b,4
174
+ :param c_box: cropped bounding box, b,4
175
+ :return:
176
+ '''
177
+ bg_feat = self.gap(bg_feat)
178
+ fg_feat = self.gap(fg_feat)
179
+ bg_vec = bg_feat.flatten(1)
180
+ fg_vec = fg_feat.flatten(1)
181
+ out_vec = self.fc(torch.concat([bg_vec, fg_vec], dim=1))
182
+ out_feat = out_vec.unsqueeze(-1).unsqueeze(-1)
183
+ score = self.classifier(out_feat)
184
+ return out_feat, score
185
+
186
+ class RoIVectorConcatDistillation(nn.Module):
187
+ def __init__(self, in_ch, out_ch, downsample):
188
+ super().__init__()
189
+ self.RoIAlign = RoIAlign(1, 1.0 / 2 ** downsample, -1)
190
+ self.fc = nn.Sequential(
191
+ nn.Linear(2*in_ch, out_ch),
192
+ nn.ReLU(),
193
+ nn.Linear(out_ch, out_ch),
194
+ nn.ReLU())
195
+ self.gap = nn.AdaptiveAvgPool2d(1)
196
+ self.classifier = binary_classifier(out_ch)
197
+
198
+ def forward(self, bg_feat, fg_feat, q_box, c_box, num_bg):
199
+ '''
200
+ :param bg_feat: b,c,h,w
201
+ :param fg_feat: b,c,h,w
202
+ :param q_box: query box, b,4
203
+ :param c_box: cropped bounding box, b,4
204
+ :return:
205
+ '''
206
+ B = bg_feat.shape[0]
207
+ index = torch.arange(B).view(-1, 1).to(q_box.device)
208
+ idx_cbox = torch.cat((index, c_box), dim=-1).contiguous()
209
+ # obtain the feature of cropped background region
210
+ roi_feat = self.RoIAlign(bg_feat, idx_cbox) # b,c,h,w
211
+ bg_vec = roi_feat.flatten(1)
212
+ fg_vec = self.gap(fg_feat).flatten(1)
213
+ out_vec = self.fc(torch.concat([bg_vec, fg_vec], dim=1))
214
+ out_feat = out_vec.unsqueeze(-1).unsqueeze(-1)
215
+ score = self.classifier(out_feat)
216
+ return out_feat, score
217
+
218
+ class StudentModel(nn.Module):
219
+ def __init__(self, cfg, loadweights=True):
220
+ super().__init__()
221
+ assert cfg.backbone == 'vgg19', cfg.backbone
222
+ model = models.vgg19(pretrained=loadweights)
223
+ backbone = model.features
224
+ self.base_dim = 512
225
+ self.bg_encoder = nn.ModuleList([
226
+ nn.Sequential(backbone[:23]),
227
+ nn.Sequential(backbone[23:30]),
228
+ nn.Sequential(backbone[30:])
229
+ ])
230
+ backbone_copy = copy.deepcopy(backbone)
231
+ self.fg_encoder = nn.ModuleList([
232
+ nn.Sequential(backbone_copy[:23]),
233
+ nn.Sequential(backbone_copy[23:30]),
234
+ nn.Sequential(backbone_copy[30:])
235
+ ])
236
+ self.gap = nn.AdaptiveAvgPool2d(1)
237
+ self.out_dim = cfg.feature_dim
238
+ out_ch = 512
239
+ # branch of feature distillation
240
+ '''
241
+ encoder_feature: gap or roi
242
+ encoder_classify: true or false
243
+ distill_type: roiconcat, roicropresize, gloablconcat, roivectorconcat, gapconcat, onlyclassify, none
244
+ '''
245
+ self.encoder_feat = cfg.encoder_feature
246
+ self.encoder_classify = cfg.encoder_classify
247
+ self.distill_type = cfg.distill_type
248
+
249
+ if self.encoder_classify:
250
+ self.auxiliary_classifier = nn.Sequential(
251
+ nn.Linear(out_ch * 2, out_ch),
252
+ nn.ReLU(),
253
+ nn.Linear(out_ch, 1, bias=False),
254
+ nn.Sigmoid())
255
+
256
+ alignsize, downsample = 7, 5
257
+ self.distill_module = get_distillation_module(self.distill_type,
258
+ out_ch, out_ch,
259
+ alignsize, downsample)
260
+ self.triplet_loss = TripletLoss(cfg.triplet_margin)
261
+
262
+ def forward_bg_encoder(self, bg_im, crop_box):
263
+ bg_f1 = self.bg_encoder[0](bg_im)
264
+ bg_f2 = self.bg_encoder[1](bg_f1)
265
+ bg_f3 = self.bg_encoder[2](bg_f2)
266
+ if self.encoder_feat == 'gap':
267
+ bg_emb = self.gap(bg_f3).flatten(1)
268
+ else:
269
+ bg_emb = self.extract_bg_roi(bg_f3, crop_box)
270
+ return bg_emb
271
+
272
+ def forward_fg_encoder(self, fg_im):
273
+ fg_f1 = self.fg_encoder[0](fg_im)
274
+ fg_f2 = self.fg_encoder[1](fg_f1)
275
+ fg_f3 = self.fg_encoder[2](fg_f2)
276
+ fg_emb = self.gap(fg_f3).flatten(1)
277
+ return fg_emb
278
+
279
+ def extract_bg_roi(self, bg_fm, crop_box):
280
+ # extract background RoI feature
281
+ B = bg_fm.shape[0]
282
+ index = torch.arange(B).view(-1, 1).to(crop_box.device)
283
+ idx_cbox = torch.cat((index, crop_box), dim=-1).contiguous()
284
+ bg_roi = roi_align(bg_fm, idx_cbox, output_size=1,
285
+ spatial_scale=1. / 2 ** 5)
286
+ bg_emb = bg_roi.flatten(1)
287
+ return bg_emb
288
+
289
+ def forward(self, bg_im, fg_im, query_box, crop_box, num_bg=1):
290
+ bg_f1 = self.bg_encoder[0](bg_im)
291
+ bg_f2 = self.bg_encoder[1](bg_f1)
292
+ bg_f3 = self.bg_encoder[2](bg_f2)
293
+ if self.encoder_feat == 'gap':
294
+ self.bg_emb = self.gap(bg_f3).flatten(1)
295
+ else:
296
+ self.bg_emb = self.extract_bg_roi(bg_f3, crop_box)
297
+
298
+ fg_f1 = self.fg_encoder[0](fg_im)
299
+ fg_f2 = self.fg_encoder[1](fg_f1)
300
+ fg_f3 = self.fg_encoder[2](fg_f2)
301
+ self.fg_emb = self.gap(fg_f3).flatten(1)
302
+
303
+ if self.encoder_classify:
304
+ self.aux_score = self.auxiliary_classifier(torch.cat([self.bg_emb, self.fg_emb], dim=1))
305
+
306
+ if self.distill_type == 'none':
307
+ self.distill_feat, self.score = None, torch.empty([])
308
+ else:
309
+ if num_bg == None:
310
+ num_bg = bg_im.shape[0]
311
+ self.distill_feat, self.score = self.distill_module(bg_f3, fg_f3, query_box, crop_box, num_bg)
312
+ self.score = self.score.flatten()
313
+ return self.bg_emb, self.fg_emb, self.score
314
+
315
+
316
+ def calcu_classify_loss(self, gt_label):
317
+ gt_label = gt_label.reshape(-1,1)
318
+ loss = 0.
319
+ if self.distill_type != 'none':
320
+ pr_score = self.score.reshape(-1,1)
321
+ loss += F.binary_cross_entropy(pr_score, gt_label)
322
+ if self.encoder_classify:
323
+ pr_score2 = self.aux_score.reshape(-1,1)
324
+ loss += F.binary_cross_entropy(pr_score2, gt_label)
325
+ if self.distill_type != 'none':
326
+ loss /= 2
327
+ return loss
328
+
329
+ def calcu_triplet_loss(self, gt_label, num_bg):
330
+ pos_index = (gt_label > 0.5)
331
+ neg_index = (gt_label < 0.5)
332
+ pos_emb, neg_emb = self.fg_emb[pos_index], self.fg_emb[neg_index]
333
+ bg_emb = rearrange(self.bg_emb, '(b n) c -> b n c', b=num_bg)
334
+ bg_emb = bg_emb[:, 0]
335
+ pos_emb = rearrange(pos_emb, '(b n) d -> b n d', b=num_bg)
336
+ neg_emb = rearrange(neg_emb, '(b n) d -> b n d', b=num_bg)
337
+ loss = self.triplet_loss(bg_emb, pos_emb, neg_emb)
338
+ return loss
339
+
340
+ def calcu_distillation_loss(self, feat_list, loss_type='l1'):
341
+ if self.distill_type in ['none', 'onlyclassify']:
342
+ return 0.
343
+ if loss_type.lower() == 'l1':
344
+ loss_func = F.l1_loss
345
+ elif loss_type.lower() == 'l2':
346
+ loss_func = F.mse_loss
347
+ elif loss_type.lower() == 'smoothl1':
348
+ loss_func = F.smooth_l1_loss
349
+ else:
350
+ raise Exception(f'undefined loss type {loss_type}')
351
+ gt_featmap, gt_featvec = feat_list
352
+ if gt_featmap.shape[2:] != self.distill_feat.shape[2:]:
353
+ gt_featmap = F.interpolate(gt_featmap, self.distill_feat.shape[2:])
354
+ kd_loss = loss_func(self.distill_feat, gt_featmap)
355
+ return kd_loss
@@ -0,0 +1,3 @@
1
+ from .harmony_score_prediction import HarmonyScoreModel
2
+
3
+ __all__ = ['HarmonyScoreModel']
@@ -0,0 +1,119 @@
1
+ import torch
2
+ import torchvision
3
+ from libcom.utils.model_download import download_pretrained_model
4
+ from libcom.utils.process_image import *
5
+ from libcom.utils.environment import *
6
+ from libcom.harmony_score.source.bargainnet import StyleEncoder
7
+ import torch
8
+ import os
9
+ import torchvision.transforms as transforms
10
+ import math
11
+
12
+ cur_dir = os.path.dirname(os.path.abspath(__file__))
13
+ model_dir = os.environ.get('LIBCOM_MODEL_DIR',cur_dir)
14
+ model_set = ['BargainNet']
15
+
16
+ class HarmonyScoreModel:
17
+ """
18
+ Foreground object search score prediction model.
19
+
20
+ Args:
21
+ device (str | torch.device): gpu id
22
+ model_type (str): predefined model type.
23
+ kwargs (dict): other parameters for building model
24
+
25
+ Examples:
26
+ >>> from libcom import HarmonyScoreModel
27
+ >>> from libcom.utils.process_image import make_image_grid
28
+ >>> import cv2
29
+ >>> net = HarmonyScoreModel(device=0, model_type='BargainNet')
30
+ >>> test_dir = '../tests/harmony_score_prediction/'
31
+ >>> img_names = ['vaulted-cellar-247391_inharm.jpg', 'ameland-5651866_harm.jpg']
32
+ >>> vis_list,scores = [], []
33
+ >>> for img_name in img_names:
34
+ >>> comp_img = test_dir + 'composite/' + img_name
35
+ >>> comp_mask = test_dir + 'composite_mask/' + img_name
36
+ >>> score = net(comp_img, comp_mask)
37
+ >>> vis_list += [comp_img, comp_mask]
38
+ >>> scores.append(score)
39
+ >>> grid_img = make_image_grid(vis_list, text_list=[f'harmony_score:{scores[0]:.2f}', 'composite-mask', f'harmony_score:{scores[1]:.2f}', 'composite-mask'])
40
+ >>> cv2.imwrite('../docs/_static/image/harmonyscore_result1.jpg', grid_img)
41
+
42
+ Expected result:
43
+
44
+ .. image:: _static/image/harmonyscore_result1.jpg
45
+ :scale: 38 %
46
+
47
+ """
48
+ def __init__(self, device=0, model_type='BargainNet', **kwargs):
49
+ assert model_type in model_set, f'Not implementation for {model_type}'
50
+ self.model_type = model_type
51
+ self.option = kwargs
52
+ weight_path = os.path.join(model_dir, 'pretrained_models', 'BargainNet.pth')
53
+ download_pretrained_model(weight_path)
54
+ self.device = check_gpu_device(device)
55
+ self.build_pretrained_model(weight_path)
56
+ self.build_data_transformer()
57
+
58
+ def build_pretrained_model(self, weight_path):
59
+ model = StyleEncoder(style_dim=16)
60
+ model.load_state_dict(torch.load(weight_path, map_location='cpu', weights_only=True))
61
+ self.model = model.to(self.device).eval()
62
+
63
+ def build_data_transformer(self):
64
+ self.image_size = 256
65
+ self.transform = transforms.Compose([
66
+ transforms.Resize((self.image_size, self.image_size)),
67
+ transforms.ToTensor(),
68
+ transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
69
+ ])
70
+ self.mask_transform = transforms.Compose([
71
+ transforms.Resize((self.image_size, self.image_size)),
72
+ transforms.ToTensor(),
73
+ ])
74
+
75
+ def inputs_preprocess(self, composite_image, composite_mask):
76
+ image = read_image_opencv(composite_image)
77
+ mask = read_mask_opencv(composite_mask)
78
+ fg_mask = mask.astype(np.float32) / 255.
79
+ bg_mask = 1 - fg_mask
80
+ fg_mask = self.mask_transform(Image.fromarray(fg_mask))
81
+ fg_mask = fg_mask.unsqueeze(0).to(self.device)
82
+ bg_mask = self.mask_transform(Image.fromarray(bg_mask))
83
+ bg_mask = bg_mask.unsqueeze(0).to(self.device)
84
+
85
+ image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
86
+ image = self.transform(Image.fromarray(image))
87
+ image = image.unsqueeze(0).to(self.device)
88
+ return image, bg_mask, fg_mask
89
+
90
+ def outputs_postprocess(self, bg_style, fg_style):
91
+ eucl_dist = self.Euclidean_distance(bg_style, fg_style)
92
+ # convert distance to harmony level which lies in 0 and 1
93
+ harm_level = math.exp(-0.04212 * eucl_dist)
94
+ return harm_level
95
+
96
+ def Euclidean_distance(self, vec1, vec2):
97
+ vec1 = vec1.cpu().numpy()
98
+ vec2 = vec2.cpu().numpy()
99
+ dist = np.sqrt(np.sum((vec1 - vec2)**2))
100
+ return dist
101
+
102
+ @torch.no_grad()
103
+ def __call__(self, composite_image, composite_mask):
104
+ """
105
+ Predicting the compatibility score between background and foreground in the given composite image.
106
+
107
+ Args:
108
+ composite_image (str | numpy.ndarray): The path to composite image or the compposite image in ndarray form.
109
+ composite_mask (str | numpy.ndarray): Mask of composite image which indicates the foreground object region in the composite image.
110
+
111
+ Returns:
112
+ harmony_score (float): Predicted harmony score within [0,1] between background region and foreground region of the given composite image. Larger harmony score implies more harmonious composite image.
113
+
114
+ """
115
+ im, bg_mask, fg_mask = self.inputs_preprocess(composite_image, composite_mask)
116
+ bg_style = self.model(im, bg_mask)
117
+ fg_style = self.model(im, fg_mask)
118
+ preds = self.outputs_postprocess(bg_style, fg_style)
119
+ return preds
File without changes