InvokeAI 4.0.2__tar.gz → 4.0.3__tar.gz

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 (386) hide show
  1. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/InvokeAI.egg-info/PKG-INFO +1 -1
  2. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/InvokeAI.egg-info/SOURCES.txt +8 -6
  3. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/PKG-INFO +1 -1
  4. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/app_info.py +2 -2
  5. InvokeAI-4.0.3/invokeai/app/invocations/infill.py +167 -0
  6. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/ip_adapter.py +4 -9
  7. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/latent.py +1 -1
  8. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_manager/model_manager_default.py +1 -0
  9. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/__init__.py +1 -1
  10. {InvokeAI-4.0.2/invokeai/backend/image_util → InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods}/lama.py +9 -0
  11. InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods/mosaic.py +60 -0
  12. InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods/patchmatch.py +67 -0
  13. InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods/tile.py +122 -0
  14. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_cache/model_cache_default.py +11 -4
  15. InvokeAI-4.0.3/invokeai/frontend/web/dist/assets/App-BLcNMYZP.js +128 -0
  16. InvokeAI-4.0.3/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-DKJ1LbAm.js +1 -0
  17. InvokeAI-4.0.2/invokeai/frontend/web/dist/assets/index-Db_dTLB8.js → InvokeAI-4.0.3/invokeai/frontend/web/dist/assets/index-MDF-DOT9.js +63 -63
  18. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/index.html +1 -1
  19. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/de.json +18 -5
  20. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/en.json +7 -0
  21. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/it.json +5 -3
  22. InvokeAI-4.0.3/invokeai/version/invokeai_version.py +1 -0
  23. InvokeAI-4.0.2/invokeai/app/invocations/infill.py +0 -248
  24. InvokeAI-4.0.2/invokeai/backend/image_util/patchmatch.py +0 -49
  25. InvokeAI-4.0.2/invokeai/frontend/web/dist/assets/App-De040c8N.js +0 -128
  26. InvokeAI-4.0.2/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-CduMu4GW.js +0 -1
  27. InvokeAI-4.0.2/invokeai/version/invokeai_version.py +0 -1
  28. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/InvokeAI.egg-info/dependency_links.txt +0 -0
  29. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/InvokeAI.egg-info/entry_points.txt +0 -0
  30. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/InvokeAI.egg-info/requires.txt +0 -0
  31. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/InvokeAI.egg-info/top_level.txt +0 -0
  32. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/LICENSE +0 -0
  33. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/LICENSE-SD1+SD2.txt +0 -0
  34. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/LICENSE-SDXL.txt +0 -0
  35. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/README.md +0 -0
  36. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/__init__.py +0 -0
  37. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/dependencies.py +0 -0
  38. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/events.py +0 -0
  39. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/no_cache_staticfiles.py +0 -0
  40. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/board_images.py +0 -0
  41. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/boards.py +0 -0
  42. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/download_queue.py +0 -0
  43. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/images.py +0 -0
  44. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/model_manager.py +0 -0
  45. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/session_queue.py +0 -0
  46. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/utilities.py +0 -0
  47. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/workflows.py +0 -0
  48. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/sockets.py +0 -0
  49. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api_app.py +0 -0
  50. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/assets/images/caution.png +0 -0
  51. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/__init__.py +0 -0
  52. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/baseinvocation.py +0 -0
  53. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/collections.py +0 -0
  54. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/compel.py +0 -0
  55. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/constants.py +0 -0
  56. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/controlnet_image_processors.py +0 -0
  57. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/custom_nodes/README.md +0 -0
  58. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/custom_nodes/init.py +0 -0
  59. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/cv.py +0 -0
  60. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/facetools.py +0 -0
  61. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/fields.py +0 -0
  62. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/image.py +0 -0
  63. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/math.py +0 -0
  64. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/metadata.py +0 -0
  65. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/model.py +0 -0
  66. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/noise.py +0 -0
  67. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/param_easing.py +0 -0
  68. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/primitives.py +0 -0
  69. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/prompt.py +0 -0
  70. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/sdxl.py +0 -0
  71. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/strings.py +0 -0
  72. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/t2i_adapter.py +0 -0
  73. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/tiles.py +0 -0
  74. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/upscale.py +0 -0
  75. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/util.py +0 -0
  76. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/run_app.py +0 -0
  77. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/__init__.py +0 -0
  78. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_image_records/__init__.py +0 -0
  79. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_image_records/board_image_records_base.py +0 -0
  80. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_image_records/board_image_records_sqlite.py +0 -0
  81. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_images/__init__.py +0 -0
  82. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_images/board_images_base.py +0 -0
  83. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_images/board_images_common.py +0 -0
  84. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_images/board_images_default.py +0 -0
  85. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_records/board_records_base.py +0 -0
  86. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_records/board_records_common.py +0 -0
  87. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_records/board_records_sqlite.py +0 -0
  88. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/boards/__init__.py +0 -0
  89. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/boards/boards_base.py +0 -0
  90. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/boards/boards_common.py +0 -0
  91. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/boards/boards_default.py +0 -0
  92. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/bulk_download/__init__.py +0 -0
  93. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/bulk_download/bulk_download_base.py +0 -0
  94. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/bulk_download/bulk_download_common.py +0 -0
  95. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/bulk_download/bulk_download_default.py +0 -0
  96. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/config/__init__.py +0 -0
  97. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/config/config_common.py +0 -0
  98. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/config/config_default.py +0 -0
  99. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/download/__init__.py +0 -0
  100. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/download/download_base.py +0 -0
  101. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/download/download_default.py +0 -0
  102. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/events/__init__.py +0 -0
  103. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/events/events_base.py +0 -0
  104. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/image_files/__init__.py +0 -0
  105. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/image_files/image_files_base.py +0 -0
  106. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/image_files/image_files_common.py +0 -0
  107. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/image_files/image_files_disk.py +0 -0
  108. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/image_records/__init__.py +0 -0
  109. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/image_records/image_records_base.py +0 -0
  110. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/image_records/image_records_common.py +0 -0
  111. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/image_records/image_records_sqlite.py +0 -0
  112. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/images/__init__.py +0 -0
  113. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/images/images_base.py +0 -0
  114. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/images/images_common.py +0 -0
  115. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/images/images_default.py +0 -0
  116. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_cache/__init__.py +0 -0
  117. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_cache/invocation_cache_base.py +0 -0
  118. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_cache/invocation_cache_common.py +0 -0
  119. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_cache/invocation_cache_memory.py +0 -0
  120. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_services.py +0 -0
  121. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_stats/__init__.py +0 -0
  122. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_stats/invocation_stats_base.py +0 -0
  123. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_stats/invocation_stats_common.py +0 -0
  124. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_stats/invocation_stats_default.py +0 -0
  125. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invoker.py +0 -0
  126. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/item_storage/__init__.py +0 -0
  127. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/item_storage/item_storage_base.py +0 -0
  128. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/item_storage/item_storage_common.py +0 -0
  129. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/item_storage/item_storage_memory.py +0 -0
  130. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_images/model_images_base.py +0 -0
  131. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_images/model_images_common.py +0 -0
  132. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_images/model_images_default.py +0 -0
  133. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_install/__init__.py +0 -0
  134. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_install/model_install_base.py +0 -0
  135. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_install/model_install_default.py +0 -0
  136. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_load/__init__.py +0 -0
  137. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_load/model_load_base.py +0 -0
  138. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_load/model_load_default.py +0 -0
  139. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_manager/__init__.py +0 -0
  140. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_manager/model_manager_base.py +0 -0
  141. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_manager/model_manager_common.py +0 -0
  142. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_records/__init__.py +0 -0
  143. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_records/model_records_base.py +0 -0
  144. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_records/model_records_sql.py +0 -0
  145. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/names/__init__.py +0 -0
  146. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/names/names_base.py +0 -0
  147. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/names/names_common.py +0 -0
  148. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/names/names_default.py +0 -0
  149. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/object_serializer/object_serializer_base.py +0 -0
  150. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/object_serializer/object_serializer_common.py +0 -0
  151. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/object_serializer/object_serializer_disk.py +0 -0
  152. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/object_serializer/object_serializer_forward_cache.py +0 -0
  153. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/session_processor/__init__.py +0 -0
  154. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/session_processor/session_processor_base.py +0 -0
  155. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/session_processor/session_processor_common.py +0 -0
  156. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/session_processor/session_processor_default.py +0 -0
  157. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/session_queue/__init__.py +0 -0
  158. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/session_queue/session_queue_base.py +0 -0
  159. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/session_queue/session_queue_common.py +0 -0
  160. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/session_queue/session_queue_sqlite.py +0 -0
  161. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/__init__.py +0 -0
  162. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/graph.py +0 -0
  163. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/invocation_context.py +0 -0
  164. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/pagination.py +0 -0
  165. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite/__init__.py +0 -0
  166. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite/sqlite_common.py +0 -0
  167. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite/sqlite_database.py +0 -0
  168. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite/sqlite_util.py +0 -0
  169. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/__init__.py +0 -0
  170. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/__init__.py +0 -0
  171. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_1.py +0 -0
  172. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_2.py +0 -0
  173. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_3.py +0 -0
  174. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_4.py +0 -0
  175. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_5.py +0 -0
  176. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_6.py +0 -0
  177. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_7.py +0 -0
  178. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_8.py +0 -0
  179. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_9.py +0 -0
  180. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_common.py +0 -0
  181. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py +0 -0
  182. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/urls/__init__.py +0 -0
  183. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/urls/urls_base.py +0 -0
  184. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/urls/urls_default.py +0 -0
  185. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/__init__.py +0 -0
  186. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/ESRGAN Upscaling with Canny ControlNet.json +0 -0
  187. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Face Detailer with IP-Adapter & Canny (See Note in Details).json +0 -0
  188. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Multi ControlNet (Canny & Depth).json +0 -0
  189. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Prompt from File.json +0 -0
  190. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Text to Image - SD1.5.json +0 -0
  191. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Text to Image - SDXL.json +0 -0
  192. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Text to Image with LoRA.json +0 -0
  193. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Tiled Upscaling (Beta).json +0 -0
  194. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/workflow_records_base.py +0 -0
  195. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/workflow_records_common.py +0 -0
  196. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/workflow_records_sqlite.py +0 -0
  197. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/shared/__init__.py +0 -0
  198. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/shared/models.py +0 -0
  199. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/__init__.py +0 -0
  200. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/controlnet_utils.py +0 -0
  201. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/download_with_progress.py +0 -0
  202. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/metaenum.py +0 -0
  203. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/misc.py +0 -0
  204. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/model_exclude_null.py +0 -0
  205. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/profiler.py +0 -0
  206. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/step_callback.py +0 -0
  207. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/suppress_output.py +0 -0
  208. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/thumbnails.py +0 -0
  209. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/ti_utils.py +0 -0
  210. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/assets/fonts/inter/Inter-Regular.ttf +0 -0
  211. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/__init__.py +0 -0
  212. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/basicsr/__init__.py +0 -0
  213. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/basicsr/arch_util.py +0 -0
  214. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/basicsr/rrdbnet_arch.py +0 -0
  215. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/canny.py +0 -0
  216. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/depth_anything/__init__.py +0 -0
  217. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/depth_anything/model/blocks.py +0 -0
  218. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/depth_anything/model/dpt.py +0 -0
  219. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/depth_anything/utilities/util.py +0 -0
  220. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/__init__.py +0 -0
  221. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/onnxdet.py +0 -0
  222. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/onnxpose.py +0 -0
  223. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/utils.py +0 -0
  224. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/wholebody.py +0 -0
  225. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/hed.py +0 -0
  226. {InvokeAI-4.0.2/invokeai/backend/image_util → InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods}/cv2_inpaint.py +0 -0
  227. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/invisible_watermark.py +0 -0
  228. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/lineart.py +0 -0
  229. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/lineart_anime.py +0 -0
  230. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/pngwriter.py +0 -0
  231. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/realesrgan/__init__.py +0 -0
  232. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/realesrgan/realesrgan.py +0 -0
  233. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/safety_checker.py +0 -0
  234. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/seamless.py +0 -0
  235. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/util.py +0 -0
  236. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/__init__.py +0 -0
  237. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/attention_processor.py +0 -0
  238. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/ip_adapter.py +0 -0
  239. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/ip_attention_weights.py +0 -0
  240. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/resampler.py +0 -0
  241. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/unet_patcher.py +0 -0
  242. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/lora.py +0 -0
  243. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_hash/model_hash.py +0 -0
  244. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/__init__.py +0 -0
  245. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/config.py +0 -0
  246. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/convert_ckpt_to_diffusers.py +0 -0
  247. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/libc_util.py +0 -0
  248. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/__init__.py +0 -0
  249. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/convert_cache/__init__.py +0 -0
  250. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/convert_cache/convert_cache_base.py +0 -0
  251. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/convert_cache/convert_cache_default.py +0 -0
  252. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/load_base.py +0 -0
  253. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/load_default.py +0 -0
  254. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/memory_snapshot.py +0 -0
  255. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_cache/__init__.py +0 -0
  256. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_cache/model_cache_base.py +0 -0
  257. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_cache/model_locker.py +1 -1
  258. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loader_registry.py +0 -0
  259. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/__init__.py +0 -0
  260. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/controlnet.py +0 -0
  261. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/generic_diffusers.py +0 -0
  262. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/ip_adapter.py +0 -0
  263. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/lora.py +0 -0
  264. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/onnx.py +0 -0
  265. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/stable_diffusion.py +0 -0
  266. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/textual_inversion.py +0 -0
  267. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/vae.py +0 -0
  268. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_util.py +0 -0
  269. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/optimizations.py +0 -0
  270. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/merge.py +0 -0
  271. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/__init__.py +0 -0
  272. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/fetch/__init__.py +0 -0
  273. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/fetch/fetch_base.py +0 -0
  274. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/fetch/huggingface.py +0 -0
  275. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/metadata_base.py +0 -0
  276. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/probe.py +0 -0
  277. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/search.py +0 -0
  278. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/starter_models.py +0 -0
  279. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/util/libc_util.py +0 -0
  280. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/util/model_util.py +0 -0
  281. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/util/select_hf_files.py +0 -0
  282. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_patcher.py +0 -0
  283. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/onnx/onnx_runtime.py +0 -0
  284. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/raw_model.py +0 -0
  285. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/__init__.py +0 -0
  286. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusers_pipeline.py +0 -0
  287. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusion/__init__.py +0 -0
  288. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusion/conditioning_data.py +0 -0
  289. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusion/cross_attention_control.py +0 -0
  290. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py +0 -0
  291. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/schedulers/__init__.py +0 -0
  292. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/schedulers/schedulers.py +0 -0
  293. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/seamless.py +0 -0
  294. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/textual_inversion.py +0 -0
  295. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/tiles/__init__.py +0 -0
  296. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/tiles/tiles.py +0 -0
  297. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/tiles/utils.py +0 -0
  298. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/__init__.py +0 -0
  299. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/attention.py +0 -0
  300. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/db_maintenance.py +0 -0
  301. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/devices.py +0 -0
  302. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/hotfixes.py +0 -0
  303. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/logging.py +0 -0
  304. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/mps_fixes.py +0 -0
  305. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/silence_warnings.py +0 -0
  306. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/test_utils.py +0 -0
  307. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/util.py +0 -0
  308. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/controlnet/cldm_v15.yaml +0 -0
  309. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/controlnet/cldm_v21.yaml +0 -0
  310. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/sd_xl_base.yaml +0 -0
  311. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/sd_xl_refiner.yaml +0 -0
  312. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-finetune.yaml +0 -0
  313. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-finetune_style.yaml +0 -0
  314. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-inference-v.yaml +0 -0
  315. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-inference.yaml +0 -0
  316. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-inpainting-inference.yaml +0 -0
  317. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-m1-finetune.yaml +0 -0
  318. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-inference-v.yaml +0 -0
  319. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-inference.yaml +0 -0
  320. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-inpainting-inference-v.yaml +0 -0
  321. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-inpainting-inference.yaml +0 -0
  322. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-midas-inference.yaml +0 -0
  323. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/__init__.py +0 -0
  324. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/cli/__init__.py +0 -0
  325. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/cli/arg_parser.py +0 -0
  326. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/install/__init__.py +0 -0
  327. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/install/import_images.py +0 -0
  328. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/__init__.py +0 -0
  329. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/App-DI6oCUg0.css +0 -0
  330. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-Bsx7ESc2.css +0 -0
  331. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-avatar-circle.svg +0 -0
  332. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-avatar-square.svg +0 -0
  333. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-favicon.png +0 -0
  334. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-favicon.svg +0 -0
  335. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-key-char-lrg.svg +0 -0
  336. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-key-char-sml.svg +0 -0
  337. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-key-wht-lrg.svg +0 -0
  338. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-key-wht-sml.svg +0 -0
  339. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-char-lrg.svg +0 -0
  340. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-char-sml.svg +0 -0
  341. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-wht-lrg.svg +0 -0
  342. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-wht-sml.svg +0 -0
  343. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-ylw-lrg.svg +0 -0
  344. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-tag-char-lrg.svg +0 -0
  345. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-tag-char-sml.svg +0 -0
  346. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-tag-lrg.svg +0 -0
  347. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-tag-sml.svg +0 -0
  348. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-wordmark-charcoal.svg +0 -0
  349. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-wordmark-white.svg +0 -0
  350. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/mask.svg +0 -0
  351. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-cyrillic-ext-wght-normal-DIEz8p5i.woff2 +0 -0
  352. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-cyrillic-wght-normal-BmJJXa8e.woff2 +0 -0
  353. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-greek-ext-wght-normal-D5AYLNiq.woff2 +0 -0
  354. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-greek-wght-normal-DyIDNIyN.woff2 +0 -0
  355. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-latin-ext-wght-normal-CN1pIXkb.woff2 +0 -0
  356. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-latin-wght-normal-BgVq2Tq4.woff2 +0 -0
  357. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-vietnamese-wght-normal-_GQuwPVU.woff2 +0 -0
  358. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ar.json +0 -0
  359. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/az.json +0 -0
  360. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/bg.json +0 -0
  361. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/es.json +0 -0
  362. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/fi.json +0 -0
  363. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/fr.json +0 -0
  364. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/he.json +0 -0
  365. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/hu.json +0 -0
  366. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ja.json +0 -0
  367. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ko.json +0 -0
  368. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/mn.json +0 -0
  369. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/nl.json +0 -0
  370. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/pl.json +0 -0
  371. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/pt.json +0 -0
  372. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/pt_BR.json +0 -0
  373. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ro.json +0 -0
  374. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ru.json +0 -0
  375. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/sv.json +0 -0
  376. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/tr.json +0 -0
  377. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/uk.json +0 -0
  378. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/vi.json +0 -0
  379. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/zh_CN.json +0 -0
  380. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/zh_Hant.json +0 -0
  381. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/scripts/clean_translations.py +0 -0
  382. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/static/docs/invoke-favicon-docs.svg +0 -0
  383. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/invocation_api/__init__.py +0 -0
  384. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/version/__init__.py +0 -0
  385. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/pyproject.toml +0 -0
  386. {InvokeAI-4.0.2 → InvokeAI-4.0.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: InvokeAI
3
- Version: 4.0.2
3
+ Version: 4.0.3
4
4
  Summary: An implementation of Stable Diffusion which provides various new features and options to aid the image generation process
5
5
  Author-email: The InvokeAI Project <lincoln.stein@gmail.com>
6
6
  License: Apache License
@@ -196,13 +196,10 @@ invokeai/backend/raw_model.py
196
196
  invokeai/backend/textual_inversion.py
197
197
  invokeai/backend/image_util/__init__.py
198
198
  invokeai/backend/image_util/canny.py
199
- invokeai/backend/image_util/cv2_inpaint.py
200
199
  invokeai/backend/image_util/hed.py
201
200
  invokeai/backend/image_util/invisible_watermark.py
202
- invokeai/backend/image_util/lama.py
203
201
  invokeai/backend/image_util/lineart.py
204
202
  invokeai/backend/image_util/lineart_anime.py
205
- invokeai/backend/image_util/patchmatch.py
206
203
  invokeai/backend/image_util/pngwriter.py
207
204
  invokeai/backend/image_util/safety_checker.py
208
205
  invokeai/backend/image_util/seamless.py
@@ -219,6 +216,11 @@ invokeai/backend/image_util/dw_openpose/onnxdet.py
219
216
  invokeai/backend/image_util/dw_openpose/onnxpose.py
220
217
  invokeai/backend/image_util/dw_openpose/utils.py
221
218
  invokeai/backend/image_util/dw_openpose/wholebody.py
219
+ invokeai/backend/image_util/infill_methods/cv2_inpaint.py
220
+ invokeai/backend/image_util/infill_methods/lama.py
221
+ invokeai/backend/image_util/infill_methods/mosaic.py
222
+ invokeai/backend/image_util/infill_methods/patchmatch.py
223
+ invokeai/backend/image_util/infill_methods/tile.py
222
224
  invokeai/backend/image_util/realesrgan/__init__.py
223
225
  invokeai/backend/image_util/realesrgan/realesrgan.py
224
226
  invokeai/backend/ip_adapter/__init__.py
@@ -312,11 +314,11 @@ invokeai/frontend/install/__init__.py
312
314
  invokeai/frontend/install/import_images.py
313
315
  invokeai/frontend/web/__init__.py
314
316
  invokeai/frontend/web/dist/index.html
317
+ invokeai/frontend/web/dist/assets/App-BLcNMYZP.js
315
318
  invokeai/frontend/web/dist/assets/App-DI6oCUg0.css
316
- invokeai/frontend/web/dist/assets/App-De040c8N.js
317
319
  invokeai/frontend/web/dist/assets/ThemeLocaleProvider-Bsx7ESc2.css
318
- invokeai/frontend/web/dist/assets/ThemeLocaleProvider-CduMu4GW.js
319
- invokeai/frontend/web/dist/assets/index-Db_dTLB8.js
320
+ invokeai/frontend/web/dist/assets/ThemeLocaleProvider-DKJ1LbAm.js
321
+ invokeai/frontend/web/dist/assets/index-MDF-DOT9.js
320
322
  invokeai/frontend/web/dist/assets/inter-cyrillic-ext-wght-normal-DIEz8p5i.woff2
321
323
  invokeai/frontend/web/dist/assets/inter-cyrillic-wght-normal-BmJJXa8e.woff2
322
324
  invokeai/frontend/web/dist/assets/inter-greek-ext-wght-normal-D5AYLNiq.woff2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: InvokeAI
3
- Version: 4.0.2
3
+ Version: 4.0.3
4
4
  Summary: An implementation of Stable Diffusion which provides various new features and options to aid the image generation process
5
5
  Author-email: The InvokeAI Project <lincoln.stein@gmail.com>
6
6
  License: Apache License
@@ -12,7 +12,7 @@ from pydantic import BaseModel, Field
12
12
 
13
13
  from invokeai.app.invocations.upscale import ESRGAN_MODELS
14
14
  from invokeai.app.services.invocation_cache.invocation_cache_common import InvocationCacheStatus
15
- from invokeai.backend.image_util.patchmatch import PatchMatch
15
+ from invokeai.backend.image_util.infill_methods.patchmatch import PatchMatch
16
16
  from invokeai.backend.image_util.safety_checker import SafetyChecker
17
17
  from invokeai.backend.util.logging import logging
18
18
  from invokeai.version import __version__
@@ -100,7 +100,7 @@ async def get_app_deps() -> AppDependencyVersions:
100
100
 
101
101
  @app_router.get("/config", operation_id="get_config", status_code=200, response_model=AppConfig)
102
102
  async def get_config() -> AppConfig:
103
- infill_methods = ["tile", "lama", "cv2"]
103
+ infill_methods = ["tile", "lama", "cv2", "color"] # TODO: add mosaic back
104
104
  if PatchMatch.patchmatch_available():
105
105
  infill_methods.append("patchmatch")
106
106
 
@@ -0,0 +1,167 @@
1
+ from abc import abstractmethod
2
+ from typing import Literal, get_args
3
+
4
+ from PIL import Image
5
+
6
+ from invokeai.app.invocations.fields import ColorField, ImageField
7
+ from invokeai.app.invocations.primitives import ImageOutput
8
+ from invokeai.app.services.shared.invocation_context import InvocationContext
9
+ from invokeai.app.util.misc import SEED_MAX
10
+ from invokeai.backend.image_util.infill_methods.cv2_inpaint import cv2_inpaint
11
+ from invokeai.backend.image_util.infill_methods.lama import LaMA
12
+ from invokeai.backend.image_util.infill_methods.mosaic import infill_mosaic
13
+ from invokeai.backend.image_util.infill_methods.patchmatch import PatchMatch, infill_patchmatch
14
+ from invokeai.backend.image_util.infill_methods.tile import infill_tile
15
+ from invokeai.backend.util.logging import InvokeAILogger
16
+
17
+ from .baseinvocation import BaseInvocation, invocation
18
+ from .fields import InputField, WithBoard, WithMetadata
19
+ from .image import PIL_RESAMPLING_MAP, PIL_RESAMPLING_MODES
20
+
21
+ logger = InvokeAILogger.get_logger()
22
+
23
+
24
+ def get_infill_methods():
25
+ methods = Literal["tile", "color", "lama", "cv2"] # TODO: add mosaic back
26
+ if PatchMatch.patchmatch_available():
27
+ methods = Literal["patchmatch", "tile", "color", "lama", "cv2"] # TODO: add mosaic back
28
+ return methods
29
+
30
+
31
+ INFILL_METHODS = get_infill_methods()
32
+ DEFAULT_INFILL_METHOD = "patchmatch" if "patchmatch" in get_args(INFILL_METHODS) else "tile"
33
+
34
+
35
+ class InfillImageProcessorInvocation(BaseInvocation, WithMetadata, WithBoard):
36
+ """Base class for invocations that preprocess images for Infilling"""
37
+
38
+ image: ImageField = InputField(description="The image to process")
39
+
40
+ @abstractmethod
41
+ def infill(self, image: Image.Image) -> Image.Image:
42
+ """Infill the image with the specified method"""
43
+ pass
44
+
45
+ def load_image(self, context: InvocationContext) -> tuple[Image.Image, bool]:
46
+ """Process the image to have an alpha channel before being infilled"""
47
+ image = context.images.get_pil(self.image.image_name)
48
+ has_alpha = True if image.mode == "RGBA" else False
49
+ return image, has_alpha
50
+
51
+ def invoke(self, context: InvocationContext) -> ImageOutput:
52
+ # Retrieve and process image to be infilled
53
+ input_image, has_alpha = self.load_image(context)
54
+
55
+ # If the input image has no alpha channel, return it
56
+ if has_alpha is False:
57
+ return ImageOutput.build(context.images.get_dto(self.image.image_name))
58
+
59
+ # Perform Infill action
60
+ infilled_image = self.infill(input_image)
61
+
62
+ # Create ImageDTO for Infilled Image
63
+ infilled_image_dto = context.images.save(image=infilled_image)
64
+
65
+ # Return Infilled Image
66
+ return ImageOutput.build(infilled_image_dto)
67
+
68
+
69
+ @invocation("infill_rgba", title="Solid Color Infill", tags=["image", "inpaint"], category="inpaint", version="1.2.2")
70
+ class InfillColorInvocation(InfillImageProcessorInvocation):
71
+ """Infills transparent areas of an image with a solid color"""
72
+
73
+ color: ColorField = InputField(
74
+ default=ColorField(r=127, g=127, b=127, a=255),
75
+ description="The color to use to infill",
76
+ )
77
+
78
+ def infill(self, image: Image.Image):
79
+ solid_bg = Image.new("RGBA", image.size, self.color.tuple())
80
+ infilled = Image.alpha_composite(solid_bg, image.convert("RGBA"))
81
+ infilled.paste(image, (0, 0), image.split()[-1])
82
+ return infilled
83
+
84
+
85
+ @invocation("infill_tile", title="Tile Infill", tags=["image", "inpaint"], category="inpaint", version="1.2.3")
86
+ class InfillTileInvocation(InfillImageProcessorInvocation):
87
+ """Infills transparent areas of an image with tiles of the image"""
88
+
89
+ tile_size: int = InputField(default=32, ge=1, description="The tile size (px)")
90
+ seed: int = InputField(
91
+ default=0,
92
+ ge=0,
93
+ le=SEED_MAX,
94
+ description="The seed to use for tile generation (omit for random)",
95
+ )
96
+
97
+ def infill(self, image: Image.Image):
98
+ output = infill_tile(image, seed=self.seed, tile_size=self.tile_size)
99
+ return output.infilled
100
+
101
+
102
+ @invocation(
103
+ "infill_patchmatch", title="PatchMatch Infill", tags=["image", "inpaint"], category="inpaint", version="1.2.2"
104
+ )
105
+ class InfillPatchMatchInvocation(InfillImageProcessorInvocation):
106
+ """Infills transparent areas of an image using the PatchMatch algorithm"""
107
+
108
+ downscale: float = InputField(default=2.0, gt=0, description="Run patchmatch on downscaled image to speedup infill")
109
+ resample_mode: PIL_RESAMPLING_MODES = InputField(default="bicubic", description="The resampling mode")
110
+
111
+ def infill(self, image: Image.Image):
112
+ resample_mode = PIL_RESAMPLING_MAP[self.resample_mode]
113
+
114
+ width = int(image.width / self.downscale)
115
+ height = int(image.height / self.downscale)
116
+
117
+ infilled = image.resize(
118
+ (width, height),
119
+ resample=resample_mode,
120
+ )
121
+ infilled = infill_patchmatch(image)
122
+ infilled = infilled.resize(
123
+ (image.width, image.height),
124
+ resample=resample_mode,
125
+ )
126
+ infilled.paste(image, (0, 0), mask=image.split()[-1])
127
+
128
+ return infilled
129
+
130
+
131
+ @invocation("infill_lama", title="LaMa Infill", tags=["image", "inpaint"], category="inpaint", version="1.2.2")
132
+ class LaMaInfillInvocation(InfillImageProcessorInvocation):
133
+ """Infills transparent areas of an image using the LaMa model"""
134
+
135
+ def infill(self, image: Image.Image):
136
+ lama = LaMA()
137
+ return lama(image)
138
+
139
+
140
+ @invocation("infill_cv2", title="CV2 Infill", tags=["image", "inpaint"], category="inpaint", version="1.2.2")
141
+ class CV2InfillInvocation(InfillImageProcessorInvocation):
142
+ """Infills transparent areas of an image using OpenCV Inpainting"""
143
+
144
+ def infill(self, image: Image.Image):
145
+ return cv2_inpaint(image)
146
+
147
+
148
+ # @invocation(
149
+ # "infill_mosaic", title="Mosaic Infill", tags=["image", "inpaint", "outpaint"], category="inpaint", version="1.0.0"
150
+ # )
151
+ class MosaicInfillInvocation(InfillImageProcessorInvocation):
152
+ """Infills transparent areas of an image with a mosaic pattern drawing colors from the rest of the image"""
153
+
154
+ image: ImageField = InputField(description="The image to infill")
155
+ tile_width: int = InputField(default=64, description="Width of the tile")
156
+ tile_height: int = InputField(default=64, description="Height of the tile")
157
+ min_color: ColorField = InputField(
158
+ default=ColorField(r=0, g=0, b=0, a=255),
159
+ description="The min threshold for color",
160
+ )
161
+ max_color: ColorField = InputField(
162
+ default=ColorField(r=255, g=255, b=255, a=255),
163
+ description="The max threshold for color",
164
+ )
165
+
166
+ def infill(self, image: Image.Image):
167
+ return infill_mosaic(image, (self.tile_width, self.tile_height), self.min_color.tuple(), self.max_color.tuple())
@@ -65,7 +65,7 @@ class IPAdapterInvocation(BaseInvocation):
65
65
  ui_order=-1,
66
66
  ui_type=UIType.IPAdapterModel,
67
67
  )
68
- clip_vision_model: Literal["auto", "ViT-H", "ViT-G"] = InputField(
68
+ clip_vision_model: Literal["ViT-H", "ViT-G"] = InputField(
69
69
  description="CLIP Vision model to use. Overrides model settings. Mandatory for checkpoint models.",
70
70
  default="auto",
71
71
  ui_order=2,
@@ -96,14 +96,9 @@ class IPAdapterInvocation(BaseInvocation):
96
96
  ip_adapter_info = context.models.get_config(self.ip_adapter_model.key)
97
97
  assert isinstance(ip_adapter_info, (IPAdapterInvokeAIConfig, IPAdapterCheckpointConfig))
98
98
 
99
- if self.clip_vision_model == "auto":
100
- if isinstance(ip_adapter_info, IPAdapterInvokeAIConfig):
101
- image_encoder_model_id = ip_adapter_info.image_encoder_model_id
102
- image_encoder_model_name = image_encoder_model_id.split("/")[-1].strip()
103
- else:
104
- raise RuntimeError(
105
- "You need to set the appropriate CLIP Vision model for checkpoint IP Adapter models."
106
- )
99
+ if isinstance(ip_adapter_info, IPAdapterInvokeAIConfig):
100
+ image_encoder_model_id = ip_adapter_info.image_encoder_model_id
101
+ image_encoder_model_name = image_encoder_model_id.split("/")[-1].strip()
107
102
  else:
108
103
  image_encoder_model_name = CLIP_VISION_MODEL_MAP[self.clip_vision_model]
109
104
 
@@ -1254,7 +1254,7 @@ class IdealSizeInvocation(BaseInvocation):
1254
1254
  return tuple((x - x % multiple_of) for x in args)
1255
1255
 
1256
1256
  def invoke(self, context: InvocationContext) -> IdealSizeOutput:
1257
- unet_config = context.models.get_config(**self.unet.unet.model_dump())
1257
+ unet_config = context.models.get_config(self.unet.unet.key)
1258
1258
  aspect = self.width / self.height
1259
1259
  dimension: float = 512
1260
1260
  if unet_config.base == BaseModelType.StableDiffusion2:
@@ -80,6 +80,7 @@ class ModelManagerService(ModelManagerServiceBase):
80
80
  ram_cache = ModelCache(
81
81
  max_cache_size=app_config.ram,
82
82
  max_vram_cache_size=app_config.vram,
83
+ lazy_offloading=app_config.lazy_offload,
83
84
  logger=logger,
84
85
  execution_device=execution_device,
85
86
  )
@@ -2,7 +2,7 @@
2
2
  Initialization file for invokeai.backend.image_util methods.
3
3
  """
4
4
 
5
- from .patchmatch import PatchMatch # noqa: F401
5
+ from .infill_methods.patchmatch import PatchMatch # noqa: F401
6
6
  from .pngwriter import PngWriter, PromptFormatter, retrieve_metadata, write_metadata # noqa: F401
7
7
  from .seamless import configure_model_padding # noqa: F401
8
8
  from .util import InitImageResizer, make_grid # noqa: F401
@@ -7,6 +7,7 @@ from PIL import Image
7
7
 
8
8
  import invokeai.backend.util.logging as logger
9
9
  from invokeai.app.services.config.config_default import get_config
10
+ from invokeai.app.util.download_with_progress import download_with_progress_bar
10
11
  from invokeai.backend.util.devices import choose_torch_device
11
12
 
12
13
 
@@ -30,6 +31,14 @@ class LaMA:
30
31
  def __call__(self, input_image: Image.Image, *args: Any, **kwds: Any) -> Any:
31
32
  device = choose_torch_device()
32
33
  model_location = get_config().models_path / "core/misc/lama/lama.pt"
34
+
35
+ if not model_location.exists():
36
+ download_with_progress_bar(
37
+ name="LaMa Inpainting Model",
38
+ url="https://github.com/Sanster/models/releases/download/add_big_lama/big-lama.pt",
39
+ dest_path=model_location,
40
+ )
41
+
33
42
  model = load_jit_model(model_location, device)
34
43
 
35
44
  image = np.asarray(input_image.convert("RGB"))
@@ -0,0 +1,60 @@
1
+ from typing import Tuple
2
+
3
+ import numpy as np
4
+ from PIL import Image
5
+
6
+
7
+ def infill_mosaic(
8
+ image: Image.Image,
9
+ tile_shape: Tuple[int, int] = (64, 64),
10
+ min_color: Tuple[int, int, int, int] = (0, 0, 0, 0),
11
+ max_color: Tuple[int, int, int, int] = (255, 255, 255, 0),
12
+ ) -> Image.Image:
13
+ """
14
+ image:PIL - A PIL Image
15
+ tile_shape: Tuple[int,int] - Tile width & Tile Height
16
+ min_color: Tuple[int,int,int] - RGB values for the lowest color to clip to (0-255)
17
+ max_color: Tuple[int,int,int] - RGB values for the highest color to clip to (0-255)
18
+ """
19
+
20
+ np_image = np.array(image) # Convert image to np array
21
+ alpha = np_image[:, :, 3] # Get the mask from the alpha channel of the image
22
+ non_transparent_pixels = np_image[alpha != 0, :3] # List of non-transparent pixels
23
+
24
+ # Create color tiles to paste in the empty areas of the image
25
+ tile_width, tile_height = tile_shape
26
+
27
+ # Clip the range of colors in the image to a particular spectrum only
28
+ r_min, g_min, b_min, _ = min_color
29
+ r_max, g_max, b_max, _ = max_color
30
+ non_transparent_pixels[:, 0] = np.clip(non_transparent_pixels[:, 0], r_min, r_max)
31
+ non_transparent_pixels[:, 1] = np.clip(non_transparent_pixels[:, 1], g_min, g_max)
32
+ non_transparent_pixels[:, 2] = np.clip(non_transparent_pixels[:, 2], b_min, b_max)
33
+
34
+ tiles = []
35
+ for _ in range(256):
36
+ color = non_transparent_pixels[np.random.randint(len(non_transparent_pixels))]
37
+ tile = np.zeros((tile_height, tile_width, 3), dtype=np.uint8)
38
+ tile[:, :] = color
39
+ tiles.append(tile)
40
+
41
+ # Fill the transparent area with tiles
42
+ filled_image = np.zeros((image.height, image.width, 3), dtype=np.uint8)
43
+
44
+ for x in range(image.width):
45
+ for y in range(image.height):
46
+ tile = tiles[np.random.randint(len(tiles))]
47
+ try:
48
+ filled_image[
49
+ y - (y % tile_height) : y - (y % tile_height) + tile_height,
50
+ x - (x % tile_width) : x - (x % tile_width) + tile_width,
51
+ ] = tile
52
+ except ValueError:
53
+ # Need to handle edge cases - literally
54
+ pass
55
+
56
+ filled_image = Image.fromarray(filled_image) # Convert the filled tiles image to PIL
57
+ image = Image.composite(
58
+ image, filled_image, image.split()[-1]
59
+ ) # Composite the original image on top of the filled tiles
60
+ return image
@@ -0,0 +1,67 @@
1
+ """
2
+ This module defines a singleton object, "patchmatch" that
3
+ wraps the actual patchmatch object. It respects the global
4
+ "try_patchmatch" attribute, so that patchmatch loading can
5
+ be suppressed or deferred
6
+ """
7
+
8
+ import numpy as np
9
+ from PIL import Image
10
+
11
+ import invokeai.backend.util.logging as logger
12
+ from invokeai.app.services.config.config_default import get_config
13
+
14
+
15
+ class PatchMatch:
16
+ """
17
+ Thin class wrapper around the patchmatch function.
18
+ """
19
+
20
+ patch_match = None
21
+ tried_load: bool = False
22
+
23
+ def __init__(self):
24
+ super().__init__()
25
+
26
+ @classmethod
27
+ def _load_patch_match(cls):
28
+ if cls.tried_load:
29
+ return
30
+ if get_config().patchmatch:
31
+ from patchmatch import patch_match as pm
32
+
33
+ if pm.patchmatch_available:
34
+ logger.info("Patchmatch initialized")
35
+ cls.patch_match = pm
36
+ else:
37
+ logger.info("Patchmatch not loaded (nonfatal)")
38
+ else:
39
+ logger.info("Patchmatch loading disabled")
40
+ cls.tried_load = True
41
+
42
+ @classmethod
43
+ def patchmatch_available(cls) -> bool:
44
+ cls._load_patch_match()
45
+ if not cls.patch_match:
46
+ return False
47
+ return cls.patch_match.patchmatch_available
48
+
49
+ @classmethod
50
+ def inpaint(cls, image: Image.Image) -> Image.Image:
51
+ if cls.patch_match is None or not cls.patchmatch_available():
52
+ return image
53
+
54
+ np_image = np.array(image)
55
+ mask = 255 - np_image[:, :, 3]
56
+ infilled = cls.patch_match.inpaint(np_image[:, :, :3], mask, patch_size=3)
57
+ return Image.fromarray(infilled, mode="RGB")
58
+
59
+
60
+ def infill_patchmatch(image: Image.Image) -> Image.Image:
61
+ IS_PATCHMATCH_AVAILABLE = PatchMatch.patchmatch_available()
62
+
63
+ if not IS_PATCHMATCH_AVAILABLE:
64
+ logger.warning("PatchMatch is not available on this system")
65
+ return image
66
+
67
+ return PatchMatch.inpaint(image)
@@ -0,0 +1,122 @@
1
+ from dataclasses import dataclass
2
+ from typing import Optional
3
+
4
+ import numpy as np
5
+ from PIL import Image
6
+
7
+
8
+ def create_tile_pool(img_array: np.ndarray, tile_size: tuple[int, int]) -> list[np.ndarray]:
9
+ """
10
+ Create a pool of tiles from non-transparent areas of the image by systematically walking through the image.
11
+
12
+ Args:
13
+ img_array: numpy array of the image.
14
+ tile_size: tuple (tile_width, tile_height) specifying the size of each tile.
15
+
16
+ Returns:
17
+ A list of numpy arrays, each representing a tile.
18
+ """
19
+ tiles: list[np.ndarray] = []
20
+ rows, cols = img_array.shape[:2]
21
+ tile_width, tile_height = tile_size
22
+
23
+ for y in range(0, rows - tile_height + 1, tile_height):
24
+ for x in range(0, cols - tile_width + 1, tile_width):
25
+ tile = img_array[y : y + tile_height, x : x + tile_width]
26
+ # Check if the image has an alpha channel and the tile is completely opaque
27
+ if img_array.shape[2] == 4 and np.all(tile[:, :, 3] == 255):
28
+ tiles.append(tile)
29
+ elif img_array.shape[2] == 3: # If no alpha channel, append the tile
30
+ tiles.append(tile)
31
+
32
+ if not tiles:
33
+ raise ValueError(
34
+ "Not enough opaque pixels to generate any tiles. Use a smaller tile size or a different image."
35
+ )
36
+
37
+ return tiles
38
+
39
+
40
+ def create_filled_image(
41
+ img_array: np.ndarray, tile_pool: list[np.ndarray], tile_size: tuple[int, int], seed: int
42
+ ) -> np.ndarray:
43
+ """
44
+ Create an image of the same dimensions as the original, filled entirely with tiles from the pool.
45
+
46
+ Args:
47
+ img_array: numpy array of the original image.
48
+ tile_pool: A list of numpy arrays, each representing a tile.
49
+ tile_size: tuple (tile_width, tile_height) specifying the size of each tile.
50
+
51
+ Returns:
52
+ A numpy array representing the filled image.
53
+ """
54
+
55
+ rows, cols, _ = img_array.shape
56
+ tile_width, tile_height = tile_size
57
+
58
+ # Prep an empty RGB image
59
+ filled_img_array = np.zeros((rows, cols, 3), dtype=img_array.dtype)
60
+
61
+ # Make the random tile selection reproducible
62
+ rng = np.random.default_rng(seed)
63
+
64
+ for y in range(0, rows, tile_height):
65
+ for x in range(0, cols, tile_width):
66
+ # Pick a random tile from the pool
67
+ tile = tile_pool[rng.integers(len(tile_pool))]
68
+
69
+ # Calculate the space available (may be less than tile size near the edges)
70
+ space_y = min(tile_height, rows - y)
71
+ space_x = min(tile_width, cols - x)
72
+
73
+ # Crop the tile if necessary to fit into the available space
74
+ cropped_tile = tile[:space_y, :space_x, :3]
75
+
76
+ # Fill the available space with the (possibly cropped) tile
77
+ filled_img_array[y : y + space_y, x : x + space_x, :3] = cropped_tile
78
+
79
+ return filled_img_array
80
+
81
+
82
+ @dataclass
83
+ class InfillTileOutput:
84
+ infilled: Image.Image
85
+ tile_image: Optional[Image.Image] = None
86
+
87
+
88
+ def infill_tile(image_to_infill: Image.Image, seed: int, tile_size: int) -> InfillTileOutput:
89
+ """Infills an image with random tiles from the image itself.
90
+
91
+ If the image is not an RGBA image, it is returned untouched.
92
+
93
+ Args:
94
+ image: The image to infill.
95
+ tile_size: The size of the tiles to use for infilling.
96
+
97
+ Raises:
98
+ ValueError: If there are not enough opaque pixels to generate any tiles.
99
+ """
100
+
101
+ if image_to_infill.mode != "RGBA":
102
+ return InfillTileOutput(infilled=image_to_infill)
103
+
104
+ # Internally, we want a tuple of (tile_width, tile_height). In the future, the tile size can be any rectangle.
105
+ _tile_size = (tile_size, tile_size)
106
+ np_image = np.array(image_to_infill, dtype=np.uint8)
107
+
108
+ # Create the pool of tiles that we will use to infill
109
+ tile_pool = create_tile_pool(np_image, _tile_size)
110
+
111
+ # Create an image from the tiles, same size as the original
112
+ tile_np_image = create_filled_image(np_image, tile_pool, _tile_size, seed)
113
+
114
+ # Paste the OG image over the tile image, effectively infilling the area
115
+ tile_image = Image.fromarray(tile_np_image, "RGB")
116
+ infilled = tile_image.copy()
117
+ infilled.paste(image_to_infill, (0, 0), image_to_infill.split()[-1])
118
+
119
+ # I think we want this to be "RGBA"?
120
+ infilled.convert("RGBA")
121
+
122
+ return InfillTileOutput(infilled=infilled, tile_image=tile_image)
@@ -421,13 +421,20 @@ class ModelCache(ModelCacheBase[AnyModel]):
421
421
 
422
422
  self.logger.debug(f"After making room: cached_models={len(self._cached_models)}")
423
423
 
424
+ def _free_vram(self, device: torch.device) -> int:
425
+ vram_device = ( # mem_get_info() needs an indexed device
426
+ device if device.index is not None else torch.device(str(device), index=0)
427
+ )
428
+ free_mem, _ = torch.cuda.mem_get_info(vram_device)
429
+ for _, cache_entry in self._cached_models.items():
430
+ if cache_entry.loaded and not cache_entry.locked:
431
+ free_mem += cache_entry.size
432
+ return free_mem
433
+
424
434
  def _check_free_vram(self, target_device: torch.device, needed_size: int) -> None:
425
435
  if target_device.type != "cuda":
426
436
  return
427
- vram_device = ( # mem_get_info() needs an indexed device
428
- target_device if target_device.index is not None else torch.device(str(target_device), index=0)
429
- )
430
- free_mem, _ = torch.cuda.mem_get_info(torch.device(vram_device))
437
+ free_mem = self._free_vram(target_device)
431
438
  if needed_size > free_mem:
432
439
  needed_gb = round(needed_size / GIG, 2)
433
440
  free_gb = round(free_mem / GIG, 2)