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,679 @@
1
+ import math
2
+
3
+ import torch
4
+ import torch.nn.functional as F
5
+ from torch import nn
6
+ from torch.nn import Parameter
7
+ from .blocks import Conv2d_cd, ResNetBlock, Conv2dBlock, Conv2dBlock, BasicBlock, BasicConv
8
+ import numpy as np
9
+ from torchvision import models
10
+
11
+ class SelfAttention(nn.Module):
12
+ """ Self attention Layer"""
13
+ def __init__(self,in_dim, mode='self'):
14
+ super(SelfAttention,self).__init__()
15
+ self.chanel_in = in_dim
16
+
17
+ self.mode = mode
18
+ reduction = 8
19
+ self.query_conv = nn.Conv2d(in_channels = in_dim , out_channels = in_dim//reduction , kernel_size= 1)
20
+ self.key_conv = nn.Conv2d(in_channels = in_dim , out_channels = in_dim//reduction , kernel_size= 1)
21
+ self.value_conv = nn.Conv2d(in_channels = in_dim , out_channels = in_dim , kernel_size= 1)
22
+ self.gamma = nn.Parameter(torch.zeros(1))
23
+ self.D = np.sqrt(in_dim//reduction)
24
+ self.softmax = nn.Softmax(dim=-1) #
25
+
26
+ def forward(self,x, y=None):
27
+ """
28
+ inputs :
29
+ x : input feature maps( B X C X W X H)
30
+ returns :
31
+ out : self attention value + input feature
32
+ attention: B X N X N (N is Width*Height)
33
+ """
34
+ m_batchsize,C,width ,height = x.size()
35
+ proj_query = self.query_conv(x).view(m_batchsize,-1,width*height).permute(0,2,1) # B X CX(N)
36
+ if self.mode == 'self':
37
+ proj_key = self.key_conv(x).view(m_batchsize,-1,width*height) # B X C x (*W*H)
38
+ energy = torch.bmm(proj_query,proj_key) # transpose check
39
+ attention = self.softmax(energy / self.D) # BX (N) X (N)
40
+ proj_value = self.value_conv(x).view(m_batchsize,-1,width*height) # B X C X N
41
+ else:
42
+ proj_key = self.key_conv(y).view(m_batchsize, -1, width*height)
43
+ energy = torch.bmm(proj_query,proj_key) # transpose check
44
+ attention = self.softmax(energy / self.D) # BX (N) X (N)
45
+ proj_value = self.value_conv(y).view(m_batchsize,-1,width*height) # B X C X N
46
+
47
+ out = torch.bmm(proj_value,attention.permute(0,2,1))
48
+ out = out.view(m_batchsize,C,width,height)
49
+
50
+ if self.mode == 'self':
51
+ out = self.gamma*out + x
52
+ else:
53
+ out = torch.cat([out, x],dim=1)
54
+ return out
55
+
56
+
57
+ class Slice(nn.Module):
58
+ def __init__(self):
59
+ super(Slice, self).__init__()
60
+
61
+ def forward(self, bilateral_grid, guidemap, mode='hdr'):
62
+ # Nx12x8x16x16
63
+ device = bilateral_grid.get_device()
64
+ N, _, H, W = guidemap.shape
65
+ hg, wg = torch.meshgrid([torch.arange(0, H), torch.arange(0, W)], indexing='ij') # [0,511] HxW
66
+ if device >= 0:
67
+ hg = hg.to(device)
68
+ wg = wg.to(device)
69
+ hg = hg.float().repeat(N, 1, 1).unsqueeze(3) / (H-1) * 2 - 1 # norm to [-1,1] NxHxWx1
70
+ wg = wg.float().repeat(N, 1, 1).unsqueeze(3) / (W-1) * 2 - 1 # norm to [-1,1] NxHxWx1
71
+ guidemap = guidemap.permute(0,2,3,1).contiguous()
72
+ guidemap_guide = torch.cat([hg, wg, guidemap], dim=3).unsqueeze(1) # Nx1xHxWx3
73
+ coeff = F.grid_sample(bilateral_grid, guidemap_guide, 'bilinear', align_corners=True) # Nx12xHxW
74
+ return coeff.squeeze(2)
75
+
76
+ class ApplyCoeffs(nn.Module):
77
+ def __init__(self, use_norm=False):
78
+ super(ApplyCoeffs, self).__init__()
79
+ self.use_norm = use_norm
80
+
81
+ def denormalize(self, x, isMask=False):
82
+ if isMask:
83
+ mean = 0
84
+ std=1
85
+ else:
86
+ mean = torch.zeros_like(x)
87
+ mean[:,0,:,:] = .485
88
+ mean[:,1,:,:] = .456
89
+ mean[:,2,:,:] = .406
90
+ std = torch.zeros_like(x)
91
+ std[:,0,:,:] = 0.229
92
+ std[:,1,:,:] = 0.224
93
+ std[:,2,:,:] = 0.225
94
+ x = (x*std + mean) #*255
95
+ return x # change the range into [0,1]
96
+
97
+ def norm(self, x):
98
+ mean = torch.zeros_like(x)
99
+ mean[:,0,:,:] = .485
100
+ mean[:,1,:,:] = .456
101
+ mean[:,2,:,:] = .406
102
+ std = torch.zeros_like(x)
103
+ std[:,0,:,:] = 0.229
104
+ std[:,1,:,:] = 0.224
105
+ std[:,2,:,:] = 0.225
106
+ x = (x - mean) / std #*255
107
+ return x
108
+
109
+ def forward(self, coeff, full_res_input):
110
+ '''
111
+ Affine:
112
+ r = a11*r + a12*g + a13*b + a14
113
+ g = a21*r + a22*g + a23*b + a24
114
+ ...
115
+ '''
116
+ full_res_input = self.denormalize(full_res_input)
117
+ # coeff[:,:,:20] = coeff[:,:,50:70]
118
+ R = torch.sum(full_res_input * coeff[:, 0:3, :, :], dim=1, keepdim=True) + coeff[:, 3:4, :, :]
119
+ G = torch.sum(full_res_input * coeff[:, 4:7, :, :], dim=1, keepdim=True) + coeff[:, 7:8, :, :]
120
+ B = torch.sum(full_res_input * coeff[:, 8:11, :, :], dim=1, keepdim=True) + coeff[:, 11:12, :, :]
121
+
122
+ # return self.norm(torch.cat([R, G, B], dim=1))
123
+ if self.use_norm:
124
+ return self.norm(torch.cat([R, G, B], dim=1))
125
+ else:
126
+ return torch.cat([R, G, B], dim=1)
127
+
128
+ class GuideNN(nn.Module):
129
+ def __init__(self, params=None):
130
+ super(GuideNN, self).__init__()
131
+ self.params = params
132
+ self.conv1 = Conv2dBlock(3, 16, ks=1, st=1, padding=0, norm='bn')
133
+ self.conv2 = Conv2dBlock(16, 1, ks=1, st=1, padding=0, norm='none', activation='tanh') #nn.Tanh, nn.Sigmoid
134
+
135
+ def forward(self, x):
136
+ return self.conv2(self.conv1(x))#.squeeze(1)
137
+
138
+ class Coeffs(nn.Module):
139
+ def __init__(self, nin=4, nout=3, params=None):
140
+ super(Coeffs, self).__init__()
141
+ self.params = params
142
+ self.nin = nin
143
+ self.nout = nout
144
+
145
+ lb = params['luma_bins']
146
+ cm = params['channel_multiplier']
147
+ sb = params['spatial_bin']
148
+ bn = params['batch_norm']
149
+
150
+ theta = params['theta']
151
+ nsize = params['net_input_size']
152
+ self.relu = nn.ReLU()
153
+
154
+ # splat features
155
+ n_layers_splat = int(np.log2(nsize/sb))
156
+ self.splat_features = nn.ModuleList()
157
+ self.lp_features = nn.ModuleList()
158
+ prev_ch = 3 #3
159
+ # Downsample
160
+ for i in range(n_layers_splat):
161
+ use_bn = bn if i > 0 else False
162
+ self.splat_features.append(Conv2d_cd(prev_ch, cm*(2**i)*lb, 3, 1, 1, use_bn=use_bn, actv='relu', theta=theta))
163
+ self.splat_features.append(nn.MaxPool2d(2,2,0))
164
+ prev_ch = splat_ch = cm*(2**i)*lb
165
+ # ResNet Blocks
166
+ self.res_blks = nn.ModuleList()
167
+ for i in range(3):
168
+ self.res_blks.append(ResNetBlock(prev_ch, prev_ch))
169
+ #Self-attention
170
+ self.sa = SelfAttention(prev_ch)
171
+
172
+ self.conv_out = nn.Sequential(*[
173
+ Conv2dBlock(prev_ch, 8*cm*lb, ks=3, st=1, padding=1, norm='bn'),
174
+ Conv2dBlock(8*cm*lb, lb*nin*nout, ks=1, st=1, padding=0, norm='none', activation='none')
175
+ ])
176
+
177
+ # predicton
178
+ self.conv_out = Conv2dBlock(8*cm*lb, lb*nout*nin, ks=1, st=1, padding=0, norm='none', activation='none')
179
+
180
+
181
+ def forward(self, lowres_input):
182
+ params = self.params
183
+ bs = lowres_input.shape[0]
184
+ lb = params['luma_bins']
185
+ cm = params['channel_multiplier']
186
+ sb = params['spatial_bin']
187
+
188
+ x = lowres_input
189
+ for layer in self.splat_features:
190
+ x = layer(x)
191
+
192
+ for layer in self.res_blks:
193
+ x = layer(x)
194
+
195
+ x = self.sa(x)
196
+ x = self.conv_out(x) # 1,96,16,16
197
+
198
+ s = x.shape
199
+ y = torch.stack(torch.split(x, self.nin*self.nout, 1),2) # B x Coefs x Luma x Spatial x Spatial -> (B, 12,8,16,16)
200
+ return y
201
+
202
+
203
+ class HDRPointwiseNN(nn.Module):
204
+
205
+ def __init__(self, opt):
206
+ super(HDRPointwiseNN, self).__init__()
207
+ params = {'luma_bins':opt.luma_bins, 'channel_multiplier':opt.channel_multiplier, 'spatial_bin':opt.spatial_bin,
208
+ 'batch_norm':opt.batch_norm, 'net_input_size':opt.net_input_size, 'theta':opt.theta}
209
+ self.coeffs = Coeffs(params=params)
210
+ self.guide = GuideNN(params=params)
211
+ self.slice = Slice()
212
+ self.apply_coeffs = ApplyCoeffs()
213
+
214
+ self.mean = [.485, .456, .406]
215
+ self.std = [.229, .224, .225]
216
+ self.max_val = [(1-m)/s for m,s in zip(self.mean, self.std)]
217
+ self.min_val = [(0-m)/s for m,s in zip(self.mean, self.std)]
218
+
219
+ def clip(self, x):
220
+ y = x.new(x.size())
221
+ for i in range(3):
222
+ y[:,i,:,:] = torch.clamp(x[:,i,:,:], min=self.min_val[i], max=self.max_val[i])
223
+ return y
224
+
225
+ def norm(self, x):
226
+ mean = torch.zeros_like(x)
227
+ mean[:,0,:,:] = .485
228
+ mean[:,1,:,:] = .456
229
+ mean[:,2,:,:] = .406
230
+ std = torch.zeros_like(x)
231
+ std[:,0,:,:] = 0.229
232
+ std[:,1,:,:] = 0.224
233
+ std[:,2,:,:] = 0.225
234
+ x = (x - mean) / std #*255
235
+ return x
236
+
237
+ def forward(self, lowres, fullres):
238
+ coeffs = self.coeffs(lowres)
239
+ guide = self.guide(fullres)
240
+ slice_coeffs = self.slice(coeffs, guide)
241
+ illu_out = self.apply_coeffs(slice_coeffs, fullres).sigmoid()
242
+
243
+ out = self.clip(illu_out)
244
+ return out, guide
245
+
246
+
247
+ ## ---------------------Bi-directional Feature Integration -----------------
248
+ class BidirectionFeatureIntegration(nn.Module):
249
+ def __init__(self, in_ch_list, out_ch=64, fusion_mode='h2l'):
250
+ super(BidirectionFeatureIntegration, self).__init__()
251
+ self.n_input = len(in_ch_list)
252
+ assert self.n_input > 0
253
+ self.fusion_mode = fusion_mode
254
+ self.downsample = nn.AvgPool2d(3,2,1)
255
+ self.upsample = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)
256
+ self.relu = nn.ReLU(True)
257
+ if self.fusion_mode == 'h2l' or self.fusion_mode == 'l2h':
258
+ l_in_ch = in_ch_list[0]
259
+ h_in_ch = in_ch_list[1]
260
+
261
+ self.top_down = Conv2dBlock(h_in_ch, l_in_ch, 3,1,1, norm='bn', activation='relu', activation_first=True)
262
+ self.bottom_up = Conv2dBlock(l_in_ch, h_in_ch, 3,2,1, norm='bn', activation='relu', activation_first=True)
263
+ if self.fusion_mode == 'h2l':
264
+ in_ch_ratio = 2
265
+ self.h_concat = Conv2dBlock(h_in_ch * in_ch_ratio, out_ch, 3,1,1, norm='bn', activation='relu', activation_first=True)
266
+ self.l_concat = Conv2dBlock(l_in_ch * in_ch_ratio, out_ch, 3,1,1, norm='bn', activation='relu', activation_first=True)
267
+ elif self.fusion_mode == 'l2h':
268
+ in_ch_ratio = 2
269
+ self.l_concat = Conv2dBlock(l_in_ch*in_ch_ratio, out_ch, 3,2,1, norm='bn', activation='relu', activation_first=True)
270
+ self.h_concat = Conv2dBlock(h_in_ch*in_ch_ratio, out_ch, 3,1,1, norm='bn', activation='relu', activation_first=True)
271
+
272
+ elif self.fusion_mode == 'hl2m' or self.fusion_mode == 'lh2m':
273
+ l_in_ch = in_ch_list[0]
274
+ m_in_ch = in_ch_list[1]
275
+ h_in_ch = in_ch_list[2]
276
+
277
+ self.top_down_h2m = Conv2dBlock(h_in_ch, m_in_ch, 3,1,1, norm='bn', activation='relu', activation_first=True)
278
+ self.top_down_m2l = Conv2dBlock(m_in_ch, l_in_ch, 3,1,1, norm='bn', activation='relu', activation_first=True)
279
+ self.bottom_up_m2h = Conv2dBlock(m_in_ch, h_in_ch, 3,2,1, norm='bn', activation='relu', activation_first=True)
280
+ self.bottom_up_l2m = Conv2dBlock(l_in_ch, m_in_ch, 3,2,1, norm='bn', activation='relu', activation_first=True)
281
+
282
+ in_ch_ratio = 2
283
+ self.l_concat = Conv2dBlock(l_in_ch * in_ch_ratio, out_ch, 3,2,1, norm='bn', activation='relu', activation_first=True)
284
+ self.m_concat = Conv2dBlock(m_in_ch * in_ch_ratio, out_ch, 3,1,1, norm='bn', activation='relu', activation_first=True)
285
+ self.h_concat = Conv2dBlock(h_in_ch * in_ch_ratio, out_ch, 3,1,1, norm='bn', activation='relu', activation_first=True)
286
+ else:
287
+ raise NameError("Unknown mode:\t{}".format(fusion_mode))
288
+
289
+ def forward(self, xl, xm=None, xh=None):
290
+ if self.fusion_mode == 'h2l' or self.fusion_mode == 'l2h':
291
+ # Bottom xl ----> xh Up
292
+ # | \
293
+ # Down \ xl <---- xh Top
294
+ # \ / \ /
295
+ # C -> + <-C
296
+ # ↓
297
+ # out
298
+ top_down_results = [xh]
299
+ xh2l = self.top_down(F.interpolate(xh, scale_factor=2))
300
+ top_down_results.insert(0, xl + xh2l)
301
+
302
+ bottom_up_results = [xl]
303
+ xl2h = self.bottom_up(xl)
304
+ bottom_up_results.append(xh+xl2h)
305
+
306
+ xl_cat = torch.cat([top_down_results[0],bottom_up_results[0]], dim=1)
307
+ xh_cat = torch.cat([top_down_results[1],bottom_up_results[1]], dim=1)
308
+ if self.fusion_mode == 'h2l':
309
+ xh_cat = self.h_concat(F.interpolate(xh_cat, scale_factor=2))
310
+ xl_cat = self.l_concat(xl_cat)
311
+
312
+ elif self.fusion_mode == 'l2h':
313
+ xh_cat = self.h_concat(xh_cat)
314
+ xl_cat = self.l_concat(xl_cat)
315
+
316
+ xout = xh_cat + xl_cat
317
+
318
+ elif self.fusion_mode == 'hl2m' or self.fusion_mode== 'lh2m':
319
+ # Bottom xl ----> xm ----> xh Up
320
+ # \ \ \
321
+ # Down \ xl <---- xm <---- xh Top
322
+ # \ / \ / \ /
323
+ # C ----> C <---- C
324
+ # ↓
325
+ # out
326
+ top_down_results = [xh]
327
+ xh2m = self.top_down_h2m(F.interpolate(xh, scale_factor=2)) + xm
328
+ top_down_results.insert(0, xh2m)
329
+ xm2l = self.top_down_m2l(F.interpolate(xh2m, scale_factor=2)) + xl
330
+ top_down_results.insert(0, xm2l)
331
+
332
+ bottom_up_results = [xl]
333
+ xl2m = self.bottom_up_l2m(xl) + xm
334
+ bottom_up_results.append(xl2m)
335
+ xm2h = self.bottom_up_m2h(xl2m) + xh
336
+ bottom_up_results.append(xm2h)
337
+
338
+ xl_cat = torch.cat([top_down_results[0],bottom_up_results[0]], dim=1)
339
+ xm_cat = torch.cat([top_down_results[1],bottom_up_results[1]], dim=1)
340
+ xh_cat = torch.cat([top_down_results[2],bottom_up_results[2]], dim=1)
341
+
342
+ xl_cat = self.l_concat(xl_cat)
343
+ xm_cat = self.m_concat(xm_cat)
344
+ xh_cat = self.h_concat(F.interpolate(xh_cat, scale_factor=2))
345
+
346
+ xout = xl_cat + xm_cat + xh_cat
347
+ return xout
348
+
349
+ class Transition(nn.Module):
350
+ def __init__(self, in_ch_list, out_ch_list):
351
+ super(Transition, self).__init__()
352
+ inch0, inch1, inch2, inch3, inch4 = in_ch_list
353
+ outch0, outch1, outch2, outch3, outch4 = out_ch_list
354
+
355
+ self.im0 = BidirectionFeatureIntegration([inch0,inch1], outch0, fusion_mode='h2l')
356
+ self.im1 = BidirectionFeatureIntegration([inch0,inch1, inch2], outch1, fusion_mode='hl2m')
357
+ self.im2 = BidirectionFeatureIntegration([inch1,inch2, inch3], outch2, fusion_mode='hl2m')
358
+ self.im3 = BidirectionFeatureIntegration([inch2,inch3, inch4], outch3, fusion_mode='hl2m')
359
+ self.im4 = BidirectionFeatureIntegration([inch3,inch4], outch4, fusion_mode='l2h')
360
+
361
+ def forward(self, xs, gc=None):
362
+ out_xs = []
363
+ out_xs.append(self.im0(xl=xs[0], xh=xs[1]))
364
+ out_xs.append(self.im1(xl=xs[0], xm=xs[1], xh=xs[2]))
365
+ out_xs.append(self.im2(xl=xs[1], xm=xs[2], xh=xs[3]))
366
+ out_xs.append(self.im3(xl=xs[2], xm=xs[3], xh=xs[4]))
367
+ out_xs.append(self.im4(xl=xs[3], xh=xs[4]))
368
+ return out_xs
369
+
370
+ class VanillaTransport(nn.Module):
371
+ def __init__(self, in_ch_list, out_ch_list):
372
+ super(VanillaTransport, self).__init__()
373
+ self.model = nn.ModuleDict()
374
+ idx = 0
375
+ for in_ch, out_ch in zip(in_ch_list, out_ch_list):
376
+ self.model[f'conv_{idx}'] = nn.Conv2d(in_ch_list[idx], out_ch_list[idx], 3,1,1)
377
+ idx += 1
378
+
379
+ def forward(self, xs):
380
+ x0,x1,x2,x3,x4 = xs
381
+ y0 = self.model['conv_0'](x0) # 224, 64
382
+ y1 = self.model['conv_1'](x1) # 112,64+128
383
+ y2 = self.model['conv_2'](x2) # 56, 256+512+512
384
+ y3 = self.model['conv_3'](x3) # 28, 512+512
385
+ y4 = self.model['conv_4'](x4) # 14, 512
386
+ return [y0,y1,y2,y3,y4]
387
+
388
+ ## -----------------Mask-guided Dual Attention ---------------------
389
+
390
+
391
+ class ECABlock(nn.Module):
392
+ """Constructs a ECA module.
393
+
394
+ Args:
395
+ channel: Number of channels of the input feature map
396
+ k_size: Adaptive selection of kernel size
397
+ """
398
+ def __init__(self, channel, k_size=3):
399
+ super(ECABlock, self).__init__()
400
+ self.avg_pool = nn.AdaptiveAvgPool2d(1)
401
+ self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False)
402
+ self.sigmoid = nn.Sigmoid()
403
+
404
+ def forward(self, x):
405
+ # x: input features with shape [b, c, h, w]
406
+ b, c, h, w = x.size()
407
+
408
+ # feature descriptor on the global spatial information
409
+ y = self.avg_pool(x)
410
+
411
+ # Two different branches of ECA module
412
+ y = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)
413
+
414
+ # Multi-scale information fusion
415
+ y = self.sigmoid(y)
416
+
417
+ return x * y.expand_as(x)
418
+
419
+ ## SA
420
+ def _get_kernel(kernlen=16, nsig=3):
421
+ interval = (2*nsig+1.)/kernlen
422
+ x = np.linspace(-nsig-interval/2., nsig+interval/2., kernlen+1)
423
+ kern1d = np.diff(st.norm.cdf(x))
424
+ kernel_raw = np.sqrt(np.outer(kern1d, kern1d))
425
+ kernel = kernel_raw/kernel_raw.sum()
426
+ return kernel
427
+
428
+
429
+ def min_max_norm(in_):
430
+ """
431
+ normalization
432
+ :param in_:
433
+ :return:
434
+ """
435
+ max_ = in_.max(3)[0].max(2)[0].unsqueeze(2).unsqueeze(3).expand_as(in_)
436
+ min_ = in_.min(3)[0].min(2)[0].unsqueeze(2).unsqueeze(3).expand_as(in_)
437
+ in_ = in_ - min_
438
+ return in_.div(max_ - min_ + 1e-8)
439
+
440
+ ##
441
+
442
+ class SpatialGate(nn.Module):
443
+ def __init__(self, in_dim=2, mask_mode='mask'):
444
+ super(SpatialGate, self).__init__()
445
+ kernel_size = 7
446
+ self.mask_mode = mask_mode
447
+
448
+ self.spatial = nn.Sequential(*[
449
+ BasicConv(in_dim, in_dim, 3, 1, 1),
450
+ BasicConv(in_dim, 1, kernel_size, stride=1, padding=(kernel_size-1) // 2, relu=False)
451
+ ])
452
+
453
+ if 'gb' in mask_mode.split('_')[-1]:
454
+ print("Using Gaussian Filter in mda!")
455
+ gaussian_kernel = np.float32(_get_kernel(31, 4))
456
+ gaussian_kernel = gaussian_kernel[np.newaxis, np.newaxis, ...]
457
+ self.gaussian_kernel = Parameter(torch.from_numpy(gaussian_kernel))
458
+
459
+ def forward(self, x):
460
+ x_compress = x
461
+ x_out = self.spatial(x_compress)
462
+ attention = torch.sigmoid(x_out) # broadcasting
463
+ x = x * attention
464
+ if 'gb' in self.mask_mode:
465
+ soft_attention = F.conv2d(attention, self.gaussian_kernel, padding=15)
466
+ soft_attention = min_max_norm(soft_attention) # normalization
467
+ x = torch.mul(x, soft_attention.max(attention)) # x * max(soft, hard)
468
+ return x, attention#x_out#
469
+
470
+ class MaskguidedDualAttention(nn.Module):
471
+ def __init__(self, gate_channels, mask_mode='mask'):
472
+ super(MaskguidedDualAttention, self).__init__()
473
+ self.ChannelGate = ECABlock(gate_channels)
474
+ self.SpatialGate = SpatialGate(gate_channels, mask_mode=mask_mode)
475
+ self.mask_mode = mask_mode
476
+ def forward(self, x):
477
+ x_ca = self.ChannelGate(x)
478
+ x_out, mask = self.SpatialGate(x_ca)
479
+ return x_out + x_ca, mask
480
+
481
+ ## -----------------Global-context Guided Decoder ---------------------
482
+ class GGDBlock(nn.Module):
483
+ def __init__(self, channel=32, is_outmost=False):
484
+ super(GGDBlock, self).__init__()
485
+ self.relu = nn.ReLU(True)
486
+ self.upsample = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)
487
+ self.conv_inup = Conv2dBlock(channel, channel, 3, 1, padding=1, norm='bn', activation='none', use_bias=False)
488
+ self.conv_inbottom = Conv2dBlock(channel, channel, 3, 1, padding=1, norm='bn', activation='none', use_bias=False)
489
+ self.conv_cat = Conv2dBlock(channel*2, channel, 3, 1, padding=1, norm='bn', activation='none', use_bias=False)
490
+
491
+ self.outmost = is_outmost
492
+ if self.outmost:
493
+ self.conv4 = Conv2dBlock(channel, channel, 3, 1, padding=1, norm='bn', activation='none', use_bias=False)
494
+ self.conv5 = nn.Conv2d(channel, 1, 1)
495
+
496
+ def forward(self, x, up,bottom):
497
+ # x
498
+ # ↓
499
+ # <-[C]-- * ---- Up
500
+ # <--↑---------- Bottom
501
+ x_up = self.conv_inup(self.upsample(up)) * x # 28
502
+ x_bottom = self.conv_inbottom(self.upsample(bottom)) # 56
503
+
504
+ x_cat = torch.cat((x_up, x_bottom), 1) # 28
505
+ x_out = self.conv_cat(x_cat) # 28
506
+
507
+ xup_out = x_out
508
+ xbottom_out = x_bottom
509
+
510
+ if self.outmost:
511
+ x_out = self.upsample(x_out)
512
+ # x = self.conv4(x_out)
513
+ x = self.conv5(x_out)
514
+ return {'xup':x, 'xbottom':x_out}
515
+ else:
516
+ return {'xup':xup_out, 'xbottom':xbottom_out}
517
+
518
+ class GGD(nn.Module):
519
+ def __init__(self, channel=32, nstage=4):
520
+ super(GGD, self).__init__()
521
+ self.decoder = nn.ModuleDict()
522
+ self.nstage = nstage - 1
523
+ for i in range(self.nstage):
524
+ if i == 0: self.decoder['d0'] = GGDBlock(channel=channel, is_outmost=True)
525
+ else:
526
+ self.decoder['d{}'.format(i)] = GGDBlock(channel=channel, is_outmost=False)
527
+
528
+ def forward(self, xs):
529
+ #x0,x1,x2,x3,x4,x5=xs
530
+ xup = xdown = xs[-1]
531
+ for i, x in enumerate(
532
+ xs[1:-1][::-1]
533
+ ):
534
+ idx = self.nstage - i - 1
535
+ xout = self.decoder['d{}'.format(idx)](x, xup,xdown)
536
+ xup,xdown = xout['xup'], xout['xbottom']
537
+ return xup
538
+
539
+ ## ----------------DIRL --------------------------------
540
+
541
+ class InharmoniousEncoder(nn.Module):
542
+ def __init__(self, opt, n_channels=3):
543
+ super(InharmoniousEncoder, self).__init__()
544
+ if opt.backbone == 'resnet34':
545
+ resnet = models.resnet34(pretrained=False)
546
+ self.in_dims = [64, 128, 256, 512, 512]
547
+ elif opt.backbone == 'resnet50':
548
+ resnet = models.resnet50(pretrained=False)
549
+ self.in_dims = [64, 256, 512, 1024, 2048]
550
+ ## -------------Encoder--------------
551
+ self.inconv = nn.Conv2d(n_channels,64,3,1,padding=1)
552
+ self.inbn = nn.BatchNorm2d(64)
553
+ self.inrelu = nn.ReLU(inplace=True) #224,64
554
+ self.maxpool = nn.MaxPool2d(3,2,1)
555
+ #stage 1
556
+ self.encoder1 = resnet.layer1 #112,64*4
557
+ #stage 2
558
+ self.encoder2 = resnet.layer2 #56,128*4
559
+ #stage 3
560
+ self.encoder3 = resnet.layer3 #28,256*4
561
+ #stage 4
562
+ self.encoder4 = resnet.layer4 #14,512*4
563
+ self.encoder5 = nn.Sequential(*[
564
+ BasicBlock(resnet.inplanes, 512),
565
+ BasicBlock(512, 512),
566
+ BasicBlock(512, 512),
567
+ ])
568
+ self.inplanes = resnet.inplanes
569
+
570
+ def forward(self, x, backbone_features=None):
571
+ hx = x
572
+ hx = self.inconv(hx)
573
+ hx = self.inbn(hx)
574
+ hx = self.inrelu(hx)
575
+
576
+ h1 = self.encoder1(hx) # 224
577
+ h2 = self.encoder2(h1) # 112
578
+ h3 = self.encoder3(h2) # 56
579
+ h4 = self.encoder4(h3) # 28
580
+ hx = self.maxpool(h4)
581
+ h5 = self.encoder5(hx) # 14
582
+ return {"skips":[h1,h2,h3,h4,h5]}
583
+
584
+ class InharmoniousDecoder(nn.Module):
585
+ def __init__(self,opt, n_channels=3):
586
+ super(InharmoniousDecoder,self).__init__()
587
+ ## -------------Dimention--------------
588
+ self.opt = opt
589
+ if opt.backbone == 'resnet34':
590
+ self.dims = [512,512,256,128,64,64]
591
+ elif opt.backbone == 'resnet50':
592
+ self.dims = [2048, 1024, 512, 256, 64,64]
593
+ self.n_layers = len(self.dims)-1
594
+
595
+ ## ------------Transition Layer------
596
+ self.trans_in_list = self.dims[:-1][::-1]
597
+ self.trans_out_list = [opt.ggd_ch] * 5
598
+
599
+ self.trans = Transition(
600
+ in_ch_list=self.trans_in_list,
601
+ out_ch_list=self.trans_out_list,
602
+ )
603
+ ## ------------Attention Layer-----------
604
+ self.attention_layers= nn.ModuleDict()
605
+ for i in range(self.n_layers):
606
+ self.attention_layers['mda_{}'.format(i)] = MaskguidedDualAttention(opt.ggd_ch, mask_mode=self.opt.mda_mode)
607
+ # ------------ Decoder Layer-----------
608
+ self.decoder_layers = nn.ModuleDict()
609
+ self.decoder_layers['deconv'] = GGD(opt.ggd_ch)
610
+
611
+ def forward(self,z):
612
+ x = z['skips']
613
+ mda_masks = []
614
+ ## -------------Layer Fusion-------
615
+ x = self.trans(x)
616
+ ## -------------Attention ------
617
+ for i in range(self.n_layers-1, -1, -1):
618
+ fused_layer = x[i]
619
+ fused_layer, m = self.attention_layers['mda_{}'.format(i)](fused_layer)
620
+ dst_shape = tuple(x[0].shape[2:])
621
+ m = F.interpolate(m, size=dst_shape, mode='bilinear', align_corners=True)
622
+ mda_masks.append(m)
623
+ x[i] = fused_layer
624
+ ## ------------Decoding --------
625
+ x = self.decoder_layers['deconv'](x).sigmoid()
626
+ if self.opt.mda_mode != 'vanilla':
627
+ return {"mask":[x]+mda_masks}
628
+ else:
629
+ return {"mask":[x]}
630
+
631
+
632
+
633
+
634
+
635
+ class DIRLNet(nn.Module):
636
+ def __init__(self, opt, input_nc=3):
637
+ super(DIRLNet, self).__init__()
638
+ self.encoder = InharmoniousEncoder(opt, input_nc)
639
+ self.decoder = InharmoniousDecoder(opt, input_nc)
640
+ self.opt = opt
641
+ self.inplanes = self.encoder.inplanes
642
+ def forward(self, x):
643
+ z = self.encoder(x)
644
+ out =self.decoder(z)
645
+ # pred = out['mask']
646
+ extra_info = {'lut_z':z['skips'][3]}
647
+ out.update(extra_info)
648
+ return out
649
+
650
+ def load_dict(self, net, load_path, strict=True):
651
+ ckpt_dict = torch.load(load_path, map_location=self.opt.device)
652
+ if 'best_acc' in ckpt_dict.keys():
653
+ new_state_dict = ckpt_dict['state_dict']
654
+ save_epoch = ckpt_dict['epoch']
655
+ self.best_acc = ckpt_dict['best_acc']
656
+ print("The model from epoch {} reaches acc at {:.4f} !".format(save_epoch, self.best_acc))
657
+ else:
658
+ new_state_dict = ckpt_dict
659
+
660
+ current_state_dict = net.state_dict()
661
+ new_keys = tuple(new_state_dict.keys())
662
+ for k in new_keys:
663
+ if k.startswith('module'):
664
+ v = new_state_dict.pop(k)
665
+ nk = k.split('module.')[-1]
666
+ new_state_dict[nk] = v
667
+ if len(self.opt.gpus) > 1:
668
+ net.module.load_state_dict(new_state_dict, strict=strict)
669
+ else:
670
+ net.load_state_dict(new_state_dict, strict=True) # strict
671
+
672
+ def load_pretrain_params(self, load_path):
673
+ encoder_path = os.path.join(load_path, 'encoder_epoch60.pth')
674
+ decoder_path = os.path.join(load_path, 'decoder_epoch60.pth')
675
+ self.load_dict(self.encoder, encoder_path, strict=True)
676
+ self.load_dict(self.decoder, decoder_path, strict=True)
677
+ return
678
+
679
+