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,3 @@
1
+ from .generate_composite_image import get_composite_image
2
+
3
+ __all__ = ['get_composite_image']
@@ -0,0 +1,116 @@
1
+ import numpy as np
2
+ import os
3
+ import cv2
4
+ from libcom.utils.process_image import *
5
+
6
+
7
+ def get_composite_image(foreground_image, foreground_mask, background_image, bbox, option="none"):
8
+ """
9
+ Generate composite image through copy-and-paste.
10
+
11
+ Args:
12
+ foreground_image (str | numpy.ndarray): The path to foreground image or the background image in ndarray form.
13
+ foreground_mask (str | numpy.ndarray): Mask of foreground image which indicates the foreground object region in the foreground image.
14
+ background_image (str | numpy.ndarray): The path to background image or the background image in ndarray form.
15
+ bbox (list): The bounding box which indicates the foreground's location in the background. [x1, y1, x2, y2].
16
+ option (str): 'none', 'gaussian', or 'poisson'. Image blending method. default: None.
17
+
18
+ Returns:
19
+ composite_image (numpy.ndarray): Generated composite image with the same resolution as input background image.
20
+ composite_mask (numpy.ndarray): Generated composite mask with the same resolution as composite image.
21
+
22
+ Examples:
23
+ >>> from libcom import get_composite_image
24
+ >>> from libcom.utils.process_image import make_image_grid, draw_bbox_on_image
25
+ >>> import cv2
26
+ >>> test_dir = 'source/'
27
+ >>> img_list = ['1.jpg', '8.jpg']
28
+ >>> bbox_list = [[1000, 895, 1480, 1355], [1170, 944, 2331, 3069]]
29
+ >>> for i,img_name in enumerate(img_list):
30
+ >>> bg_img = test_dir + 'background/' + img_name
31
+ >>> bbox = bbox_list[i] # x1,y1,x2,y2
32
+ >>> fg_img = test_dir + 'foreground/' + img_name
33
+ >>> fg_mask = test_dir + 'foreground_mask/' + img_name.replace('.jpg', '.png')
34
+ >>> # generate composite images by naive methods
35
+ >>> comp_img1, comp_mask1 = get_composite_image(fg_img, fg_mask, bg_img, bbox, 'none')
36
+ >>> comp_img2, comp_mask2 = get_composite_image(fg_img, fg_mask, bg_img, bbox, 'gaussian')
37
+ >>> comp_img3, comp_mask3 = get_composite_image(fg_img, fg_mask, bg_img, bbox, 'poisson')
38
+ >>> vis_list = [bg_img, fg_img, comp_img1, comp_mask1, comp_img2, comp_mask2, comp_img3, comp_mask3]
39
+ >>> # visualization results
40
+ >>> grid_img = make_image_grid(vis_list, cols=4)
41
+ >>> cv2.imwrite(f'../docs/_static/image/generatecomposite_result{i+1}.jpg', grid_img)
42
+
43
+ Expected result:
44
+
45
+ .. image:: _static/image/generatecomposite_result1.jpg
46
+ :scale: 38 %
47
+
48
+ .. image:: _static/image/generatecomposite_result2.jpg
49
+ :scale: 38 %
50
+
51
+ """
52
+ choices = ['none', 'gaussian', 'poisson']
53
+ assert option in choices, f'{option} must be one of {choices}'
54
+ fg_img = read_image_opencv(foreground_image)
55
+ fg_mask = read_mask_opencv(foreground_mask)
56
+ bg_img = read_image_opencv(background_image)
57
+ if option == 'none':
58
+ comp_img,comp_mask = simple_composite_image(bg_img, fg_img, fg_mask, bbox)
59
+ elif option == 'gaussian':
60
+ comp_img,comp_mask = gaussian_composite_image(bg_img, fg_img, fg_mask, bbox)
61
+ else: # option == 'poisson'
62
+ comp_img,comp_mask = poisson_composite_image(bg_img, fg_img, fg_mask, bbox)
63
+ return comp_img, comp_mask
64
+
65
+
66
+ def crop_and_resize_foreground(fg_img, fg_mask, bbox):
67
+ if fg_mask.shape[:2] != fg_img.shape[:2]:
68
+ fg_mask = cv2.resize(fg_mask, (fg_img.shape[1], fg_img.shape[0]))
69
+ fg_bbox = convert_mask_to_bbox(fg_mask)
70
+ fg_region = fg_img[fg_bbox[1] : fg_bbox[3], fg_bbox[0] : fg_bbox[2]]
71
+ x1, y1, x2, y2 = bbox
72
+ fg_region = cv2.resize(fg_region, (x2-x1, y2-y1), cv2.INTER_CUBIC)
73
+ fg_mask = fg_mask[fg_bbox[1] : fg_bbox[3], fg_bbox[0] : fg_bbox[2]]
74
+ fg_mask = cv2.resize(fg_mask, (x2-x1, y2-y1))
75
+ fg_mask = np.where(fg_mask > 127, 255, 0).astype(fg_img.dtype)
76
+ return fg_region, fg_mask
77
+
78
+
79
+ def simple_composite_image(bg_img, fg_img, fg_mask, bbox):
80
+ fg_region, fg_mask = crop_and_resize_foreground(fg_img, fg_mask, bbox)
81
+ x1, y1, x2, y2 = bbox
82
+ comp_mask = np.zeros((bg_img.shape[0], bg_img.shape[1]), dtype=np.uint8)
83
+ comp_mask[y1:y2, x1:x2] = fg_mask
84
+ comp_img = bg_img.copy()
85
+ comp_img[y1:y2, x1:x2] = np.where(fg_mask[:,:,np.newaxis]> 127, fg_region, comp_img[y1:y2, x1:x2])
86
+ return comp_img, comp_mask
87
+
88
+
89
+ def gaussian_composite_image(bg_img, fg_img, fg_mask, bbox, kernel_size=15):
90
+ if fg_mask.shape[:2] != fg_img.shape[:2]:
91
+ fg_mask = cv2.resize(fg_mask, (fg_img.shape[1], fg_img.shape[0]))
92
+ fg_mask = cv2.GaussianBlur(255-fg_mask, (kernel_size, kernel_size), kernel_size/3.)
93
+ fg_mask = 255 - fg_mask
94
+ fg_bbox = convert_mask_to_bbox(fg_mask)
95
+ fg_region = fg_img[fg_bbox[1] : fg_bbox[3], fg_bbox[0] : fg_bbox[2]]
96
+ x1, y1, x2, y2 = bbox
97
+ fg_region = cv2.resize(fg_region, (x2-x1, y2-y1), cv2.INTER_CUBIC)
98
+ fg_mask = fg_mask[fg_bbox[1] : fg_bbox[3], fg_bbox[0] : fg_bbox[2]]
99
+ fg_mask = cv2.resize(fg_mask, (x2-x1, y2-y1))
100
+ norm_mask = (fg_mask.astype(np.float32) / 255)[:,:,np.newaxis]
101
+
102
+ comp_mask = np.zeros((bg_img.shape[0], bg_img.shape[1]), dtype=np.uint8)
103
+ comp_mask[y1:y2, x1:x2] = fg_mask
104
+ comp_img = bg_img.copy()
105
+ comp_img[y1:y2, x1:x2] = (fg_region * norm_mask + comp_img[y1:y2, x1:x2] * (1-norm_mask)).astype(comp_img.dtype)
106
+ return comp_img, comp_mask
107
+
108
+
109
+ def poisson_composite_image(bg_img, fg_img, fg_mask, bbox, clone_method=cv2.NORMAL_CLONE):
110
+ fg_region, fg_mask = crop_and_resize_foreground(fg_img, fg_mask, bbox)
111
+ x1, y1, x2, y2 = bbox
112
+ center = (x1+x2)//2, (y1+y2)//2
113
+ comp_img = cv2.seamlessClone(fg_region, bg_img, fg_mask[:,:,np.newaxis], center, clone_method)
114
+ comp_mask = np.zeros((bg_img.shape[0], bg_img.shape[1]), dtype=np.uint8)
115
+ comp_mask[y1:y2, x1:x2] = fg_mask
116
+ return comp_img, comp_mask
@@ -0,0 +1,3 @@
1
+ from .opa_score_prediction import OPAScoreModel
2
+
3
+ __all__ = ['OPAScoreModel']
@@ -0,0 +1,101 @@
1
+ import torch
2
+ import torchvision
3
+ from libcom.utils.model_download import download_pretrained_model
4
+ from libcom.utils.process_image import *
5
+ from libcom.utils.environment import *
6
+ from libcom.opa_score.source import ObjectPlaceNet
7
+ import torch
8
+ import os
9
+ import torchvision.transforms as transforms
10
+
11
+ cur_dir = os.path.dirname(os.path.abspath(__file__))
12
+ model_dir = os.environ.get('LIBCOM_MODEL_DIR',cur_dir)
13
+ model_set = ['SimOPA']
14
+
15
+
16
+ class OPAScoreModel:
17
+ """
18
+ OPA score prediction model.
19
+
20
+ Args:
21
+ device (str | torch.device): gpu id
22
+ model_type (str): predefined model type.
23
+ kwargs (dict): other parameters for building model
24
+
25
+ Examples:
26
+ >>> from libcom import OPAScoreModel
27
+ >>> from libcom import get_composite_image
28
+ >>> from libcom.utils.process_image import make_image_grid
29
+ >>> import cv2
30
+ >>> net = OPAScoreModel(device=0, model_type='SimOPA')
31
+ >>> test_dir = './source'
32
+ >>> bg_img = 'source/background/17.jpg'
33
+ >>> fg_img = 'source/foreground/17.jpg'
34
+ >>> fg_mask = 'source/foreground_mask/17.png'
35
+ >>> bbox_list = [[475, 697, 1275, 1401], [475, 300, 1275, 1004]]
36
+ >>> comp1, comp_mask1 = get_composite_image(fg_img, fg_mask, bg_img, bbox_list[0])
37
+ >>> comp2, comp_mask2 = get_composite_image(fg_img, fg_mask, bg_img, bbox_list[1])
38
+ >>> score1 = net(comp1, comp_mask1)
39
+ >>> score2 = net(comp2, comp_mask2)
40
+ >>> grid_img = make_image_grid([comp1, comp_mask1, comp2, comp_mask2], text_list=[f'opa_score:{score1:.2f}', 'composite-mask', f'opa_score:{score2:.2f}', 'composite-mask'])
41
+ >>> cv2.imwrite('../docs/_static/image/opascore_result1.jpg', grid_img)
42
+
43
+ Expected result:
44
+
45
+ .. image:: _static/image/opascore_result1.jpg
46
+ :scale: 38 %
47
+
48
+
49
+ """
50
+ def __init__(self, device=0, model_type='SimOPA', **kwargs):
51
+ assert model_type in model_set, f'Not implementation for {model_type}'
52
+ self.model_type = model_type
53
+ self.option = kwargs
54
+ weight_path = os.path.join(model_dir, 'pretrained_models', 'SimOPA.pth')
55
+ download_pretrained_model(weight_path)
56
+ self.device = check_gpu_device(device)
57
+ self.build_pretrained_model(weight_path)
58
+ self.build_data_transformer()
59
+
60
+ def build_pretrained_model(self, weight_path):
61
+ model = ObjectPlaceNet(False)
62
+ model.load_state_dict(torch.load(weight_path, map_location='cpu', weights_only=True))
63
+ self.model = model.to(self.device).eval()
64
+
65
+ def build_data_transformer(self):
66
+ self.image_size = 256
67
+ self.transformer = transforms.Compose([
68
+ transforms.Resize((self.image_size, self.image_size)),
69
+ transforms.ToTensor(),
70
+ ])
71
+
72
+ def inputs_preprocess(self, composite_image, composite_mask):
73
+ img = read_image_pil(composite_image)
74
+ img = self.transformer(img)
75
+ mask = read_mask_pil(composite_mask)
76
+ mask = self.transformer(mask)
77
+ cat_img = torch.cat([img, mask], dim=0)
78
+ cat_img = cat_img.unsqueeze(0).to(self.device)
79
+ return cat_img
80
+
81
+ def outputs_postprocess(self, outputs):
82
+ score = torch.softmax(outputs, dim=-1)[0, 1].cpu().item()
83
+ return score
84
+
85
+ @torch.no_grad()
86
+ def __call__(self, composite_image, composite_mask):
87
+ """
88
+ Predicting the object placement assessment (opa) score for the given composite image, which evaluates the rationality of foreground object placement.
89
+
90
+ Args:
91
+ composite_image (str | numpy.ndarray): The path to composite image or the compposite image in ndarray form.
92
+ composite_mask (str | numpy.ndarray): Mask of composite image which indicates the foreground object region in the composite image.
93
+
94
+ Returns:
95
+ opa_score (float): Predicted opa score ranges from 0 to 1, where a larger score indicates more reasonable placement.
96
+
97
+ """
98
+ inputs = self.inputs_preprocess(composite_image, composite_mask)
99
+ outputs = self.model(inputs)
100
+ preds = self.outputs_postprocess(outputs)
101
+ return preds
@@ -0,0 +1,3 @@
1
+ import os,sys
2
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
3
+ from object_place_net import ObjectPlaceNet
@@ -0,0 +1,55 @@
1
+ import os,sys
2
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
3
+ import torch
4
+ import torch.nn.functional as F
5
+ from torch import nn
6
+
7
+ from oblect_place_config import opt
8
+ from resnet_4ch import resnet
9
+
10
+ class ObjectPlaceNet(nn.Module):
11
+ def __init__(self, backbone_pretrained=True):
12
+ super(ObjectPlaceNet, self).__init__()
13
+
14
+ ## Backbone, only resnet
15
+ resnet_layers = int(opt.backbone.split('resnet')[-1])
16
+ backbone = resnet(resnet_layers,
17
+ backbone_pretrained,
18
+ os.path.join(opt.pretrained_model_path, opt.backbone+'.pth'))
19
+
20
+ # drop pool layer and fc layer
21
+ features = list(backbone.children())[:-2]
22
+ backbone = nn.Sequential(*features)
23
+ self.backbone = backbone
24
+
25
+ ## global predict
26
+ self.global_feature_dim = 512 if opt.backbone in ['resnet18', 'resnet34'] else 2048
27
+
28
+ self.avgpool3x3 = nn.AdaptiveAvgPool2d(3)
29
+ self.avgpool1x1 = nn.AdaptiveAvgPool2d(1)
30
+
31
+ self.prediction_head = nn.Linear(self.global_feature_dim, opt.class_num, bias=False)
32
+
33
+ def forward(self, img_cat):
34
+ ''' img_cat:b,4,256,256 '''
35
+ global_feature = None
36
+ if opt.without_mask:
37
+ img_cat = img_cat[:,0:3]
38
+ feature_map = self.backbone(img_cat) # b,512,8,8 (resnet layer4 output shape: b,c,8,8, if resnet18, c=512)
39
+ global_feature = self.avgpool1x1(feature_map) # b,512,1,1
40
+ global_feature = global_feature.flatten(1) # b,512
41
+
42
+ prediction = self.prediction_head(global_feature)
43
+
44
+ return prediction
45
+
46
+ if __name__ == '__main__':
47
+ device = torch.device('cuda:0')
48
+ b = 4
49
+ img_cat = torch.randn(b, 4, 256, 256).to(device)
50
+ model = ObjectPlaceNet(backbone_pretrained=False).to(device)
51
+ local_pre = model(img_cat)
52
+ print(local_pre)
53
+
54
+
55
+
@@ -0,0 +1,66 @@
1
+ import os
2
+
3
+ class Config(object):
4
+ # path
5
+ dataset_path = './dataset'
6
+
7
+ train_data_path = os.path.join(dataset_path, 'train_set.csv')
8
+ test_data_path = os.path.join(dataset_path, 'test_set.csv')
9
+
10
+ img_path = os.path.join('./')
11
+ mask_path = os.path.join('.')
12
+
13
+ pretrained_model_path = './pretrained_models'
14
+
15
+ ##
16
+ class_num = 2
17
+ img_size = 256
18
+ batch_size = 128
19
+ num_workers = 8
20
+ global_feature_size = 8
21
+
22
+ # train
23
+ base_lr = 1e-4
24
+ lr_milestones = [10, 16]
25
+ lr_gamma = 0.1
26
+ epochs = 25
27
+ eval_freq = 1
28
+ save_freq = 5
29
+ display_freq = 20
30
+
31
+ # Config
32
+ backbone = 'resnet18'
33
+ gpu_id = 1
34
+
35
+ without_mask = False
36
+
37
+ # Save path
38
+ prefix = backbone
39
+ if without_mask:
40
+ prefix += '+without_mask'
41
+
42
+ exp_root = os.path.join(os.getcwd(), './experiments/simopa/')
43
+ exp_name = prefix
44
+ exp_path = os.path.join(exp_root, prefix)
45
+ while os.path.exists(exp_path):
46
+ index = os.path.basename(exp_path).split(prefix)[-1].split('repeat')[-1]
47
+ try:
48
+ index = int(index) + 1
49
+ except:
50
+ index = 1
51
+ exp_name = prefix + ('_repeat{}'.format(index))
52
+ exp_path = os.path.join(exp_root, exp_name)
53
+
54
+ checkpoint_dir = os.path.join(exp_path, 'checkpoints')
55
+ log_dir = os.path.join(exp_path, 'logs')
56
+
57
+ def create_path(self):
58
+ print('Create experiments directory: ', self.exp_path)
59
+ os.makedirs(self.exp_path)
60
+ os.makedirs(self.checkpoint_dir)
61
+ os.makedirs(self.log_dir)
62
+
63
+ opt = Config()
64
+
65
+ if __name__ == "__main__":
66
+ print(opt.exp_root)
@@ -0,0 +1,213 @@
1
+ import torch
2
+ import torch.nn as nn
3
+ import math
4
+ import torch.utils.model_zoo as model_zoo
5
+ import os
6
+ from oblect_place_config import opt
7
+
8
+ model_urls = {
9
+ 'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth',
10
+ 'resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth',
11
+ 'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth',
12
+ 'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth',
13
+ 'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth',
14
+ }
15
+
16
+ def conv3x3(in_planes, out_planes, stride=1):
17
+ return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride,
18
+ padding=1, bias=False)
19
+
20
+
21
+ class BasicBlock(nn.Module):
22
+ expansion = 1
23
+
24
+ def __init__(self, inplanes, planes, stride=1, downsample=None):
25
+ super(BasicBlock, self).__init__()
26
+ self.conv1 = conv3x3(inplanes, planes, stride)
27
+ self.bn1 = nn.BatchNorm2d(planes)
28
+ self.relu = nn.ReLU(inplace=True)
29
+ self.conv2 = conv3x3(planes, planes)
30
+ self.bn2 = nn.BatchNorm2d(planes)
31
+ self.downsample = downsample
32
+ self.stride = stride
33
+
34
+ def forward(self, x):
35
+ residual = x
36
+
37
+ out = self.conv1(x)
38
+ out = self.bn1(out)
39
+ out = self.relu(out)
40
+
41
+ out = self.conv2(out)
42
+ out = self.bn2(out)
43
+
44
+ if self.downsample is not None:
45
+ residual = self.downsample(x)
46
+
47
+ out += residual
48
+ out = self.relu(out)
49
+
50
+ return out
51
+
52
+
53
+ class Bottleneck(nn.Module):
54
+ expansion = 4
55
+
56
+ def __init__(self, inplanes, planes, stride=1, downsample=None):
57
+ super(Bottleneck, self).__init__()
58
+ self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)
59
+ self.bn1 = nn.BatchNorm2d(planes)
60
+ self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride,
61
+ padding=1, bias=False)
62
+ self.bn2 = nn.BatchNorm2d(planes)
63
+ self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False)
64
+ self.bn3 = nn.BatchNorm2d(planes * 4)
65
+ self.relu = nn.ReLU(inplace=True)
66
+ self.downsample = downsample
67
+ self.stride = stride
68
+
69
+ def forward(self, x):
70
+ residual = x
71
+
72
+ out = self.conv1(x)
73
+ out = self.bn1(out)
74
+ out = self.relu(out)
75
+
76
+ out = self.conv2(out)
77
+ out = self.bn2(out)
78
+ out = self.relu(out)
79
+
80
+ out = self.conv3(out)
81
+ out = self.bn3(out)
82
+
83
+ if self.downsample is not None:
84
+ residual = self.downsample(x)
85
+
86
+ out += residual
87
+ out = self.relu(out)
88
+
89
+ return out
90
+
91
+
92
+ class ResNet(nn.Module):
93
+
94
+ def __init__(self, block, layers, num_classes=1000):
95
+ self.inplanes = 64
96
+ super(ResNet, self).__init__()
97
+ self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3,
98
+ bias=False)
99
+ self.bn1 = nn.BatchNorm2d(64)
100
+ self.relu = nn.ReLU(inplace=True)
101
+ self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
102
+ self.layer1 = self._make_layer(block, 64, layers[0])
103
+ self.layer2 = self._make_layer(block, 128, layers[1], stride=2)
104
+ self.layer3 = self._make_layer(block, 256, layers[2], stride=2)
105
+ self.layer4 = self._make_layer(block, 512, layers[3], stride=2)
106
+ self.avgpool = nn.AdaptiveAvgPool2d(1)
107
+ self.fc = nn.Linear(512 * block.expansion, num_classes)
108
+
109
+ for m in self.modules():
110
+ if isinstance(m, nn.Conv2d):
111
+ n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
112
+ m.weight.data.normal_(0, math.sqrt(2. / n))
113
+ elif isinstance(m, nn.BatchNorm2d):
114
+ m.weight.data.fill_(1)
115
+ m.bias.data.zero_()
116
+
117
+ def _make_layer(self, block, planes, blocks, stride=1):
118
+ downsample = None
119
+ if stride != 1 or self.inplanes != planes * block.expansion:
120
+ downsample = nn.Sequential(
121
+ nn.Conv2d(self.inplanes, planes * block.expansion,
122
+ kernel_size=1, stride=stride, bias=False),
123
+ nn.BatchNorm2d(planes * block.expansion),
124
+ )
125
+
126
+ layers = []
127
+ layers.append(block(self.inplanes, planes, stride, downsample))
128
+ self.inplanes = planes * block.expansion
129
+ for i in range(1, blocks):
130
+ layers.append(block(self.inplanes, planes))
131
+
132
+ return nn.Sequential(*layers)
133
+
134
+ def forward(self, x):
135
+ x = self.conv1(x)
136
+ x = self.bn1(x)
137
+ x = self.relu(x)
138
+ x = self.maxpool(x)
139
+
140
+ x = self.layer1(x)
141
+ x = self.layer2(x)
142
+ x = self.layer3(x)
143
+ x = self.layer4(x)
144
+
145
+ x = self.avgpool(x)
146
+ x = x.view(x.size(0), -1)
147
+ x = self.fc(x)
148
+
149
+ return x
150
+
151
+
152
+ def resnet(layers, pretrained=False, pretrained_weight=None, **kwargs):
153
+ model = None
154
+ if layers == 18:
155
+ model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs)
156
+ elif layers == 34:
157
+ model = ResNet(BasicBlock, [3, 4, 6, 3], **kwargs)
158
+ elif layers == 50:
159
+ model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs)
160
+ elif layers == 101:
161
+ model = ResNet(Bottleneck, [3, 4, 23, 3], **kwargs)
162
+ elif layers == 152:
163
+ model = ResNet(Bottleneck, [3, 8, 36, 3], **kwargs)
164
+ else:
165
+ raise Exception('Unsupport resnet layers numbers: ', layers)
166
+ if opt.without_mask:
167
+ if pretrained:
168
+ model.load_state_dict(torch.load(pretrained_weight))
169
+ print('loaded pretrained resnet{} from {}'.format(layers, pretrained_weight))
170
+ else:
171
+ model.conv1 = nn.Conv2d(4, 64, kernel_size=7, stride=2, padding=3, bias=False)
172
+ if pretrained:
173
+ pretrained_state_dict = torch.load(pretrained_weight)
174
+ conv1 = pretrained_state_dict['conv1.weight']
175
+ new = torch.zeros(64, 1, 7, 7)
176
+ for i, output_channel in enumerate(conv1):
177
+ new[i] = 0.299 * output_channel[0] + 0.587 * output_channel[1] + 0.114 * output_channel[2]
178
+ pretrained_state_dict['conv1.weight'] = torch.cat((conv1, new), dim=1)
179
+ model.load_state_dict(pretrained_state_dict)
180
+ print('loaded pretrained resnet{} from {}'.format(layers, pretrained_weight))
181
+ return model
182
+
183
+ def resnet_for_depth(layers, pretrained=False, pretrained_weight=None, **kwargs):
184
+ model = None
185
+ if layers == 18:
186
+ model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs)
187
+ elif layers == 34:
188
+ model = ResNet(BasicBlock, [3, 4, 6, 3], **kwargs)
189
+ elif layers == 50:
190
+ model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs)
191
+ elif layers == 101:
192
+ model = ResNet(Bottleneck, [3, 4, 23, 3], **kwargs)
193
+ elif layers == 152:
194
+ model = ResNet(Bottleneck, [3, 8, 36, 3], **kwargs)
195
+ else:
196
+ raise Exception('Unsupport resnet layers numbers: ', layers)
197
+
198
+ model.conv1 = nn.Conv2d(2, 64, kernel_size=7, stride=2, padding=3, bias=False)
199
+ if pretrained:
200
+ pretrained_state_dict = torch.load(pretrained_weight)
201
+ conv1 = pretrained_state_dict['conv1.weight']
202
+ new = torch.zeros(64, 1, 7, 7)
203
+ for i, output_channel in enumerate(conv1):
204
+ new[i] = 0.299 * output_channel[0] + 0.587 * output_channel[1] + 0.114 * output_channel[2]
205
+ pretrained_state_dict['conv1.weight'] = torch.cat((new, new), dim=1)
206
+ model.load_state_dict(pretrained_state_dict)
207
+ print('loaded pretrained resnet{} from {}'.format(layers, pretrained_weight))
208
+ return model
209
+
210
+ if __name__ == '__main__':
211
+ model = resnet(101, pretrained=False)
212
+ input = torch.randn(2,4,256,256)
213
+ print('Input shape {}, output shape {}'.format(input.shape, model(input).shape))
@@ -0,0 +1,3 @@
1
+ from .os_insert import OSInsertModel
2
+
3
+ __all__ = ['OSInsertModel']
@@ -0,0 +1,78 @@
1
+ from __future__ import annotations
2
+
3
+ import importlib
4
+ from contextlib import contextmanager
5
+ import sys
6
+ import types
7
+ from pathlib import Path
8
+
9
+
10
+ def _load_patched_pipeline_source() -> str:
11
+ src_path = Path(__file__).resolve().parent / "_patched_pipeline_flux_fill.py"
12
+ return src_path.read_text(encoding="utf-8")
13
+
14
+
15
+ _ORIG_CALL = None
16
+ _PATCHED_CALL = None
17
+ _PATCH_ENABLED = False
18
+
19
+
20
+ def _load_patched_call():
21
+ global _PATCHED_CALL
22
+ if _PATCHED_CALL is not None:
23
+ return _PATCHED_CALL
24
+
25
+ patched_mod_name = "diffusers_osinsert._patched_pipeline_flux_fill"
26
+ patched_mod = types.ModuleType(patched_mod_name)
27
+ patched_mod.__file__ = str(Path(__file__).resolve().parent / "_patched_pipeline_flux_fill.py")
28
+ # Make relative imports inside the patched file resolve against diffusers.*
29
+ patched_mod.__package__ = "diffusers.pipelines.flux"
30
+
31
+ code = _load_patched_pipeline_source()
32
+ exec(compile(code, patched_mod.__file__, "exec"), patched_mod.__dict__)
33
+ sys.modules[patched_mod_name] = patched_mod
34
+
35
+ _PATCHED_CALL = patched_mod.FluxFillPipeline.__call__
36
+ return _PATCHED_CALL
37
+
38
+
39
+ def enable_patch() -> None:
40
+ """Enable the OSInsert FluxFillPipeline patch for the current Python process."""
41
+ global _ORIG_CALL, _PATCH_ENABLED
42
+ if _PATCH_ENABLED:
43
+ return
44
+
45
+ upstream_mod = importlib.import_module("diffusers.pipelines.flux.pipeline_flux_fill")
46
+ if _ORIG_CALL is None:
47
+ _ORIG_CALL = upstream_mod.FluxFillPipeline.__call__
48
+
49
+ upstream_mod.FluxFillPipeline.__call__ = _load_patched_call()
50
+ _PATCH_ENABLED = True
51
+
52
+
53
+ def disable_patch() -> None:
54
+ """Disable the OSInsert FluxFillPipeline patch and restore upstream behavior."""
55
+ global _PATCH_ENABLED
56
+ if not _PATCH_ENABLED:
57
+ return
58
+
59
+ upstream_mod = importlib.import_module("diffusers.pipelines.flux.pipeline_flux_fill")
60
+ if _ORIG_CALL is not None:
61
+ upstream_mod.FluxFillPipeline.__call__ = _ORIG_CALL
62
+
63
+ _PATCH_ENABLED = False
64
+
65
+
66
+ @contextmanager
67
+ def patch_context():
68
+ """Temporarily enable the patch within a `with` block and restore afterwards."""
69
+ enable_patch()
70
+ try:
71
+ yield
72
+ finally:
73
+ disable_patch()
74
+
75
+
76
+ # Re-export upstream classes for convenience.
77
+ from diffusers.pipelines.flux.pipeline_flux_fill import FluxFillPipeline # noqa: E402
78
+ from diffusers import FluxPriorReduxPipeline # noqa: E402