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,1417 @@
1
+ """
2
+ wild mixture of
3
+ https://github.com/lucidrains/denoising-diffusion-pytorch/blob/7706bdfc6f527f58d33f84b7b522e61e6e3164b3/denoising_diffusion_pytorch/denoising_diffusion_pytorch.py
4
+ https://github.com/openai/improved-diffusion/blob/e94489283bb876ac1477d5dd7709bbbd2d9902ce/improved_diffusion/gaussian_diffusion.py
5
+ https://github.com/CompVis/taming-transformers
6
+ -- merci
7
+ """
8
+
9
+ from genericpath import samefile
10
+ import torch
11
+ import torch.nn as nn
12
+ import numpy as np
13
+ import pytorch_lightning as pl
14
+ from torch.optim.lr_scheduler import LambdaLR
15
+ import torch.nn.functional as F
16
+ from einops import rearrange, repeat
17
+ from contextlib import contextmanager
18
+ from functools import partial
19
+ from tqdm import tqdm
20
+ from torchvision.utils import make_grid
21
+ from pytorch_lightning.utilities.rank_zero import rank_zero_only
22
+ from libcom.os_insert.source.ldm.util import log_txt_as_img, exists, default, ismap, isimage, mean_flat, count_params, instantiate_from_config
23
+ from libcom.os_insert.source.ldm.modules.ema import LitEma
24
+ from libcom.os_insert.source.ldm.modules.distributions.distributions import normal_kl, DiagonalGaussianDistribution
25
+ from libcom.os_insert.source.ldm.models.autoencoder import VQModelInterface, IdentityFirstStage, AutoencoderKL
26
+ from libcom.os_insert.source.ldm.modules.diffusionmodules.util import make_beta_schedule, extract_into_tensor, noise_like
27
+ from libcom.os_insert.source.ldm.models.diffusion.ddim import DDIMSampler
28
+ from torchvision.transforms import Resize, Normalize
29
+ import math
30
+ import time
31
+ import random
32
+ from torch.autograd import Variable
33
+
34
+ __conditioning_keys__ = {'concat': 'c_concat',
35
+ 'crossattn': 'c_crossattn',
36
+ 'adm': 'y'}
37
+
38
+
39
+ def disabled_train(self, mode=True):
40
+ """Overwrite model.train with this function to make sure train/eval mode
41
+ does not change anymore."""
42
+ return self
43
+
44
+
45
+ def uniform_on_device(r1, r2, shape, device):
46
+ return (r1 - r2) * torch.rand(*shape, device=device) + r2
47
+
48
+ class DDPM(pl.LightningModule):
49
+ # classic DDPM with Gaussian diffusion, in image space
50
+ def __init__(self,
51
+ unet_config,
52
+ timesteps=1000,
53
+ beta_schedule="linear",
54
+ loss_type="l2",
55
+ ckpt_path=None,
56
+ ignore_keys=[],
57
+ load_only_unet=False,
58
+ monitor="val/loss",
59
+ use_ema=True,
60
+ first_stage_key="image",
61
+ image_size=256,
62
+ channels=3,
63
+ log_every_t=100,
64
+ clip_denoised=True,
65
+ linear_start=1e-4,
66
+ linear_end=2e-2,
67
+ cosine_s=8e-3,
68
+ given_betas=None,
69
+ original_elbo_weight=0.,
70
+ v_posterior=0., # weight for choosing posterior variance as sigma = (1-v) * beta_tilde + v * beta
71
+ l_simple_weight=1.,
72
+ conditioning_key=None,
73
+ parameterization="eps", # all assuming fixed variance schedules
74
+ scheduler_config=None,
75
+ use_positional_encodings=False,
76
+ learn_logvar=False,
77
+ logvar_init=0.,
78
+ u_cond_percent=0.1,
79
+ ):
80
+ super().__init__()
81
+ assert parameterization in ["eps", "x0"], 'currently only supporting "eps" and "x0"'
82
+ self.parameterization = parameterization
83
+ print(f"{self.__class__.__name__}: Running in {self.parameterization}-prediction mode")
84
+ self.cond_stage_model = None
85
+ self.clip_denoised = clip_denoised
86
+ self.log_every_t = log_every_t
87
+ self.first_stage_key = first_stage_key
88
+ self.image_size = image_size
89
+ self.channels = channels
90
+ self.u_cond_percent=u_cond_percent
91
+ self.use_positional_encodings = use_positional_encodings
92
+ self.model = DiffusionWrapper(unet_config, conditioning_key)
93
+ count_params(self.model, verbose=True)
94
+ self.use_ema = use_ema
95
+ if self.use_ema:
96
+ self.model_ema = LitEma(self.model)
97
+ print(f"Keeping EMAs of {len(list(self.model_ema.buffers()))}.")
98
+
99
+ self.use_scheduler = scheduler_config is not None
100
+ if self.use_scheduler:
101
+ self.scheduler_config = scheduler_config
102
+
103
+ self.v_posterior = v_posterior
104
+ self.original_elbo_weight = original_elbo_weight
105
+ self.l_simple_weight = l_simple_weight
106
+
107
+ if monitor is not None:
108
+ self.monitor = monitor
109
+ if ckpt_path is not None:
110
+ self.init_from_ckpt(ckpt_path, ignore_keys=ignore_keys, only_model=load_only_unet)
111
+
112
+ self.register_schedule(given_betas=given_betas, beta_schedule=beta_schedule, timesteps=timesteps,
113
+ linear_start=linear_start, linear_end=linear_end, cosine_s=cosine_s)
114
+
115
+ self.loss_type = loss_type
116
+
117
+ self.learn_logvar = learn_logvar
118
+ self.logvar = torch.full(fill_value=logvar_init, size=(self.num_timesteps,))
119
+ if self.learn_logvar:
120
+ self.logvar = nn.Parameter(self.logvar, requires_grad=True)
121
+
122
+
123
+ def register_schedule(self, given_betas=None, beta_schedule="linear", timesteps=1000,
124
+ linear_start=1e-4, linear_end=2e-2, cosine_s=8e-3):
125
+ if exists(given_betas):
126
+ betas = given_betas
127
+ else:
128
+ betas = make_beta_schedule(beta_schedule, timesteps, linear_start=linear_start, linear_end=linear_end,
129
+ cosine_s=cosine_s)
130
+ alphas = 1. - betas
131
+ alphas_cumprod = np.cumprod(alphas, axis=0)
132
+ alphas_cumprod_prev = np.append(1., alphas_cumprod[:-1])
133
+
134
+ timesteps, = betas.shape
135
+ self.num_timesteps = int(timesteps)
136
+ self.linear_start = linear_start
137
+ self.linear_end = linear_end
138
+ assert alphas_cumprod.shape[0] == self.num_timesteps, 'alphas have to be defined for each timestep'
139
+
140
+ to_torch = partial(torch.tensor, dtype=torch.float32)
141
+
142
+ self.register_buffer('betas', to_torch(betas))
143
+ self.register_buffer('alphas_cumprod', to_torch(alphas_cumprod))
144
+ self.register_buffer('alphas_cumprod_prev', to_torch(alphas_cumprod_prev))
145
+
146
+ # calculations for diffusion q(x_t | x_{t-1}) and others
147
+ self.register_buffer('sqrt_alphas_cumprod', to_torch(np.sqrt(alphas_cumprod)))
148
+ self.register_buffer('sqrt_one_minus_alphas_cumprod', to_torch(np.sqrt(1. - alphas_cumprod)))
149
+ self.register_buffer('log_one_minus_alphas_cumprod', to_torch(np.log(1. - alphas_cumprod)))
150
+ self.register_buffer('sqrt_recip_alphas_cumprod', to_torch(np.sqrt(1. / alphas_cumprod)))
151
+ self.register_buffer('sqrt_recipm1_alphas_cumprod', to_torch(np.sqrt(1. / alphas_cumprod - 1)))
152
+
153
+ # calculations for posterior q(x_{t-1} | x_t, x_0)
154
+ posterior_variance = (1 - self.v_posterior) * betas * (1. - alphas_cumprod_prev) / (
155
+ 1. - alphas_cumprod) + self.v_posterior * betas
156
+ # above: equal to 1. / (1. / (1. - alpha_cumprod_tm1) + alpha_t / beta_t)
157
+ self.register_buffer('posterior_variance', to_torch(posterior_variance))
158
+ # below: log calculation clipped because the posterior variance is 0 at the beginning of the diffusion chain
159
+ self.register_buffer('posterior_log_variance_clipped', to_torch(np.log(np.maximum(posterior_variance, 1e-20))))
160
+ self.register_buffer('posterior_mean_coef1', to_torch(
161
+ betas * np.sqrt(alphas_cumprod_prev) / (1. - alphas_cumprod)))
162
+ self.register_buffer('posterior_mean_coef2', to_torch(
163
+ (1. - alphas_cumprod_prev) * np.sqrt(alphas) / (1. - alphas_cumprod)))
164
+
165
+ if self.parameterization == "eps":
166
+ lvlb_weights = self.betas ** 2 / (
167
+ 2 * self.posterior_variance * to_torch(alphas) * (1 - self.alphas_cumprod))
168
+ elif self.parameterization == "x0":
169
+ lvlb_weights = 0.5 * np.sqrt(torch.Tensor(alphas_cumprod)) / (2. * 1 - torch.Tensor(alphas_cumprod))
170
+ else:
171
+ raise NotImplementedError("mu not supported")
172
+ # TODO how to choose this term
173
+ lvlb_weights[0] = lvlb_weights[1]
174
+ self.register_buffer('lvlb_weights', lvlb_weights, persistent=False)
175
+ assert not torch.isnan(self.lvlb_weights).all()
176
+
177
+ @contextmanager
178
+ def ema_scope(self, context=None):
179
+ if self.use_ema:
180
+ self.model_ema.store(self.model.parameters())
181
+ self.model_ema.copy_to(self.model)
182
+ if context is not None:
183
+ print(f"{context}: Switched to EMA weights")
184
+ try:
185
+ yield None
186
+ finally:
187
+ if self.use_ema:
188
+ self.model_ema.restore(self.model.parameters())
189
+ if context is not None:
190
+ print(f"{context}: Restored training weights")
191
+
192
+ def init_from_ckpt(self, path, ignore_keys=list(), only_model=False):
193
+ sd = torch.load(path, map_location="cpu")
194
+ if "state_dict" in list(sd.keys()):
195
+ sd = sd["state_dict"]
196
+ keys = list(sd.keys())
197
+ for k in keys:
198
+ for ik in ignore_keys:
199
+ if k.startswith(ik):
200
+ print("Deleting key {} from state_dict.".format(k))
201
+ del sd[k]
202
+ missing, unexpected = self.load_state_dict(sd, strict=False) if not only_model else self.model.load_state_dict(
203
+ sd, strict=False)
204
+ print(f"Restored from {path} with {len(missing)} missing and {len(unexpected)} unexpected keys")
205
+ if len(missing) > 0:
206
+ print(f"Missing Keys: {missing}")
207
+ if len(unexpected) > 0:
208
+ print(f"Unexpected Keys: {unexpected}")
209
+
210
+ def q_mean_variance(self, x_start, t):
211
+ """
212
+ Get the distribution q(x_t | x_0).
213
+ :param x_start: the [N x C x ...] tensor of noiseless inputs.
214
+ :param t: the number of diffusion steps (minus 1). Here, 0 means one step.
215
+ :return: A tuple (mean, variance, log_variance), all of x_start's shape.
216
+ """
217
+ mean = (extract_into_tensor(self.sqrt_alphas_cumprod, t, x_start.shape) * x_start)
218
+ variance = extract_into_tensor(1.0 - self.alphas_cumprod, t, x_start.shape)
219
+ log_variance = extract_into_tensor(self.log_one_minus_alphas_cumprod, t, x_start.shape)
220
+ return mean, variance, log_variance
221
+
222
+ def predict_start_from_noise(self, x_t, t, noise):
223
+ return (
224
+ extract_into_tensor(self.sqrt_recip_alphas_cumprod, t, x_t.shape) * x_t -
225
+ extract_into_tensor(self.sqrt_recipm1_alphas_cumprod, t, x_t.shape) * noise
226
+ )
227
+
228
+ def q_posterior(self, x_start, x_t, t):
229
+ posterior_mean = (
230
+ extract_into_tensor(self.posterior_mean_coef1, t, x_t.shape) * x_start +
231
+ extract_into_tensor(self.posterior_mean_coef2, t, x_t.shape) * x_t
232
+ )
233
+ posterior_variance = extract_into_tensor(self.posterior_variance, t, x_t.shape)
234
+ posterior_log_variance_clipped = extract_into_tensor(self.posterior_log_variance_clipped, t, x_t.shape)
235
+ return posterior_mean, posterior_variance, posterior_log_variance_clipped
236
+
237
+ def p_mean_variance(self, x, t, clip_denoised: bool):
238
+ model_out = self.model(x, t)
239
+ if self.parameterization == "eps":
240
+ x_recon = self.predict_start_from_noise(x, t=t, noise=model_out)
241
+ elif self.parameterization == "x0":
242
+ x_recon = model_out
243
+ if clip_denoised:
244
+ x_recon.clamp_(-1., 1.)
245
+
246
+ model_mean, posterior_variance, posterior_log_variance = self.q_posterior(x_start=x_recon, x_t=x, t=t)
247
+ return model_mean, posterior_variance, posterior_log_variance
248
+
249
+ @torch.no_grad()
250
+ def p_sample(self, x, t, clip_denoised=True, repeat_noise=False):
251
+ b, *_, device = *x.shape, x.device
252
+ model_mean, _, model_log_variance = self.p_mean_variance(x=x, t=t, clip_denoised=clip_denoised)
253
+ noise = noise_like(x.shape, device, repeat_noise)
254
+ # no noise when t == 0
255
+ nonzero_mask = (1 - (t == 0).float()).reshape(b, *((1,) * (len(x.shape) - 1)))
256
+ return model_mean + nonzero_mask * (0.5 * model_log_variance).exp() * noise
257
+
258
+ @torch.no_grad()
259
+ def p_sample_loop(self, shape, return_intermediates=False):
260
+ device = self.betas.device
261
+ b = shape[0]
262
+ img = torch.randn(shape, device=device)
263
+ intermediates = [img]
264
+ for i in tqdm(reversed(range(0, self.num_timesteps)), desc='Sampling t', total=self.num_timesteps):
265
+ img = self.p_sample(img, torch.full((b,), i, device=device, dtype=torch.long),
266
+ clip_denoised=self.clip_denoised)
267
+ if i % self.log_every_t == 0 or i == self.num_timesteps - 1:
268
+ intermediates.append(img)
269
+ if return_intermediates:
270
+ return img, intermediates
271
+ return img
272
+
273
+ @torch.no_grad()
274
+ def sample(self, batch_size=16, return_intermediates=False):
275
+ image_size = self.image_size
276
+ channels = self.channels
277
+ return self.p_sample_loop((batch_size, channels, image_size, image_size),
278
+ return_intermediates=return_intermediates)
279
+
280
+ def q_sample(self, x_start, t, noise=None):
281
+ noise = default(noise, lambda: torch.randn_like(x_start))
282
+ return (extract_into_tensor(self.sqrt_alphas_cumprod, t, x_start.shape) * x_start +
283
+ extract_into_tensor(self.sqrt_one_minus_alphas_cumprod, t, x_start.shape) * noise)
284
+
285
+ def get_loss(self, pred, target, mean=True):
286
+ if self.loss_type == 'l1':
287
+ loss = (target - pred).abs()
288
+ if mean:
289
+ loss = loss.mean()
290
+ elif self.loss_type == 'l2':
291
+ if mean:
292
+ loss = torch.nn.functional.mse_loss(target, pred)
293
+ else:
294
+ loss = torch.nn.functional.mse_loss(target, pred, reduction='none')
295
+ else:
296
+ raise NotImplementedError("unknown loss type '{loss_type}'")
297
+
298
+ return loss
299
+
300
+ def p_losses(self, x_start, t, noise=None):
301
+ noise = default(noise, lambda: torch.randn_like(x_start))
302
+ x_noisy = self.q_sample(x_start=x_start, t=t, noise=noise)
303
+ model_out = self.model(x_noisy, t)
304
+
305
+ loss_dict = {}
306
+ if self.parameterization == "eps":
307
+ target = noise
308
+ elif self.parameterization == "x0":
309
+ target = x_start
310
+ else:
311
+ raise NotImplementedError(f"Paramterization {self.parameterization} not yet supported")
312
+
313
+ loss = self.get_loss(model_out, target, mean=False).mean(dim=[1, 2, 3])
314
+
315
+ log_prefix = 'train' if self.training else 'val'
316
+
317
+ loss_dict.update({f'{log_prefix}/loss_simple': loss.mean()})
318
+ loss_simple = loss.mean() * self.l_simple_weight
319
+
320
+ loss_vlb = (self.lvlb_weights[t] * loss).mean()
321
+ loss_dict.update({f'{log_prefix}/loss_vlb': loss_vlb})
322
+
323
+ loss = loss_simple + self.original_elbo_weight * loss_vlb
324
+
325
+ loss_dict.update({f'{log_prefix}/loss': loss})
326
+
327
+ return loss, loss_dict
328
+
329
+ def forward(self, x, *args, **kwargs):
330
+ # b, c, h, w, device, img_size, = *x.shape, x.device, self.image_size
331
+ # assert h == img_size and w == img_size, f'height and width of image must be {img_size}'
332
+ t = torch.randint(0, self.num_timesteps, (x.shape[0],), device=self.device).long()
333
+ return self.p_losses(x, t, *args, **kwargs)
334
+
335
+ def get_input(self, batch, k):
336
+ def reformat_tensor(x):
337
+ return x.to(memory_format=torch.contiguous_format, device=self.device).float()
338
+ if k == "inpaint":
339
+ x = batch['GT']
340
+ mask = batch['inpaint_mask']
341
+ inpaint = batch['inpaint_image']
342
+ reference = batch['ref_imgs']
343
+ x = x.to(memory_format=torch.contiguous_format).float()
344
+ mask = mask.to(memory_format=torch.contiguous_format).float()
345
+ inpaint = inpaint.to(memory_format=torch.contiguous_format).float()
346
+ reference = reference.to(memory_format=torch.contiguous_format).float()
347
+ return x,inpaint,mask,reference
348
+ elif k == 'composition':
349
+ new_batch = dict()
350
+ new_batch['bg_img'] = reformat_tensor(batch['bg_img'])
351
+ new_batch['gt_img'] = reformat_tensor(batch['gt_img'])
352
+ new_batch['bg_mask'] = reformat_tensor(batch['bg_mask'])
353
+ new_batch['gt_mask'] = reformat_tensor(batch['gt_mask']) if 'gt_mask' in batch else new_batch['bg_mask'].clone()
354
+ if 'fg_mask' in batch:
355
+ new_batch['fg_mask'] = reformat_tensor(batch['fg_mask'])
356
+ if 'gt_fg_mask' in batch:
357
+ new_batch['gt_fg_mask'] = reformat_tensor(batch['gt_fg_mask'])
358
+ new_batch['fg_img'] = reformat_tensor(batch['fg_img'])
359
+ new_batch['bbox'] = reformat_tensor(batch['bbox'])
360
+ return new_batch
361
+ else:
362
+ x = batch[k]
363
+ return reformat_tensor(x) if isinstance(x) else x
364
+
365
+ def shared_step(self, batch):
366
+ x = self.get_input(batch, self.first_stage_key)
367
+ loss, loss_dict = self(x)
368
+ return loss, loss_dict
369
+
370
+ def training_step(self, batch, batch_idx):
371
+ loss, loss_dict = self.shared_step(batch)
372
+
373
+ self.log_dict(loss_dict, prog_bar=True, rank_zero_only=True,
374
+ logger=True, on_step=True, on_epoch=True, sync_dist=False)
375
+
376
+ self.log("global_step", self.global_step,
377
+ prog_bar=True, logger=True, on_step=True, on_epoch=False, sync_dist=False, rank_zero_only=True)
378
+
379
+ if self.use_scheduler:
380
+ lr = self.optimizers().param_groups[0]['lr']
381
+ self.log('lr_abs', lr, prog_bar=True, logger=True, on_step=True, on_epoch=False, sync_dist=False, rank_zero_only=True)
382
+
383
+ return loss
384
+
385
+ @torch.no_grad()
386
+ def validation_step(self, batch, batch_idx):
387
+ _, loss_dict_no_ema = self.shared_step(batch)
388
+ with self.ema_scope():
389
+ _, loss_dict_ema = self.shared_step(batch)
390
+ loss_dict_ema = {key + '_ema': loss_dict_ema[key] for key in loss_dict_ema}
391
+ self.log_dict(loss_dict_no_ema, prog_bar=False, logger=True, on_step=False, on_epoch=True, sync_dist=False, rank_zero_only=True)
392
+ self.log_dict(loss_dict_ema, prog_bar=False, logger=True, on_step=False, on_epoch=True, sync_dist=False, rank_zero_only=True)
393
+
394
+ def on_train_batch_end(self, *args, **kwargs):
395
+ if self.use_ema:
396
+ self.model_ema(self.model)
397
+
398
+ def _get_rows_from_list(self, samples):
399
+ n_imgs_per_row = len(samples)
400
+ denoise_grid = rearrange(samples, 'n b c h w -> b n c h w')
401
+ denoise_grid = rearrange(denoise_grid, 'b n c h w -> (b n) c h w')
402
+ denoise_grid = make_grid(denoise_grid, nrow=n_imgs_per_row)
403
+ return denoise_grid
404
+
405
+ @torch.no_grad()
406
+ def log_images(self, batch, N=8, n_row=2, sample=True, return_keys=None, **kwargs):
407
+ log = dict()
408
+ x = self.get_input(batch, self.first_stage_key)
409
+ N = min(x.shape[0], N)
410
+ n_row = min(x.shape[0], n_row)
411
+ x = x.to(self.device)[:N]
412
+ log["inputs"] = x
413
+
414
+ # get diffusion row
415
+ diffusion_row = list()
416
+ x_start = x[:n_row]
417
+
418
+ for t in range(self.num_timesteps):
419
+ if t % self.log_every_t == 0 or t == self.num_timesteps - 1:
420
+ t = repeat(torch.tensor([t]), '1 -> b', b=n_row)
421
+ t = t.to(self.device).long()
422
+ noise = torch.randn_like(x_start)
423
+ x_noisy = self.q_sample(x_start=x_start, t=t, noise=noise)
424
+ diffusion_row.append(x_noisy)
425
+
426
+ log["diffusion_row"] = self._get_rows_from_list(diffusion_row)
427
+
428
+ if sample:
429
+ # get denoise row
430
+ with self.ema_scope("Plotting"):
431
+ samples, denoise_row = self.sample(batch_size=N, return_intermediates=True)
432
+
433
+ log["samples"] = samples
434
+ log["denoise_row"] = self._get_rows_from_list(denoise_row)
435
+
436
+ if return_keys:
437
+ if np.intersect1d(list(log.keys()), return_keys).shape[0] == 0:
438
+ return log
439
+ else:
440
+ return {key: log[key] for key in return_keys}
441
+ return log
442
+
443
+ def configure_optimizers(self):
444
+ lr = self.learning_rate
445
+ params = list(self.model.parameters())
446
+ if self.learn_logvar:
447
+ params = params + [self.logvar]
448
+ opt = torch.optim.AdamW(params, lr=lr)
449
+ return opt
450
+
451
+
452
+ class LatentDiffusion(DDPM):
453
+ """main class"""
454
+ def __init__(self,
455
+ first_stage_config,
456
+ cond_stage_config,
457
+ num_timesteps_cond=None,
458
+ cond_stage_key="image",
459
+ cond_stage_trainable=True,
460
+ concat_mode=True,
461
+ cond_stage_forward=None,
462
+ conditioning_key=None,
463
+ scale_factor=1.0,
464
+ scale_by_std=False,
465
+ *args, **kwargs):
466
+ self.num_timesteps_cond = default(num_timesteps_cond, 1)
467
+ self.scale_by_std = scale_by_std
468
+ assert self.num_timesteps_cond <= kwargs['timesteps']
469
+ # for backwards compatibility after implementation of DiffusionWrapper
470
+ if conditioning_key is None:
471
+ conditioning_key = 'concat' if concat_mode else 'crossattn'
472
+ if cond_stage_config == '__is_unconditional__':
473
+ conditioning_key = None
474
+ ckpt_path = kwargs.pop("ckpt_path", None)
475
+ ignore_keys = kwargs.pop("ignore_keys", [])
476
+ super().__init__(conditioning_key=conditioning_key, *args, **kwargs)
477
+ self.learnable_vector = nn.Parameter(torch.randn((1,1,768)), requires_grad=False)
478
+ self.proj_out=nn.Linear(1024, 768)
479
+ self.concat_mode = concat_mode
480
+ self.cond_stage_trainable = cond_stage_trainable
481
+ self.cond_stage_key = cond_stage_key
482
+ try:
483
+ self.num_downs = len(first_stage_config.params.ddconfig.ch_mult) - 1
484
+ except:
485
+ self.num_downs = 0
486
+ if not scale_by_std:
487
+ self.scale_factor = scale_factor
488
+ else:
489
+ self.register_buffer('scale_factor', torch.tensor(scale_factor))
490
+ self.instantiate_first_stage(first_stage_config)
491
+ self.instantiate_cond_stage(cond_stage_config)
492
+ self.cond_stage_forward = cond_stage_forward
493
+ self.clip_denoised = False
494
+ self.restarted_from_ckpt = False
495
+ if ckpt_path is not None:
496
+ self.init_from_ckpt(ckpt_path, ignore_keys)
497
+ self.restarted_from_ckpt = True
498
+
499
+ def make_cond_schedule(self, ):
500
+ self.cond_ids = torch.full(size=(self.num_timesteps,), fill_value=self.num_timesteps - 1, dtype=torch.long)
501
+ ids = torch.round(torch.linspace(0, self.num_timesteps - 1, self.num_timesteps_cond)).long()
502
+ self.cond_ids[:self.num_timesteps_cond] = ids
503
+
504
+ @rank_zero_only
505
+ @torch.no_grad()
506
+ def on_train_batch_start(self, batch, batch_idx):
507
+ # only for very first batch
508
+ if self.scale_by_std and self.current_epoch == 0 and self.global_step == 0 and batch_idx == 0 and not self.restarted_from_ckpt:
509
+ assert self.scale_factor == 1., 'rather not use custom rescaling and std-rescaling simultaneously'
510
+ # set rescale weight to 1./std of encodings
511
+ print("### USING STD-RESCALING ###")
512
+ x = super().get_input(batch, self.first_stage_key)
513
+ x = x.to(self.device)
514
+ encoder_posterior = self.encode_first_stage(x)
515
+ z = self.get_first_stage_encoding(encoder_posterior).detach()
516
+ del self.scale_factor
517
+ self.register_buffer('scale_factor', 1. / z.flatten().std())
518
+ print(f"setting self.scale_factor to {self.scale_factor}")
519
+ print("### USING STD-RESCALING ###")
520
+
521
+ def register_schedule(self,
522
+ given_betas=None, beta_schedule="linear", timesteps=1000,
523
+ linear_start=1e-4, linear_end=2e-2, cosine_s=8e-3):
524
+ super().register_schedule(given_betas, beta_schedule, timesteps, linear_start, linear_end, cosine_s)
525
+
526
+ self.shorten_cond_schedule = self.num_timesteps_cond > 1
527
+ if self.shorten_cond_schedule:
528
+ self.make_cond_schedule()
529
+
530
+ def instantiate_first_stage(self, config):
531
+ model = instantiate_from_config(config)
532
+ self.first_stage_model = model.eval()
533
+ self.first_stage_model.train = disabled_train
534
+ for param in self.first_stage_model.parameters():
535
+ param.requires_grad = False
536
+
537
+ def instantiate_cond_stage(self, config):
538
+ if not self.cond_stage_trainable:
539
+ if config == "__is_first_stage__":
540
+ print("Using first stage also as cond stage.")
541
+ self.cond_stage_model = self.first_stage_model
542
+ elif config == "__is_unconditional__":
543
+ print(f"Training {self.__class__.__name__} as an unconditional model.")
544
+ self.cond_stage_model = None
545
+ # self.be_unconditional = True
546
+ else:
547
+ model = instantiate_from_config(config)
548
+ self.cond_stage_model = model.eval()
549
+ self.cond_stage_model.train = disabled_train
550
+ for param in self.cond_stage_model.parameters():
551
+ param.requires_grad = False
552
+ else:
553
+ assert config != '__is_first_stage__'
554
+ assert config != '__is_unconditional__'
555
+ model = instantiate_from_config(config)
556
+ self.cond_stage_model = model
557
+ count_params(self.cond_stage_model, verbose=True)
558
+
559
+
560
+ def _get_denoise_row_from_list(self, samples, desc='', force_no_decoder_quantization=False):
561
+ denoise_row = []
562
+ for zd in tqdm(samples, desc=desc):
563
+ dz = self.decode_first_stage(zd.to(self.device),force_not_quantize=force_no_decoder_quantization)
564
+ dz = Resize((256, 256))(dz)
565
+ denoise_row.append(dz)
566
+ n_imgs_per_row = len(denoise_row)
567
+ denoise_row = torch.stack(denoise_row) # n_log_step, n_row, C, H, W
568
+ denoise_grid = rearrange(denoise_row, 'n b c h w -> b n c h w')
569
+ denoise_grid = rearrange(denoise_grid, 'b n c h w -> (b n) c h w')
570
+ denoise_grid = make_grid(denoise_grid, nrow=n_imgs_per_row)
571
+ return denoise_grid
572
+
573
+ def get_first_stage_encoding(self, encoder_posterior):
574
+ if isinstance(encoder_posterior, DiagonalGaussianDistribution):
575
+ z = encoder_posterior.sample()
576
+ elif isinstance(encoder_posterior, torch.Tensor):
577
+ z = encoder_posterior
578
+ else:
579
+ raise NotImplementedError(f"encoder_posterior of type '{type(encoder_posterior)}' not yet implemented")
580
+ return self.scale_factor * z
581
+
582
+ def get_learned_conditioning(self, c):
583
+ if self.cond_stage_forward is None:
584
+ if hasattr(self.cond_stage_model, 'encode') and callable(self.cond_stage_model.encode):
585
+ c = self.cond_stage_model.encode(c)
586
+ if isinstance(c, DiagonalGaussianDistribution):
587
+ c = c.mode()
588
+ else:
589
+ c = self.cond_stage_model(c)
590
+ else:
591
+ assert hasattr(self.cond_stage_model, self.cond_stage_forward)
592
+ c = getattr(self.cond_stage_model, self.cond_stage_forward)(c)
593
+ return c
594
+
595
+
596
+ def meshgrid(self, h, w):
597
+ y = torch.arange(0, h).view(h, 1, 1).repeat(1, w, 1)
598
+ x = torch.arange(0, w).view(1, w, 1).repeat(h, 1, 1)
599
+
600
+ arr = torch.cat([y, x], dim=-1)
601
+ return arr
602
+
603
+ def delta_border(self, h, w):
604
+ """
605
+ :param h: height
606
+ :param w: width
607
+ :return: normalized distance to image border,
608
+ wtith min distance = 0 at border and max dist = 0.5 at image center
609
+ """
610
+ lower_right_corner = torch.tensor([h - 1, w - 1]).view(1, 1, 2)
611
+ arr = self.meshgrid(h, w) / lower_right_corner
612
+ dist_left_up = torch.min(arr, dim=-1, keepdims=True)[0]
613
+ dist_right_down = torch.min(1 - arr, dim=-1, keepdims=True)[0]
614
+ edge_dist = torch.min(torch.cat([dist_left_up, dist_right_down], dim=-1), dim=-1)[0]
615
+ return edge_dist
616
+
617
+ def get_weighting(self, h, w, Ly, Lx, device):
618
+ weighting = self.delta_border(h, w)
619
+ weighting = torch.clip(weighting, self.split_input_params["clip_min_weight"],
620
+ self.split_input_params["clip_max_weight"], )
621
+ weighting = weighting.view(1, h * w, 1).repeat(1, 1, Ly * Lx).to(device)
622
+
623
+ if self.split_input_params["tie_braker"]:
624
+ L_weighting = self.delta_border(Ly, Lx)
625
+ L_weighting = torch.clip(L_weighting,
626
+ self.split_input_params["clip_min_tie_weight"],
627
+ self.split_input_params["clip_max_tie_weight"])
628
+
629
+ L_weighting = L_weighting.view(1, 1, Ly * Lx).to(device)
630
+ weighting = weighting * L_weighting
631
+ return weighting
632
+
633
+ def get_fold_unfold(self, x, kernel_size, stride, uf=1, df=1): # todo load once not every time, shorten code
634
+ """
635
+ :param x: img of size (bs, c, h, w)
636
+ :return: n img crops of size (n, bs, c, kernel_size[0], kernel_size[1])
637
+ """
638
+ bs, nc, h, w = x.shape
639
+
640
+ # number of crops in image
641
+ Ly = (h - kernel_size[0]) // stride[0] + 1
642
+ Lx = (w - kernel_size[1]) // stride[1] + 1
643
+
644
+ if uf == 1 and df == 1:
645
+ fold_params = dict(kernel_size=kernel_size, dilation=1, padding=0, stride=stride)
646
+ unfold = torch.nn.Unfold(**fold_params)
647
+
648
+ fold = torch.nn.Fold(output_size=x.shape[2:], **fold_params)
649
+
650
+ weighting = self.get_weighting(kernel_size[0], kernel_size[1], Ly, Lx, x.device).to(x.dtype)
651
+ normalization = fold(weighting).view(1, 1, h, w) # normalizes the overlap
652
+ weighting = weighting.view((1, 1, kernel_size[0], kernel_size[1], Ly * Lx))
653
+
654
+ elif uf > 1 and df == 1:
655
+ fold_params = dict(kernel_size=kernel_size, dilation=1, padding=0, stride=stride)
656
+ unfold = torch.nn.Unfold(**fold_params)
657
+
658
+ fold_params2 = dict(kernel_size=(kernel_size[0] * uf, kernel_size[0] * uf),
659
+ dilation=1, padding=0,
660
+ stride=(stride[0] * uf, stride[1] * uf))
661
+ fold = torch.nn.Fold(output_size=(x.shape[2] * uf, x.shape[3] * uf), **fold_params2)
662
+
663
+ weighting = self.get_weighting(kernel_size[0] * uf, kernel_size[1] * uf, Ly, Lx, x.device).to(x.dtype)
664
+ normalization = fold(weighting).view(1, 1, h * uf, w * uf) # normalizes the overlap
665
+ weighting = weighting.view((1, 1, kernel_size[0] * uf, kernel_size[1] * uf, Ly * Lx))
666
+
667
+ elif df > 1 and uf == 1:
668
+ fold_params = dict(kernel_size=kernel_size, dilation=1, padding=0, stride=stride)
669
+ unfold = torch.nn.Unfold(**fold_params)
670
+
671
+ fold_params2 = dict(kernel_size=(kernel_size[0] // df, kernel_size[0] // df),
672
+ dilation=1, padding=0,
673
+ stride=(stride[0] // df, stride[1] // df))
674
+ fold = torch.nn.Fold(output_size=(x.shape[2] // df, x.shape[3] // df), **fold_params2)
675
+
676
+ weighting = self.get_weighting(kernel_size[0] // df, kernel_size[1] // df, Ly, Lx, x.device).to(x.dtype)
677
+ normalization = fold(weighting).view(1, 1, h // df, w // df) # normalizes the overlap
678
+ weighting = weighting.view((1, 1, kernel_size[0] // df, kernel_size[1] // df, Ly * Lx))
679
+
680
+ else:
681
+ raise NotImplementedError
682
+
683
+ return fold, unfold, normalization, weighting
684
+
685
+ @torch.no_grad()
686
+ def get_input(self, batch, k, return_first_stage_outputs=False, bs=None):
687
+ batch = super().get_input(batch, k)
688
+ if bs is not None:
689
+ for k in batch.keys():
690
+ if isinstance(batch[k], torch.Tensor):
691
+ batch[k] = batch[k][:bs]
692
+
693
+ encoder_posterior = self.encode_first_stage(batch['gt_img'])
694
+ z = self.get_first_stage_encoding(encoder_posterior).detach()
695
+ batch['latent'] = z
696
+ encoder_posterior_bg = self.encode_first_stage(batch['bg_img'])
697
+ z_bg = self.get_first_stage_encoding(encoder_posterior_bg).detach()
698
+ batch['bg_latent'] = z_bg
699
+ batch['bg_mask'] = Resize([z.shape[-1],z.shape[-1]])(batch['bg_mask'])
700
+ batch['gt_mask'] = Resize([z.shape[-1],z.shape[-1]])(batch['gt_mask'])
701
+ batch['fg_mask'] = Resize([16, 16])(batch['fg_mask'])
702
+ c = self.get_learned_conditioning(batch['fg_img'])
703
+ c = self.proj_out(c)
704
+ batch['cond'] = c
705
+
706
+ if return_first_stage_outputs:
707
+ if self.first_stage_key in ['inpaint', 'composition']:
708
+ xrec = self.decode_first_stage(z[:,:4,:,:])
709
+ else:
710
+ xrec = self.decode_first_stage(z)
711
+ batch['rec'] = xrec
712
+ return batch
713
+
714
+ @torch.no_grad()
715
+ def decode_first_stage(self, z, predict_cids=False, force_not_quantize=False):
716
+ if predict_cids:
717
+ if z.dim() == 4:
718
+ z = torch.argmax(z.exp(), dim=1).long()
719
+ z = self.first_stage_model.quantize.get_codebook_entry(z, shape=None)
720
+ z = rearrange(z, 'b h w c -> b c h w').contiguous()
721
+
722
+ z = 1. / self.scale_factor * z
723
+
724
+ if hasattr(self, "split_input_params"):
725
+ if self.split_input_params["patch_distributed_vq"]:
726
+ ks = self.split_input_params["ks"] # eg. (128, 128)
727
+ stride = self.split_input_params["stride"] # eg. (64, 64)
728
+ uf = self.split_input_params["vqf"]
729
+ bs, nc, h, w = z.shape
730
+ if ks[0] > h or ks[1] > w:
731
+ ks = (min(ks[0], h), min(ks[1], w))
732
+ print("reducing Kernel")
733
+
734
+ if stride[0] > h or stride[1] > w:
735
+ stride = (min(stride[0], h), min(stride[1], w))
736
+ print("reducing stride")
737
+
738
+ fold, unfold, normalization, weighting = self.get_fold_unfold(z, ks, stride, uf=uf)
739
+
740
+ z = unfold(z) # (bn, nc * prod(**ks), L)
741
+ # 1. Reshape to img shape
742
+ z = z.view((z.shape[0], -1, ks[0], ks[1], z.shape[-1])) # (bn, nc, ks[0], ks[1], L )
743
+
744
+ # 2. apply model loop over last dim
745
+ if isinstance(self.first_stage_model, VQModelInterface):
746
+ output_list = [self.first_stage_model.decode(z[:, :, :, :, i],
747
+ force_not_quantize=predict_cids or force_not_quantize)
748
+ for i in range(z.shape[-1])]
749
+ else:
750
+
751
+ output_list = [self.first_stage_model.decode(z[:, :, :, :, i])
752
+ for i in range(z.shape[-1])]
753
+
754
+ o = torch.stack(output_list, axis=-1) # # (bn, nc, ks[0], ks[1], L)
755
+ o = o * weighting
756
+ # Reverse 1. reshape to img shape
757
+ o = o.view((o.shape[0], -1, o.shape[-1])) # (bn, nc * ks[0] * ks[1], L)
758
+ # stitch crops together
759
+ decoded = fold(o)
760
+ decoded = decoded / normalization # norm is shape (1, 1, h, w)
761
+ return decoded
762
+ else:
763
+ if isinstance(self.first_stage_model, VQModelInterface):
764
+ return self.first_stage_model.decode(z, force_not_quantize=predict_cids or force_not_quantize)
765
+ else:
766
+ return self.first_stage_model.decode(z)
767
+ else:
768
+ if isinstance(self.first_stage_model, VQModelInterface):
769
+ return self.first_stage_model.decode(z, force_not_quantize=predict_cids or force_not_quantize)
770
+ else:
771
+ if self.first_stage_key in ['inpaint','composition']:
772
+ return self.first_stage_model.decode(z[:,:4,:,:])
773
+ else:
774
+ return self.first_stage_model.decode(z)
775
+
776
+ # same as above but without decorator
777
+ def differentiable_decode_first_stage(self, z, predict_cids=False, force_not_quantize=False):
778
+ if predict_cids:
779
+ if z.dim() == 4:
780
+ z = torch.argmax(z.exp(), dim=1).long()
781
+ z = self.first_stage_model.quantize.get_codebook_entry(z, shape=None)
782
+ z = rearrange(z, 'b h w c -> b c h w').contiguous()
783
+
784
+ z = 1. / self.scale_factor * z
785
+
786
+ if hasattr(self, "split_input_params"):
787
+ if self.split_input_params["patch_distributed_vq"]:
788
+ ks = self.split_input_params["ks"] # eg. (128, 128)
789
+ stride = self.split_input_params["stride"] # eg. (64, 64)
790
+ uf = self.split_input_params["vqf"]
791
+ bs, nc, h, w = z.shape
792
+ if ks[0] > h or ks[1] > w:
793
+ ks = (min(ks[0], h), min(ks[1], w))
794
+ print("reducing Kernel")
795
+
796
+ if stride[0] > h or stride[1] > w:
797
+ stride = (min(stride[0], h), min(stride[1], w))
798
+ print("reducing stride")
799
+
800
+ fold, unfold, normalization, weighting = self.get_fold_unfold(z, ks, stride, uf=uf)
801
+
802
+ z = unfold(z) # (bn, nc * prod(**ks), L)
803
+ # 1. Reshape to img shape
804
+ z = z.view((z.shape[0], -1, ks[0], ks[1], z.shape[-1])) # (bn, nc, ks[0], ks[1], L )
805
+
806
+ # 2. apply model loop over last dim
807
+ if isinstance(self.first_stage_model, VQModelInterface):
808
+ output_list = [self.first_stage_model.decode(z[:, :, :, :, i],
809
+ force_not_quantize=predict_cids or force_not_quantize)
810
+ for i in range(z.shape[-1])]
811
+ else:
812
+
813
+ output_list = [self.first_stage_model.decode(z[:, :, :, :, i])
814
+ for i in range(z.shape[-1])]
815
+
816
+ o = torch.stack(output_list, axis=-1) # # (bn, nc, ks[0], ks[1], L)
817
+ o = o * weighting
818
+ # Reverse 1. reshape to img shape
819
+ o = o.view((o.shape[0], -1, o.shape[-1])) # (bn, nc * ks[0] * ks[1], L)
820
+ # stitch crops together
821
+ decoded = fold(o)
822
+ decoded = decoded / normalization # norm is shape (1, 1, h, w)
823
+ return decoded
824
+ else:
825
+ if isinstance(self.first_stage_model, VQModelInterface):
826
+ return self.first_stage_model.decode(z, force_not_quantize=predict_cids or force_not_quantize)
827
+ else:
828
+ return self.first_stage_model.decode(z)
829
+
830
+ else:
831
+ if isinstance(self.first_stage_model, VQModelInterface):
832
+ return self.first_stage_model.decode(z, force_not_quantize=predict_cids or force_not_quantize)
833
+ else:
834
+ return self.first_stage_model.decode(z)
835
+
836
+ @torch.no_grad()
837
+ def encode_first_stage(self, x):
838
+ if hasattr(self, "split_input_params"):
839
+ if self.split_input_params["patch_distributed_vq"]:
840
+ ks = self.split_input_params["ks"] # eg. (128, 128)
841
+ stride = self.split_input_params["stride"] # eg. (64, 64)
842
+ df = self.split_input_params["vqf"]
843
+ self.split_input_params['original_image_size'] = x.shape[-2:]
844
+ bs, nc, h, w = x.shape
845
+ if ks[0] > h or ks[1] > w:
846
+ ks = (min(ks[0], h), min(ks[1], w))
847
+ print("reducing Kernel")
848
+
849
+ if stride[0] > h or stride[1] > w:
850
+ stride = (min(stride[0], h), min(stride[1], w))
851
+ print("reducing stride")
852
+
853
+ fold, unfold, normalization, weighting = self.get_fold_unfold(x, ks, stride, df=df)
854
+ z = unfold(x) # (bn, nc * prod(**ks), L)
855
+ # Reshape to img shape
856
+ z = z.view((z.shape[0], -1, ks[0], ks[1], z.shape[-1])) # (bn, nc, ks[0], ks[1], L )
857
+
858
+ output_list = [self.first_stage_model.encode(z[:, :, :, :, i])
859
+ for i in range(z.shape[-1])]
860
+
861
+ o = torch.stack(output_list, axis=-1)
862
+ o = o * weighting
863
+
864
+ # Reverse reshape to img shape
865
+ o = o.view((o.shape[0], -1, o.shape[-1])) # (bn, nc * ks[0] * ks[1], L)
866
+ # stitch crops together
867
+ decoded = fold(o)
868
+ decoded = decoded / normalization
869
+ return decoded
870
+
871
+ else:
872
+ return self.first_stage_model.encode(x)
873
+ else:
874
+ return self.first_stage_model.encode(x)
875
+
876
+ def shared_step(self, batch, **kwargs):
877
+ x = self.get_input(batch, self.first_stage_key)
878
+ loss = self(x)
879
+ return loss
880
+
881
+ def forward(self, inputs, *args, **kwargs):
882
+ self.opt.params=self.params
883
+ x = inputs['latent']
884
+ c = inputs['cond']
885
+ t = torch.randint(0, self.num_timesteps, (x.shape[0],), device=self.device).long()
886
+ self.u_cond_prop=random.uniform(0, 1)
887
+ if self.u_cond_prop<self.u_cond_percent:
888
+ self.opt.params=self.params_with_white
889
+ inputs['cond'] = self.learnable_vector.repeat(c.shape[0],c.shape[1],1)
890
+ return self.p_losses(inputs, t)
891
+ else:
892
+ return self.p_losses(inputs, t)
893
+
894
+
895
+ def _rescale_annotations(self, bboxes, crop_coordinates): # TODO: move to dataset
896
+ def rescale_bbox(bbox):
897
+ x0 = clamp((bbox[0] - crop_coordinates[0]) / crop_coordinates[2])
898
+ y0 = clamp((bbox[1] - crop_coordinates[1]) / crop_coordinates[3])
899
+ w = min(bbox[2] / crop_coordinates[2], 1 - x0)
900
+ h = min(bbox[3] / crop_coordinates[3], 1 - y0)
901
+ return x0, y0, w, h
902
+
903
+ return [rescale_bbox(b) for b in bboxes]
904
+
905
+ def apply_model(self, x_noisy, bbox, t, cond, **kwargs):
906
+ if isinstance(cond, dict):
907
+ # hybrid case, cond is exptected to be a dict
908
+ pass
909
+ else:
910
+ key = 'c_concat' if self.model.conditioning_key == 'concat' else 'c_crossattn'
911
+ cond = {key: cond}
912
+ x_recon = self.model(x_noisy, t, **cond)
913
+ return x_recon
914
+
915
+ def _predict_eps_from_xstart(self, x_t, t, pred_xstart):
916
+ return (extract_into_tensor(self.sqrt_recip_alphas_cumprod, t, x_t.shape) * x_t - pred_xstart) / \
917
+ extract_into_tensor(self.sqrt_recipm1_alphas_cumprod, t, x_t.shape)
918
+
919
+ def _prior_bpd(self, x_start):
920
+ """
921
+ Get the prior KL term for the variational lower-bound, measured in bits-per-dim.
922
+ This term can't be optimized, as it only depends on the encoder.
923
+ :param x_start: the [N x C x ...] tensor of inputs.
924
+ :return: a batch of [N] KL values (in bits), one per batch element.
925
+ """
926
+ batch_size = x_start.shape[0]
927
+ t = torch.tensor([self.num_timesteps - 1] * batch_size, device=x_start.device)
928
+ qt_mean, _, qt_log_variance = self.q_mean_variance(x_start, t)
929
+ kl_prior = normal_kl(mean1=qt_mean, logvar1=qt_log_variance, mean2=0.0, logvar2=0.0)
930
+ return mean_flat(kl_prior) / np.log(2.0)
931
+
932
+ def p_losses(self, inputs, t, noise=None, ):
933
+ x_start = inputs['latent']
934
+ noise = default(noise, lambda: torch.randn_like(x_start))
935
+ x_noisy = self.q_sample(x_start=x_start, t=t, noise=noise)
936
+ bg_latent = inputs["bg_latent"]
937
+ bg_mask = inputs['bg_mask']
938
+ fg_mask = inputs['fg_mask']
939
+ gt_mask = inputs['gt_mask']
940
+ bbox = inputs['bbox']
941
+ cond = inputs['cond']
942
+
943
+ x_input = torch.cat([x_noisy, bg_latent, 1 - bg_mask], dim=1)
944
+ model_output = self.apply_model(x_input, bbox, t, cond)
945
+
946
+ loss_dict = {}
947
+ prefix = 'train' if self.training else 'val'
948
+
949
+ if self.parameterization == "x0":
950
+ target = x_start
951
+ elif self.parameterization == "eps":
952
+ target = noise
953
+ else:
954
+ raise NotImplementedError()
955
+
956
+ loss_simple = self.get_loss(model_output, target, mean=False).mean([1, 2, 3])
957
+ loss_dict.update({f'{prefix}/loss_simple': loss_simple.mean()})
958
+ logvar_t = self.logvar[t.to(self.logvar.device)].to(self.device)
959
+ loss = loss_simple / torch.exp(logvar_t) + logvar_t
960
+ # loss = loss_simple / torch.exp(self.logvar) + self.logvar
961
+ if self.learn_logvar:
962
+ loss_dict.update({f'{prefix}/loss_gamma': loss.mean()})
963
+ loss_dict.update({'logvar': self.logvar.data.mean()})
964
+ loss = loss.mean()
965
+
966
+ loss_vlb = self.get_loss(model_output, target, mean=False).mean(dim=(1, 2, 3))
967
+ loss_vlb = (self.lvlb_weights[t] * loss_vlb).mean()
968
+ loss_dict.update({f'{prefix}/loss_vlb': loss_vlb})
969
+ loss += (self.original_elbo_weight * loss_vlb)
970
+ loss_dict.update({f'{prefix}/loss': loss})
971
+
972
+ return loss, loss_dict
973
+
974
+ def p_mean_variance(self, x, bbox, c, t, clip_denoised: bool, return_codebook_ids=False, quantize_denoised=False,
975
+ return_x0=False, score_corrector=None, corrector_kwargs=None):
976
+ t_in = t
977
+ model_out = self.apply_model(x, bbox, t_in, c, return_ids=return_codebook_ids)
978
+
979
+ if score_corrector is not None:
980
+ assert self.parameterization == "eps"
981
+ model_out = score_corrector.modify_score(self, model_out, x, t, c, **corrector_kwargs)
982
+
983
+ if return_codebook_ids:
984
+ model_out, logits = model_out
985
+
986
+ if self.parameterization == "eps":
987
+ x_recon = self.predict_start_from_noise(x, t=t, noise=model_out)
988
+ elif self.parameterization == "x0":
989
+ x_recon = model_out
990
+ else:
991
+ raise NotImplementedError()
992
+
993
+ if clip_denoised:
994
+ x_recon.clamp_(-1., 1.)
995
+ if quantize_denoised:
996
+ x_recon, _, [_, _, indices] = self.first_stage_model.quantize(x_recon)
997
+ model_mean, posterior_variance, posterior_log_variance = self.q_posterior(x_start=x_recon, x_t=x, t=t)
998
+ if return_codebook_ids:
999
+ return model_mean, posterior_variance, posterior_log_variance, logits
1000
+ elif return_x0:
1001
+ return model_mean, posterior_variance, posterior_log_variance, x_recon
1002
+ else:
1003
+ return model_mean, posterior_variance, posterior_log_variance
1004
+
1005
+ @torch.no_grad()
1006
+ def p_sample(self, x, bbox, c, t, clip_denoised=False, repeat_noise=False,
1007
+ return_codebook_ids=False, quantize_denoised=False, return_x0=False,
1008
+ temperature=1., noise_dropout=0., score_corrector=None, corrector_kwargs=None):
1009
+ b, *_, device = *x.shape, x.device
1010
+ outputs = self.p_mean_variance(x=x, bbox=bbox, c=c, t=t, clip_denoised=clip_denoised,
1011
+ return_codebook_ids=return_codebook_ids,
1012
+ quantize_denoised=quantize_denoised,
1013
+ return_x0=return_x0,
1014
+ score_corrector=score_corrector, corrector_kwargs=corrector_kwargs)
1015
+ if return_codebook_ids:
1016
+ raise DeprecationWarning("Support dropped.")
1017
+ model_mean, _, model_log_variance, logits = outputs
1018
+ elif return_x0:
1019
+ model_mean, _, model_log_variance, x0 = outputs
1020
+ else:
1021
+ model_mean, _, model_log_variance = outputs
1022
+
1023
+ noise = noise_like(x.shape, device, repeat_noise) * temperature
1024
+ if noise_dropout > 0.:
1025
+ noise = torch.nn.functional.dropout(noise, p=noise_dropout)
1026
+ # no noise when t == 0
1027
+ nonzero_mask = (1 - (t == 0).float()).reshape(b, *((1,) * (len(x.shape) - 1)))
1028
+
1029
+ if return_codebook_ids:
1030
+ return model_mean + nonzero_mask * (0.5 * model_log_variance).exp() * noise, logits.argmax(dim=1)
1031
+ if return_x0:
1032
+ return model_mean + nonzero_mask * (0.5 * model_log_variance).exp() * noise, x0
1033
+ else:
1034
+ return model_mean + nonzero_mask * (0.5 * model_log_variance).exp() * noise
1035
+
1036
+ @torch.no_grad()
1037
+ def progressive_denoising(self, cond, shape, verbose=True, callback=None, quantize_denoised=False,
1038
+ img_callback=None, mask=None, x0=None, temperature=1., noise_dropout=0.,
1039
+ score_corrector=None, corrector_kwargs=None, batch_size=None, x_T=None, start_T=None,
1040
+ log_every_t=None):
1041
+ if not log_every_t:
1042
+ log_every_t = self.log_every_t
1043
+ timesteps = self.num_timesteps
1044
+ if batch_size is not None:
1045
+ b = batch_size if batch_size is not None else shape[0]
1046
+ shape = [batch_size] + list(shape)
1047
+ else:
1048
+ b = batch_size = shape[0]
1049
+ if x_T is None:
1050
+ img = torch.randn(shape, device=self.device)
1051
+ else:
1052
+ img = x_T
1053
+ intermediates = []
1054
+ if cond is not None:
1055
+ if isinstance(cond, dict):
1056
+ cond = {key: cond[key][:batch_size] if not isinstance(cond[key], list) else
1057
+ list(map(lambda x: x[:batch_size], cond[key])) for key in cond}
1058
+ else:
1059
+ cond = [c[:batch_size] for c in cond] if isinstance(cond, list) else cond[:batch_size]
1060
+
1061
+ if start_T is not None:
1062
+ timesteps = min(timesteps, start_T)
1063
+ iterator = tqdm(reversed(range(0, timesteps)), desc='Progressive Generation',
1064
+ total=timesteps) if verbose else reversed(
1065
+ range(0, timesteps))
1066
+ if type(temperature) == float:
1067
+ temperature = [temperature] * timesteps
1068
+
1069
+ for i in iterator:
1070
+ ts = torch.full((b,), i, device=self.device, dtype=torch.long)
1071
+ if self.shorten_cond_schedule:
1072
+ assert self.model.conditioning_key != 'hybrid'
1073
+ tc = self.cond_ids[ts].to(cond.device)
1074
+ cond = self.q_sample(x_start=cond, t=tc, noise=torch.randn_like(cond))
1075
+
1076
+ img, x0_partial = self.p_sample(img, cond, ts,
1077
+ clip_denoised=self.clip_denoised,
1078
+ quantize_denoised=quantize_denoised, return_x0=True,
1079
+ temperature=temperature[i], noise_dropout=noise_dropout,
1080
+ score_corrector=score_corrector, corrector_kwargs=corrector_kwargs)
1081
+ if mask is not None:
1082
+ assert x0 is not None
1083
+ img_orig = self.q_sample(x0, ts)
1084
+ img = img_orig * mask + (1. - mask) * img
1085
+
1086
+ if i % log_every_t == 0 or i == timesteps - 1:
1087
+ intermediates.append(x0_partial)
1088
+ if callback: callback(i)
1089
+ if img_callback: img_callback(img, i)
1090
+ return img, intermediates
1091
+
1092
+ @torch.no_grad()
1093
+ def p_sample_loop(self, cond, shape, return_intermediates=False,
1094
+ x_T=None, verbose=True, callback=None, timesteps=None, quantize_denoised=False,
1095
+ mask=None, x0=None, img_callback=None, start_T=None,
1096
+ log_every_t=None):
1097
+
1098
+ if not log_every_t:
1099
+ log_every_t = self.log_every_t
1100
+ device = self.betas.device
1101
+ b = shape[0]
1102
+ if x_T is None:
1103
+ img = torch.randn(shape, device=device)
1104
+ else:
1105
+ img = x_T
1106
+
1107
+ intermediates = [img]
1108
+ if timesteps is None:
1109
+ timesteps = self.num_timesteps
1110
+
1111
+ if start_T is not None:
1112
+ timesteps = min(timesteps, start_T)
1113
+ iterator = tqdm(reversed(range(0, timesteps)), desc='Sampling t', total=timesteps) if verbose else reversed(
1114
+ range(0, timesteps))
1115
+
1116
+ if mask is not None:
1117
+ assert x0 is not None
1118
+ assert x0.shape[2:3] == mask.shape[2:3] # spatial size has to match
1119
+
1120
+ for i in iterator:
1121
+ ts = torch.full((b,), i, device=device, dtype=torch.long)
1122
+ if self.shorten_cond_schedule:
1123
+ assert self.model.conditioning_key != 'hybrid'
1124
+ tc = self.cond_ids[ts].to(cond.device)
1125
+ cond = self.q_sample(x_start=cond, t=tc, noise=torch.randn_like(cond))
1126
+
1127
+ img = self.p_sample(img, cond, ts,
1128
+ clip_denoised=self.clip_denoised,
1129
+ quantize_denoised=quantize_denoised)
1130
+ if mask is not None:
1131
+ img_orig = self.q_sample(x0, ts)
1132
+ img = img_orig * mask + (1. - mask) * img
1133
+
1134
+ if i % log_every_t == 0 or i == timesteps - 1:
1135
+ intermediates.append(img)
1136
+ if callback: callback(i)
1137
+ if img_callback: img_callback(img, i)
1138
+
1139
+ if return_intermediates:
1140
+ return img, intermediates
1141
+ return img
1142
+
1143
+ @torch.no_grad()
1144
+ def sample(self, cond, batch_size=16, return_intermediates=False, x_T=None,
1145
+ verbose=True, timesteps=None, quantize_denoised=False,
1146
+ mask=None, x0=None, shape=None,**kwargs):
1147
+ if shape is None:
1148
+ shape = (batch_size, self.channels, self.image_size, self.image_size)
1149
+ # if cond is not None:
1150
+ # if isinstance(cond, dict):
1151
+ # cond = {key: cond[key][:batch_size] if not isinstance(cond[key], list) else
1152
+ # list(map(lambda x: x[:batch_size], cond[key])) for key in cond}
1153
+ # else:
1154
+ # cond = [c[:batch_size] for c in cond] if isinstance(cond, list) else cond[:batch_size]
1155
+ return self.p_sample_loop(cond,
1156
+ shape,
1157
+ return_intermediates=return_intermediates,
1158
+ x_T=x_T,
1159
+ verbose=verbose,
1160
+ timesteps=timesteps,
1161
+ quantize_denoised=quantize_denoised,
1162
+ mask=mask,
1163
+ x0=x0)
1164
+
1165
+ @torch.no_grad()
1166
+ def sample_log(self,cond,batch_size,ddim, ddim_steps,**kwargs):
1167
+ if ddim:
1168
+ ddim_sampler = DDIMSampler(self)
1169
+ shape = (self.channels, self.image_size, self.image_size)
1170
+ samples, intermediates = ddim_sampler.sample(ddim_steps,batch_size,shape,cond,
1171
+ verbose=False,**kwargs)
1172
+
1173
+ else:
1174
+ samples, intermediates = self.sample(cond=cond, batch_size=batch_size,
1175
+ return_intermediates=True,**kwargs)
1176
+
1177
+ return samples, intermediates
1178
+
1179
+ def _get_mask_row_from_list(self, samples, desc=''):
1180
+ denoise_row = []
1181
+ for dm in tqdm(samples, desc=desc):
1182
+ dm = (dm * 2.0 - 1.0)
1183
+ dm = Resize((256, 256))(dm)
1184
+ denoise_row.append(dm)
1185
+ n_imgs_per_row = 5
1186
+ denoise_row = torch.stack(denoise_row) # n_log_step, n_row, C, H, W
1187
+ denoise_grid = rearrange(denoise_row, 'n b c h w -> b n c h w')
1188
+ denoise_grid = rearrange(denoise_grid, 'b n c h w -> (b n) c h w')
1189
+ denoise_grid = make_grid(denoise_grid, nrow=n_imgs_per_row)
1190
+ return denoise_grid
1191
+
1192
+ @torch.no_grad()
1193
+ def log_images(self, batch, split='train', N=4, n_row=4, sample=True, ddim_steps=200, ddim_eta=1., return_keys=None,
1194
+ quantize_denoised=True, inpaint=False, plot_denoise_rows=True, plot_progressive_rows=False,
1195
+ plot_diffusion_rows=False, **kwargs):
1196
+
1197
+ use_ddim = ddim_steps is not None
1198
+
1199
+ log = dict()
1200
+ if split == 'train':
1201
+ inputs = self.get_input(batch,
1202
+ self.first_stage_key,
1203
+ return_first_stage_outputs=True,
1204
+ bs=N)
1205
+ inputs['x_T'] = None
1206
+ else:
1207
+ inputs = self.get_input(batch,
1208
+ self.first_stage_key,
1209
+ return_first_stage_outputs=False,
1210
+ bs=N)
1211
+ b,c,h,w = inputs['latent'].shape
1212
+ inputs['x_T'] = torch.randn((b,c,h,w), device=inputs['latent'].device)
1213
+ x = inputs['gt_img']
1214
+ z = inputs['latent']
1215
+ c = inputs['cond']
1216
+ unconditional_guidance_scale = 5.
1217
+ unconditional_conditioning = self.learnable_vector.repeat(c.shape[0],c.shape[1],1)
1218
+ N = min(x.shape[0], N)
1219
+ n_row = min(x.shape[0], n_row)
1220
+ # norm_mask = (inputs['bg_mask'] * 2.0 - 1.0).repeat(1, 3, 1, 1)
1221
+ rs_mask = Resize(inputs['bg_img'].shape[2:])(inputs['bg_mask'])
1222
+ masked_bg = (rs_mask < 0.5) * inputs['bg_img']
1223
+ img_size = (256, 256)
1224
+ cat_img = [
1225
+ Resize(img_size)(inputs['bg_img']),
1226
+ Resize(img_size)(clip2sd(inputs['fg_img']))]
1227
+
1228
+ if sample:
1229
+ # get denoise row
1230
+ with self.ema_scope("Plotting"):
1231
+ if self.first_stage_key=='inpaint':
1232
+ samples, z_denoise_row = self.sample_log(cond=c,batch_size=N,ddim=use_ddim,
1233
+ ddim_steps=ddim_steps,eta=ddim_eta,rest=z[:,4:,:,:])
1234
+ elif self.first_stage_key=='composition':
1235
+ # mask = inputs['bg_mask']
1236
+ samples, z_denoise_row = self.sample_log(cond=c,batch_size=N,ddim=use_ddim,
1237
+ # fg_mask=inputs['fg_mask'],fg_mask_method='argmax',
1238
+ ddim_steps=ddim_steps,eta=ddim_eta,rest=inputs,
1239
+ x_T=inputs['x_T'], log_every_t=50,
1240
+ unconditional_guidance_scale=unconditional_guidance_scale,
1241
+ unconditional_conditioning=unconditional_conditioning)
1242
+ else:
1243
+ samples, z_denoise_row = self.sample_log(cond=c,batch_size=N,ddim=use_ddim,
1244
+ ddim_steps=ddim_steps,eta=ddim_eta,)
1245
+ # samples, z_denoise_row = self.sample(cond=c, batch_size=N, return_intermediates=True)
1246
+ pre_latent = samples[:,:4]
1247
+ x_samples = self.decode_first_stage(pre_latent)
1248
+ cat_img.append(Resize(img_size)(x_samples))
1249
+ log['samples'] = torch.cat(cat_img, dim=-1)
1250
+
1251
+ if return_keys:
1252
+ if np.intersect1d(list(log.keys()), return_keys).shape[0] == 0:
1253
+ return log
1254
+ else:
1255
+ return {key: log[key] for key in return_keys}
1256
+ return log
1257
+
1258
+ def configure_optimizers(self):
1259
+ lr = self.learning_rate
1260
+ params = list(self.model.parameters())
1261
+ if self.cond_stage_trainable:
1262
+ print(f"{self.__class__.__name__}: Also optimizing conditioner params!")
1263
+ params = params + list(self.cond_stage_model.final_ln.parameters()) \
1264
+ + list(self.cond_stage_model.mapper.parameters())
1265
+ if self.learn_logvar:
1266
+ print('Diffusion model optimizing logvar')
1267
+ params.append(self.logvar)
1268
+ self.params = params
1269
+ self.params_with_white=params + list(self.learnable_vector)
1270
+ opt = torch.optim.AdamW(params, lr=lr)
1271
+ self.opt=opt
1272
+ if self.use_scheduler:
1273
+ assert 'target' in self.scheduler_config
1274
+ scheduler = instantiate_from_config(self.scheduler_config)
1275
+
1276
+ print("Setting up LambdaLR scheduler...")
1277
+ scheduler = [
1278
+ {
1279
+ 'scheduler': LambdaLR(opt, lr_lambda=scheduler.schedule),
1280
+ 'interval': 'step',
1281
+ 'frequency': 1
1282
+ }]
1283
+ return [opt], scheduler
1284
+ return opt
1285
+
1286
+ @torch.no_grad()
1287
+ def to_rgb(self, x):
1288
+ x = x.float()
1289
+ if not hasattr(self, "colorize"):
1290
+ self.colorize = torch.randn(3, x.shape[1], 1, 1).to(x)
1291
+ x = nn.functional.conv2d(x, weight=self.colorize)
1292
+ x = 2. * (x - x.min()) / (x.max() - x.min()) - 1.
1293
+ return x
1294
+
1295
+
1296
+ class DiffusionWrapper(pl.LightningModule):
1297
+ def __init__(self, diff_model_config, conditioning_key):
1298
+ super().__init__()
1299
+ self.diffusion_model = instantiate_from_config(diff_model_config)
1300
+ self.conditioning_key = conditioning_key
1301
+ assert self.conditioning_key in [None, 'concat', 'crossattn', 'hybrid', 'adm']
1302
+
1303
+ def forward(self, x, t, c_concat: list = None, c_crossattn: list = None, **kwargs):
1304
+ if self.conditioning_key is None:
1305
+ out = self.diffusion_model(x, t)
1306
+ elif self.conditioning_key == 'concat':
1307
+ xc = torch.cat([x] + c_concat, dim=1)
1308
+ out = self.diffusion_model(xc, t)
1309
+ elif self.conditioning_key == 'crossattn':
1310
+ # cc = torch.cat(c_crossattn, 1)
1311
+ cc = c_crossattn
1312
+ out = self.diffusion_model(x, t, cc, **kwargs)
1313
+ elif self.conditioning_key == 'hybrid':
1314
+ xc = torch.cat([x] + c_concat, dim=1)
1315
+ cc = torch.cat(c_crossattn, 1)
1316
+ out = self.diffusion_model(xc, t, context=cc)
1317
+ elif self.conditioning_key == 'adm':
1318
+ cc = c_crossattn[0]
1319
+ out = self.diffusion_model(x, t, y=cc)
1320
+ else:
1321
+ raise NotImplementedError()
1322
+ return out
1323
+
1324
+
1325
+ def clip2sd(x):
1326
+ # clip input tensor to stable diffusion tensor
1327
+ MEAN = torch.tensor([0.48145466, 0.4578275, 0.40821073]).reshape(1,-1,1,1).to(x.device)
1328
+ STD = torch.tensor([0.26862954, 0.26130258, 0.27577711]).reshape(1,-1,1,1).to(x.device)
1329
+ denorm = x * STD + MEAN
1330
+ sd_x = denorm * 2 - 1
1331
+ return sd_x
1332
+
1333
+
1334
+ def sd2clip(x):
1335
+ # stable diffusion tensor to clip input tensor
1336
+ denorm_x = (x+1.0) / 2.0
1337
+ clip_x = Normalize((0.48145466, 0.4578275, 0.40821073),
1338
+ (0.26862954, 0.26130258, 0.27577711))(denorm_x)
1339
+ return clip_x
1340
+
1341
+ def tensor2images(images, max_images=4, clamp=True, target_size=(256, 256)):
1342
+ for k in images:
1343
+ N = min(images[k].shape[0], max_images)
1344
+ images[k] = images[k][:N]
1345
+ if isinstance(images[k], torch.Tensor):
1346
+ images[k] = images[k].detach().cpu()
1347
+ if clamp:
1348
+ images[k] = torch.clamp(images[k], -1., 1.)
1349
+ return images
1350
+
1351
+ def log_local(save_dir,
1352
+ split,
1353
+ images,
1354
+ global_step,
1355
+ current_epoch,
1356
+ batch_idx,
1357
+ rescale=True):
1358
+ root = save_dir
1359
+ for k in images:
1360
+ # grid = torchvision.utils.make_grid(images[k], nrow=images[k].shape[0])
1361
+ grid = make_grid(images[k], 1)
1362
+ grid = (grid + 1.0) / 2.0 # -1,1 -> 0,1; c,h,w
1363
+ grid = grid.transpose(0, 1).transpose(1, 2).squeeze(-1)
1364
+ grid = grid.numpy()
1365
+ grid = (grid * 255).astype(np.uint8)
1366
+ filename = "{}_{}_gs-{:06}_e-{:06}_b-{:06}.png".format(
1367
+ split,
1368
+ k,
1369
+ global_step,
1370
+ current_epoch,
1371
+ batch_idx)
1372
+ path = os.path.join(root, filename)
1373
+ os.makedirs(os.path.split(path)[0], exist_ok=True)
1374
+ Image.fromarray(grid).save(path)
1375
+ print(path)
1376
+
1377
+ if __name__ == '__main__':
1378
+ from omegaconf import OmegaConf
1379
+ from ldm.util import instantiate_from_config
1380
+ import os, torchvision
1381
+ from PIL import Image
1382
+ import shutil
1383
+
1384
+ device = torch.device('cuda:0')
1385
+ config = OmegaConf.load('configs/v1.yaml')
1386
+ pretrained_model = "checkpoints/model.ckpt"
1387
+ model = instantiate_from_config(config.model)
1388
+ print("Load ", pretrained_model)
1389
+ model.load_state_dict(torch.load(pretrained_model,map_location='cpu')['state_dict'],strict=True)
1390
+ model = model.to(device)
1391
+
1392
+ from torch.utils.data import DataLoader
1393
+ config.data.params.train.params.split = 'validation'
1394
+ dataset = instantiate_from_config(config.data.params.train)
1395
+ dataloader = DataLoader(dataset=dataset,
1396
+ batch_size=1,
1397
+ shuffle=False,
1398
+ num_workers=4)
1399
+ print('{} samples = {} bs x {} batches'.format(
1400
+ len(dataset), dataloader.batch_size, len(dataloader)
1401
+ ))
1402
+ save_dir = 'outputs/image_logger'
1403
+ if os.path.exists(save_dir):
1404
+ shutil.rmtree(save_dir)
1405
+ os.makedirs(save_dir, exist_ok=True)
1406
+ split = 'val'
1407
+ for batch_idx, batch in enumerate(dataloader):
1408
+ images = model.log_images(batch, split=split, ddim_steps=200)
1409
+ images = tensor2images(images)
1410
+ log_local(save_dir,
1411
+ split,
1412
+ images,
1413
+ global_step=1,
1414
+ current_epoch=0,
1415
+ batch_idx=batch_idx)
1416
+ if batch_idx > 0:
1417
+ break