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