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,728 @@
1
+ from __future__ import absolute_import
2
+ from __future__ import division
3
+ from __future__ import print_function
4
+ from audioop import reverse
5
+ from cmath import inf
6
+ from curses.panel import bottom_panel
7
+ from dis import dis
8
+ from email.mime import image
9
+
10
+ import os
11
+ from io import BytesIO
12
+ import logging
13
+ import base64
14
+ from sre_parse import State
15
+ from sys import prefix
16
+ import threading
17
+ import random
18
+ from turtle import left, right
19
+ import numpy as np
20
+ from typing import Callable, List, Tuple, Union
21
+ from PIL import Image,ImageDraw,ImageFile
22
+ ImageFile.LOAD_TRUNCATED_IMAGES = True
23
+ # from sympy import source
24
+ import torch.utils.data as data
25
+ import json
26
+ import time
27
+ import cv2
28
+ cv2.setNumThreads(0)
29
+ import torch
30
+ import torchvision
31
+ import torch.nn.functional as F
32
+ import torchvision.transforms as T
33
+ import copy
34
+ import math
35
+ from functools import partial
36
+ import albumentations as A
37
+ from tqdm import tqdm
38
+ import sys
39
+ import shutil
40
+ import transformers
41
+ proj_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
42
+ sys.path.insert(0, proj_dir)
43
+ os.environ["OMP_NUM_THREADS"] = "1"
44
+ os.environ["MKL_NUM_THREADS"] = "1"
45
+
46
+ def bbox_process(bbox):
47
+ x_min = int(bbox[0])
48
+ y_min = int(bbox[1])
49
+ x_max = x_min + int(bbox[2])
50
+ y_max = y_min + int(bbox[3])
51
+ return list(map(int, [x_min, y_min, x_max, y_max]))
52
+
53
+
54
+ def get_tensor(normalize=True, toTensor=True, resize=True, image_size=(512, 512)):
55
+ transform_list = []
56
+ if resize:
57
+ transform_list += [torchvision.transforms.Resize(image_size)]
58
+ if toTensor:
59
+ transform_list += [torchvision.transforms.ToTensor()]
60
+ if normalize:
61
+ transform_list += [torchvision.transforms.Normalize((0.5, 0.5, 0.5),
62
+ (0.5, 0.5, 0.5))]
63
+ return torchvision.transforms.Compose(transform_list)
64
+
65
+ def get_tensor_clip(normalize=True, toTensor=True, resize=True, image_size=(224, 224)):
66
+ transform_list = []
67
+ if resize:
68
+ transform_list += [torchvision.transforms.Resize(image_size)]
69
+ if toTensor:
70
+ transform_list += [torchvision.transforms.ToTensor()]
71
+ if normalize:
72
+ transform_list += [torchvision.transforms.Normalize((0.48145466, 0.4578275, 0.40821073),
73
+ (0.26862954, 0.26130258, 0.27577711))]
74
+ return torchvision.transforms.Compose(transform_list)
75
+
76
+ def scan_all_files():
77
+ bbox_dir = os.path.join(proj_dir, '../../dataset/open-images/bbox_mask')
78
+ assert os.path.exists(bbox_dir), bbox_dir
79
+
80
+ bad_files = []
81
+ for split in os.listdir(bbox_dir):
82
+ total_images, total_pairs, bad_masks, bad_images = 0, 0, 0, 0
83
+ subdir = os.path.join(bbox_dir, split)
84
+ if not os.path.isdir(subdir) or split not in ['train', 'test', 'validation']:
85
+ continue
86
+ for file in tqdm(os.listdir(subdir)):
87
+ try:
88
+ with open(os.path.join(subdir, file), 'r') as f:
89
+ for line in f.readlines():
90
+ line = line.strip()
91
+ info = line.split(' ')
92
+ mask_file = os.path.join(bbox_dir, '../masks', split, info[-2])
93
+ if os.path.exists(mask_file):
94
+ total_pairs += 1
95
+ else:
96
+ bad_masks += 1
97
+ total_images += 1
98
+ except:
99
+ bad_files.append(file)
100
+ bad_images += 1
101
+ print('{}, {} images({} bad), {} pairs({} bad)'.format(
102
+ split, total_images, bad_images, total_pairs, bad_masks))
103
+
104
+ if len(bad_files) > 0:
105
+ with open(os.path.join(bbox_dir, 'bad_files.txt'), 'w') as f:
106
+ for file in bad_files:
107
+ f.write(file + '\n')
108
+
109
+ print(f'{len(bad_files)} bad_files')
110
+
111
+ class DataAugmentation:
112
+ def __init__(self, border_mode=0):
113
+ self.blur = A.Blur(p=0.3)
114
+ self.appearance_trans = A.Compose([
115
+ A.ColorJitter(brightness=0.3,
116
+ contrast=0.3,
117
+ saturation=0.3,
118
+ hue=0.05,
119
+ always_apply=False,
120
+ p=1)],
121
+ # additional_targets={'image':'image', 'image1':'image', 'image2':'image'}
122
+ )
123
+ self.geometric_trans = A.Compose([
124
+ A.HorizontalFlip(p=0.5),
125
+ A.Rotate(limit=20,
126
+ border_mode=border_mode,
127
+ value=(127,127,127),
128
+ mask_value=0,
129
+ p=1),
130
+ A.Perspective(scale=(0.01, 0.1),
131
+ pad_mode=border_mode,
132
+ pad_val =(127,127,127),
133
+ mask_pad_val=0,
134
+ fit_output=False,
135
+ p=0.5)
136
+ ])
137
+ self.bbox_maxlen = 0.8
138
+ self.crop_bg_p = 0.5
139
+
140
+ def __call__(self, bg_img, bbox, bg_mask, fg_img, fg_mask):
141
+ # randomly crop background image
142
+ if self.crop_bg_p > 0 and np.random.rand() < self.crop_bg_p:
143
+ trans_bg, trans_bbox, trans_mask = self.random_crop_background(bg_img, bbox, bg_mask)
144
+ else:
145
+ trans_bg, trans_bbox, trans_mask = bg_img, bbox, bg_mask
146
+
147
+ bbox_mask = bbox2mask(trans_bbox, trans_bg.shape[1], trans_bg.shape[0])
148
+ # perform illumination and pose transformation on foreground
149
+ trans_fg, trans_fgmask = self.augment_foreground(fg_img.copy(), fg_mask.copy())
150
+ return {"bg_img": trans_bg,
151
+ "bg_mask": trans_mask,
152
+ "bbox": trans_bbox,
153
+ "bbox_mask": bbox_mask,
154
+ "fg_img": trans_fg,
155
+ "fg_mask": trans_fgmask,
156
+ "gt_fg_mask": fg_mask}
157
+
158
+ def augment_foreground(self, img, mask):
159
+ # appearance transformed image
160
+ transformed = self.appearance_trans(image=img)
161
+ img = transformed['image']
162
+ transformed = self.geometric_trans(image=img, mask=mask)
163
+ trans_img = transformed['image']
164
+ trans_mask = transformed['mask']
165
+ return trans_img, trans_mask
166
+
167
+ def random_crop_background(self, image, bbox, mask):
168
+ width, height = image.shape[1], image.shape[0]
169
+ bbox_w = float(bbox[2] - bbox[0]) / width
170
+ bbox_h = float(bbox[3] - bbox[1]) / height
171
+
172
+ left, right, top, down = 0, width, 0, height
173
+ if bbox_w < self.bbox_maxlen:
174
+ maxcrop = width - bbox_w * width / self.bbox_maxlen
175
+ left = int(np.random.rand() * min(maxcrop, bbox[0]))
176
+ right = width - int(np.random.rand() * min(maxcrop, width - bbox[2]))
177
+
178
+ if bbox_h < self.bbox_maxlen:
179
+ maxcrop = (height - bbox_h * height / self.bbox_maxlen) / 2
180
+ top = int(np.random.rand() * min(maxcrop, bbox[1]))
181
+ down = height - int(np.random.rand() * min(maxcrop, height - bbox[3]))
182
+
183
+ trans_bbox = [bbox[0] - left, bbox[1] - top, bbox[2] - left, bbox[3] - top]
184
+ trans_image = image[top:down, left:right]
185
+ trans_mask = mask[top:down, left:right]
186
+ return trans_image, trans_bbox, trans_mask
187
+
188
+
189
+ def bbox2mask(bbox, mask_w, mask_h):
190
+ mask = np.zeros((mask_h, mask_w), dtype=np.uint8)
191
+ mask[bbox[1] : bbox[3], bbox[0] : bbox[2]] = 255
192
+ return mask
193
+
194
+ def mask2bbox(mask):
195
+ if not isinstance(mask, np.ndarray):
196
+ mask = np.array(mask)
197
+ if mask.ndim == 3:
198
+ mask = np.squeeze(mask, axis=-1)
199
+ rows = np.any(mask > 0, axis=1)
200
+ cols = np.any(mask > 0, axis=0)
201
+ y1, y2 = np.where(rows)[0][[0, -1]]
202
+ x1, x2 = np.where(cols)[0][[0, -1]]
203
+ return [x1, y1, x2, y2]
204
+
205
+
206
+ def constant_pad_bbox(bbox, width, height, value=10):
207
+ ### Get reference image
208
+ bbox_pad=copy.deepcopy(bbox)
209
+ left_space = bbox[0]
210
+ up_space = bbox[1]
211
+ right_space = width - bbox[2]
212
+ down_space = height - bbox[3]
213
+
214
+ bbox_pad[0]=bbox[0]-min(value, left_space)
215
+ bbox_pad[1]=bbox[1]-min(value, up_space)
216
+ bbox_pad[2]=bbox[2]+min(value, right_space)
217
+ bbox_pad[3]=bbox[3]+min(value, down_space)
218
+ return bbox_pad
219
+
220
+ def rescale_image_with_bbox(image, bbox=None, long_size=1024):
221
+ src_width, src_height = image.size
222
+ if max(src_width, src_height) <= long_size:
223
+ dst_img = image
224
+ dst_width, dst_height = dst_img.size
225
+ else:
226
+ scale = float(long_size) / max(src_width, src_height)
227
+ dst_width, dst_height = int(scale * src_width), int(scale * src_height)
228
+ dst_img = image.resize((dst_width, dst_height))
229
+ if bbox == None:
230
+ return dst_img
231
+ bbox[0] = int(float(bbox[0]) / src_width * dst_width)
232
+ bbox[1] = int(float(bbox[1]) / src_height * dst_height)
233
+ bbox[2] = int(float(bbox[2]) / src_width * dst_width)
234
+ bbox[3] = int(float(bbox[3]) / src_height * dst_height)
235
+ return dst_img, bbox
236
+
237
+ def crop_foreground_by_bbox(img, mask, bbox, pad_bbox=10):
238
+ width,height = img.shape[1], img.shape[0]
239
+ bbox_pad = constant_pad_bbox(bbox, width, height, pad_bbox) if pad_bbox > 0 else bbox
240
+ img = img[bbox_pad[1]:bbox_pad[3],bbox_pad[0]:bbox_pad[2]]
241
+ if mask is not None:
242
+ mask = mask[bbox_pad[1]:bbox_pad[3],bbox_pad[0]:bbox_pad[2]]
243
+ return img, mask, bbox_pad
244
+
245
+ def image2inpaint(image, mask):
246
+ if len(mask.shape) == 2:
247
+ mask_f = mask[:,:,np.newaxis]
248
+ else:
249
+ mask_f = mask
250
+ mask_f = mask_f.astype(np.float32) / 255
251
+ inpaint = image.astype(np.float32)
252
+ gray = np.ones_like(inpaint) * 127
253
+ inpaint = inpaint * (1 - mask_f) + mask_f * gray
254
+ inpaint = np.uint8(inpaint)
255
+ return inpaint
256
+
257
+ def check_dir(dir):
258
+ assert os.path.exists(dir), dir
259
+ return dir
260
+
261
+ def get_bbox_tensor(bbox, width, height):
262
+ norm_bbox = bbox
263
+ norm_bbox = torch.tensor(norm_bbox).reshape(-1).float()
264
+ norm_bbox[0::2] /= width
265
+ norm_bbox[1::2] /= height
266
+ return norm_bbox
267
+
268
+
269
+ def reverse_image_tensor(tensor, img_size=(256,256)):
270
+ if tensor.ndim == 3:
271
+ tensor = tensor.unsqueeze(0)
272
+ tensor = (tensor.float() + 1) / 2
273
+ tensor = torch.clamp(tensor, min=0.0, max=1.0)
274
+ tensor = torch.permute(tensor, (0, 2, 3, 1)) * 255
275
+ tensor = tensor.detach().cpu().numpy()
276
+ img_nps = np.uint8(tensor)
277
+ def np2bgr(img, img_size = img_size):
278
+ if img.shape[:2] != img_size:
279
+ img = cv2.resize(img, img_size)
280
+ return cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
281
+ img_list = [np2bgr(img) for img in img_nps]
282
+ return img_list
283
+
284
+ def reverse_mask_tensor(tensor, img_size=(256,256)):
285
+ if tensor.ndim == 3:
286
+ tensor = tensor.unsqueeze(0)
287
+ tensor = torch.clamp(tensor, min=0.0, max=1.0)
288
+ tensor = torch.permute(tensor.float(), (0, 2, 3, 1)) * 255
289
+ tensor = tensor.detach().cpu().numpy()
290
+ img_nps = np.uint8(tensor)
291
+ def np2bgr(img, img_size = img_size):
292
+ if img.shape[:2] != img_size:
293
+ img = cv2.resize(img, img_size)
294
+ return cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
295
+ img_list = [np2bgr(img) for img in img_nps]
296
+ return img_list
297
+
298
+ def reverse_clip_tensor(tensor, img_size=(256,256)):
299
+ if tensor.ndim == 3:
300
+ tensor = tensor.unsqueeze(0)
301
+ MEAN = torch.tensor([0.48145466, 0.4578275, 0.40821073], dtype=torch.float)
302
+ MEAN = MEAN.reshape(1, 3, 1, 1).to(tensor.device)
303
+ STD = torch.tensor([0.26862954, 0.26130258, 0.27577711], dtype=torch.float)
304
+ STD = STD.reshape(1, 3, 1, 1).to(tensor.device)
305
+ tensor = (tensor * STD) + MEAN
306
+ tensor = torch.clamp(tensor, min=0.0, max=1.0)
307
+ tensor = torch.permute(tensor.float(), (0, 2, 3, 1)) * 255
308
+ tensor = tensor.detach().cpu().numpy()
309
+ img_nps = np.uint8(tensor)
310
+ def np2bgr(img, img_size = img_size):
311
+ if img.shape[:2] != img_size:
312
+ img = cv2.resize(img, img_size)
313
+ return cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
314
+ img_list = [np2bgr(img) for img in img_nps]
315
+ return img_list
316
+
317
+ def random_crop_image(image, crop_w, crop_h):
318
+ if not isinstance(image, np.ndarray):
319
+ image = np.array(image)
320
+ x_space = image.shape[1] - crop_w
321
+ y_space = image.shape[0] - crop_h
322
+ x1 = np.random.randint(0, x_space) if x_space > 0 else 0
323
+ y1 = np.random.randint(0, y_space) if y_space > 0 else 0
324
+ image = image[y1 : y1+crop_h, x1 : x1+crop_w]
325
+ # assert crop.shape[0] == crop_h and crop.shape[1] == crop_w, (y1, x1, image.shape, crop.shape, crop_w, crop_h)
326
+ return image
327
+
328
+ def read_image(image_path):
329
+ with Image.open(image_path) as img:
330
+ img = img.convert('RGB')
331
+ return img
332
+
333
+ def read_mask(image_path):
334
+ with Image.open(image_path) as img:
335
+ img = img.convert('L')
336
+ return img
337
+
338
+ # poisson blending
339
+ def poisson_blending(fg, fg_mask, bg, center=None):
340
+ if center is None:
341
+ height, width, _ = bg.shape
342
+ center = (int(width/2), int(height/2))
343
+ return cv2.seamlessClone(fg, bg, fg_mask, center, cv2.MIXED_CLONE)
344
+
345
+ class OpenImageDataset(data.Dataset):
346
+ def __init__(self,split,**args):
347
+ self.split=split
348
+ dataset_dir = args['dataset_dir']
349
+ assert os.path.exists(dataset_dir), dataset_dir
350
+ self.bbox_dir = check_dir(os.path.join(dataset_dir, 'refine/box', split))
351
+ self.image_dir= check_dir(os.path.join(dataset_dir, 'images', split))
352
+ self.inpaint_dir = check_dir(os.path.join(dataset_dir, 'refine/inpaint', split))
353
+ self.mask_dir = check_dir(os.path.join(dataset_dir, 'refine/mask', split))
354
+ self.bbox_path_list = np.array(self.load_bbox_path_list())
355
+ self.length=len(self.bbox_path_list)
356
+ self.random_trans = DataAugmentation()
357
+ self.clip_transform = get_tensor_clip(image_size=(224, 224))
358
+ self.image_size = (args['image_size'], args['image_size'])
359
+ self.sd_transform = get_tensor(image_size=self.image_size)
360
+ self.mask_transform = get_tensor(normalize=False, image_size=self.image_size)
361
+ self.clip_mask_transform = get_tensor(normalize=False, image_size=(224, 224))
362
+ self.bad_images = []
363
+
364
+ def load_bbox_path_list(self):
365
+ # cache_dir = os.path.dirname(os.path.abspath(self.bbox_dir))
366
+ cache_dir = self.bbox_dir
367
+ cache_file = os.path.join(cache_dir, f'{self.split}.json')
368
+ if os.path.exists(cache_file):
369
+ print('load bbox list from ', cache_file)
370
+ with open(cache_file, 'r') as f:
371
+ bbox_path_list = json.load(f)
372
+ else:
373
+ bbox_path_list= os.listdir(self.bbox_dir)
374
+ bbox_path_list.sort()
375
+ print('save bbox list to ', cache_file)
376
+ with open(cache_file, 'w') as f:
377
+ json.dump(bbox_path_list, f)
378
+ return bbox_path_list
379
+
380
+ def load_bbox_file(self, bbox_file):
381
+ bbox_list = []
382
+ with open(bbox_file, 'r') as f:
383
+ for line in f.readlines():
384
+ info = line.strip().split(' ')
385
+ bbox = [int(float(f)) for f in info[:4]]
386
+ mask = os.path.join(self.mask_dir, info[-1])
387
+ inpaint = os.path.join(self.inpaint_dir, info[-1].replace('.png', '.jpg'))
388
+ if os.path.exists(mask) and os.path.exists(inpaint):
389
+ bbox_list.append((bbox, mask, inpaint))
390
+ return bbox_list
391
+
392
+
393
+ def sample_augmented_data(self, source_np, bbox, mask, fg_img, fg_mask):
394
+ transformed = self.random_trans(source_np, bbox, mask, fg_img, fg_mask)
395
+ # get ground-truth composite image and bbox
396
+ gt_mask = Image.fromarray(transformed["bg_mask"])
397
+ img_width, img_height = gt_mask.size
398
+ gt_mask_tensor = self.mask_transform(gt_mask)
399
+ gt_mask_tensor = torch.where(gt_mask_tensor > 0.5, 1, 0).float()
400
+
401
+ gt_img_tensor = Image.fromarray(transformed['bg_img'])
402
+ gt_img_tensor = self.sd_transform(gt_img_tensor)
403
+
404
+ mask_tensor = Image.fromarray(transformed['bbox_mask'])
405
+ mask_tensor = self.mask_transform(mask_tensor)
406
+ mask_tensor = torch.where(mask_tensor > 0.5, 1, 0).float()
407
+ bbox_tensor = transformed['bbox']
408
+ bbox_tensor = get_bbox_tensor(bbox_tensor, img_width, img_height)
409
+ # get foreground and foreground mask
410
+ fg_mask_tensor = Image.fromarray(transformed['fg_mask'])
411
+ fg_mask_tensor = self.clip_mask_transform(fg_mask_tensor)
412
+ fg_mask_tensor = torch.where(fg_mask_tensor > 0.5, 1, 0)
413
+
414
+ fg_img_tensor = transformed['fg_img'] * (transformed['fg_mask'][:,:,None] > 0.5)
415
+ fg_img_tensor = Image.fromarray(fg_img_tensor)
416
+ fg_img_tensor = self.clip_transform(fg_img_tensor)
417
+ inpaint = gt_img_tensor * (mask_tensor < 0.5)
418
+
419
+ return {"gt_img": gt_img_tensor,
420
+ "gt_mask": gt_mask_tensor,
421
+ "bg_img": inpaint,
422
+ "bg_mask": mask_tensor,
423
+ "fg_img": fg_img_tensor,
424
+ "fg_mask": fg_mask_tensor,
425
+ "bbox": bbox_tensor}
426
+
427
+ def __getitem__(self, index):
428
+ try:
429
+ # get bbox and mask
430
+ bbox_file = self.bbox_path_list[index]
431
+ bbox_path = os.path.join(self.bbox_dir, bbox_file)
432
+ bbox_list = self.load_bbox_file(bbox_path)
433
+ bbox,mask_path,inpaint_path = random.choice(bbox_list)
434
+ # get source image and mask
435
+ image_path = os.path.join(self.image_dir, os.path.splitext(bbox_file)[0] + '.jpg')
436
+ source_img = read_image(image_path)
437
+ source_img, bbox = rescale_image_with_bbox(source_img, bbox)
438
+ source_np = np.array(source_img)
439
+ mask = read_mask(mask_path)
440
+ mask = mask.resize((source_np.shape[1], source_np.shape[0]))
441
+ mask = np.array(mask)
442
+ # bbox = mask2bbox(mask)
443
+ fg_img, fg_mask, bbox = crop_foreground_by_bbox(source_np, mask, bbox)
444
+ sample = self.sample_augmented_data(source_np, bbox, mask, fg_img, fg_mask)
445
+ sample['image_path'] = image_path
446
+ return sample
447
+ except Exception as e:
448
+ print(os.getpid(), bbox_file, e)
449
+ index = np.random.randint(0, len(self)-1)
450
+ return self[index]
451
+
452
+ def __len__(self):
453
+ return self.length
454
+
455
+ class COCOEEDataset(data.Dataset):
456
+ def __init__(self, **args):
457
+ dataset_dir = args['dataset_dir']
458
+ self.use_inpaint_background = args['augment_config'].use_inpaint_background if 'augment_config' in args else True
459
+ assert os.path.exists(dataset_dir), dataset_dir
460
+ self.src_dir = check_dir(os.path.join(dataset_dir, "GT_3500"))
461
+ self.ref_dir = check_dir(os.path.join(dataset_dir, 'Ref_3500'))
462
+ self.mask_dir = check_dir(os.path.join(dataset_dir, 'Mask_bbox_3500'))
463
+ self.gt_mask_dir = check_dir(os.path.join(dataset_dir, 'mask'))
464
+ self.inpaint_dir = check_dir(os.path.join(dataset_dir, 'inpaint'))
465
+ self.ref_mask_dir = check_dir(os.path.join(dataset_dir, 'ref_mask'))
466
+ self.image_list = os.listdir(self.src_dir)
467
+ self.image_list.sort()
468
+
469
+ self.clip_transform = get_tensor_clip(image_size=(224, 224))
470
+ self.image_size = args['image_size'], args['image_size']
471
+ self.sd_transform = get_tensor(image_size=self.image_size)
472
+ self.mask_transform = get_tensor(normalize=False, image_size=self.image_size)
473
+ self.clip_mask_transform = get_tensor(normalize=False, image_size=(224, 224))
474
+
475
+ def __len__(self):
476
+ return len(self.image_list)
477
+
478
+ def __getitem__(self, index):
479
+ try:
480
+ image = self.image_list[index]
481
+ src_path = os.path.join(self.src_dir, image)
482
+ src_img = read_image(src_path)
483
+ src_tensor = self.sd_transform(src_img)
484
+ im_name = os.path.splitext(image)[0].split('_')[0]
485
+ # reference image and object mask
486
+ ref_name = im_name + '_ref.png'
487
+
488
+ ref_mask_path = os.path.join(self.ref_mask_dir, ref_name)
489
+ assert os.path.exists(ref_mask_path), ref_mask_path
490
+ ref_mask = read_mask(ref_mask_path)
491
+ ref_mask_np = np.array(ref_mask)
492
+ ref_mask_tensor = self.clip_mask_transform(ref_mask)
493
+ ref_mask_tensor = torch.where(ref_mask_tensor > 0.5, 1, 0)
494
+
495
+ ref_path = os.path.join(self.ref_dir, ref_name)
496
+ assert os.path.exists(ref_path), ref_path
497
+ ref_img = read_image(ref_path)
498
+ ref_img_np = np.array(ref_img) * (ref_mask_np[:,:,None] > 0.5)
499
+ ref_img = Image.fromarray(ref_img_np)
500
+ ref_tensor = self.clip_transform(ref_img)
501
+
502
+ mask_path = os.path.join(self.mask_dir, im_name + '_mask.png')
503
+ assert os.path.exists(mask_path), mask_path
504
+ mask_img = read_mask(mask_path)
505
+ mask_img = mask_img.resize((src_img.width, src_img.height))
506
+ bbox = mask2bbox(np.array(mask_img))
507
+ bbox_tensor = get_bbox_tensor(bbox, src_img.width, src_img.height)
508
+ mask_tensor = self.mask_transform(mask_img)
509
+ mask_tensor = torch.where(mask_tensor > 0.5, 1, 0).float()
510
+ inpaint_tensor = src_tensor * (1 - mask_tensor)
511
+
512
+ return {"image_path": src_path,
513
+ "gt_img": src_tensor,
514
+ "gt_mask": mask_tensor,
515
+ "bg_img": inpaint_tensor,
516
+ "bg_mask": mask_tensor,
517
+ "fg_img": ref_tensor,
518
+ 'fg_mask': ref_mask_tensor,
519
+ "bbox": bbox_tensor}
520
+ except:
521
+ idx = np.random.randint(0, len(self)-1)
522
+ return self[idx]
523
+
524
+ class FOSEDataset(data.Dataset):
525
+ def __init__(self, dataset_dir='/mnt/new/397927/dataset/FOS_Evaluation'):
526
+ data_root = dataset_dir
527
+ self.bg_dir = os.path.join(data_root, 'background')
528
+ self.mask_dir = os.path.join(data_root, 'bbox_mask')
529
+ self.bbox_dir = os.path.join(data_root, 'bbox')
530
+ self.fg_dir = os.path.join(data_root, 'foreground')
531
+ self.fgmask_dir = os.path.join(data_root, 'foreground_mask')
532
+ self.image_list = os.listdir(self.bg_dir)
533
+ self.image_size = (512, 512)
534
+ self.clip_transform = get_tensor_clip(image_size=(224, 224))
535
+ self.sd_transform = get_tensor(image_size=self.image_size)
536
+ self.mask_transform = get_tensor(normalize=False, image_size=self.image_size)
537
+
538
+ def __len__(self):
539
+ return len(self.image_list)
540
+
541
+ def load_bbox_file(self, bbox_file):
542
+ bbox_list = []
543
+ with open(bbox_file, 'r') as f:
544
+ for line in f.readlines():
545
+ info = line.strip().split(' ')
546
+ bbox = [int(float(f)) for f in info[:4]]
547
+ bbox_list.append(bbox)
548
+ return bbox_list[0]
549
+
550
+ def __getitem__(self, index):
551
+ image = self.image_list[index]
552
+ bg_path = os.path.join(self.bg_dir, image)
553
+ bg_img = Image.open(bg_path).convert('RGB')
554
+ bg_w, bg_h = bg_img.size
555
+ bg_t = self.sd_transform(bg_img)
556
+ fg_path = os.path.join(self.fg_dir, image)
557
+ fg_img = Image.open(fg_path).convert('RGB')
558
+ fgmask_path = os.path.join(self.fgmask_dir, image)
559
+ fg_mask = Image.open(fgmask_path).convert('L')
560
+ fg_np = np.array(fg_img) * (np.array(fg_mask)[:,:,None] > 0.5)
561
+ fg_img = Image.fromarray(fg_np)
562
+
563
+ fg_t = self.clip_transform(fg_img)
564
+ fgmask_t = self.mask_transform(fg_mask)
565
+ mask_path = os.path.join(self.mask_dir, image)
566
+ mask = Image.open(mask_path).convert('L')
567
+ mask_t = self.mask_transform(mask)
568
+ mask_t = torch.where(mask_t > 0.5, 1, 0).float()
569
+ inpaint_t = bg_t * (1 - mask_t)
570
+ bbox_path = os.path.join(self.bbox_dir, image.replace('.png', '.txt'))
571
+ bbox = self.load_bbox_file(bbox_path)
572
+ bbox_t = get_bbox_tensor(bbox, bg_w, bg_h)
573
+
574
+ return {"image_path": bg_path,
575
+ "bg_img": bg_t,
576
+ "inpaint_img": inpaint_t,
577
+ "bg_mask": mask_t,
578
+ "fg_img": fg_t,
579
+ "fg_mask": fgmask_t,
580
+ 'bbox': bbox_t}
581
+
582
+ def test_fos_dataset():
583
+ dataset = FOSEDataset()
584
+ dataloader = data.DataLoader(dataset=dataset,
585
+ batch_size=4,
586
+ shuffle=False,
587
+ num_workers=4)
588
+ for i, batch in enumerate(dataloader):
589
+ print(i, len(dataset), batch['inpaint_img'].shape, batch['fg_img'].shape)
590
+
591
+
592
+ def vis_random_augtype(batch):
593
+ file = batch['image_path']
594
+ gt_t = batch['gt_img']
595
+ gtmask_t = batch['gt_mask']
596
+ bg_t = batch['bg_img']
597
+ bgmask_t = batch['bg_mask']
598
+ fg_t = batch['fg_img']
599
+ fgmask_t = batch['fg_mask']
600
+
601
+ gt_imgs = reverse_image_tensor(gt_t)
602
+ gt_masks = reverse_mask_tensor(gtmask_t)
603
+ bg_imgs = reverse_image_tensor(bg_t)
604
+ fg_imgs = reverse_clip_tensor(fg_t)
605
+ fg_masks = reverse_mask_tensor(fgmask_t)
606
+
607
+ ver_border = np.ones((gt_imgs[0].shape[0], 10, 3), dtype=np.uint8) * np.array([0, 0, 250]).reshape((1,1,-1))
608
+ img_list = []
609
+ for i in range(len(gt_imgs)):
610
+ im_name = os.path.basename(file[i]) if len(file) > 1 else os.path.basename(file[0])
611
+ cat_img = np.concatenate([bg_imgs[i], ver_border, fg_imgs[i], ver_border, fg_masks[i], ver_border, gt_imgs[i], ver_border, gt_masks[i]], axis=1)
612
+ if i > 0:
613
+ hor_border = np.ones((10, cat_img.shape[1], 3), dtype=np.uint8) * np.array([0, 0, 250]).reshape((1,1,-1))
614
+ img_list.append(hor_border)
615
+ img_list.append(cat_img)
616
+ img_batch = np.concatenate(img_list, axis=0)
617
+ return img_batch
618
+
619
+ def test_cocoee_dataset():
620
+ from omegaconf import OmegaConf
621
+ from ldm.util import instantiate_from_config
622
+ from torch.utils.data import DataLoader
623
+ cfg_path = os.path.join(proj_dir, 'configs/v1.yaml')
624
+ configs = OmegaConf.load(cfg_path).data.params.validation
625
+ dataset = instantiate_from_config(configs)
626
+ dataloader = DataLoader(dataset=dataset,
627
+ batch_size=4,
628
+ shuffle=False,
629
+ num_workers=4)
630
+ print('{} samples = {} bs x {} batches'.format(
631
+ len(dataset), dataloader.batch_size, len(dataloader)
632
+ ))
633
+ vis_dir = os.path.join(proj_dir, 'outputs/test_samples')
634
+ if os.path.exists(vis_dir):
635
+ shutil.rmtree(vis_dir)
636
+ os.makedirs(vis_dir, exist_ok=True)
637
+ for i, batch in enumerate(dataloader):
638
+ file = batch['image_path']
639
+ gt_t = batch['gt_img']
640
+ bgmask_t = batch['bg_mask']
641
+ fg_t = batch['fg_img']
642
+ bbox_t = batch['bbox']
643
+ bg_t = batch['bg_img']
644
+ fg_mask = batch['fg_mask']
645
+ im_name = os.path.basename(file[0])
646
+ # test_fill_mask(batch, i)
647
+ print(i, len(dataloader), gt_t.shape, fg_t.shape, gt_t.shape, bbox_t.shape, fg_mask.shape)
648
+ batch_img = vis_random_augtype(batch)
649
+ cv2.imwrite(os.path.join(vis_dir, f'batch{i}.jpg'), batch_img)
650
+ if i > 10:
651
+ break
652
+
653
+
654
+ def test_open_images():
655
+ from omegaconf import OmegaConf
656
+ from ldm.util import instantiate_from_config
657
+ from torch.utils.data import DataLoader
658
+ cfg_path = os.path.join(proj_dir, 'configs/v1.yaml')
659
+ configs = OmegaConf.load(cfg_path).data.params.train
660
+ configs.params.split = 'validation'
661
+ dataset = instantiate_from_config(configs)
662
+ bs = 4
663
+ dataloader = DataLoader(dataset=dataset,
664
+ batch_size=bs,
665
+ shuffle=False,
666
+ num_workers=4)
667
+ print('{} samples = {} bs x {} batches'.format(
668
+ len(dataset), dataloader.batch_size, len(dataloader)
669
+ ))
670
+ vis_dir = os.path.join(proj_dir, 'outputs/train_samples')
671
+ if os.path.exists(vis_dir):
672
+ shutil.rmtree(vis_dir)
673
+ os.makedirs(vis_dir, exist_ok=True)
674
+
675
+ for i, batch in enumerate(dataloader):
676
+ for k in batch.keys():
677
+ if isinstance(batch[k], torch.Tensor) and batch[k].shape[0] == 1:
678
+ batch[k] = batch[k][0]
679
+
680
+ file = batch['image_path']
681
+ gt_t = batch['gt_img']
682
+ gtmask_t = batch['gt_mask']
683
+ bgmask_t = batch['bg_mask']
684
+ fg_t = batch['fg_img']
685
+ bbox_t = batch['bbox']
686
+ im_name = os.path.basename(file[0])
687
+ # test_fill_mask(batch, i)
688
+ print(i, len(dataloader), gt_t.shape, gtmask_t.shape, fg_t.shape, gt_t.shape, bbox_t.shape)
689
+ batch_img = vis_random_augtype(batch)
690
+ cv2.imwrite(os.path.join(vis_dir, f'batch{i}.jpg'), batch_img)
691
+ if i > 10:
692
+ break
693
+
694
+ def test_open_images_efficiency():
695
+ from omegaconf import OmegaConf
696
+ from ldm.util import instantiate_from_config
697
+ from torch.utils.data import DataLoader
698
+ cfg_path = os.path.join(proj_dir, 'configs/v1.yaml')
699
+ configs = OmegaConf.load(cfg_path).data.params.train
700
+ configs.params.split = 'train'
701
+ dataset = instantiate_from_config(configs)
702
+ bs = 16
703
+ dataloader = DataLoader(dataset=dataset,
704
+ batch_size=bs,
705
+ shuffle=False,
706
+ num_workers=16)
707
+ print('{} samples = {} bs x {} batches'.format(
708
+ len(dataset), dataloader.batch_size, len(dataloader)
709
+ ))
710
+ start = time.time()
711
+ data_len = len(dataloader)
712
+ for i,batch in enumerate(dataloader):
713
+ image = batch['gt_img']
714
+ end = time.time()
715
+ if i % 10 == 0:
716
+ print('{:.2f}, avg time {:.1f}ms'.format(
717
+ float(i) / data_len, (end-start) / (i+1) * 1000
718
+ ))
719
+
720
+
721
+ if __name__ == '__main__':
722
+ # test_mask_blur_batch()
723
+ # test_open_images()
724
+ # test_open_images_efficiency()
725
+ # test_cocoee_dataset()
726
+ test_fos_dataset()
727
+
728
+