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
libcom/__init__.py ADDED
@@ -0,0 +1,23 @@
1
+ from .color_transfer import *
2
+ from .naive_composition import *
3
+ from .opa_score import *
4
+ from .harmony_score import *
5
+ from .inharmonious_region_localization import *
6
+ from .image_harmonization import *
7
+ from .painterly_image_harmonization import *
8
+ from .fopa_heat_map import *
9
+ from .fos_score import *
10
+ from .kontext_blending_harmonization import *
11
+ from .shadow_generation import *
12
+ from .reflection_generation import *
13
+ from .os_insert import *
14
+
15
+ __all__ = [
16
+ 'color_transfer', 'get_composite_image', 'OPAScoreModel',
17
+ 'HarmonyScoreModel', 'InharmoniousLocalizationModel',
18
+ 'ImageHarmonizationModel', 'PainterlyHarmonizationModel',
19
+ 'FOPAHeatMapModel', 'FOSScoreModel',
20
+ 'KontextBlendingHarmonizationModel',
21
+ 'ShadowGenerationModel', 'ReflectionGenerationModel',
22
+ 'OSInsertModel'
23
+ ]
@@ -0,0 +1,3 @@
1
+ from .reinhard import color_transfer
2
+
3
+ __all__ = ['color_transfer']
@@ -0,0 +1,57 @@
1
+ import numpy as np
2
+ import os
3
+ import cv2
4
+ from libcom.utils.process_image import *
5
+
6
+ def color_transfer(composite_image, composite_mask):
7
+ """
8
+ Generate composite image through copy-and-paste.
9
+
10
+ Args:
11
+ composite_image (str | numpy.ndarray): The path to composite image or the compposite image in ndarray form.
12
+ composite_mask (str | numpy.ndarray): Mask of composite image which indicates the foreground object region in the composite image.
13
+
14
+ Returns:
15
+ transfered image (numpy.ndarray): Transfered image with the same resolution as input image.
16
+
17
+ Examples:
18
+ >>> from libcom import color_transfer
19
+ >>> from libcom.utils.process_image import make_image_grid
20
+ >>> import cv2
21
+ >>> comp_img1 = '../tests/source/composite/1.jpg'
22
+ >>> comp_mask1 = '../tests/source/composite_mask/1.png'
23
+ >>> trans_img1 = color_transfer(comp_img1, comp_mask1)
24
+ >>> comp_img2 = '../tests/source/composite/8.jpg'
25
+ >>> comp_mask2 = '../tests/source/composite_mask/8.png'
26
+ >>> trans_img2 = color_transfer(comp_img2, comp_mask2)
27
+ >>> # visualization results
28
+ >>> grid_img = make_image_grid([comp_img1, comp_mask1, trans_img1,
29
+ >>> comp_img2, comp_mask2, trans_img2], cols=3)
30
+ >>> cv2.imwrite('../docs/_static/image/colortransfer_result1.jpg', grid_img)
31
+
32
+ Expected result:
33
+
34
+ .. image:: _static/image/colortransfer_result1.jpg
35
+ :scale: 50 %
36
+
37
+ """
38
+ comp_img = read_image_opencv(composite_image)
39
+ comp_mask = read_mask_opencv(composite_mask)
40
+ if comp_mask.shape[:2] != comp_img.shape[:2]:
41
+ comp_mask = cv2.resize(comp_mask, (comp_img.shape[1], comp_img.shape[0]))
42
+ trans_comp = reinhard(comp_img, comp_mask)
43
+ return trans_comp
44
+
45
+ def reinhard(comp_img, comp_mask):
46
+ # reinhard is a classical color transfer algorithm
47
+ # paper: https://www.cs.tau.ac.il/~turkel/imagepapers/ColorTransfer.pdf
48
+ comp_mask = np.where(comp_mask > 127, 255, 0).astype(np.uint8)
49
+ comp_lab = cv2.cvtColor(comp_img, cv2.COLOR_BGR2Lab)
50
+ bg_mean, bg_std = cv2.meanStdDev(comp_lab, mask=255 - comp_mask)
51
+ fg_mean, fg_std = cv2.meanStdDev(comp_lab, mask=comp_mask)
52
+ ratio = (bg_std / fg_std).reshape(-1)
53
+ offset = (bg_mean - fg_mean * bg_std / fg_std).reshape(-1)
54
+ trans_lab = cv2.convertScaleAbs(comp_lab * ratio + offset)
55
+ trans_img = cv2.cvtColor(trans_lab, cv2.COLOR_Lab2BGR)
56
+ trans_comp = np.where(comp_mask[:,:,np.newaxis] > 127, trans_img, comp_img)
57
+ return trans_comp
@@ -0,0 +1,4 @@
1
+ # change to your lib name
2
+ from .fopa_heat_map import FOPAHeatMapModel
3
+
4
+ __all__ = ['FOPAHeatMapModel']
@@ -0,0 +1,212 @@
1
+ import csv
2
+ import random
3
+ import shutil
4
+ import torch
5
+ from libcom.utils.model_download import download_pretrained_model
6
+ from libcom.utils.process_image import *
7
+ from libcom.utils.environment import *
8
+ import torch
9
+ import os
10
+ import torchvision.transforms as transforms
11
+
12
+ import numpy as np
13
+ from PIL import Image
14
+ import libcom.fopa_heat_map.source.network.ObPlaNet_simple as network
15
+ from libcom.fopa_heat_map.source.data.OBdataset import make_composite_PIL
16
+ from libcom.fopa_heat_map.source.prepare_multi_fg_scales import prepare_multi_fg_scales
17
+ from libcom.fopa_heat_map.source.data.all_transforms import Compose, JointResize
18
+
19
+ cur_dir = os.path.dirname(os.path.abspath(__file__))
20
+ model_dir = os.environ.get('LIBCOM_MODEL_DIR',cur_dir)
21
+ model_set = ['fopa']
22
+
23
+
24
+ class FOPAHeatMapModel:
25
+ """
26
+ Generate a heatmap for a pair of scaled foreground and background.
27
+
28
+ Args:
29
+ device (str | torch.device): gpu id
30
+ model_type (str): predefined model type
31
+
32
+ Examples:
33
+ >>> test_set = get_test_list_fopa_heatmap()
34
+ >>> result_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'results', task_name)
35
+ >>> if os.path.exists(result_dir):
36
+ >>> shutil.rmtree(result_dir)
37
+ >>> os.makedirs(result_dir, exist_ok=True)
38
+ >>> os.makedirs(os.path.join(result_dir, 'grid'), exist_ok=True)
39
+ >>> print(f'begin testing {task_name}...')
40
+ >>> net = FOPAHeatMapModel(device=0)
41
+ >>> for pair in test_set[:1]:
42
+ >>> fg_img, fg_mask, bg_img = pair['foreground'], pair['foreground_mask'], pair['background']
43
+ >>> bboxes, heatmaps = net(fg_img, fg_mask, bg_img, cache_dir=os.path.join(result_dir, 'cache'), heatmap_dir=os.path.join(result_dir, 'heatmap'))
44
+ >>> img_name = os.path.basename(bg_img).replace('.png', '.jpg')
45
+ >>> grid_img = make_image_grid([bg_img, fg_img, heatmaps[0]])
46
+ >>> res_path = os.path.join(result_dir, 'grid', img_name)
47
+ >>> cv2.imwrite(res_path, grid_img)
48
+ >>> print('save result to ', res_path)
49
+ >>> print(f'end testing {task_name}!')
50
+
51
+ Expected result:
52
+
53
+ .. image:: _static/image/fopa_heatmap_FOPA_result1.png
54
+ :scale: 72 %
55
+
56
+ .. image:: _static/image/fopa_heatmap_FOPA_result3.png
57
+ :scale: 52 %
58
+
59
+ """
60
+ def __init__(self, device=0, model_type='fopa', **kwargs):
61
+
62
+ assert model_type in model_set, f'Not implementation for {model_type}'
63
+ self.model_type = model_type
64
+ self.option = kwargs
65
+ self.device = check_gpu_device(device)
66
+ fopa_weight = os.path.join(model_dir, 'pretrained_models', 'FOPA.pth')
67
+ download_pretrained_model(fopa_weight)
68
+ sopa_weight = os.path.join(model_dir, 'pretrained_models', 'SOPA.pth')
69
+ download_pretrained_model(sopa_weight)
70
+ self.build_pretrained_model(sopa_weight, fopa_weight)
71
+ self.build_data_transformer()
72
+
73
+ def build_pretrained_model(self, sopa_weight, fopa_weight):
74
+ model = getattr(network, "ObPlaNet_resnet18")(pretrained=False, weight_path=sopa_weight).to(self.device)
75
+ model.load_state_dict(torch.load(fopa_weight, map_location='cpu'))
76
+ self.model = model.to(self.device).eval()
77
+
78
+ def build_data_transformer(self):
79
+ self.triple_transform = Compose([JointResize(256)])
80
+ self.image_transform = transforms.Compose(
81
+ [transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),]
82
+ )
83
+ self.mask_transform = transforms.ToTensor()
84
+
85
+ def generate_heatmap(self, background_image, csv_path, scaled_fg_dir, scaled_mask_dir, heatmap_dir):
86
+ os.makedirs(heatmap_dir, exist_ok=True)
87
+ heatmap_list = []
88
+ with open(csv_path, mode='r', newline='') as csv_file:
89
+ csv_reader = csv.DictReader(csv_file)
90
+ for row in csv_reader:
91
+ fg_name = '{}_{}_{}_{}.jpg'.format(row["fg_name"].split(".")[0],row["bg_name"].split(".")[0],int(row["newWidth"]),int(row["newHeight"]))
92
+ mask_name = '{}_{}_{}_{}.jpg'.format(row["fg_name"].split(".")[0],row["bg_name"].split(".")[0],int(row["newWidth"]),int(row["newHeight"]))
93
+ scale = row['scale']
94
+ save_name = fg_name.split(".")[0] + '_' + str(scale) + '.jpg'
95
+
96
+ bg_img = read_image_pil(background_image)
97
+ fg_img = read_image_pil(os.path.join(scaled_fg_dir, fg_name))
98
+ mask = read_mask_pil(os.path.join(scaled_mask_dir, mask_name))
99
+ bg_t, fg_t, mask_t = self.triple_transform(bg_img, fg_img, mask)
100
+ mask_t = self.mask_transform(mask_t).to(self.device)
101
+ fg_t = self.image_transform(fg_t).to(self.device)
102
+ bg_t = self.image_transform(bg_t).to(self.device)
103
+
104
+ outs, _ = self.model(bg_t.unsqueeze(0), fg_t.unsqueeze(0), mask_t.unsqueeze(0), 'test')
105
+ outs = torch.softmax(outs, dim=1)[:,1,:,:]
106
+ outs = transforms.ToPILImage()(outs)
107
+ out_file = os.path.join(heatmap_dir, save_name)
108
+ outs.save(out_file)
109
+ heatmap_list.append(out_file)
110
+ return heatmap_list
111
+
112
+ def generate_bounding_box(self, foreground_image, foreground_mask, background_image, csv_path,
113
+ cache_dir, heatmap_dir, fg_scale_num, composite_num_choose, composite_num):
114
+ icount = 0
115
+ with open(csv_path, mode='r', newline='') as csv_file:
116
+ csv_reader = csv.DictReader(csv_file)
117
+ for row in csv_reader:
118
+ scale = row['scale']
119
+ w = int(row['newWidth'])
120
+ h = int(row['newHeight'])
121
+ save_name = row['fg_name'].split(".")[0] + '_' + str(scale) + '.jpg'
122
+ fg_name = '{}_{}_{}_{}.jpg'.format(row["fg_name"].split(".")[0],row["bg_name"].split(".")[0],int(row["newWidth"]),int(row["newHeight"]))
123
+ save_name = fg_name.split(".")[0] + '_' + str(scale) + '.jpg'
124
+
125
+ if icount == 0:
126
+ bg_img = read_image_pil(background_image)
127
+ fg_tocp = read_image_pil(foreground_image)
128
+ mask_tocp = read_image_pil(foreground_mask)
129
+
130
+ composite_dir = os.path.join(cache_dir, f'{fg_scale_num}scales_composite', f'{row["fg_name"].split(".")[0]}_{row["bg_name"].split(".")[0]}')
131
+ os.makedirs(composite_dir, exist_ok=True)
132
+ heatmap_center_list = []
133
+ fg_size_list = []
134
+
135
+ icount += 1
136
+ heatmap = Image.open(os.path.join(heatmap_dir, save_name))
137
+ heatmap = np.array(heatmap)
138
+ heatmap_center = np.zeros_like(heatmap, dtype=np.float64)
139
+ hb = int(h / bg_img.height * heatmap.shape[0] / 2)
140
+ wb = int(w / bg_img.width * heatmap.shape[1] / 2)
141
+ heatmap_center[hb:-hb, wb:-wb] = heatmap[hb:-hb, wb:-wb]
142
+ heatmap_center_list.append(heatmap_center)
143
+ fg_size_list.append((h,w))
144
+
145
+ if icount == fg_scale_num:
146
+ icount = 0
147
+ heatmap_center_stack = np.stack(heatmap_center_list)
148
+ sorted_indices = np.argsort(-heatmap_center_stack, axis=None)
149
+ sorted_indices = np.unravel_index(sorted_indices, heatmap_center_stack.shape)
150
+
151
+ for i in range(composite_num):
152
+ iscale, y_, x_ = sorted_indices[0][i], sorted_indices[1][i], sorted_indices[2][i]
153
+ h, w = fg_size_list[iscale]
154
+ x_ = x_/heatmap.shape[1]*bg_img.width
155
+ y_ = y_/heatmap.shape[0]*bg_img.height
156
+ x = int(x_ - w / 2)
157
+ y = int(y_ - h / 2)
158
+
159
+ composite_img, composite_msk = make_composite_PIL(fg_tocp, mask_tocp, bg_img, [x, y, w, h], return_mask=True)
160
+ save_img_path = os.path.join(composite_dir, f'{row["fg_name"].split(".")[0]}_{row["bg_name"].split(".")[0]}_{x}_{y}_{w}_{h}.jpg')
161
+ save_msk_path = os.path.join(composite_dir, f'{row["fg_name"].split(".")[0]}_{row["bg_name"].split(".")[0]}_{x}_{y}_{w}_{h}.png')
162
+ composite_img.save(save_img_path)
163
+ composite_msk.save(save_msk_path)
164
+
165
+ source_folder = composite_dir
166
+ composite_dir_choose = os.path.join(cache_dir, f'{fg_scale_num}scales_composite_RandomSelect_{composite_num_choose}', f'{row["fg_name"].split(".")[0]}_{row["bg_name"].split(".")[0]}')
167
+ os.makedirs(composite_dir_choose, exist_ok=True)
168
+
169
+ bbox_list = []
170
+ image_files = [f for f in os.listdir(composite_dir) if f.endswith((".jpg"))]
171
+ selected_images = random.sample(image_files, composite_num_choose)
172
+ for image in selected_images:
173
+ source_path = os.path.join(source_folder, image)
174
+ destination_path = os.path.join(composite_dir_choose, image)
175
+ png_source_path = source_path.replace(".jpg", ".png")
176
+ destination_path_png = os.path.join(composite_dir_choose, image.replace(".jpg", ".png"))
177
+ shutil.copyfile(source_path, destination_path)
178
+ shutil.copyfile(png_source_path, destination_path_png)
179
+ bbox_list_parts = os.path.splitext(os.path.split(source_path)[1])[0].split('_')
180
+ x_box, y_box, w_box, h_box = int(bbox_list_parts[2]), int(bbox_list_parts[3]), int(bbox_list_parts[4]), int(bbox_list_parts[5])
181
+ last_four_numbers = [x_box, y_box, w_box, h_box]
182
+ bbox_list.append(last_four_numbers)
183
+ return bbox_list
184
+
185
+
186
+ @torch.no_grad()
187
+ def __call__(self, foreground_image, foreground_mask, background_image, cache_dir, heatmap_dir,
188
+ fg_scale_num=16, composite_num_choose=3, composite_num=50):
189
+ """
190
+ Generate a heatmap for a pair of scaled foreground and background.
191
+
192
+ Args:
193
+ foreground_image: foreground image path
194
+ foreground_mask: foreground mask path
195
+ background_image: background image path
196
+ cache_dir: folder path where scaled foreground images, scaled mask images and composite images are stored
197
+ heatmap_dir: folder path where heatmaps are stored
198
+ fg_scale_num: number of scales of scaled foreground images and mask images
199
+ composite_num_choose: the number of chosen composite images
200
+ composite_num: the number of composite images with the highest score
201
+
202
+ Returns:
203
+ box_list: the path of concatenated background image, foreground image and corresponding heatmap
204
+ heatmap_list: the path of heatmaps
205
+
206
+ """
207
+ scaled_fg_dir, scaled_mask_dir, csv_file = prepare_multi_fg_scales(cache_dir, foreground_image, foreground_mask, background_image, fg_scale_num)
208
+ heatmap_list = self.generate_heatmap(background_image, csv_file,
209
+ scaled_fg_dir, scaled_mask_dir, heatmap_dir)
210
+ box_list = self.generate_bounding_box(foreground_image, foreground_mask, background_image, csv_file,
211
+ cache_dir, heatmap_dir, fg_scale_num, composite_num_choose, composite_num)
212
+ return box_list, heatmap_list
File without changes
@@ -0,0 +1,229 @@
1
+ # import torchvision.models as models
2
+ # import torch.nn as nn
3
+ # # https://pytorch.org/docs/stable/torchvision/models.html#id3
4
+ #
5
+ import os
6
+ import torch
7
+ import torch.nn as nn
8
+ import torch.utils.model_zoo as model_zoo
9
+
10
+
11
+ model_urls = {
12
+ "resnet18": "https://download.pytorch.org/models/resnet18-5c106cde.pth",
13
+ "resnet34": "https://download.pytorch.org/models/resnet34-333f7ec4.pth",
14
+ "resnet50": "https://download.pytorch.org/models/resnet50-19c8e357.pth",
15
+ "resnet101": "https://download.pytorch.org/models/resnet101-5d3b4d8f.pth",
16
+ "resnet152": "https://download.pytorch.org/models/resnet152-b121ed2d.pth",
17
+ }
18
+
19
+ def conv3x3(in_planes, out_planes, stride=1):
20
+ """3x3 convolution with padding"""
21
+ return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=False)
22
+
23
+
24
+ def conv1x1(in_planes, out_planes, stride=1):
25
+ """1x1 convolution"""
26
+ return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False)
27
+
28
+
29
+ class BasicBlock(nn.Module):
30
+ expansion = 1
31
+
32
+ def __init__(self, inplanes, planes, stride=1, downsample=None):
33
+ super(BasicBlock, self).__init__()
34
+ self.conv1 = conv3x3(inplanes, planes, stride)
35
+ self.bn1 = nn.BatchNorm2d(planes)
36
+ self.relu = nn.ReLU(inplace=True)
37
+ self.conv2 = conv3x3(planes, planes)
38
+ self.bn2 = nn.BatchNorm2d(planes)
39
+ self.downsample = downsample
40
+ self.stride = stride
41
+
42
+ def forward(self, x):
43
+ identity = x
44
+
45
+ out = self.conv1(x)
46
+ out = self.bn1(out)
47
+ out = self.relu(out)
48
+
49
+ out = self.conv2(out)
50
+ out = self.bn2(out)
51
+
52
+ if self.downsample is not None:
53
+ identity = self.downsample(x)
54
+
55
+ out += identity
56
+ out = self.relu(out)
57
+
58
+ return out
59
+
60
+
61
+ class Bottleneck(nn.Module):
62
+ expansion = 4
63
+
64
+ def __init__(self, inplanes, planes, stride=1, downsample=None):
65
+ super(Bottleneck, self).__init__()
66
+ self.conv1 = conv1x1(inplanes, planes)
67
+ self.bn1 = nn.BatchNorm2d(planes)
68
+ self.conv2 = conv3x3(planes, planes, stride)
69
+ self.bn2 = nn.BatchNorm2d(planes)
70
+ self.conv3 = conv1x1(planes, planes * self.expansion)
71
+ self.bn3 = nn.BatchNorm2d(planes * self.expansion)
72
+ self.relu = nn.ReLU(inplace=True)
73
+ self.downsample = downsample
74
+ self.stride = stride
75
+
76
+ def forward(self, x):
77
+ identity = x
78
+
79
+ out = self.conv1(x)
80
+ out = self.bn1(out)
81
+ out = self.relu(out)
82
+
83
+ out = self.conv2(out)
84
+ out = self.bn2(out)
85
+ out = self.relu(out)
86
+
87
+ out = self.conv3(out)
88
+ out = self.bn3(out)
89
+
90
+ if self.downsample is not None:
91
+ identity = self.downsample(x)
92
+
93
+ out += identity
94
+ out = self.relu(out)
95
+
96
+ return out
97
+
98
+
99
+ class ResNet(nn.Module):
100
+ def __init__(self, block, layers, zero_init_residual=False):
101
+ super(ResNet, self).__init__()
102
+ self.inplanes = 64
103
+ self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False)
104
+ self.bn1 = nn.BatchNorm2d(64)
105
+ self.relu = nn.ReLU(inplace=True)
106
+ self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
107
+ self.layer1 = self._make_layer(block, 64, layers[0])
108
+ self.layer2 = self._make_layer(block, 128, layers[1], stride=2)
109
+ self.layer3 = self._make_layer(block, 256, layers[2], stride=2) # 6
110
+ self.layer4 = self._make_layer(block, 512, layers[3], stride=2) # 3
111
+
112
+ for m in self.modules():
113
+ if isinstance(m, nn.Conv2d):
114
+ nn.init.kaiming_normal_(m.weight, mode="fan_out", nonlinearity="relu")
115
+ elif isinstance(m, nn.BatchNorm2d):
116
+ nn.init.constant_(m.weight, 1)
117
+ nn.init.constant_(m.bias, 0)
118
+
119
+ # Zero-initialize the last BN in each residual branch,
120
+ # so that the residual branch starts with zeros, and each residual block behaves like an identity.
121
+ # This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677
122
+ if zero_init_residual:
123
+ for m in self.modules():
124
+ if isinstance(m, Bottleneck):
125
+ nn.init.constant_(m.bn3.weight, 0)
126
+ elif isinstance(m, BasicBlock):
127
+ nn.init.constant_(m.bn2.weight, 0)
128
+
129
+ def _make_layer(self, block, planes, blocks, stride=1):
130
+ downsample = None
131
+ if stride != 1 or self.inplanes != planes * block.expansion:
132
+ downsample = nn.Sequential(
133
+ conv1x1(self.inplanes, planes * block.expansion, stride), nn.BatchNorm2d(planes * block.expansion),
134
+ )
135
+
136
+ layers = []
137
+ layers.append(block(self.inplanes, planes, stride, downsample))
138
+ self.inplanes = planes * block.expansion
139
+ for _ in range(1, blocks):
140
+ layers.append(block(self.inplanes, planes))
141
+
142
+ return nn.Sequential(*layers)
143
+
144
+ def forward(self, x):
145
+ x = self.conv1(x)
146
+ x = self.bn1(x)
147
+ x = self.relu(x)
148
+ x = self.maxpool(x)
149
+
150
+ x = self.layer1(x)
151
+ x = self.layer2(x)
152
+ x = self.layer3(x)
153
+ x = self.layer4(x)
154
+
155
+ return x
156
+
157
+ def resnet18(pretrained=False, **kwargs):
158
+ """Constructs a ResNet-18 model.
159
+
160
+ Args:
161
+ pretrained (bool): If True, returns a model pre-trained on ImageNet
162
+ """
163
+ model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs)
164
+ if pretrained:
165
+ pretrained_dict = model_zoo.load_url(model_urls["resnet18"])
166
+
167
+ model_dict = model.state_dict()
168
+ # 1. filter out unnecessary keys
169
+ pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict}
170
+ # 2. overwrite entries in the existing state dict
171
+ model_dict.update(pretrained_dict)
172
+ # 3. load the new state dict
173
+ model.load_state_dict(model_dict)
174
+ return model
175
+
176
+
177
+ def Backbone_ResNet18_in3(pretrained=True, weight_path=None):
178
+ if pretrained:
179
+ print("The backbone model loads the pretrained parameters...")
180
+ net = pretrained_resnet18_4ch(pretrained=True, weight_path=weight_path)
181
+ div_2 = nn.Sequential(*list(net.children())[:3])
182
+ div_4 = nn.Sequential(*list(net.children())[3:5])
183
+ div_8 = net.layer2
184
+ div_16 = net.layer3
185
+ div_32 = net.layer4
186
+
187
+ return div_2, div_4, div_8, div_16, div_32
188
+
189
+
190
+ def Backbone_ResNet18_in3_1(pretrained=True):
191
+ if pretrained:
192
+ print("The backbone model loads the pretrained parameters...")
193
+ net = resnet18(pretrained=pretrained)
194
+
195
+ model_dict = net.state_dict()
196
+ conv1 = model_dict['conv1.weight']
197
+ new = torch.zeros(64, 1, 7, 7)
198
+ for i, output_channel in enumerate(conv1):
199
+ new[i] = 0.299 * output_channel[0] + 0.587 * output_channel[1] + 0.114 * output_channel[2]
200
+ net.conv1 = nn.Conv2d(4, 64, kernel_size=(7, 7), stride=(2, 2), padding=3, bias=False)
201
+ model_dict['conv1.weight'] = torch.cat((conv1, new), dim=1)
202
+ net.load_state_dict(model_dict)
203
+
204
+ div_1 = nn.Sequential(*list(net.children())[:1])
205
+ div_2 = nn.Sequential(*list(net.children())[1:3])
206
+ div_4 = nn.Sequential(*list(net.children())[3:5])
207
+ div_8 = net.layer2
208
+ div_16 = net.layer3
209
+ # div_32 = make_layer_4(BasicBlock, 448, 2, stride=2)
210
+ div_32 = net.layer4
211
+ return div_1, div_2, div_4, div_8, div_16, div_32
212
+
213
+
214
+
215
+ def pretrained_resnet18_4ch(pretrained=True, weight_path=None, **kwargs):
216
+ model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs)
217
+ model.conv1 = nn.Conv2d(4, 64, kernel_size=(7, 7), stride=(2, 2), padding=3, bias=False)
218
+
219
+ if pretrained:
220
+ # load the pretrained binary classification model for slow object placement assessment (SOPA)
221
+ # checkpoint = torch.load('./pretrained_models/SOPA.pth.tar')
222
+ current_directory = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
223
+ checkpoint = torch.load(weight_path)
224
+ model.load_state_dict(checkpoint['state_dict'], strict=False)
225
+
226
+ return model
227
+
228
+
229
+
File without changes