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.
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/InvokeAI.egg-info/PKG-INFO +1 -1
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/InvokeAI.egg-info/SOURCES.txt +8 -6
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/PKG-INFO +1 -1
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/app_info.py +2 -2
- InvokeAI-4.0.3/invokeai/app/invocations/infill.py +167 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/ip_adapter.py +4 -9
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/latent.py +1 -1
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_manager/model_manager_default.py +1 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/__init__.py +1 -1
- {InvokeAI-4.0.2/invokeai/backend/image_util → InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods}/lama.py +9 -0
- InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods/mosaic.py +60 -0
- InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods/patchmatch.py +67 -0
- InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods/tile.py +122 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_cache/model_cache_default.py +11 -4
- InvokeAI-4.0.3/invokeai/frontend/web/dist/assets/App-BLcNMYZP.js +128 -0
- InvokeAI-4.0.3/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-DKJ1LbAm.js +1 -0
- 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
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/index.html +1 -1
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/de.json +18 -5
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/en.json +7 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/it.json +5 -3
- InvokeAI-4.0.3/invokeai/version/invokeai_version.py +1 -0
- InvokeAI-4.0.2/invokeai/app/invocations/infill.py +0 -248
- InvokeAI-4.0.2/invokeai/backend/image_util/patchmatch.py +0 -49
- InvokeAI-4.0.2/invokeai/frontend/web/dist/assets/App-De040c8N.js +0 -128
- InvokeAI-4.0.2/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-CduMu4GW.js +0 -1
- InvokeAI-4.0.2/invokeai/version/invokeai_version.py +0 -1
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/InvokeAI.egg-info/dependency_links.txt +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/InvokeAI.egg-info/entry_points.txt +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/InvokeAI.egg-info/requires.txt +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/InvokeAI.egg-info/top_level.txt +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/LICENSE +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/LICENSE-SD1+SD2.txt +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/LICENSE-SDXL.txt +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/README.md +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/dependencies.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/events.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/no_cache_staticfiles.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/board_images.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/boards.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/download_queue.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/images.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/model_manager.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/session_queue.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/utilities.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/routers/workflows.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api/sockets.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/api_app.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/assets/images/caution.png +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/baseinvocation.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/collections.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/compel.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/constants.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/controlnet_image_processors.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/custom_nodes/README.md +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/custom_nodes/init.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/cv.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/facetools.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/fields.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/image.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/math.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/metadata.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/model.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/noise.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/param_easing.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/primitives.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/prompt.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/sdxl.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/strings.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/t2i_adapter.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/tiles.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/upscale.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/invocations/util.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/run_app.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_image_records/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_image_records/board_image_records_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_image_records/board_image_records_sqlite.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_images/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_images/board_images_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_images/board_images_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_images/board_images_default.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_records/board_records_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_records/board_records_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/board_records/board_records_sqlite.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/boards/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/boards/boards_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/boards/boards_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/boards/boards_default.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/bulk_download/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/bulk_download/bulk_download_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/bulk_download/bulk_download_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/bulk_download/bulk_download_default.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/config/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/config/config_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/config/config_default.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/download/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/download/download_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/download/download_default.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/events/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/events/events_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/image_files/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/image_files/image_files_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/image_files/image_files_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/image_files/image_files_disk.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/image_records/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/image_records/image_records_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/image_records/image_records_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/image_records/image_records_sqlite.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/images/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/images/images_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/images/images_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/images/images_default.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_cache/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_cache/invocation_cache_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_cache/invocation_cache_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_cache/invocation_cache_memory.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_services.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_stats/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_stats/invocation_stats_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_stats/invocation_stats_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invocation_stats/invocation_stats_default.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/invoker.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/item_storage/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/item_storage/item_storage_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/item_storage/item_storage_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/item_storage/item_storage_memory.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_images/model_images_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_images/model_images_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_images/model_images_default.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_install/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_install/model_install_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_install/model_install_default.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_load/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_load/model_load_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_load/model_load_default.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_manager/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_manager/model_manager_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_manager/model_manager_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_records/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_records/model_records_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/model_records/model_records_sql.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/names/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/names/names_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/names/names_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/names/names_default.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/object_serializer/object_serializer_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/object_serializer/object_serializer_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/object_serializer/object_serializer_disk.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/object_serializer/object_serializer_forward_cache.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/session_processor/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/session_processor/session_processor_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/session_processor/session_processor_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/session_processor/session_processor_default.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/session_queue/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/session_queue/session_queue_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/session_queue/session_queue_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/session_queue/session_queue_sqlite.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/graph.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/invocation_context.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/pagination.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite/sqlite_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite/sqlite_database.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite/sqlite_util.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_1.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_2.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_3.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_4.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_5.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_6.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_7.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_8.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/migrations/migration_9.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/urls/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/urls/urls_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/urls/urls_default.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/ESRGAN Upscaling with Canny ControlNet.json +0 -0
- {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
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Multi ControlNet (Canny & Depth).json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Prompt from File.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Text to Image - SD1.5.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Text to Image - SDXL.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Text to Image with LoRA.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/default_workflows/Tiled Upscaling (Beta).json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/workflow_records_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/workflow_records_common.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/services/workflow_records/workflow_records_sqlite.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/shared/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/shared/models.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/controlnet_utils.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/download_with_progress.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/metaenum.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/misc.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/model_exclude_null.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/profiler.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/step_callback.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/suppress_output.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/thumbnails.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/app/util/ti_utils.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/assets/fonts/inter/Inter-Regular.ttf +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/basicsr/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/basicsr/arch_util.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/basicsr/rrdbnet_arch.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/canny.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/depth_anything/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/depth_anything/model/blocks.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/depth_anything/model/dpt.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/depth_anything/utilities/util.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/onnxdet.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/onnxpose.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/utils.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/dw_openpose/wholebody.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/hed.py +0 -0
- {InvokeAI-4.0.2/invokeai/backend/image_util → InvokeAI-4.0.3/invokeai/backend/image_util/infill_methods}/cv2_inpaint.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/invisible_watermark.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/lineart.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/lineart_anime.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/pngwriter.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/realesrgan/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/realesrgan/realesrgan.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/safety_checker.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/seamless.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/image_util/util.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/attention_processor.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/ip_adapter.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/ip_attention_weights.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/resampler.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/ip_adapter/unet_patcher.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/lora.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_hash/model_hash.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/config.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/convert_ckpt_to_diffusers.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/libc_util.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/convert_cache/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/convert_cache/convert_cache_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/convert_cache/convert_cache_default.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/load_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/load_default.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/memory_snapshot.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_cache/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_cache/model_cache_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_cache/model_locker.py +1 -1
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loader_registry.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/controlnet.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/generic_diffusers.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/ip_adapter.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/lora.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/onnx.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/stable_diffusion.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/textual_inversion.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_loaders/vae.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/model_util.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/load/optimizations.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/merge.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/fetch/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/fetch/fetch_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/fetch/huggingface.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/metadata/metadata_base.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/probe.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/search.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/starter_models.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/util/libc_util.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/util/model_util.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_manager/util/select_hf_files.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/model_patcher.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/onnx/onnx_runtime.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/raw_model.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusers_pipeline.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusion/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusion/conditioning_data.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusion/cross_attention_control.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/schedulers/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/schedulers/schedulers.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/stable_diffusion/seamless.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/textual_inversion.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/tiles/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/tiles/tiles.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/tiles/utils.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/attention.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/db_maintenance.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/devices.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/hotfixes.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/logging.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/mps_fixes.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/silence_warnings.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/test_utils.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/backend/util/util.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/controlnet/cldm_v15.yaml +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/controlnet/cldm_v21.yaml +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/sd_xl_base.yaml +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/sd_xl_refiner.yaml +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-finetune.yaml +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-finetune_style.yaml +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-inference-v.yaml +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-inference.yaml +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-inpainting-inference.yaml +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v1-m1-finetune.yaml +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-inference-v.yaml +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-inference.yaml +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-inpainting-inference-v.yaml +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-inpainting-inference.yaml +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/configs/stable-diffusion/v2-midas-inference.yaml +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/cli/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/cli/arg_parser.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/install/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/install/import_images.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/App-DI6oCUg0.css +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-Bsx7ESc2.css +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-avatar-circle.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-avatar-square.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-favicon.png +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-favicon.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-key-char-lrg.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-key-char-sml.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-key-wht-lrg.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-key-wht-sml.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-char-lrg.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-char-sml.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-wht-lrg.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-wht-sml.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-symbol-ylw-lrg.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-tag-char-lrg.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-tag-char-sml.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-tag-lrg.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-tag-sml.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-wordmark-charcoal.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/invoke-wordmark-white.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/images/mask.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-cyrillic-ext-wght-normal-DIEz8p5i.woff2 +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-cyrillic-wght-normal-BmJJXa8e.woff2 +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-greek-ext-wght-normal-D5AYLNiq.woff2 +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-greek-wght-normal-DyIDNIyN.woff2 +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-latin-ext-wght-normal-CN1pIXkb.woff2 +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-latin-wght-normal-BgVq2Tq4.woff2 +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/assets/inter-vietnamese-wght-normal-_GQuwPVU.woff2 +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ar.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/az.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/bg.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/es.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/fi.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/fr.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/he.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/hu.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ja.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ko.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/mn.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/nl.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/pl.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/pt.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/pt_BR.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ro.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/ru.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/sv.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/tr.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/uk.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/vi.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/zh_CN.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/dist/locales/zh_Hant.json +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/scripts/clean_translations.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/frontend/web/static/docs/invoke-favicon-docs.svg +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/invocation_api/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/invokeai/version/__init__.py +0 -0
- {InvokeAI-4.0.2 → InvokeAI-4.0.3}/pyproject.toml +0 -0
- {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.
|
|
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-
|
|
319
|
-
invokeai/frontend/web/dist/assets/index-
|
|
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.
|
|
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["
|
|
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
|
|
100
|
-
|
|
101
|
-
|
|
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(
|
|
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:
|
|
@@ -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
|
-
|
|
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)
|