From 47c528360d14c3ddd513dfaf509993ab7e7b0294 Mon Sep 17 00:00:00 2001 From: "zeyinzi.jzyz" Date: Fri, 19 Jan 2024 00:44:01 +0800 Subject: [PATCH] v0.0.2 --- .gitignore | 2 - .pre-commit-config.yaml | 25 + asset/images/flower.jpg | Bin 0 -> 901733 bytes asset/images/pose_source.png | Bin 0 -> 75721 bytes asset/images/sunflower.jpeg | Bin 0 -> 226882 bytes docs/en/scepter/utils/utils.md | 2 +- docs/zh_cn/scepter/utils/utils.md | 2 +- readme.md | 176 +- requirements.txt | 1 + requirements/framework.txt | 3 +- requirements/scepter_studio.txt | 2 + .../generation/stable_diffusion_1.5_512.yaml | 2 +- .../stable_diffusion_1.5_512_lora.yaml | 4 +- .../generation/stable_diffusion_2.1_768.yaml | 2 +- .../stable_diffusion_2.1_768_lora.yaml | 4 +- .../generation/stable_diffusion_xl_1024.yaml | 20 +- .../stable_diffusion_xl_1024_lora.yaml | 26 +- .../scedit/ctr/sd15_512_sce_ctr_hed.yaml | 265 + .../scedit/ctr/sd21_768_sce_ctr_canny.yaml | 264 + .../scedit/ctr/sd21_768_sce_ctr_pose.yaml | 264 + .../scedit/ctr/sdxl_1024_sce_ctr_color.yaml | 378 + .../ctr/sdxl_1024_sce_ctr_color_datatxt.yaml | 404 ++ .../scedit/ctr/sdxl_1024_sce_ctr_depth.yaml | 378 + .../methods/scedit/t2i/sd15_512_sce_t2i.yaml | 228 + .../t2i/sd15_512_sce_t2i_swift.yaml} | 6 +- .../methods/scedit/t2i/sd21_768_sce_t2i.yaml | 224 + .../t2i/sd21_768_sce_t2i_swift.yaml} | 6 +- .../methods/scedit/t2i/sdxl_1024_sce_t2i.yaml | 342 + .../scedit/t2i/sdxl_1024_sce_t2i_datatxt.yaml | 355 + .../t2i/sdxl_1024_sce_t2i_swift.yaml} | 45 +- .../controllers/official_controllers.yaml | 19 + .../extensions/mantra_book/mantra_book.yaml | 6409 +++++++++++++++++ .../extensions/tuners/official_tuners.yaml | 721 ++ scepter/methods/studio/home/home.yaml | 95 + .../methods/studio/inference/inference.yaml | 117 + .../studio/inference/sdxl/sdxl1.0_pro.yaml | 242 + .../inference/stable_diffusion/sd15_pro.yaml | 126 + .../inference/stable_diffusion/sd21_pro.yaml | 124 + .../methods/studio/preprocess/preprocess.yaml | 7 + scepter/methods/studio/scepter_ui.yaml | 85 + .../studio/self_train/sd_xl/sdxl_pro.yaml | 600 ++ .../methods/studio/self_train/self_train.yaml | 10 + .../self_train/stable_diffusion/sd15_pro.yaml | 312 + .../self_train/stable_diffusion/sd21_pro.yaml | 254 + scepter/modules/__init__.py | 3 +- scepter/modules/annotator/__init__.py | 8 + scepter/modules/annotator/base_annotator.py | 57 + scepter/modules/annotator/canny.py | 43 + scepter/modules/annotator/color.py | 44 + scepter/modules/annotator/hed.py | 154 + scepter/modules/annotator/midas/__init__.py | 0 scepter/modules/annotator/midas/api.py | 165 + scepter/modules/annotator/midas/base_model.py | 17 + scepter/modules/annotator/midas/blocks.py | 390 + scepter/modules/annotator/midas/dpt_depth.py | 106 + scepter/modules/annotator/midas/midas_net.py | 79 + .../annotator/midas/midas_net_custom.py | 166 + scepter/modules/annotator/midas/transforms.py | 230 + scepter/modules/annotator/midas/utils.py | 192 + scepter/modules/annotator/midas/vit.py | 509 ++ scepter/modules/annotator/midas_op.py | 78 + scepter/modules/annotator/mlsd/__init__.py | 0 .../modules/annotator/mlsd/mbv2_mlsd_large.py | 303 + .../modules/annotator/mlsd/mbv2_mlsd_tiny.py | 287 + scepter/modules/annotator/mlsd/utils.py | 638 ++ scepter/modules/annotator/mlsd_op.py | 73 + scepter/modules/annotator/openpose.py | 811 +++ scepter/modules/annotator/registry.py | 30 + scepter/modules/annotator/utils.py | 113 + scepter/modules/data/dataset/__init__.py | 3 +- scepter/modules/data/dataset/dataset.py | 7 +- scepter/modules/data/dataset/ms_dataset.py | 124 +- scepter/modules/data/dataset/utils.py | 25 + scepter/modules/inference/__init__.py | 2 + .../modules/inference/diffusion_inference.py | 848 +++ .../model/backbone/unet/unet_module.py | 189 +- scepter/modules/model/embedder/embedder.py | 15 +- scepter/modules/model/network/__init__.py | 2 +- .../model/network/diffusion/diffusion.py | 5 +- .../model/network/diffusion/solvers.py | 45 +- scepter/modules/model/network/ldm/__init__.py | 3 + scepter/modules/model/network/ldm/ldm.py | 37 +- scepter/modules/model/network/ldm/ldm_sce.py | 156 + scepter/modules/model/network/ldm/ldm_xl.py | 34 +- scepter/modules/model/tuner/__init__.py | 1 + scepter/modules/model/tuner/sce/__init__.py | 4 + scepter/modules/model/tuner/sce/scetuning.py | 178 + .../model/tuner/sce/scetuning_component.py | 72 + scepter/modules/model/tuner/swift_tuner.py | 1 + .../modules/model/tuner/tuner_component.py | 22 + scepter/modules/solver/base_solver.py | 2 +- scepter/modules/solver/diffusion_solver.py | 74 +- scepter/modules/solver/hooks/checkpoint.py | 83 +- scepter/modules/transform/__init__.py | 2 +- scepter/modules/transform/tensor.py | 70 +- scepter/modules/utils/config.py | 7 +- scepter/modules/utils/distribute.py | 4 +- .../modules/utils/file_clients/local_fs.py | 2 +- scepter/studio/__init__.py | 0 scepter/studio/home/__init__.py | 0 scepter/studio/home/home.py | 48 + scepter/studio/home/home_ui/__init__.py | 0 .../studio/home/home_ui/component_names.py | 19 + scepter/studio/home/home_ui/desc_ui.py | 22 + scepter/studio/home/home_ui/guide_ui.py | 22 + scepter/studio/inference/__init__.py | 0 scepter/studio/inference/inference.py | 177 + .../inference/inference_manager/__init__.py | 0 .../inference_manager/infer_runer.py | 188 + .../studio/inference/inference_ui/__init__.py | 0 .../inference/inference_ui/component_names.py | 214 + .../inference/inference_ui/control_ui.py | 156 + .../inference/inference_ui/diffusion_ui.py | 182 + .../inference/inference_ui/gallery_ui.py | 201 + .../inference/inference_ui/mantra_ui.py | 155 + .../inference/inference_ui/model_manage_ui.py | 199 + .../inference/inference_ui/refiner_ui.py | 90 + .../studio/inference/inference_ui/tuner_ui.py | 119 + scepter/studio/preprocess/__init__.py | 0 .../preprocess/caption_editor_ui/__init__.py | 0 .../caption_editor_ui/component_names.py | 125 + .../caption_editor_ui/create_dataset_ui.py | 605 ++ .../caption_editor_ui/dataset_gallery_ui.py | 288 + .../caption_editor_ui/export_dataset_ui.py | 139 + scepter/studio/preprocess/preprocess.py | 64 + scepter/studio/self_train/__init__.py | 0 scepter/studio/self_train/scripts/__init__.py | 0 scepter/studio/self_train/scripts/run_task.py | 165 + scepter/studio/self_train/self_train.py | 66 + .../self_train/self_train_ui/__init__.py | 0 .../self_train_ui/component_names.py | 140 + .../self_train/self_train_ui/inference_ui.py | 143 + .../self_train/self_train_ui/trainer_ui.py | 585 ++ scepter/studio/self_train/utils/__init__.py | 0 .../studio/self_train/utils/config_parser.py | 384 + scepter/studio/utils/__init__.py | 0 scepter/studio/utils/env.py | 16 + scepter/studio/utils/file.py | 18 + scepter/studio/utils/singleton.py | 7 + scepter/studio/utils/uibase.py | 19 + scepter/tools/run_inference.py | 111 +- scepter/tools/run_train.py | 23 + scepter/tools/webui.py | 123 + scepter/version.py | 2 +- setup.py | 7 +- tests/tools/test_annotators.py | 209 + tests/tools/test_inference.py | 206 +- tests/tools/test_train.py | 189 +- tests/utils/test_fs.py | 5 + 149 files changed, 24224 insertions(+), 271 deletions(-) create mode 100644 .pre-commit-config.yaml create mode 100644 asset/images/flower.jpg create mode 100644 asset/images/pose_source.png create mode 100644 asset/images/sunflower.jpeg create mode 100644 requirements/scepter_studio.txt create mode 100644 scepter/methods/scedit/ctr/sd15_512_sce_ctr_hed.yaml create mode 100644 scepter/methods/scedit/ctr/sd21_768_sce_ctr_canny.yaml create mode 100644 scepter/methods/scedit/ctr/sd21_768_sce_ctr_pose.yaml create mode 100644 scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_color.yaml create mode 100644 scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_color_datatxt.yaml create mode 100644 scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_depth.yaml create mode 100644 scepter/methods/scedit/t2i/sd15_512_sce_t2i.yaml rename scepter/methods/{SCEdit/t2i_sd15_512_sce.yaml => scedit/t2i/sd15_512_sce_t2i_swift.yaml} (98%) create mode 100644 scepter/methods/scedit/t2i/sd21_768_sce_t2i.yaml rename scepter/methods/{SCEdit/t2i_sd21_768_sce.yaml => scedit/t2i/sd21_768_sce_t2i_swift.yaml} (98%) create mode 100644 scepter/methods/scedit/t2i/sdxl_1024_sce_t2i.yaml create mode 100644 scepter/methods/scedit/t2i/sdxl_1024_sce_t2i_datatxt.yaml rename scepter/methods/{SCEdit/t2i_sdxl_1024_sce.yaml => scedit/t2i/sdxl_1024_sce_t2i_swift.yaml} (93%) create mode 100644 scepter/methods/studio/extensions/controllers/official_controllers.yaml create mode 100644 scepter/methods/studio/extensions/mantra_book/mantra_book.yaml create mode 100644 scepter/methods/studio/extensions/tuners/official_tuners.yaml create mode 100644 scepter/methods/studio/home/home.yaml create mode 100644 scepter/methods/studio/inference/inference.yaml create mode 100644 scepter/methods/studio/inference/sdxl/sdxl1.0_pro.yaml create mode 100644 scepter/methods/studio/inference/stable_diffusion/sd15_pro.yaml create mode 100644 scepter/methods/studio/inference/stable_diffusion/sd21_pro.yaml create mode 100644 scepter/methods/studio/preprocess/preprocess.yaml create mode 100644 scepter/methods/studio/scepter_ui.yaml create mode 100644 scepter/methods/studio/self_train/sd_xl/sdxl_pro.yaml create mode 100644 scepter/methods/studio/self_train/self_train.yaml create mode 100644 scepter/methods/studio/self_train/stable_diffusion/sd15_pro.yaml create mode 100644 scepter/methods/studio/self_train/stable_diffusion/sd21_pro.yaml create mode 100644 scepter/modules/annotator/__init__.py create mode 100644 scepter/modules/annotator/base_annotator.py create mode 100644 scepter/modules/annotator/canny.py create mode 100644 scepter/modules/annotator/color.py create mode 100644 scepter/modules/annotator/hed.py create mode 100644 scepter/modules/annotator/midas/__init__.py create mode 100644 scepter/modules/annotator/midas/api.py create mode 100644 scepter/modules/annotator/midas/base_model.py create mode 100644 scepter/modules/annotator/midas/blocks.py create mode 100644 scepter/modules/annotator/midas/dpt_depth.py create mode 100644 scepter/modules/annotator/midas/midas_net.py create mode 100644 scepter/modules/annotator/midas/midas_net_custom.py create mode 100644 scepter/modules/annotator/midas/transforms.py create mode 100644 scepter/modules/annotator/midas/utils.py create mode 100644 scepter/modules/annotator/midas/vit.py create mode 100644 scepter/modules/annotator/midas_op.py create mode 100644 scepter/modules/annotator/mlsd/__init__.py create mode 100644 scepter/modules/annotator/mlsd/mbv2_mlsd_large.py create mode 100644 scepter/modules/annotator/mlsd/mbv2_mlsd_tiny.py create mode 100644 scepter/modules/annotator/mlsd/utils.py create mode 100644 scepter/modules/annotator/mlsd_op.py create mode 100644 scepter/modules/annotator/openpose.py create mode 100644 scepter/modules/annotator/registry.py create mode 100644 scepter/modules/annotator/utils.py create mode 100644 scepter/modules/data/dataset/utils.py create mode 100644 scepter/modules/inference/__init__.py create mode 100644 scepter/modules/inference/diffusion_inference.py create mode 100644 scepter/modules/model/network/ldm/ldm_sce.py create mode 100644 scepter/modules/model/tuner/sce/__init__.py create mode 100644 scepter/modules/model/tuner/sce/scetuning.py create mode 100644 scepter/modules/model/tuner/sce/scetuning_component.py create mode 100644 scepter/studio/__init__.py create mode 100644 scepter/studio/home/__init__.py create mode 100644 scepter/studio/home/home.py create mode 100644 scepter/studio/home/home_ui/__init__.py create mode 100644 scepter/studio/home/home_ui/component_names.py create mode 100644 scepter/studio/home/home_ui/desc_ui.py create mode 100644 scepter/studio/home/home_ui/guide_ui.py create mode 100644 scepter/studio/inference/__init__.py create mode 100644 scepter/studio/inference/inference.py create mode 100644 scepter/studio/inference/inference_manager/__init__.py create mode 100644 scepter/studio/inference/inference_manager/infer_runer.py create mode 100644 scepter/studio/inference/inference_ui/__init__.py create mode 100644 scepter/studio/inference/inference_ui/component_names.py create mode 100644 scepter/studio/inference/inference_ui/control_ui.py create mode 100644 scepter/studio/inference/inference_ui/diffusion_ui.py create mode 100644 scepter/studio/inference/inference_ui/gallery_ui.py create mode 100644 scepter/studio/inference/inference_ui/mantra_ui.py create mode 100644 scepter/studio/inference/inference_ui/model_manage_ui.py create mode 100644 scepter/studio/inference/inference_ui/refiner_ui.py create mode 100644 scepter/studio/inference/inference_ui/tuner_ui.py create mode 100644 scepter/studio/preprocess/__init__.py create mode 100644 scepter/studio/preprocess/caption_editor_ui/__init__.py create mode 100644 scepter/studio/preprocess/caption_editor_ui/component_names.py create mode 100644 scepter/studio/preprocess/caption_editor_ui/create_dataset_ui.py create mode 100644 scepter/studio/preprocess/caption_editor_ui/dataset_gallery_ui.py create mode 100644 scepter/studio/preprocess/caption_editor_ui/export_dataset_ui.py create mode 100644 scepter/studio/preprocess/preprocess.py create mode 100644 scepter/studio/self_train/__init__.py create mode 100644 scepter/studio/self_train/scripts/__init__.py create mode 100644 scepter/studio/self_train/scripts/run_task.py create mode 100644 scepter/studio/self_train/self_train.py create mode 100644 scepter/studio/self_train/self_train_ui/__init__.py create mode 100644 scepter/studio/self_train/self_train_ui/component_names.py create mode 100644 scepter/studio/self_train/self_train_ui/inference_ui.py create mode 100644 scepter/studio/self_train/self_train_ui/trainer_ui.py create mode 100644 scepter/studio/self_train/utils/__init__.py create mode 100644 scepter/studio/self_train/utils/config_parser.py create mode 100644 scepter/studio/utils/__init__.py create mode 100644 scepter/studio/utils/env.py create mode 100644 scepter/studio/utils/file.py create mode 100644 scepter/studio/utils/singleton.py create mode 100644 scepter/studio/utils/uibase.py create mode 100644 scepter/tools/webui.py create mode 100644 tests/tools/test_annotators.py diff --git a/.gitignore b/.gitignore index 36bd124..e9d27c2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,14 +3,12 @@ *.pt *.pkl *.ckpt -*.png *.DS_Store *__pycache__* *.cache* *.bin *.idea *.csv -#*.txt build dist dev diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..065dd42 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,25 @@ + repos: + - repo: https://github.com/pycqa/flake8.git + rev: 4.0.0 + hooks: + - id: flake8 + args: ['--max-line-length=120', '--per-file-ignores=__init__.py:F401'] + - repo: https://github.com/PyCQA/isort.git + rev: 4.3.21 + hooks: + - id: isort + - repo: https://github.com/pre-commit/mirrors-yapf.git + rev: v0.30.0 + hooks: + - id: yapf + - repo: https://github.com/pre-commit/pre-commit-hooks.git + rev: v3.1.0 + hooks: + - id: trailing-whitespace + - id: check-yaml + - id: end-of-file-fixer + - id: requirements-txt-fixer + - id: double-quote-string-fixer + - id: check-merge-conflict + - id: fix-encoding-pragma + - id: mixed-line-ending diff --git a/asset/images/flower.jpg b/asset/images/flower.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bc8d1e5da69d2cd276762d621ca9ff445fafe47f GIT binary patch literal 901733 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⪙}K4e%)J0!93u+Z~IWKUJetBE7P-^ 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
    mJ_K_RfI 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%0Dygeon8*qGckT%~GXaE7sGDpC2F!mJS( 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%0D!^2H;I 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 CSh)QF literal 0 HcmV?d00001 diff --git a/docs/en/scepter/utils/utils.md b/docs/en/scepter/utils/utils.md index 96e0cec..ef99523 100644 --- a/docs/en/scepter/utils/utils.md +++ b/docs/en/scepter/utils/utils.md @@ -356,7 +356,7 @@ Used to instantiate a standard logging instance for printing information. ```python from scepter.utils.logger import get_logger, init_logger -std_logger = get_logger(name="std_torch") +std_logger = get_logger(name="scepter") init_logger(std_logger, log_file="", dist_launcher="pytorch") ```


    diff --git a/docs/zh_cn/scepter/utils/utils.md b/docs/zh_cn/scepter/utils/utils.md index 1efa161..be8917a 100644 --- a/docs/zh_cn/scepter/utils/utils.md +++ b/docs/zh_cn/scepter/utils/utils.md @@ -358,7 +358,7 @@ input_type 一一对应。 ```python from scepter.utils.logger import get_logger, init_logger -std_logger = get_logger(name="std_torch") +std_logger = get_logger(name="scepter") init_logger(std_logger, log_file="", dist_launcher="pytorch") ```
    diff --git a/readme.md b/readme.md index afbd005..375a2be 100644 --- a/readme.md +++ b/readme.md @@ -3,14 +3,18 @@

    + +

    ## 📖 Table of Contents - [Introduction](#-introduction) - [News](#-news) -- [Installation](#-installation) +- [Installation](#-Installation) - [Getting Started](#-getting-started) +- [SCEPTER Studio](#-scepter-studio) +- [Features](#-features) - [Learn More](#-learn-more) - [License](#license) @@ -20,14 +24,17 @@ SCEPTER is an open-source code repository dedicated to generative training, fine Main Feature: -- Training: - - distribute: DDP / FSDP / FairScale -- Inference - - text-to-image generation - - controllable image synthesis (TODO) -- Deploy-Gradio (TODO) - - fine-tuning - - inference +- Task: + - Text-to-image generation + - Controllable image synthesis + - Image editing (TODO) +- Training / Inference: + - Distribute: DDP / FSDP / FairScale / Xformers + - File system: Local / Http / OSS / Modelscope +- Deploy: + - Data management + - Training + - Inference Currently supported approches (and counting): @@ -36,6 +43,8 @@ Currently supported approches (and counting): 3. Res-Tuning(TODO): [Res-Tuning: A Flexible and Efficient Tuning Paradigm via Unbinding Tuner from Backbone](https://arxiv.org/abs/2310.19859) [![Arxiv link](https://img.shields.io/static/v1?label=arXiv&message=ResTuning&color=red&logo=arxiv)](https://arxiv.org/abs/2310.19859) [![Page link](https://img.shields.io/badge/Page-ResTuning-Gree)](https://res-tuning.github.io/) ## 🎉 News +- [2024.01]: We release **SCEPTER Studio**, an integrated toolkit for data management, model training and inference based on [Gradio](https://www.gradio.app/). +- [2024.01]: [SCEdit](https://arxiv.org/abs/2312.11392) support controllable image synthesis for training and inference. - [2023.12]: We propose [SCEdit](https://arxiv.org/abs/2312.11392), an efficient and controllable generation framework. - [2023.12]: We release [🪄SCEPTER](https://github.com/modelscope/scepter/) library. @@ -51,14 +60,15 @@ conda activate scepter - Install SCEPTER by the `pip` command: ```shell -pip install -e . +pip install scepter ``` +- PS: We recommend installing PyTorch follwing [official documentation](https://pytorch.org/get-started/locally/) ## 🚀 Getting Started ### Dataset -#### Text-to-Image generation +#### Modelscope Format We use a [custom-stylized dataset](https://modelscope.cn/datasets/damo/style_custom_dataset/summary), which included classes 3D, anime, flat illustration, oil painting, sketch, and watercolor, each with 30 image-text pairs. @@ -69,54 +79,148 @@ ms_train_dataset = MsDataset.load('style_custom_dataset', namespace='damo', subs print(next(iter(ms_train_dataset))) ``` +#### CSV Format + +For the data format used by SCEPTER Studio, please refer to [3D_example_csv.zip](https://modelscope.cn/api/v1/models/damo/scepter/repo?Revision=master&FilePath=datasets/3D_example_csv.zip). + +#### TXT Format + +To facilitate starting training in command-line mode, you can use a dataset in text format, please refer to [3D_example_txt.zip](https://modelscope.cn/api/v1/models/damo/scepter/repo?Revision=master&FilePath=datasets/3D_example_txt.zip) + +```shell +mkdir -p cache/dataset/ && wget 'https://modelscope.cn/api/v1/models/damo/scepter_scedit/repo?Revision=master&FilePath=dataset/3D_example_txt.zip' -O cache/dataset/3D_example_txt.zip && unzip cache/dataset/3D_example_txt.zip -d cache/dataset/ && rm cache/dataset/3D_example_txt.zip +``` + ### Training -#### Text-to-Image generation +We provide a framework for training and inference, so the script below is just for illustration purposes. To achieve better results, you can modify the corresponding parameters as needed. + +#### Text-to-Image Generation + +- SCEdit +```python +python scepter/tools/run_train.py --cfg scepter/methods/scedit/t2i/sd15_512_sce_t2i.yaml # SD v1.5 +python scepter/tools/run_train.py --cfg scepter/methods/scedit/t2i/sd21_768_sce_t2i.yaml # SD v2.1 +python scepter/tools/run_train.py --cfg scepter/methods/scedit/t2i/sdxl_1024_sce_t2i.yaml # SD XL +``` + +- Existing Tuning Strategies +```python +python scepter/tools/run_train.py --cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml # fully-tuning on SD v1.5 +python scepter/tools/run_train.py --cfg scepter/methods/examples/generation/stable_diffusion_2.1_768_lora.yaml # lora-tuning on SD v2.1 +``` + +- Data Text Format +```python +# Download the 3D_example_txt.zip as previously mentioned +python scepter/tools/run_train.py --cfg scepter/methods/scedit/t2i/sdxl_1024_sce_t2i_datatxt.yaml +``` + +#### Controllable Image Synthesis - SCEdit +The YAML configuration can be modified to combine different base models and conditions. The following is provided as an example. ```python -# SD v1.5 -python scepter/tools/run_train.py --cfg scepter/methods/SCEdit/t2i_sd15_512_sce.yaml -# SD v2.1 -python scepter/tools/run_train.py --cfg scepter/methods/SCEdit/t2i_sd21_768_sce.yaml -# SD XL -python scepter/tools/run_train.py --cfg scepter/methods/SCEdit/t2i_sdxl_1024_sce.yaml +python scepter/tools/run_train.py --cfg scepter/methods/scedit/ctr/sd15_512_sce_ctr_hed.yaml # SD v1.5 + hed +python scepter/tools/run_train.py --cfg scepter/methods/scedit/ctr/sd21_768_sce_ctr_canny.yaml # SD v2.1 + canny +python scepter/tools/run_train.py --cfg scepter/methods/scedit/ctr/sd21_768_sce_ctr_pose.yaml # SD v2.1 + pose +python scepter/tools/run_train.py --cfg scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_depth.yaml # SD XL + depth +python scepter/tools/run_train.py --cfg scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_color.yaml # SD XL + color ``` -- Existing strategies +- Data Text Format ```python -# fully-tuning on SD v1.5 -python scepter/tools/run_train.py --cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml -# lora-tuning on SD v2.1 -python scepter/tools/run_train.py --cfg scepter/methods/examples/generation/stable_diffusion_2.1_768_lora.yaml +# Download the 3D_example_txt.zip as previously mentioned +python scepter/tools/run_train.py --cfg scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_color_datatxt.yaml ``` -#### Controllable Image Synthesis - -TODO ### Inference +#### Base Model Inference + ```python -# generation on SD v1.5 -python scepter/tools/run_inference.py --cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml --prompt 'a cute dog' --save_folder 'inference' -# generation on SD v2.1 -python scepter/tools/run_inference.py --cfg scepter/methods/examples/generation/stable_diffusion_2.1_768.yaml --prompt 'a cute dog' --save_folder 'inference' -# generation on SD XL -python scepter/tools/run_inference.py --cfg scepter/methods/examples/generation/stable_diffusion_xl_1024.yaml --prompt 'a cute dog' --save_folder 'inference' +python scepter/tools/run_inference.py --cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml --prompt 'a cute dog' --save_folder 'inference' # generation on SD v1.5 +python scepter/tools/run_inference.py --cfg scepter/methods/examples/generation/stable_diffusion_2.1_768.yaml --prompt 'a cute dog' --save_folder 'inference' # generation on SD v2.1 +python scepter/tools/run_inference.py --cfg scepter/methods/examples/generation/stable_diffusion_xl_1024.yaml --prompt 'a cute dog' --save_folder 'inference' # generation on SD XL +``` + +#### Fine-tuned Model Inference + +```python +python scepter/tools/run_inference.py --cfg scepter/methods/scedit/t2i/sd15_512_sce_t2i_swift.yaml --pretrained_model 'cache/save_data/sd15_512_sce_t2i_swift/checkpoints/ldm_step-100.pth' --prompt 'A close up of a small rabbit wearing a hat and scarf' --save_folder 'trained_test_prompt_rabbit' +``` + +#### Controllable Image Synthesis Inference + +- SCEdit +```python +python scepter/tools/run_inference.py --cfg scepter/methods/scedit/ctr/sd21_768_sce_ctr_canny.yaml --num_samples 1 --prompt 'a single flower is shown in front of a tree' --save_folder 'test_flower_canny' --image_size 768 --task control --image 'asset/images/flower.jpg' --control_mode canny --pretrained_model ms://damo/scepter_scedit@controllable_model/SD2.1/canny_control/0_SwiftSCETuning/pytorch_model.bin # canny +python scepter/tools/run_inference.py --cfg scepter/methods/scedit/ctr/sd21_768_sce_ctr_pose.yaml --num_samples 1 --prompt 'super mario' --save_folder 'test_mario_pose' --image_size 768 --task control --image 'asset/images/pose_source.png' --control_mode source --pretrained_model ms://damo/scepter_scedit@controllable_model/SD2.1/pose_control/0_SwiftSCETuning/pytorch_model.bin # pose ``` +## 🖥️ SCEPTER Studio + +### Launch + +To fully experience **SCEPTER Studio**, you can launch the following command line: + +```shell +PYTHONPATH=. python scepter/tools/webui.py --cfg scepter/methods/studio/scepter_ui.yaml +``` + +### Modelscope Studio + +We deploy a work studio on Modelscope that includes only the inference tab, please refer to [ms_scepter_studio](https://www.modelscope.cn/studios/damo/scepter_studio/summary) + +## ✨ Features + +### Text-to-Image Generation + +| **Model** | **SCEdit** | **Full** | **LoRA** | +|:---------:|:----------:|:--------:|:--------:| +| SD 1.5 | 🪄 | ✅ | ✅ | +| SD 2.1 | 🪄 | ✅ | ✅ | +| SD XL | 🪄 | ✅ | ✅ | + +### Controllable Image Synthesis +- SCEdit + +| **Model** | **Canny** | **HED** | **Depth** | **Pose** | **Color** | +|:---------:|:---------:|:-------:|:---------:|:--------:|:---------:| +| SD 1.5 | ✅ | ✅ | ✅ | ✅ | ✅ | +| SD 2.1 | 🪄 | ✅ | ✅ | 🪄 | 🪄 | +| SD XL | ✅ | ✅ | ✅ | ✅ | ✅ | + +### Model URL + +- ✅ indicates support for both training and inference. +- 🪄 denotes that the model has been published. +- More models will be released in the future. + +| Model | URL | +|--------|-------------------------------------------------------------------------------------| +| SCEdit | [ModelCard](https://modelscope.cn/models/damo/scepter_scedit/summary) | + +PS: Scripts running within the SCEPTER framework will automatically fetch and load models based on the required dependency files, eliminating the need for manual downloads. + + ## 🔍 Learn More -- [ModelScope library](https://github.com/modelscope/modelscope/) - - ModelScope Library is the model library of ModelScope project, which contains a large number of popular models. - - [Alibaba TongYi Vision Intelligence Lab](https://github.com/damo-vilab) Discover more about open-source projects on image generation, video generation, and editing tasks. +- [ModelScope library](https://github.com/modelscope/modelscope/) + + ModelScope Library is the model library of ModelScope project, which contains a large number of popular models. + +- [SWIFT library](https://github.com/modelscope/swift/) + + SWIFT (Scalable lightWeight Infrastructure for Fine-Tuning) is an extensible framwork designed to faciliate lightweight model fine-tuning and inference. + + ## License This project is licensed under the [Apache License (Version 2.0)](https://github.com/modelscope/modelscope/blob/master/LICENSE). diff --git a/requirements.txt b/requirements.txt index 0832e6a..f3e0809 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ -r requirements/framework.txt +-r requirements/scepter_studio.txt diff --git a/requirements/framework.txt b/requirements/framework.txt index d595846..3e7a72e 100644 --- a/requirements/framework.txt +++ b/requirements/framework.txt @@ -1,12 +1,11 @@ einops modelscope -ms_swift==1.5.2 +ms-swift>=1.5.2 numpy open_clip_torch opencv-python opencv_transforms>=0.0.6 oss2>=2.15.0 pyyaml>=5.3.1 -torchvision==0.15.2 transformers xformers>=0.0.21 diff --git a/requirements/scepter_studio.txt b/requirements/scepter_studio.txt new file mode 100644 index 0000000..e083847 --- /dev/null +++ b/requirements/scepter_studio.txt @@ -0,0 +1,2 @@ +gradio==3.50.2 +imagehash diff --git a/scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml b/scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml index 0d70b10..7918211 100644 --- a/scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml +++ b/scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml @@ -15,7 +15,7 @@ SOLVER: ACCU_STEP: 1 EVAL_INTERVAL: 100 # - WORK_DIR: ./cache/sd15_512_full + WORK_DIR: ./cache/save_data/sd15_512_full LOG_FILE: std_log.txt # FILE_SYSTEM: diff --git a/scepter/methods/examples/generation/stable_diffusion_1.5_512_lora.yaml b/scepter/methods/examples/generation/stable_diffusion_1.5_512_lora.yaml index 57b23f8..4df6747 100644 --- a/scepter/methods/examples/generation/stable_diffusion_1.5_512_lora.yaml +++ b/scepter/methods/examples/generation/stable_diffusion_1.5_512_lora.yaml @@ -15,13 +15,13 @@ SOLVER: ACCU_STEP: 1 EVAL_INTERVAL: 100 # - WORK_DIR: ./cache/sd15_512_lora + WORK_DIR: ./cache/save_data/sd15_512_lora LOG_FILE: std_log.txt # FILE_SYSTEM: NAME: "ModelscopeFs" TEMP_DIR: "./cache/data" - TUNER: + TUNER: - NAME: SwiftLoRA R: 64 diff --git a/scepter/methods/examples/generation/stable_diffusion_2.1_768.yaml b/scepter/methods/examples/generation/stable_diffusion_2.1_768.yaml index ad0fc9f..0d9a1cf 100644 --- a/scepter/methods/examples/generation/stable_diffusion_2.1_768.yaml +++ b/scepter/methods/examples/generation/stable_diffusion_2.1_768.yaml @@ -15,7 +15,7 @@ SOLVER: ACCU_STEP: 1 EVAL_INTERVAL: 100 # - WORK_DIR: ./cache/sd21_768_full + WORK_DIR: ./cache/save_data/sd21_768_full LOG_FILE: std_log.txt # FILE_SYSTEM: diff --git a/scepter/methods/examples/generation/stable_diffusion_2.1_768_lora.yaml b/scepter/methods/examples/generation/stable_diffusion_2.1_768_lora.yaml index 4dd1cb5..90becb2 100644 --- a/scepter/methods/examples/generation/stable_diffusion_2.1_768_lora.yaml +++ b/scepter/methods/examples/generation/stable_diffusion_2.1_768_lora.yaml @@ -15,14 +15,14 @@ SOLVER: ACCU_STEP: 1 EVAL_INTERVAL: 100 # - WORK_DIR: ./cache/sd21_768_lora + WORK_DIR: ./cache/save_data/sd21_768_lora LOG_FILE: std_log.txt # FILE_SYSTEM: NAME: "ModelscopeFs" TEMP_DIR: "./cache/data" # - TUNER: + TUNER: - NAME: SwiftLoRA R: 64 diff --git a/scepter/methods/examples/generation/stable_diffusion_xl_1024.yaml b/scepter/methods/examples/generation/stable_diffusion_xl_1024.yaml index 6ac3f4d..48b4566 100644 --- a/scepter/methods/examples/generation/stable_diffusion_xl_1024.yaml +++ b/scepter/methods/examples/generation/stable_diffusion_xl_1024.yaml @@ -15,7 +15,7 @@ SOLVER: ACCU_STEP: 1 EVAL_INTERVAL: 100 # - WORK_DIR: ./cache/sdxl_1024_full + WORK_DIR: ./cache/save_data/sdxl_1024_full LOG_FILE: std_log.txt # FILE_SYSTEM: @@ -120,7 +120,7 @@ SOLVER: UCG_RATE: 0.0 INPUT_KEYS: [ "prompt" ] LEGACY_UCG_VALUE: - - + - NAME: FrozenOpenCLIPEmbedder2 ARCH: ViT-bigG-14 PRETRAINED_MODEL: @@ -133,21 +133,21 @@ SOLVER: UCG_RATE: 0.0 INPUT_KEYS: [ "prompt" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False UCG_RATE: 0.0 INPUT_KEYS: [ "original_size_as_tuple" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False UCG_RATE: 0.0 INPUT_KEYS: [ "crop_coords_top_left" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False @@ -200,21 +200,21 @@ SOLVER: UCG_RATE: 0.0 INPUT_KEYS: [ "prompt" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False UCG_RATE: 0.0 INPUT_KEYS: [ "original_size_as_tuple" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False UCG_RATE: 0.0 INPUT_KEYS: [ "crop_coords_top_left" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False @@ -287,8 +287,8 @@ SOLVER: KEYS: [ 'img', 'prompt', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left' ] META_KEYS: [ 'data_key', 'img_path' ] - NAME: Rename - IN_KEYS: [ 'img', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left' ] - OUT_KEYS: [ 'image', 'original_size_as_tuple', 'target_size_as_tuple', 'crop_coords_top_left' ] + INPUT_KEY: [ 'img', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left' ] + OUTPUT_KEY: [ 'image', 'original_size_as_tuple', 'target_size_as_tuple', 'crop_coords_top_left' ] # EVAL_DATA: NAME: ImageTextPairMSDataset diff --git a/scepter/methods/examples/generation/stable_diffusion_xl_1024_lora.yaml b/scepter/methods/examples/generation/stable_diffusion_xl_1024_lora.yaml index 2f1d315..5f6522e 100644 --- a/scepter/methods/examples/generation/stable_diffusion_xl_1024_lora.yaml +++ b/scepter/methods/examples/generation/stable_diffusion_xl_1024_lora.yaml @@ -15,14 +15,14 @@ SOLVER: ACCU_STEP: 1 EVAL_INTERVAL: 100 # - WORK_DIR: ./cache/sdxl_1024_lora + WORK_DIR: ./cache/save_data/sdxl_1024_lora LOG_FILE: std_log.txt # FILE_SYSTEM: NAME: "ModelscopeFs" TEMP_DIR: "./cache/data" - # - TUNER: + # + TUNER: - NAME: SwiftLoRA R: 64 @@ -129,7 +129,7 @@ SOLVER: UCG_RATE: 0.0 INPUT_KEYS: [ "prompt" ] LEGACY_UCG_VALUE: - - + - NAME: FrozenOpenCLIPEmbedder2 ARCH: ViT-bigG-14 PRETRAINED_MODEL: @@ -142,21 +142,21 @@ SOLVER: UCG_RATE: 0.0 INPUT_KEYS: [ "prompt" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False UCG_RATE: 0.0 INPUT_KEYS: [ "original_size_as_tuple" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False UCG_RATE: 0.0 INPUT_KEYS: [ "crop_coords_top_left" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False @@ -209,21 +209,21 @@ SOLVER: UCG_RATE: 0.0 INPUT_KEYS: [ "prompt" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False UCG_RATE: 0.0 INPUT_KEYS: [ "original_size_as_tuple" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False UCG_RATE: 0.0 INPUT_KEYS: [ "crop_coords_top_left" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False @@ -296,8 +296,8 @@ SOLVER: KEYS: [ 'img', 'prompt', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left' ] META_KEYS: [ 'data_key', 'img_path' ] - NAME: Rename - IN_KEYS: [ 'img', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left' ] - OUT_KEYS: [ 'image', 'original_size_as_tuple', 'target_size_as_tuple', 'crop_coords_top_left' ] + INPUT_KEY: [ 'img', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left' ] + OUTPUT_KEY: [ 'image', 'original_size_as_tuple', 'target_size_as_tuple', 'crop_coords_top_left' ] # EVAL_DATA: NAME: ImageTextPairMSDataset @@ -334,4 +334,4 @@ SOLVER: # EVAL_HOOKS: - NAME: ProbeDataHook - PROB_INTERVAL: 100 \ No newline at end of file + PROB_INTERVAL: 100 diff --git a/scepter/methods/scedit/ctr/sd15_512_sce_ctr_hed.yaml b/scepter/methods/scedit/ctr/sd15_512_sce_ctr_hed.yaml new file mode 100644 index 0000000..ddb9a86 --- /dev/null +++ b/scepter/methods/scedit/ctr/sd15_512_sce_ctr_hed.yaml @@ -0,0 +1,265 @@ +ENV: + BACKEND: nccl +SOLVER: + NAME: LatentDiffusionSolver + RESUME_FROM: + LOAD_MODEL_ONLY: True + USE_FSDP: False + SHARDING_STRATEGY: + USE_AMP: True + DTYPE: float16 + CHANNELS_LAST: True + MAX_STEPS: 200 + MAX_EPOCHS: -1 + NUM_FOLDS: 1 + ACCU_STEP: 1 + EVAL_INTERVAL: 100 + # + WORK_DIR: ./cache/save_data/sd15_512_sce_ctr_hed + LOG_FILE: std_log.txt + # + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + FREEZE: + FREEZE_PART: [ "first_stage_model", "cond_stage_model", "model" ] + TRAIN_PART: [ "control_blocks" ] + # + MODEL: + NAME: LatentDiffusionSCEControl + PARAMETERIZATION: eps + TIMESTEPS: 1000 + MIN_SNR_GAMMA: + ZERO_TERMINAL_SNR: False + PRETRAINED_MODEL: ms://AI-ModelScope/stable-diffusion-v1-5@v1-5-pruned-emaonly.safetensors + IGNORE_KEYS: [ ] + SCALE_FACTOR: 0.18215 + SIZE_FACTOR: 8 + DEFAULT_N_PROMPT: + SCHEDULE_ARGS: + "NAME": "scaled_linear" + "BETA_MIN": 0.00085 + "BETA_MAX": 0.012 + USE_EMA: False + # + DIFFUSION_MODEL: + NAME: DiffusionUNet + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + MODEL_CHANNELS: 320 + NUM_HEADS: 8 + NUM_RES_BLOCKS: 2 + ATTENTION_RESOLUTIONS: [ 4, 2, 1 ] + CHANNEL_MULT: [ 1, 2, 4, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + USE_CHECKPOINT: False + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: 1 + CONTEXT_DIM: 768 + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: False + PRETRAINED_MODEL: + IGNORE_KEYS: [] + # + FIRST_STAGE_MODEL: + NAME: AutoencoderKL + EMBED_DIM: 4 + PRETRAINED_MODEL: + IGNORE_KEYS: [] + BATCH_SIZE: 4 + # + ENCODER: + NAME: Encoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DOUBLE_Z: True + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + # + DECODER: + NAME: Decoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + GIVE_PRE_END: False + TANH_OUT: False + # + TOKENIZER: + NAME: ClipTokenizer + PRETRAINED_PATH: ms://AI-ModelScope/clip-vit-large-patch14 + LENGTH: 77 + CLEAN: True + # + COND_STAGE_MODEL: + NAME: FrozenCLIPEmbedder + FREEZE: True + LAYER: last + PRETRAINED_MODEL: ms://AI-ModelScope/clip-vit-large-patch14 + # + LOSS: + NAME: ReconstructLoss + LOSS_TYPE: l2 + # + CONTROL_MODEL: + NAME: CSCTuners + PRE_HINT_IN_CHANNELS: 3 + PRE_HINT_OUT_CHANNELS: 256 + DENSE_HINT_KERNAL: 3 + SCALE: 1.0 + SC_TUNER_CFG: + NAME: SCTuner + TUNER_NAME: SCEAdapter + DOWN_RATIO: 1.0 + CONTROL_ANNO: + NAME: HedAnnotator + PRETRAINED_MODEL: ms://damo/scepter_scedit@annotator/ckpts/ControlNetHED.pth + # + SAMPLE_ARGS: + SAMPLER: ddim + SAMPLE_STEPS: 50 + SEED: 2023 + GUIDE_SCALE: 7.5 + GUIDE_RESCALE: 0.5 + DISCRETIZATION: trailing + IMAGE_SIZE: [512, 512] + RUN_TRAIN_N: False + # + OPTIMIZER: + NAME: AdamW + LEARNING_RATE: 0.064 + BETAS: [ 0.9, 0.999 ] + EPS: 1e-8 + WEIGHT_DECAY: 1e-2 + AMSGRAD: False + # + TRAIN_DATA: + NAME: ImageTextPairMSDataset + MODE: train + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_DATASET_SPLIT: train_short + MS_REMAP_KEYS: { 'Image:FILE': 'Target:FILE' } + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 1 + NUM_WORKERS: 4 + SAMPLER: + NAME: LoopSampler + TRANSFORMS: + - NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - NAME: Resize + SIZE: 768 + INTERPOLATION: bilinear + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: CenterCrop + SIZE: 768 + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: ToNumpy + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'image_preprocess' ] + - NAME: ImageToTensor + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: torchvision + - NAME: Rename + INPUT_KEY: [ 'img', 'image_preprocess' ] + OUTPUT_KEY: [ 'image', 'image_preprocess' ] + - NAME: Select + KEYS: [ 'image', 'prompt', 'image_preprocess' ] + META_KEYS: [ 'data_key' ] + # + EVAL_DATA: + NAME: ImageTextPairMSDataset + MODE: eval + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_DATASET_SPLIT: train_short + MS_REMAP_KEYS: { 'Image:FILE': 'Target:FILE' } + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 10 + NUM_WORKERS: 4 + TRANSFORMS: + - NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - NAME: Resize + SIZE: 768 + INTERPOLATION: bilinear + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: CenterCrop + SIZE: 768 + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: ToNumpy + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'image_preprocess' ] + - NAME: ImageToTensor + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: torchvision + - NAME: Rename + INPUT_KEY: [ 'img', 'image_preprocess' ] + OUTPUT_KEY: [ 'image', 'image_preprocess' ] + - NAME: Select + KEYS: [ 'image', 'prompt', 'image_preprocess' ] + META_KEYS: [ 'data_key' ] + # + TRAIN_HOOKS: + - + NAME: BackwardHook + PRIORITY: 0 + - + NAME: LogHook + LOG_INTERVAL: 50 + - + NAME: CheckpointHook + INTERVAL: 100 + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 + # + EVAL_HOOKS: + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 diff --git a/scepter/methods/scedit/ctr/sd21_768_sce_ctr_canny.yaml b/scepter/methods/scedit/ctr/sd21_768_sce_ctr_canny.yaml new file mode 100644 index 0000000..a40cb3e --- /dev/null +++ b/scepter/methods/scedit/ctr/sd21_768_sce_ctr_canny.yaml @@ -0,0 +1,264 @@ +ENV: + BACKEND: nccl +SOLVER: + NAME: LatentDiffusionSolver + RESUME_FROM: + LOAD_MODEL_ONLY: True + USE_FSDP: False + SHARDING_STRATEGY: + USE_AMP: True + DTYPE: float16 + CHANNELS_LAST: True + MAX_STEPS: 200 + MAX_EPOCHS: -1 + NUM_FOLDS: 1 + ACCU_STEP: 1 + EVAL_INTERVAL: 100 + # + WORK_DIR: ./cache/save_data/sd21_768_sce_ctr_canny + LOG_FILE: std_log.txt + # + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + FREEZE: + FREEZE_PART: [ "first_stage_model", "cond_stage_model", "model" ] + TRAIN_PART: [ "control_blocks" ] + # + MODEL: + NAME: LatentDiffusionSCEControl + PARAMETERIZATION: v + TIMESTEPS: 1000 + MIN_SNR_GAMMA: + ZERO_TERMINAL_SNR: True + PRETRAINED_MODEL: ms://AI-ModelScope/stable-diffusion-2-1@v2-1_768-ema-pruned.safetensors + IGNORE_KEYS: [ ] + SCALE_FACTOR: 0.18215 + SIZE_FACTOR: 8 + DEFAULT_N_PROMPT: + SCHEDULE_ARGS: + "NAME": "scaled_linear" + "BETA_MIN": 0.00085 + "BETA_MAX": 0.012 + USE_EMA: False + # + DIFFUSION_MODEL: + NAME: DiffusionUNet + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + MODEL_CHANNELS: 320 + NUM_HEADS_CHANNELS: 64 + NUM_RES_BLOCKS: 2 + ATTENTION_RESOLUTIONS: [ 4, 2, 1 ] + CHANNEL_MULT: [ 1, 2, 4, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + USE_CHECKPOINT: False + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: 1 + CONTEXT_DIM: 1024 + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: True + PRETRAINED_MODEL: + IGNORE_KEYS: [] + # + FIRST_STAGE_MODEL: + NAME: AutoencoderKL + EMBED_DIM: 4 + PRETRAINED_MODEL: + IGNORE_KEYS: [ ] + BATCH_SIZE: 4 + # + ENCODER: + NAME: Encoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DOUBLE_Z: True + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + # + DECODER: + NAME: Decoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + GIVE_PRE_END: False + TANH_OUT: False + # + TOKENIZER: + NAME: OpenClipTokenizer + LENGTH: 77 + # + COND_STAGE_MODEL: + NAME: FrozenOpenCLIPEmbedder + ARCH: ViT-H-14 + PRETRAINED_MODEL: + LAYER: penultimate + # + LOSS: + NAME: ReconstructLoss + LOSS_TYPE: l2 + # + CONTROL_MODEL: + NAME: CSCTuners + PRE_HINT_IN_CHANNELS: 3 + PRE_HINT_OUT_CHANNELS: 256 + DENSE_HINT_KERNAL: 3 + SCALE: 1.0 + SC_TUNER_CFG: + NAME: SCTuner + TUNER_NAME: SCEAdapter + DOWN_RATIO: 1.0 + CONTROL_ANNO: + NAME: CannyAnnotator + LOW_THRESHOLD: 100 + HIGH_THRESHOLD: 200 + # + SAMPLE_ARGS: + SAMPLER: ddim + SAMPLE_STEPS: 50 + SEED: 2023 + GUIDE_SCALE: 7.5 + GUIDE_RESCALE: 0.5 + DISCRETIZATION: trailing + IMAGE_SIZE: [768, 768] + RUN_TRAIN_N: False + # + OPTIMIZER: + NAME: AdamW + LEARNING_RATE: 0.064 + BETAS: [ 0.9, 0.999 ] + EPS: 1e-8 + WEIGHT_DECAY: 1e-2 + AMSGRAD: False + # + TRAIN_DATA: + NAME: ImageTextPairMSDataset + MODE: train + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_DATASET_SPLIT: train_short + MS_REMAP_KEYS: { 'Image:FILE': 'Target:FILE' } + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 1 + NUM_WORKERS: 4 + SAMPLER: + NAME: LoopSampler + TRANSFORMS: + - NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - NAME: Resize + SIZE: 768 + INTERPOLATION: bilinear + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: CenterCrop + SIZE: 768 + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: ToNumpy + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'image_preprocess' ] + - NAME: ImageToTensor + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: torchvision + - NAME: Rename + INPUT_KEY: [ 'img', 'image_preprocess' ] + OUTPUT_KEY: [ 'image', 'image_preprocess' ] + - NAME: Select + KEYS: [ 'image', 'prompt', 'image_preprocess' ] + META_KEYS: [ 'data_key' ] + # + EVAL_DATA: + NAME: ImageTextPairMSDataset + MODE: eval + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_DATASET_SPLIT: train_short + MS_REMAP_KEYS: { 'Image:FILE': 'Target:FILE' } + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 10 + NUM_WORKERS: 4 + TRANSFORMS: + - NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - NAME: Resize + SIZE: 768 + INTERPOLATION: bilinear + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: CenterCrop + SIZE: 768 + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: ToNumpy + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'image_preprocess' ] + - NAME: ImageToTensor + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: torchvision + - NAME: Rename + INPUT_KEY: [ 'img', 'image_preprocess' ] + OUTPUT_KEY: [ 'image', 'image_preprocess' ] + - NAME: Select + KEYS: [ 'image', 'prompt', 'image_preprocess' ] + META_KEYS: [ 'data_key' ] + # + TRAIN_HOOKS: + - + NAME: BackwardHook + PRIORITY: 0 + - + NAME: LogHook + LOG_INTERVAL: 50 + - + NAME: CheckpointHook + INTERVAL: 100 + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 + # + EVAL_HOOKS: + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 diff --git a/scepter/methods/scedit/ctr/sd21_768_sce_ctr_pose.yaml b/scepter/methods/scedit/ctr/sd21_768_sce_ctr_pose.yaml new file mode 100644 index 0000000..932e22f --- /dev/null +++ b/scepter/methods/scedit/ctr/sd21_768_sce_ctr_pose.yaml @@ -0,0 +1,264 @@ +ENV: + BACKEND: nccl +SOLVER: + NAME: LatentDiffusionSolver + RESUME_FROM: + LOAD_MODEL_ONLY: True + USE_FSDP: False + SHARDING_STRATEGY: + USE_AMP: True + DTYPE: float16 + CHANNELS_LAST: True + MAX_STEPS: 200 + MAX_EPOCHS: -1 + NUM_FOLDS: 1 + ACCU_STEP: 1 + EVAL_INTERVAL: 100 + # + WORK_DIR: ./cache/save_data/sd21_768_sce_ctr_pose + LOG_FILE: std_log.txt + # + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + FREEZE: + FREEZE_PART: [ "first_stage_model", "cond_stage_model", "model" ] + TRAIN_PART: [ "control_blocks" ] + # + MODEL: + NAME: LatentDiffusionSCEControl + PARAMETERIZATION: v + TIMESTEPS: 1000 + MIN_SNR_GAMMA: + ZERO_TERMINAL_SNR: True + PRETRAINED_MODEL: ms://AI-ModelScope/stable-diffusion-2-1@v2-1_768-ema-pruned.safetensors + IGNORE_KEYS: [ ] + SCALE_FACTOR: 0.18215 + SIZE_FACTOR: 8 + DEFAULT_N_PROMPT: + SCHEDULE_ARGS: + "NAME": "scaled_linear" + "BETA_MIN": 0.00085 + "BETA_MAX": 0.012 + USE_EMA: False + # + DIFFUSION_MODEL: + NAME: DiffusionUNet + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + MODEL_CHANNELS: 320 + NUM_HEADS_CHANNELS: 64 + NUM_RES_BLOCKS: 2 + ATTENTION_RESOLUTIONS: [ 4, 2, 1 ] + CHANNEL_MULT: [ 1, 2, 4, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + USE_CHECKPOINT: False + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: 1 + CONTEXT_DIM: 1024 + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: True + PRETRAINED_MODEL: + IGNORE_KEYS: [] + # + FIRST_STAGE_MODEL: + NAME: AutoencoderKL + EMBED_DIM: 4 + PRETRAINED_MODEL: + IGNORE_KEYS: [ ] + BATCH_SIZE: 4 + # + ENCODER: + NAME: Encoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DOUBLE_Z: True + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + # + DECODER: + NAME: Decoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + GIVE_PRE_END: False + TANH_OUT: False + # + TOKENIZER: + NAME: OpenClipTokenizer + LENGTH: 77 + # + COND_STAGE_MODEL: + NAME: FrozenOpenCLIPEmbedder + ARCH: ViT-H-14 + PRETRAINED_MODEL: + LAYER: penultimate + # + LOSS: + NAME: ReconstructLoss + LOSS_TYPE: l2 + # + CONTROL_MODEL: + NAME: CSCTuners + PRE_HINT_IN_CHANNELS: 3 + PRE_HINT_OUT_CHANNELS: 256 + DENSE_HINT_KERNAL: 3 + SCALE: 1.0 + SC_TUNER_CFG: + NAME: SCTuner + TUNER_NAME: SCEAdapter + DOWN_RATIO: 1.0 + CONTROL_ANNO: + NAME: OpenposeAnnotator + BODY_MODEL_PATH: ms://damo/scepter_scedit@annotator/ckpts/body_pose_model.pth + HAND_MODEL_PATH: ms://damo/scepter_scedit@annotator/ckpts/hand_pose_model.pth + # + SAMPLE_ARGS: + SAMPLER: ddim + SAMPLE_STEPS: 50 + SEED: 2023 + GUIDE_SCALE: 7.5 + GUIDE_RESCALE: 0.5 + DISCRETIZATION: trailing + IMAGE_SIZE: [768, 768] + RUN_TRAIN_N: False + # + OPTIMIZER: + NAME: AdamW + LEARNING_RATE: 0.064 + BETAS: [ 0.9, 0.999 ] + EPS: 1e-8 + WEIGHT_DECAY: 1e-2 + AMSGRAD: False + # + TRAIN_DATA: + NAME: ImageTextPairMSDataset + MODE: train + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_DATASET_SPLIT: train_short + MS_REMAP_KEYS: { 'Image:FILE': 'Target:FILE' } + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 1 + NUM_WORKERS: 4 + SAMPLER: + NAME: LoopSampler + TRANSFORMS: + - NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - NAME: Resize + SIZE: 768 + INTERPOLATION: bilinear + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: CenterCrop + SIZE: 768 + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: ToNumpy + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'image_preprocess' ] + - NAME: ImageToTensor + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: torchvision + - NAME: Rename + INPUT_KEY: [ 'img', 'image_preprocess' ] + OUTPUT_KEY: [ 'image', 'image_preprocess' ] + - NAME: Select + KEYS: [ 'image', 'prompt', 'image_preprocess' ] + META_KEYS: [ 'data_key' ] + # + EVAL_DATA: + NAME: ImageTextPairMSDataset + MODE: eval + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_DATASET_SPLIT: train_short + MS_REMAP_KEYS: { 'Image:FILE': 'Target:FILE' } + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 10 + NUM_WORKERS: 4 + TRANSFORMS: + - NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - NAME: Resize + SIZE: 768 + INTERPOLATION: bilinear + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: CenterCrop + SIZE: 768 + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: ToNumpy + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'image_preprocess' ] + - NAME: ImageToTensor + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: torchvision + - NAME: Rename + INPUT_KEY: [ 'img', 'image_preprocess' ] + OUTPUT_KEY: [ 'image', 'image_preprocess' ] + - NAME: Select + KEYS: [ 'image', 'prompt', 'image_preprocess' ] + META_KEYS: [ 'data_key' ] + # + TRAIN_HOOKS: + - + NAME: BackwardHook + PRIORITY: 0 + - + NAME: LogHook + LOG_INTERVAL: 50 + - + NAME: CheckpointHook + INTERVAL: 100 + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 + # + EVAL_HOOKS: + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 diff --git a/scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_color.yaml b/scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_color.yaml new file mode 100644 index 0000000..cdf7fa3 --- /dev/null +++ b/scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_color.yaml @@ -0,0 +1,378 @@ +ENV: + BACKEND: nccl +SOLVER: + NAME: LatentDiffusionSolver + RESUME_FROM: + LOAD_MODEL_ONLY: True + USE_FSDP: False + SHARDING_STRATEGY: + USE_AMP: True + DTYPE: float16 + CHANNELS_LAST: True + MAX_STEPS: 200 + MAX_EPOCHS: -1 + NUM_FOLDS: 1 + ACCU_STEP: 1 + EVAL_INTERVAL: 100 + # + WORK_DIR: ./cache/save_data/sdxl_1024_sce_ctr_color + LOG_FILE: std_log.txt + # + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + FREEZE: + FREEZE_PART: [ "first_stage_model", "cond_stage_model", "model" ] + TRAIN_PART: [ "control_blocks" ] + # + MODEL: + NAME: LatentDiffusionXLSCEControl + PARAMETERIZATION: eps + TIMESTEPS: 1000 + MIN_SNR_GAMMA: + ZERO_TERMINAL_SNR: False + PRETRAINED_MODEL: ms://AI-ModelScope/stable-diffusion-xl-base-1.0@sd_xl_base_1.0.safetensors + IGNORE_KEYS: [ ] + SCALE_FACTOR: 0.13025 + SIZE_FACTOR: 8 + DEFAULT_N_PROMPT: + SCHEDULE_ARGS: + "NAME": "scaled_linear" + "BETA_MIN": 0.00085 + "BETA_MAX": 0.0120 + USE_EMA: False + LOAD_REFINER: False + # + DIFFUSION_MODEL: + NAME: DiffusionUNetXL + PRETRAINED_MODEL: + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + NUM_RES_BLOCKS: 2 + MODEL_CHANNELS: 320 + ATTENTION_RESOLUTIONS: [ 4, 2 ] + DROPOUT: 0 + CHANNEL_MULT: [ 1, 2, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + NUM_CLASSES: sequential + USE_CHECKPOINT: False + NUM_HEADS: -1 + NUM_HEADS_CHANNELS: 64 + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_NEW_ATTENTION_ORDER: True + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: [ 1, 2, 10 ] + CONTEXT_DIM: 2048 + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: True + ADM_IN_CHANNELS: 2816 + USE_SENTENCE_EMB: False + USE_WORD_MAPPING: False + # + FIRST_STAGE_MODEL: + NAME: AutoencoderKL + EMBED_DIM: 4 + PRETRAINED_MODEL: + IGNORE_KEYS: [] + BATCH_SIZE: 1 + # + ENCODER: + NAME: Encoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DOUBLE_Z: True + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + # + DECODER: + NAME: Decoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + GIVE_PRE_END: False + TANH_OUT: False + # + COND_STAGE_MODEL: + NAME: GeneralConditioner + PRETRAINED_MODEL: + EMBEDDERS: + - + NAME: FrozenCLIPEmbedder + PRETRAINED_MODEL: ms://AI-ModelScope/clip-vit-large-patch14 + TOKENIZER_PATH: ms://AI-ModelScope/clip-vit-large-patch14 + MAX_LENGTH: 77 + FREEZE: True + LAYER: hidden + LAYER_IDX: 11 + USE_FINAL_LAYER_NORM: False + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "prompt" ] + LEGACY_UCG_VALUE: + - + NAME: FrozenOpenCLIPEmbedder2 + ARCH: ViT-bigG-14 + PRETRAINED_MODEL: + MAX_LENGTH: 77 + FREEZE: True + ALWAYS_RETURN_POOLED: True + LEGACY: False + LAYER: penultimate + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "prompt" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "original_size_as_tuple" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "crop_coords_top_left" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "target_size_as_tuple" ] + LEGACY_UCG_VALUE: + # + REFINER_MODEL: + NAME: DiffusionUNetXL + PRETRAINED_MODEL: + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + NUM_RES_BLOCKS: 2 + MODEL_CHANNELS: 384 + ATTENTION_RESOLUTIONS: [ 4, 2 ] + DROPOUT: 0 + CHANNEL_MULT: [ 1, 2, 4, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + NUM_CLASSES: sequential + USE_CHECKPOINT: False + NUM_HEADS: -1 + NUM_HEADS_CHANNELS: 64 + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_NEW_ATTENTION_ORDER: True + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: 4 + CONTEXT_DIM: [ 1280, 1280, 1280, 1280 ] + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: True + ADM_IN_CHANNELS: 2560 + USE_SENTENCE_EMB: False + USE_WORD_MAPPING: False + REFINER_COND_MODEL: + NAME: GeneralConditioner + PRETRAINED_MODEL: + EMBEDDERS: + - + NAME: FrozenOpenCLIPEmbedder2 + ARCH: ViT-bigG-14 + PRETRAINED_MODEL: + MAX_LENGTH: 77 + FREEZE: True + ALWAYS_RETURN_POOLED: True + LEGACY: False + LAYER: penultimate + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "prompt" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "original_size_as_tuple" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "crop_coords_top_left" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "aesthetic_score" ] + LEGACY_UCG_VALUE: + # + LOSS: + NAME: ReconstructLoss + LOSS_TYPE: l2 + # + CONTROL_MODEL: + NAME: CSCTuners + PRE_HINT_IN_CHANNELS: 3 + PRE_HINT_OUT_CHANNELS: 256 + DENSE_HINT_KERNAL: 3 + SCALE: 1.0 + SC_TUNER_CFG: + NAME: SCTuner + TUNER_NAME: SCEAdapter + DOWN_RATIO: 1.0 + CONTROL_ANNO: + NAME: ColorAnnotator + RATIO: 64 + # + SAMPLE_ARGS: + SAMPLER: ddim + SAMPLE_STEPS: 50 + SEED: 2023 + GUIDE_SCALE: 7.5 + GUIDE_RESCALE: 0.5 + DISCRETIZATION: trailing + IMAGE_SIZE: [1024, 1024] + RUN_TRAIN_N: False + # + OPTIMIZER: + NAME: AdamW + LEARNING_RATE: 0.064 + BETAS: [ 0.9, 0.999 ] + EPS: 1e-8 + WEIGHT_DECAY: 1e-2 + AMSGRAD: False + # + TRAIN_DATA: + NAME: ImageTextPairMSDataset + MODE: train + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_DATASET_SPLIT: train_short + MS_REMAP_KEYS: { 'Image:FILE': 'Target:FILE' } + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 1 + NUM_WORKERS: 4 + SAMPLER: + NAME: LoopSampler + TRANSFORMS: + - NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - NAME: FlexibleResize + SIZE: 1024 + INTERPOLATION: bilinear + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: FlexibleCropXL + SIZE: 1024 + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: ToNumpy + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'image_preprocess' ] + - NAME: ImageToTensor + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: torchvision + - NAME: Rename + INPUT_KEY: [ 'img', 'image_preprocess', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left' ] + OUTPUT_KEY: [ 'image', 'image_preprocess', 'original_size_as_tuple', 'target_size_as_tuple', 'crop_coords_top_left' ] + - NAME: Select + KEYS: [ 'image', 'prompt', 'image_preprocess', 'original_size_as_tuple', 'target_size_as_tuple', 'crop_coords_top_left' ] + META_KEYS: [ 'data_key' ] + # + EVAL_DATA: + NAME: ImageTextPairMSDataset + MODE: eval + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_DATASET_SPLIT: train_short + MS_REMAP_KEYS: { 'Image:FILE': 'Target:FILE' } + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 10 + NUM_WORKERS: 4 + TRANSFORMS: + - NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - NAME: Resize + SIZE: 1024 + INTERPOLATION: bilinear + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: CenterCrop + SIZE: 1024 + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: ToNumpy + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'image_preprocess' ] + - NAME: ImageToTensor + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: torchvision + - NAME: Rename + INPUT_KEY: [ 'img', 'image_preprocess' ] + OUTPUT_KEY: [ 'image', 'image_preprocess' ] + - NAME: Select + KEYS: [ 'image', 'prompt', 'image_preprocess' ] + META_KEYS: [ 'data_key' ] + # + TRAIN_HOOKS: + - + NAME: BackwardHook + PRIORITY: 0 + - + NAME: LogHook + LOG_INTERVAL: 50 + - + NAME: CheckpointHook + INTERVAL: 100 + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 + # + EVAL_HOOKS: + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 diff --git a/scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_color_datatxt.yaml b/scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_color_datatxt.yaml new file mode 100644 index 0000000..4a15c00 --- /dev/null +++ b/scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_color_datatxt.yaml @@ -0,0 +1,404 @@ +ENV: + BACKEND: nccl +SOLVER: + NAME: LatentDiffusionSolver + RESUME_FROM: + LOAD_MODEL_ONLY: True + USE_FSDP: False + SHARDING_STRATEGY: + USE_AMP: True + DTYPE: float16 + CHANNELS_LAST: True + MAX_STEPS: 200 + MAX_EPOCHS: -1 + NUM_FOLDS: 1 + ACCU_STEP: 1 + EVAL_INTERVAL: 100 + # + WORK_DIR: ./cache/save_data/sdxl_1024_sce_ctr_color_datatxt + LOG_FILE: std_log.txt + # + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + FREEZE: + FREEZE_PART: [ "first_stage_model", "cond_stage_model", "model" ] + TRAIN_PART: [ "control_blocks" ] + # + MODEL: + NAME: LatentDiffusionXLSCEControl + PARAMETERIZATION: eps + TIMESTEPS: 1000 + MIN_SNR_GAMMA: + ZERO_TERMINAL_SNR: False + PRETRAINED_MODEL: ms://AI-ModelScope/stable-diffusion-xl-base-1.0@sd_xl_base_1.0.safetensors + IGNORE_KEYS: [ ] + SCALE_FACTOR: 0.13025 + SIZE_FACTOR: 8 + DEFAULT_N_PROMPT: + SCHEDULE_ARGS: + "NAME": "scaled_linear" + "BETA_MIN": 0.00085 + "BETA_MAX": 0.0120 + USE_EMA: False + LOAD_REFINER: False + # + DIFFUSION_MODEL: + NAME: DiffusionUNetXL + PRETRAINED_MODEL: + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + NUM_RES_BLOCKS: 2 + MODEL_CHANNELS: 320 + ATTENTION_RESOLUTIONS: [ 4, 2 ] + DROPOUT: 0 + CHANNEL_MULT: [ 1, 2, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + NUM_CLASSES: sequential + USE_CHECKPOINT: False + NUM_HEADS: -1 + NUM_HEADS_CHANNELS: 64 + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_NEW_ATTENTION_ORDER: True + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: [ 1, 2, 10 ] + CONTEXT_DIM: 2048 + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: True + ADM_IN_CHANNELS: 2816 + USE_SENTENCE_EMB: False + USE_WORD_MAPPING: False + # + FIRST_STAGE_MODEL: + NAME: AutoencoderKL + EMBED_DIM: 4 + PRETRAINED_MODEL: + IGNORE_KEYS: [] + BATCH_SIZE: 1 + # + ENCODER: + NAME: Encoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DOUBLE_Z: True + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + # + DECODER: + NAME: Decoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + GIVE_PRE_END: False + TANH_OUT: False + # + COND_STAGE_MODEL: + NAME: GeneralConditioner + PRETRAINED_MODEL: + EMBEDDERS: + - + NAME: FrozenCLIPEmbedder + PRETRAINED_MODEL: ms://AI-ModelScope/clip-vit-large-patch14 + TOKENIZER_PATH: ms://AI-ModelScope/clip-vit-large-patch14 + MAX_LENGTH: 77 + FREEZE: True + LAYER: hidden + LAYER_IDX: 11 + USE_FINAL_LAYER_NORM: False + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "prompt" ] + LEGACY_UCG_VALUE: + - + NAME: FrozenOpenCLIPEmbedder2 + ARCH: ViT-bigG-14 + PRETRAINED_MODEL: + MAX_LENGTH: 77 + FREEZE: True + ALWAYS_RETURN_POOLED: True + LEGACY: False + LAYER: penultimate + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "prompt" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "original_size_as_tuple" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "crop_coords_top_left" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "target_size_as_tuple" ] + LEGACY_UCG_VALUE: + # + REFINER_MODEL: + NAME: DiffusionUNetXL + PRETRAINED_MODEL: + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + NUM_RES_BLOCKS: 2 + MODEL_CHANNELS: 384 + ATTENTION_RESOLUTIONS: [ 4, 2 ] + DROPOUT: 0 + CHANNEL_MULT: [ 1, 2, 4, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + NUM_CLASSES: sequential + USE_CHECKPOINT: False + NUM_HEADS: -1 + NUM_HEADS_CHANNELS: 64 + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_NEW_ATTENTION_ORDER: True + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: 4 + CONTEXT_DIM: [ 1280, 1280, 1280, 1280 ] + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: True + ADM_IN_CHANNELS: 2560 + USE_SENTENCE_EMB: False + USE_WORD_MAPPING: False + REFINER_COND_MODEL: + NAME: GeneralConditioner + PRETRAINED_MODEL: + EMBEDDERS: + - + NAME: FrozenOpenCLIPEmbedder2 + ARCH: ViT-bigG-14 + PRETRAINED_MODEL: + MAX_LENGTH: 77 + FREEZE: True + ALWAYS_RETURN_POOLED: True + LEGACY: False + LAYER: penultimate + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "prompt" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "original_size_as_tuple" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "crop_coords_top_left" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "aesthetic_score" ] + LEGACY_UCG_VALUE: + # + LOSS: + NAME: ReconstructLoss + LOSS_TYPE: l2 + # + CONTROL_MODEL: + NAME: CSCTuners + PRE_HINT_IN_CHANNELS: 3 + PRE_HINT_OUT_CHANNELS: 256 + DENSE_HINT_KERNAL: 3 + SCALE: 1.0 + SC_TUNER_CFG: + NAME: SCTuner + TUNER_NAME: SCEAdapter + DOWN_RATIO: 1.0 + CONTROL_ANNO: + NAME: ColorAnnotator + RATIO: 64 + # + SAMPLE_ARGS: + SAMPLER: ddim + SAMPLE_STEPS: 50 + SEED: 2023 + GUIDE_SCALE: 7.5 + GUIDE_RESCALE: 0.5 + DISCRETIZATION: trailing + IMAGE_SIZE: [1024, 1024] + RUN_TRAIN_N: False + # + OPTIMIZER: + NAME: AdamW + LEARNING_RATE: 0.064 + BETAS: [ 0.9, 0.999 ] + EPS: 1e-8 + WEIGHT_DECAY: 1e-2 + AMSGRAD: False + # + TRAIN_DATA: + NAME: ImageTextPairDataset + MODE: train + P_ZERO: 0.1 + PIN_MEMORY: True + BATCH_SIZE: 4 + NUM_WORKERS: 4 + FILE_SYSTEM: + NAME: LocalFs + AUTO_CLEAN: False + SAMPLER: + NAME: MixtureOfSamplers + SUB_SAMPLERS: + - + NAME: MultiLevelBatchSampler + PROB: 1.0 + IMAGE_SIZE: [ 1024, 1024 ] + FIELDS: ["img_path", "width", "height", "prompt"] + DELIMITER: '#;#' + PATH_PREFIX: cache/datasets/3D_example_txt + PROMPT_PREFIX: '' + INDEX_FILE: cache/datasets/3D_example_txt/train.txt + # + TRANSFORMS: + - + NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - + NAME: FlexibleResize + INTERPOLATION: bilinear + SIZE: 1024 + INPUT_KEY: ['img'] + OUTPUT_KEY: ['img'] + BACKEND: pillow + - + NAME: FlexibleCropXL + INPUT_KEY: ['img'] + OUTPUT_KEY: ['img'] + BACKEND: pillow + - + NAME: ToNumpy + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'image_preprocess' ] + - + NAME: ImageToTensor + INPUT_KEY: ['img'] + OUTPUT_KEY: ['img'] + BACKEND: pillow + - + NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: ['img'] + OUTPUT_KEY: ['img'] + BACKEND: torchvision + - + NAME: Select + KEYS: ['img', 'prompt', 'image_preprocess', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left'] + META_KEYS: [ 'img_path' ] + - + NAME: Rename + INPUT_KEY: ['img', 'image_preprocess', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left'] + OUTPUT_KEY: ['image', 'image_preprocess', 'original_size_as_tuple', 'target_size_as_tuple', 'crop_coords_top_left'] + # + EVAL_DATA: + NAME: Text2ImageDataset + MODE: eval + PROMPT_FILE: cache/datasets/3D_example_txt/train.txt + PATH_PREFIX: cache/datasets/3D_example_txt + IMAGE_SIZE: [ 1024, 1024 ] + FIELDS: ["img_path", "width", "height", "prompt"] + DELIMITER: '#;#' + PROMPT_PREFIX: '' + USE_NUM: 8 + PIN_MEMORY: True + BATCH_SIZE: 4 + NUM_WORKERS: 4 + FILE_SYSTEM: + NAME: LocalFs + AUTO_CLEAN: False + # + TRANSFORMS: + - + NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - + NAME: FlexibleResize + INTERPOLATION: bilinear + SIZE: 1024 + INPUT_KEY: ['img'] + OUTPUT_KEY: ['img'] + BACKEND: pillow + - + NAME: FlexibleCenterCrop + INPUT_KEY: ['img'] + OUTPUT_KEY: ['img'] + BACKEND: pillow + - + NAME: ToNumpy + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'image_preprocess' ] + - + NAME: ImageToTensor + INPUT_KEY: ['img'] + OUTPUT_KEY: ['img'] + BACKEND: pillow + - + NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: ['img'] + OUTPUT_KEY: ['img'] + BACKEND: torchvision + - + NAME: Rename + INPUT_KEY: [ 'img', 'image_preprocess' ] + OUTPUT_KEY: [ 'image', 'image_preprocess' ] + - + NAME: Select + KEYS: [ 'image', 'prompt', 'image_preprocess' ] + META_KEYS: [ ] + # + TRAIN_HOOKS: + - + NAME: BackwardHook + PRIORITY: 0 + - + NAME: LogHook + LOG_INTERVAL: 50 + - + NAME: CheckpointHook + INTERVAL: 100 + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 + # + EVAL_HOOKS: + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 diff --git a/scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_depth.yaml b/scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_depth.yaml new file mode 100644 index 0000000..e4b33ab --- /dev/null +++ b/scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_depth.yaml @@ -0,0 +1,378 @@ +ENV: + BACKEND: nccl +SOLVER: + NAME: LatentDiffusionSolver + RESUME_FROM: + LOAD_MODEL_ONLY: True + USE_FSDP: False + SHARDING_STRATEGY: + USE_AMP: True + DTYPE: float16 + CHANNELS_LAST: True + MAX_STEPS: 200 + MAX_EPOCHS: -1 + NUM_FOLDS: 1 + ACCU_STEP: 1 + EVAL_INTERVAL: 100 + # + WORK_DIR: ./cache/save_data/sdxl_1024_sce_ctr_depth + LOG_FILE: std_log.txt + # + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + FREEZE: + FREEZE_PART: [ "first_stage_model", "cond_stage_model", "model" ] + TRAIN_PART: [ "control_blocks" ] + # + MODEL: + NAME: LatentDiffusionXLSCEControl + PARAMETERIZATION: eps + TIMESTEPS: 1000 + MIN_SNR_GAMMA: + ZERO_TERMINAL_SNR: False + PRETRAINED_MODEL: ms://AI-ModelScope/stable-diffusion-xl-base-1.0@sd_xl_base_1.0.safetensors + IGNORE_KEYS: [ ] + SCALE_FACTOR: 0.13025 + SIZE_FACTOR: 8 + DEFAULT_N_PROMPT: + SCHEDULE_ARGS: + "NAME": "scaled_linear" + "BETA_MIN": 0.00085 + "BETA_MAX": 0.0120 + USE_EMA: False + LOAD_REFINER: False + # + DIFFUSION_MODEL: + NAME: DiffusionUNetXL + PRETRAINED_MODEL: + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + NUM_RES_BLOCKS: 2 + MODEL_CHANNELS: 320 + ATTENTION_RESOLUTIONS: [ 4, 2 ] + DROPOUT: 0 + CHANNEL_MULT: [ 1, 2, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + NUM_CLASSES: sequential + USE_CHECKPOINT: False + NUM_HEADS: -1 + NUM_HEADS_CHANNELS: 64 + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_NEW_ATTENTION_ORDER: True + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: [ 1, 2, 10 ] + CONTEXT_DIM: 2048 + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: True + ADM_IN_CHANNELS: 2816 + USE_SENTENCE_EMB: False + USE_WORD_MAPPING: False + # + FIRST_STAGE_MODEL: + NAME: AutoencoderKL + EMBED_DIM: 4 + PRETRAINED_MODEL: + IGNORE_KEYS: [] + BATCH_SIZE: 1 + # + ENCODER: + NAME: Encoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DOUBLE_Z: True + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + # + DECODER: + NAME: Decoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + GIVE_PRE_END: False + TANH_OUT: False + # + COND_STAGE_MODEL: + NAME: GeneralConditioner + PRETRAINED_MODEL: + EMBEDDERS: + - + NAME: FrozenCLIPEmbedder + PRETRAINED_MODEL: ms://AI-ModelScope/clip-vit-large-patch14 + TOKENIZER_PATH: ms://AI-ModelScope/clip-vit-large-patch14 + MAX_LENGTH: 77 + FREEZE: True + LAYER: hidden + LAYER_IDX: 11 + USE_FINAL_LAYER_NORM: False + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "prompt" ] + LEGACY_UCG_VALUE: + - + NAME: FrozenOpenCLIPEmbedder2 + ARCH: ViT-bigG-14 + PRETRAINED_MODEL: + MAX_LENGTH: 77 + FREEZE: True + ALWAYS_RETURN_POOLED: True + LEGACY: False + LAYER: penultimate + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "prompt" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "original_size_as_tuple" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "crop_coords_top_left" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "target_size_as_tuple" ] + LEGACY_UCG_VALUE: + # + REFINER_MODEL: + NAME: DiffusionUNetXL + PRETRAINED_MODEL: + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + NUM_RES_BLOCKS: 2 + MODEL_CHANNELS: 384 + ATTENTION_RESOLUTIONS: [ 4, 2 ] + DROPOUT: 0 + CHANNEL_MULT: [ 1, 2, 4, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + NUM_CLASSES: sequential + USE_CHECKPOINT: False + NUM_HEADS: -1 + NUM_HEADS_CHANNELS: 64 + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_NEW_ATTENTION_ORDER: True + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: 4 + CONTEXT_DIM: [ 1280, 1280, 1280, 1280 ] + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: True + ADM_IN_CHANNELS: 2560 + USE_SENTENCE_EMB: False + USE_WORD_MAPPING: False + REFINER_COND_MODEL: + NAME: GeneralConditioner + PRETRAINED_MODEL: + EMBEDDERS: + - + NAME: FrozenOpenCLIPEmbedder2 + ARCH: ViT-bigG-14 + PRETRAINED_MODEL: + MAX_LENGTH: 77 + FREEZE: True + ALWAYS_RETURN_POOLED: True + LEGACY: False + LAYER: penultimate + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "prompt" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "original_size_as_tuple" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "crop_coords_top_left" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "aesthetic_score" ] + LEGACY_UCG_VALUE: + # + LOSS: + NAME: ReconstructLoss + LOSS_TYPE: l2 + # + CONTROL_MODEL: + NAME: CSCTuners + PRE_HINT_IN_CHANNELS: 3 + PRE_HINT_OUT_CHANNELS: 256 + DENSE_HINT_KERNAL: 3 + SCALE: 1.0 + SC_TUNER_CFG: + NAME: SCTuner + TUNER_NAME: SCEAdapter + DOWN_RATIO: 1.0 + CONTROL_ANNO: + NAME: MidasDetector + PRETRAINED_MODEL: ms://damo/scepter_scedit@annotator/ckpts/dpt_hybrid-midas-501f0c75.pt + # + SAMPLE_ARGS: + SAMPLER: ddim + SAMPLE_STEPS: 50 + SEED: 2023 + GUIDE_SCALE: 7.5 + GUIDE_RESCALE: 0.5 + DISCRETIZATION: trailing + IMAGE_SIZE: [1024, 1024] + RUN_TRAIN_N: False + # + OPTIMIZER: + NAME: AdamW + LEARNING_RATE: 0.064 + BETAS: [ 0.9, 0.999 ] + EPS: 1e-8 + WEIGHT_DECAY: 1e-2 + AMSGRAD: False + # + TRAIN_DATA: + NAME: ImageTextPairMSDataset + MODE: train + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_DATASET_SPLIT: train_short + MS_REMAP_KEYS: { 'Image:FILE': 'Target:FILE' } + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 1 + NUM_WORKERS: 4 + SAMPLER: + NAME: LoopSampler + TRANSFORMS: + - NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - NAME: FlexibleResize + SIZE: 1024 + INTERPOLATION: bilinear + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: FlexibleCropXL + SIZE: 1024 + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: ToNumpy + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'image_preprocess' ] + - NAME: ImageToTensor + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: torchvision + - NAME: Rename + INPUT_KEY: [ 'img', 'image_preprocess', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left' ] + OUTPUT_KEY: [ 'image', 'image_preprocess', 'original_size_as_tuple', 'target_size_as_tuple', 'crop_coords_top_left' ] + - NAME: Select + KEYS: [ 'image', 'prompt', 'image_preprocess', 'original_size_as_tuple', 'target_size_as_tuple', 'crop_coords_top_left' ] + META_KEYS: [ 'data_key' ] + # + EVAL_DATA: + NAME: ImageTextPairMSDataset + MODE: eval + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_DATASET_SPLIT: train_short + MS_REMAP_KEYS: { 'Image:FILE': 'Target:FILE' } + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 10 + NUM_WORKERS: 4 + TRANSFORMS: + - NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - NAME: Resize + SIZE: 1024 + INTERPOLATION: bilinear + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: CenterCrop + SIZE: 1024 + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: ToNumpy + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'image_preprocess' ] + - NAME: ImageToTensor + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: torchvision + - NAME: Rename + INPUT_KEY: [ 'img', 'image_preprocess' ] + OUTPUT_KEY: [ 'image', 'image_preprocess' ] + - NAME: Select + KEYS: [ 'image', 'prompt', 'image_preprocess' ] + META_KEYS: [ 'data_key' ] + # + TRAIN_HOOKS: + - + NAME: BackwardHook + PRIORITY: 0 + - + NAME: LogHook + LOG_INTERVAL: 50 + - + NAME: CheckpointHook + INTERVAL: 100 + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 + # + EVAL_HOOKS: + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 diff --git a/scepter/methods/scedit/t2i/sd15_512_sce_t2i.yaml b/scepter/methods/scedit/t2i/sd15_512_sce_t2i.yaml new file mode 100644 index 0000000..dc4115b --- /dev/null +++ b/scepter/methods/scedit/t2i/sd15_512_sce_t2i.yaml @@ -0,0 +1,228 @@ +ENV: + BACKEND: nccl +SOLVER: + NAME: LatentDiffusionSolver + RESUME_FROM: + LOAD_MODEL_ONLY: True + USE_FSDP: False + SHARDING_STRATEGY: + USE_AMP: True + DTYPE: float16 + CHANNELS_LAST: True + MAX_STEPS: 2000 + MAX_EPOCHS: -1 + NUM_FOLDS: 1 + ACCU_STEP: 1 + EVAL_INTERVAL: 100 + # + WORK_DIR: ./cache/save_data/sd15_512_sce_t2i + LOG_FILE: std_log.txt + # + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + FREEZE: + FREEZE_PART: [ "first_stage_model", "cond_stage_model", "model" ] + TRAIN_PART: [ "lsc_identity" ] + # + MODEL: + NAME: LatentDiffusionSCETuning + PARAMETERIZATION: eps + TIMESTEPS: 1000 + MIN_SNR_GAMMA: + ZERO_TERMINAL_SNR: False + PRETRAINED_MODEL: ms://AI-ModelScope/stable-diffusion-v1-5@v1-5-pruned-emaonly.safetensors + IGNORE_KEYS: [ ] + SCALE_FACTOR: 0.18215 + SIZE_FACTOR: 8 + # DEFAULT_N_PROMPT: 'lowres, error, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, out of frame, extra fingers, mutated hands, poorly drawn hands, poorly drawn face, mutation, deformed, blurry, dehydrated, bad anatomy, bad proportions, extra limbs, cloned face, disfigured, gross proportions, malformed limbs, missing arms, missing legs, extra arms, extra legs, fused fingers, too many fingers, long neck, username, watermark, signature' + DEFAULT_N_PROMPT: + SCHEDULE_ARGS: + "NAME": "scaled_linear" + "BETA_MIN": 0.00085 + "BETA_MAX": 0.012 + USE_EMA: False + # + DIFFUSION_MODEL: + NAME: DiffusionUNet + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + MODEL_CHANNELS: 320 + NUM_HEADS: 8 + NUM_RES_BLOCKS: 2 + ATTENTION_RESOLUTIONS: [ 4, 2, 1 ] + CHANNEL_MULT: [ 1, 2, 4, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + USE_CHECKPOINT: False + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: 1 + CONTEXT_DIM: 768 + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: False + PRETRAINED_MODEL: + IGNORE_KEYS: [] + # + FIRST_STAGE_MODEL: + NAME: AutoencoderKL + EMBED_DIM: 4 + PRETRAINED_MODEL: + IGNORE_KEYS: [] + BATCH_SIZE: 4 + # + ENCODER: + NAME: Encoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DOUBLE_Z: True + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + # + DECODER: + NAME: Decoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + GIVE_PRE_END: False + TANH_OUT: False + # + TOKENIZER: + NAME: ClipTokenizer + PRETRAINED_PATH: ms://AI-ModelScope/clip-vit-large-patch14 + LENGTH: 77 + CLEAN: True + # + COND_STAGE_MODEL: + NAME: FrozenCLIPEmbedder + FREEZE: True + LAYER: last + PRETRAINED_MODEL: ms://AI-ModelScope/clip-vit-large-patch14 + # + LOSS: + NAME: ReconstructLoss + LOSS_TYPE: l2 + # + TUNER_MODEL: + SC_TUNER_CFG: + NAME: SCTuner + TUNER_NAME: SCEAdapter + DOWN_RATIO: 1.0 + # + SAMPLE_ARGS: + SAMPLER: ddim + SAMPLE_STEPS: 50 + SEED: 2023 + GUIDE_SCALE: 7.5 + GUIDE_RESCALE: 0.5 + DISCRETIZATION: trailing + IMAGE_SIZE: [512, 512] + RUN_TRAIN_N: False + # + OPTIMIZER: + NAME: AdamW + LEARNING_RATE: 0.064 + BETAS: [ 0.9, 0.999 ] + EPS: 1e-8 + WEIGHT_DECAY: 1e-2 + AMSGRAD: False + # + TRAIN_DATA: + NAME: ImageTextPairMSDataset + MODE: train + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_DATASET_SPLIT: train_short + MS_REMAP_KEYS: { 'Image:FILE': 'Target:FILE' } + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 1 + NUM_WORKERS: 4 + SAMPLER: + NAME: LoopSampler + TRANSFORMS: + - NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - NAME: Resize + SIZE: 512 + INTERPOLATION: bilinear + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: CenterCrop + SIZE: 512 + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: ImageToTensor + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'image' ] + BACKEND: torchvision + - NAME: Select + KEYS: [ 'image', 'prompt' ] + META_KEYS: [ 'data_key' ] + # + EVAL_DATA: + NAME: ImageTextPairMSDataset + MODE: eval + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_REMAP_KEYS: { 'Image': 'Target:FILE' } + MS_DATASET_SPLIT: test_short + OUTPUT_SIZE: [512, 512] + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 4 + NUM_WORKERS: 4 + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + TRANSFORMS: + - + NAME: Select + KEYS: ['prompt'] + META_KEYS: ['image_size'] + # + TRAIN_HOOKS: + - + NAME: BackwardHook + PRIORITY: 0 + - + NAME: LogHook + LOG_INTERVAL: 50 + - + NAME: CheckpointHook + INTERVAL: 1000 + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 + # + EVAL_HOOKS: + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 diff --git a/scepter/methods/SCEdit/t2i_sd15_512_sce.yaml b/scepter/methods/scedit/t2i/sd15_512_sce_t2i_swift.yaml similarity index 98% rename from scepter/methods/SCEdit/t2i_sd15_512_sce.yaml rename to scepter/methods/scedit/t2i/sd15_512_sce_t2i_swift.yaml index defb3b4..088a3f3 100644 --- a/scepter/methods/SCEdit/t2i_sd15_512_sce.yaml +++ b/scepter/methods/scedit/t2i/sd15_512_sce_t2i_swift.yaml @@ -15,14 +15,14 @@ SOLVER: ACCU_STEP: 1 EVAL_INTERVAL: 100 # - WORK_DIR: ./cache/t2i_sd15_512_sce + WORK_DIR: ./cache/save_data/sd15_512_sce_t2i_swift LOG_FILE: std_log.txt # FILE_SYSTEM: NAME: "ModelscopeFs" TEMP_DIR: "./cache/data" # - TUNER: + TUNER: - NAME: SwiftSCETuning DIMS: [1280, 1280, 1280, 1280, 1280, 640, 640, 640, 320, 320, 320, 320] @@ -125,7 +125,7 @@ SOLVER: SAMPLE_STEPS: 50 SEED: 2023 GUIDE_SCALE: 7.5 - GUIDE_RESCALE: + GUIDE_RESCALE: 0.5 DISCRETIZATION: trailing IMAGE_SIZE: [512, 512] RUN_TRAIN_N: False diff --git a/scepter/methods/scedit/t2i/sd21_768_sce_t2i.yaml b/scepter/methods/scedit/t2i/sd21_768_sce_t2i.yaml new file mode 100644 index 0000000..3a30df4 --- /dev/null +++ b/scepter/methods/scedit/t2i/sd21_768_sce_t2i.yaml @@ -0,0 +1,224 @@ +ENV: + BACKEND: nccl +SOLVER: + NAME: LatentDiffusionSolver + RESUME_FROM: + LOAD_MODEL_ONLY: True + USE_FSDP: False + SHARDING_STRATEGY: + USE_AMP: True + DTYPE: float16 + CHANNELS_LAST: True + MAX_STEPS: 2000 + MAX_EPOCHS: -1 + NUM_FOLDS: 1 + ACCU_STEP: 1 + EVAL_INTERVAL: 100 + # + WORK_DIR: ./cache/save_data/sd21_768_sce_t2i + LOG_FILE: std_log.txt + # + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + FREEZE: + FREEZE_PART: [ "first_stage_model", "cond_stage_model", "model" ] + TRAIN_PART: [ "lsc_identity" ] + # + MODEL: + NAME: LatentDiffusionSCETuning + PARAMETERIZATION: v + TIMESTEPS: 1000 + MIN_SNR_GAMMA: + ZERO_TERMINAL_SNR: False + PRETRAINED_MODEL: ms://AI-ModelScope/stable-diffusion-2-1@v2-1_768-ema-pruned.safetensors + IGNORE_KEYS: [ ] + SCALE_FACTOR: 0.18215 + SIZE_FACTOR: 8 + DEFAULT_N_PROMPT: + SCHEDULE_ARGS: + "NAME": "scaled_linear" + "BETA_MIN": 0.00085 + "BETA_MAX": 0.012 + USE_EMA: False + # + DIFFUSION_MODEL: + NAME: DiffusionUNet + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + MODEL_CHANNELS: 320 + NUM_HEADS_CHANNELS: 64 + NUM_RES_BLOCKS: 2 + ATTENTION_RESOLUTIONS: [ 4, 2, 1 ] + CHANNEL_MULT: [ 1, 2, 4, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + USE_CHECKPOINT: False + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: 1 + CONTEXT_DIM: 1024 + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: True + PRETRAINED_MODEL: + # + FIRST_STAGE_MODEL: + NAME: AutoencoderKL + EMBED_DIM: 4 + PRETRAINED_MODEL: + IGNORE_KEYS: [ ] + BATCH_SIZE: 4 + # + ENCODER: + NAME: Encoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DOUBLE_Z: True + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + # + DECODER: + NAME: Decoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + GIVE_PRE_END: False + TANH_OUT: False + # + TOKENIZER: + NAME: OpenClipTokenizer + LENGTH: 77 + # + COND_STAGE_MODEL: + NAME: FrozenOpenCLIPEmbedder + ARCH: ViT-H-14 + PRETRAINED_MODEL: + LAYER: penultimate + # + LOSS: + NAME: ReconstructLoss + LOSS_TYPE: l2 + # + TUNER_MODEL: + SC_TUNER_CFG: + NAME: SCTuner + TUNER_NAME: SCEAdapter + DOWN_RATIO: 1.0 + # + SAMPLE_ARGS: + SAMPLER: ddim + SAMPLE_STEPS: 50 + SEED: 2023 + GUIDE_SCALE: 7.5 + GUIDE_RESCALE: 0.5 + DISCRETIZATION: trailing + IMAGE_SIZE: [768, 768] + RUN_TRAIN_N: False + # + OPTIMIZER: + NAME: AdamW + LEARNING_RATE: 0.064 + BETAS: [ 0.9, 0.999 ] + EPS: 1e-8 + WEIGHT_DECAY: 1e-2 + AMSGRAD: False + # + TRAIN_DATA: + NAME: ImageTextPairMSDataset + MODE: train + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_DATASET_SPLIT: train_short + MS_REMAP_KEYS: { 'Image:FILE': 'Target:FILE' } + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 1 + NUM_WORKERS: 4 + SAMPLER: + NAME: LoopSampler + TRANSFORMS: + - NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - NAME: Resize + SIZE: 768 + INTERPOLATION: bilinear + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: CenterCrop + SIZE: 768 + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: ImageToTensor + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'image' ] + BACKEND: torchvision + - NAME: Select + KEYS: [ 'image', 'prompt' ] + META_KEYS: [ 'data_key' ] + # + EVAL_DATA: + NAME: ImageTextPairMSDataset + MODE: eval + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_REMAP_KEYS: { 'Image': 'Target:FILE' } + MS_DATASET_SPLIT: test_short + OUTPUT_SIZE: [768, 768] + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 4 + NUM_WORKERS: 4 + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + TRANSFORMS: + - + NAME: Select + KEYS: ['prompt'] + META_KEYS: ['image_size'] + # + TRAIN_HOOKS: + - + NAME: BackwardHook + PRIORITY: 0 + - + NAME: LogHook + LOG_INTERVAL: 50 + - + NAME: CheckpointHook + INTERVAL: 1000 + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 + # + EVAL_HOOKS: + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 diff --git a/scepter/methods/SCEdit/t2i_sd21_768_sce.yaml b/scepter/methods/scedit/t2i/sd21_768_sce_t2i_swift.yaml similarity index 98% rename from scepter/methods/SCEdit/t2i_sd21_768_sce.yaml rename to scepter/methods/scedit/t2i/sd21_768_sce_t2i_swift.yaml index 96b15c8..304c83c 100644 --- a/scepter/methods/SCEdit/t2i_sd21_768_sce.yaml +++ b/scepter/methods/scedit/t2i/sd21_768_sce_t2i_swift.yaml @@ -15,14 +15,14 @@ SOLVER: ACCU_STEP: 1 EVAL_INTERVAL: 100 # - WORK_DIR: ./cache/t2i_sd21_768_sce + WORK_DIR: ./cache/save_data/sd21_768_sce_t2i_swift LOG_FILE: std_log.txt # FILE_SYSTEM: NAME: "ModelscopeFs" TEMP_DIR: "./cache/data" # - TUNER: + TUNER: - NAME: SwiftSCETuning DIMS: [1280, 1280, 1280, 1280, 1280, 640, 640, 640, 320, 320, 320, 320] @@ -121,7 +121,7 @@ SOLVER: SAMPLE_STEPS: 50 SEED: 2023 GUIDE_SCALE: 7.5 - GUIDE_RESCALE: + GUIDE_RESCALE: 0.5 DISCRETIZATION: trailing IMAGE_SIZE: [768, 768] RUN_TRAIN_N: False diff --git a/scepter/methods/scedit/t2i/sdxl_1024_sce_t2i.yaml b/scepter/methods/scedit/t2i/sdxl_1024_sce_t2i.yaml new file mode 100644 index 0000000..2980236 --- /dev/null +++ b/scepter/methods/scedit/t2i/sdxl_1024_sce_t2i.yaml @@ -0,0 +1,342 @@ +ENV: + BACKEND: nccl +SOLVER: + NAME: LatentDiffusionSolver + RESUME_FROM: + LOAD_MODEL_ONLY: True + USE_FSDP: False + SHARDING_STRATEGY: + USE_AMP: True + DTYPE: float16 + CHANNELS_LAST: True + MAX_STEPS: 2000 + MAX_EPOCHS: -1 + NUM_FOLDS: 1 + ACCU_STEP: 1 + EVAL_INTERVAL: 100 + # + WORK_DIR: ./cache/save_data/sdxl_1024_sce_t2i + LOG_FILE: std_log.txt + # + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + FREEZE: + FREEZE_PART: [ "first_stage_model", "cond_stage_model", "model" ] + TRAIN_PART: [ "lsc_identity" ] + # + MODEL: + NAME: LatentDiffusionXLSCETuning + PARAMETERIZATION: eps + TIMESTEPS: 1000 + MIN_SNR_GAMMA: + ZERO_TERMINAL_SNR: False + PRETRAINED_MODEL: ms://AI-ModelScope/stable-diffusion-xl-base-1.0@sd_xl_base_1.0.safetensors + IGNORE_KEYS: [ ] + SCALE_FACTOR: 0.13025 + SIZE_FACTOR: 8 + # DEFAULT_N_PROMPT: 'lowres, error, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, out of frame, extra fingers, mutated hands, poorly drawn hands, poorly drawn face, mutation, deformed, blurry, dehydrated, bad anatomy, bad proportions, extra limbs, cloned face, disfigured, gross proportions, malformed limbs, missing arms, missing legs, extra arms, extra legs, fused fingers, too many fingers, long neck, username, watermark, signature' + DEFAULT_N_PROMPT: + SCHEDULE_ARGS: + "NAME": "scaled_linear" + "BETA_MIN": 0.00085 + "BETA_MAX": 0.0120 + USE_EMA: False + LOAD_REFINER: False + # + DIFFUSION_MODEL: + NAME: DiffusionUNetXL + PRETRAINED_MODEL: + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + NUM_RES_BLOCKS: 2 + MODEL_CHANNELS: 320 + ATTENTION_RESOLUTIONS: [ 4, 2 ] + DROPOUT: 0 + CHANNEL_MULT: [ 1, 2, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + NUM_CLASSES: sequential + USE_CHECKPOINT: False + NUM_HEADS: -1 + NUM_HEADS_CHANNELS: 64 + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_NEW_ATTENTION_ORDER: True + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: [ 1, 2, 10 ] + CONTEXT_DIM: 2048 + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: True + ADM_IN_CHANNELS: 2816 + USE_SENTENCE_EMB: False + USE_WORD_MAPPING: False + # + FIRST_STAGE_MODEL: + NAME: AutoencoderKL + EMBED_DIM: 4 + PRETRAINED_MODEL: + IGNORE_KEYS: [] + BATCH_SIZE: 1 + # + ENCODER: + NAME: Encoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DOUBLE_Z: True + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + # + DECODER: + NAME: Decoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + GIVE_PRE_END: False + TANH_OUT: False + # + COND_STAGE_MODEL: + NAME: GeneralConditioner + PRETRAINED_MODEL: + EMBEDDERS: + - + NAME: FrozenCLIPEmbedder + PRETRAINED_MODEL: ms://AI-ModelScope/clip-vit-large-patch14 + TOKENIZER_PATH: ms://AI-ModelScope/clip-vit-large-patch14 + MAX_LENGTH: 77 + FREEZE: True + LAYER: hidden + LAYER_IDX: 11 + USE_FINAL_LAYER_NORM: False + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "prompt" ] + LEGACY_UCG_VALUE: + - + NAME: FrozenOpenCLIPEmbedder2 + ARCH: ViT-bigG-14 + PRETRAINED_MODEL: + MAX_LENGTH: 77 + FREEZE: True + ALWAYS_RETURN_POOLED: True + LEGACY: False + LAYER: penultimate + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "prompt" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "original_size_as_tuple" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "crop_coords_top_left" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "target_size_as_tuple" ] + LEGACY_UCG_VALUE: + # + REFINER_MODEL: + NAME: DiffusionUNetXL + PRETRAINED_MODEL: + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + NUM_RES_BLOCKS: 2 + MODEL_CHANNELS: 384 + ATTENTION_RESOLUTIONS: [ 4, 2 ] + DROPOUT: 0 + CHANNEL_MULT: [ 1, 2, 4, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + NUM_CLASSES: sequential + USE_CHECKPOINT: False + NUM_HEADS: -1 + NUM_HEADS_CHANNELS: 64 + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_NEW_ATTENTION_ORDER: True + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: 4 + CONTEXT_DIM: [ 1280, 1280, 1280, 1280 ] + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: True + ADM_IN_CHANNELS: 2560 + USE_SENTENCE_EMB: False + USE_WORD_MAPPING: False + REFINER_COND_MODEL: + NAME: GeneralConditioner + PRETRAINED_MODEL: + EMBEDDERS: + - + NAME: FrozenOpenCLIPEmbedder2 + ARCH: ViT-bigG-14 + PRETRAINED_MODEL: + MAX_LENGTH: 77 + FREEZE: True + ALWAYS_RETURN_POOLED: True + LEGACY: False + LAYER: penultimate + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "prompt" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "original_size_as_tuple" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "crop_coords_top_left" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "aesthetic_score" ] + LEGACY_UCG_VALUE: + # + LOSS: + NAME: ReconstructLoss + LOSS_TYPE: l2 + # + TUNER_MODEL: + SC_TUNER_CFG: + NAME: SCTuner + TUNER_NAME: SCEAdapter + DOWN_RATIO: 1.0 + # + SAMPLE_ARGS: + SAMPLER: ddim + SAMPLE_STEPS: 50 + SEED: 2023 + GUIDE_SCALE: 7.5 + GUIDE_RESCALE: 0.5 + DISCRETIZATION: trailing + IMAGE_SIZE: [1024, 1024] + RUN_TRAIN_N: False + # + OPTIMIZER: + NAME: AdamW + LEARNING_RATE: 0.064 + BETAS: [ 0.9, 0.999 ] + EPS: 1e-8 + WEIGHT_DECAY: 1e-2 + AMSGRAD: False + # + TRAIN_DATA: + NAME: ImageTextPairMSDataset + MODE: train + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_DATASET_SPLIT: train_short + MS_REMAP_KEYS: { 'Image:FILE': 'Target:FILE' } + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 1 + NUM_WORKERS: 4 + SAMPLER: + NAME: LoopSampler + TRANSFORMS: + - NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - NAME: FlexibleResize + INTERPOLATION: bicubic + SIZE: 1024 + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: FlexibleCropXL + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: ImageToTensor + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: torchvision + - NAME: Select + KEYS: [ 'img', 'prompt', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left' ] + META_KEYS: [ 'data_key', 'img_path' ] + - NAME: Rename + INPUT_KEY: [ 'img', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left' ] + OUTPUT_KEY: [ 'image', 'original_size_as_tuple', 'target_size_as_tuple', 'crop_coords_top_left' ] + # + EVAL_DATA: + NAME: ImageTextPairMSDataset + MODE: eval + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_REMAP_KEYS: { 'Image': 'Target:FILE' } + MS_DATASET_SPLIT: test_short + OUTPUT_SIZE: [ 1024, 1024 ] + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 4 + NUM_WORKERS: 4 + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + TRANSFORMS: + - NAME: Select + KEYS: [ 'prompt' ] + META_KEYS: [ 'image_size' ] + # + TRAIN_HOOKS: + - + NAME: BackwardHook + PRIORITY: 0 + - + NAME: LogHook + LOG_INTERVAL: 50 + - + NAME: CheckpointHook + INTERVAL: 1000 + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 + # + EVAL_HOOKS: + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 diff --git a/scepter/methods/scedit/t2i/sdxl_1024_sce_t2i_datatxt.yaml b/scepter/methods/scedit/t2i/sdxl_1024_sce_t2i_datatxt.yaml new file mode 100644 index 0000000..49cca0b --- /dev/null +++ b/scepter/methods/scedit/t2i/sdxl_1024_sce_t2i_datatxt.yaml @@ -0,0 +1,355 @@ +ENV: + BACKEND: nccl +SOLVER: + NAME: LatentDiffusionSolver + RESUME_FROM: + LOAD_MODEL_ONLY: True + USE_FSDP: False + SHARDING_STRATEGY: + USE_AMP: True + DTYPE: float16 + CHANNELS_LAST: True + MAX_STEPS: 2000 + MAX_EPOCHS: -1 + NUM_FOLDS: 1 + ACCU_STEP: 1 + EVAL_INTERVAL: 100 + # + WORK_DIR: ./cache/save_data/sdxl_1024_sce_t2i_datatxt + LOG_FILE: std_log.txt + # + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + FREEZE: + FREEZE_PART: [ "first_stage_model", "cond_stage_model", "model" ] + TRAIN_PART: [ "lsc_identity" ] + # + MODEL: + NAME: LatentDiffusionXLSCETuning + PARAMETERIZATION: eps + TIMESTEPS: 1000 + MIN_SNR_GAMMA: + ZERO_TERMINAL_SNR: False + PRETRAINED_MODEL: ms://AI-ModelScope/stable-diffusion-xl-base-1.0@sd_xl_base_1.0.safetensors + IGNORE_KEYS: [ ] + SCALE_FACTOR: 0.13025 + SIZE_FACTOR: 8 + # DEFAULT_N_PROMPT: 'lowres, error, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, out of frame, extra fingers, mutated hands, poorly drawn hands, poorly drawn face, mutation, deformed, blurry, dehydrated, bad anatomy, bad proportions, extra limbs, cloned face, disfigured, gross proportions, malformed limbs, missing arms, missing legs, extra arms, extra legs, fused fingers, too many fingers, long neck, username, watermark, signature' + DEFAULT_N_PROMPT: + SCHEDULE_ARGS: + "NAME": "scaled_linear" + "BETA_MIN": 0.00085 + "BETA_MAX": 0.0120 + USE_EMA: False + LOAD_REFINER: False + # + DIFFUSION_MODEL: + NAME: DiffusionUNetXL + PRETRAINED_MODEL: + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + NUM_RES_BLOCKS: 2 + MODEL_CHANNELS: 320 + ATTENTION_RESOLUTIONS: [ 4, 2 ] + DROPOUT: 0 + CHANNEL_MULT: [ 1, 2, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + NUM_CLASSES: sequential + USE_CHECKPOINT: False + NUM_HEADS: -1 + NUM_HEADS_CHANNELS: 64 + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_NEW_ATTENTION_ORDER: True + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: [ 1, 2, 10 ] + CONTEXT_DIM: 2048 + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: True + ADM_IN_CHANNELS: 2816 + USE_SENTENCE_EMB: False + USE_WORD_MAPPING: False + # + FIRST_STAGE_MODEL: + NAME: AutoencoderKL + EMBED_DIM: 4 + PRETRAINED_MODEL: + IGNORE_KEYS: [] + BATCH_SIZE: 1 + # + ENCODER: + NAME: Encoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DOUBLE_Z: True + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + # + DECODER: + NAME: Decoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + GIVE_PRE_END: False + TANH_OUT: False + # + COND_STAGE_MODEL: + NAME: GeneralConditioner + PRETRAINED_MODEL: + EMBEDDERS: + - + NAME: FrozenCLIPEmbedder + PRETRAINED_MODEL: ms://AI-ModelScope/clip-vit-large-patch14 + TOKENIZER_PATH: ms://AI-ModelScope/clip-vit-large-patch14 + MAX_LENGTH: 77 + FREEZE: True + LAYER: hidden + LAYER_IDX: 11 + USE_FINAL_LAYER_NORM: False + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "prompt" ] + LEGACY_UCG_VALUE: + - + NAME: FrozenOpenCLIPEmbedder2 + ARCH: ViT-bigG-14 + PRETRAINED_MODEL: + MAX_LENGTH: 77 + FREEZE: True + ALWAYS_RETURN_POOLED: True + LEGACY: False + LAYER: penultimate + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "prompt" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "original_size_as_tuple" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "crop_coords_top_left" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "target_size_as_tuple" ] + LEGACY_UCG_VALUE: + # + REFINER_MODEL: + NAME: DiffusionUNetXL + PRETRAINED_MODEL: + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + NUM_RES_BLOCKS: 2 + MODEL_CHANNELS: 384 + ATTENTION_RESOLUTIONS: [ 4, 2 ] + DROPOUT: 0 + CHANNEL_MULT: [ 1, 2, 4, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + NUM_CLASSES: sequential + USE_CHECKPOINT: False + NUM_HEADS: -1 + NUM_HEADS_CHANNELS: 64 + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_NEW_ATTENTION_ORDER: True + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: 4 + CONTEXT_DIM: [ 1280, 1280, 1280, 1280 ] + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: True + ADM_IN_CHANNELS: 2560 + USE_SENTENCE_EMB: False + USE_WORD_MAPPING: False + REFINER_COND_MODEL: + NAME: GeneralConditioner + PRETRAINED_MODEL: + EMBEDDERS: + - + NAME: FrozenOpenCLIPEmbedder2 + ARCH: ViT-bigG-14 + PRETRAINED_MODEL: + MAX_LENGTH: 77 + FREEZE: True + ALWAYS_RETURN_POOLED: True + LEGACY: False + LAYER: penultimate + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "prompt" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "original_size_as_tuple" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "crop_coords_top_left" ] + LEGACY_UCG_VALUE: + - + NAME: ConcatTimestepEmbedderND + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: [ "aesthetic_score" ] + LEGACY_UCG_VALUE: + # + LOSS: + NAME: ReconstructLoss + LOSS_TYPE: l2 + # + TUNER_MODEL: + SC_TUNER_CFG: + NAME: SCTuner + TUNER_NAME: SCEAdapter + DOWN_RATIO: 1.0 + # + SAMPLE_ARGS: + SAMPLER: ddim + SAMPLE_STEPS: 50 + SEED: 2023 + GUIDE_SCALE: 7.5 + GUIDE_RESCALE: 0.5 + DISCRETIZATION: trailing + IMAGE_SIZE: [1024, 1024] + RUN_TRAIN_N: False + # + OPTIMIZER: + NAME: AdamW + LEARNING_RATE: 0.064 + BETAS: [ 0.9, 0.999 ] + EPS: 1e-8 + WEIGHT_DECAY: 1e-2 + AMSGRAD: False + # + TRAIN_DATA: + NAME: ImageTextPairDataset + MODE: train + P_ZERO: 0.0 + PIN_MEMORY: True + BATCH_SIZE: 4 + NUM_WORKERS: 4 + FILE_SYSTEM: + NAME: LocalFs + AUTO_CLEAN: False + SAMPLER: + NAME: MixtureOfSamplers + SUB_SAMPLERS: + - + NAME: MultiLevelBatchSampler + PROB: 1.0 + IMAGE_SIZE: [ 1024, 1024 ] + FIELDS: ["img_path", "width", "height", "prompt"] + DELIMITER: '#;#' + PATH_PREFIX: cache/datasets/3D_example_txt + PROMPT_PREFIX: ' ' + INDEX_FILE: cache/datasets/3D_example_txt/train.txt + # + TRANSFORMS: + - + NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - + NAME: FlexibleResize + INTERPOLATION: bilinear + SIZE: 1024 + INPUT_KEY: ['img'] + OUTPUT_KEY: ['img'] + BACKEND: pillow + - + NAME: FlexibleCropXL + INPUT_KEY: ['img'] + OUTPUT_KEY: ['img'] + BACKEND: pillow + - + NAME: ImageToTensor + INPUT_KEY: ['img'] + OUTPUT_KEY: ['img'] + BACKEND: pillow + - + NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: ['img'] + OUTPUT_KEY: ['img'] + BACKEND: torchvision + - + NAME: Select + KEYS: ['img', 'prompt', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left'] + META_KEYS: [ 'img_path' ] + - + NAME: Rename + INPUT_KEY: ['img', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left'] + OUTPUT_KEY: ['image', 'original_size_as_tuple', 'target_size_as_tuple', 'crop_coords_top_left'] + # + EVAL_DATA: + NAME: Text2ImageDataset + MODE: eval + PROMPT_FILE: cache/datasets/3D_example_txt/test.txt + IMAGE_SIZE: [ 1024, 1024 ] + FIELDS: ["prompt"] + DELIMITER: '#;#' + PROMPT_PREFIX: ' ' + PIN_MEMORY: True + BATCH_SIZE: 4 + NUM_WORKERS: 4 + FILE_SYSTEM: + NAME: LocalFs + AUTO_CLEAN: False + # + TRANSFORMS: + - + NAME: Select + KEYS: ['index', 'prompt'] + META_KEYS: ['image_size'] + # + TRAIN_HOOKS: + - + NAME: BackwardHook + PRIORITY: 0 + - + NAME: LogHook + LOG_INTERVAL: 50 + - + NAME: CheckpointHook + INTERVAL: 1000 + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 + # + EVAL_HOOKS: + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 diff --git a/scepter/methods/SCEdit/t2i_sdxl_1024_sce.yaml b/scepter/methods/scedit/t2i/sdxl_1024_sce_t2i_swift.yaml similarity index 93% rename from scepter/methods/SCEdit/t2i_sdxl_1024_sce.yaml rename to scepter/methods/scedit/t2i/sdxl_1024_sce_t2i_swift.yaml index b167c5e..dd38b0d 100644 --- a/scepter/methods/SCEdit/t2i_sdxl_1024_sce.yaml +++ b/scepter/methods/scedit/t2i/sdxl_1024_sce_t2i_swift.yaml @@ -15,14 +15,14 @@ SOLVER: ACCU_STEP: 1 EVAL_INTERVAL: 100 # - WORK_DIR: ./cache/t2i_sdxl_1024_sce + WORK_DIR: ./cache/save_data/sdxl_1024_sce_t2i_swift LOG_FILE: std_log.txt # FILE_SYSTEM: NAME: "ModelscopeFs" TEMP_DIR: "./cache/data" - # - TUNER: + # + TUNER: - NAME: SwiftSCETuning DIMS: [1280, 1280, 640, 640, 640, 320, 320, 320, 320] @@ -128,7 +128,7 @@ SOLVER: UCG_RATE: 0.0 INPUT_KEYS: [ "prompt" ] LEGACY_UCG_VALUE: - - + - NAME: FrozenOpenCLIPEmbedder2 ARCH: ViT-bigG-14 PRETRAINED_MODEL: @@ -141,21 +141,21 @@ SOLVER: UCG_RATE: 0.0 INPUT_KEYS: [ "prompt" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False UCG_RATE: 0.0 INPUT_KEYS: [ "original_size_as_tuple" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False UCG_RATE: 0.0 INPUT_KEYS: [ "crop_coords_top_left" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False @@ -207,21 +207,21 @@ SOLVER: UCG_RATE: 0.0 INPUT_KEYS: [ "prompt" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False UCG_RATE: 0.0 INPUT_KEYS: [ "original_size_as_tuple" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False UCG_RATE: 0.0 INPUT_KEYS: [ "crop_coords_top_left" ] LEGACY_UCG_VALUE: - - + - NAME: ConcatTimestepEmbedderND OUT_DIM: 256 IS_TRAINABLE: False @@ -237,8 +237,8 @@ SOLVER: SAMPLER: ddim SAMPLE_STEPS: 50 SEED: 2023 - GUIDE_SCALE: 5.0 - GUIDE_RESCALE: + GUIDE_SCALE: 7.5 + GUIDE_RESCALE: 0.5 DISCRETIZATION: trailing IMAGE_SIZE: [1024, 1024] RUN_TRAIN_N: False @@ -294,8 +294,8 @@ SOLVER: KEYS: [ 'img', 'prompt', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left' ] META_KEYS: [ 'data_key', 'img_path' ] - NAME: Rename - IN_KEYS: [ 'img', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left' ] - OUT_KEYS: [ 'image', 'original_size_as_tuple', 'target_size_as_tuple', 'crop_coords_top_left' ] + INPUT_KEY: [ 'img', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left' ] + OUTPUT_KEY: [ 'image', 'original_size_as_tuple', 'target_size_as_tuple', 'crop_coords_top_left' ] # EVAL_DATA: NAME: ImageTextPairMSDataset @@ -321,15 +321,20 @@ SOLVER: META_KEYS: [ 'image_size' ] # TRAIN_HOOKS: - - NAME: BackwardHook + - + NAME: BackwardHook PRIORITY: 0 - - NAME: LogHook + - + NAME: LogHook LOG_INTERVAL: 50 - - NAME: CheckpointHook + - + NAME: CheckpointHook INTERVAL: 1000 - - NAME: ProbeDataHook + - + NAME: ProbeDataHook PROB_INTERVAL: 100 # EVAL_HOOKS: - - NAME: ProbeDataHook - PROB_INTERVAL: 100 \ No newline at end of file + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 diff --git a/scepter/methods/studio/extensions/controllers/official_controllers.yaml b/scepter/methods/studio/extensions/controllers/official_controllers.yaml new file mode 100644 index 0000000..63a8c8d --- /dev/null +++ b/scepter/methods/studio/extensions/controllers/official_controllers.yaml @@ -0,0 +1,19 @@ +CONTROLLERS: + - NAME: canny + NAME_ZH: + DESCRIPTION: + BASE_MODEL: SD2.1 + TYPE: Canny + MODEL_PATH: ms://damo/scepter_scedit@controllable_model/SD2.1/canny_control/0_SwiftSCETuning + - NAME: openpose + NAME_ZH: + DESCRIPTION: + BASE_MODEL: SD2.1 + TYPE: Openpose + MODEL_PATH: ms://damo/scepter_scedit@controllable_model/SD2.1/pose_control/0_SwiftSCETuning + - NAME: color + NAME_ZH: + DESCRIPTION: + BASE_MODEL: SD2.1 + TYPE: Color + MODEL_PATH: ms://damo/scepter_scedit@controllable_model/SD2.1/color_control/0_SwiftSCETuning diff --git a/scepter/methods/studio/extensions/mantra_book/mantra_book.yaml b/scepter/methods/studio/extensions/mantra_book/mantra_book.yaml new file mode 100644 index 0000000..bc3ce95 --- /dev/null +++ b/scepter/methods/studio/extensions/mantra_book/mantra_book.yaml @@ -0,0 +1,6409 @@ +MANTRAS: + - + NAME: cinematic-diva + NAME_ZH: 电影歌星画风 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: UHD, 8K, ultra detailed, a cinematic photograph of {prompt}, beautiful lighting, great composition + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, NSFW + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/967b1852ea26dcf41360fc5542a0df6b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Abstract Expressionism + NAME_ZH: 抽象表现主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Abstract Expressionism Art, {prompt}, High contrast, minimalistic, colorful, stark, dramatic, expressionism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/11667c7a085b53a6ffbb76b83788f8b5.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Academia + NAME_ZH: 学院风 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Academia, {prompt}, preppy Ivy League style, stark, dramatic, chic boarding school, academia + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, grunge, sloppy, unkempt + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/c95197ef78312e2bbd45883bfbfa095a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Action Figure + NAME_ZH: 动作人偶 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Action Figure, {prompt}, plastic collectable action figure, collectable toy action figure + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/24ac67fe21833fc1300fba09d5de6090.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Adorable 3D Character + NAME_ZH: 可爱的3D角色 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Adorable 3D Character, {prompt}, 3D render, adorable character, 3D art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, grunge, sloppy, unkempt, photograph, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/31a0ffbfc93b5b336a3bedc0a9985a02.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Adorable Kawaii + NAME_ZH: 可爱卡哇伊风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Adorable Kawaii, {prompt}, pretty, cute, adorable, kawaii + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, gothic, dark, moody, monochromatic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/82624c429d504c8290d4c9147be64029.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Art Deco + NAME_ZH: 艺术装饰风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Art Deco, {prompt}, sleek, geometric forms, art deco style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/c60ef3e7ada8774c92bb6e73c570f819.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Art Nouveau + NAME_ZH: 新艺术风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Art Nouveau, beautiful art, {prompt}, sleek, organic forms, long, sinuous, art nouveau style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, industrial, mechanical + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/153d83e71fbf145d0aa5c41ecab0a505.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Astral Aura + NAME_ZH: 星体光环 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Astral Aura, {prompt}, astral, colorful aura, vibrant energy + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/e093c9d0f81037002e88f2a6c3f38a55.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Avant-garde + NAME_ZH: 先锋派 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Avant-garde, {prompt}, unusual, experimental, avant-garde art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/9921d1944893466edfc6a060faf4070e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Baroque + NAME_ZH: 巴洛克风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Baroque, {prompt}, dramatic, exuberant, grandeur, baroque art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/d8279be4bb34e5cb00a95919412154a4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Bauhaus-Style Poster + NAME_ZH: 包豪斯风格海报 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Bauhaus-Style Poster, {prompt}, simple geometric shapes, clean lines, primary colors, Bauhaus-Style Poster + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/4bd18b32c23e13b9e4fc7f65a1916eab.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Blueprint Schematic Drawing + NAME_ZH: 蓝图原理图绘制 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Blueprint Schematic Drawing, {prompt}, technical drawing, blueprint, schematic + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/62392c3715267f7162a37a8ff1caa3a1.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Caricature + NAME_ZH: 漫画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Caricature, {prompt}, exaggerated, comical, caricature + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/894f40ed44b37c3372e6a22b8ae577a4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Cel Shaded Art + NAME_ZH: 单色阴影艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Cel Shaded Art, {prompt}, 2D, flat color, toon shading, cel shaded style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/71c2e8a2cd1031b2bfae1640f7b72c88.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Character Design Sheet + NAME_ZH: 角色设计图 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Character Design Sheet, {prompt}, character reference sheet, character turn around + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/eacf2134aa51d4b4a6f2f35cc170f315.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Classicism Art + NAME_ZH: 古典主义艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Classicism Art, {prompt}, inspired by Roman and Greek culture, clarity, harmonious, classicism art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/10025b4f3a09e6134086e3cdec4ef2c8.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Color Field Painting + NAME_ZH: 色域绘画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Color Field Painting, {prompt}, abstract, simple, geometic, color field painting style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/80e5b4075c572c04cbb4e48c37b8366b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Colored Pencil Art + NAME_ZH: 彩色铅笔艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Colored Pencil Art, {prompt}, colored pencil strokes, light color, visible paper texture, colored pencil art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/9ae235d7f1a7c2a4edab52a5e9f9cbae.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Conceptual Art + NAME_ZH: 概念艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Conceptual Art, {prompt}, concept art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/cf2e6781997c6842a16155fdff911ef8.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Constructivism + NAME_ZH: 结构主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Constructivism Art, {prompt}, minimalistic, geometric forms, constructivism art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/d07feccabcadfd3310464bedba858bd1.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Cubism + NAME_ZH: 立体主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Cubism Art, {prompt}, flat geometric forms, cubism art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/aa8313f6c3cb9cafb9a7ec07db78df1c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dadaism + NAME_ZH: 达达主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Dadaism Art, {prompt}, satirical, nonsensical, dadaism art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/db27030369cb3ccb042b8aea6bf635e2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dark Fantasy + NAME_ZH: 黑暗幻想 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Dark Fantasy Art, {prompt}, dark, moody, dark fantasy style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, bright, sunny + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/c88b6e641c707afc0c8d278ba7e1ac19.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dark Moody Atmosphere + NAME_ZH: 暗色忧郁氛围 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Dark Moody Atmosphere, {prompt}, dramatic, mysterious, dark moody atmosphere + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, vibrant, colorful, bright + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/3da915da2f5cedaf243e57e08163f35b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: DMT Art Style + NAME_ZH: DMT艺术风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: DMT Art Style, {prompt}, bright colors, surreal visuals, swirling patterns, DMT art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/d4a823d2bfa912ca4bb56d96f722f08f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Doodle Art + NAME_ZH: 涂鸦艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Doodle Art Style, {prompt}, drawing, freeform, swirling patterns, doodle art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/8e1e21745c149b9634d3ce96fc7d505f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Double Exposure + NAME_ZH: 双重曝光 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Double Exposure Style, {prompt}, double image ghost effect, image combination, double exposure style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/efd7aea4af1c4ede99fdfac17350e264.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dripping Paint Splatter Art + NAME_ZH: 滴漆溅画艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Dripping Paint Splatter Art, {prompt}, dramatic, paint drips, splatters, dripping paint + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/69fd81f5983107acc3d334af62915851.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Expressionism + NAME_ZH: 表现主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Expressionism Art Style, {prompt}, movement, contrast, emotional, exaggerated forms, expressionism art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/3dfa862bd1c80cec237e4a5717cea2bd.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Faded Polaroid Photo + NAME_ZH: 褪色的宝丽来照片 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Faded Polaroid Photo, {prompt}, analog, old faded photo, old polaroid + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, vibrant, colorful + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/f152edb4b3ca6248758b48115258ddfa.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fauvism + NAME_ZH: 野兽派 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Fauvism Art, {prompt}, painterly, bold colors, textured brushwork, fauvism art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/0506b350cadcf8fca42da764cd6fd5bf.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Flat 2D Art + NAME_ZH: 扁平2D艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Flat 2D Art, {prompt}, simple flat color, 2-dimensional, Flat 2D Art Style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, 3D, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/940cfd34155634cf051e1b2942cca426.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fortnite Art Style + NAME_ZH: 堡垒之夜艺术风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Fortnite Art Style, {prompt}, 3D cartoon, colorful, Fortnite Art Style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/156f8d943ff6d283f7a34f265daaa46c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Futurism + NAME_ZH: 未来主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Futurism Art Style, {prompt}, dynamic, dramatic, Futurism Art Style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/855283cc2ab6283b627ef32d06a1ae0f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Glitchcore + NAME_ZH: 故障核心 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Glitchcore Art Style, {prompt}, dynamic, dramatic, distorted, vibrant colors, glitchcore art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/9af62376402a85774179e82cf7e0dc59.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Glo-fi + NAME_ZH: 光环音乐风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Glo-fi Art Style, {prompt}, dynamic, dramatic, vibrant colors, glo-fi art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/275a6e2a3297cec57f9b5a4a17b0f749.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Googie Art Style + NAME_ZH: 古奇艺术风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Googie Art Style, {prompt}, dynamic, dramatic, 1950's futurism, bold boomerang angles, Googie art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/08ee77586d7bec3f6bad7d60cee3c540.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Graffiti Art + NAME_ZH: 涂鸦艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Graffiti Art Style, {prompt}, dynamic, dramatic, vibrant colors, graffiti art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/57b751b11564cb22cd49ef21f2004a5f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Harlem Renaissance Art + NAME_ZH: 哈莱姆文艺复兴艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Harlem Renaissance Art Style, {prompt}, dynamic, dramatic, 1920s African American culture, Harlem Renaissance art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/d09ea3dadcd0a15d8fa247ee74a75e6b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: High Fashion + NAME_ZH: 高级时装 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: High Fashion, {prompt}, dynamic, dramatic, haute couture, elegant, ornate clothing, High Fashion + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/868f752bbb5ef992a0be36d7d13de3be.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Idyllic + NAME_ZH: 田园诗般的 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Idyllic, {prompt}, peaceful, happy, pleasant, happy, harmonious, picturesque, charming + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/55bab29eeb628e7a9ae018e45e7e24db.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Impressionism + NAME_ZH: 印象主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Impressionism, {prompt}, painterly, small brushstrokes, visible brushstrokes, impressionistic style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/0312b673dc6858a9864d7f45f0c5c1fc.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Infographic Drawing + NAME_ZH: 信息图表绘制 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Infographic Drawing, {prompt}, diagram, infographic + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/b09151f6e0883d26056b80fcc9d398bb.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Ink Dripping Drawing + NAME_ZH: 墨水滴画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Ink Dripping Drawing, {prompt}, ink drawing, dripping ink + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, colorful, vibrant + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/5f09912a07e915250a96b2023db15821.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Japanese Ink Drawing + NAME_ZH: 日本墨画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Japanese Ink Drawing, {prompt}, ink drawing, inkwash, Japanese Ink Drawing + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, colorful, vibrant + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/633ad971ff30fe4717782fc6b5f92fda.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Knolling Photography + NAME_ZH: 秩序拍摄 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Knolling Photography, {prompt}, flat lay photography, object arrangment, knolling photography + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/89a205be3a276349ecddf0eeca43ed80.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Light Cheery Atmosphere + NAME_ZH: 轻快愉快的氛围 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Light Cheery Atmosphere, {prompt}, happy, joyful, cheerful, carefree, gleeful, lighthearted, pleasant atmosphere + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, monochromatic, dark, moody + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/0913ac9815f892411f8327a630f51ae4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Logo Design + NAME_ZH: 标志设计 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Logo Design, {prompt}, dynamic graphic art, vector art, minimalist, professional logo design + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/9aa040b0c60d289da9610c91ad9b7c7e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Luxurious Elegance + NAME_ZH: 奢华优雅 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Luxurious Elegance, {prompt}, extravagant, ornate, designer, opulent, picturesque, lavish + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/e796e84ed745150f0d4e28e0ac99b4cf.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Macro Photography + NAME_ZH: 微距摄影 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Macro Photography, {prompt}, close-up, macro 100mm, macro photography + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/92e8b84379828f38e3d01c7272f41b0b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Mandola Art + NAME_ZH: 曼陀罗艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Mandola art style, {prompt}, complex, circular design, mandola + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/dbf5ca944d9213c3181348666cf337ac.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Marker Drawing + NAME_ZH: 马克笔绘图 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Marker Drawing, {prompt}, bold marker lines, visibile paper texture, marker drawing + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photograph, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/c558745f7a4b77d7ca9a428d8874efe4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Medievalism + NAME_ZH: 中世纪主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Medievalism, {prompt}, inspired by The Middle Ages, medieval art, elaborate patterns and decoration, Medievalism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/26aa6244359a4fd87f6438a341057901.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Minimalism + NAME_ZH: 极简主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Minimalism, {prompt}, abstract, simple geometic shapes, hard edges, sleek contours, Minimalism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/dce92a90da6299339cf8e9ebc6596ea2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neo-Baroque + NAME_ZH: 新巴洛克 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Neo-Baroque, {prompt}, ornate and elaborate, dynaimc, Neo-Baroque + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/9b6cd8751b18c65b259769b44cfac351.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neo-Byzantine + NAME_ZH: 新拜占庭 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Neo-Byzantine, {prompt}, grand decorative religious style, Orthodox Christian inspired, Neo-Byzantine + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/99c67768869b546bf527ef0b1735c0d5.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neo-Futurism + NAME_ZH: 新未来主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Neo-Futurism, {prompt}, high-tech, curves, spirals, flowing lines, idealistic future, Neo-Futurism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/bada1534f7a60187f584febcc92f40d1.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neo-Impressionism + NAME_ZH: 新印象主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Neo-Impressionism, {prompt}, tiny dabs of color, Pointillism, painterly, Neo-Impressionism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photograph, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/6bafeac67ce2679b64a86ee1023b53c9.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neo-Rococo + NAME_ZH: 新洛可可 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Neo-Rococo, {prompt}, curved forms, naturalistic ornamentation, elaborate, decorative, gaudy, Neo-Rococo + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/9ab0ad2b88e03933ea479357ff1e4435.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neoclassicism + NAME_ZH: 新古典主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Neoclassicism, {prompt}, ancient Rome and Greece inspired, idealic, sober colors, Neoclassicism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/83a4e3a2ca577400b05a81b5b2b8650e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Op Art + NAME_ZH: 视觉艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Op Art, {prompt}, optical illusion, abstract, geometric pattern, impression of movement, Op Art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/5f11132803dff2de5213293b91d407d7.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Ornate and Intricate + NAME_ZH: 华丽复杂 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Ornate and Intricate, {prompt}, decorative, highly detailed, elaborate, ornate, intricate + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/24b895dca946c8765ad9fa38f720f671.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Pencil Sketch Drawing + NAME_ZH: 铅笔素描 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Pencil Sketch Drawing, {prompt}, black and white drawing, graphite drawing + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/a9056e1eac85e5e4fe96a93917d4cce4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Pop Art 2 + NAME_ZH: 流行艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Pop Art, {prompt}, vivid colors, flat color, 2D, strong lines, Pop Art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/83c4c06c70a48da6558ff970ece247b6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Rococo + NAME_ZH: 洛可可 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Rococo, {prompt}, flamboyant, pastel colors, curved lines, elaborate detail, Rococo + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/4850170f410e10bc833b7d00324dff18.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Silhouette Art + NAME_ZH: 剪影艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Silhouette Art, {prompt}, high contrast, well defined, Silhouette Art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/568777f447fc02510b618152726d5002.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Simple Vector Art + NAME_ZH: 简单矢量艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Simple Vector Art, {prompt}, 2D flat, simple shapes, minimalistic, professional graphic, flat color, high contrast, Simple Vector Art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, 3D, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/24d2ab1fd175bf4e9ef3a8327651dd4b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Sketchup + NAME_ZH: 草图大师 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Sketchup, {prompt}, CAD, professional design, Sketchup + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photo, photograph + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/337dca7ac49cf7820c85ede096ebde9c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Steampunk 2 + NAME_ZH: 蒸汽朋克 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Steampunk, {prompt}, retrofuturistic science fantasy, steam-powered tech, vintage industry, gears, neo-victorian, steampunk + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/07d7b27cd73f2d43684003563511c15b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Surrealism + NAME_ZH: 超现实主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Surrealism, {prompt}, expressive, dramatic, organic lines and forms, dreamlike and mysterious, Surrealism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/38bae70377b323d1a5f5756d7e04886d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Suprematism + NAME_ZH: 至上主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Suprematism, {prompt}, abstract, limited color palette, geometric forms, Suprematism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/c48fbd8cedee84d06b4d875d566f1bb8.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Terragen + NAME_ZH: 地形生成 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Terragen, {prompt}, beautiful massive landscape, epic scenery, Terragen + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/8974cd8e0f38fb7aac117cf0983fc36d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Tranquil Relaxing Atmosphere + NAME_ZH: 宁静放松的氛围 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Tranquil Relaxing Atmosphere, {prompt}, calming style, soothing colors, peaceful, idealic, Tranquil Relaxing Atmosphere + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, oversaturated + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/69170d8443a67be4210af8d5558779c2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Sticker Designs + NAME_ZH: 贴纸设计 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Vector Art Stickers, {prompt}, professional vector design, sticker designs, Sticker Sheet + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/2d1e9867058db2c57f2fe47530de3243.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Vibrant Rim Light + NAME_ZH: 生动的边缘光 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Vibrant Rim Light, {prompt}, bright rim light, high contrast, bold edge light + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/bb08936ca184daba2b30b4a9efb308f2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Volumetric Lighting + NAME_ZH: 体积光照明 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Volumetric Lighting, {prompt}, light depth, dramatic atmospheric lighting, Volumetric Lighting + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/bbad7964a2ae70b66c72804273f11e74.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Watercolor 2 + NAME_ZH: 水彩 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Watercolor style painting, {prompt}, visible paper texture, colorwash, watercolor + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/8859d532ae5901cc8457d6118fb9b7da.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Whimsical and Playful + NAME_ZH: 异想天开和俏皮 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + PROMPT: Whimsical and Playful, {prompt}, imaginative, fantastical, bight colors, stylized, happy, Whimsical and Playful + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, drab, boring, moody + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/af2267f1942e870be957c37cd73d4359.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Enhance + NAME_ZH: 焦点增强 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD_XL1.0 + PROMPT: { + "prompt": null +} + + NEGATIVE_PROMPT: (worst quality, low quality, normal quality, lowres, low details, oversaturated, undersaturated, overexposed, underexposed, grayscale, bw, bad photo, bad photography, bad art:1.4), (watermark, signature, text font, username, error, logo, words, letters, digits, autograph, trademark, name:1.2), (blur, blurry, grainy), morbid, ugly, asymmetrical, mutated malformed, mutilated, poorly lit, bad shadow, draft, cropped, out of frame, cut off, censored, jpeg artifacts, out of focus, glitch, duplicate, (airbrushed, cartoon, anime, semi-realistic, cgi, render, blender, digital art, manga, amateur:1.3), (3D ,3D Game, 3D Game Scene, 3D Character:1.1), (bad hands, bad anatomy, bad body, bad face, bad teeth, bad arms, bad legs, deformities:1.3) + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/e501823a21bbda56592055c9613c1dbb.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Sharp + NAME_ZH: 焦点锐化 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD_XL1.0 + PROMPT: cinematic still {prompt} . emotional, harmonious, vignette, 4k epic detailed, shot on kodak, 35mm photo, sharp focus, high budget, cinemascope, moody, epic, gorgeous, film grain, grainy + NEGATIVE_PROMPT: anime, cartoon, graphic, (blur, blurry, bokeh), text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/393fb7aab57992a1c3af7cbad01c1001.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Masterpiece + NAME_ZH: 焦点杰作 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD_XL1.0 + PROMPT: (masterpiece), (best quality), (ultra-detailed), {prompt}, illustration, disheveled hair, detailed eyes, perfect composition, moist skin, intricate details, earrings, by wlop + NEGATIVE_PROMPT: longbody, lowres, bad anatomy, bad hands, missing fingers, pubic hair,extra digit, fewer digits, cropped, worst quality, low quality + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/9e27c3d1475dacae0ee45cea783aaaf5.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Photograph + NAME_ZH: 焦点摄影 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD_XL1.0 + PROMPT: photograph {prompt}, 50mm . cinematic 4k epic detailed 4k epic detailed photograph shot on kodak detailed cinematic hbo dark moody, 35mm photo, grainy, vignette, vintage, Kodachrome, Lomography, stained, highly detailed, found footage + NEGATIVE_PROMPT: Brad Pitt, bokeh, depth of field, blurry, cropped, regular face, saturated, contrast, deformed iris, deformed pupils, semi-realistic, cgi, 3d, render, sketch, cartoon, drawing, anime, text, cropped, out of frame, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, extra fingers, mutated hands, poorly drawn hands, poorly drawn face, mutation, deformed, dehydrated, bad anatomy, bad proportions, extra limbs, cloned face, disfigured, gross proportions, malformed limbs, missing arms, missing legs, extra arms, extra legs, fused fingers, too many fingers, long neck + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/8b2ea41ec15bf1a16d6a837d46dbc2ac.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Negative + NAME_ZH: 焦点底片 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD_XL1.0 + PROMPT: { + "prompt": null +} + + NEGATIVE_PROMPT: deformed, bad anatomy, disfigured, poorly drawn face, mutated, extra limb, ugly, poorly drawn hands, missing limb, floating limbs, disconnected limbs, disconnected head, malformed hands, long neck, mutated hands and fingers, bad hands, missing fingers, cropped, worst quality, low quality, mutation, poorly drawn, huge calf, bad hands, fused hand, missing hand, disappearing arms, disappearing thigh, disappearing calf, disappearing legs, missing fingers, fused fingers, abnormal eye proportion, Abnormal hands, abnormal legs, abnormal feet, abnormal fingers, drawing, painting, crayon, sketch, graphite, impressionist, noisy, blurry, soft, deformed, ugly, anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/daaec2962291137532189b8a31012532.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Cinematic + NAME_ZH: 焦点电影 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD_XL1.0 + PROMPT: cinematic still {prompt} . emotional, harmonious, vignette, highly detailed, high budget, bokeh, cinemascope, moody, epic, gorgeous, film grain, grainy + NEGATIVE_PROMPT: anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/adc4d52aa5b0afca0593a475ddc9d055.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-cinematic-dynamic + NAME_ZH: MRE电影动态 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: epic cinematic shot of dynamic {prompt} in motion. main subject of high budget action movie. raw photo, motion blur. best quality, high resolution + NEGATIVE_PROMPT: static, still, motionless, sluggish. drawing, painting, illustration, rendered. low budget. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/bd2470068e09d9f1b7d0a690c879b3ce.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-spontaneous-picture + NAME_ZH: MRE自发图片 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: spontaneous picture of {prompt}, taken by talented amateur. best quality, high resolution. magical moment, natural look. simple but good looking + NEGATIVE_PROMPT: overthinked. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/19ad6082cee5516ce330641b515467ef.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-artistic-vision + NAME_ZH: MRE艺术视觉 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: powerful artistic vision of {prompt}. breathtaking masterpiece made by great artist. best quality, high resolution + NEGATIVE_PROMPT: insignificant, flawed, made by bad artist. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/95af94e50bcb91ae8fd2914a3bf13f1e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-dark-dream + NAME_ZH: MRE黑暗梦境 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: dark and unsettling dream showing {prompt}. best quality, high resolution. created by genius but depressed mad artist. grim beauty + NEGATIVE_PROMPT: naive, cheerful. comfortable, casual, boring, cliche. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/572c8c26cc20ac0ee66684e3c5ee4e8c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-gloomy-art + NAME_ZH: MRE忧郁艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: astonishing gloomy art made mainly of shadows and lighting, forming {prompt}. masterful usage of lighting, shadows and chiaroscuro. made by black-hearted artist, drawing from darkness. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/66cbdf819e930f7580bd66a41bde7dfe.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-bad-dream + NAME_ZH: MRE恶梦 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: picture from really bad dream about terrifying {prompt}, true horror. bone-chilling vision. mad world that shouldn't exist. best quality, high resolution + NEGATIVE_PROMPT: nice dream, pleasant experience. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/b92b2bbfc400db9204fe8249354132b4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-underground + NAME_ZH: MRE地下 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: uncanny caliginous vision of {prompt}, created by remarkable underground artist. best quality, high resolution. raw and brutal art, careless but impressive style. inspired by darkness and chaos + NEGATIVE_PROMPT: photography, mainstream, civilized. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/8d46eca558d791a1f2b41b0ed7bba4d2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-surreal-painting + NAME_ZH: MRE超现实绘画 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: surreal painting representing strange vision of {prompt}. harmonious madness, synergy with chance. unique artstyle, mindbending art, magical surrealism. best quality, high resolution + NEGATIVE_PROMPT: photography, illustration, drawing. realistic, possible. logical, sane. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/58858425832b10d233f7887af4a2022f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-dynamic-illustration + NAME_ZH: MRE动态插画 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: insanely dynamic illustration of {prompt}. best quality, high resolution. crazy artstyle, careless brushstrokes, emotional and fun + NEGATIVE_PROMPT: photography, realistic. static, still, slow, boring. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/8bf9861d4d3fadcdb98ceec88a941582.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-undead-art + NAME_ZH: MRE不死艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: long forgotten art created by undead artist illustrating {prompt}, tribute to the death and decay. miserable art of the damned. wretched and decaying world. best quality, high resolution + NEGATIVE_PROMPT: alive, playful, living. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/fada50979ca180006eba9a45a00f3675.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-elemental-art + NAME_ZH: MRE元素艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: art illustrating insane amounts of raging elemental energy turning into {prompt}, avatar of elements. magical surrealism, wizardry. best quality, high resolution + NEGATIVE_PROMPT: photography, realistic, real. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/5895d78cf58c1ca05178991f37cc48ff.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-space-art + NAME_ZH: MRE太空艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: winner of inter-galactic art contest illustrating {prompt}, symbol of the interstellar singularity. best quality, high resolution. artstyle previously unseen in the whole galaxy + NEGATIVE_PROMPT: created by human race, low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/e9815495587895a21d970728474c8be6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-ancient-illustration + NAME_ZH: MRE古代插画 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: sublime ancient illustration of {prompt}, predating human civilization. crude and simple, but also surprisingly beautiful artwork, made by genius primeval artist. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/151e07c17a89ebaf7688905ea0199862.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-brave-art + NAME_ZH: MRE勇敢艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: brave, shocking, and brutally true art showing {prompt}. inspired by courage and unlimited creativity. truth found in chaos. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/1a068f2728327d21ebb99285c2ce1370.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-heroic-fantasy + NAME_ZH: MRE英雄幻想 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: heroic fantasy painting of {prompt}, in the dangerous fantasy world. airbrush over oil on canvas. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/78d05472067e0b86c8270fa5476fcb8e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-dark-cyberpunk + NAME_ZH: MRE黑暗赛博朋克 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: dark cyberpunk illustration of brutal {prompt} in a world without hope, ruled by ruthless criminal corporations. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/a9f50e3162958fd783872d6955ad7d0b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-lyrical-geometry + NAME_ZH: MRE抒情几何 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: geometric and lyrical abstraction painting presenting {prompt}. oil on metal. best quality, high resolution + NEGATIVE_PROMPT: photography, realistic, drawing, rendered. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/dfabd41d3042ced804bc97ae35e3a7cb.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-sumi-e-symbolic + NAME_ZH: MRE墨绘象征 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: big long brushstrokes of deep black sumi-e turning into symbolic painting of {prompt}. master level raw art. best quality, high resolution + NEGATIVE_PROMPT: photography, rendered. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/695b1ba687544eaeec9fb5f871917aeb.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-sumi-e-detailed + NAME_ZH: MRE墨绘精细 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: highly detailed black sumi-e painting of {prompt}. in-depth study of perfection, created by a master. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/16eb95e180385b88794e368b28da1812.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-manga + NAME_ZH: MRE漫画 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: manga artwork presenting {prompt}. created by japanese manga artist. highly emotional. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/ebec631bf467937f82d05958ae59f9dc.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-anime + NAME_ZH: MRE动漫 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: anime artwork illustrating {prompt}. created by japanese anime studio. highly emotional. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/a08149bc8e50f6bc65c0010d4cd416f8.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-comic + NAME_ZH: MRE漫画书 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + PROMPT: breathtaking illustration from adult comic book presenting {prompt}. fabulous artwork. best quality, high resolution + NEGATIVE_PROMPT: deformed, ugly, low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/48c65cebf1fa4284d7b8feb619412e65.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-3d-model + NAME_ZH: SAI三维模型 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: professional 3d model {prompt} . octane render, highly detailed, volumetric, dramatic lighting + NEGATIVE_PROMPT: ugly, deformed, noisy, low poly, blurry, painting + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/c1a765ac089fdfb3c1d11b33c75d2afd.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-analog film + NAME_ZH: SAI模拟胶片 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: analog film photo {prompt} . faded film, desaturated, 35mm photo, grainy, vignette, vintage, Kodachrome, Lomography, stained, highly detailed, found footage + NEGATIVE_PROMPT: painting, drawing, illustration, glitch, deformed, mutated, cross-eyed, ugly, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/3c46d19957efd7fb78f4ab2bdada5468.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-anime + NAME_ZH: SAI动漫 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: anime artwork {prompt} . anime style, key visual, vibrant, studio anime, highly detailed + NEGATIVE_PROMPT: photo, deformed, black and white, realism, disfigured, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/c030e72561eda96abcf738f1370d36ff.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-cinematic + NAME_ZH: SAI电影 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: cinematic film still {prompt} . shallow depth of field, vignette, highly detailed, high budget, bokeh, cinemascope, moody, epic, gorgeous, film grain, grainy + NEGATIVE_PROMPT: anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/d9161c0d5cbf2133b2bfc1021c0c5e2a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-comic book + NAME_ZH: SAI漫画书 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: comic {prompt} . graphic illustration, comic art, graphic novel art, vibrant, highly detailed + NEGATIVE_PROMPT: photograph, deformed, glitch, noisy, realistic, stock photo + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/6759ecb831037367e64c4b36d802be87.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-craft clay + NAME_ZH: SAI手工粘土 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: play-doh style {prompt} . sculpture, clay art, centered composition, Claymation + NEGATIVE_PROMPT: sloppy, messy, grainy, highly detailed, ultra textured, photo + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/8fc51113f725f27326c4398a7457cd6d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-digital art + NAME_ZH: SAI数字艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: concept art {prompt} . digital artwork, illustrative, painterly, matte painting, highly detailed + NEGATIVE_PROMPT: photo, photorealistic, realism, ugly + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/d29adb44458700c4a45ee6edaa04bfb6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-enhance + NAME_ZH: SAI增强 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: breathtaking {prompt} . award-winning, professional, highly detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, distorted, grainy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/2be0de541ff65f8da80ddc24a65c98d8.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-fantasy art + NAME_ZH: SAI幻想艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: ethereal fantasy concept art of {prompt} . magnificent, celestial, ethereal, painterly, epic, majestic, magical, fantasy art, cover art, dreamy + NEGATIVE_PROMPT: photographic, realistic, realism, 35mm film, dslr, cropped, frame, text, deformed, glitch, noise, noisy, off-center, deformed, cross-eyed, closed eyes, bad anatomy, ugly, disfigured, sloppy, duplicate, mutated, black and white + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/a6f8d92afcd5803dfb2ebecbc92091b6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-isometric + NAME_ZH: SAI等距 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: isometric style {prompt} . vibrant, beautiful, crisp, detailed, ultra detailed, intricate + NEGATIVE_PROMPT: deformed, mutated, ugly, disfigured, blur, blurry, noise, noisy, realistic, photographic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/d4e3fcbbfd7b1323bd89decf5d7b0006.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-line art + NAME_ZH: SAI线条艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: line art drawing {prompt} . professional, sleek, modern, minimalist, graphic, line art, vector graphics + NEGATIVE_PROMPT: anime, photorealistic, 35mm film, deformed, glitch, blurry, noisy, off-center, deformed, cross-eyed, closed eyes, bad anatomy, ugly, disfigured, mutated, realism, realistic, impressionism, expressionism, oil, acrylic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/034a51b0dd34b018be8859bf45b4f7ed.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-lowpoly + NAME_ZH: SAI低多边形 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: low-poly style {prompt} . low-poly game art, polygon mesh, jagged, blocky, wireframe edges, centered composition + NEGATIVE_PROMPT: noisy, sloppy, messy, grainy, highly detailed, ultra textured, photo + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/76b9913e9fa5704b6d30adbde9e1f70f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-neonpunk + NAME_ZH: SAI霓虹朋克 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: neonpunk style {prompt} . cyberpunk, vaporwave, neon, vibes, vibrant, stunningly beautiful, crisp, detailed, sleek, ultramodern, magenta highlights, dark purple shadows, high contrast, cinematic, ultra detailed, intricate, professional + NEGATIVE_PROMPT: painting, drawing, illustration, glitch, deformed, mutated, cross-eyed, ugly, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/7e9ed25bb34008beb5f417df63c4b2fe.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-origami + NAME_ZH: SAI折纸 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: origami style {prompt} . paper art, pleated paper, folded, origami art, pleats, cut and fold, centered composition + NEGATIVE_PROMPT: noisy, sloppy, messy, grainy, highly detailed, ultra textured, photo + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/924f46a8f276011a0953d7988e90ee25.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-photographic + NAME_ZH: SAI摄影 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: cinematic photo {prompt} . 35mm photograph, film, bokeh, professional, 4k, highly detailed + NEGATIVE_PROMPT: drawing, painting, crayon, sketch, graphite, impressionist, noisy, blurry, soft, deformed, ugly + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/d6a2d8f3d37cc21c20c5dfc13d000b67.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-pixel art + NAME_ZH: SAI像素艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: pixel-art {prompt} . low-res, blocky, pixel art style, 8-bit graphics + NEGATIVE_PROMPT: sloppy, messy, blurry, noisy, highly detailed, ultra textured, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/a5ab89c0960be8c1216e65c98d92ae4a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-texture + NAME_ZH: SAI质地 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + PROMPT: texture {prompt} top down close-up + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/ebfeab574283fff2ac096e348a585e6d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-advertising + NAME_ZH: 广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: advertising poster style {prompt} . Professional, modern, product-focused, commercial, eye-catching, highly detailed + NEGATIVE_PROMPT: noisy, blurry, amateurish, sloppy, unattractive + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/1aa26a16126e2756bf4bf3fda29baa12.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-automotive + NAME_ZH: 汽车广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: automotive advertisement style {prompt} . sleek, dynamic, professional, commercial, vehicle-focused, high-resolution, highly detailed + NEGATIVE_PROMPT: noisy, blurry, unattractive, sloppy, unprofessional + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/ddc833b36ca23c85a4f6e7bf0088d081.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-corporate + NAME_ZH: 企业广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: corporate branding style {prompt} . professional, clean, modern, sleek, minimalist, business-oriented, highly detailed + NEGATIVE_PROMPT: noisy, blurry, grungy, sloppy, cluttered, disorganized + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/df97fa45c7842296c138aca4057db272.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-fashion editorial + NAME_ZH: 时尚编辑 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: fashion editorial style {prompt} . high fashion, trendy, stylish, editorial, magazine style, professional, highly detailed + NEGATIVE_PROMPT: outdated, blurry, noisy, unattractive, sloppy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/89259be723479cd0b81546b715bea04d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-food photography + NAME_ZH: 食品摄影 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: food photography style {prompt} . appetizing, professional, culinary, high-resolution, commercial, highly detailed + NEGATIVE_PROMPT: unappetizing, sloppy, unprofessional, noisy, blurry + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/33acc98f8615940c8cebbac8ce5297b2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-gourmet food photography + NAME_ZH: 美食摄影 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: gourmet food photo of {prompt} . soft natural lighting, macro details, vibrant colors, fresh ingredients, glistening textures, bokeh background, styled plating, wooden tabletop, garnished, tantalizing, editorial quality + NEGATIVE_PROMPT: cartoon, anime, sketch, grayscale, dull, overexposed, cluttered, messy plate, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/897bbd3f1d232de122796266f3845b50.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-luxury + NAME_ZH: 奢华广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: luxury product style {prompt} . elegant, sophisticated, high-end, luxurious, professional, highly detailed + NEGATIVE_PROMPT: cheap, noisy, blurry, unattractive, amateurish + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/5b33ecc84dc5ff285a0f2e69f43162cb.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-real estate + NAME_ZH: 房地产广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: real estate photography style {prompt} . professional, inviting, well-lit, high-resolution, property-focused, commercial, highly detailed + NEGATIVE_PROMPT: dark, blurry, unappealing, noisy, unprofessional + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/1b99b7bcd0476144d80d066e747d8dfc.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-retail + NAME_ZH: 零售广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: retail packaging style {prompt} . vibrant, enticing, commercial, product-focused, eye-catching, professional, highly detailed + NEGATIVE_PROMPT: noisy, blurry, amateurish, sloppy, unattractive + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/0029e46ef36380dde2084257108f8a6f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-abstract + NAME_ZH: 抽象艺术风格 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: abstract style {prompt} . non-representational, colors and shapes, expression of feelings, imaginative, highly detailed + NEGATIVE_PROMPT: realistic, photographic, figurative, concrete + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/8c401cb0a6ea288230222c4985e78667.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-abstract expressionism + NAME_ZH: 抽象表现主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: abstract expressionist painting {prompt} . energetic brushwork, bold colors, abstract forms, expressive, emotional + NEGATIVE_PROMPT: realistic, photorealistic, low contrast, plain, simple, monochrome + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/9df6635149c576b65d911c2e4cc6a86b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-art deco + NAME_ZH: 艺术装饰风格 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: art deco style {prompt} . geometric shapes, bold colors, luxurious, elegant, decorative, symmetrical, ornate, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, modernist, minimalist + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/82fff8a25de8075777caf14cb3eb5650.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-art nouveau + NAME_ZH: 新艺术风格 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: art nouveau style {prompt} . elegant, decorative, curvilinear forms, nature-inspired, ornate, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, modernist, minimalist + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/84075c5c0cb4b7a2541c6fbca9835cfd.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-constructivist + NAME_ZH: 构成主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: constructivist style {prompt} . geometric shapes, bold colors, dynamic composition, propaganda art style + NEGATIVE_PROMPT: realistic, photorealistic, low contrast, plain, simple, abstract expressionism + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/2a634ad0c89ecefbbea4ce5bcab3d5e5.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-cubist + NAME_ZH: 立体主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: cubist artwork {prompt} . geometric shapes, abstract, innovative, revolutionary + NEGATIVE_PROMPT: anime, photorealistic, 35mm film, deformed, glitch, low contrast, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/2a3d797008c08e12b485d61624741ea6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-expressionist + NAME_ZH: 表现主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: expressionist {prompt} . raw, emotional, dynamic, distortion for emotional effect, vibrant, use of unusual colors, detailed + NEGATIVE_PROMPT: realism, symmetry, quiet, calm, photo + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/83914655659001716a1acede295289d0.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-graffiti + NAME_ZH: 涂鸦 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: graffiti style {prompt} . street art, vibrant, urban, detailed, tag, mural + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/f72a23c7623eb480737eb73c08bf8423.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-hyperrealism + NAME_ZH: 超现实主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: hyperrealistic art {prompt} . extremely high-resolution details, photographic, realism pushed to extreme, fine texture, incredibly lifelike + NEGATIVE_PROMPT: simplified, abstract, unrealistic, impressionistic, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/db378d5a64a8e7ad1e29a4389bda5d1c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-impressionist + NAME_ZH: 印象主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: impressionist painting {prompt} . loose brushwork, vibrant color, light and shadow play, captures feeling over form + NEGATIVE_PROMPT: anime, photorealistic, 35mm film, deformed, glitch, low contrast, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/53b151aec4d5685dfc24511b6705b90e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-pointillism + NAME_ZH: 点彩主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: pointillism style {prompt} . composed entirely of small, distinct dots of color, vibrant, highly detailed + NEGATIVE_PROMPT: line drawing, smooth shading, large color fields, simplistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/23b137a409ee8a8c6ee160c1ddf0659f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-pop art + NAME_ZH: 波普艺术 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: pop Art style {prompt} . bright colors, bold outlines, popular culture themes, ironic or kitsch + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, minimalist + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/bd4faf0e2b7dbc2d0eb21f3ebee97d3d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-psychedelic + NAME_ZH: 迷幻艺术 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: psychedelic style {prompt} . vibrant colors, swirling patterns, abstract forms, surreal, trippy + NEGATIVE_PROMPT: monochrome, black and white, low contrast, realistic, photorealistic, plain, simple + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/7dc0131817f4c31517581dd4a811067b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-renaissance + NAME_ZH: 文艺复兴 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: renaissance style {prompt} . realistic, perspective, light and shadow, religious or mythological themes, highly detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, modernist, minimalist, abstract + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/69796484f61dc2e94d5853f5bbe27c05.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-steampunk + NAME_ZH: 蒸汽朋克 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: steampunk style {prompt} . antique, mechanical, brass and copper tones, gears, intricate, detailed + NEGATIVE_PROMPT: deformed, glitch, noisy, low contrast, anime, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/985005e28858b03c9500a6eb5bd9e201.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-surrealist + NAME_ZH: 超现实主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: surrealist art {prompt} . dreamlike, mysterious, provocative, symbolic, intricate, detailed + NEGATIVE_PROMPT: anime, photorealistic, realistic, deformed, glitch, noisy, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/892d19ec3c429b7148562796df0024db.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-typography + NAME_ZH: 排版艺术 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: typographic art {prompt} . stylized, intricate, detailed, artistic, text-based + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/9adafe1bb169e1ee3f78ba2c1b1cf8d3.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-watercolor + NAME_ZH: 水彩艺术 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: watercolor painting {prompt} . vibrant, beautiful, painterly, detailed, textural, artistic + NEGATIVE_PROMPT: anime, photorealistic, 35mm film, deformed, glitch, low contrast, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/29ca23d7a0397e9beaa72e3b63d17551.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-biomechanical + NAME_ZH: 未来生物力学 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: biomechanical style {prompt} . blend of organic and mechanical elements, futuristic, cybernetic, detailed, intricate + NEGATIVE_PROMPT: natural, rustic, primitive, organic, simplistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/5987795487a3fa74469499ae53963d5d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-biomechanical cyberpunk + NAME_ZH: 未来生物力学赛博朋克 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: biomechanical cyberpunk {prompt} . cybernetics, human-machine fusion, dystopian, organic meets artificial, dark, intricate, highly detailed + NEGATIVE_PROMPT: natural, colorful, deformed, sketch, low contrast, watercolor + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/75b56d7cff9b3f011248b3092ae3b8d2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-cybernetic + NAME_ZH: 未来赛博 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: cybernetic style {prompt} . futuristic, technological, cybernetic enhancements, robotics, artificial intelligence themes + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, historical, medieval + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/47df6db04290f01aeee7381aaf12ec07.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-cybernetic robot + NAME_ZH: 未来机器人 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: cybernetic robot {prompt} . android, AI, machine, metal, wires, tech, futuristic, highly detailed + NEGATIVE_PROMPT: organic, natural, human, sketch, watercolor, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/6f18121b4ba22c8ba7834f404501fa4c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-cyberpunk cityscape + NAME_ZH: 未来赛博朋克城市景观 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: cyberpunk cityscape {prompt} . neon lights, dark alleys, skyscrapers, futuristic, vibrant colors, high contrast, highly detailed + NEGATIVE_PROMPT: natural, rural, deformed, low contrast, black and white, sketch, watercolor + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/5e4107dace2c9dd0217a9d1b18ae28f6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-futuristic + NAME_ZH: 未来主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: futuristic style {prompt} . sleek, modern, ultramodern, high tech, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, vintage, antique + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/8a61c0853ee4079bae96ad502a6ae840.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-retro cyberpunk + NAME_ZH: 未来复古赛博朋克 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: retro cyberpunk {prompt} . 80's inspired, synthwave, neon, vibrant, detailed, retro futurism + NEGATIVE_PROMPT: modern, desaturated, black and white, realism, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/460957bf9a07a58ddec08bf22d5b3698.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-retro futurism + NAME_ZH: 未来复古主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: retro-futuristic {prompt} . vintage sci-fi, 50s and 60s style, atomic age, vibrant, highly detailed + NEGATIVE_PROMPT: contemporary, realistic, rustic, primitive + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/0434a7b23a0f936db615d7a9b8e805f1.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-sci-fi + NAME_ZH: 科幻未来主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: sci-fi style {prompt} . futuristic, technological, alien worlds, space themes, advanced civilizations + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, historical, medieval + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/7c3bde651f426273758b68a2805d0c8a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-vaporwave + NAME_ZH: 未来波 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: vaporwave style {prompt} . retro aesthetic, cyberpunk, vibrant, neon colors, vintage 80s and 90s style, highly detailed + NEGATIVE_PROMPT: monochrome, muted colors, realism, rustic, minimalist, dark + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/1ebb0bf67ee3ef76288b4c0a2a65d557.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-bubble bobble + NAME_ZH: 游戏-泡泡龙 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: Bubble Bobble style {prompt} . 8-bit, cute, pixelated, fantasy, vibrant, reminiscent of Bubble Bobble game + NEGATIVE_PROMPT: realistic, modern, photorealistic, violent, horror + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/19257352df33228555cb350963d9432a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-cyberpunk game + NAME_ZH: 赛博朋克游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: cyberpunk game style {prompt} . neon, dystopian, futuristic, digital, vibrant, detailed, high contrast, reminiscent of cyberpunk genre video games + NEGATIVE_PROMPT: historical, natural, rustic, low detailed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/6165ef47bc859e3dd0e3399ba2264c2b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-fighting game + NAME_ZH: 格斗游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: fighting game style {prompt} . dynamic, vibrant, action-packed, detailed character design, reminiscent of fighting video games + NEGATIVE_PROMPT: peaceful, calm, minimalist, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/aebda69ec1097dc61966995956ae34cc.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-gta + NAME_ZH: 侠盗猎车手游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: GTA-style artwork {prompt} . satirical, exaggerated, pop art style, vibrant colors, iconic characters, action-packed + NEGATIVE_PROMPT: realistic, black and white, low contrast, impressionist, cubist, noisy, blurry, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/edff7ba5fc983468e79e64beb838b829.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-mario + NAME_ZH: 马里奥游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: Super Mario style {prompt} . vibrant, cute, cartoony, fantasy, playful, reminiscent of Super Mario series + NEGATIVE_PROMPT: realistic, modern, horror, dystopian, violent + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/2a229f623ce89160d1f67620599dfc7c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-minecraft + NAME_ZH: 我的世界游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: Minecraft style {prompt} . blocky, pixelated, vibrant colors, recognizable characters and objects, game assets + NEGATIVE_PROMPT: smooth, realistic, detailed, photorealistic, noise, blurry, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/83e77332a9f234fd8c9cddd29e2ec3c7.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-pokemon + NAME_ZH: 宝可梦游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: Pokémon style {prompt} . vibrant, cute, anime, fantasy, reminiscent of Pokémon series + NEGATIVE_PROMPT: realistic, modern, horror, dystopian, violent + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/9bfe2805e6578875a8dfe2a0ea96c281.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-retro arcade + NAME_ZH: 复古街机 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: retro arcade style {prompt} . 8-bit, pixelated, vibrant, classic video game, old school gaming, reminiscent of 80s and 90s arcade games + NEGATIVE_PROMPT: modern, ultra-high resolution, photorealistic, 3D + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/76885e0b110f1fdf3eaee52fbaf27abf.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-retro game + NAME_ZH: 复古游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: retro game art {prompt} . 16-bit, vibrant colors, pixelated, nostalgic, charming, fun + NEGATIVE_PROMPT: realistic, photorealistic, 35mm film, deformed, glitch, low contrast, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/61fbae41c50f56e24dcf20fe3612d456.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-rpg fantasy game + NAME_ZH: 角色扮演幻想游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: role-playing game (RPG) style fantasy {prompt} . detailed, vibrant, immersive, reminiscent of high fantasy RPG games + NEGATIVE_PROMPT: sci-fi, modern, urban, futuristic, low detailed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/34797baf58e32b4e1a37753fe9dcff5c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-strategy game + NAME_ZH: 策略游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: strategy game style {prompt} . overhead view, detailed map, units, reminiscent of real-time strategy video games + NEGATIVE_PROMPT: first-person view, modern, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/0d276527d22510a1b5f8f74eac2790df.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-streetfighter + NAME_ZH: 街头霸王游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: Street Fighter style {prompt} . vibrant, dynamic, arcade, 2D fighting game, highly detailed, reminiscent of Street Fighter series + NEGATIVE_PROMPT: 3D, realistic, modern, photorealistic, turn-based strategy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/f5927fc2b8d4a8212242bd97adcbdfa1.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-zelda + NAME_ZH: 塞尔达传说游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: Legend of Zelda style {prompt} . vibrant, fantasy, detailed, epic, heroic, reminiscent of The Legend of Zelda series + NEGATIVE_PROMPT: sci-fi, modern, realistic, horror + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/4f9eadddbc196268258089b8cc4e5c5c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-architectural + NAME_ZH: 建筑 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: architectural style {prompt} . clean lines, geometric shapes, minimalist, modern, architectural drawing, highly detailed + NEGATIVE_PROMPT: curved lines, ornate, baroque, abstract, grunge + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/488545e9fc9417d62961f42d578547d2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-disco + NAME_ZH: 迪斯科 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: disco-themed {prompt} . vibrant, groovy, retro 70s style, shiny disco balls, neon lights, dance floor, highly detailed + NEGATIVE_PROMPT: minimalist, rustic, monochrome, contemporary, simplistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/784b0ac35e0c0fdb2df21a95d5ca1c55.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-dreamscape + NAME_ZH: 梦境 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: dreamscape {prompt} . surreal, ethereal, dreamy, mysterious, fantasy, highly detailed + NEGATIVE_PROMPT: realistic, concrete, ordinary, mundane + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/2bf77804b5bf352c4e97475b1e8eb29e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-dystopian + NAME_ZH: 反乌托邦 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: dystopian style {prompt} . bleak, post-apocalyptic, somber, dramatic, highly detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, cheerful, optimistic, vibrant, colorful + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/065db0385e126192cbd27e22ca4f154c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-fairy tale + NAME_ZH: 童话故事 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: fairy tale {prompt} . magical, fantastical, enchanting, storybook style, highly detailed + NEGATIVE_PROMPT: realistic, modern, ordinary, mundane + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/578dfe65d9f03e83c95820d4c45cd396.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-gothic + NAME_ZH: 哥特 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: gothic style {prompt} . dark, mysterious, haunting, dramatic, ornate, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, cheerful, optimistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/332a1f8cd655b724cb48bc5c91b764fc.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-grunge + NAME_ZH: 垃圾摇滚 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: grunge style {prompt} . textured, distressed, vintage, edgy, punk rock vibe, dirty, noisy + NEGATIVE_PROMPT: smooth, clean, minimalist, sleek, modern, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/0ccb4c03c6d983b9f6d05ba383f9d690.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-horror + NAME_ZH: 恐怖 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: horror-themed {prompt} . eerie, unsettling, dark, spooky, suspenseful, grim, highly detailed + NEGATIVE_PROMPT: cheerful, bright, vibrant, light-hearted, cute + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/fdca4780d099a39dc50e4553622fba72.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-kawaii + NAME_ZH: 卡哇伊 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: kawaii style {prompt} . cute, adorable, brightly colored, cheerful, anime influence, highly detailed + NEGATIVE_PROMPT: dark, scary, realistic, monochrome, abstract + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/99dab4185e7337189d8959878bfa308b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-lovecraftian + NAME_ZH: 克苏鲁神话 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: lovecraftian horror {prompt} . eldritch, cosmic horror, unknown, mysterious, surreal, highly detailed + NEGATIVE_PROMPT: light-hearted, mundane, familiar, simplistic, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/b7c9d084ed62c1c2e1ea080ad95af61e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-macabre + NAME_ZH: 恐怖的 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: macabre style {prompt} . dark, gothic, grim, haunting, highly detailed + NEGATIVE_PROMPT: bright, cheerful, light-hearted, cartoonish, cute + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/fd7cf2315b27b0434b909020414e1173.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-manga + NAME_ZH: 漫画 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: manga style {prompt} . vibrant, high-energy, detailed, iconic, Japanese comic style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, Western comic style + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/531aac90b321d39221ba7cf70a97b232.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-metropolis + NAME_ZH: 大都市 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: metropolis-themed {prompt} . urban, cityscape, skyscrapers, modern, futuristic, highly detailed + NEGATIVE_PROMPT: rural, natural, rustic, historical, simple + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/eaad79fe3d7160cec6e0656fc3b02d3c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-minimalist + NAME_ZH: 极简主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: minimalist style {prompt} . simple, clean, uncluttered, modern, elegant + NEGATIVE_PROMPT: ornate, complicated, highly detailed, cluttered, disordered, messy, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/e85dd1ccc7f22bdac054d74ba58521b2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-monochrome + NAME_ZH: 单色 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: monochrome {prompt} . black and white, contrast, tone, texture, detailed + NEGATIVE_PROMPT: colorful, vibrant, noisy, blurry, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/cc793ada6b47561f4b63aa66dcd282ac.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-nautical + NAME_ZH: 航海 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: nautical-themed {prompt} . sea, ocean, ships, maritime, beach, marine life, highly detailed + NEGATIVE_PROMPT: landlocked, desert, mountains, urban, rustic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/3d9f6528180670804a2c5e85c7665c42.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-space + NAME_ZH: 太空 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: space-themed {prompt} . cosmic, celestial, stars, galaxies, nebulas, planets, science fiction, highly detailed + NEGATIVE_PROMPT: earthly, mundane, ground-based, realism + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/6f5742d23b43fc99cc01c8b68518df7c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-stained glass + NAME_ZH: 彩色玻璃 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: stained glass style {prompt} . vibrant, beautiful, translucent, intricate, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/ab0512ced9ed572075c49ad4f9f9a45d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-techwear fashion + NAME_ZH: 科技服饰 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: techwear fashion {prompt} . futuristic, cyberpunk, urban, tactical, sleek, dark, highly detailed + NEGATIVE_PROMPT: vintage, rural, colorful, low contrast, realism, sketch, watercolor + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/652a6bdb1b36860041222a458c7915d0.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-tribal + NAME_ZH: 部落 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: tribal style {prompt} . indigenous, ethnic, traditional patterns, bold, natural colors, highly detailed + NEGATIVE_PROMPT: modern, futuristic, minimalist, pastel + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/1ecdaf153ece5e16250b87020b7a209b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-zentangle + NAME_ZH: 禅绕画 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: zentangle {prompt} . intricate, abstract, monochrome, patterns, meditative, highly detailed + NEGATIVE_PROMPT: colorful, representative, simplistic, large fields of color + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/80f3488cdb69f0ff13d83a4feac4499d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-collage + NAME_ZH: 纸艺拼贴 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: collage style {prompt} . mixed media, layered, textural, detailed, artistic + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/c9bbdaba28358faf1a8c1df44b3de950.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-flat papercut + NAME_ZH: 平面剪纸 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: flat papercut style {prompt} . silhouette, clean cuts, paper, sharp edges, minimalist, color block + NEGATIVE_PROMPT: 3D, high detail, noise, grainy, blurry, painting, drawing, photo, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/1bffcd9a4086b29c367b8301f26eed3b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-kirigami + NAME_ZH: 剪纸 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: kirigami representation of {prompt} . 3D, paper folding, paper cutting, Japanese, intricate, symmetrical, precision, clean lines + NEGATIVE_PROMPT: painting, drawing, 2D, noisy, blurry, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/2e5f95977b97b2a6248924e118a23076.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-paper mache + NAME_ZH: 纸浆塑型 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: paper mache representation of {prompt} . 3D, sculptural, textured, handmade, vibrant, fun + NEGATIVE_PROMPT: 2D, flat, photo, sketch, digital art, deformed, noisy, blurry + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/68441f668fcf7a51db5fc9b9d4d45ce7.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-paper quilling + NAME_ZH: 纸卷艺术 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: paper quilling art of {prompt} . intricate, delicate, curling, rolling, shaping, coiling, loops, 3D, dimensional, ornamental + NEGATIVE_PROMPT: photo, painting, drawing, 2D, flat, deformed, noisy, blurry + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/8c0504eb14341b66796612c46bb3748b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-papercut collage + NAME_ZH: 剪纸拼贴 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: papercut collage of {prompt} . mixed media, textured paper, overlapping, asymmetrical, abstract, vibrant + NEGATIVE_PROMPT: photo, 3D, realistic, drawing, painting, high detail, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/217e7c8b905b63c63c94bd6ff8fe3477.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-papercut shadow box + NAME_ZH: 剪纸影箱 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: 3D papercut shadow box of {prompt} . layered, dimensional, depth, silhouette, shadow, papercut, handmade, high contrast + NEGATIVE_PROMPT: painting, drawing, photo, 2D, flat, high detail, blurry, noisy, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/2af0d61de1b17a5a5257f512549f9616.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-stacked papercut + NAME_ZH: 堆叠剪纸 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: stacked papercut art of {prompt} . 3D, layered, dimensional, depth, precision cut, stacked layers, papercut, high contrast + NEGATIVE_PROMPT: 2D, flat, noisy, blurry, painting, drawing, photo, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/62618e32e90539827e0eb279a6ea170a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-thick layered papercut + NAME_ZH: 厚层剪纸 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: thick layered papercut art of {prompt} . deep 3D, volumetric, dimensional, depth, thick paper, high stack, heavy texture, tangible layers + NEGATIVE_PROMPT: 2D, flat, thin paper, low stack, smooth texture, painting, drawing, photo, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/17008c40a6be8d41d3921ee88bac27ad.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-alien + NAME_ZH: 异形 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: alien-themed {prompt} . extraterrestrial, cosmic, otherworldly, mysterious, sci-fi, highly detailed + NEGATIVE_PROMPT: earthly, mundane, common, realistic, simple + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/eae6043dee2b2d94cd9a22cb044db8b3.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-film noir + NAME_ZH: 黑色电影 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: film noir style {prompt} . monochrome, high contrast, dramatic shadows, 1940s style, mysterious, cinematic + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, vibrant, colorful + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/0b3629be5ebb7cda463877a1993a0298.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-glamour + NAME_ZH: 魅力 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: glamorous photo {prompt} . high fashion, luxurious, extravagant, stylish, sensual, opulent, elegance, stunning beauty, professional, high contrast, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, distorted, grainy, sketch, low contrast, dull, plain, modest + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/f85dc6aa5d7f7d6d3663f2270e276796.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-hdr + NAME_ZH: 高动态范围 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: HDR photo of {prompt} . High dynamic range, vivid, rich details, clear shadows and highlights, realistic, intense, enhanced contrast, highly detailed + NEGATIVE_PROMPT: flat, low contrast, oversaturated, underexposed, overexposed, blurred, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/269a98b284ae1345b0e5ac1f85c33179.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-iphone photographic + NAME_ZH: iPhone摄影 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: iphone photo {prompt} . large depth of field, deep depth of field, highly detailed + NEGATIVE_PROMPT: drawing, painting, crayon, sketch, graphite, impressionist, noisy, blurry, soft, deformed, ugly, shallow depth of field, bokeh + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/48c556a6b3c3a533847b80b031cd4962.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-long exposure + NAME_ZH: 长曝光 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: long exposure photo of {prompt} . Blurred motion, streaks of light, surreal, dreamy, ghosting effect, highly detailed + NEGATIVE_PROMPT: static, noisy, deformed, shaky, abrupt, flat, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/fda88c3fc43ea8cc04ce9b5c0261627f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-neon noir + NAME_ZH: 霓虹黑色 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: neon noir {prompt} . cyberpunk, dark, rainy streets, neon signs, high contrast, low light, vibrant, highly detailed + NEGATIVE_PROMPT: bright, sunny, daytime, low contrast, black and white, sketch, watercolor + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/8a5b71434592771e064af4b9017b59d6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-silhouette + NAME_ZH: 剪影 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: silhouette style {prompt} . high contrast, minimalistic, black and white, stark, dramatic + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, color, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/1892a37e66d33cdd9b713aaab6b8c597.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-tilt-shift + NAME_ZH: 倾斜移位 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD_XL1.0 + PROMPT: tilt-shift photo of {prompt} . selective focus, miniature effect, blurred background, highly detailed, vibrant, perspective control + NEGATIVE_PROMPT: blurry, noisy, deformed, flat, low contrast, unrealistic, oversaturated, underexposed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/d058a157de848a5c03d9a3e1e0e560a2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: cinematic-diva + NAME_ZH: 电影歌星画风 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: UHD, 8K, ultra detailed, a cinematic photograph of {prompt}, beautiful lighting, great composition + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, NSFW + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/967b1852ea26dcf41360fc5542a0df6b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Abstract Expressionism + NAME_ZH: 抽象表现主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Abstract Expressionism Art, {prompt}, High contrast, minimalistic, colorful, stark, dramatic, expressionism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/11667c7a085b53a6ffbb76b83788f8b5.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Academia + NAME_ZH: 学院风 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Academia, {prompt}, preppy Ivy League style, stark, dramatic, chic boarding school, academia + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, grunge, sloppy, unkempt + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/c95197ef78312e2bbd45883bfbfa095a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Action Figure + NAME_ZH: 动作人偶 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Action Figure, {prompt}, plastic collectable action figure, collectable toy action figure + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/24ac67fe21833fc1300fba09d5de6090.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Adorable 3D Character + NAME_ZH: 可爱的3D角色 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Adorable 3D Character, {prompt}, 3D render, adorable character, 3D art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, grunge, sloppy, unkempt, photograph, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/31a0ffbfc93b5b336a3bedc0a9985a02.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Adorable Kawaii + NAME_ZH: 可爱卡哇伊风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Adorable Kawaii, {prompt}, pretty, cute, adorable, kawaii + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, gothic, dark, moody, monochromatic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/82624c429d504c8290d4c9147be64029.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Art Deco + NAME_ZH: 艺术装饰风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Art Deco, {prompt}, sleek, geometric forms, art deco style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/c60ef3e7ada8774c92bb6e73c570f819.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Art Nouveau + NAME_ZH: 新艺术风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Art Nouveau, beautiful art, {prompt}, sleek, organic forms, long, sinuous, art nouveau style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, industrial, mechanical + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/153d83e71fbf145d0aa5c41ecab0a505.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Astral Aura + NAME_ZH: 星体光环 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Astral Aura, {prompt}, astral, colorful aura, vibrant energy + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/e093c9d0f81037002e88f2a6c3f38a55.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Avant-garde + NAME_ZH: 先锋派 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Avant-garde, {prompt}, unusual, experimental, avant-garde art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/9921d1944893466edfc6a060faf4070e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Baroque + NAME_ZH: 巴洛克风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Baroque, {prompt}, dramatic, exuberant, grandeur, baroque art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/d8279be4bb34e5cb00a95919412154a4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Bauhaus-Style Poster + NAME_ZH: 包豪斯风格海报 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Bauhaus-Style Poster, {prompt}, simple geometric shapes, clean lines, primary colors, Bauhaus-Style Poster + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/4bd18b32c23e13b9e4fc7f65a1916eab.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Blueprint Schematic Drawing + NAME_ZH: 蓝图原理图绘制 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Blueprint Schematic Drawing, {prompt}, technical drawing, blueprint, schematic + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/62392c3715267f7162a37a8ff1caa3a1.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Caricature + NAME_ZH: 漫画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Caricature, {prompt}, exaggerated, comical, caricature + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/894f40ed44b37c3372e6a22b8ae577a4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Cel Shaded Art + NAME_ZH: 单色阴影艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Cel Shaded Art, {prompt}, 2D, flat color, toon shading, cel shaded style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/71c2e8a2cd1031b2bfae1640f7b72c88.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Character Design Sheet + NAME_ZH: 角色设计图 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Character Design Sheet, {prompt}, character reference sheet, character turn around + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/eacf2134aa51d4b4a6f2f35cc170f315.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Classicism Art + NAME_ZH: 古典主义艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Classicism Art, {prompt}, inspired by Roman and Greek culture, clarity, harmonious, classicism art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/10025b4f3a09e6134086e3cdec4ef2c8.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Color Field Painting + NAME_ZH: 色域绘画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Color Field Painting, {prompt}, abstract, simple, geometic, color field painting style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/80e5b4075c572c04cbb4e48c37b8366b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Colored Pencil Art + NAME_ZH: 彩色铅笔艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Colored Pencil Art, {prompt}, colored pencil strokes, light color, visible paper texture, colored pencil art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/9ae235d7f1a7c2a4edab52a5e9f9cbae.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Conceptual Art + NAME_ZH: 概念艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Conceptual Art, {prompt}, concept art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/cf2e6781997c6842a16155fdff911ef8.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Constructivism + NAME_ZH: 结构主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Constructivism Art, {prompt}, minimalistic, geometric forms, constructivism art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/d07feccabcadfd3310464bedba858bd1.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Cubism + NAME_ZH: 立体主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Cubism Art, {prompt}, flat geometric forms, cubism art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/aa8313f6c3cb9cafb9a7ec07db78df1c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dadaism + NAME_ZH: 达达主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Dadaism Art, {prompt}, satirical, nonsensical, dadaism art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/db27030369cb3ccb042b8aea6bf635e2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dark Fantasy + NAME_ZH: 黑暗幻想 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Dark Fantasy Art, {prompt}, dark, moody, dark fantasy style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, bright, sunny + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/c88b6e641c707afc0c8d278ba7e1ac19.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dark Moody Atmosphere + NAME_ZH: 暗色忧郁氛围 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Dark Moody Atmosphere, {prompt}, dramatic, mysterious, dark moody atmosphere + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, vibrant, colorful, bright + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/3da915da2f5cedaf243e57e08163f35b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: DMT Art Style + NAME_ZH: DMT艺术风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: DMT Art Style, {prompt}, bright colors, surreal visuals, swirling patterns, DMT art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/d4a823d2bfa912ca4bb56d96f722f08f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Doodle Art + NAME_ZH: 涂鸦艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Doodle Art Style, {prompt}, drawing, freeform, swirling patterns, doodle art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/8e1e21745c149b9634d3ce96fc7d505f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Double Exposure + NAME_ZH: 双重曝光 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Double Exposure Style, {prompt}, double image ghost effect, image combination, double exposure style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/efd7aea4af1c4ede99fdfac17350e264.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dripping Paint Splatter Art + NAME_ZH: 滴漆溅画艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Dripping Paint Splatter Art, {prompt}, dramatic, paint drips, splatters, dripping paint + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/69fd81f5983107acc3d334af62915851.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Expressionism + NAME_ZH: 表现主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Expressionism Art Style, {prompt}, movement, contrast, emotional, exaggerated forms, expressionism art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/3dfa862bd1c80cec237e4a5717cea2bd.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Faded Polaroid Photo + NAME_ZH: 褪色的宝丽来照片 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Faded Polaroid Photo, {prompt}, analog, old faded photo, old polaroid + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, vibrant, colorful + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/f152edb4b3ca6248758b48115258ddfa.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fauvism + NAME_ZH: 野兽派 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Fauvism Art, {prompt}, painterly, bold colors, textured brushwork, fauvism art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/0506b350cadcf8fca42da764cd6fd5bf.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Flat 2D Art + NAME_ZH: 扁平2D艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Flat 2D Art, {prompt}, simple flat color, 2-dimensional, Flat 2D Art Style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, 3D, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/940cfd34155634cf051e1b2942cca426.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fortnite Art Style + NAME_ZH: 堡垒之夜艺术风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Fortnite Art Style, {prompt}, 3D cartoon, colorful, Fortnite Art Style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/156f8d943ff6d283f7a34f265daaa46c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Futurism + NAME_ZH: 未来主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Futurism Art Style, {prompt}, dynamic, dramatic, Futurism Art Style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/855283cc2ab6283b627ef32d06a1ae0f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Glitchcore + NAME_ZH: 故障核心 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Glitchcore Art Style, {prompt}, dynamic, dramatic, distorted, vibrant colors, glitchcore art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/9af62376402a85774179e82cf7e0dc59.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Glo-fi + NAME_ZH: 光环音乐风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Glo-fi Art Style, {prompt}, dynamic, dramatic, vibrant colors, glo-fi art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/275a6e2a3297cec57f9b5a4a17b0f749.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Googie Art Style + NAME_ZH: 古奇艺术风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Googie Art Style, {prompt}, dynamic, dramatic, 1950's futurism, bold boomerang angles, Googie art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/08ee77586d7bec3f6bad7d60cee3c540.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Graffiti Art + NAME_ZH: 涂鸦艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Graffiti Art Style, {prompt}, dynamic, dramatic, vibrant colors, graffiti art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/57b751b11564cb22cd49ef21f2004a5f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Harlem Renaissance Art + NAME_ZH: 哈莱姆文艺复兴艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Harlem Renaissance Art Style, {prompt}, dynamic, dramatic, 1920s African American culture, Harlem Renaissance art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/d09ea3dadcd0a15d8fa247ee74a75e6b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: High Fashion + NAME_ZH: 高级时装 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: High Fashion, {prompt}, dynamic, dramatic, haute couture, elegant, ornate clothing, High Fashion + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/868f752bbb5ef992a0be36d7d13de3be.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Idyllic + NAME_ZH: 田园诗般的 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Idyllic, {prompt}, peaceful, happy, pleasant, happy, harmonious, picturesque, charming + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/55bab29eeb628e7a9ae018e45e7e24db.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Impressionism + NAME_ZH: 印象主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Impressionism, {prompt}, painterly, small brushstrokes, visible brushstrokes, impressionistic style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/0312b673dc6858a9864d7f45f0c5c1fc.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Infographic Drawing + NAME_ZH: 信息图表绘制 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Infographic Drawing, {prompt}, diagram, infographic + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/b09151f6e0883d26056b80fcc9d398bb.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Ink Dripping Drawing + NAME_ZH: 墨水滴画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Ink Dripping Drawing, {prompt}, ink drawing, dripping ink + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, colorful, vibrant + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/5f09912a07e915250a96b2023db15821.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Japanese Ink Drawing + NAME_ZH: 日本墨画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Japanese Ink Drawing, {prompt}, ink drawing, inkwash, Japanese Ink Drawing + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, colorful, vibrant + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/633ad971ff30fe4717782fc6b5f92fda.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Knolling Photography + NAME_ZH: 秩序拍摄 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Knolling Photography, {prompt}, flat lay photography, object arrangment, knolling photography + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/89a205be3a276349ecddf0eeca43ed80.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Light Cheery Atmosphere + NAME_ZH: 轻快愉快的氛围 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Light Cheery Atmosphere, {prompt}, happy, joyful, cheerful, carefree, gleeful, lighthearted, pleasant atmosphere + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, monochromatic, dark, moody + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/0913ac9815f892411f8327a630f51ae4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Logo Design + NAME_ZH: 标志设计 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Logo Design, {prompt}, dynamic graphic art, vector art, minimalist, professional logo design + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/9aa040b0c60d289da9610c91ad9b7c7e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Luxurious Elegance + NAME_ZH: 奢华优雅 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Luxurious Elegance, {prompt}, extravagant, ornate, designer, opulent, picturesque, lavish + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/e796e84ed745150f0d4e28e0ac99b4cf.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Macro Photography + NAME_ZH: 微距摄影 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Macro Photography, {prompt}, close-up, macro 100mm, macro photography + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/92e8b84379828f38e3d01c7272f41b0b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Mandola Art + NAME_ZH: 曼陀罗艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Mandola art style, {prompt}, complex, circular design, mandola + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/dbf5ca944d9213c3181348666cf337ac.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Marker Drawing + NAME_ZH: 马克笔绘图 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Marker Drawing, {prompt}, bold marker lines, visibile paper texture, marker drawing + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photograph, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/c558745f7a4b77d7ca9a428d8874efe4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Medievalism + NAME_ZH: 中世纪主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Medievalism, {prompt}, inspired by The Middle Ages, medieval art, elaborate patterns and decoration, Medievalism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/26aa6244359a4fd87f6438a341057901.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Minimalism + NAME_ZH: 极简主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Minimalism, {prompt}, abstract, simple geometic shapes, hard edges, sleek contours, Minimalism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/dce92a90da6299339cf8e9ebc6596ea2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neo-Baroque + NAME_ZH: 新巴洛克 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Neo-Baroque, {prompt}, ornate and elaborate, dynaimc, Neo-Baroque + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/9b6cd8751b18c65b259769b44cfac351.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neo-Byzantine + NAME_ZH: 新拜占庭 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Neo-Byzantine, {prompt}, grand decorative religious style, Orthodox Christian inspired, Neo-Byzantine + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/99c67768869b546bf527ef0b1735c0d5.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neo-Futurism + NAME_ZH: 新未来主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Neo-Futurism, {prompt}, high-tech, curves, spirals, flowing lines, idealistic future, Neo-Futurism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/bada1534f7a60187f584febcc92f40d1.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neo-Impressionism + NAME_ZH: 新印象主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Neo-Impressionism, {prompt}, tiny dabs of color, Pointillism, painterly, Neo-Impressionism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photograph, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/6bafeac67ce2679b64a86ee1023b53c9.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neo-Rococo + NAME_ZH: 新洛可可 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Neo-Rococo, {prompt}, curved forms, naturalistic ornamentation, elaborate, decorative, gaudy, Neo-Rococo + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/9ab0ad2b88e03933ea479357ff1e4435.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neoclassicism + NAME_ZH: 新古典主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Neoclassicism, {prompt}, ancient Rome and Greece inspired, idealic, sober colors, Neoclassicism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/83a4e3a2ca577400b05a81b5b2b8650e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Op Art + NAME_ZH: 视觉艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Op Art, {prompt}, optical illusion, abstract, geometric pattern, impression of movement, Op Art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/5f11132803dff2de5213293b91d407d7.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Ornate and Intricate + NAME_ZH: 华丽复杂 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Ornate and Intricate, {prompt}, decorative, highly detailed, elaborate, ornate, intricate + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/24b895dca946c8765ad9fa38f720f671.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Pencil Sketch Drawing + NAME_ZH: 铅笔素描 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Pencil Sketch Drawing, {prompt}, black and white drawing, graphite drawing + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/a9056e1eac85e5e4fe96a93917d4cce4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Pop Art 2 + NAME_ZH: 流行艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Pop Art, {prompt}, vivid colors, flat color, 2D, strong lines, Pop Art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/83c4c06c70a48da6558ff970ece247b6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Rococo + NAME_ZH: 洛可可 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Rococo, {prompt}, flamboyant, pastel colors, curved lines, elaborate detail, Rococo + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/4850170f410e10bc833b7d00324dff18.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Silhouette Art + NAME_ZH: 剪影艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Silhouette Art, {prompt}, high contrast, well defined, Silhouette Art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/568777f447fc02510b618152726d5002.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Simple Vector Art + NAME_ZH: 简单矢量艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Simple Vector Art, {prompt}, 2D flat, simple shapes, minimalistic, professional graphic, flat color, high contrast, Simple Vector Art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, 3D, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/24d2ab1fd175bf4e9ef3a8327651dd4b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Sketchup + NAME_ZH: 草图大师 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Sketchup, {prompt}, CAD, professional design, Sketchup + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photo, photograph + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/337dca7ac49cf7820c85ede096ebde9c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Steampunk 2 + NAME_ZH: 蒸汽朋克 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Steampunk, {prompt}, retrofuturistic science fantasy, steam-powered tech, vintage industry, gears, neo-victorian, steampunk + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/07d7b27cd73f2d43684003563511c15b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Surrealism + NAME_ZH: 超现实主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Surrealism, {prompt}, expressive, dramatic, organic lines and forms, dreamlike and mysterious, Surrealism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/38bae70377b323d1a5f5756d7e04886d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Suprematism + NAME_ZH: 至上主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Suprematism, {prompt}, abstract, limited color palette, geometric forms, Suprematism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/c48fbd8cedee84d06b4d875d566f1bb8.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Terragen + NAME_ZH: 地形生成 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Terragen, {prompt}, beautiful massive landscape, epic scenery, Terragen + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/8974cd8e0f38fb7aac117cf0983fc36d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Tranquil Relaxing Atmosphere + NAME_ZH: 宁静放松的氛围 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Tranquil Relaxing Atmosphere, {prompt}, calming style, soothing colors, peaceful, idealic, Tranquil Relaxing Atmosphere + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, oversaturated + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/69170d8443a67be4210af8d5558779c2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Sticker Designs + NAME_ZH: 贴纸设计 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Vector Art Stickers, {prompt}, professional vector design, sticker designs, Sticker Sheet + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/2d1e9867058db2c57f2fe47530de3243.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Vibrant Rim Light + NAME_ZH: 生动的边缘光 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Vibrant Rim Light, {prompt}, bright rim light, high contrast, bold edge light + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/bb08936ca184daba2b30b4a9efb308f2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Volumetric Lighting + NAME_ZH: 体积光照明 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Volumetric Lighting, {prompt}, light depth, dramatic atmospheric lighting, Volumetric Lighting + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/bbad7964a2ae70b66c72804273f11e74.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Watercolor 2 + NAME_ZH: 水彩 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Watercolor style painting, {prompt}, visible paper texture, colorwash, watercolor + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/8859d532ae5901cc8457d6118fb9b7da.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Whimsical and Playful + NAME_ZH: 异想天开和俏皮 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + PROMPT: Whimsical and Playful, {prompt}, imaginative, fantastical, bight colors, stylized, happy, Whimsical and Playful + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, drab, boring, moody + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/af2267f1942e870be957c37cd73d4359.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Enhance + NAME_ZH: 焦点增强 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD1.5 + PROMPT: { + "prompt": null +} + + NEGATIVE_PROMPT: (worst quality, low quality, normal quality, lowres, low details, oversaturated, undersaturated, overexposed, underexposed, grayscale, bw, bad photo, bad photography, bad art:1.4), (watermark, signature, text font, username, error, logo, words, letters, digits, autograph, trademark, name:1.2), (blur, blurry, grainy), morbid, ugly, asymmetrical, mutated malformed, mutilated, poorly lit, bad shadow, draft, cropped, out of frame, cut off, censored, jpeg artifacts, out of focus, glitch, duplicate, (airbrushed, cartoon, anime, semi-realistic, cgi, render, blender, digital art, manga, amateur:1.3), (3D ,3D Game, 3D Game Scene, 3D Character:1.1), (bad hands, bad anatomy, bad body, bad face, bad teeth, bad arms, bad legs, deformities:1.3) + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/e501823a21bbda56592055c9613c1dbb.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Sharp + NAME_ZH: 焦点锐化 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD1.5 + PROMPT: cinematic still {prompt} . emotional, harmonious, vignette, 4k epic detailed, shot on kodak, 35mm photo, sharp focus, high budget, cinemascope, moody, epic, gorgeous, film grain, grainy + NEGATIVE_PROMPT: anime, cartoon, graphic, (blur, blurry, bokeh), text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/393fb7aab57992a1c3af7cbad01c1001.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Masterpiece + NAME_ZH: 焦点杰作 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD1.5 + PROMPT: (masterpiece), (best quality), (ultra-detailed), {prompt}, illustration, disheveled hair, detailed eyes, perfect composition, moist skin, intricate details, earrings, by wlop + NEGATIVE_PROMPT: longbody, lowres, bad anatomy, bad hands, missing fingers, pubic hair,extra digit, fewer digits, cropped, worst quality, low quality + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/9e27c3d1475dacae0ee45cea783aaaf5.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Photograph + NAME_ZH: 焦点摄影 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD1.5 + PROMPT: photograph {prompt}, 50mm . cinematic 4k epic detailed 4k epic detailed photograph shot on kodak detailed cinematic hbo dark moody, 35mm photo, grainy, vignette, vintage, Kodachrome, Lomography, stained, highly detailed, found footage + NEGATIVE_PROMPT: Brad Pitt, bokeh, depth of field, blurry, cropped, regular face, saturated, contrast, deformed iris, deformed pupils, semi-realistic, cgi, 3d, render, sketch, cartoon, drawing, anime, text, cropped, out of frame, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, extra fingers, mutated hands, poorly drawn hands, poorly drawn face, mutation, deformed, dehydrated, bad anatomy, bad proportions, extra limbs, cloned face, disfigured, gross proportions, malformed limbs, missing arms, missing legs, extra arms, extra legs, fused fingers, too many fingers, long neck + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/8b2ea41ec15bf1a16d6a837d46dbc2ac.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Negative + NAME_ZH: 焦点底片 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD1.5 + PROMPT: { + "prompt": null +} + + NEGATIVE_PROMPT: deformed, bad anatomy, disfigured, poorly drawn face, mutated, extra limb, ugly, poorly drawn hands, missing limb, floating limbs, disconnected limbs, disconnected head, malformed hands, long neck, mutated hands and fingers, bad hands, missing fingers, cropped, worst quality, low quality, mutation, poorly drawn, huge calf, bad hands, fused hand, missing hand, disappearing arms, disappearing thigh, disappearing calf, disappearing legs, missing fingers, fused fingers, abnormal eye proportion, Abnormal hands, abnormal legs, abnormal feet, abnormal fingers, drawing, painting, crayon, sketch, graphite, impressionist, noisy, blurry, soft, deformed, ugly, anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/daaec2962291137532189b8a31012532.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Cinematic + NAME_ZH: 焦点电影 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD1.5 + PROMPT: cinematic still {prompt} . emotional, harmonious, vignette, highly detailed, high budget, bokeh, cinemascope, moody, epic, gorgeous, film grain, grainy + NEGATIVE_PROMPT: anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/adc4d52aa5b0afca0593a475ddc9d055.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-cinematic-dynamic + NAME_ZH: MRE电影动态 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: epic cinematic shot of dynamic {prompt} in motion. main subject of high budget action movie. raw photo, motion blur. best quality, high resolution + NEGATIVE_PROMPT: static, still, motionless, sluggish. drawing, painting, illustration, rendered. low budget. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/bd2470068e09d9f1b7d0a690c879b3ce.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-spontaneous-picture + NAME_ZH: MRE自发图片 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: spontaneous picture of {prompt}, taken by talented amateur. best quality, high resolution. magical moment, natural look. simple but good looking + NEGATIVE_PROMPT: overthinked. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/19ad6082cee5516ce330641b515467ef.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-artistic-vision + NAME_ZH: MRE艺术视觉 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: powerful artistic vision of {prompt}. breathtaking masterpiece made by great artist. best quality, high resolution + NEGATIVE_PROMPT: insignificant, flawed, made by bad artist. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/95af94e50bcb91ae8fd2914a3bf13f1e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-dark-dream + NAME_ZH: MRE黑暗梦境 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: dark and unsettling dream showing {prompt}. best quality, high resolution. created by genius but depressed mad artist. grim beauty + NEGATIVE_PROMPT: naive, cheerful. comfortable, casual, boring, cliche. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/572c8c26cc20ac0ee66684e3c5ee4e8c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-gloomy-art + NAME_ZH: MRE忧郁艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: astonishing gloomy art made mainly of shadows and lighting, forming {prompt}. masterful usage of lighting, shadows and chiaroscuro. made by black-hearted artist, drawing from darkness. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/66cbdf819e930f7580bd66a41bde7dfe.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-bad-dream + NAME_ZH: MRE恶梦 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: picture from really bad dream about terrifying {prompt}, true horror. bone-chilling vision. mad world that shouldn't exist. best quality, high resolution + NEGATIVE_PROMPT: nice dream, pleasant experience. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/b92b2bbfc400db9204fe8249354132b4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-underground + NAME_ZH: MRE地下 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: uncanny caliginous vision of {prompt}, created by remarkable underground artist. best quality, high resolution. raw and brutal art, careless but impressive style. inspired by darkness and chaos + NEGATIVE_PROMPT: photography, mainstream, civilized. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/8d46eca558d791a1f2b41b0ed7bba4d2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-surreal-painting + NAME_ZH: MRE超现实绘画 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: surreal painting representing strange vision of {prompt}. harmonious madness, synergy with chance. unique artstyle, mindbending art, magical surrealism. best quality, high resolution + NEGATIVE_PROMPT: photography, illustration, drawing. realistic, possible. logical, sane. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/58858425832b10d233f7887af4a2022f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-dynamic-illustration + NAME_ZH: MRE动态插画 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: insanely dynamic illustration of {prompt}. best quality, high resolution. crazy artstyle, careless brushstrokes, emotional and fun + NEGATIVE_PROMPT: photography, realistic. static, still, slow, boring. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/8bf9861d4d3fadcdb98ceec88a941582.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-undead-art + NAME_ZH: MRE不死艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: long forgotten art created by undead artist illustrating {prompt}, tribute to the death and decay. miserable art of the damned. wretched and decaying world. best quality, high resolution + NEGATIVE_PROMPT: alive, playful, living. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/fada50979ca180006eba9a45a00f3675.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-elemental-art + NAME_ZH: MRE元素艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: art illustrating insane amounts of raging elemental energy turning into {prompt}, avatar of elements. magical surrealism, wizardry. best quality, high resolution + NEGATIVE_PROMPT: photography, realistic, real. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/5895d78cf58c1ca05178991f37cc48ff.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-space-art + NAME_ZH: MRE太空艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: winner of inter-galactic art contest illustrating {prompt}, symbol of the interstellar singularity. best quality, high resolution. artstyle previously unseen in the whole galaxy + NEGATIVE_PROMPT: created by human race, low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/e9815495587895a21d970728474c8be6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-ancient-illustration + NAME_ZH: MRE古代插画 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: sublime ancient illustration of {prompt}, predating human civilization. crude and simple, but also surprisingly beautiful artwork, made by genius primeval artist. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/151e07c17a89ebaf7688905ea0199862.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-brave-art + NAME_ZH: MRE勇敢艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: brave, shocking, and brutally true art showing {prompt}. inspired by courage and unlimited creativity. truth found in chaos. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/1a068f2728327d21ebb99285c2ce1370.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-heroic-fantasy + NAME_ZH: MRE英雄幻想 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: heroic fantasy painting of {prompt}, in the dangerous fantasy world. airbrush over oil on canvas. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/78d05472067e0b86c8270fa5476fcb8e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-dark-cyberpunk + NAME_ZH: MRE黑暗赛博朋克 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: dark cyberpunk illustration of brutal {prompt} in a world without hope, ruled by ruthless criminal corporations. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/a9f50e3162958fd783872d6955ad7d0b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-lyrical-geometry + NAME_ZH: MRE抒情几何 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: geometric and lyrical abstraction painting presenting {prompt}. oil on metal. best quality, high resolution + NEGATIVE_PROMPT: photography, realistic, drawing, rendered. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/dfabd41d3042ced804bc97ae35e3a7cb.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-sumi-e-symbolic + NAME_ZH: MRE墨绘象征 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: big long brushstrokes of deep black sumi-e turning into symbolic painting of {prompt}. master level raw art. best quality, high resolution + NEGATIVE_PROMPT: photography, rendered. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/695b1ba687544eaeec9fb5f871917aeb.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-sumi-e-detailed + NAME_ZH: MRE墨绘精细 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: highly detailed black sumi-e painting of {prompt}. in-depth study of perfection, created by a master. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/16eb95e180385b88794e368b28da1812.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-manga + NAME_ZH: MRE漫画 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: manga artwork presenting {prompt}. created by japanese manga artist. highly emotional. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/ebec631bf467937f82d05958ae59f9dc.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-anime + NAME_ZH: MRE动漫 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: anime artwork illustrating {prompt}. created by japanese anime studio. highly emotional. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/a08149bc8e50f6bc65c0010d4cd416f8.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-comic + NAME_ZH: MRE漫画书 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + PROMPT: breathtaking illustration from adult comic book presenting {prompt}. fabulous artwork. best quality, high resolution + NEGATIVE_PROMPT: deformed, ugly, low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/48c65cebf1fa4284d7b8feb619412e65.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-3d-model + NAME_ZH: SAI三维模型 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: professional 3d model {prompt} . octane render, highly detailed, volumetric, dramatic lighting + NEGATIVE_PROMPT: ugly, deformed, noisy, low poly, blurry, painting + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/c1a765ac089fdfb3c1d11b33c75d2afd.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-analog film + NAME_ZH: SAI模拟胶片 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: analog film photo {prompt} . faded film, desaturated, 35mm photo, grainy, vignette, vintage, Kodachrome, Lomography, stained, highly detailed, found footage + NEGATIVE_PROMPT: painting, drawing, illustration, glitch, deformed, mutated, cross-eyed, ugly, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/3c46d19957efd7fb78f4ab2bdada5468.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-anime + NAME_ZH: SAI动漫 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: anime artwork {prompt} . anime style, key visual, vibrant, studio anime, highly detailed + NEGATIVE_PROMPT: photo, deformed, black and white, realism, disfigured, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/c030e72561eda96abcf738f1370d36ff.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-cinematic + NAME_ZH: SAI电影 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: cinematic film still {prompt} . shallow depth of field, vignette, highly detailed, high budget, bokeh, cinemascope, moody, epic, gorgeous, film grain, grainy + NEGATIVE_PROMPT: anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/d9161c0d5cbf2133b2bfc1021c0c5e2a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-comic book + NAME_ZH: SAI漫画书 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: comic {prompt} . graphic illustration, comic art, graphic novel art, vibrant, highly detailed + NEGATIVE_PROMPT: photograph, deformed, glitch, noisy, realistic, stock photo + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/6759ecb831037367e64c4b36d802be87.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-craft clay + NAME_ZH: SAI手工粘土 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: play-doh style {prompt} . sculpture, clay art, centered composition, Claymation + NEGATIVE_PROMPT: sloppy, messy, grainy, highly detailed, ultra textured, photo + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/8fc51113f725f27326c4398a7457cd6d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-digital art + NAME_ZH: SAI数字艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: concept art {prompt} . digital artwork, illustrative, painterly, matte painting, highly detailed + NEGATIVE_PROMPT: photo, photorealistic, realism, ugly + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/d29adb44458700c4a45ee6edaa04bfb6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-enhance + NAME_ZH: SAI增强 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: breathtaking {prompt} . award-winning, professional, highly detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, distorted, grainy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/2be0de541ff65f8da80ddc24a65c98d8.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-fantasy art + NAME_ZH: SAI幻想艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: ethereal fantasy concept art of {prompt} . magnificent, celestial, ethereal, painterly, epic, majestic, magical, fantasy art, cover art, dreamy + NEGATIVE_PROMPT: photographic, realistic, realism, 35mm film, dslr, cropped, frame, text, deformed, glitch, noise, noisy, off-center, deformed, cross-eyed, closed eyes, bad anatomy, ugly, disfigured, sloppy, duplicate, mutated, black and white + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/a6f8d92afcd5803dfb2ebecbc92091b6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-isometric + NAME_ZH: SAI等距 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: isometric style {prompt} . vibrant, beautiful, crisp, detailed, ultra detailed, intricate + NEGATIVE_PROMPT: deformed, mutated, ugly, disfigured, blur, blurry, noise, noisy, realistic, photographic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/d4e3fcbbfd7b1323bd89decf5d7b0006.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-line art + NAME_ZH: SAI线条艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: line art drawing {prompt} . professional, sleek, modern, minimalist, graphic, line art, vector graphics + NEGATIVE_PROMPT: anime, photorealistic, 35mm film, deformed, glitch, blurry, noisy, off-center, deformed, cross-eyed, closed eyes, bad anatomy, ugly, disfigured, mutated, realism, realistic, impressionism, expressionism, oil, acrylic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/034a51b0dd34b018be8859bf45b4f7ed.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-lowpoly + NAME_ZH: SAI低多边形 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: low-poly style {prompt} . low-poly game art, polygon mesh, jagged, blocky, wireframe edges, centered composition + NEGATIVE_PROMPT: noisy, sloppy, messy, grainy, highly detailed, ultra textured, photo + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/76b9913e9fa5704b6d30adbde9e1f70f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-neonpunk + NAME_ZH: SAI霓虹朋克 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: neonpunk style {prompt} . cyberpunk, vaporwave, neon, vibes, vibrant, stunningly beautiful, crisp, detailed, sleek, ultramodern, magenta highlights, dark purple shadows, high contrast, cinematic, ultra detailed, intricate, professional + NEGATIVE_PROMPT: painting, drawing, illustration, glitch, deformed, mutated, cross-eyed, ugly, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/7e9ed25bb34008beb5f417df63c4b2fe.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-origami + NAME_ZH: SAI折纸 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: origami style {prompt} . paper art, pleated paper, folded, origami art, pleats, cut and fold, centered composition + NEGATIVE_PROMPT: noisy, sloppy, messy, grainy, highly detailed, ultra textured, photo + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/924f46a8f276011a0953d7988e90ee25.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-photographic + NAME_ZH: SAI摄影 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: cinematic photo {prompt} . 35mm photograph, film, bokeh, professional, 4k, highly detailed + NEGATIVE_PROMPT: drawing, painting, crayon, sketch, graphite, impressionist, noisy, blurry, soft, deformed, ugly + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/d6a2d8f3d37cc21c20c5dfc13d000b67.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-pixel art + NAME_ZH: SAI像素艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: pixel-art {prompt} . low-res, blocky, pixel art style, 8-bit graphics + NEGATIVE_PROMPT: sloppy, messy, blurry, noisy, highly detailed, ultra textured, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/a5ab89c0960be8c1216e65c98d92ae4a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-texture + NAME_ZH: SAI质地 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + PROMPT: texture {prompt} top down close-up + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/ebfeab574283fff2ac096e348a585e6d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-advertising + NAME_ZH: 广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: advertising poster style {prompt} . Professional, modern, product-focused, commercial, eye-catching, highly detailed + NEGATIVE_PROMPT: noisy, blurry, amateurish, sloppy, unattractive + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/1aa26a16126e2756bf4bf3fda29baa12.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-automotive + NAME_ZH: 汽车广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: automotive advertisement style {prompt} . sleek, dynamic, professional, commercial, vehicle-focused, high-resolution, highly detailed + NEGATIVE_PROMPT: noisy, blurry, unattractive, sloppy, unprofessional + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/ddc833b36ca23c85a4f6e7bf0088d081.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-corporate + NAME_ZH: 企业广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: corporate branding style {prompt} . professional, clean, modern, sleek, minimalist, business-oriented, highly detailed + NEGATIVE_PROMPT: noisy, blurry, grungy, sloppy, cluttered, disorganized + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/df97fa45c7842296c138aca4057db272.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-fashion editorial + NAME_ZH: 时尚编辑 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: fashion editorial style {prompt} . high fashion, trendy, stylish, editorial, magazine style, professional, highly detailed + NEGATIVE_PROMPT: outdated, blurry, noisy, unattractive, sloppy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/89259be723479cd0b81546b715bea04d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-food photography + NAME_ZH: 食品摄影 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: food photography style {prompt} . appetizing, professional, culinary, high-resolution, commercial, highly detailed + NEGATIVE_PROMPT: unappetizing, sloppy, unprofessional, noisy, blurry + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/33acc98f8615940c8cebbac8ce5297b2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-gourmet food photography + NAME_ZH: 美食摄影 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: gourmet food photo of {prompt} . soft natural lighting, macro details, vibrant colors, fresh ingredients, glistening textures, bokeh background, styled plating, wooden tabletop, garnished, tantalizing, editorial quality + NEGATIVE_PROMPT: cartoon, anime, sketch, grayscale, dull, overexposed, cluttered, messy plate, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/897bbd3f1d232de122796266f3845b50.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-luxury + NAME_ZH: 奢华广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: luxury product style {prompt} . elegant, sophisticated, high-end, luxurious, professional, highly detailed + NEGATIVE_PROMPT: cheap, noisy, blurry, unattractive, amateurish + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/5b33ecc84dc5ff285a0f2e69f43162cb.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-real estate + NAME_ZH: 房地产广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: real estate photography style {prompt} . professional, inviting, well-lit, high-resolution, property-focused, commercial, highly detailed + NEGATIVE_PROMPT: dark, blurry, unappealing, noisy, unprofessional + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/1b99b7bcd0476144d80d066e747d8dfc.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-retail + NAME_ZH: 零售广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: retail packaging style {prompt} . vibrant, enticing, commercial, product-focused, eye-catching, professional, highly detailed + NEGATIVE_PROMPT: noisy, blurry, amateurish, sloppy, unattractive + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/0029e46ef36380dde2084257108f8a6f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-abstract + NAME_ZH: 抽象艺术风格 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: abstract style {prompt} . non-representational, colors and shapes, expression of feelings, imaginative, highly detailed + NEGATIVE_PROMPT: realistic, photographic, figurative, concrete + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/8c401cb0a6ea288230222c4985e78667.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-abstract expressionism + NAME_ZH: 抽象表现主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: abstract expressionist painting {prompt} . energetic brushwork, bold colors, abstract forms, expressive, emotional + NEGATIVE_PROMPT: realistic, photorealistic, low contrast, plain, simple, monochrome + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/9df6635149c576b65d911c2e4cc6a86b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-art deco + NAME_ZH: 艺术装饰风格 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: art deco style {prompt} . geometric shapes, bold colors, luxurious, elegant, decorative, symmetrical, ornate, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, modernist, minimalist + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/82fff8a25de8075777caf14cb3eb5650.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-art nouveau + NAME_ZH: 新艺术风格 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: art nouveau style {prompt} . elegant, decorative, curvilinear forms, nature-inspired, ornate, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, modernist, minimalist + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/84075c5c0cb4b7a2541c6fbca9835cfd.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-constructivist + NAME_ZH: 构成主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: constructivist style {prompt} . geometric shapes, bold colors, dynamic composition, propaganda art style + NEGATIVE_PROMPT: realistic, photorealistic, low contrast, plain, simple, abstract expressionism + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/2a634ad0c89ecefbbea4ce5bcab3d5e5.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-cubist + NAME_ZH: 立体主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: cubist artwork {prompt} . geometric shapes, abstract, innovative, revolutionary + NEGATIVE_PROMPT: anime, photorealistic, 35mm film, deformed, glitch, low contrast, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/2a3d797008c08e12b485d61624741ea6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-expressionist + NAME_ZH: 表现主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: expressionist {prompt} . raw, emotional, dynamic, distortion for emotional effect, vibrant, use of unusual colors, detailed + NEGATIVE_PROMPT: realism, symmetry, quiet, calm, photo + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/83914655659001716a1acede295289d0.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-graffiti + NAME_ZH: 涂鸦 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: graffiti style {prompt} . street art, vibrant, urban, detailed, tag, mural + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/f72a23c7623eb480737eb73c08bf8423.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-hyperrealism + NAME_ZH: 超现实主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: hyperrealistic art {prompt} . extremely high-resolution details, photographic, realism pushed to extreme, fine texture, incredibly lifelike + NEGATIVE_PROMPT: simplified, abstract, unrealistic, impressionistic, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/db378d5a64a8e7ad1e29a4389bda5d1c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-impressionist + NAME_ZH: 印象主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: impressionist painting {prompt} . loose brushwork, vibrant color, light and shadow play, captures feeling over form + NEGATIVE_PROMPT: anime, photorealistic, 35mm film, deformed, glitch, low contrast, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/53b151aec4d5685dfc24511b6705b90e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-pointillism + NAME_ZH: 点彩主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: pointillism style {prompt} . composed entirely of small, distinct dots of color, vibrant, highly detailed + NEGATIVE_PROMPT: line drawing, smooth shading, large color fields, simplistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/23b137a409ee8a8c6ee160c1ddf0659f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-pop art + NAME_ZH: 波普艺术 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: pop Art style {prompt} . bright colors, bold outlines, popular culture themes, ironic or kitsch + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, minimalist + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/bd4faf0e2b7dbc2d0eb21f3ebee97d3d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-psychedelic + NAME_ZH: 迷幻艺术 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: psychedelic style {prompt} . vibrant colors, swirling patterns, abstract forms, surreal, trippy + NEGATIVE_PROMPT: monochrome, black and white, low contrast, realistic, photorealistic, plain, simple + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/7dc0131817f4c31517581dd4a811067b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-renaissance + NAME_ZH: 文艺复兴 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: renaissance style {prompt} . realistic, perspective, light and shadow, religious or mythological themes, highly detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, modernist, minimalist, abstract + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/69796484f61dc2e94d5853f5bbe27c05.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-steampunk + NAME_ZH: 蒸汽朋克 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: steampunk style {prompt} . antique, mechanical, brass and copper tones, gears, intricate, detailed + NEGATIVE_PROMPT: deformed, glitch, noisy, low contrast, anime, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/985005e28858b03c9500a6eb5bd9e201.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-surrealist + NAME_ZH: 超现实主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: surrealist art {prompt} . dreamlike, mysterious, provocative, symbolic, intricate, detailed + NEGATIVE_PROMPT: anime, photorealistic, realistic, deformed, glitch, noisy, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/892d19ec3c429b7148562796df0024db.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-typography + NAME_ZH: 排版艺术 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: typographic art {prompt} . stylized, intricate, detailed, artistic, text-based + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/9adafe1bb169e1ee3f78ba2c1b1cf8d3.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-watercolor + NAME_ZH: 水彩艺术 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: watercolor painting {prompt} . vibrant, beautiful, painterly, detailed, textural, artistic + NEGATIVE_PROMPT: anime, photorealistic, 35mm film, deformed, glitch, low contrast, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/29ca23d7a0397e9beaa72e3b63d17551.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-biomechanical + NAME_ZH: 未来生物力学 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: biomechanical style {prompt} . blend of organic and mechanical elements, futuristic, cybernetic, detailed, intricate + NEGATIVE_PROMPT: natural, rustic, primitive, organic, simplistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/5987795487a3fa74469499ae53963d5d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-biomechanical cyberpunk + NAME_ZH: 未来生物力学赛博朋克 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: biomechanical cyberpunk {prompt} . cybernetics, human-machine fusion, dystopian, organic meets artificial, dark, intricate, highly detailed + NEGATIVE_PROMPT: natural, colorful, deformed, sketch, low contrast, watercolor + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/75b56d7cff9b3f011248b3092ae3b8d2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-cybernetic + NAME_ZH: 未来赛博 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: cybernetic style {prompt} . futuristic, technological, cybernetic enhancements, robotics, artificial intelligence themes + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, historical, medieval + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/47df6db04290f01aeee7381aaf12ec07.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-cybernetic robot + NAME_ZH: 未来机器人 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: cybernetic robot {prompt} . android, AI, machine, metal, wires, tech, futuristic, highly detailed + NEGATIVE_PROMPT: organic, natural, human, sketch, watercolor, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/6f18121b4ba22c8ba7834f404501fa4c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-cyberpunk cityscape + NAME_ZH: 未来赛博朋克城市景观 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: cyberpunk cityscape {prompt} . neon lights, dark alleys, skyscrapers, futuristic, vibrant colors, high contrast, highly detailed + NEGATIVE_PROMPT: natural, rural, deformed, low contrast, black and white, sketch, watercolor + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/5e4107dace2c9dd0217a9d1b18ae28f6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-futuristic + NAME_ZH: 未来主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: futuristic style {prompt} . sleek, modern, ultramodern, high tech, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, vintage, antique + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/8a61c0853ee4079bae96ad502a6ae840.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-retro cyberpunk + NAME_ZH: 未来复古赛博朋克 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: retro cyberpunk {prompt} . 80's inspired, synthwave, neon, vibrant, detailed, retro futurism + NEGATIVE_PROMPT: modern, desaturated, black and white, realism, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/460957bf9a07a58ddec08bf22d5b3698.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-retro futurism + NAME_ZH: 未来复古主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: retro-futuristic {prompt} . vintage sci-fi, 50s and 60s style, atomic age, vibrant, highly detailed + NEGATIVE_PROMPT: contemporary, realistic, rustic, primitive + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/0434a7b23a0f936db615d7a9b8e805f1.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-sci-fi + NAME_ZH: 科幻未来主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: sci-fi style {prompt} . futuristic, technological, alien worlds, space themes, advanced civilizations + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, historical, medieval + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/7c3bde651f426273758b68a2805d0c8a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-vaporwave + NAME_ZH: 未来波 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: vaporwave style {prompt} . retro aesthetic, cyberpunk, vibrant, neon colors, vintage 80s and 90s style, highly detailed + NEGATIVE_PROMPT: monochrome, muted colors, realism, rustic, minimalist, dark + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/1ebb0bf67ee3ef76288b4c0a2a65d557.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-bubble bobble + NAME_ZH: 游戏-泡泡龙 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: Bubble Bobble style {prompt} . 8-bit, cute, pixelated, fantasy, vibrant, reminiscent of Bubble Bobble game + NEGATIVE_PROMPT: realistic, modern, photorealistic, violent, horror + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/19257352df33228555cb350963d9432a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-cyberpunk game + NAME_ZH: 赛博朋克游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: cyberpunk game style {prompt} . neon, dystopian, futuristic, digital, vibrant, detailed, high contrast, reminiscent of cyberpunk genre video games + NEGATIVE_PROMPT: historical, natural, rustic, low detailed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/6165ef47bc859e3dd0e3399ba2264c2b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-fighting game + NAME_ZH: 格斗游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: fighting game style {prompt} . dynamic, vibrant, action-packed, detailed character design, reminiscent of fighting video games + NEGATIVE_PROMPT: peaceful, calm, minimalist, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/aebda69ec1097dc61966995956ae34cc.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-gta + NAME_ZH: 侠盗猎车手游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: GTA-style artwork {prompt} . satirical, exaggerated, pop art style, vibrant colors, iconic characters, action-packed + NEGATIVE_PROMPT: realistic, black and white, low contrast, impressionist, cubist, noisy, blurry, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/edff7ba5fc983468e79e64beb838b829.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-mario + NAME_ZH: 马里奥游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: Super Mario style {prompt} . vibrant, cute, cartoony, fantasy, playful, reminiscent of Super Mario series + NEGATIVE_PROMPT: realistic, modern, horror, dystopian, violent + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/2a229f623ce89160d1f67620599dfc7c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-minecraft + NAME_ZH: 我的世界游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: Minecraft style {prompt} . blocky, pixelated, vibrant colors, recognizable characters and objects, game assets + NEGATIVE_PROMPT: smooth, realistic, detailed, photorealistic, noise, blurry, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/83e77332a9f234fd8c9cddd29e2ec3c7.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-pokemon + NAME_ZH: 宝可梦游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: Pokémon style {prompt} . vibrant, cute, anime, fantasy, reminiscent of Pokémon series + NEGATIVE_PROMPT: realistic, modern, horror, dystopian, violent + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/9bfe2805e6578875a8dfe2a0ea96c281.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-retro arcade + NAME_ZH: 复古街机 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: retro arcade style {prompt} . 8-bit, pixelated, vibrant, classic video game, old school gaming, reminiscent of 80s and 90s arcade games + NEGATIVE_PROMPT: modern, ultra-high resolution, photorealistic, 3D + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/76885e0b110f1fdf3eaee52fbaf27abf.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-retro game + NAME_ZH: 复古游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: retro game art {prompt} . 16-bit, vibrant colors, pixelated, nostalgic, charming, fun + NEGATIVE_PROMPT: realistic, photorealistic, 35mm film, deformed, glitch, low contrast, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/61fbae41c50f56e24dcf20fe3612d456.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-rpg fantasy game + NAME_ZH: 角色扮演幻想游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: role-playing game (RPG) style fantasy {prompt} . detailed, vibrant, immersive, reminiscent of high fantasy RPG games + NEGATIVE_PROMPT: sci-fi, modern, urban, futuristic, low detailed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/34797baf58e32b4e1a37753fe9dcff5c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-strategy game + NAME_ZH: 策略游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: strategy game style {prompt} . overhead view, detailed map, units, reminiscent of real-time strategy video games + NEGATIVE_PROMPT: first-person view, modern, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/0d276527d22510a1b5f8f74eac2790df.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-streetfighter + NAME_ZH: 街头霸王游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: Street Fighter style {prompt} . vibrant, dynamic, arcade, 2D fighting game, highly detailed, reminiscent of Street Fighter series + NEGATIVE_PROMPT: 3D, realistic, modern, photorealistic, turn-based strategy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/f5927fc2b8d4a8212242bd97adcbdfa1.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-zelda + NAME_ZH: 塞尔达传说游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: Legend of Zelda style {prompt} . vibrant, fantasy, detailed, epic, heroic, reminiscent of The Legend of Zelda series + NEGATIVE_PROMPT: sci-fi, modern, realistic, horror + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/4f9eadddbc196268258089b8cc4e5c5c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-architectural + NAME_ZH: 建筑 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: architectural style {prompt} . clean lines, geometric shapes, minimalist, modern, architectural drawing, highly detailed + NEGATIVE_PROMPT: curved lines, ornate, baroque, abstract, grunge + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/488545e9fc9417d62961f42d578547d2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-disco + NAME_ZH: 迪斯科 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: disco-themed {prompt} . vibrant, groovy, retro 70s style, shiny disco balls, neon lights, dance floor, highly detailed + NEGATIVE_PROMPT: minimalist, rustic, monochrome, contemporary, simplistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/784b0ac35e0c0fdb2df21a95d5ca1c55.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-dreamscape + NAME_ZH: 梦境 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: dreamscape {prompt} . surreal, ethereal, dreamy, mysterious, fantasy, highly detailed + NEGATIVE_PROMPT: realistic, concrete, ordinary, mundane + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/2bf77804b5bf352c4e97475b1e8eb29e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-dystopian + NAME_ZH: 反乌托邦 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: dystopian style {prompt} . bleak, post-apocalyptic, somber, dramatic, highly detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, cheerful, optimistic, vibrant, colorful + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/065db0385e126192cbd27e22ca4f154c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-fairy tale + NAME_ZH: 童话故事 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: fairy tale {prompt} . magical, fantastical, enchanting, storybook style, highly detailed + NEGATIVE_PROMPT: realistic, modern, ordinary, mundane + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/578dfe65d9f03e83c95820d4c45cd396.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-gothic + NAME_ZH: 哥特 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: gothic style {prompt} . dark, mysterious, haunting, dramatic, ornate, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, cheerful, optimistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/332a1f8cd655b724cb48bc5c91b764fc.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-grunge + NAME_ZH: 垃圾摇滚 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: grunge style {prompt} . textured, distressed, vintage, edgy, punk rock vibe, dirty, noisy + NEGATIVE_PROMPT: smooth, clean, minimalist, sleek, modern, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/0ccb4c03c6d983b9f6d05ba383f9d690.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-horror + NAME_ZH: 恐怖 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: horror-themed {prompt} . eerie, unsettling, dark, spooky, suspenseful, grim, highly detailed + NEGATIVE_PROMPT: cheerful, bright, vibrant, light-hearted, cute + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/fdca4780d099a39dc50e4553622fba72.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-kawaii + NAME_ZH: 卡哇伊 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: kawaii style {prompt} . cute, adorable, brightly colored, cheerful, anime influence, highly detailed + NEGATIVE_PROMPT: dark, scary, realistic, monochrome, abstract + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/99dab4185e7337189d8959878bfa308b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-lovecraftian + NAME_ZH: 克苏鲁神话 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: lovecraftian horror {prompt} . eldritch, cosmic horror, unknown, mysterious, surreal, highly detailed + NEGATIVE_PROMPT: light-hearted, mundane, familiar, simplistic, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/b7c9d084ed62c1c2e1ea080ad95af61e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-macabre + NAME_ZH: 恐怖的 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: macabre style {prompt} . dark, gothic, grim, haunting, highly detailed + NEGATIVE_PROMPT: bright, cheerful, light-hearted, cartoonish, cute + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/fd7cf2315b27b0434b909020414e1173.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-manga + NAME_ZH: 漫画 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: manga style {prompt} . vibrant, high-energy, detailed, iconic, Japanese comic style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, Western comic style + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/531aac90b321d39221ba7cf70a97b232.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-metropolis + NAME_ZH: 大都市 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: metropolis-themed {prompt} . urban, cityscape, skyscrapers, modern, futuristic, highly detailed + NEGATIVE_PROMPT: rural, natural, rustic, historical, simple + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/eaad79fe3d7160cec6e0656fc3b02d3c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-minimalist + NAME_ZH: 极简主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: minimalist style {prompt} . simple, clean, uncluttered, modern, elegant + NEGATIVE_PROMPT: ornate, complicated, highly detailed, cluttered, disordered, messy, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/e85dd1ccc7f22bdac054d74ba58521b2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-monochrome + NAME_ZH: 单色 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: monochrome {prompt} . black and white, contrast, tone, texture, detailed + NEGATIVE_PROMPT: colorful, vibrant, noisy, blurry, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/cc793ada6b47561f4b63aa66dcd282ac.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-nautical + NAME_ZH: 航海 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: nautical-themed {prompt} . sea, ocean, ships, maritime, beach, marine life, highly detailed + NEGATIVE_PROMPT: landlocked, desert, mountains, urban, rustic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/3d9f6528180670804a2c5e85c7665c42.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-space + NAME_ZH: 太空 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: space-themed {prompt} . cosmic, celestial, stars, galaxies, nebulas, planets, science fiction, highly detailed + NEGATIVE_PROMPT: earthly, mundane, ground-based, realism + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/6f5742d23b43fc99cc01c8b68518df7c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-stained glass + NAME_ZH: 彩色玻璃 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: stained glass style {prompt} . vibrant, beautiful, translucent, intricate, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/ab0512ced9ed572075c49ad4f9f9a45d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-techwear fashion + NAME_ZH: 科技服饰 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: techwear fashion {prompt} . futuristic, cyberpunk, urban, tactical, sleek, dark, highly detailed + NEGATIVE_PROMPT: vintage, rural, colorful, low contrast, realism, sketch, watercolor + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/652a6bdb1b36860041222a458c7915d0.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-tribal + NAME_ZH: 部落 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: tribal style {prompt} . indigenous, ethnic, traditional patterns, bold, natural colors, highly detailed + NEGATIVE_PROMPT: modern, futuristic, minimalist, pastel + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/1ecdaf153ece5e16250b87020b7a209b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-zentangle + NAME_ZH: 禅绕画 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: zentangle {prompt} . intricate, abstract, monochrome, patterns, meditative, highly detailed + NEGATIVE_PROMPT: colorful, representative, simplistic, large fields of color + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/80f3488cdb69f0ff13d83a4feac4499d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-collage + NAME_ZH: 纸艺拼贴 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: collage style {prompt} . mixed media, layered, textural, detailed, artistic + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/c9bbdaba28358faf1a8c1df44b3de950.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-flat papercut + NAME_ZH: 平面剪纸 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: flat papercut style {prompt} . silhouette, clean cuts, paper, sharp edges, minimalist, color block + NEGATIVE_PROMPT: 3D, high detail, noise, grainy, blurry, painting, drawing, photo, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/1bffcd9a4086b29c367b8301f26eed3b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-kirigami + NAME_ZH: 剪纸 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: kirigami representation of {prompt} . 3D, paper folding, paper cutting, Japanese, intricate, symmetrical, precision, clean lines + NEGATIVE_PROMPT: painting, drawing, 2D, noisy, blurry, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/2e5f95977b97b2a6248924e118a23076.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-paper mache + NAME_ZH: 纸浆塑型 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: paper mache representation of {prompt} . 3D, sculptural, textured, handmade, vibrant, fun + NEGATIVE_PROMPT: 2D, flat, photo, sketch, digital art, deformed, noisy, blurry + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/68441f668fcf7a51db5fc9b9d4d45ce7.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-paper quilling + NAME_ZH: 纸卷艺术 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: paper quilling art of {prompt} . intricate, delicate, curling, rolling, shaping, coiling, loops, 3D, dimensional, ornamental + NEGATIVE_PROMPT: photo, painting, drawing, 2D, flat, deformed, noisy, blurry + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/8c0504eb14341b66796612c46bb3748b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-papercut collage + NAME_ZH: 剪纸拼贴 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: papercut collage of {prompt} . mixed media, textured paper, overlapping, asymmetrical, abstract, vibrant + NEGATIVE_PROMPT: photo, 3D, realistic, drawing, painting, high detail, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/217e7c8b905b63c63c94bd6ff8fe3477.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-papercut shadow box + NAME_ZH: 剪纸影箱 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: 3D papercut shadow box of {prompt} . layered, dimensional, depth, silhouette, shadow, papercut, handmade, high contrast + NEGATIVE_PROMPT: painting, drawing, photo, 2D, flat, high detail, blurry, noisy, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/2af0d61de1b17a5a5257f512549f9616.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-stacked papercut + NAME_ZH: 堆叠剪纸 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: stacked papercut art of {prompt} . 3D, layered, dimensional, depth, precision cut, stacked layers, papercut, high contrast + NEGATIVE_PROMPT: 2D, flat, noisy, blurry, painting, drawing, photo, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/62618e32e90539827e0eb279a6ea170a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-thick layered papercut + NAME_ZH: 厚层剪纸 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: thick layered papercut art of {prompt} . deep 3D, volumetric, dimensional, depth, thick paper, high stack, heavy texture, tangible layers + NEGATIVE_PROMPT: 2D, flat, thin paper, low stack, smooth texture, painting, drawing, photo, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/17008c40a6be8d41d3921ee88bac27ad.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-alien + NAME_ZH: 异形 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: alien-themed {prompt} . extraterrestrial, cosmic, otherworldly, mysterious, sci-fi, highly detailed + NEGATIVE_PROMPT: earthly, mundane, common, realistic, simple + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/eae6043dee2b2d94cd9a22cb044db8b3.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-film noir + NAME_ZH: 黑色电影 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: film noir style {prompt} . monochrome, high contrast, dramatic shadows, 1940s style, mysterious, cinematic + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, vibrant, colorful + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/0b3629be5ebb7cda463877a1993a0298.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-glamour + NAME_ZH: 魅力 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: glamorous photo {prompt} . high fashion, luxurious, extravagant, stylish, sensual, opulent, elegance, stunning beauty, professional, high contrast, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, distorted, grainy, sketch, low contrast, dull, plain, modest + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/f85dc6aa5d7f7d6d3663f2270e276796.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-hdr + NAME_ZH: 高动态范围 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: HDR photo of {prompt} . High dynamic range, vivid, rich details, clear shadows and highlights, realistic, intense, enhanced contrast, highly detailed + NEGATIVE_PROMPT: flat, low contrast, oversaturated, underexposed, overexposed, blurred, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/269a98b284ae1345b0e5ac1f85c33179.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-iphone photographic + NAME_ZH: iPhone摄影 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: iphone photo {prompt} . large depth of field, deep depth of field, highly detailed + NEGATIVE_PROMPT: drawing, painting, crayon, sketch, graphite, impressionist, noisy, blurry, soft, deformed, ugly, shallow depth of field, bokeh + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/48c556a6b3c3a533847b80b031cd4962.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-long exposure + NAME_ZH: 长曝光 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: long exposure photo of {prompt} . Blurred motion, streaks of light, surreal, dreamy, ghosting effect, highly detailed + NEGATIVE_PROMPT: static, noisy, deformed, shaky, abrupt, flat, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/fda88c3fc43ea8cc04ce9b5c0261627f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-neon noir + NAME_ZH: 霓虹黑色 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: neon noir {prompt} . cyberpunk, dark, rainy streets, neon signs, high contrast, low light, vibrant, highly detailed + NEGATIVE_PROMPT: bright, sunny, daytime, low contrast, black and white, sketch, watercolor + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/8a5b71434592771e064af4b9017b59d6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-silhouette + NAME_ZH: 剪影 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: silhouette style {prompt} . high contrast, minimalistic, black and white, stark, dramatic + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, color, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/1892a37e66d33cdd9b713aaab6b8c597.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-tilt-shift + NAME_ZH: 倾斜移位 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD1.5 + PROMPT: tilt-shift photo of {prompt} . selective focus, miniature effect, blurred background, highly detailed, vibrant, perspective control + NEGATIVE_PROMPT: blurry, noisy, deformed, flat, low contrast, unrealistic, oversaturated, underexposed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/d058a157de848a5c03d9a3e1e0e560a2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: cinematic-diva + NAME_ZH: 电影歌星画风 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: UHD, 8K, ultra detailed, a cinematic photograph of {prompt}, beautiful lighting, great composition + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, NSFW + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/967b1852ea26dcf41360fc5542a0df6b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Abstract Expressionism + NAME_ZH: 抽象表现主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Abstract Expressionism Art, {prompt}, High contrast, minimalistic, colorful, stark, dramatic, expressionism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/11667c7a085b53a6ffbb76b83788f8b5.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Academia + NAME_ZH: 学院风 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Academia, {prompt}, preppy Ivy League style, stark, dramatic, chic boarding school, academia + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, grunge, sloppy, unkempt + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/c95197ef78312e2bbd45883bfbfa095a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Action Figure + NAME_ZH: 动作人偶 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Action Figure, {prompt}, plastic collectable action figure, collectable toy action figure + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/24ac67fe21833fc1300fba09d5de6090.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Adorable 3D Character + NAME_ZH: 可爱的3D角色 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Adorable 3D Character, {prompt}, 3D render, adorable character, 3D art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, grunge, sloppy, unkempt, photograph, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/31a0ffbfc93b5b336a3bedc0a9985a02.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Adorable Kawaii + NAME_ZH: 可爱卡哇伊风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Adorable Kawaii, {prompt}, pretty, cute, adorable, kawaii + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, gothic, dark, moody, monochromatic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/82624c429d504c8290d4c9147be64029.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Art Deco + NAME_ZH: 艺术装饰风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Art Deco, {prompt}, sleek, geometric forms, art deco style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/c60ef3e7ada8774c92bb6e73c570f819.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Art Nouveau + NAME_ZH: 新艺术风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Art Nouveau, beautiful art, {prompt}, sleek, organic forms, long, sinuous, art nouveau style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, industrial, mechanical + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/153d83e71fbf145d0aa5c41ecab0a505.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Astral Aura + NAME_ZH: 星体光环 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Astral Aura, {prompt}, astral, colorful aura, vibrant energy + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/e093c9d0f81037002e88f2a6c3f38a55.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Avant-garde + NAME_ZH: 先锋派 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Avant-garde, {prompt}, unusual, experimental, avant-garde art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/9921d1944893466edfc6a060faf4070e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Baroque + NAME_ZH: 巴洛克风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Baroque, {prompt}, dramatic, exuberant, grandeur, baroque art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/d8279be4bb34e5cb00a95919412154a4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Bauhaus-Style Poster + NAME_ZH: 包豪斯风格海报 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Bauhaus-Style Poster, {prompt}, simple geometric shapes, clean lines, primary colors, Bauhaus-Style Poster + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/4bd18b32c23e13b9e4fc7f65a1916eab.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Blueprint Schematic Drawing + NAME_ZH: 蓝图原理图绘制 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Blueprint Schematic Drawing, {prompt}, technical drawing, blueprint, schematic + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/62392c3715267f7162a37a8ff1caa3a1.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Caricature + NAME_ZH: 漫画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Caricature, {prompt}, exaggerated, comical, caricature + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/894f40ed44b37c3372e6a22b8ae577a4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Cel Shaded Art + NAME_ZH: 单色阴影艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Cel Shaded Art, {prompt}, 2D, flat color, toon shading, cel shaded style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/71c2e8a2cd1031b2bfae1640f7b72c88.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Character Design Sheet + NAME_ZH: 角色设计图 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Character Design Sheet, {prompt}, character reference sheet, character turn around + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/eacf2134aa51d4b4a6f2f35cc170f315.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Classicism Art + NAME_ZH: 古典主义艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Classicism Art, {prompt}, inspired by Roman and Greek culture, clarity, harmonious, classicism art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/10025b4f3a09e6134086e3cdec4ef2c8.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Color Field Painting + NAME_ZH: 色域绘画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Color Field Painting, {prompt}, abstract, simple, geometic, color field painting style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/80e5b4075c572c04cbb4e48c37b8366b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Colored Pencil Art + NAME_ZH: 彩色铅笔艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Colored Pencil Art, {prompt}, colored pencil strokes, light color, visible paper texture, colored pencil art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/9ae235d7f1a7c2a4edab52a5e9f9cbae.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Conceptual Art + NAME_ZH: 概念艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Conceptual Art, {prompt}, concept art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/cf2e6781997c6842a16155fdff911ef8.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Constructivism + NAME_ZH: 结构主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Constructivism Art, {prompt}, minimalistic, geometric forms, constructivism art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/d07feccabcadfd3310464bedba858bd1.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Cubism + NAME_ZH: 立体主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Cubism Art, {prompt}, flat geometric forms, cubism art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/aa8313f6c3cb9cafb9a7ec07db78df1c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dadaism + NAME_ZH: 达达主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Dadaism Art, {prompt}, satirical, nonsensical, dadaism art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/db27030369cb3ccb042b8aea6bf635e2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dark Fantasy + NAME_ZH: 黑暗幻想 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Dark Fantasy Art, {prompt}, dark, moody, dark fantasy style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, bright, sunny + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/c88b6e641c707afc0c8d278ba7e1ac19.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dark Moody Atmosphere + NAME_ZH: 暗色忧郁氛围 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Dark Moody Atmosphere, {prompt}, dramatic, mysterious, dark moody atmosphere + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, vibrant, colorful, bright + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/3da915da2f5cedaf243e57e08163f35b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: DMT Art Style + NAME_ZH: DMT艺术风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: DMT Art Style, {prompt}, bright colors, surreal visuals, swirling patterns, DMT art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/d4a823d2bfa912ca4bb56d96f722f08f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Doodle Art + NAME_ZH: 涂鸦艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Doodle Art Style, {prompt}, drawing, freeform, swirling patterns, doodle art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/8e1e21745c149b9634d3ce96fc7d505f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Double Exposure + NAME_ZH: 双重曝光 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Double Exposure Style, {prompt}, double image ghost effect, image combination, double exposure style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/efd7aea4af1c4ede99fdfac17350e264.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dripping Paint Splatter Art + NAME_ZH: 滴漆溅画艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Dripping Paint Splatter Art, {prompt}, dramatic, paint drips, splatters, dripping paint + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/69fd81f5983107acc3d334af62915851.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Expressionism + NAME_ZH: 表现主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Expressionism Art Style, {prompt}, movement, contrast, emotional, exaggerated forms, expressionism art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/3dfa862bd1c80cec237e4a5717cea2bd.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Faded Polaroid Photo + NAME_ZH: 褪色的宝丽来照片 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Faded Polaroid Photo, {prompt}, analog, old faded photo, old polaroid + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, vibrant, colorful + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/f152edb4b3ca6248758b48115258ddfa.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fauvism + NAME_ZH: 野兽派 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Fauvism Art, {prompt}, painterly, bold colors, textured brushwork, fauvism art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/0506b350cadcf8fca42da764cd6fd5bf.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Flat 2D Art + NAME_ZH: 扁平2D艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Flat 2D Art, {prompt}, simple flat color, 2-dimensional, Flat 2D Art Style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, 3D, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/940cfd34155634cf051e1b2942cca426.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fortnite Art Style + NAME_ZH: 堡垒之夜艺术风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Fortnite Art Style, {prompt}, 3D cartoon, colorful, Fortnite Art Style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/156f8d943ff6d283f7a34f265daaa46c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Futurism + NAME_ZH: 未来主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Futurism Art Style, {prompt}, dynamic, dramatic, Futurism Art Style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/855283cc2ab6283b627ef32d06a1ae0f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Glitchcore + NAME_ZH: 故障核心 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Glitchcore Art Style, {prompt}, dynamic, dramatic, distorted, vibrant colors, glitchcore art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/9af62376402a85774179e82cf7e0dc59.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Glo-fi + NAME_ZH: 光环音乐风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Glo-fi Art Style, {prompt}, dynamic, dramatic, vibrant colors, glo-fi art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/275a6e2a3297cec57f9b5a4a17b0f749.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Googie Art Style + NAME_ZH: 古奇艺术风格 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Googie Art Style, {prompt}, dynamic, dramatic, 1950's futurism, bold boomerang angles, Googie art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/08ee77586d7bec3f6bad7d60cee3c540.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Graffiti Art + NAME_ZH: 涂鸦艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Graffiti Art Style, {prompt}, dynamic, dramatic, vibrant colors, graffiti art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/57b751b11564cb22cd49ef21f2004a5f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Harlem Renaissance Art + NAME_ZH: 哈莱姆文艺复兴艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Harlem Renaissance Art Style, {prompt}, dynamic, dramatic, 1920s African American culture, Harlem Renaissance art style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/d09ea3dadcd0a15d8fa247ee74a75e6b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: High Fashion + NAME_ZH: 高级时装 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: High Fashion, {prompt}, dynamic, dramatic, haute couture, elegant, ornate clothing, High Fashion + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/868f752bbb5ef992a0be36d7d13de3be.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Idyllic + NAME_ZH: 田园诗般的 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Idyllic, {prompt}, peaceful, happy, pleasant, happy, harmonious, picturesque, charming + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/55bab29eeb628e7a9ae018e45e7e24db.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Impressionism + NAME_ZH: 印象主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Impressionism, {prompt}, painterly, small brushstrokes, visible brushstrokes, impressionistic style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/0312b673dc6858a9864d7f45f0c5c1fc.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Infographic Drawing + NAME_ZH: 信息图表绘制 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Infographic Drawing, {prompt}, diagram, infographic + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/b09151f6e0883d26056b80fcc9d398bb.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Ink Dripping Drawing + NAME_ZH: 墨水滴画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Ink Dripping Drawing, {prompt}, ink drawing, dripping ink + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, colorful, vibrant + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/5f09912a07e915250a96b2023db15821.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Japanese Ink Drawing + NAME_ZH: 日本墨画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Japanese Ink Drawing, {prompt}, ink drawing, inkwash, Japanese Ink Drawing + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, colorful, vibrant + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/633ad971ff30fe4717782fc6b5f92fda.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Knolling Photography + NAME_ZH: 秩序拍摄 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Knolling Photography, {prompt}, flat lay photography, object arrangment, knolling photography + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/89a205be3a276349ecddf0eeca43ed80.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Light Cheery Atmosphere + NAME_ZH: 轻快愉快的氛围 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Light Cheery Atmosphere, {prompt}, happy, joyful, cheerful, carefree, gleeful, lighthearted, pleasant atmosphere + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, monochromatic, dark, moody + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/0913ac9815f892411f8327a630f51ae4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Logo Design + NAME_ZH: 标志设计 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Logo Design, {prompt}, dynamic graphic art, vector art, minimalist, professional logo design + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/9aa040b0c60d289da9610c91ad9b7c7e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Luxurious Elegance + NAME_ZH: 奢华优雅 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Luxurious Elegance, {prompt}, extravagant, ornate, designer, opulent, picturesque, lavish + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/e796e84ed745150f0d4e28e0ac99b4cf.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Macro Photography + NAME_ZH: 微距摄影 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Macro Photography, {prompt}, close-up, macro 100mm, macro photography + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/92e8b84379828f38e3d01c7272f41b0b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Mandola Art + NAME_ZH: 曼陀罗艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Mandola art style, {prompt}, complex, circular design, mandola + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/dbf5ca944d9213c3181348666cf337ac.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Marker Drawing + NAME_ZH: 马克笔绘图 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Marker Drawing, {prompt}, bold marker lines, visibile paper texture, marker drawing + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photograph, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/c558745f7a4b77d7ca9a428d8874efe4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Medievalism + NAME_ZH: 中世纪主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Medievalism, {prompt}, inspired by The Middle Ages, medieval art, elaborate patterns and decoration, Medievalism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/26aa6244359a4fd87f6438a341057901.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Minimalism + NAME_ZH: 极简主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Minimalism, {prompt}, abstract, simple geometic shapes, hard edges, sleek contours, Minimalism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/dce92a90da6299339cf8e9ebc6596ea2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neo-Baroque + NAME_ZH: 新巴洛克 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Neo-Baroque, {prompt}, ornate and elaborate, dynaimc, Neo-Baroque + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/9b6cd8751b18c65b259769b44cfac351.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neo-Byzantine + NAME_ZH: 新拜占庭 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Neo-Byzantine, {prompt}, grand decorative religious style, Orthodox Christian inspired, Neo-Byzantine + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/99c67768869b546bf527ef0b1735c0d5.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neo-Futurism + NAME_ZH: 新未来主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Neo-Futurism, {prompt}, high-tech, curves, spirals, flowing lines, idealistic future, Neo-Futurism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/bada1534f7a60187f584febcc92f40d1.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neo-Impressionism + NAME_ZH: 新印象主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Neo-Impressionism, {prompt}, tiny dabs of color, Pointillism, painterly, Neo-Impressionism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photograph, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/6bafeac67ce2679b64a86ee1023b53c9.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neo-Rococo + NAME_ZH: 新洛可可 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Neo-Rococo, {prompt}, curved forms, naturalistic ornamentation, elaborate, decorative, gaudy, Neo-Rococo + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/9ab0ad2b88e03933ea479357ff1e4435.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Neoclassicism + NAME_ZH: 新古典主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Neoclassicism, {prompt}, ancient Rome and Greece inspired, idealic, sober colors, Neoclassicism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/83a4e3a2ca577400b05a81b5b2b8650e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Op Art + NAME_ZH: 视觉艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Op Art, {prompt}, optical illusion, abstract, geometric pattern, impression of movement, Op Art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/5f11132803dff2de5213293b91d407d7.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Ornate and Intricate + NAME_ZH: 华丽复杂 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Ornate and Intricate, {prompt}, decorative, highly detailed, elaborate, ornate, intricate + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/24b895dca946c8765ad9fa38f720f671.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Pencil Sketch Drawing + NAME_ZH: 铅笔素描 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Pencil Sketch Drawing, {prompt}, black and white drawing, graphite drawing + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/a9056e1eac85e5e4fe96a93917d4cce4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Pop Art 2 + NAME_ZH: 流行艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Pop Art, {prompt}, vivid colors, flat color, 2D, strong lines, Pop Art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/83c4c06c70a48da6558ff970ece247b6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Rococo + NAME_ZH: 洛可可 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Rococo, {prompt}, flamboyant, pastel colors, curved lines, elaborate detail, Rococo + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/4850170f410e10bc833b7d00324dff18.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Silhouette Art + NAME_ZH: 剪影艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Silhouette Art, {prompt}, high contrast, well defined, Silhouette Art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/568777f447fc02510b618152726d5002.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Simple Vector Art + NAME_ZH: 简单矢量艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Simple Vector Art, {prompt}, 2D flat, simple shapes, minimalistic, professional graphic, flat color, high contrast, Simple Vector Art + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, 3D, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/24d2ab1fd175bf4e9ef3a8327651dd4b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Sketchup + NAME_ZH: 草图大师 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Sketchup, {prompt}, CAD, professional design, Sketchup + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photo, photograph + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/337dca7ac49cf7820c85ede096ebde9c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Steampunk 2 + NAME_ZH: 蒸汽朋克 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Steampunk, {prompt}, retrofuturistic science fantasy, steam-powered tech, vintage industry, gears, neo-victorian, steampunk + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/07d7b27cd73f2d43684003563511c15b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Surrealism + NAME_ZH: 超现实主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Surrealism, {prompt}, expressive, dramatic, organic lines and forms, dreamlike and mysterious, Surrealism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/38bae70377b323d1a5f5756d7e04886d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Suprematism + NAME_ZH: 至上主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Suprematism, {prompt}, abstract, limited color palette, geometric forms, Suprematism + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/c48fbd8cedee84d06b4d875d566f1bb8.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Terragen + NAME_ZH: 地形生成 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Terragen, {prompt}, beautiful massive landscape, epic scenery, Terragen + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/8974cd8e0f38fb7aac117cf0983fc36d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Tranquil Relaxing Atmosphere + NAME_ZH: 宁静放松的氛围 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Tranquil Relaxing Atmosphere, {prompt}, calming style, soothing colors, peaceful, idealic, Tranquil Relaxing Atmosphere + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, oversaturated + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/69170d8443a67be4210af8d5558779c2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Sticker Designs + NAME_ZH: 贴纸设计 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Vector Art Stickers, {prompt}, professional vector design, sticker designs, Sticker Sheet + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/2d1e9867058db2c57f2fe47530de3243.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Vibrant Rim Light + NAME_ZH: 生动的边缘光 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Vibrant Rim Light, {prompt}, bright rim light, high contrast, bold edge light + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/bb08936ca184daba2b30b4a9efb308f2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Volumetric Lighting + NAME_ZH: 体积光照明 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Volumetric Lighting, {prompt}, light depth, dramatic atmospheric lighting, Volumetric Lighting + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/bbad7964a2ae70b66c72804273f11e74.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Watercolor 2 + NAME_ZH: 水彩 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Watercolor style painting, {prompt}, visible paper texture, colorwash, watercolor + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/8859d532ae5901cc8457d6118fb9b7da.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Whimsical and Playful + NAME_ZH: 异想天开和俏皮 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + PROMPT: Whimsical and Playful, {prompt}, imaginative, fantastical, bight colors, stylized, happy, Whimsical and Playful + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, drab, boring, moody + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/af2267f1942e870be957c37cd73d4359.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Enhance + NAME_ZH: 焦点增强 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD2.1 + PROMPT: { + "prompt": null +} + + NEGATIVE_PROMPT: (worst quality, low quality, normal quality, lowres, low details, oversaturated, undersaturated, overexposed, underexposed, grayscale, bw, bad photo, bad photography, bad art:1.4), (watermark, signature, text font, username, error, logo, words, letters, digits, autograph, trademark, name:1.2), (blur, blurry, grainy), morbid, ugly, asymmetrical, mutated malformed, mutilated, poorly lit, bad shadow, draft, cropped, out of frame, cut off, censored, jpeg artifacts, out of focus, glitch, duplicate, (airbrushed, cartoon, anime, semi-realistic, cgi, render, blender, digital art, manga, amateur:1.3), (3D ,3D Game, 3D Game Scene, 3D Character:1.1), (bad hands, bad anatomy, bad body, bad face, bad teeth, bad arms, bad legs, deformities:1.3) + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/e501823a21bbda56592055c9613c1dbb.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Sharp + NAME_ZH: 焦点锐化 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD2.1 + PROMPT: cinematic still {prompt} . emotional, harmonious, vignette, 4k epic detailed, shot on kodak, 35mm photo, sharp focus, high budget, cinemascope, moody, epic, gorgeous, film grain, grainy + NEGATIVE_PROMPT: anime, cartoon, graphic, (blur, blurry, bokeh), text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/393fb7aab57992a1c3af7cbad01c1001.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Masterpiece + NAME_ZH: 焦点杰作 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD2.1 + PROMPT: (masterpiece), (best quality), (ultra-detailed), {prompt}, illustration, disheveled hair, detailed eyes, perfect composition, moist skin, intricate details, earrings, by wlop + NEGATIVE_PROMPT: longbody, lowres, bad anatomy, bad hands, missing fingers, pubic hair,extra digit, fewer digits, cropped, worst quality, low quality + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/9e27c3d1475dacae0ee45cea783aaaf5.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Photograph + NAME_ZH: 焦点摄影 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD2.1 + PROMPT: photograph {prompt}, 50mm . cinematic 4k epic detailed 4k epic detailed photograph shot on kodak detailed cinematic hbo dark moody, 35mm photo, grainy, vignette, vintage, Kodachrome, Lomography, stained, highly detailed, found footage + NEGATIVE_PROMPT: Brad Pitt, bokeh, depth of field, blurry, cropped, regular face, saturated, contrast, deformed iris, deformed pupils, semi-realistic, cgi, 3d, render, sketch, cartoon, drawing, anime, text, cropped, out of frame, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, extra fingers, mutated hands, poorly drawn hands, poorly drawn face, mutation, deformed, dehydrated, bad anatomy, bad proportions, extra limbs, cloned face, disfigured, gross proportions, malformed limbs, missing arms, missing legs, extra arms, extra legs, fused fingers, too many fingers, long neck + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/8b2ea41ec15bf1a16d6a837d46dbc2ac.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Negative + NAME_ZH: 焦点底片 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD2.1 + PROMPT: { + "prompt": null +} + + NEGATIVE_PROMPT: deformed, bad anatomy, disfigured, poorly drawn face, mutated, extra limb, ugly, poorly drawn hands, missing limb, floating limbs, disconnected limbs, disconnected head, malformed hands, long neck, mutated hands and fingers, bad hands, missing fingers, cropped, worst quality, low quality, mutation, poorly drawn, huge calf, bad hands, fused hand, missing hand, disappearing arms, disappearing thigh, disappearing calf, disappearing legs, missing fingers, fused fingers, abnormal eye proportion, Abnormal hands, abnormal legs, abnormal feet, abnormal fingers, drawing, painting, crayon, sketch, graphite, impressionist, noisy, blurry, soft, deformed, ugly, anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/daaec2962291137532189b8a31012532.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Fooocus Cinematic + NAME_ZH: 焦点电影 + DESCRIPTION: + SOURCE: fooocus + BASE_MODEL: SD2.1 + PROMPT: cinematic still {prompt} . emotional, harmonious, vignette, highly detailed, high budget, bokeh, cinemascope, moody, epic, gorgeous, film grain, grainy + NEGATIVE_PROMPT: anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/adc4d52aa5b0afca0593a475ddc9d055.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-cinematic-dynamic + NAME_ZH: MRE电影动态 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: epic cinematic shot of dynamic {prompt} in motion. main subject of high budget action movie. raw photo, motion blur. best quality, high resolution + NEGATIVE_PROMPT: static, still, motionless, sluggish. drawing, painting, illustration, rendered. low budget. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/bd2470068e09d9f1b7d0a690c879b3ce.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-spontaneous-picture + NAME_ZH: MRE自发图片 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: spontaneous picture of {prompt}, taken by talented amateur. best quality, high resolution. magical moment, natural look. simple but good looking + NEGATIVE_PROMPT: overthinked. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/19ad6082cee5516ce330641b515467ef.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-artistic-vision + NAME_ZH: MRE艺术视觉 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: powerful artistic vision of {prompt}. breathtaking masterpiece made by great artist. best quality, high resolution + NEGATIVE_PROMPT: insignificant, flawed, made by bad artist. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/95af94e50bcb91ae8fd2914a3bf13f1e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-dark-dream + NAME_ZH: MRE黑暗梦境 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: dark and unsettling dream showing {prompt}. best quality, high resolution. created by genius but depressed mad artist. grim beauty + NEGATIVE_PROMPT: naive, cheerful. comfortable, casual, boring, cliche. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/572c8c26cc20ac0ee66684e3c5ee4e8c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-gloomy-art + NAME_ZH: MRE忧郁艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: astonishing gloomy art made mainly of shadows and lighting, forming {prompt}. masterful usage of lighting, shadows and chiaroscuro. made by black-hearted artist, drawing from darkness. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/66cbdf819e930f7580bd66a41bde7dfe.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-bad-dream + NAME_ZH: MRE恶梦 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: picture from really bad dream about terrifying {prompt}, true horror. bone-chilling vision. mad world that shouldn't exist. best quality, high resolution + NEGATIVE_PROMPT: nice dream, pleasant experience. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/b92b2bbfc400db9204fe8249354132b4.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-underground + NAME_ZH: MRE地下 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: uncanny caliginous vision of {prompt}, created by remarkable underground artist. best quality, high resolution. raw and brutal art, careless but impressive style. inspired by darkness and chaos + NEGATIVE_PROMPT: photography, mainstream, civilized. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/8d46eca558d791a1f2b41b0ed7bba4d2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-surreal-painting + NAME_ZH: MRE超现实绘画 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: surreal painting representing strange vision of {prompt}. harmonious madness, synergy with chance. unique artstyle, mindbending art, magical surrealism. best quality, high resolution + NEGATIVE_PROMPT: photography, illustration, drawing. realistic, possible. logical, sane. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/58858425832b10d233f7887af4a2022f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-dynamic-illustration + NAME_ZH: MRE动态插画 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: insanely dynamic illustration of {prompt}. best quality, high resolution. crazy artstyle, careless brushstrokes, emotional and fun + NEGATIVE_PROMPT: photography, realistic. static, still, slow, boring. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/8bf9861d4d3fadcdb98ceec88a941582.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-undead-art + NAME_ZH: MRE不死艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: long forgotten art created by undead artist illustrating {prompt}, tribute to the death and decay. miserable art of the damned. wretched and decaying world. best quality, high resolution + NEGATIVE_PROMPT: alive, playful, living. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/fada50979ca180006eba9a45a00f3675.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-elemental-art + NAME_ZH: MRE元素艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: art illustrating insane amounts of raging elemental energy turning into {prompt}, avatar of elements. magical surrealism, wizardry. best quality, high resolution + NEGATIVE_PROMPT: photography, realistic, real. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/5895d78cf58c1ca05178991f37cc48ff.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-space-art + NAME_ZH: MRE太空艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: winner of inter-galactic art contest illustrating {prompt}, symbol of the interstellar singularity. best quality, high resolution. artstyle previously unseen in the whole galaxy + NEGATIVE_PROMPT: created by human race, low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/e9815495587895a21d970728474c8be6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-ancient-illustration + NAME_ZH: MRE古代插画 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: sublime ancient illustration of {prompt}, predating human civilization. crude and simple, but also surprisingly beautiful artwork, made by genius primeval artist. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/151e07c17a89ebaf7688905ea0199862.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-brave-art + NAME_ZH: MRE勇敢艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: brave, shocking, and brutally true art showing {prompt}. inspired by courage and unlimited creativity. truth found in chaos. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/1a068f2728327d21ebb99285c2ce1370.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-heroic-fantasy + NAME_ZH: MRE英雄幻想 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: heroic fantasy painting of {prompt}, in the dangerous fantasy world. airbrush over oil on canvas. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/78d05472067e0b86c8270fa5476fcb8e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-dark-cyberpunk + NAME_ZH: MRE黑暗赛博朋克 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: dark cyberpunk illustration of brutal {prompt} in a world without hope, ruled by ruthless criminal corporations. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/a9f50e3162958fd783872d6955ad7d0b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-lyrical-geometry + NAME_ZH: MRE抒情几何 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: geometric and lyrical abstraction painting presenting {prompt}. oil on metal. best quality, high resolution + NEGATIVE_PROMPT: photography, realistic, drawing, rendered. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/dfabd41d3042ced804bc97ae35e3a7cb.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-sumi-e-symbolic + NAME_ZH: MRE墨绘象征 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: big long brushstrokes of deep black sumi-e turning into symbolic painting of {prompt}. master level raw art. best quality, high resolution + NEGATIVE_PROMPT: photography, rendered. low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/695b1ba687544eaeec9fb5f871917aeb.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-sumi-e-detailed + NAME_ZH: MRE墨绘精细 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: highly detailed black sumi-e painting of {prompt}. in-depth study of perfection, created by a master. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/16eb95e180385b88794e368b28da1812.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-manga + NAME_ZH: MRE漫画 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: manga artwork presenting {prompt}. created by japanese manga artist. highly emotional. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/ebec631bf467937f82d05958ae59f9dc.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-anime + NAME_ZH: MRE动漫 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: anime artwork illustrating {prompt}. created by japanese anime studio. highly emotional. best quality, high resolution + NEGATIVE_PROMPT: low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/a08149bc8e50f6bc65c0010d4cd416f8.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-comic + NAME_ZH: MRE漫画书 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + PROMPT: breathtaking illustration from adult comic book presenting {prompt}. fabulous artwork. best quality, high resolution + NEGATIVE_PROMPT: deformed, ugly, low quality, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/48c65cebf1fa4284d7b8feb619412e65.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-3d-model + NAME_ZH: SAI三维模型 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: professional 3d model {prompt} . octane render, highly detailed, volumetric, dramatic lighting + NEGATIVE_PROMPT: ugly, deformed, noisy, low poly, blurry, painting + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/c1a765ac089fdfb3c1d11b33c75d2afd.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-analog film + NAME_ZH: SAI模拟胶片 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: analog film photo {prompt} . faded film, desaturated, 35mm photo, grainy, vignette, vintage, Kodachrome, Lomography, stained, highly detailed, found footage + NEGATIVE_PROMPT: painting, drawing, illustration, glitch, deformed, mutated, cross-eyed, ugly, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/3c46d19957efd7fb78f4ab2bdada5468.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-anime + NAME_ZH: SAI动漫 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: anime artwork {prompt} . anime style, key visual, vibrant, studio anime, highly detailed + NEGATIVE_PROMPT: photo, deformed, black and white, realism, disfigured, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/c030e72561eda96abcf738f1370d36ff.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-cinematic + NAME_ZH: SAI电影 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: cinematic film still {prompt} . shallow depth of field, vignette, highly detailed, high budget, bokeh, cinemascope, moody, epic, gorgeous, film grain, grainy + NEGATIVE_PROMPT: anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/d9161c0d5cbf2133b2bfc1021c0c5e2a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-comic book + NAME_ZH: SAI漫画书 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: comic {prompt} . graphic illustration, comic art, graphic novel art, vibrant, highly detailed + NEGATIVE_PROMPT: photograph, deformed, glitch, noisy, realistic, stock photo + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/6759ecb831037367e64c4b36d802be87.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-craft clay + NAME_ZH: SAI手工粘土 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: play-doh style {prompt} . sculpture, clay art, centered composition, Claymation + NEGATIVE_PROMPT: sloppy, messy, grainy, highly detailed, ultra textured, photo + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/8fc51113f725f27326c4398a7457cd6d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-digital art + NAME_ZH: SAI数字艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: concept art {prompt} . digital artwork, illustrative, painterly, matte painting, highly detailed + NEGATIVE_PROMPT: photo, photorealistic, realism, ugly + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/d29adb44458700c4a45ee6edaa04bfb6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-enhance + NAME_ZH: SAI增强 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: breathtaking {prompt} . award-winning, professional, highly detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, distorted, grainy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/2be0de541ff65f8da80ddc24a65c98d8.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-fantasy art + NAME_ZH: SAI幻想艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: ethereal fantasy concept art of {prompt} . magnificent, celestial, ethereal, painterly, epic, majestic, magical, fantasy art, cover art, dreamy + NEGATIVE_PROMPT: photographic, realistic, realism, 35mm film, dslr, cropped, frame, text, deformed, glitch, noise, noisy, off-center, deformed, cross-eyed, closed eyes, bad anatomy, ugly, disfigured, sloppy, duplicate, mutated, black and white + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/a6f8d92afcd5803dfb2ebecbc92091b6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-isometric + NAME_ZH: SAI等距 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: isometric style {prompt} . vibrant, beautiful, crisp, detailed, ultra detailed, intricate + NEGATIVE_PROMPT: deformed, mutated, ugly, disfigured, blur, blurry, noise, noisy, realistic, photographic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/d4e3fcbbfd7b1323bd89decf5d7b0006.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-line art + NAME_ZH: SAI线条艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: line art drawing {prompt} . professional, sleek, modern, minimalist, graphic, line art, vector graphics + NEGATIVE_PROMPT: anime, photorealistic, 35mm film, deformed, glitch, blurry, noisy, off-center, deformed, cross-eyed, closed eyes, bad anatomy, ugly, disfigured, mutated, realism, realistic, impressionism, expressionism, oil, acrylic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/034a51b0dd34b018be8859bf45b4f7ed.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-lowpoly + NAME_ZH: SAI低多边形 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: low-poly style {prompt} . low-poly game art, polygon mesh, jagged, blocky, wireframe edges, centered composition + NEGATIVE_PROMPT: noisy, sloppy, messy, grainy, highly detailed, ultra textured, photo + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/76b9913e9fa5704b6d30adbde9e1f70f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-neonpunk + NAME_ZH: SAI霓虹朋克 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: neonpunk style {prompt} . cyberpunk, vaporwave, neon, vibes, vibrant, stunningly beautiful, crisp, detailed, sleek, ultramodern, magenta highlights, dark purple shadows, high contrast, cinematic, ultra detailed, intricate, professional + NEGATIVE_PROMPT: painting, drawing, illustration, glitch, deformed, mutated, cross-eyed, ugly, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/7e9ed25bb34008beb5f417df63c4b2fe.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-origami + NAME_ZH: SAI折纸 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: origami style {prompt} . paper art, pleated paper, folded, origami art, pleats, cut and fold, centered composition + NEGATIVE_PROMPT: noisy, sloppy, messy, grainy, highly detailed, ultra textured, photo + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/924f46a8f276011a0953d7988e90ee25.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-photographic + NAME_ZH: SAI摄影 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: cinematic photo {prompt} . 35mm photograph, film, bokeh, professional, 4k, highly detailed + NEGATIVE_PROMPT: drawing, painting, crayon, sketch, graphite, impressionist, noisy, blurry, soft, deformed, ugly + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/d6a2d8f3d37cc21c20c5dfc13d000b67.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-pixel art + NAME_ZH: SAI像素艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: pixel-art {prompt} . low-res, blocky, pixel art style, 8-bit graphics + NEGATIVE_PROMPT: sloppy, messy, blurry, noisy, highly detailed, ultra textured, photo, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/a5ab89c0960be8c1216e65c98d92ae4a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-texture + NAME_ZH: SAI质地 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + PROMPT: texture {prompt} top down close-up + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/ebfeab574283fff2ac096e348a585e6d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-advertising + NAME_ZH: 广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: advertising poster style {prompt} . Professional, modern, product-focused, commercial, eye-catching, highly detailed + NEGATIVE_PROMPT: noisy, blurry, amateurish, sloppy, unattractive + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/1aa26a16126e2756bf4bf3fda29baa12.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-automotive + NAME_ZH: 汽车广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: automotive advertisement style {prompt} . sleek, dynamic, professional, commercial, vehicle-focused, high-resolution, highly detailed + NEGATIVE_PROMPT: noisy, blurry, unattractive, sloppy, unprofessional + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/ddc833b36ca23c85a4f6e7bf0088d081.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-corporate + NAME_ZH: 企业广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: corporate branding style {prompt} . professional, clean, modern, sleek, minimalist, business-oriented, highly detailed + NEGATIVE_PROMPT: noisy, blurry, grungy, sloppy, cluttered, disorganized + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/df97fa45c7842296c138aca4057db272.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-fashion editorial + NAME_ZH: 时尚编辑 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: fashion editorial style {prompt} . high fashion, trendy, stylish, editorial, magazine style, professional, highly detailed + NEGATIVE_PROMPT: outdated, blurry, noisy, unattractive, sloppy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/89259be723479cd0b81546b715bea04d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-food photography + NAME_ZH: 食品摄影 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: food photography style {prompt} . appetizing, professional, culinary, high-resolution, commercial, highly detailed + NEGATIVE_PROMPT: unappetizing, sloppy, unprofessional, noisy, blurry + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/33acc98f8615940c8cebbac8ce5297b2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-gourmet food photography + NAME_ZH: 美食摄影 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: gourmet food photo of {prompt} . soft natural lighting, macro details, vibrant colors, fresh ingredients, glistening textures, bokeh background, styled plating, wooden tabletop, garnished, tantalizing, editorial quality + NEGATIVE_PROMPT: cartoon, anime, sketch, grayscale, dull, overexposed, cluttered, messy plate, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/897bbd3f1d232de122796266f3845b50.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-luxury + NAME_ZH: 奢华广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: luxury product style {prompt} . elegant, sophisticated, high-end, luxurious, professional, highly detailed + NEGATIVE_PROMPT: cheap, noisy, blurry, unattractive, amateurish + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/5b33ecc84dc5ff285a0f2e69f43162cb.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-real estate + NAME_ZH: 房地产广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: real estate photography style {prompt} . professional, inviting, well-lit, high-resolution, property-focused, commercial, highly detailed + NEGATIVE_PROMPT: dark, blurry, unappealing, noisy, unprofessional + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/1b99b7bcd0476144d80d066e747d8dfc.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: ads-retail + NAME_ZH: 零售广告 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: retail packaging style {prompt} . vibrant, enticing, commercial, product-focused, eye-catching, professional, highly detailed + NEGATIVE_PROMPT: noisy, blurry, amateurish, sloppy, unattractive + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/0029e46ef36380dde2084257108f8a6f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-abstract + NAME_ZH: 抽象艺术风格 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: abstract style {prompt} . non-representational, colors and shapes, expression of feelings, imaginative, highly detailed + NEGATIVE_PROMPT: realistic, photographic, figurative, concrete + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/8c401cb0a6ea288230222c4985e78667.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-abstract expressionism + NAME_ZH: 抽象表现主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: abstract expressionist painting {prompt} . energetic brushwork, bold colors, abstract forms, expressive, emotional + NEGATIVE_PROMPT: realistic, photorealistic, low contrast, plain, simple, monochrome + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/9df6635149c576b65d911c2e4cc6a86b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-art deco + NAME_ZH: 艺术装饰风格 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: art deco style {prompt} . geometric shapes, bold colors, luxurious, elegant, decorative, symmetrical, ornate, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, modernist, minimalist + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/82fff8a25de8075777caf14cb3eb5650.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-art nouveau + NAME_ZH: 新艺术风格 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: art nouveau style {prompt} . elegant, decorative, curvilinear forms, nature-inspired, ornate, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, modernist, minimalist + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/84075c5c0cb4b7a2541c6fbca9835cfd.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-constructivist + NAME_ZH: 构成主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: constructivist style {prompt} . geometric shapes, bold colors, dynamic composition, propaganda art style + NEGATIVE_PROMPT: realistic, photorealistic, low contrast, plain, simple, abstract expressionism + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/2a634ad0c89ecefbbea4ce5bcab3d5e5.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-cubist + NAME_ZH: 立体主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: cubist artwork {prompt} . geometric shapes, abstract, innovative, revolutionary + NEGATIVE_PROMPT: anime, photorealistic, 35mm film, deformed, glitch, low contrast, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/2a3d797008c08e12b485d61624741ea6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-expressionist + NAME_ZH: 表现主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: expressionist {prompt} . raw, emotional, dynamic, distortion for emotional effect, vibrant, use of unusual colors, detailed + NEGATIVE_PROMPT: realism, symmetry, quiet, calm, photo + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/83914655659001716a1acede295289d0.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-graffiti + NAME_ZH: 涂鸦 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: graffiti style {prompt} . street art, vibrant, urban, detailed, tag, mural + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/f72a23c7623eb480737eb73c08bf8423.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-hyperrealism + NAME_ZH: 超现实主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: hyperrealistic art {prompt} . extremely high-resolution details, photographic, realism pushed to extreme, fine texture, incredibly lifelike + NEGATIVE_PROMPT: simplified, abstract, unrealistic, impressionistic, low resolution + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/db378d5a64a8e7ad1e29a4389bda5d1c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-impressionist + NAME_ZH: 印象主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: impressionist painting {prompt} . loose brushwork, vibrant color, light and shadow play, captures feeling over form + NEGATIVE_PROMPT: anime, photorealistic, 35mm film, deformed, glitch, low contrast, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/53b151aec4d5685dfc24511b6705b90e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-pointillism + NAME_ZH: 点彩主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: pointillism style {prompt} . composed entirely of small, distinct dots of color, vibrant, highly detailed + NEGATIVE_PROMPT: line drawing, smooth shading, large color fields, simplistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/23b137a409ee8a8c6ee160c1ddf0659f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-pop art + NAME_ZH: 波普艺术 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: pop Art style {prompt} . bright colors, bold outlines, popular culture themes, ironic or kitsch + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, minimalist + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/bd4faf0e2b7dbc2d0eb21f3ebee97d3d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-psychedelic + NAME_ZH: 迷幻艺术 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: psychedelic style {prompt} . vibrant colors, swirling patterns, abstract forms, surreal, trippy + NEGATIVE_PROMPT: monochrome, black and white, low contrast, realistic, photorealistic, plain, simple + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/7dc0131817f4c31517581dd4a811067b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-renaissance + NAME_ZH: 文艺复兴 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: renaissance style {prompt} . realistic, perspective, light and shadow, religious or mythological themes, highly detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, modernist, minimalist, abstract + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/69796484f61dc2e94d5853f5bbe27c05.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-steampunk + NAME_ZH: 蒸汽朋克 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: steampunk style {prompt} . antique, mechanical, brass and copper tones, gears, intricate, detailed + NEGATIVE_PROMPT: deformed, glitch, noisy, low contrast, anime, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/985005e28858b03c9500a6eb5bd9e201.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-surrealist + NAME_ZH: 超现实主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: surrealist art {prompt} . dreamlike, mysterious, provocative, symbolic, intricate, detailed + NEGATIVE_PROMPT: anime, photorealistic, realistic, deformed, glitch, noisy, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/892d19ec3c429b7148562796df0024db.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-typography + NAME_ZH: 排版艺术 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: typographic art {prompt} . stylized, intricate, detailed, artistic, text-based + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/9adafe1bb169e1ee3f78ba2c1b1cf8d3.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: artstyle-watercolor + NAME_ZH: 水彩艺术 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: watercolor painting {prompt} . vibrant, beautiful, painterly, detailed, textural, artistic + NEGATIVE_PROMPT: anime, photorealistic, 35mm film, deformed, glitch, low contrast, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/29ca23d7a0397e9beaa72e3b63d17551.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-biomechanical + NAME_ZH: 未来生物力学 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: biomechanical style {prompt} . blend of organic and mechanical elements, futuristic, cybernetic, detailed, intricate + NEGATIVE_PROMPT: natural, rustic, primitive, organic, simplistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/5987795487a3fa74469499ae53963d5d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-biomechanical cyberpunk + NAME_ZH: 未来生物力学赛博朋克 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: biomechanical cyberpunk {prompt} . cybernetics, human-machine fusion, dystopian, organic meets artificial, dark, intricate, highly detailed + NEGATIVE_PROMPT: natural, colorful, deformed, sketch, low contrast, watercolor + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/75b56d7cff9b3f011248b3092ae3b8d2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-cybernetic + NAME_ZH: 未来赛博 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: cybernetic style {prompt} . futuristic, technological, cybernetic enhancements, robotics, artificial intelligence themes + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, historical, medieval + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/47df6db04290f01aeee7381aaf12ec07.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-cybernetic robot + NAME_ZH: 未来机器人 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: cybernetic robot {prompt} . android, AI, machine, metal, wires, tech, futuristic, highly detailed + NEGATIVE_PROMPT: organic, natural, human, sketch, watercolor, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/6f18121b4ba22c8ba7834f404501fa4c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-cyberpunk cityscape + NAME_ZH: 未来赛博朋克城市景观 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: cyberpunk cityscape {prompt} . neon lights, dark alleys, skyscrapers, futuristic, vibrant colors, high contrast, highly detailed + NEGATIVE_PROMPT: natural, rural, deformed, low contrast, black and white, sketch, watercolor + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/5e4107dace2c9dd0217a9d1b18ae28f6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-futuristic + NAME_ZH: 未来主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: futuristic style {prompt} . sleek, modern, ultramodern, high tech, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, vintage, antique + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/8a61c0853ee4079bae96ad502a6ae840.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-retro cyberpunk + NAME_ZH: 未来复古赛博朋克 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: retro cyberpunk {prompt} . 80's inspired, synthwave, neon, vibrant, detailed, retro futurism + NEGATIVE_PROMPT: modern, desaturated, black and white, realism, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/460957bf9a07a58ddec08bf22d5b3698.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-retro futurism + NAME_ZH: 未来复古主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: retro-futuristic {prompt} . vintage sci-fi, 50s and 60s style, atomic age, vibrant, highly detailed + NEGATIVE_PROMPT: contemporary, realistic, rustic, primitive + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/0434a7b23a0f936db615d7a9b8e805f1.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-sci-fi + NAME_ZH: 科幻未来主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: sci-fi style {prompt} . futuristic, technological, alien worlds, space themes, advanced civilizations + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, historical, medieval + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/7c3bde651f426273758b68a2805d0c8a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: futuristic-vaporwave + NAME_ZH: 未来波 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: vaporwave style {prompt} . retro aesthetic, cyberpunk, vibrant, neon colors, vintage 80s and 90s style, highly detailed + NEGATIVE_PROMPT: monochrome, muted colors, realism, rustic, minimalist, dark + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/1ebb0bf67ee3ef76288b4c0a2a65d557.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-bubble bobble + NAME_ZH: 游戏-泡泡龙 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: Bubble Bobble style {prompt} . 8-bit, cute, pixelated, fantasy, vibrant, reminiscent of Bubble Bobble game + NEGATIVE_PROMPT: realistic, modern, photorealistic, violent, horror + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/19257352df33228555cb350963d9432a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-cyberpunk game + NAME_ZH: 赛博朋克游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: cyberpunk game style {prompt} . neon, dystopian, futuristic, digital, vibrant, detailed, high contrast, reminiscent of cyberpunk genre video games + NEGATIVE_PROMPT: historical, natural, rustic, low detailed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/6165ef47bc859e3dd0e3399ba2264c2b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-fighting game + NAME_ZH: 格斗游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: fighting game style {prompt} . dynamic, vibrant, action-packed, detailed character design, reminiscent of fighting video games + NEGATIVE_PROMPT: peaceful, calm, minimalist, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/aebda69ec1097dc61966995956ae34cc.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-gta + NAME_ZH: 侠盗猎车手游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: GTA-style artwork {prompt} . satirical, exaggerated, pop art style, vibrant colors, iconic characters, action-packed + NEGATIVE_PROMPT: realistic, black and white, low contrast, impressionist, cubist, noisy, blurry, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/edff7ba5fc983468e79e64beb838b829.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-mario + NAME_ZH: 马里奥游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: Super Mario style {prompt} . vibrant, cute, cartoony, fantasy, playful, reminiscent of Super Mario series + NEGATIVE_PROMPT: realistic, modern, horror, dystopian, violent + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/2a229f623ce89160d1f67620599dfc7c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-minecraft + NAME_ZH: 我的世界游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: Minecraft style {prompt} . blocky, pixelated, vibrant colors, recognizable characters and objects, game assets + NEGATIVE_PROMPT: smooth, realistic, detailed, photorealistic, noise, blurry, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/83e77332a9f234fd8c9cddd29e2ec3c7.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-pokemon + NAME_ZH: 宝可梦游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: Pokémon style {prompt} . vibrant, cute, anime, fantasy, reminiscent of Pokémon series + NEGATIVE_PROMPT: realistic, modern, horror, dystopian, violent + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/9bfe2805e6578875a8dfe2a0ea96c281.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-retro arcade + NAME_ZH: 复古街机 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: retro arcade style {prompt} . 8-bit, pixelated, vibrant, classic video game, old school gaming, reminiscent of 80s and 90s arcade games + NEGATIVE_PROMPT: modern, ultra-high resolution, photorealistic, 3D + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/76885e0b110f1fdf3eaee52fbaf27abf.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-retro game + NAME_ZH: 复古游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: retro game art {prompt} . 16-bit, vibrant colors, pixelated, nostalgic, charming, fun + NEGATIVE_PROMPT: realistic, photorealistic, 35mm film, deformed, glitch, low contrast, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/61fbae41c50f56e24dcf20fe3612d456.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-rpg fantasy game + NAME_ZH: 角色扮演幻想游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: role-playing game (RPG) style fantasy {prompt} . detailed, vibrant, immersive, reminiscent of high fantasy RPG games + NEGATIVE_PROMPT: sci-fi, modern, urban, futuristic, low detailed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/34797baf58e32b4e1a37753fe9dcff5c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-strategy game + NAME_ZH: 策略游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: strategy game style {prompt} . overhead view, detailed map, units, reminiscent of real-time strategy video games + NEGATIVE_PROMPT: first-person view, modern, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/0d276527d22510a1b5f8f74eac2790df.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-streetfighter + NAME_ZH: 街头霸王游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: Street Fighter style {prompt} . vibrant, dynamic, arcade, 2D fighting game, highly detailed, reminiscent of Street Fighter series + NEGATIVE_PROMPT: 3D, realistic, modern, photorealistic, turn-based strategy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/f5927fc2b8d4a8212242bd97adcbdfa1.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: game-zelda + NAME_ZH: 塞尔达传说游戏 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: Legend of Zelda style {prompt} . vibrant, fantasy, detailed, epic, heroic, reminiscent of The Legend of Zelda series + NEGATIVE_PROMPT: sci-fi, modern, realistic, horror + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/4f9eadddbc196268258089b8cc4e5c5c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-architectural + NAME_ZH: 建筑 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: architectural style {prompt} . clean lines, geometric shapes, minimalist, modern, architectural drawing, highly detailed + NEGATIVE_PROMPT: curved lines, ornate, baroque, abstract, grunge + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/488545e9fc9417d62961f42d578547d2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-disco + NAME_ZH: 迪斯科 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: disco-themed {prompt} . vibrant, groovy, retro 70s style, shiny disco balls, neon lights, dance floor, highly detailed + NEGATIVE_PROMPT: minimalist, rustic, monochrome, contemporary, simplistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/784b0ac35e0c0fdb2df21a95d5ca1c55.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-dreamscape + NAME_ZH: 梦境 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: dreamscape {prompt} . surreal, ethereal, dreamy, mysterious, fantasy, highly detailed + NEGATIVE_PROMPT: realistic, concrete, ordinary, mundane + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/2bf77804b5bf352c4e97475b1e8eb29e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-dystopian + NAME_ZH: 反乌托邦 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: dystopian style {prompt} . bleak, post-apocalyptic, somber, dramatic, highly detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, cheerful, optimistic, vibrant, colorful + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/065db0385e126192cbd27e22ca4f154c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-fairy tale + NAME_ZH: 童话故事 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: fairy tale {prompt} . magical, fantastical, enchanting, storybook style, highly detailed + NEGATIVE_PROMPT: realistic, modern, ordinary, mundane + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/578dfe65d9f03e83c95820d4c45cd396.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-gothic + NAME_ZH: 哥特 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: gothic style {prompt} . dark, mysterious, haunting, dramatic, ornate, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, cheerful, optimistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/332a1f8cd655b724cb48bc5c91b764fc.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-grunge + NAME_ZH: 垃圾摇滚 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: grunge style {prompt} . textured, distressed, vintage, edgy, punk rock vibe, dirty, noisy + NEGATIVE_PROMPT: smooth, clean, minimalist, sleek, modern, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/0ccb4c03c6d983b9f6d05ba383f9d690.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-horror + NAME_ZH: 恐怖 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: horror-themed {prompt} . eerie, unsettling, dark, spooky, suspenseful, grim, highly detailed + NEGATIVE_PROMPT: cheerful, bright, vibrant, light-hearted, cute + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/fdca4780d099a39dc50e4553622fba72.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-kawaii + NAME_ZH: 卡哇伊 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: kawaii style {prompt} . cute, adorable, brightly colored, cheerful, anime influence, highly detailed + NEGATIVE_PROMPT: dark, scary, realistic, monochrome, abstract + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/99dab4185e7337189d8959878bfa308b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-lovecraftian + NAME_ZH: 克苏鲁神话 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: lovecraftian horror {prompt} . eldritch, cosmic horror, unknown, mysterious, surreal, highly detailed + NEGATIVE_PROMPT: light-hearted, mundane, familiar, simplistic, realistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/b7c9d084ed62c1c2e1ea080ad95af61e.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-macabre + NAME_ZH: 恐怖的 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: macabre style {prompt} . dark, gothic, grim, haunting, highly detailed + NEGATIVE_PROMPT: bright, cheerful, light-hearted, cartoonish, cute + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/fd7cf2315b27b0434b909020414e1173.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-manga + NAME_ZH: 漫画 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: manga style {prompt} . vibrant, high-energy, detailed, iconic, Japanese comic style + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, Western comic style + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/531aac90b321d39221ba7cf70a97b232.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-metropolis + NAME_ZH: 大都市 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: metropolis-themed {prompt} . urban, cityscape, skyscrapers, modern, futuristic, highly detailed + NEGATIVE_PROMPT: rural, natural, rustic, historical, simple + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/eaad79fe3d7160cec6e0656fc3b02d3c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-minimalist + NAME_ZH: 极简主义 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: minimalist style {prompt} . simple, clean, uncluttered, modern, elegant + NEGATIVE_PROMPT: ornate, complicated, highly detailed, cluttered, disordered, messy, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/e85dd1ccc7f22bdac054d74ba58521b2.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-monochrome + NAME_ZH: 单色 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: monochrome {prompt} . black and white, contrast, tone, texture, detailed + NEGATIVE_PROMPT: colorful, vibrant, noisy, blurry, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/cc793ada6b47561f4b63aa66dcd282ac.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-nautical + NAME_ZH: 航海 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: nautical-themed {prompt} . sea, ocean, ships, maritime, beach, marine life, highly detailed + NEGATIVE_PROMPT: landlocked, desert, mountains, urban, rustic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/3d9f6528180670804a2c5e85c7665c42.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-space + NAME_ZH: 太空 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: space-themed {prompt} . cosmic, celestial, stars, galaxies, nebulas, planets, science fiction, highly detailed + NEGATIVE_PROMPT: earthly, mundane, ground-based, realism + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/6f5742d23b43fc99cc01c8b68518df7c.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-stained glass + NAME_ZH: 彩色玻璃 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: stained glass style {prompt} . vibrant, beautiful, translucent, intricate, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/ab0512ced9ed572075c49ad4f9f9a45d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-techwear fashion + NAME_ZH: 科技服饰 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: techwear fashion {prompt} . futuristic, cyberpunk, urban, tactical, sleek, dark, highly detailed + NEGATIVE_PROMPT: vintage, rural, colorful, low contrast, realism, sketch, watercolor + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/652a6bdb1b36860041222a458c7915d0.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-tribal + NAME_ZH: 部落 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: tribal style {prompt} . indigenous, ethnic, traditional patterns, bold, natural colors, highly detailed + NEGATIVE_PROMPT: modern, futuristic, minimalist, pastel + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/1ecdaf153ece5e16250b87020b7a209b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: misc-zentangle + NAME_ZH: 禅绕画 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: zentangle {prompt} . intricate, abstract, monochrome, patterns, meditative, highly detailed + NEGATIVE_PROMPT: colorful, representative, simplistic, large fields of color + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/80f3488cdb69f0ff13d83a4feac4499d.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-collage + NAME_ZH: 纸艺拼贴 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: collage style {prompt} . mixed media, layered, textural, detailed, artistic + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/c9bbdaba28358faf1a8c1df44b3de950.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-flat papercut + NAME_ZH: 平面剪纸 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: flat papercut style {prompt} . silhouette, clean cuts, paper, sharp edges, minimalist, color block + NEGATIVE_PROMPT: 3D, high detail, noise, grainy, blurry, painting, drawing, photo, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/1bffcd9a4086b29c367b8301f26eed3b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-kirigami + NAME_ZH: 剪纸 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: kirigami representation of {prompt} . 3D, paper folding, paper cutting, Japanese, intricate, symmetrical, precision, clean lines + NEGATIVE_PROMPT: painting, drawing, 2D, noisy, blurry, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/2e5f95977b97b2a6248924e118a23076.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-paper mache + NAME_ZH: 纸浆塑型 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: paper mache representation of {prompt} . 3D, sculptural, textured, handmade, vibrant, fun + NEGATIVE_PROMPT: 2D, flat, photo, sketch, digital art, deformed, noisy, blurry + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/68441f668fcf7a51db5fc9b9d4d45ce7.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-paper quilling + NAME_ZH: 纸卷艺术 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: paper quilling art of {prompt} . intricate, delicate, curling, rolling, shaping, coiling, loops, 3D, dimensional, ornamental + NEGATIVE_PROMPT: photo, painting, drawing, 2D, flat, deformed, noisy, blurry + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/8c0504eb14341b66796612c46bb3748b.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-papercut collage + NAME_ZH: 剪纸拼贴 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: papercut collage of {prompt} . mixed media, textured paper, overlapping, asymmetrical, abstract, vibrant + NEGATIVE_PROMPT: photo, 3D, realistic, drawing, painting, high detail, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/217e7c8b905b63c63c94bd6ff8fe3477.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-papercut shadow box + NAME_ZH: 剪纸影箱 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: 3D papercut shadow box of {prompt} . layered, dimensional, depth, silhouette, shadow, papercut, handmade, high contrast + NEGATIVE_PROMPT: painting, drawing, photo, 2D, flat, high detail, blurry, noisy, disfigured + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/2af0d61de1b17a5a5257f512549f9616.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-stacked papercut + NAME_ZH: 堆叠剪纸 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: stacked papercut art of {prompt} . 3D, layered, dimensional, depth, precision cut, stacked layers, papercut, high contrast + NEGATIVE_PROMPT: 2D, flat, noisy, blurry, painting, drawing, photo, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/62618e32e90539827e0eb279a6ea170a.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: papercraft-thick layered papercut + NAME_ZH: 厚层剪纸 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: thick layered papercut art of {prompt} . deep 3D, volumetric, dimensional, depth, thick paper, high stack, heavy texture, tangible layers + NEGATIVE_PROMPT: 2D, flat, thin paper, low stack, smooth texture, painting, drawing, photo, deformed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/17008c40a6be8d41d3921ee88bac27ad.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-alien + NAME_ZH: 异形 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: alien-themed {prompt} . extraterrestrial, cosmic, otherworldly, mysterious, sci-fi, highly detailed + NEGATIVE_PROMPT: earthly, mundane, common, realistic, simple + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/eae6043dee2b2d94cd9a22cb044db8b3.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-film noir + NAME_ZH: 黑色电影 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: film noir style {prompt} . monochrome, high contrast, dramatic shadows, 1940s style, mysterious, cinematic + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, vibrant, colorful + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/0b3629be5ebb7cda463877a1993a0298.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-glamour + NAME_ZH: 魅力 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: glamorous photo {prompt} . high fashion, luxurious, extravagant, stylish, sensual, opulent, elegance, stunning beauty, professional, high contrast, detailed + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, distorted, grainy, sketch, low contrast, dull, plain, modest + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/f85dc6aa5d7f7d6d3663f2270e276796.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-hdr + NAME_ZH: 高动态范围 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: HDR photo of {prompt} . High dynamic range, vivid, rich details, clear shadows and highlights, realistic, intense, enhanced contrast, highly detailed + NEGATIVE_PROMPT: flat, low contrast, oversaturated, underexposed, overexposed, blurred, noisy + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/269a98b284ae1345b0e5ac1f85c33179.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-iphone photographic + NAME_ZH: iPhone摄影 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: iphone photo {prompt} . large depth of field, deep depth of field, highly detailed + NEGATIVE_PROMPT: drawing, painting, crayon, sketch, graphite, impressionist, noisy, blurry, soft, deformed, ugly, shallow depth of field, bokeh + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/48c556a6b3c3a533847b80b031cd4962.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-long exposure + NAME_ZH: 长曝光 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: long exposure photo of {prompt} . Blurred motion, streaks of light, surreal, dreamy, ghosting effect, highly detailed + NEGATIVE_PROMPT: static, noisy, deformed, shaky, abrupt, flat, low contrast + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/fda88c3fc43ea8cc04ce9b5c0261627f.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-neon noir + NAME_ZH: 霓虹黑色 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: neon noir {prompt} . cyberpunk, dark, rainy streets, neon signs, high contrast, low light, vibrant, highly detailed + NEGATIVE_PROMPT: bright, sunny, daytime, low contrast, black and white, sketch, watercolor + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/8a5b71434592771e064af4b9017b59d6.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-silhouette + NAME_ZH: 剪影 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: silhouette style {prompt} . high contrast, minimalistic, black and white, stark, dramatic + NEGATIVE_PROMPT: ugly, deformed, noisy, blurry, low contrast, color, realism, photorealistic + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/1892a37e66d33cdd9b713aaab6b8c597.png + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: photo-tilt-shift + NAME_ZH: 倾斜移位 + DESCRIPTION: + SOURCE: twri + BASE_MODEL: SD2.1 + PROMPT: tilt-shift photo of {prompt} . selective focus, miniature effect, blurred background, highly detailed, vibrant, perspective control + NEGATIVE_PROMPT: blurry, noisy, deformed, flat, low contrast, unrealistic, oversaturated, underexposed + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/d058a157de848a5c03d9a3e1e0e560a2.png + PROMPT_EXAMPLE: a boy wearing green jacket diff --git a/scepter/methods/studio/extensions/tuners/official_tuners.yaml b/scepter/methods/studio/extensions/tuners/official_tuners.yaml new file mode 100644 index 0000000..99ee032 --- /dev/null +++ b/scepter/methods/studio/extensions/tuners/official_tuners.yaml @@ -0,0 +1,721 @@ +TUNERS: + - + NAME: Caricature + NAME_ZH: 夸张漫画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/894f40ed44b37c3372e6a22b8ae577a4.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/Caricature + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Caricature + NAME_ZH: 夸张漫画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/894f40ed44b37c3372e6a22b8ae577a4.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/Caricature + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Caricature + NAME_ZH: 夸张漫画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/894f40ed44b37c3372e6a22b8ae577a4.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/Caricature + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Color Field Painting + NAME_ZH: 色域绘画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/80e5b4075c572c04cbb4e48c37b8366b.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/ColorFieldPainting + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Color Field Painting + NAME_ZH: 色域绘画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/80e5b4075c572c04cbb4e48c37b8366b.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/ColorFieldPainting + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Color Field Painting + NAME_ZH: 色域绘画 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/80e5b4075c572c04cbb4e48c37b8366b.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/ColorFieldPainting + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Colored Pencil Art + NAME_ZH: 彩色铅笔艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/9ae235d7f1a7c2a4edab52a5e9f9cbae.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/ColoredPencilArt + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Colored Pencil Art + NAME_ZH: 彩色铅笔艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/9ae235d7f1a7c2a4edab52a5e9f9cbae.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/ColoredPencilArt + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Colored Pencil Art + NAME_ZH: 彩色铅笔艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/9ae235d7f1a7c2a4edab52a5e9f9cbae.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/ColoredPencilArt + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dark Moody Atmosphere + NAME_ZH: 暗色忧郁氛围 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/3da915da2f5cedaf243e57e08163f35b.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/DarkMoodyAtmosphere + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dark Moody Atmosphere + NAME_ZH: 暗色忧郁氛围 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/3da915da2f5cedaf243e57e08163f35b.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/DarkMoodyAtmosphere + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dark Moody Atmosphere + NAME_ZH: 暗色忧郁氛围 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/3da915da2f5cedaf243e57e08163f35b.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/DarkMoodyAtmosphere + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dripping Paint Splatter Art + NAME_ZH: 滴漆溅画艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/69fd81f5983107acc3d334af62915851.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/DrippingPaintSplatterArt + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dripping Paint Splatter Art + NAME_ZH: 滴漆溅画艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/69fd81f5983107acc3d334af62915851.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/DrippingPaintSplatterArt + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Dripping Paint Splatter Art + NAME_ZH: 滴漆溅画艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/69fd81f5983107acc3d334af62915851.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/DrippingPaintSplatterArt + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Faded Polaroid Photo + NAME_ZH: 褪色的宝丽来照片 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/f152edb4b3ca6248758b48115258ddfa.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/FadedPolaroidPhoto + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Faded Polaroid Photo + NAME_ZH: 褪色的宝丽来照片 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/f152edb4b3ca6248758b48115258ddfa.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/FadedPolaroidPhoto + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Faded Polaroid Photo + NAME_ZH: 褪色的宝丽来照片 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/f152edb4b3ca6248758b48115258ddfa.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/FadedPolaroidPhoto + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Flat 2D Art + NAME_ZH: 扁平2D艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/940cfd34155634cf051e1b2942cca426.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/Flat2DArt + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Flat 2D Art + NAME_ZH: 扁平2D艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/940cfd34155634cf051e1b2942cca426.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/Flat2DArt + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Flat 2D Art + NAME_ZH: 扁平2D艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/940cfd34155634cf051e1b2942cca426.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/Flat2DArt + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Graffiti Art + NAME_ZH: 涂鸦艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/57b751b11564cb22cd49ef21f2004a5f.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/GraffitiArt + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Graffiti Art + NAME_ZH: 涂鸦艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/57b751b11564cb22cd49ef21f2004a5f.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/GraffitiArt + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Graffiti Art + NAME_ZH: 涂鸦艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/57b751b11564cb22cd49ef21f2004a5f.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/GraffitiArt + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Impressionism + NAME_ZH: 印象主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/0312b673dc6858a9864d7f45f0c5c1fc.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/Impressionism + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Impressionism + NAME_ZH: 印象主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/0312b673dc6858a9864d7f45f0c5c1fc.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/Impressionism + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Impressionism + NAME_ZH: 印象主义 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/0312b673dc6858a9864d7f45f0c5c1fc.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/Impressionism + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Logo Design + NAME_ZH: 标志设计 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/9aa040b0c60d289da9610c91ad9b7c7e.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/LogoDesign + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Logo Design + NAME_ZH: 标志设计 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/9aa040b0c60d289da9610c91ad9b7c7e.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/LogoDesign + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Logo Design + NAME_ZH: 标志设计 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/9aa040b0c60d289da9610c91ad9b7c7e.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/LogoDesign + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Pencil Sketch Drawing + NAME_ZH: 铅笔素描 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/a9056e1eac85e5e4fe96a93917d4cce4.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/PencilSketchDrawing + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Pencil Sketch Drawing + NAME_ZH: 铅笔素描 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/a9056e1eac85e5e4fe96a93917d4cce4.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/PencilSketchDrawing + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Pencil Sketch Drawing + NAME_ZH: 铅笔素描 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/a9056e1eac85e5e4fe96a93917d4cce4.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/PencilSketchDrawing + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Silhouette Art + NAME_ZH: 剪影艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/568777f447fc02510b618152726d5002.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/SilhouetteArt + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Silhouette Art + NAME_ZH: 剪影艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/568777f447fc02510b618152726d5002.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/SilhouetteArt + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Silhouette Art + NAME_ZH: 剪影艺术 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/568777f447fc02510b618152726d5002.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/SilhouetteArt + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Steampunk 2 + NAME_ZH: 蒸汽朋克 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/07d7b27cd73f2d43684003563511c15b.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/Steampunk2 + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Steampunk 2 + NAME_ZH: 蒸汽朋克 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/07d7b27cd73f2d43684003563511c15b.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/Steampunk2 + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Steampunk 2 + NAME_ZH: 蒸汽朋克 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/07d7b27cd73f2d43684003563511c15b.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/Steampunk2 + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Sticker Designs + NAME_ZH: 贴纸设计 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/2d1e9867058db2c57f2fe47530de3243.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/StickerDesigns + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Sticker Designs + NAME_ZH: 贴纸设计 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/2d1e9867058db2c57f2fe47530de3243.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/StickerDesigns + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Sticker Designs + NAME_ZH: 贴纸设计 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/2d1e9867058db2c57f2fe47530de3243.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/StickerDesigns + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Watercolor 2 + NAME_ZH: 水彩 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/8859d532ae5901cc8457d6118fb9b7da.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/Watercolor2 + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Watercolor 2 + NAME_ZH: 水彩 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/8859d532ae5901cc8457d6118fb9b7da.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/Watercolor2 + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: Watercolor 2 + NAME_ZH: 水彩 + DESCRIPTION: + SOURCE: diva + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/8859d532ae5901cc8457d6118fb9b7da.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/Watercolor2 + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-elemental-art + NAME_ZH: MRE元素艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/5895d78cf58c1ca05178991f37cc48ff.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/mre-elemental-art + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-elemental-art + NAME_ZH: MRE元素艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/5895d78cf58c1ca05178991f37cc48ff.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/mre-elemental-art + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-elemental-art + NAME_ZH: MRE元素艺术 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/5895d78cf58c1ca05178991f37cc48ff.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/mre-elemental-art + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-anime + NAME_ZH: MRE动漫 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/a08149bc8e50f6bc65c0010d4cd416f8.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/mre-anime + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-anime + NAME_ZH: MRE动漫 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/a08149bc8e50f6bc65c0010d4cd416f8.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/mre-anime + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-anime + NAME_ZH: MRE动漫 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/a08149bc8e50f6bc65c0010d4cd416f8.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/mre-anime + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-comic + NAME_ZH: MRE漫画书 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/48c65cebf1fa4284d7b8feb619412e65.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/mre-comic + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-comic + NAME_ZH: MRE漫画书 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/48c65cebf1fa4284d7b8feb619412e65.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/mre-comic + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: mre-comic + NAME_ZH: MRE漫画书 + DESCRIPTION: + SOURCE: mre + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/48c65cebf1fa4284d7b8feb619412e65.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/mre-comic + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-craft clay + NAME_ZH: SAI手工粘土 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/8fc51113f725f27326c4398a7457cd6d.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/sai-craftclay + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-craft clay + NAME_ZH: SAI手工粘土 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/8fc51113f725f27326c4398a7457cd6d.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/sai-craftclay + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-craft clay + NAME_ZH: SAI手工粘土 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/8fc51113f725f27326c4398a7457cd6d.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/sai-craftclay + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-fantasy art + NAME_ZH: SAI幻想艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/a6f8d92afcd5803dfb2ebecbc92091b6.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/sai-fantasyart + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-fantasy art + NAME_ZH: SAI幻想艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/a6f8d92afcd5803dfb2ebecbc92091b6.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/sai-fantasyart + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-fantasy art + NAME_ZH: SAI幻想艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/a6f8d92afcd5803dfb2ebecbc92091b6.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/sai-fantasyart + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-line art + NAME_ZH: SAI线条艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/034a51b0dd34b018be8859bf45b4f7ed.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/sai-lineart + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-line art + NAME_ZH: SAI线条艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/034a51b0dd34b018be8859bf45b4f7ed.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/sai-lineart + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-line art + NAME_ZH: SAI线条艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/034a51b0dd34b018be8859bf45b4f7ed.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/sai-lineart + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-neonpunk + NAME_ZH: SAI霓虹朋克 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/7e9ed25bb34008beb5f417df63c4b2fe.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/sai-neonpunk + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-neonpunk + NAME_ZH: SAI霓虹朋克 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/7e9ed25bb34008beb5f417df63c4b2fe.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/sai-neonpunk + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-neonpunk + NAME_ZH: SAI霓虹朋克 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/7e9ed25bb34008beb5f417df63c4b2fe.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/sai-neonpunk + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-origami + NAME_ZH: SAI折纸 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/924f46a8f276011a0953d7988e90ee25.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/sai-origami + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-origami + NAME_ZH: SAI折纸 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/924f46a8f276011a0953d7988e90ee25.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/sai-origami + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-origami + NAME_ZH: SAI折纸 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/924f46a8f276011a0953d7988e90ee25.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/sai-origami + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-pixel art + NAME_ZH: SAI像素艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD_XL1.0 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD_XL1.0/a5ab89c0960be8c1216e65c98d92ae4a.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/sai-pixelart + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-pixel art + NAME_ZH: SAI像素艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD2.1 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD2.1/a5ab89c0960be8c1216e65c98d92ae4a.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD2.1/sai-pixelart + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket + - + NAME: sai-pixel art + NAME_ZH: SAI像素艺术 + DESCRIPTION: + SOURCE: sai + BASE_MODEL: SD1.5 + IMAGE_PATH: ms://damo/scepter@mantra_images/SD1.5/a5ab89c0960be8c1216e65c98d92ae4a.png + MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD1.5/sai-pixelart + TUNER_TYPE: SwiftSCE + PROMPT_EXAMPLE: a boy wearing green jacket diff --git a/scepter/methods/studio/home/home.yaml b/scepter/methods/studio/home/home.yaml new file mode 100644 index 0000000..e760d92 --- /dev/null +++ b/scepter/methods/studio/home/home.yaml @@ -0,0 +1,95 @@ +WORK_DIR: home +FILE_SYSTEM: + - + NAME: LocalFs + AUTO_CLEAN: False +DESC_INFO: + ZH_INFO: | +

    基本介绍

    +

    + + + + +
    + +

    SCEPTER Studio是基于开源基模型和自研微调编辑算法构建的生成定制和编辑工具箱,提供围绕生成、微调、编辑、数据处理等一系列的工具和插件。

    +

    +

    + EN_INFO: | +

    Introduction

    +

    + + + + +
    + +

    SCEPTER Studio is a customized generation and editing toolkit built on the open-source base models and proprietary fine-tuning editing algorithms, offering a range of tools and plugins centered around generation, fine-tuning, editing, and data processing.

    +

    +

    +GUIDE_INFO: + ZH_INFO: | +

    用户指南

    + + + +
    +
    + +
    训练与推理演示
    +
    +
    + + EN_INFO: | +

    User Guide

    + + + +
    +
    + +
    Train & Inference Video
    +
    +
    + \ No newline at end of file diff --git a/scepter/methods/studio/inference/inference.yaml b/scepter/methods/studio/inference/inference.yaml new file mode 100644 index 0000000..33a78b3 --- /dev/null +++ b/scepter/methods/studio/inference/inference.yaml @@ -0,0 +1,117 @@ +WORK_DIR: "inference" +DIFFUSION_PARAS: + SAMPLE: + VALUES: ['ddim', 'euler', 'euler_ancestral', 'heun', 'dpm2', + 'dpm2_ancestral', 'dpmpp_2m', 'dpmpp_sde', 'dpmpp_2m_sde', 'dpmpp_2s_ancestral', + 'dpm2_karras', 'dpm2_ancestral_karras', 'dpmpp_2s_ancestral_karras', 'dpmpp_2m_karras', + 'dpmpp_sde_karras', 'dpmpp_2m_sde_karras'] + DEFAULT: 'dpmpp_2s_ancestral' + NEGATIVE_PROMPT: + DEFAULT: + PROMPT_PREFIX: + DEFAULT: + SAMPLES: + MIN: 1 + MAX: 4 + DEFAULT: 1 + SAMPLE_STEPS: + MIN: 1 + MAX: 100 + DEFAULT: 30 + GUIDE_SCALE: + MIN: 0 + MAX: 10 + DEFAULT: 5.0 + GUIDE_RESCALE: + MIN: 0 + MAX: 1.0 + DEFAULT: 0.5 + DISCRETIZATION: + VALUES: ["trailing", "leading", "linspace"] + DEFAULT: "linspace" + REFINE_SAMPLERS: + VALUES: [ 'ddim', 'euler', 'euler_ancestral', 'heun', 'dpm2', + 'dpm2_ancestral', 'dpmpp_2m', 'dpmpp_sde', 'dpmpp_2m_sde', 'dpmpp_2s_ancestral', + 'dpm2_karras', 'dpm2_ancestral_karras', 'dpmpp_2s_ancestral_karras', 'dpmpp_2m_karras', + 'dpmpp_sde_karras', 'dpmpp_2m_sde_karras' ] + DEFAULT: 'dpmpp_2s_ancestral' + REFINE_SAMPLE_STEPS: + MIN: 0 + MAX: 100 + DEFAULT: 30 + REFINE_GUIDE_SCALE: + MIN: 0 + MAX: 10 + DEFAULT: 5.0 + REFINE_GUIDE_RESCALE: + MIN: 0 + MAX: 1.0 + DEFAULT: 0.5 + REFINE_DISCRETIZATION: + VALUES: [ "trailing", "leading", "linspace" ] + DEFAULT: "linspace" + AESTHETIC_SCORE: + MIN: 0.0 + MAX: 10.0 + DEFAULT: 6.0 + NEGATIVE_AESTHETIC_SCORE: + MIN: 0.0 + MAX: 10.0 + DEFAULT: 2.5 + REFINE_STRENGTH: + MIN: 0 + MAX: 1.0 + DEFAULT: 0.15 + RESOLUTIONS: + VALUES: [[704, 1408], [704, 1344], [768, 1344], + [720, 1280], + [768, 1280], [832, 1216], [832, 1152], + [896, 1152], [896, 1088], [960, 1088], + [960, 1024], [1024, 1024], [1024, 960], + [1088, 960], [1088, 896], [1152, 896], + [1152, 832], [1216, 832], [1280, 720], + [1280, 768], + [1344, 768], [1344, 704], [1408, 704], + [1472, 704], [1536, 640], [1600, 640], + [1664, 576], [1728, 576]] + DEFAULT: [1024, 1024] +EXTENSION_PARAS: + MANTRA_BOOK: scepter/methods/studio/extensions/mantra_book/mantra_book.yaml + OFFICIAL_TUNERS: scepter/methods/studio/extensions/tuners/official_tuners.yaml + OFFICIAL_CONTROLLERS: scepter/methods/studio/extensions/controllers/official_controllers.yaml +CONTROLABLE_ANNOTATORS: + - + NAME: "CannyAnnotator" + LOW_THRESHOLD: 100 + HIGH_THRESHOLD: 200 + TYPE: Canny + IS_DEFAULT: True + - + NAME: "HedAnnotator" + PRETRAINED_MODEL: "ms://damo/scepter_scedit@annotator/ckpts/ControlNetHED.pth" + TYPE: Hed + IS_DEFAULT: False + - + NAME: "OpenposeAnnotator" + BODY_MODEL_PATH: "ms://damo/scepter_scedit@annotator/ckpts/body_pose_model.pth" + HAND_MODEL_PATH: "ms://damo/scepter_scedit@annotator/ckpts/hand_pose_model.pth" + TYPE: Openpose + IS_DEFAULT: False + - + NAME: "MidasDetector" + PRETRAINED_MODEL: "ms://damo/scepter_scedit@annotator/ckpts/dpt_hybrid-midas-501f0c75.pt" + A: 6.2 + BG_TH: 0.1 + TYPE: Midas + IS_DEFAULT: False + - + NAME: "ColorAnnotator" + TYPE: Color + IS_DEFAULT: False + - + NAME: "MLSDdetector" + PRETRAINED_MODEL: "ms://damo/scepter_scedit@annotator/ckpts/mlsd_large_512_fp32.pth" + THR_V: 0.1 + THR_D: 0.1 + TYPE: MLSD + IS_DEFAULT: False diff --git a/scepter/methods/studio/inference/sdxl/sdxl1.0_pro.yaml b/scepter/methods/studio/inference/sdxl/sdxl1.0_pro.yaml new file mode 100644 index 0000000..ef45d41 --- /dev/null +++ b/scepter/methods/studio/inference/sdxl/sdxl1.0_pro.yaml @@ -0,0 +1,242 @@ +NAME: SD_XL1.0 +IS_DEFAULT: True +DEFAULT_PARAS: + PARAS: + RESOLUTIONS: [[1024, 1024]] + INPUT: + IMAGE: + ORIGINAL_SIZE_AS_TUPLE: [1024, 1024] + TARGET_SIZE_AS_TUPLE: [1024, 1024] + AESTHETIC_SCORE: 6.0 + NEGATIVE_AESTHETIC_SCORE: 2.5 + PROMPT: "" + NEGATIVE_PROMPT: "" + PROMPT_PREFIX: "" + CROP_COORDS_TOP_LEFT: [0, 0] + SAMPLE: ddim + SAMPLE_STEPS: 50 + GUIDE_SCALE: 7.5 + GUIDE_RESCALE: 0.5 + DISCRETIZATION: trailing + REFINE_SAMPLE: ddim + REFINE_GUIDE_SCALE: 7.5 + REFINE_GUIDE_RESCALE: 0.5 + REFINE_DISCRETIZATION: trailing + OUTPUT: + LATENT: + BEFORE_REFINE_IMAGES: + IMAGES: + SEED: + MODULES_PARAS: + FIRST_STAGE_MODEL: + FUNCTION: + - + NAME: encode + DTYPE: float32 + INPUT: ["IMAGE"] + - + NAME: decode + DTYPE: float32 + INPUT: ["LATENT"] + PARAS: + # SCALE_FACTOR DESCRIPTION: The vae embeding scale. TYPE: float default: 0.18215 + SCALE_FACTOR: 0.13025 + SIZE_FACTOR: 8 + DIFFUSION_MODEL: + FUNCTION: + - + NAME: forward + DTYPE: float16 + INPUT: ["SAMPLE_STEPS", "SAMPLE", "GUIDE_SCALE", "GUIDE_RESCALE", "DISCRETIZATION"] + COND_STAGE_MODEL: + FUNCTION: + - + NAME: encode + DTYPE: float16 + INPUT: ["ORIGINAL_SIZE_AS_TUPLE", "CROP_COORDS_TOP_LEFT", "PROMPT", "NEGATIVE_PROMPT"] + REFINER_MODEL: + FUNCTION: + - + NAME: forward + DTYPE: float16 + INPUT: ["SAMPLE_STEPS", "REFINE_SAMPLE", "REFINE_GUIDE_SCALE", "REFINE_GUIDE_RESCALE", "REFINE_DISCRETIZATION"] + REFINER_COND_MODEL: + FUNCTION: + - + NAME: encode + DTYPE: float16 + INPUT: ["ORIGINAL_SIZE_AS_TUPLE", "AESTHETIC_SCORE", "NEGATIVE_AESTHETIC_SCORE", "CROP_COORDS_TOP_LEFT", "PROMPT", "NEGATIVE_PROMPT"] + +MODEL: + PRETRAINED_MODEL: ms://AI-ModelScope/stable-diffusion-xl-base-1.0@sd_xl_base_1.0.safetensors + # SCHEDULE_ARGS DESCRIPTION: TYPE: default: '' + SCHEDULE: + PARAMETERIZATION: "eps" + TIMESTEPS: 1000 + ZERO_TERMINAL_SNR: False + SCHEDULE_ARGS: + # NAME DESCRIPTION: TYPE: default: '' + NAME: "scaled_linear" + BETA_MIN: 0.00085 + BETA_MAX: 0.0120 + # DIFFUSION_MODEL DESCRIPTION: TYPE: default: '' + DIFFUSION_MODEL: + # NAME DESCRIPTION: TYPE: default: 'DiffusionUNetXL' + NAME: DiffusionUNetXL + # PRETRAINED_MODEL DESCRIPTION: Whole model's pretrained model path. TYPE: NoneType default: None + PRETRAINED_MODEL: + # IN_CHANNELS DESCRIPTION: Unet channels for input, considering the input image's channels. TYPE: int default: 4 + IN_CHANNELS: 4 + # OUT_CHANNELS DESCRIPTION: Unet channels for output, considering the input image's channels. TYPE: int default: 4 + OUT_CHANNELS: 4 + # NUM_RES_BLOCKS DESCRIPTION: The blocks's number of res. TYPE: int default: 2 + NUM_RES_BLOCKS: 2 + # MODEL_CHANNELS DESCRIPTION: base channel count for the model. TYPE: int default: 320 + MODEL_CHANNELS: 320 + # ATTENTION_RESOLUTIONS DESCRIPTION: A collection of downsample rates at which attention will take place. May be a set, list, or tuple. For example, if this contains 4, then at 4x downsampling, attentio will be used. TYPE: list default: [4, 2] + ATTENTION_RESOLUTIONS: [4, 2] + # DROPOUT DESCRIPTION: The dropout rate. TYPE: int default: 0 + DROPOUT: 0 + # CHANNEL_MULT DESCRIPTION: channel multiplier for each level of the UNet. TYPE: list default: [1, 2, 4] + CHANNEL_MULT: [1, 2, 4] + # CONV_RESAMPLE DESCRIPTION: Use conv to resample when downsample. TYPE: bool default: True + CONV_RESAMPLE: True + # DIMS DESCRIPTION: The Conv dims which 2 represent Conv2D. TYPE: int default: 2 + DIMS: 2 + # NUM_CLASSES DESCRIPTION: The class num for class guided setting, also can be set as continuous. TYPE: str default: 'sequential' + NUM_CLASSES: sequential + # USE_CHECKPOINT DESCRIPTION: Use gradient checkpointing to reduce memory usage. TYPE: bool default: False + USE_CHECKPOINT: False + # NUM_HEADS DESCRIPTION: The number of attention heads in each attention layer. TYPE: int default: -1 + NUM_HEADS: -1 + # NUM_HEADS_CHANNELS DESCRIPTION: If specified, ignore num_heads and instead use a fixed channel width per attention head. TYPE: int default: 64 + NUM_HEADS_CHANNELS: 64 + # USE_SCALE_SHIFT_NORM DESCRIPTION: The scale and shift for the outnorm of RESBLOCK, use a FiLM-like conditioning mechanism. TYPE: bool default: False + USE_SCALE_SHIFT_NORM: False + # RESBLOCK_UPDOWN DESCRIPTION: Use residual blocks for up/downsampling, if False use Conv. TYPE: bool default: False + RESBLOCK_UPDOWN: False + # USE_NEW_ATTENTION_ORDER DESCRIPTION: Whether use new attention(qkv before split heads or not) or not. TYPE: bool default: True + USE_NEW_ATTENTION_ORDER: True + # USE_SPATIAL_TRANSFORMER DESCRIPTION: Custom transformer which support the context, if context_dim is not None, the parameter must set True TYPE: bool default: True + USE_SPATIAL_TRANSFORMER: True + # TRANSFORMER_DEPTH DESCRIPTION: Custom transformer's depth, valid when USE_SPATIAL_TRANSFORMER is True. TYPE: list default: [1, 2, 10] + TRANSFORMER_DEPTH: [1, 2, 10] + # TRANSFORMER_DEPTH_MIDDLE DESCRIPTION: Custom transformer's depth of middle block, If set None, use TRANSFORMER_DEPTH last value. TYPE: NoneType default: None + # TRANSFORMER_DEPTH_MIDDLE: None + # CONTEXT_DIM DESCRIPTION: Custom context info, if set, USE_SPATIAL_TRANSFORMER also set True. TYPE: int default: 2048 + CONTEXT_DIM: 2048 + # DISABLE_SELF_ATTENTIONS DESCRIPTION: Whether disable the self-attentions on some level, should be a list, [False, True, ...] TYPE: NoneType default: None + # DISABLE_SELF_ATTENTIONS: None + # NUM_ATTENTION_BLOCKS DESCRIPTION: The number of attention blocks for attention layer. TYPE: NoneType default: None + # NUM_ATTENTION_BLOCKS: None + # DISABLE_MIDDLE_SELF_ATTN DESCRIPTION: Whether disable the self-attentions in middle blocks. TYPE: bool default: False + DISABLE_MIDDLE_SELF_ATTN: False + # USE_LINEAR_IN_TRANSFORMER DESCRIPTION: Custom transformer's parameter, valid when USE_SPATIAL_TRANSFORMER is True. TYPE: bool default: True + USE_LINEAR_IN_TRANSFORMER: True + # ADM_IN_CHANNELS DESCRIPTION: Used when num_classes == 'sequential' or 'timestep'. TYPE: int default: 2816 + ADM_IN_CHANNELS: 2816 + # USE_SENTENCE_EMB DESCRIPTION: Used sentence emb or not, default False. TYPE: bool default: False + USE_SENTENCE_EMB: False + # USE_WORD_MAPPING DESCRIPTION: Used word mapping or not, default False. TYPE: bool default: False + USE_WORD_MAPPING: False + # FIRST_STAGE_MODEL DESCRIPTION: TYPE: default: '' + FIRST_STAGE_MODEL: + NAME: AutoencoderKL + EMBED_DIM: 4 + IGNORE_KEYS: [ ] + BATCH_SIZE: 1 + # + ENCODER: + NAME: Encoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DOUBLE_Z: True + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + # + DECODER: + NAME: Decoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + GIVE_PRE_END: False + TANH_OUT: False + # COND_STAGE_MODEL DESCRIPTION: TYPE: default: '' + COND_STAGE_MODEL: + # NAME DESCRIPTION: TYPE: default: 'GeneralConditioner' + NAME: GeneralConditioner + USE_GRAD: False + # EMBEDDERS DESCRIPTION: TYPE: default: '' + EMBEDDERS: + - + # NAME DESCRIPTION: TYPE: default: 'FrozenCLIPEmbedder' + NAME: FrozenCLIPEmbedder + # PRETRAINED_MODEL DESCRIPTION: TYPE: str default: '' + PRETRAINED_MODEL: ms://AI-ModelScope/clip-vit-large-patch14 + TOKENIZER_PATH: ms://AI-ModelScope/clip-vit-large-patch14 + # MAX_LENGTH DESCRIPTION: TYPE: int default: 77 + MAX_LENGTH: 77 + # FREEZE DESCRIPTION: TYPE: bool default: True + FREEZE: True + # LAYER DESCRIPTION: TYPE: str default: 'last' + LAYER: hidden + # LAYER_IDX DESCRIPTION: TYPE: NoneType default: None + LAYER_IDX: 11 + # USE_FINAL_LAYER_NORM DESCRIPTION: TYPE: bool default: False + USE_FINAL_LAYER_NORM: False + UCG_RATE: 0.0 + INPUT_KEYS: ["prompt"] + LEGACY_UCG_VALUE: + - + # NAME DESCRIPTION: TYPE: default: 'FrozenOpenCLIPEmbedder2' + NAME: FrozenOpenCLIPEmbedder2 + # ARCH DESCRIPTION: TYPE: str default: 'ViT-H-14' + ARCH: ViT-bigG-14 + # MAX_LENGTH DESCRIPTION: TYPE: int default: 77 + MAX_LENGTH: 77 + # FREEZE DESCRIPTION: TYPE: bool default: True + FREEZE: True + # ALWAYS_RETURN_POOLED DESCRIPTION: Whether always return pooled results or not ,default False. TYPE: bool default: False + ALWAYS_RETURN_POOLED: True + # LEGACY DESCRIPTION: Whether use legacy returnd feature or not ,default True. TYPE: bool default: True + LEGACY: False + # LAYER DESCRIPTION: TYPE: str default: 'last' + LAYER: penultimate + UCG_RATE: 0.0 + INPUT_KEYS: ["prompt"] + LEGACY_UCG_VALUE: + - + # NAME DESCRIPTION: TYPE: default: 'ConcatTimestepEmbedderND' + NAME: ConcatTimestepEmbedderND + # OUT_DIM DESCRIPTION: Output dim TYPE: int default: 256 + OUT_DIM: 256 + UCG_RATE: 0.0 + INPUT_KEYS: ["original_size_as_tuple"] + LEGACY_UCG_VALUE: + - + # NAME DESCRIPTION: TYPE: default: 'ConcatTimestepEmbedderND' + NAME: ConcatTimestepEmbedderND + # OUT_DIM DESCRIPTION: Output dim TYPE: int default: 256 + OUT_DIM: 256 + UCG_RATE: 0.0 + INPUT_KEYS: ["crop_coords_top_left"] + LEGACY_UCG_VALUE: + - + # NAME DESCRIPTION: TYPE: default: 'ConcatTimestepEmbedderND' + NAME: ConcatTimestepEmbedderND + # OUT_DIM DESCRIPTION: Output dim TYPE: int default: 256 + OUT_DIM: 256 + UCG_RATE: 0.0 + INPUT_KEYS: ["target_size_as_tuple"] + LEGACY_UCG_VALUE: diff --git a/scepter/methods/studio/inference/stable_diffusion/sd15_pro.yaml b/scepter/methods/studio/inference/stable_diffusion/sd15_pro.yaml new file mode 100644 index 0000000..d817eb5 --- /dev/null +++ b/scepter/methods/studio/inference/stable_diffusion/sd15_pro.yaml @@ -0,0 +1,126 @@ +NAME: SD1.5 +IS_DEFAULT: False +DEFAULT_PARAS: + PARAS: + RESOLUTIONS: [[512, 512]] + INPUT: + IMAGE: + PROMPT: "" + NEGATIVE_PROMPT: "" + TARGET_SIZE_AS_TUPLE: [512, 512] + PROMPT_PREFIX: "" + SAMPLE: ddim + SAMPLE_STEPS: 50 + GUIDE_SCALE: 7.5 + GUIDE_RESCALE: 0.5 + DISCRETIZATION: trailing + OUTPUT: + LATENT: + IMAGES: + SEED: + MODULES_PARAS: + FIRST_STAGE_MODEL: + FUNCTION: + - + NAME: encode + DTYPE: float16 + INPUT: ["IMAGE"] + - + NAME: decode + DTYPE: float16 + INPUT: ["LATENT"] + PARAS: + # SCALE_FACTOR DESCRIPTION: The vae embeding scale. TYPE: float default: 0.18215 + SCALE_FACTOR: 0.18215 + SIZE_FACTOR: 8 + DIFFUSION_MODEL: + FUNCTION: + - + NAME: forward + DTYPE: float16 + INPUT: ["SAMPLE_STEPS", "SAMPLE", "GUIDE_SCALE", "GUIDE_RESCALE", "DISCRETIZATION"] + COND_STAGE_MODEL: + FUNCTION: + - + NAME: encode_text + DTYPE: float16 + INPUT: ["PROMPT", "NEGATIVE_PROMPT"] + +MODEL: + PRETRAINED_MODEL: ms://AI-ModelScope/stable-diffusion-v1-5@v1-5-pruned-emaonly.safetensors + SCHEDULE: + PARAMETERIZATION: "eps" + TIMESTEPS: 1000 + ZERO_TERMINAL_SNR: False + SCHEDULE_ARGS: + # NAME DESCRIPTION: TYPE: default: '' + NAME: "scaled_linear" + BETA_MIN: 0.00085 + BETA_MAX: 0.0120 + # + DIFFUSION_MODEL: + NAME: DiffusionUNet + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + MODEL_CHANNELS: 320 + NUM_HEADS: 8 + NUM_RES_BLOCKS: 2 + ATTENTION_RESOLUTIONS: [ 4, 2, 1 ] + CHANNEL_MULT: [ 1, 2, 4, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + USE_CHECKPOINT: False + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: 1 + CONTEXT_DIM: 768 + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: False + IGNORE_KEYS: [] + # + FIRST_STAGE_MODEL: + NAME: AutoencoderKL + EMBED_DIM: 4 + IGNORE_KEYS: [] + BATCH_SIZE: 4 + # + ENCODER: + NAME: Encoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DOUBLE_Z: True + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + # + DECODER: + NAME: Decoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + GIVE_PRE_END: False + TANH_OUT: False + # + TOKENIZER: + NAME: ClipTokenizer + PRETRAINED_PATH: ms://AI-ModelScope/clip-vit-large-patch14 + LENGTH: 77 + CLEAN: True + # + COND_STAGE_MODEL: + NAME: FrozenCLIPEmbedder + FREEZE: True + USE_GRAD: False + LAYER: last + PRETRAINED_MODEL: ms://AI-ModelScope/clip-vit-large-patch14 diff --git a/scepter/methods/studio/inference/stable_diffusion/sd21_pro.yaml b/scepter/methods/studio/inference/stable_diffusion/sd21_pro.yaml new file mode 100644 index 0000000..44d5205 --- /dev/null +++ b/scepter/methods/studio/inference/stable_diffusion/sd21_pro.yaml @@ -0,0 +1,124 @@ +NAME: SD2.1 +IS_DEFAULT: False +DEFAULT_PARAS: + PARAS: + RESOLUTIONS: [[768, 768]] + INPUT: + IMAGE: + PROMPT: "" + NEGATIVE_PROMPT: "" + PROMPT_PREFIX: "" + TARGET_SIZE_AS_TUPLE: [768, 768] + SAMPLE: ddim + SAMPLE_STEPS: 50 + GUIDE_SCALE: 7.5 + GUIDE_RESCALE: 0.5 + DISCRETIZATION: trailing + OUTPUT: + LATENT: + IMAGES: + SEED: + MODULES_PARAS: + FIRST_STAGE_MODEL: + FUNCTION: + - + NAME: encode + DTYPE: float16 + INPUT: ["IMAGE"] + - + NAME: decode + DTYPE: float16 + INPUT: ["LATENT"] + PARAS: + # SCALE_FACTOR DESCRIPTION: The vae embeding scale. TYPE: float default: 0.18215 + SCALE_FACTOR: 0.18215 + SIZE_FACTOR: 8 + DIFFUSION_MODEL: + FUNCTION: + - + NAME: forward + DTYPE: float16 + INPUT: ["SAMPLE_STEPS", "SAMPLE", "GUIDE_SCALE", "GUIDE_RESCALE", "DISCRETIZATION"] + COND_STAGE_MODEL: + FUNCTION: + - + NAME: encode_text + DTYPE: float16 + INPUT: ["PROMPT", "NEGATIVE_PROMPT"] + +MODEL: + PRETRAINED_MODEL: ms://AI-ModelScope/stable-diffusion-2-1@v2-1_768-ema-pruned.safetensors + SCHEDULE: + PARAMETERIZATION: "v" + TIMESTEPS: 1000 + ZERO_TERMINAL_SNR: False + SCHEDULE_ARGS: + # NAME DESCRIPTION: TYPE: default: '' + NAME: "scaled_linear" + BETA_MIN: 0.00085 + BETA_MAX: 0.0120 + # + DIFFUSION_MODEL: + NAME: DiffusionUNet + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + MODEL_CHANNELS: 320 + NUM_HEADS_CHANNELS: 64 + NUM_RES_BLOCKS: 2 + ATTENTION_RESOLUTIONS: [ 4, 2, 1 ] + CHANNEL_MULT: [ 1, 2, 4, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + USE_CHECKPOINT: False + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: 1 + CONTEXT_DIM: 1024 + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: True + PRETRAINED_MODEL: + # + FIRST_STAGE_MODEL: + NAME: AutoencoderKL + EMBED_DIM: 4 + PRETRAINED_MODEL: + IGNORE_KEYS: [ ] + BATCH_SIZE: 4 + # + ENCODER: + NAME: Encoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DOUBLE_Z: True + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + # + DECODER: + NAME: Decoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + GIVE_PRE_END: False + TANH_OUT: False + # + TOKENIZER: + NAME: OpenClipTokenizer + LENGTH: 77 + # + COND_STAGE_MODEL: + NAME: FrozenOpenCLIPEmbedder + ARCH: ViT-H-14 + PRETRAINED_MODEL: + LAYER: penultimate diff --git a/scepter/methods/studio/preprocess/preprocess.yaml b/scepter/methods/studio/preprocess/preprocess.yaml new file mode 100644 index 0000000..c54f678 --- /dev/null +++ b/scepter/methods/studio/preprocess/preprocess.yaml @@ -0,0 +1,7 @@ +WORK_DIR: datasets +EXPORT_DIR: export_datasets +FILE_SYSTEM: + - + # NAME DESCRIPTION: TYPE: default: '' + NAME: LocalFs + AUTO_CLEAN: False diff --git a/scepter/methods/studio/scepter_ui.yaml b/scepter/methods/studio/scepter_ui.yaml new file mode 100644 index 0000000..b3587e1 --- /dev/null +++ b/scepter/methods/studio/scepter_ui.yaml @@ -0,0 +1,85 @@ +HOST: "localhost" +PORT: 2024 +ROOT: "" +TITLE: SCEPTER Studio +BANNER: | + + + + +WORK_DIR: "cache/scepter_ui" +FILE_SYSTEM: + - + NAME: "ModelscopeFs" + TEMP_DIR: "cache/cache_data" + - + NAME: "HttpFs" + TEMP_DIR: "cache/cache_data" +INTERFACE: + - NAME: 首页 + NAME_EN: Home + IFID: home + CONFIG: scepter/methods/studio/home/home.yaml + - NAME: 数据管理 + NAME_EN: Dataset Management + IFID: preprocess + CONFIG: scepter/methods/studio/preprocess/preprocess.yaml + - NAME: 训练 + NAME_EN: Train + IFID: self_train + CONFIG: scepter/methods/studio/self_train/self_train.yaml + - NAME: 推理 + NAME_EN: Inference + IFID: inference + CONFIG: scepter/methods/studio/inference/inference.yaml diff --git a/scepter/methods/studio/self_train/sd_xl/sdxl_pro.yaml b/scepter/methods/studio/self_train/sd_xl/sdxl_pro.yaml new file mode 100644 index 0000000..dfee523 --- /dev/null +++ b/scepter/methods/studio/self_train/sd_xl/sdxl_pro.yaml @@ -0,0 +1,600 @@ +ENV: + BACKEND: nccl + +META: + VERSION: 'SD_XL1.0' + DESCRIPTION: "Stable Diffusion XL1.0" + IS_DEFAULT: True + INFERENCE_PARAS: + INFERENCE_BATCH_SIZE: 1 + INFERENCE_PREFIX: "" + DEFAULT_SAMPLER: "dpmpp_2s_ancestral" + DEFAULT_SAMPLE_STEPS: 40 + INFERENCE_N_PROMPT: "" + RESOLUTION: 1024 + PARAS: + - + TRAIN_BATCH_SIZE: 2 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: 1024 + MEMORY: 29000 + EPOCHS: 50 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: False + TUNER: FULL + - + TRAIN_BATCH_SIZE: 2 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: 1024 + MEMORY: 29000 + EPOCHS: 50 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: False + TUNER: LORA + - + TRAIN_BATCH_SIZE: 2 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: 1024 + MEMORY: 29000 + EPOCHS: 200 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: False + TUNER: SCE + - + TRAIN_BATCH_SIZE: 2 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: 1024 + MEMORY: 29000 + EPOCHS: 200 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: True + TUNER: TEXT_SCE + - + TRAIN_BATCH_SIZE: 2 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: 1024 + MEMORY: 29000 + EPOCHS: 50 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: False + TUNER: TEXT_LORA + + TUNERS: + LORA: + - + NAME: SwiftLoRA + R: 256 + LORA_ALPHA: 256 + LORA_DROPOUT: 0.0 + BIAS: "none" + TARGET_MODULES: "model.*(to_q|to_k|to_v|to_out.0|net.0.proj|net.2)$" + TEXT_LORA: + - + NAME: SwiftLoRA + R: 256 + LORA_ALPHA: 256 + LORA_DROPOUT: 0.0 + BIAS: "none" + TARGET_MODULES: "(cond_stage_model.embedders.0.*(q_proj|k_proj|v_proj|out_proj|mlp.fc1|mlp.fc2))|(model.*(to_q|to_k|to_v|to_out.0|net.0.proj|net.2))$" + SCE: + - + NAME: SwiftSCETuning + DIMS: [1280, 1280, 640, 640, 640, 320, 320, 320, 320] + TARGET_MODULES: model.lsc_identity\.\d+$ + DOWN_RATIO: 1.0 + TUNER_MODE: identity + TEXT_SCE: + - + NAME: SwiftSCETuning + DIMS: [ 1280, 1280, 640, 640, 640, 320, 320, 320, 320 ] + TARGET_MODULES: model.lsc_identity\.\d+$ + DOWN_RATIO: 1.0 + TUNER_MODE: identity + - + NAME: SwiftLoRA + R: 256 + LORA_ALPHA: 256 + LORA_DROPOUT: 0.0 + BIAS: "none" + TARGET_MODULES: "cond_stage_model.embedders.0.*(q_proj|k_proj|v_proj|out_proj|mlp.fc1|mlp.fc2)$" + + MODIFY_PARAS: + TEXT_LORA: + TRAIN: + SOLVER.MODEL.COND_STAGE_MODEL.USE_GRAD: True + TEXT_SCE: + TRAIN: + SOLVER.MODEL.COND_STAGE_MODEL.USE_GRAD: True + +SOLVER: + # NAME DESCRIPTION: TYPE: default: 'LatentDiffusionSolver' + NAME: LatentDiffusionSolver + # MAX_STEPS DESCRIPTION: The total steps for training. TYPE: int default: 100000 + MAX_STEPS: 2000 + # USE_AMP DESCRIPTION: Use amp to surpport mix precision or not, default is False. TYPE: bool default: False + USE_AMP: False + # DTYPE DESCRIPTION: The precision for training. TYPE: str default: 'float32' + DTYPE: float16 + # USE_FAIRSCALE DESCRIPTION: Use fairscale as the backend of ddp, default False. TYPE: bool default: False + USE_FAIRSCALE: False + # USE_FSDP DESCRIPTION: Use fsdp as the backend of ddp, default False. TYPE: bool default: False + USE_FSDP: False + # SHARDING_STRATEGY DESCRIPTION: The shard strategy for fsdp, select from ['full_shard', 'shard_grad_op'] TYPE: str default: 'shard_grad_op' + SHARDING_STRATEGY: + # LOAD_MODEL_ONLY DESCRIPTION: Only load the model rather than the optimizer and schedule, default is False. TYPE: bool default: False + LOAD_MODEL_ONLY: False + # CHANNELS_LAST DESCRIPTION: The channels last, default is False. TYPE: bool default: False + CHANNELS_LAST: False + # RESUME_FROM DESCRIPTION: Resume from some state of training! TYPE: str default: '' + RESUME_FROM: + # MAX_EPOCHS DESCRIPTION: Max epochs for training. TYPE: int default: 10 + MAX_EPOCHS: -1 + # NUM_FOLDS DESCRIPTION: Num folds for training. TYPE: int default: 1 + NUM_FOLDS: 1 + # WORK_DIR DESCRIPTION: Save dir of the training log or model. TYPE: str default: '' + WORK_DIR: + # LOG_FILE DESCRIPTION: Save log path. TYPE: str default: '' + LOG_FILE: stg_log.txt + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + TUNER: + # MODEL DESCRIPTION: TYPE: default: '' + MODEL: + # NAME DESCRIPTION: + NAME: LatentDiffusionXL + # PARAMETERIZATION DESCRIPTION: The prediction type, you can choose from 'eps' and 'x0' and 'v' TYPE: str default: 'v' + PARAMETERIZATION: eps + # TIMESTEPS DESCRIPTION: The schedule steps for diffusion. TYPE: int default: 1000 + TIMESTEPS: 1000 + # MIN_SNR_GAMMA DESCRIPTION: The minimum snr gamma, default is None. TYPE: NoneType default: None + # MIN_SNR_GAMMA: None + # ZERO_TERMINAL_SNR DESCRIPTION: Whether zero terminal snr, default is False. TYPE: bool default: False + ZERO_TERMINAL_SNR: False + # PRETRAINED_MODEL DESCRIPTION: Whole model's pretrained model path. TYPE: NoneType default: None + PRETRAINED_MODEL: ms://AI-ModelScope/stable-diffusion-xl-base-1.0@sd_xl_base_1.0.safetensors + # IGNORE_KEYS DESCRIPTION: The ignore keys for pretrain model loaded. TYPE: list default: [] + IGNORE_KEYS: [ ] + # SCALE_FACTOR DESCRIPTION: The vae embeding scale. TYPE: float default: 0.18215 + SCALE_FACTOR: 0.13025 + # SIZE_FACTOR DESCRIPTION: The vae size factor. TYPE: int default: 8 + SIZE_FACTOR: 8 + # DEFAULT_N_PROMPT DESCRIPTION: The default negtive prompt. TYPE: str default: '' + DEFAULT_N_PROMPT: "" + # TRAIN_N_PROMPT DESCRIPTION: The negtive prompt used in train phase. TYPE: str default: '' + TRAIN_N_PROMPT: "" + # P_ZERO DESCRIPTION: The prob for zero or negtive prompt. TYPE: float default: 0.0 + P_ZERO: 0.1 + # USE_EMA DESCRIPTION: Use Ema or not. Default True TYPE: bool default: True + USE_EMA: False + LOAD_REFINER: False + # SCHEDULE_ARGS DESCRIPTION: TYPE: default: '' + SCHEDULE_ARGS: + # NAME DESCRIPTION: TYPE: default: '' + "NAME": "scaled_linear" + "BETA_MIN": 0.00085 + "BETA_MAX": 0.0120 + # DIFFUSION_MODEL DESCRIPTION: TYPE: default: '' + DIFFUSION_MODEL: + # NAME DESCRIPTION: TYPE: default: 'DiffusionUNetXL' + NAME: DiffusionUNetXL + # PRETRAINED_MODEL DESCRIPTION: Whole model's pretrained model path. TYPE: NoneType default: None + PRETRAINED_MODEL: + # IN_CHANNELS DESCRIPTION: Unet channels for input, considering the input image's channels. TYPE: int default: 4 + IN_CHANNELS: 4 + # OUT_CHANNELS DESCRIPTION: Unet channels for output, considering the input image's channels. TYPE: int default: 4 + OUT_CHANNELS: 4 + # NUM_RES_BLOCKS DESCRIPTION: The blocks's number of res. TYPE: int default: 2 + NUM_RES_BLOCKS: 2 + # MODEL_CHANNELS DESCRIPTION: base channel count for the model. TYPE: int default: 320 + MODEL_CHANNELS: 320 + # ATTENTION_RESOLUTIONS DESCRIPTION: A collection of downsample rates at which attention will take place. May be a set, list, or tuple. For example, if this contains 4, then at 4x downsampling, attentio will be used. TYPE: list default: [4, 2] + ATTENTION_RESOLUTIONS: [4, 2] + # DROPOUT DESCRIPTION: The dropout rate. TYPE: int default: 0 + DROPOUT: 0 + # CHANNEL_MULT DESCRIPTION: channel multiplier for each level of the UNet. TYPE: list default: [1, 2, 4] + CHANNEL_MULT: [1, 2, 4] + # CONV_RESAMPLE DESCRIPTION: Use conv to resample when downsample. TYPE: bool default: True + CONV_RESAMPLE: True + # DIMS DESCRIPTION: The Conv dims which 2 represent Conv2D. TYPE: int default: 2 + DIMS: 2 + # NUM_CLASSES DESCRIPTION: The class num for class guided setting, also can be set as continuous. TYPE: str default: 'sequential' + NUM_CLASSES: sequential + # USE_CHECKPOINT DESCRIPTION: Use gradient checkpointing to reduce memory usage. TYPE: bool default: False + USE_CHECKPOINT: False + # NUM_HEADS DESCRIPTION: The number of attention heads in each attention layer. TYPE: int default: -1 + NUM_HEADS: -1 + # NUM_HEADS_CHANNELS DESCRIPTION: If specified, ignore num_heads and instead use a fixed channel width per attention head. TYPE: int default: 64 + NUM_HEADS_CHANNELS: 64 + # USE_SCALE_SHIFT_NORM DESCRIPTION: The scale and shift for the outnorm of RESBLOCK, use a FiLM-like conditioning mechanism. TYPE: bool default: False + USE_SCALE_SHIFT_NORM: False + # RESBLOCK_UPDOWN DESCRIPTION: Use residual blocks for up/downsampling, if False use Conv. TYPE: bool default: False + RESBLOCK_UPDOWN: False + # USE_NEW_ATTENTION_ORDER DESCRIPTION: Whether use new attention(qkv before split heads or not) or not. TYPE: bool default: True + USE_NEW_ATTENTION_ORDER: True + # USE_SPATIAL_TRANSFORMER DESCRIPTION: Custom transformer which support the context, if context_dim is not None, the parameter must set True TYPE: bool default: True + USE_SPATIAL_TRANSFORMER: True + # TRANSFORMER_DEPTH DESCRIPTION: Custom transformer's depth, valid when USE_SPATIAL_TRANSFORMER is True. TYPE: list default: [1, 2, 10] + TRANSFORMER_DEPTH: [1, 2, 10] + # TRANSFORMER_DEPTH_MIDDLE DESCRIPTION: Custom transformer's depth of middle block, If set None, use TRANSFORMER_DEPTH last value. TYPE: NoneType default: None + # TRANSFORMER_DEPTH_MIDDLE: None + # CONTEXT_DIM DESCRIPTION: Custom context info, if set, USE_SPATIAL_TRANSFORMER also set True. TYPE: int default: 2048 + CONTEXT_DIM: 2048 + # DISABLE_SELF_ATTENTIONS DESCRIPTION: Whether disable the self-attentions on some level, should be a list, [False, True, ...] TYPE: NoneType default: None + # DISABLE_SELF_ATTENTIONS: None + # NUM_ATTENTION_BLOCKS DESCRIPTION: The number of attention blocks for attention layer. TYPE: NoneType default: None + # NUM_ATTENTION_BLOCKS: None + # DISABLE_MIDDLE_SELF_ATTN DESCRIPTION: Whether disable the self-attentions in middle blocks. TYPE: bool default: False + DISABLE_MIDDLE_SELF_ATTN: False + # USE_LINEAR_IN_TRANSFORMER DESCRIPTION: Custom transformer's parameter, valid when USE_SPATIAL_TRANSFORMER is True. TYPE: bool default: True + USE_LINEAR_IN_TRANSFORMER: True + # ADM_IN_CHANNELS DESCRIPTION: Used when num_classes == 'sequential' or 'timestep'. TYPE: int default: 2816 + ADM_IN_CHANNELS: 2816 + # USE_SENTENCE_EMB DESCRIPTION: Used sentence emb or not, default False. TYPE: bool default: False + USE_SENTENCE_EMB: False + # USE_WORD_MAPPING DESCRIPTION: Used word mapping or not, default False. TYPE: bool default: False + USE_WORD_MAPPING: False + # DIFFUSION_MODEL_EMA DESCRIPTION: TYPE: default: '' + DIFFUSION_MODEL_EMA: + # NAME DESCRIPTION: TYPE: default: 'DiffusionUNetXL' + NAME: DiffusionUNetXL + # IN_CHANNELS DESCRIPTION: Unet channels for input, considering the input image's channels. TYPE: int default: 4 + IN_CHANNELS: 4 + # OUT_CHANNELS DESCRIPTION: Unet channels for output, considering the input image's channels. TYPE: int default: 4 + OUT_CHANNELS: 4 + # NUM_RES_BLOCKS DESCRIPTION: The blocks's number of res. TYPE: int default: 2 + NUM_RES_BLOCKS: 2 + # MODEL_CHANNELS DESCRIPTION: base channel count for the model. TYPE: int default: 320 + MODEL_CHANNELS: 320 + # ATTENTION_RESOLUTIONS DESCRIPTION: A collection of downsample rates at which attention will take place. May be a set, list, or tuple. For example, if this contains 4, then at 4x downsampling, attentio will be used. TYPE: list default: [4, 2] + ATTENTION_RESOLUTIONS: [4, 2] + # DROPOUT DESCRIPTION: The dropout rate. TYPE: int default: 0 + DROPOUT: 0 + # CHANNEL_MULT DESCRIPTION: channel multiplier for each level of the UNet. TYPE: list default: [1, 2, 4] + CHANNEL_MULT: [1, 2, 4] + # CONV_RESAMPLE DESCRIPTION: Use conv to resample when downsample. TYPE: bool default: True + CONV_RESAMPLE: True + # DIMS DESCRIPTION: The Conv dims which 2 represent Conv2D. TYPE: int default: 2 + DIMS: 2 + # NUM_CLASSES DESCRIPTION: The class num for class guided setting, also can be set as continuous. TYPE: str default: 'sequential' + NUM_CLASSES: sequential + # USE_CHECKPOINT DESCRIPTION: Use gradient checkpointing to reduce memory usage. TYPE: bool default: False + USE_CHECKPOINT: False + # NUM_HEADS DESCRIPTION: The number of attention heads in each attention layer. TYPE: int default: -1 + NUM_HEADS: -1 + # NUM_HEADS_CHANNELS DESCRIPTION: If specified, ignore num_heads and instead use a fixed channel width per attention head. TYPE: int default: 64 + NUM_HEADS_CHANNELS: 64 + # USE_SCALE_SHIFT_NORM DESCRIPTION: The scale and shift for the outnorm of RESBLOCK, use a FiLM-like conditioning mechanism. TYPE: bool default: False + USE_SCALE_SHIFT_NORM: False + # RESBLOCK_UPDOWN DESCRIPTION: Use residual blocks for up/downsampling, if False use Conv. TYPE: bool default: False + RESBLOCK_UPDOWN: False + # USE_NEW_ATTENTION_ORDER DESCRIPTION: Whether use new attention(qkv before split heads or not) or not. TYPE: bool default: True + USE_NEW_ATTENTION_ORDER: True + # USE_SPATIAL_TRANSFORMER DESCRIPTION: Custom transformer which support the context, if context_dim is not None, the parameter must set True TYPE: bool default: True + USE_SPATIAL_TRANSFORMER: True + # TRANSFORMER_DEPTH DESCRIPTION: Custom transformer's depth, valid when USE_SPATIAL_TRANSFORMER is True. TYPE: list default: [1, 2, 10] + TRANSFORMER_DEPTH: [1, 2, 10] + # TRANSFORMER_DEPTH_MIDDLE DESCRIPTION: Custom transformer's depth of middle block, If set None, use TRANSFORMER_DEPTH last value. TYPE: NoneType default: None + # TRANSFORMER_DEPTH_MIDDLE: None + # CONTEXT_DIM DESCRIPTION: Custom context info, if set, USE_SPATIAL_TRANSFORMER also set True. TYPE: int default: 2048 + CONTEXT_DIM: 2048 + # DISABLE_SELF_ATTENTIONS DESCRIPTION: Whether disable the self-attentions on some level, should be a list, [False, True, ...] TYPE: NoneType default: None + # DISABLE_SELF_ATTENTIONS: None + # NUM_ATTENTION_BLOCKS DESCRIPTION: The number of attention blocks for attention layer. TYPE: NoneType default: None + # NUM_ATTENTION_BLOCKS: None + # DISABLE_MIDDLE_SELF_ATTN DESCRIPTION: Whether disable the self-attentions in middle blocks. TYPE: bool default: False + DISABLE_MIDDLE_SELF_ATTN: False + # USE_LINEAR_IN_TRANSFORMER DESCRIPTION: Custom transformer's parameter, valid when USE_SPATIAL_TRANSFORMER is True. TYPE: bool default: True + USE_LINEAR_IN_TRANSFORMER: True + # ADM_IN_CHANNELS DESCRIPTION: Used when num_classes == 'sequential' or 'timestep'. TYPE: int default: 2816 + ADM_IN_CHANNELS: 2816 + # USE_SENTENCE_EMB DESCRIPTION: Used sentence emb or not, default False. TYPE: bool default: False + USE_SENTENCE_EMB: False + # USE_WORD_MAPPING DESCRIPTION: Used word mapping or not, default False. TYPE: bool default: False + USE_WORD_MAPPING: False + # FIRST_STAGE_MODEL DESCRIPTION: TYPE: default: '' + FIRST_STAGE_MODEL: + NAME: AutoencoderKL + EMBED_DIM: 4 + PRETRAINED_MODEL: + IGNORE_KEYS: [ ] + BATCH_SIZE: 1 + # + ENCODER: + NAME: Encoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DOUBLE_Z: True + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + # + DECODER: + NAME: Decoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + GIVE_PRE_END: False + TANH_OUT: False + # COND_STAGE_MODEL DESCRIPTION: TYPE: default: '' + COND_STAGE_MODEL: + # NAME DESCRIPTION: TYPE: default: 'GeneralConditioner' + NAME: GeneralConditioner + PRETRAINED_MODEL: + USE_GRAD: False + # EMBEDDERS DESCRIPTION: TYPE: default: '' + EMBEDDERS: + - + # NAME DESCRIPTION: TYPE: default: 'FrozenCLIPEmbedder' + NAME: FrozenCLIPEmbedder + PRETRAINED_MODEL: ms://AI-ModelScope/clip-vit-large-patch14 + TOKENIZER_PATH: ms://AI-ModelScope/clip-vit-large-patch14 + # MAX_LENGTH DESCRIPTION: TYPE: int default: 77 + MAX_LENGTH: 77 + # FREEZE DESCRIPTION: TYPE: bool default: True + FREEZE: True + # LAYER DESCRIPTION: TYPE: str default: 'last' + LAYER: hidden + # LAYER_IDX DESCRIPTION: TYPE: NoneType default: None + LAYER_IDX: 11 + # USE_FINAL_LAYER_NORM DESCRIPTION: TYPE: bool default: False + USE_FINAL_LAYER_NORM: False + UCG_RATE: 0.0 + INPUT_KEYS: ["prompt"] + LEGACY_UCG_VALUE: + - + # NAME DESCRIPTION: TYPE: default: 'FrozenOpenCLIPEmbedder2' + NAME: FrozenOpenCLIPEmbedder2 + # ARCH DESCRIPTION: TYPE: str default: 'ViT-H-14' + ARCH: ViT-bigG-14 + # MAX_LENGTH DESCRIPTION: TYPE: int default: 77 + MAX_LENGTH: 77 + # FREEZE DESCRIPTION: TYPE: bool default: True + FREEZE: True + # ALWAYS_RETURN_POOLED DESCRIPTION: Whether always return pooled results or not ,default False. TYPE: bool default: False + ALWAYS_RETURN_POOLED: True + # LEGACY DESCRIPTION: Whether use legacy returnd feature or not ,default True. TYPE: bool default: True + LEGACY: False + # LAYER DESCRIPTION: TYPE: str default: 'last' + LAYER: penultimate + UCG_RATE: 0.0 + INPUT_KEYS: ["prompt"] + LEGACY_UCG_VALUE: + - + # NAME DESCRIPTION: TYPE: default: 'ConcatTimestepEmbedderND' + NAME: ConcatTimestepEmbedderND + # OUT_DIM DESCRIPTION: Output dim TYPE: int default: 256 + OUT_DIM: 256 + UCG_RATE: 0.0 + INPUT_KEYS: ["original_size_as_tuple"] + LEGACY_UCG_VALUE: + - + # NAME DESCRIPTION: TYPE: default: 'ConcatTimestepEmbedderND' + NAME: ConcatTimestepEmbedderND + # OUT_DIM DESCRIPTION: Output dim TYPE: int default: 256 + OUT_DIM: 256 + UCG_RATE: 0.0 + INPUT_KEYS: ["crop_coords_top_left"] + LEGACY_UCG_VALUE: + - + # NAME DESCRIPTION: TYPE: default: 'ConcatTimestepEmbedderND' + NAME: ConcatTimestepEmbedderND + # OUT_DIM DESCRIPTION: Output dim TYPE: int default: 256 + OUT_DIM: 256 + UCG_RATE: 0.0 + INPUT_KEYS: ["target_size_as_tuple"] + LEGACY_UCG_VALUE: + # APPLY REFINER + REFINER_MODEL: + # NAME DESCRIPTION: TYPE: default: 'DiffusionUNetXL' + NAME: DiffusionUNetXL + # PRETRAINED_MODEL DESCRIPTION: Whole model's pretrained model path. TYPE: NoneType default: None + PRETRAINED_MODEL: + # IN_CHANNELS DESCRIPTION: Unet channels for input, considering the input image's channels. TYPE: int default: 4 + IN_CHANNELS: 4 + # OUT_CHANNELS DESCRIPTION: Unet channels for output, considering the input image's channels. TYPE: int default: 4 + OUT_CHANNELS: 4 + # NUM_RES_BLOCKS DESCRIPTION: The blocks's number of res. TYPE: int default: 2 + NUM_RES_BLOCKS: 2 + # MODEL_CHANNELS DESCRIPTION: base channel count for the model. TYPE: int default: 320 + MODEL_CHANNELS: 384 + # ATTENTION_RESOLUTIONS DESCRIPTION: A collection of downsample rates at which attention will take place. May be a set, list, or tuple. For example, if this contains 4, then at 4x downsampling, attentio will be used. TYPE: list default: [4, 2] + ATTENTION_RESOLUTIONS: [ 4, 2 ] + # DROPOUT DESCRIPTION: The dropout rate. TYPE: int default: 0 + DROPOUT: 0 + # CHANNEL_MULT DESCRIPTION: channel multiplier for each level of the UNet. TYPE: list default: [1, 2, 4] + CHANNEL_MULT: [ 1, 2, 4, 4 ] + # CONV_RESAMPLE DESCRIPTION: Use conv to resample when downsample. TYPE: bool default: True + CONV_RESAMPLE: True + # DIMS DESCRIPTION: The Conv dims which 2 represent Conv2D. TYPE: int default: 2 + DIMS: 2 + # NUM_CLASSES DESCRIPTION: The class num for class guided setting, also can be set as continuous. TYPE: str default: 'sequential' + NUM_CLASSES: sequential + # USE_CHECKPOINT DESCRIPTION: Use gradient checkpointing to reduce memory usage. TYPE: bool default: False + USE_CHECKPOINT: False + # NUM_HEADS DESCRIPTION: The number of attention heads in each attention layer. TYPE: int default: -1 + NUM_HEADS: -1 + # NUM_HEADS_CHANNELS DESCRIPTION: If specified, ignore num_heads and instead use a fixed channel width per attention head. TYPE: int default: 64 + NUM_HEADS_CHANNELS: 64 + # USE_SCALE_SHIFT_NORM DESCRIPTION: The scale and shift for the outnorm of RESBLOCK, use a FiLM-like conditioning mechanism. TYPE: bool default: False + USE_SCALE_SHIFT_NORM: False + # RESBLOCK_UPDOWN DESCRIPTION: Use residual blocks for up/downsampling, if False use Conv. TYPE: bool default: False + RESBLOCK_UPDOWN: False + # USE_NEW_ATTENTION_ORDER DESCRIPTION: Whether use new attention(qkv before split heads or not) or not. TYPE: bool default: True + USE_NEW_ATTENTION_ORDER: True + # USE_SPATIAL_TRANSFORMER DESCRIPTION: Custom transformer which support the context, if context_dim is not None, the parameter must set True TYPE: bool default: True + USE_SPATIAL_TRANSFORMER: True + # TRANSFORMER_DEPTH DESCRIPTION: Custom transformer's depth, valid when USE_SPATIAL_TRANSFORMER is True. TYPE: list default: [1, 2, 10] + TRANSFORMER_DEPTH: 4 + # TRANSFORMER_DEPTH_MIDDLE DESCRIPTION: Custom transformer's depth of middle block, If set None, use TRANSFORMER_DEPTH last value. TYPE: NoneType default: None + # TRANSFORMER_DEPTH_MIDDLE: None + # CONTEXT_DIM DESCRIPTION: Custom context info, if set, USE_SPATIAL_TRANSFORMER also set True. TYPE: int default: 2048 + CONTEXT_DIM: [ 1280, 1280, 1280, 1280 ] + # DISABLE_SELF_ATTENTIONS DESCRIPTION: Whether disable the self-attentions on some level, should be a list, [False, True, ...] TYPE: NoneType default: None + # DISABLE_SELF_ATTENTIONS: None + # NUM_ATTENTION_BLOCKS DESCRIPTION: The number of attention blocks for attention layer. TYPE: NoneType default: None + # NUM_ATTENTION_BLOCKS: None + # DISABLE_MIDDLE_SELF_ATTN DESCRIPTION: Whether disable the self-attentions in middle blocks. TYPE: bool default: False + DISABLE_MIDDLE_SELF_ATTN: False + # USE_LINEAR_IN_TRANSFORMER DESCRIPTION: Custom transformer's parameter, valid when USE_SPATIAL_TRANSFORMER is True. TYPE: bool default: True + USE_LINEAR_IN_TRANSFORMER: True + # ADM_IN_CHANNELS DESCRIPTION: Used when num_classes == 'sequential' or 'timestep'. TYPE: int default: 2816 + ADM_IN_CHANNELS: 2560 + # USE_SENTENCE_EMB DESCRIPTION: Used sentence emb or not, default False. TYPE: bool default: False + USE_SENTENCE_EMB: False + # USE_WORD_MAPPING DESCRIPTION: Used word mapping or not, default False. TYPE: bool default: False + USE_WORD_MAPPING: False + # COND_STAGE_MODEL DESCRIPTION: TYPE: default: '' + REFINER_COND_MODEL: + # NAME DESCRIPTION: TYPE: default: 'GeneralConditioner' + NAME: GeneralConditioner + PRETRAINED_MODEL: + # EMBEDDERS DESCRIPTION: TYPE: default: '' + EMBEDDERS: + - + # NAME DESCRIPTION: TYPE: default: 'FrozenOpenCLIPEmbedder2' + NAME: FrozenOpenCLIPEmbedder2 + # ARCH DESCRIPTION: TYPE: str default: 'ViT-H-14' + ARCH: ViT-bigG-14 + # MAX_LENGTH DESCRIPTION: TYPE: int default: 77 + MAX_LENGTH: 77 + # FREEZE DESCRIPTION: TYPE: bool default: True + FREEZE: True + # ALWAYS_RETURN_POOLED DESCRIPTION: Whether always return pooled results or not ,default False. TYPE: bool default: False + ALWAYS_RETURN_POOLED: True + # LEGACY DESCRIPTION: Whether use legacy returnd feature or not ,default True. TYPE: bool default: True + LEGACY: False + # LAYER DESCRIPTION: TYPE: str default: 'last' + LAYER: penultimate + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: ["prompt"] + LEGACY_UCG_VALUE: + - + # NAME DESCRIPTION: TYPE: default: 'ConcatTimestepEmbedderND' + NAME: ConcatTimestepEmbedderND + # OUT_DIM DESCRIPTION: Output dim TYPE: int default: 256 + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: ["original_size_as_tuple"] + LEGACY_UCG_VALUE: + - + # NAME DESCRIPTION: TYPE: default: 'ConcatTimestepEmbedderND' + NAME: ConcatTimestepEmbedderND + # OUT_DIM DESCRIPTION: Output dim TYPE: int default: 256 + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: ["crop_coords_top_left"] + LEGACY_UCG_VALUE: + - + # NAME DESCRIPTION: TYPE: default: 'ConcatTimestepEmbedderND' + NAME: ConcatTimestepEmbedderND + # OUT_DIM DESCRIPTION: Output dim TYPE: int default: 256 + OUT_DIM: 256 + IS_TRAINABLE: False + UCG_RATE: 0.0 + INPUT_KEYS: ["aesthetic_score"] + LEGACY_UCG_VALUE: + + SAMPLE_ARGS: + SAMPLER: ddim + SAMPLE_STEPS: 50 + SEED: 2023 + GUIDE_SCALE: 5.0 + GUIDE_RESCALE: + DISCRETIZATION: linspace + IMAGE_SIZE: [ 1024, 1024] + RUN_TRAIN_N: False + # OPTIMIZER DESCRIPTION: TYPE: default: '' + OPTIMIZER: + # NAME DESCRIPTION: TYPE: default: '' + NAME: AdamW + LEARNING_RATE: 0.0064 + EPS: 1e-8 + AMSGRAD: False + # + TRAIN_DATA: + NAME: ImageTextPairMSDataset + MODE: train + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_DATASET_SPLIT: train + MS_REMAP_KEYS: { 'Image:FILE': 'Target:FILE' } + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 1 + NUM_WORKERS: 4 + SAMPLER: + NAME: LoopSampler + # + TRANSFORMS: + - NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - NAME: FlexibleResize + INTERPOLATION: bicubic + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: FlexibleCropXL + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: ImageToTensor + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: torchvision + - NAME: Select + KEYS: [ 'img', 'prompt', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left' ] + META_KEYS: ['data_key', 'img_path'] + - NAME: Rename + INPUT_KEY: [ 'img', 'img_original_size_as_tuple', 'img_target_size_as_tuple', 'img_crop_coords_top_left'] + OUTPUT_KEY: [ 'image', 'original_size_as_tuple', 'target_size_as_tuple', 'crop_coords_top_left' ] + # + TRAIN_HOOKS: + - NAME: BackwardHook + # GRADIENT_CLIP: 1.0 + PRIORITY: 0 + - NAME: LogHook + LOG_INTERVAL: 50 + SHOW_GPU_MEM: True + - + NAME: CheckpointHook + SAVE_LAST: True + INTERVAL: 10000 + PRIORITY: 200 diff --git a/scepter/methods/studio/self_train/self_train.yaml b/scepter/methods/studio/self_train/self_train.yaml new file mode 100644 index 0000000..0c5925f --- /dev/null +++ b/scepter/methods/studio/self_train/self_train.yaml @@ -0,0 +1,10 @@ +WORK_DIR: "self_train" +SCRIPT_DIR: "scepter/studio/self_train/scripts" +DEFAULT_FOLDER: sd_xl +SAMPLERS: + - + NAME: 'ddim' + - + NAME: 'dpmpp_2m_sde' + - + NAME: 'dpmpp_2s_ancestral' diff --git a/scepter/methods/studio/self_train/stable_diffusion/sd15_pro.yaml b/scepter/methods/studio/self_train/stable_diffusion/sd15_pro.yaml new file mode 100644 index 0000000..ca7f4d1 --- /dev/null +++ b/scepter/methods/studio/self_train/stable_diffusion/sd15_pro.yaml @@ -0,0 +1,312 @@ +ENV: + BACKEND: nccl +META: + VERSION: 'SD1.5' + DESCRIPTION: "Stable Diffusion v1.5" + IS_DEFAULT: False + INFERENCE_PARAS: + INFERENCE_BATCH_SIZE: 1 + INFERENCE_PREFIX: "" + DEFAULT_SAMPLER: "ddim" + DEFAULT_SAMPLE_STEPS: 40 + INFERENCE_N_PROMPT: "" + RESOLUTION: 512 + PARAS: + - + TRAIN_BATCH_SIZE: 2 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: 512 + MEMORY: 29000 + EPOCHS: 50 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: False + TUNER: FULL + - + TRAIN_BATCH_SIZE: 2 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: 512 + MEMORY: 29000 + EPOCHS: 50 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: False + TUNER: LORA + - + TRAIN_BATCH_SIZE: 2 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: 512 + MEMORY: 29000 + EPOCHS: 200 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: False + TUNER: SCE + + - + TRAIN_BATCH_SIZE: 2 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: 512 + MEMORY: 29000 + EPOCHS: 200 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: True + TUNER: TEXT_SCE + + - + TRAIN_BATCH_SIZE: 4 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: 512 + MEMORY: 29000 + EPOCHS: 50 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: False + TUNER: TEXT_LORA + + TUNERS: + LORA: + - + NAME: SwiftLoRA + R: 256 + LORA_ALPHA: 256 + LORA_DROPOUT: 0.0 + BIAS: "none" + TARGET_MODULES: "model.*(to_q|to_k|to_v|to_out.0|net.0.proj|net.2)$" + TEXT_LORA: + - + NAME: SwiftLoRA + R: 256 + LORA_ALPHA: 256 + LORA_DROPOUT: 0.0 + BIAS: "none" + TARGET_MODULES: "(cond_stage_model.*(q_proj|k_proj|v_proj|out_proj|mlp.fc1|mlp.fc2))|(model.*(to_q|to_k|to_v|to_out.0|net.0.proj|net.2))$" + SCE: + - + NAME: SwiftSCETuning + DIMS: [1280, 1280, 1280, 1280, 1280, 640, 640, 640, 320, 320, 320, 320] + DOWN_RATIO: 1.0 + TARGET_MODULES: model.lsc_identity\.\d+$ + TUNER_MODE: identity + TEXT_SCE: + - + NAME: SwiftSCETuning + DIMS: [ 1280, 1280, 1280, 1280, 1280, 640, 640, 640, 320, 320, 320, 320 ] + DOWN_RATIO: 1.0 + TARGET_MODULES: model.lsc_identity\.\d+$ + TUNER_MODE: identity + - + NAME: SwiftLoRA + R: 256 + LORA_ALPHA: 256 + LORA_DROPOUT: 0.0 + BIAS: "none" + TARGET_MODULES: "cond_stage_model.*(q_proj|k_proj|v_proj|out_proj|mlp.fc1|mlp.fc2)$" + + MODIFY_PARAS: + TEXT_LORA: + TRAIN: + SOLVER.MODEL.COND_STAGE_MODEL.USE_GRAD: True + TEXT_SCE: + TRAIN: + SOLVER.MODEL.COND_STAGE_MODEL.USE_GRAD: True + +SOLVER: + NAME: LatentDiffusionSolver + RESUME_FROM: + LOAD_MODEL_ONLY: True + USE_FSDP: False + SHARDING_STRATEGY: + USE_AMP: True + DTYPE: float16 + CHANNELS_LAST: True + MAX_STEPS: 1000 + MAX_EPOCHS: -1 + NUM_FOLDS: 1 + ACCU_STEP: 1 + # + WORK_DIR: + LOG_FILE: std_log.txt + # + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + FREEZE: + # + TUNER: + # + MODEL: + NAME: LatentDiffusion + PARAMETERIZATION: eps + TIMESTEPS: 1000 + MIN_SNR_GAMMA: + ZERO_TERMINAL_SNR: False + PRETRAINED_MODEL: ms://AI-ModelScope/stable-diffusion-v1-5@v1-5-pruned-emaonly.safetensors + IGNORE_KEYS: [ ] + SCALE_FACTOR: 0.18215 + SIZE_FACTOR: 8 + # DEFAULT_N_PROMPT: 'lowres, error, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, out of frame, extra fingers, mutated hands, poorly drawn hands, poorly drawn face, mutation, deformed, blurry, dehydrated, bad anatomy, bad proportions, extra limbs, cloned face, disfigured, gross proportions, malformed limbs, missing arms, missing legs, extra arms, extra legs, fused fingers, too many fingers, long neck, username, watermark, signature' + DEFAULT_N_PROMPT: + SCHEDULE_ARGS: + "NAME": "scaled_linear" + "BETA_MIN": 0.00085 + "BETA_MAX": 0.012 + USE_EMA: False + # + DIFFUSION_MODEL: + NAME: DiffusionUNet + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + MODEL_CHANNELS: 320 + NUM_HEADS: 8 + NUM_RES_BLOCKS: 2 + ATTENTION_RESOLUTIONS: [ 4, 2, 1 ] + CHANNEL_MULT: [ 1, 2, 4, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + USE_CHECKPOINT: False + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: 1 + CONTEXT_DIM: 768 + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: False + IGNORE_KEYS: [] + # + FIRST_STAGE_MODEL: + NAME: AutoencoderKL + EMBED_DIM: 4 + IGNORE_KEYS: [] + BATCH_SIZE: 4 + # + ENCODER: + NAME: Encoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DOUBLE_Z: True + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + # + DECODER: + NAME: Decoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + GIVE_PRE_END: False + TANH_OUT: False + # + TOKENIZER: + NAME: ClipTokenizer + PRETRAINED_PATH: ms://AI-ModelScope/clip-vit-large-patch14 + LENGTH: 77 + CLEAN: True + # + COND_STAGE_MODEL: + NAME: FrozenCLIPEmbedder + FREEZE: True + USE_GRAD: False + LAYER: last + PRETRAINED_MODEL: ms://AI-ModelScope/clip-vit-large-patch14 + # + LOSS: + NAME: ReconstructLoss + LOSS_TYPE: l2 + # + SAMPLE_ARGS: + SAMPLER: ddim + SAMPLE_STEPS: 50 + SEED: 2023 + GUIDE_SCALE: 7.5 + GUIDE_RESCALE: + DISCRETIZATION: trailing + IMAGE_SIZE: [512, 512] + RUN_TRAIN_N: False + # + OPTIMIZER: + NAME: AdamW + LEARNING_RATE: 0.064 + BETAS: [ 0.9, 0.999 ] + EPS: 1e-8 + WEIGHT_DECAY: 1e-2 + AMSGRAD: False + # + TRAIN_DATA: + NAME: ImageTextPairMSDataset + MODE: train + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_DATASET_SPLIT: train + MS_REMAP_KEYS: { 'Image:FILE': 'Target:FILE' } + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 1 + NUM_WORKERS: 4 + SAMPLER: + NAME: LoopSampler + TRANSFORMS: + - NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - NAME: Resize + SIZE: 512 + INTERPOLATION: bilinear + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: CenterCrop + SIZE: 512 + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: ImageToTensor + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'image' ] + BACKEND: torchvision + - NAME: Select + KEYS: [ 'image', 'prompt' ] + META_KEYS: [ 'data_key' ] + # + TRAIN_HOOKS: + - NAME: BackwardHook + # GRADIENT_CLIP: 1.0 + PRIORITY: 0 + - NAME: LogHook + LOG_INTERVAL: 50 + SHOW_GPU_MEM: True + - + NAME: CheckpointHook + SAVE_LAST: True + INTERVAL: 10000 + PRIORITY: 200 diff --git a/scepter/methods/studio/self_train/stable_diffusion/sd21_pro.yaml b/scepter/methods/studio/self_train/stable_diffusion/sd21_pro.yaml new file mode 100644 index 0000000..e05788f --- /dev/null +++ b/scepter/methods/studio/self_train/stable_diffusion/sd21_pro.yaml @@ -0,0 +1,254 @@ +ENV: + BACKEND: nccl +META: + VERSION: 'SD2.1' + DESCRIPTION: "Stable Diffusion v2.1" + IS_DEFAULT: False + INFERENCE_PARAS: + INFERENCE_BATCH_SIZE: 1 + INFERENCE_PREFIX: "" + DEFAULT_SAMPLER: "ddim" + DEFAULT_SAMPLE_STEPS: 40 + INFERENCE_N_PROMPT: "" + RESOLUTION: 768 + PARAS: + - + TRAIN_BATCH_SIZE: 2 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: 768 + MEMORY: 29000 + EPOCHS: 50 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: False + TUNER: FULL + - + TRAIN_BATCH_SIZE: 2 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: 768 + MEMORY: 29000 + EPOCHS: 50 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: False + TUNER: LORA + - + TRAIN_BATCH_SIZE: 2 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: 768 + MEMORY: 29000 + EPOCHS: 200 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: True + TUNER: SCE + + TUNERS: + LORA: + - + NAME: SwiftLoRA + R: 256 + LORA_ALPHA: 256 + LORA_DROPOUT: 0.0 + BIAS: "none" + TARGET_MODULES: "model.*(to_q|to_k|to_v|to_out.0|net.0.proj|net.2)$" + SCE: + - + NAME: SwiftSCETuning + DIMS: [1280, 1280, 1280, 1280, 1280, 640, 640, 640, 320, 320, 320, 320] + DOWN_RATIO: 1.0 + TARGET_MODULES: model.lsc_identity\.\d+$ + TUNER_MODE: identity +SOLVER: + NAME: LatentDiffusionSolver + RESUME_FROM: + LOAD_MODEL_ONLY: True + USE_FSDP: False + SHARDING_STRATEGY: + USE_AMP: True + DTYPE: float16 + CHANNELS_LAST: True + MAX_STEPS: 1000 + MAX_EPOCHS: -1 + NUM_FOLDS: 1 + ACCU_STEP: 1 + # + WORK_DIR: + LOG_FILE: std_log.txt + # + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + FREEZE: + # + TUNER: + # + MODEL: + NAME: LatentDiffusion + PARAMETERIZATION: v + TIMESTEPS: 1000 + MIN_SNR_GAMMA: + ZERO_TERMINAL_SNR: False + PRETRAINED_MODEL: ms://AI-ModelScope/stable-diffusion-2-1@v2-1_768-ema-pruned.safetensors + IGNORE_KEYS: [ ] + SCALE_FACTOR: 0.18215 + SIZE_FACTOR: 8 + # DEFAULT_N_PROMPT: 'lowres, error, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, out of frame, extra fingers, mutated hands, poorly drawn hands, poorly drawn face, mutation, deformed, blurry, dehydrated, bad anatomy, bad proportions, extra limbs, cloned face, disfigured, gross proportions, malformed limbs, missing arms, missing legs, extra arms, extra legs, fused fingers, too many fingers, long neck, username, watermark, signature' + DEFAULT_N_PROMPT: + SCHEDULE_ARGS: + "NAME": "scaled_linear" + "BETA_MIN": 0.00085 + "BETA_MAX": 0.012 + USE_EMA: False + # + DIFFUSION_MODEL: + NAME: DiffusionUNet + IN_CHANNELS: 4 + OUT_CHANNELS: 4 + MODEL_CHANNELS: 320 + NUM_HEADS_CHANNELS: 64 + NUM_RES_BLOCKS: 2 + ATTENTION_RESOLUTIONS: [ 4, 2, 1 ] + CHANNEL_MULT: [ 1, 2, 4, 4 ] + CONV_RESAMPLE: True + DIMS: 2 + USE_CHECKPOINT: False + USE_SCALE_SHIFT_NORM: False + RESBLOCK_UPDOWN: False + USE_SPATIAL_TRANSFORMER: True + TRANSFORMER_DEPTH: 1 + CONTEXT_DIM: 1024 + DISABLE_MIDDLE_SELF_ATTN: False + USE_LINEAR_IN_TRANSFORMER: True + PRETRAINED_MODEL: + # + FIRST_STAGE_MODEL: + NAME: AutoencoderKL + EMBED_DIM: 4 + PRETRAINED_MODEL: + IGNORE_KEYS: [ ] + BATCH_SIZE: 4 + # + ENCODER: + NAME: Encoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DOUBLE_Z: True + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + # + DECODER: + NAME: Decoder + CH: 128 + OUT_CH: 3 + NUM_RES_BLOCKS: 2 + IN_CHANNELS: 3 + ATTN_RESOLUTIONS: [ ] + CH_MULT: [ 1, 2, 4, 4 ] + Z_CHANNELS: 4 + DROPOUT: 0.0 + RESAMP_WITH_CONV: True + GIVE_PRE_END: False + TANH_OUT: False + # + TOKENIZER: + NAME: OpenClipTokenizer + LENGTH: 77 + # + COND_STAGE_MODEL: + NAME: FrozenOpenCLIPEmbedder + ARCH: ViT-H-14 + PRETRAINED_MODEL: + USE_GRAD: False + LAYER: penultimate + # + LOSS: + NAME: ReconstructLoss + LOSS_TYPE: l2 + # + SAMPLE_ARGS: + SAMPLER: ddim + SAMPLE_STEPS: 50 + SEED: 2023 + GUIDE_SCALE: 7.5 + GUIDE_RESCALE: + DISCRETIZATION: trailing + IMAGE_SIZE: [768, 768] + RUN_TRAIN_N: False + # + OPTIMIZER: + NAME: AdamW + LEARNING_RATE: 0.064 + BETAS: [ 0.9, 0.999 ] + EPS: 1e-8 + WEIGHT_DECAY: 1e-2 + AMSGRAD: False + # + TRAIN_DATA: + NAME: ImageTextPairMSDataset + MODE: train + MS_DATASET_NAME: style_custom_dataset + MS_DATASET_NAMESPACE: damo + MS_DATASET_SUBNAME: 3D + PROMPT_PREFIX: "" + MS_DATASET_SPLIT: train + MS_REMAP_KEYS: { 'Image:FILE': 'Target:FILE' } + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 1 + NUM_WORKERS: 4 + SAMPLER: + NAME: LoopSampler + TRANSFORMS: + - NAME: LoadImageFromFile + RGB_ORDER: RGB + BACKEND: pillow + - NAME: Resize + SIZE: 768 + INTERPOLATION: bilinear + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: CenterCrop + SIZE: 768 + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: ImageToTensor + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'img' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img' ] + OUTPUT_KEY: [ 'image' ] + BACKEND: torchvision + - NAME: Select + KEYS: [ 'image', 'prompt' ] + META_KEYS: [ 'data_key' ] + # + TRAIN_HOOKS: + - NAME: BackwardHook + # GRADIENT_CLIP: 1.0 + PRIORITY: 0 + - NAME: LogHook + LOG_INTERVAL: 50 + SHOW_GPU_MEM: True + - + NAME: CheckpointHook + SAVE_LAST: True + INTERVAL: 10000 + PRIORITY: 200 diff --git a/scepter/modules/__init__.py b/scepter/modules/__init__.py index 43a95d8..c0ccc94 100644 --- a/scepter/modules/__init__.py +++ b/scepter/modules/__init__.py @@ -1,3 +1,4 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. -from scepter.modules import data, model, opt, solver, transform, utils +from scepter.modules import (data, inference, model, opt, solver, transform, + utils) diff --git a/scepter/modules/annotator/__init__.py b/scepter/modules/annotator/__init__.py new file mode 100644 index 0000000..46a3367 --- /dev/null +++ b/scepter/modules/annotator/__init__.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from scepter.modules.annotator.base_annotator import GeneralAnnotator +from scepter.modules.annotator.canny import CannyAnnotator +from scepter.modules.annotator.color import ColorAnnotator +from scepter.modules.annotator.hed import HedAnnotator +from scepter.modules.annotator.midas_op import MidasDetector +from scepter.modules.annotator.mlsd_op import MLSDdetector +from scepter.modules.annotator.openpose import OpenposeAnnotator diff --git a/scepter/modules/annotator/base_annotator.py b/scepter/modules/annotator/base_annotator.py new file mode 100644 index 0000000..11d9def --- /dev/null +++ b/scepter/modules/annotator/base_annotator.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +from abc import ABCMeta + +import torch +import torch.nn as nn + +from scepter.modules.annotator.registry import ANNOTATORS +from scepter.modules.model.base_model import BaseModel +from scepter.modules.utils.config import dict_to_yaml + + +@ANNOTATORS.register_class() +class BaseAnnotator(BaseModel, metaclass=ABCMeta): + para_dict = {} + + def __init__(self, cfg, logger=None): + super().__init__(cfg, logger=logger) + + @torch.no_grad() + @torch.inference_mode + def forward(self, *args, **kwargs): + raise NotImplementedError + + @staticmethod + def get_config_template(): + return dict_to_yaml('ANNOTATORS', + __class__.__name__, + BaseAnnotator.para_dict, + set_name=True) + + +@ANNOTATORS.register_class() +class GeneralAnnotator(BaseAnnotator, metaclass=ABCMeta): + def __init__(self, cfg, logger=None): + super().__init__(cfg, logger=logger) + anno_models = cfg.get('ANNOTATORS', []) + self.annotators = nn.ModuleList() + for n, anno_config in enumerate(anno_models): + annotator = ANNOTATORS.build(anno_config, logger=logger) + annotator.input_keys = anno_config.get('INPUT_KEYS', []) + if isinstance(annotator.input_keys, str): + annotator.input_keys = [annotator.input_keys] + annotator.output_keys = anno_config.get('OUTPUT_KEYS', []) + if isinstance(annotator.output_keys, str): + annotator.output_keys = [annotator.output_keys] + assert len(annotator.input_keys) == len(annotator.output_keys) + self.annotators.append(annotator) + + def forward(self, input_dict): + output_dict = {} + for annotator in self.annotators: + for idx, in_key in enumerate(annotator.input_keys): + if in_key in input_dict: + image = annotator(input_dict[in_key]) + output_dict[annotator.output_keys[idx]] = image + return output_dict diff --git a/scepter/modules/annotator/canny.py b/scepter/modules/annotator/canny.py new file mode 100644 index 0000000..6048970 --- /dev/null +++ b/scepter/modules/annotator/canny.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +from abc import ABCMeta + +import cv2 +import numpy as np +import torch +from PIL import Image + +from scepter.modules.annotator.base_annotator import BaseAnnotator +from scepter.modules.annotator.registry import ANNOTATORS +from scepter.modules.utils.config import dict_to_yaml + + +@ANNOTATORS.register_class() +class CannyAnnotator(BaseAnnotator, metaclass=ABCMeta): + para_dict = {} + + def __init__(self, cfg, logger=None): + super().__init__(cfg, logger=logger) + self.low_threshold = cfg.get('LOW_THRESHOLD', 100) + self.high_threshold = cfg.get('HIGH_THRESHOLD', 200) + + def forward(self, image): + if isinstance(image, Image.Image): + image = np.array(image) + image = cv2.Canny(image, self.low_threshold, self.high_threshold) + elif isinstance(image, torch.Tensor): + image = image.detach().cpu().numpy() + image = cv2.Canny(image, self.low_threshold, self.high_threshold) + elif isinstance(image, np.ndarray): + image = cv2.Canny(image.copy(), self.low_threshold, + self.high_threshold) + else: + raise f'Unsurpport datatype{type(image)}, only surpport np.ndarray, torch.Tensor, Pillow Image.' + assert len(image.shape) < 4 + return image[..., None].repeat(3, 2) + + @staticmethod + def get_config_template(): + return dict_to_yaml('ANNOTATORS', + __class__.__name__, + CannyAnnotator.para_dict, + set_name=True) diff --git a/scepter/modules/annotator/color.py b/scepter/modules/annotator/color.py new file mode 100644 index 0000000..02b406d --- /dev/null +++ b/scepter/modules/annotator/color.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +from abc import ABCMeta + +import cv2 +import numpy as np +import torch +from PIL import Image + +from scepter.modules.annotator.base_annotator import BaseAnnotator +from scepter.modules.annotator.registry import ANNOTATORS +from scepter.modules.utils.config import dict_to_yaml + + +@ANNOTATORS.register_class() +class ColorAnnotator(BaseAnnotator, metaclass=ABCMeta): + para_dict = {} + + def __init__(self, cfg, logger=None): + super().__init__(cfg, logger=logger) + self.ratio = cfg.get('RATIO', 64) + + def forward(self, image): + if isinstance(image, Image.Image): + image = np.array(image) + elif isinstance(image, torch.Tensor): + image = image.detach().cpu().numpy() + elif isinstance(image, np.ndarray): + image = image.copy() + else: + raise f'Unsurpport datatype{type(image)}, only surpport np.ndarray, torch.Tensor, Pillow Image.' + h, w = image.shape[:2] + ratio = self.ratio + image = cv2.resize(image, (w // ratio, h // ratio), + interpolation=cv2.INTER_CUBIC) + image = cv2.resize(image, (w, h), interpolation=cv2.INTER_NEAREST) + assert len(image.shape) < 4 + return image + + @staticmethod + def get_config_template(): + return dict_to_yaml('ANNOTATORS', + __class__.__name__, + ColorAnnotator.para_dict, + set_name=True) diff --git a/scepter/modules/annotator/hed.py b/scepter/modules/annotator/hed.py new file mode 100644 index 0000000..fbfd84c --- /dev/null +++ b/scepter/modules/annotator/hed.py @@ -0,0 +1,154 @@ +# -*- coding: utf-8 -*- +# Please use this implementation in your products +# This implementation may produce slightly different results from Saining Xie's official implementations, +# but it generates smoother edges and is more suitable for ControlNet as well as other image-to-image translations. +# Different from official models and other implementations, this is an RGB-input model (rather than BGR) +# and in this way it works better for gradio's RGB protocol + +from abc import ABCMeta + +import cv2 +import numpy as np +import torch +from einops import rearrange + +from scepter.modules.annotator.base_annotator import BaseAnnotator +from scepter.modules.annotator.registry import ANNOTATORS +from scepter.modules.utils.config import dict_to_yaml +from scepter.modules.utils.distribute import we +from scepter.modules.utils.file_system import FS + + +def nms(x, t, s): + x = cv2.GaussianBlur(x.astype(np.float32), (0, 0), s) + + f1 = np.array([[0, 0, 0], [1, 1, 1], [0, 0, 0]], dtype=np.uint8) + f2 = np.array([[0, 1, 0], [0, 1, 0], [0, 1, 0]], dtype=np.uint8) + f3 = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=np.uint8) + f4 = np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0]], dtype=np.uint8) + + y = np.zeros_like(x) + + for f in [f1, f2, f3, f4]: + np.putmask(y, cv2.dilate(x, kernel=f) == x, x) + + z = np.zeros_like(y, dtype=np.uint8) + z[y > t] = 255 + return z + + +class DoubleConvBlock(torch.nn.Module): + def __init__(self, input_channel, output_channel, layer_number): + super().__init__() + self.convs = torch.nn.Sequential() + self.convs.append( + torch.nn.Conv2d(in_channels=input_channel, + out_channels=output_channel, + kernel_size=(3, 3), + stride=(1, 1), + padding=1)) + for i in range(1, layer_number): + self.convs.append( + torch.nn.Conv2d(in_channels=output_channel, + out_channels=output_channel, + kernel_size=(3, 3), + stride=(1, 1), + padding=1)) + self.projection = torch.nn.Conv2d(in_channels=output_channel, + out_channels=1, + kernel_size=(1, 1), + stride=(1, 1), + padding=0) + + def __call__(self, x, down_sampling=False): + h = x + if down_sampling: + h = torch.nn.functional.max_pool2d(h, + kernel_size=(2, 2), + stride=(2, 2)) + for conv in self.convs: + h = conv(h) + h = torch.nn.functional.relu(h) + return h, self.projection(h) + + +class ControlNetHED_Apache2(torch.nn.Module): + def __init__(self): + super().__init__() + self.norm = torch.nn.Parameter(torch.zeros(size=(1, 3, 1, 1))) + self.block1 = DoubleConvBlock(input_channel=3, + output_channel=64, + layer_number=2) + self.block2 = DoubleConvBlock(input_channel=64, + output_channel=128, + layer_number=2) + self.block3 = DoubleConvBlock(input_channel=128, + output_channel=256, + layer_number=3) + self.block4 = DoubleConvBlock(input_channel=256, + output_channel=512, + layer_number=3) + self.block5 = DoubleConvBlock(input_channel=512, + output_channel=512, + layer_number=3) + + def __call__(self, x): + h = x - self.norm + h, projection1 = self.block1(h) + h, projection2 = self.block2(h, down_sampling=True) + h, projection3 = self.block3(h, down_sampling=True) + h, projection4 = self.block4(h, down_sampling=True) + h, projection5 = self.block5(h, down_sampling=True) + return projection1, projection2, projection3, projection4, projection5 + + +@ANNOTATORS.register_class() +class HedAnnotator(BaseAnnotator, metaclass=ABCMeta): + para_dict = {} + + def __init__(self, cfg, logger=None): + super().__init__(cfg, logger=logger) + self.netNetwork = ControlNetHED_Apache2().float().eval() + pretrained_model = cfg.get('PRETRAINED_MODEL', None) + if pretrained_model: + with FS.get_from(pretrained_model, wait_finish=True) as local_path: + self.netNetwork.load_state_dict(torch.load(local_path)) + + @torch.no_grad() + @torch.inference_mode() + @torch.autocast('cuda', enabled=False) + def forward(self, image): + if isinstance(image, torch.Tensor): + if len(image.shape) == 3: + image = rearrange(image, 'h w c -> 1 c h w') + B, C, H, W = image.shape + else: + raise "Unsurpport input image's shape" + elif isinstance(image, np.ndarray): + image = torch.from_numpy(image.copy()).float() + if len(image.shape) == 3: + image = rearrange(image, 'h w c -> 1 c h w') + B, C, H, W = image.shape + else: + raise "Unsurpport input image's shape" + else: + raise "Unsurpport input image's type" + edges = self.netNetwork(image.to(we.device_id)) + edges = [ + e.detach().cpu().numpy().astype(np.float32)[0, 0] for e in edges + ] + edges = [ + cv2.resize(e, (W, H), interpolation=cv2.INTER_LINEAR) + for e in edges + ] + edges = np.stack(edges, axis=2) + edge = 1 / (1 + np.exp(-np.mean(edges, axis=2).astype(np.float64))) + edge = 255 - (edge * 255.0).clip(0, 255).astype(np.uint8) + return edge[..., None].repeat(3, 2) + + @staticmethod + def get_config_template(): + return dict_to_yaml('ANNOTATORS', + __class__.__name__, + HedAnnotator.para_dict, + set_name=True) diff --git a/scepter/modules/annotator/midas/__init__.py b/scepter/modules/annotator/midas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scepter/modules/annotator/midas/api.py b/scepter/modules/annotator/midas/api.py new file mode 100644 index 0000000..490cd18 --- /dev/null +++ b/scepter/modules/annotator/midas/api.py @@ -0,0 +1,165 @@ +# -*- coding: utf-8 -*- +# based on https://github.com/isl-org/MiDaS + +import cv2 +import torch +import torch.nn as nn +from torchvision.transforms import Compose + +from .dpt_depth import DPTDepthModel +from .midas_net import MidasNet +from .midas_net_custom import MidasNet_small +from .transforms import NormalizeImage, PrepareForNet, Resize + +# ISL_PATHS = { +# "dpt_large": "dpt_large-midas-2f21e586.pt", +# "dpt_hybrid": "dpt_hybrid-midas-501f0c75.pt", +# "midas_v21": "", +# "midas_v21_small": "", +# } + +# remote_model_path = +# "https://huggingface.co/lllyasviel/ControlNet/resolve/main/annotator/ckpts/dpt_hybrid-midas-501f0c75.pt" + + +def disabled_train(self, mode=True): + """Overwrite model.train with this function to make sure train/eval mode + does not change anymore.""" + return self + + +def load_midas_transform(model_type): + # https://github.com/isl-org/MiDaS/blob/master/run.py + # load transform only + if model_type == 'dpt_large': # DPT-Large + net_w, net_h = 384, 384 + resize_mode = 'minimal' + normalization = NormalizeImage(mean=[0.5, 0.5, 0.5], + std=[0.5, 0.5, 0.5]) + + elif model_type == 'dpt_hybrid': # DPT-Hybrid + net_w, net_h = 384, 384 + resize_mode = 'minimal' + normalization = NormalizeImage(mean=[0.5, 0.5, 0.5], + std=[0.5, 0.5, 0.5]) + + elif model_type == 'midas_v21': + net_w, net_h = 384, 384 + resize_mode = 'upper_bound' + normalization = NormalizeImage(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + + elif model_type == 'midas_v21_small': + net_w, net_h = 256, 256 + resize_mode = 'upper_bound' + normalization = NormalizeImage(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + + else: + assert False, f"model_type '{model_type}' not implemented, use: --model_type large" + + transform = Compose([ + Resize( + net_w, + net_h, + resize_target=None, + keep_aspect_ratio=True, + ensure_multiple_of=32, + resize_method=resize_mode, + image_interpolation_method=cv2.INTER_CUBIC, + ), + normalization, + PrepareForNet(), + ]) + + return transform + + +def load_model(model_type, model_path): + # https://github.com/isl-org/MiDaS/blob/master/run.py + # load network + # model_path = ISL_PATHS[model_type] + if model_type == 'dpt_large': # DPT-Large + model = DPTDepthModel( + path=model_path, + backbone='vitl16_384', + non_negative=True, + ) + net_w, net_h = 384, 384 + resize_mode = 'minimal' + normalization = NormalizeImage(mean=[0.5, 0.5, 0.5], + std=[0.5, 0.5, 0.5]) + + elif model_type == 'dpt_hybrid': # DPT-Hybrid + model = DPTDepthModel( + path=model_path, + backbone='vitb_rn50_384', + non_negative=True, + ) + net_w, net_h = 384, 384 + resize_mode = 'minimal' + normalization = NormalizeImage(mean=[0.5, 0.5, 0.5], + std=[0.5, 0.5, 0.5]) + + elif model_type == 'midas_v21': + model = MidasNet(model_path, non_negative=True) + net_w, net_h = 384, 384 + resize_mode = 'upper_bound' + normalization = NormalizeImage(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + + elif model_type == 'midas_v21_small': + model = MidasNet_small(model_path, + features=64, + backbone='efficientnet_lite3', + exportable=True, + non_negative=True, + blocks={'expand': True}) + net_w, net_h = 256, 256 + resize_mode = 'upper_bound' + normalization = NormalizeImage(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + + else: + print( + f"model_type '{model_type}' not implemented, use: --model_type large" + ) + assert False + + transform = Compose([ + Resize( + net_w, + net_h, + resize_target=None, + keep_aspect_ratio=True, + ensure_multiple_of=32, + resize_method=resize_mode, + image_interpolation_method=cv2.INTER_CUBIC, + ), + normalization, + PrepareForNet(), + ]) + + return model.eval(), transform + + +class MiDaSInference(nn.Module): + MODEL_TYPES_TORCH_HUB = ['DPT_Large', 'DPT_Hybrid', 'MiDaS_small'] + MODEL_TYPES_ISL = [ + 'dpt_large', + 'dpt_hybrid', + 'midas_v21', + 'midas_v21_small', + ] + + def __init__(self, model_type, model_path): + super().__init__() + assert (model_type in self.MODEL_TYPES_ISL) + model, _ = load_model(model_type, model_path) + self.model = model + self.model.train = disabled_train + + def forward(self, x): + with torch.no_grad(): + prediction = self.model(x) + return prediction diff --git a/scepter/modules/annotator/midas/base_model.py b/scepter/modules/annotator/midas/base_model.py new file mode 100644 index 0000000..68d985b --- /dev/null +++ b/scepter/modules/annotator/midas/base_model.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +import torch + + +class BaseModel(torch.nn.Module): + def load(self, path): + """Load model from file. + + Args: + path (str): file path + """ + parameters = torch.load(path, map_location=torch.device('cpu')) + + if 'optimizer' in parameters: + parameters = parameters['model'] + + self.load_state_dict(parameters) diff --git a/scepter/modules/annotator/midas/blocks.py b/scepter/modules/annotator/midas/blocks.py new file mode 100644 index 0000000..472a40e --- /dev/null +++ b/scepter/modules/annotator/midas/blocks.py @@ -0,0 +1,390 @@ +# -*- coding: utf-8 -*- +import torch +import torch.nn as nn + +from .vit import (_make_pretrained_vitb16_384, _make_pretrained_vitb_rn50_384, + _make_pretrained_vitl16_384) + + +def _make_encoder( + backbone, + features, + use_pretrained, + groups=1, + expand=False, + exportable=True, + hooks=None, + use_vit_only=False, + use_readout='ignore', +): + if backbone == 'vitl16_384': + pretrained = _make_pretrained_vitl16_384(use_pretrained, + hooks=hooks, + use_readout=use_readout) + scratch = _make_scratch( + [256, 512, 1024, 1024], features, groups=groups, + expand=expand) # ViT-L/16 - 85.0% Top1 (backbone) + elif backbone == 'vitb_rn50_384': + pretrained = _make_pretrained_vitb_rn50_384( + use_pretrained, + hooks=hooks, + use_vit_only=use_vit_only, + use_readout=use_readout, + ) + scratch = _make_scratch( + [256, 512, 768, 768], features, groups=groups, + expand=expand) # ViT-H/16 - 85.0% Top1 (backbone) + elif backbone == 'vitb16_384': + pretrained = _make_pretrained_vitb16_384(use_pretrained, + hooks=hooks, + use_readout=use_readout) + scratch = _make_scratch( + [96, 192, 384, 768], features, groups=groups, + expand=expand) # ViT-B/16 - 84.6% Top1 (backbone) + elif backbone == 'resnext101_wsl': + pretrained = _make_pretrained_resnext101_wsl(use_pretrained) + scratch = _make_scratch([256, 512, 1024, 2048], + features, + groups=groups, + expand=expand) # efficientnet_lite3 + elif backbone == 'efficientnet_lite3': + pretrained = _make_pretrained_efficientnet_lite3(use_pretrained, + exportable=exportable) + scratch = _make_scratch([32, 48, 136, 384], + features, + groups=groups, + expand=expand) # efficientnet_lite3 + else: + print(f"Backbone '{backbone}' not implemented") + assert False + + return pretrained, scratch + + +def _make_scratch(in_shape, out_shape, groups=1, expand=False): + scratch = nn.Module() + + out_shape1 = out_shape + out_shape2 = out_shape + out_shape3 = out_shape + out_shape4 = out_shape + if expand is True: + out_shape1 = out_shape + out_shape2 = out_shape * 2 + out_shape3 = out_shape * 4 + out_shape4 = out_shape * 8 + + scratch.layer1_rn = nn.Conv2d(in_shape[0], + out_shape1, + kernel_size=3, + stride=1, + padding=1, + bias=False, + groups=groups) + scratch.layer2_rn = nn.Conv2d(in_shape[1], + out_shape2, + kernel_size=3, + stride=1, + padding=1, + bias=False, + groups=groups) + scratch.layer3_rn = nn.Conv2d(in_shape[2], + out_shape3, + kernel_size=3, + stride=1, + padding=1, + bias=False, + groups=groups) + scratch.layer4_rn = nn.Conv2d(in_shape[3], + out_shape4, + kernel_size=3, + stride=1, + padding=1, + bias=False, + groups=groups) + + return scratch + + +def _make_pretrained_efficientnet_lite3(use_pretrained, exportable=False): + efficientnet = torch.hub.load('rwightman/gen-efficientnet-pytorch', + 'tf_efficientnet_lite3', + pretrained=use_pretrained, + exportable=exportable) + return _make_efficientnet_backbone(efficientnet) + + +def _make_efficientnet_backbone(effnet): + pretrained = nn.Module() + + pretrained.layer1 = nn.Sequential(effnet.conv_stem, effnet.bn1, + effnet.act1, *effnet.blocks[0:2]) + pretrained.layer2 = nn.Sequential(*effnet.blocks[2:3]) + pretrained.layer3 = nn.Sequential(*effnet.blocks[3:5]) + pretrained.layer4 = nn.Sequential(*effnet.blocks[5:9]) + + return pretrained + + +def _make_resnet_backbone(resnet): + pretrained = nn.Module() + pretrained.layer1 = nn.Sequential(resnet.conv1, resnet.bn1, resnet.relu, + resnet.maxpool, resnet.layer1) + + pretrained.layer2 = resnet.layer2 + pretrained.layer3 = resnet.layer3 + pretrained.layer4 = resnet.layer4 + + return pretrained + + +def _make_pretrained_resnext101_wsl(use_pretrained): + resnet = torch.hub.load('facebookresearch/WSL-Images', + 'resnext101_32x8d_wsl') + return _make_resnet_backbone(resnet) + + +class Interpolate(nn.Module): + """Interpolation module. + """ + def __init__(self, scale_factor, mode, align_corners=False): + """Init. + + Args: + scale_factor (float): scaling + mode (str): interpolation mode + """ + super(Interpolate, self).__init__() + + self.interp = nn.functional.interpolate + self.scale_factor = scale_factor + self.mode = mode + self.align_corners = align_corners + + def forward(self, x): + """Forward pass. + + Args: + x (tensor): input + + Returns: + tensor: interpolated data + """ + + x = self.interp(x, + scale_factor=self.scale_factor, + mode=self.mode, + align_corners=self.align_corners) + + return x + + +class ResidualConvUnit(nn.Module): + """Residual convolution module. + """ + def __init__(self, features): + """Init. + + Args: + features (int): number of features + """ + super().__init__() + + self.conv1 = nn.Conv2d(features, + features, + kernel_size=3, + stride=1, + padding=1, + bias=True) + + self.conv2 = nn.Conv2d(features, + features, + kernel_size=3, + stride=1, + padding=1, + bias=True) + + self.relu = nn.ReLU(inplace=True) + + def forward(self, x): + """Forward pass. + + Args: + x (tensor): input + + Returns: + tensor: output + """ + out = self.relu(x) + out = self.conv1(out) + out = self.relu(out) + out = self.conv2(out) + + return out + x + + +class FeatureFusionBlock(nn.Module): + """Feature fusion block. + """ + def __init__(self, features): + """Init. + + Args: + features (int): number of features + """ + super(FeatureFusionBlock, self).__init__() + + self.resConfUnit1 = ResidualConvUnit(features) + self.resConfUnit2 = ResidualConvUnit(features) + + def forward(self, *xs): + """Forward pass. + + Returns: + tensor: output + """ + output = xs[0] + + if len(xs) == 2: + output += self.resConfUnit1(xs[1]) + + output = self.resConfUnit2(output) + + output = nn.functional.interpolate(output, + scale_factor=2, + mode='bilinear', + align_corners=True) + + return output + + +class ResidualConvUnit_custom(nn.Module): + """Residual convolution module. + """ + def __init__(self, features, activation, bn): + """Init. + + Args: + features (int): number of features + """ + super().__init__() + + self.bn = bn + + self.groups = 1 + + self.conv1 = nn.Conv2d(features, + features, + kernel_size=3, + stride=1, + padding=1, + bias=True, + groups=self.groups) + + self.conv2 = nn.Conv2d(features, + features, + kernel_size=3, + stride=1, + padding=1, + bias=True, + groups=self.groups) + + if self.bn is True: + self.bn1 = nn.BatchNorm2d(features) + self.bn2 = nn.BatchNorm2d(features) + + self.activation = activation + + self.skip_add = nn.quantized.FloatFunctional() + + def forward(self, x): + """Forward pass. + + Args: + x (tensor): input + + Returns: + tensor: output + """ + + out = self.activation(x) + out = self.conv1(out) + if self.bn is True: + out = self.bn1(out) + + out = self.activation(out) + out = self.conv2(out) + if self.bn is True: + out = self.bn2(out) + + if self.groups > 1: + out = self.conv_merge(out) + + return self.skip_add.add(out, x) + + # return out + x + + +class FeatureFusionBlock_custom(nn.Module): + """Feature fusion block. + """ + def __init__(self, + features, + activation, + deconv=False, + bn=False, + expand=False, + align_corners=True): + """Init. + + Args: + features (int): number of features + """ + super(FeatureFusionBlock_custom, self).__init__() + + self.deconv = deconv + self.align_corners = align_corners + + self.groups = 1 + + self.expand = expand + out_features = features + if self.expand is True: + out_features = features // 2 + + self.out_conv = nn.Conv2d(features, + out_features, + kernel_size=1, + stride=1, + padding=0, + bias=True, + groups=1) + + self.resConfUnit1 = ResidualConvUnit_custom(features, activation, bn) + self.resConfUnit2 = ResidualConvUnit_custom(features, activation, bn) + + self.skip_add = nn.quantized.FloatFunctional() + + def forward(self, *xs): + """Forward pass. + + Returns: + tensor: output + """ + output = xs[0] + + if len(xs) == 2: + res = self.resConfUnit1(xs[1]) + output = self.skip_add.add(output, res) + # output += res + + output = self.resConfUnit2(output) + + output = nn.functional.interpolate(output, + scale_factor=2, + mode='bilinear', + align_corners=self.align_corners) + + output = self.out_conv(output) + + return output diff --git a/scepter/modules/annotator/midas/dpt_depth.py b/scepter/modules/annotator/midas/dpt_depth.py new file mode 100644 index 0000000..2c25e0d --- /dev/null +++ b/scepter/modules/annotator/midas/dpt_depth.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- +import torch +import torch.nn as nn + +from .base_model import BaseModel +from .blocks import FeatureFusionBlock_custom, Interpolate, _make_encoder +from .vit import forward_vit + + +def _make_fusion_block(features, use_bn): + return FeatureFusionBlock_custom( + features, + nn.ReLU(False), + deconv=False, + bn=use_bn, + expand=False, + align_corners=True, + ) + + +class DPT(BaseModel): + def __init__( + self, + head, + features=256, + backbone='vitb_rn50_384', + readout='project', + channels_last=False, + use_bn=False, + ): + + super(DPT, self).__init__() + + self.channels_last = channels_last + + hooks = { + 'vitb_rn50_384': [0, 1, 8, 11], + 'vitb16_384': [2, 5, 8, 11], + 'vitl16_384': [5, 11, 17, 23], + } + + # Instantiate backbone and reassemble blocks + self.pretrained, self.scratch = _make_encoder( + backbone, + features, + False, # Set to true of you want to train from scratch, uses ImageNet weights + groups=1, + expand=False, + exportable=False, + hooks=hooks[backbone], + use_readout=readout, + ) + + self.scratch.refinenet1 = _make_fusion_block(features, use_bn) + self.scratch.refinenet2 = _make_fusion_block(features, use_bn) + self.scratch.refinenet3 = _make_fusion_block(features, use_bn) + self.scratch.refinenet4 = _make_fusion_block(features, use_bn) + + self.scratch.output_conv = head + + def forward(self, x): + if self.channels_last is True: + x.contiguous(memory_format=torch.channels_last) + + layer_1, layer_2, layer_3, layer_4 = forward_vit(self.pretrained, x) + + layer_1_rn = self.scratch.layer1_rn(layer_1) + layer_2_rn = self.scratch.layer2_rn(layer_2) + layer_3_rn = self.scratch.layer3_rn(layer_3) + layer_4_rn = self.scratch.layer4_rn(layer_4) + + path_4 = self.scratch.refinenet4(layer_4_rn) + path_3 = self.scratch.refinenet3(path_4, layer_3_rn) + path_2 = self.scratch.refinenet2(path_3, layer_2_rn) + path_1 = self.scratch.refinenet1(path_2, layer_1_rn) + + out = self.scratch.output_conv(path_1) + + return out + + +class DPTDepthModel(DPT): + def __init__(self, path=None, non_negative=True, **kwargs): + features = kwargs['features'] if 'features' in kwargs else 256 + + head = nn.Sequential( + nn.Conv2d(features, + features // 2, + kernel_size=3, + stride=1, + padding=1), + Interpolate(scale_factor=2, mode='bilinear', align_corners=True), + nn.Conv2d(features // 2, 32, kernel_size=3, stride=1, padding=1), + nn.ReLU(True), + nn.Conv2d(32, 1, kernel_size=1, stride=1, padding=0), + nn.ReLU(True) if non_negative else nn.Identity(), + nn.Identity(), + ) + + super().__init__(head, **kwargs) + + if path is not None: + self.load(path) + + def forward(self, x): + return super().forward(x).squeeze(dim=1) diff --git a/scepter/modules/annotator/midas/midas_net.py b/scepter/modules/annotator/midas/midas_net.py new file mode 100644 index 0000000..b041646 --- /dev/null +++ b/scepter/modules/annotator/midas/midas_net.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +"""MidashNet: Network for monocular depth estimation trained by mixing several datasets. +This file contains code that is adapted from +https://github.com/thomasjpfan/pytorch_refinenet/blob/master/pytorch_refinenet/refinenet/refinenet_4cascade.py +""" +import torch +import torch.nn as nn + +from .base_model import BaseModel +from .blocks import FeatureFusionBlock, Interpolate, _make_encoder + + +class MidasNet(BaseModel): + """Network for monocular depth estimation. + """ + def __init__(self, path=None, features=256, non_negative=True): + """Init. + + Args: + path (str, optional): Path to saved model. Defaults to None. + features (int, optional): Number of features. Defaults to 256. + backbone (str, optional): Backbone network for encoder. Defaults to resnet50 + """ + print('Loading weights: ', path) + + super(MidasNet, self).__init__() + + use_pretrained = False if path is None else True + + self.pretrained, self.scratch = _make_encoder( + backbone='resnext101_wsl', + features=features, + use_pretrained=use_pretrained) + + self.scratch.refinenet4 = FeatureFusionBlock(features) + self.scratch.refinenet3 = FeatureFusionBlock(features) + self.scratch.refinenet2 = FeatureFusionBlock(features) + self.scratch.refinenet1 = FeatureFusionBlock(features) + + self.scratch.output_conv = nn.Sequential( + nn.Conv2d(features, 128, kernel_size=3, stride=1, padding=1), + Interpolate(scale_factor=2, mode='bilinear'), + nn.Conv2d(128, 32, kernel_size=3, stride=1, padding=1), + nn.ReLU(True), + nn.Conv2d(32, 1, kernel_size=1, stride=1, padding=0), + nn.ReLU(True) if non_negative else nn.Identity(), + ) + + if path: + self.load(path) + + def forward(self, x): + """Forward pass. + + Args: + x (tensor): input data (image) + + Returns: + tensor: depth + """ + + layer_1 = self.pretrained.layer1(x) + layer_2 = self.pretrained.layer2(layer_1) + layer_3 = self.pretrained.layer3(layer_2) + layer_4 = self.pretrained.layer4(layer_3) + + layer_1_rn = self.scratch.layer1_rn(layer_1) + layer_2_rn = self.scratch.layer2_rn(layer_2) + layer_3_rn = self.scratch.layer3_rn(layer_3) + layer_4_rn = self.scratch.layer4_rn(layer_4) + + path_4 = self.scratch.refinenet4(layer_4_rn) + path_3 = self.scratch.refinenet3(path_4, layer_3_rn) + path_2 = self.scratch.refinenet2(path_3, layer_2_rn) + path_1 = self.scratch.refinenet1(path_2, layer_1_rn) + + out = self.scratch.output_conv(path_1) + + return torch.squeeze(out, dim=1) diff --git a/scepter/modules/annotator/midas/midas_net_custom.py b/scepter/modules/annotator/midas/midas_net_custom.py new file mode 100644 index 0000000..fcdf78d --- /dev/null +++ b/scepter/modules/annotator/midas/midas_net_custom.py @@ -0,0 +1,166 @@ +# -*- coding: utf-8 -*- +"""MidashNet: Network for monocular depth estimation trained by mixing several datasets. +This file contains code that is adapted from +https://github.com/thomasjpfan/pytorch_refinenet/blob/master/pytorch_refinenet/refinenet/refinenet_4cascade.py +""" +import torch +import torch.nn as nn + +from .base_model import BaseModel +from .blocks import FeatureFusionBlock_custom, Interpolate, _make_encoder + + +class MidasNet_small(BaseModel): + """Network for monocular depth estimation. + """ + def __init__(self, + path=None, + features=64, + backbone='efficientnet_lite3', + non_negative=True, + exportable=True, + channels_last=False, + align_corners=True, + blocks={'expand': True}): + """Init. + + Args: + path (str, optional): Path to saved model. Defaults to None. + features (int, optional): Number of features. Defaults to 256. + backbone (str, optional): Backbone network for encoder. Defaults to resnet50 + """ + print('Loading weights: ', path) + + super(MidasNet_small, self).__init__() + + use_pretrained = False if path else True + + self.channels_last = channels_last + self.blocks = blocks + self.backbone = backbone + + self.groups = 1 + + features1 = features + features2 = features + features3 = features + features4 = features + self.expand = False + if 'expand' in self.blocks and self.blocks['expand'] is True: + self.expand = True + features1 = features + features2 = features * 2 + features3 = features * 4 + features4 = features * 8 + + self.pretrained, self.scratch = _make_encoder(self.backbone, + features, + use_pretrained, + groups=self.groups, + expand=self.expand, + exportable=exportable) + + self.scratch.activation = nn.ReLU(False) + + self.scratch.refinenet4 = FeatureFusionBlock_custom( + features4, + self.scratch.activation, + deconv=False, + bn=False, + expand=self.expand, + align_corners=align_corners) + self.scratch.refinenet3 = FeatureFusionBlock_custom( + features3, + self.scratch.activation, + deconv=False, + bn=False, + expand=self.expand, + align_corners=align_corners) + self.scratch.refinenet2 = FeatureFusionBlock_custom( + features2, + self.scratch.activation, + deconv=False, + bn=False, + expand=self.expand, + align_corners=align_corners) + self.scratch.refinenet1 = FeatureFusionBlock_custom( + features1, + self.scratch.activation, + deconv=False, + bn=False, + align_corners=align_corners) + + self.scratch.output_conv = nn.Sequential( + nn.Conv2d(features, + features // 2, + kernel_size=3, + stride=1, + padding=1, + groups=self.groups), + Interpolate(scale_factor=2, mode='bilinear'), + nn.Conv2d(features // 2, 32, kernel_size=3, stride=1, padding=1), + self.scratch.activation, + nn.Conv2d(32, 1, kernel_size=1, stride=1, padding=0), + nn.ReLU(True) if non_negative else nn.Identity(), + nn.Identity(), + ) + + if path: + self.load(path) + + def forward(self, x): + """Forward pass. + + Args: + x (tensor): input data (image) + + Returns: + tensor: depth + """ + if self.channels_last is True: + print('self.channels_last = ', self.channels_last) + x.contiguous(memory_format=torch.channels_last) + + layer_1 = self.pretrained.layer1(x) + layer_2 = self.pretrained.layer2(layer_1) + layer_3 = self.pretrained.layer3(layer_2) + layer_4 = self.pretrained.layer4(layer_3) + + layer_1_rn = self.scratch.layer1_rn(layer_1) + layer_2_rn = self.scratch.layer2_rn(layer_2) + layer_3_rn = self.scratch.layer3_rn(layer_3) + layer_4_rn = self.scratch.layer4_rn(layer_4) + + path_4 = self.scratch.refinenet4(layer_4_rn) + path_3 = self.scratch.refinenet3(path_4, layer_3_rn) + path_2 = self.scratch.refinenet2(path_3, layer_2_rn) + path_1 = self.scratch.refinenet1(path_2, layer_1_rn) + + out = self.scratch.output_conv(path_1) + + return torch.squeeze(out, dim=1) + + +def fuse_model(m): + prev_previous_type = nn.Identity() + prev_previous_name = '' + previous_type = nn.Identity() + previous_name = '' + for name, module in m.named_modules(): + if prev_previous_type == nn.Conv2d and previous_type == nn.BatchNorm2d and type( + module) == nn.ReLU: + # print("FUSED ", prev_previous_name, previous_name, name) + torch.quantization.fuse_modules( + m, [prev_previous_name, previous_name, name], inplace=True) + elif prev_previous_type == nn.Conv2d and previous_type == nn.BatchNorm2d: + # print("FUSED ", prev_previous_name, previous_name) + torch.quantization.fuse_modules( + m, [prev_previous_name, previous_name], inplace=True) + # elif previous_type == nn.Conv2d and type(module) == nn.ReLU: + # print("FUSED ", previous_name, name) + # torch.quantization.fuse_modules(m, [previous_name, name], inplace=True) + + prev_previous_type = previous_type + prev_previous_name = previous_name + previous_type = type(module) + previous_name = name diff --git a/scepter/modules/annotator/midas/transforms.py b/scepter/modules/annotator/midas/transforms.py new file mode 100644 index 0000000..c1da433 --- /dev/null +++ b/scepter/modules/annotator/midas/transforms.py @@ -0,0 +1,230 @@ +# -*- coding: utf-8 -*- +import math + +import cv2 +import numpy as np + + +def apply_min_size(sample, size, image_interpolation_method=cv2.INTER_AREA): + """Rezise the sample to ensure the given size. Keeps aspect ratio. + + Args: + sample (dict): sample + size (tuple): image size + + Returns: + tuple: new size + """ + shape = list(sample['disparity'].shape) + + if shape[0] >= size[0] and shape[1] >= size[1]: + return sample + + scale = [0, 0] + scale[0] = size[0] / shape[0] + scale[1] = size[1] / shape[1] + + scale = max(scale) + + shape[0] = math.ceil(scale * shape[0]) + shape[1] = math.ceil(scale * shape[1]) + + # resize + sample['image'] = cv2.resize(sample['image'], + tuple(shape[::-1]), + interpolation=image_interpolation_method) + + sample['disparity'] = cv2.resize(sample['disparity'], + tuple(shape[::-1]), + interpolation=cv2.INTER_NEAREST) + sample['mask'] = cv2.resize( + sample['mask'].astype(np.float32), + tuple(shape[::-1]), + interpolation=cv2.INTER_NEAREST, + ) + sample['mask'] = sample['mask'].astype(bool) + + return tuple(shape) + + +class Resize(object): + """Resize sample to given size (width, height). + """ + def __init__( + self, + width, + height, + resize_target=True, + keep_aspect_ratio=False, + ensure_multiple_of=1, + resize_method='lower_bound', + image_interpolation_method=cv2.INTER_AREA, + ): + """Init. + + Args: + width (int): desired output width + height (int): desired output height + resize_target (bool, optional): + True: Resize the full sample (image, mask, target). + False: Resize image only. + Defaults to True. + keep_aspect_ratio (bool, optional): + True: Keep the aspect ratio of the input sample. + Output sample might not have the given width and height, and + resize behaviour depends on the parameter 'resize_method'. + Defaults to False. + ensure_multiple_of (int, optional): + Output width and height is constrained to be multiple of this parameter. + Defaults to 1. + resize_method (str, optional): + "lower_bound": Output will be at least as large as the given size. + "upper_bound": Output will be at max as large as the given size. " + "(Output size might be smaller than given size.)" + "minimal": Scale as least as possible. (Output size might be smaller than given size.) + Defaults to "lower_bound". + """ + self.__width = width + self.__height = height + + self.__resize_target = resize_target + self.__keep_aspect_ratio = keep_aspect_ratio + self.__multiple_of = ensure_multiple_of + self.__resize_method = resize_method + self.__image_interpolation_method = image_interpolation_method + + def constrain_to_multiple_of(self, x, min_val=0, max_val=None): + y = (np.round(x / self.__multiple_of) * self.__multiple_of).astype(int) + + if max_val is not None and y > max_val: + y = (np.floor(x / self.__multiple_of) * + self.__multiple_of).astype(int) + + if y < min_val: + y = (np.ceil(x / self.__multiple_of) * + self.__multiple_of).astype(int) + + return y + + def get_size(self, width, height): + # determine new height and width + scale_height = self.__height / height + scale_width = self.__width / width + + if self.__keep_aspect_ratio: + if self.__resize_method == 'lower_bound': + # scale such that output size is lower bound + if scale_width > scale_height: + # fit width + scale_height = scale_width + else: + # fit height + scale_width = scale_height + elif self.__resize_method == 'upper_bound': + # scale such that output size is upper bound + if scale_width < scale_height: + # fit width + scale_height = scale_width + else: + # fit height + scale_width = scale_height + elif self.__resize_method == 'minimal': + # scale as least as possbile + if abs(1 - scale_width) < abs(1 - scale_height): + # fit width + scale_height = scale_width + else: + # fit height + scale_width = scale_height + else: + raise ValueError( + f'resize_method {self.__resize_method} not implemented') + + if self.__resize_method == 'lower_bound': + new_height = self.constrain_to_multiple_of(scale_height * height, + min_val=self.__height) + new_width = self.constrain_to_multiple_of(scale_width * width, + min_val=self.__width) + elif self.__resize_method == 'upper_bound': + new_height = self.constrain_to_multiple_of(scale_height * height, + max_val=self.__height) + new_width = self.constrain_to_multiple_of(scale_width * width, + max_val=self.__width) + elif self.__resize_method == 'minimal': + new_height = self.constrain_to_multiple_of(scale_height * height) + new_width = self.constrain_to_multiple_of(scale_width * width) + else: + raise ValueError( + f'resize_method {self.__resize_method} not implemented') + + return (new_width, new_height) + + def __call__(self, sample): + width, height = self.get_size(sample['image'].shape[1], + sample['image'].shape[0]) + + # resize sample + sample['image'] = cv2.resize( + sample['image'], + (width, height), + interpolation=self.__image_interpolation_method, + ) + + if self.__resize_target: + if 'disparity' in sample: + sample['disparity'] = cv2.resize( + sample['disparity'], + (width, height), + interpolation=cv2.INTER_NEAREST, + ) + + if 'depth' in sample: + sample['depth'] = cv2.resize(sample['depth'], (width, height), + interpolation=cv2.INTER_NEAREST) + + sample['mask'] = cv2.resize( + sample['mask'].astype(np.float32), + (width, height), + interpolation=cv2.INTER_NEAREST, + ) + sample['mask'] = sample['mask'].astype(bool) + + return sample + + +class NormalizeImage(object): + """Normlize image by given mean and std. + """ + def __init__(self, mean, std): + self.__mean = mean + self.__std = std + + def __call__(self, sample): + sample['image'] = (sample['image'] - self.__mean) / self.__std + + return sample + + +class PrepareForNet(object): + """Prepare sample for usage as network input. + """ + def __init__(self): + pass + + def __call__(self, sample): + image = np.transpose(sample['image'], (2, 0, 1)) + sample['image'] = np.ascontiguousarray(image).astype(np.float32) + + if 'mask' in sample: + sample['mask'] = sample['mask'].astype(np.float32) + sample['mask'] = np.ascontiguousarray(sample['mask']) + + if 'disparity' in sample: + disparity = sample['disparity'].astype(np.float32) + sample['disparity'] = np.ascontiguousarray(disparity) + + if 'depth' in sample: + depth = sample['depth'].astype(np.float32) + sample['depth'] = np.ascontiguousarray(depth) + + return sample diff --git a/scepter/modules/annotator/midas/utils.py b/scepter/modules/annotator/midas/utils.py new file mode 100644 index 0000000..6bf792a --- /dev/null +++ b/scepter/modules/annotator/midas/utils.py @@ -0,0 +1,192 @@ +# -*- coding: utf-8 -*- +"""Utils for monoDepth.""" +import re +import sys + +import cv2 +import numpy as np +import torch + + +def read_pfm(path): + """Read pfm file. + + Args: + path (str): path to file + + Returns: + tuple: (data, scale) + """ + with open(path, 'rb') as file: + + color = None + width = None + height = None + scale = None + endian = None + + header = file.readline().rstrip() + if header.decode('ascii') == 'PF': + color = True + elif header.decode('ascii') == 'Pf': + color = False + else: + raise Exception('Not a PFM file: ' + path) + + dim_match = re.match(r'^(\d+)\s(\d+)\s$', + file.readline().decode('ascii')) + if dim_match: + width, height = list(map(int, dim_match.groups())) + else: + raise Exception('Malformed PFM header.') + + scale = float(file.readline().decode('ascii').rstrip()) + if scale < 0: + # little-endian + endian = '<' + scale = -scale + else: + # big-endian + endian = '>' + + data = np.fromfile(file, endian + 'f') + shape = (height, width, 3) if color else (height, width) + + data = np.reshape(data, shape) + data = np.flipud(data) + + return data, scale + + +def write_pfm(path, image, scale=1): + """Write pfm file. + + Args: + path (str): pathto file + image (array): data + scale (int, optional): Scale. Defaults to 1. + """ + + with open(path, 'wb') as file: + color = None + + if image.dtype.name != 'float32': + raise Exception('Image dtype must be float32.') + + image = np.flipud(image) + + if len(image.shape) == 3 and image.shape[2] == 3: # color image + color = True + elif (len(image.shape) == 2 + or len(image.shape) == 3 and image.shape[2] == 1): # greyscale + color = False + else: + raise Exception( + 'Image must have H x W x 3, H x W x 1 or H x W dimensions.') + + file.write('PF\n' if color else 'Pf\n'.encode()) + file.write('%d %d\n'.encode() % (image.shape[1], image.shape[0])) + + endian = image.dtype.byteorder + + if endian == '<' or endian == '=' and sys.byteorder == 'little': + scale = -scale + + file.write('%f\n'.encode() % scale) + + image.tofile(file) + + +def read_image(path): + """Read image and output RGB image (0-1). + + Args: + path (str): path to file + + Returns: + array: RGB image (0-1) + """ + img = cv2.imread(path) + + if img.ndim == 2: + img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) + + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) / 255.0 + + return img + + +def resize_image(img): + """Resize image and make it fit for network. + + Args: + img (array): image + + Returns: + tensor: data ready for network + """ + height_orig = img.shape[0] + width_orig = img.shape[1] + + if width_orig > height_orig: + scale = width_orig / 384 + else: + scale = height_orig / 384 + + height = (np.ceil(height_orig / scale / 32) * 32).astype(int) + width = (np.ceil(width_orig / scale / 32) * 32).astype(int) + + img_resized = cv2.resize(img, (width, height), + interpolation=cv2.INTER_AREA) + + img_resized = (torch.from_numpy(np.transpose( + img_resized, (2, 0, 1))).contiguous().float()) + img_resized = img_resized.unsqueeze(0) + + return img_resized + + +def resize_depth(depth, width, height): + """Resize depth map and bring to CPU (numpy). + + Args: + depth (tensor): depth + width (int): image width + height (int): image height + + Returns: + array: processed depth + """ + depth = torch.squeeze(depth[0, :, :, :]).to('cpu') + + depth_resized = cv2.resize(depth.numpy(), (width, height), + interpolation=cv2.INTER_CUBIC) + + return depth_resized + + +def write_depth(path, depth, bits=1): + """Write depth map to pfm and png file. + + Args: + path (str): filepath without extension + depth (array): depth + """ + write_pfm(path + '.pfm', depth.astype(np.float32)) + + depth_min = depth.min() + depth_max = depth.max() + + max_val = (2**(8 * bits)) - 1 + + if depth_max - depth_min > np.finfo('float').eps: + out = max_val * (depth - depth_min) / (depth_max - depth_min) + else: + out = np.zeros(depth.shape, dtype=depth.type) + + if bits == 1: + cv2.imwrite(path + '.png', out.astype('uint8')) + elif bits == 2: + cv2.imwrite(path + '.png', out.astype('uint16')) + + return diff --git a/scepter/modules/annotator/midas/vit.py b/scepter/modules/annotator/midas/vit.py new file mode 100644 index 0000000..4729b4b --- /dev/null +++ b/scepter/modules/annotator/midas/vit.py @@ -0,0 +1,509 @@ +# -*- coding: utf-8 -*- +import math +import types + +import timm +import torch +import torch.nn as nn +import torch.nn.functional as F + + +class Slice(nn.Module): + def __init__(self, start_index=1): + super(Slice, self).__init__() + self.start_index = start_index + + def forward(self, x): + return x[:, self.start_index:] + + +class AddReadout(nn.Module): + def __init__(self, start_index=1): + super(AddReadout, self).__init__() + self.start_index = start_index + + def forward(self, x): + if self.start_index == 2: + readout = (x[:, 0] + x[:, 1]) / 2 + else: + readout = x[:, 0] + return x[:, self.start_index:] + readout.unsqueeze(1) + + +class ProjectReadout(nn.Module): + def __init__(self, in_features, start_index=1): + super(ProjectReadout, self).__init__() + self.start_index = start_index + + self.project = nn.Sequential(nn.Linear(2 * in_features, in_features), + nn.GELU()) + + def forward(self, x): + readout = x[:, 0].unsqueeze(1).expand_as(x[:, self.start_index:]) + features = torch.cat((x[:, self.start_index:], readout), -1) + + return self.project(features) + + +class Transpose(nn.Module): + def __init__(self, dim0, dim1): + super(Transpose, self).__init__() + self.dim0 = dim0 + self.dim1 = dim1 + + def forward(self, x): + x = x.transpose(self.dim0, self.dim1) + return x + + +def forward_vit(pretrained, x): + b, c, h, w = x.shape + + _ = pretrained.model.forward_flex(x) + + layer_1 = pretrained.activations['1'] + layer_2 = pretrained.activations['2'] + layer_3 = pretrained.activations['3'] + layer_4 = pretrained.activations['4'] + + layer_1 = pretrained.act_postprocess1[0:2](layer_1) + layer_2 = pretrained.act_postprocess2[0:2](layer_2) + layer_3 = pretrained.act_postprocess3[0:2](layer_3) + layer_4 = pretrained.act_postprocess4[0:2](layer_4) + + unflatten = nn.Sequential( + nn.Unflatten( + 2, + torch.Size([ + h // pretrained.model.patch_size[1], + w // pretrained.model.patch_size[0], + ]), + )) + + if layer_1.ndim == 3: + layer_1 = unflatten(layer_1) + if layer_2.ndim == 3: + layer_2 = unflatten(layer_2) + if layer_3.ndim == 3: + layer_3 = unflatten(layer_3) + if layer_4.ndim == 3: + layer_4 = unflatten(layer_4) + + layer_1 = pretrained.act_postprocess1[3:len(pretrained.act_postprocess1)]( + layer_1) + layer_2 = pretrained.act_postprocess2[3:len(pretrained.act_postprocess2)]( + layer_2) + layer_3 = pretrained.act_postprocess3[3:len(pretrained.act_postprocess3)]( + layer_3) + layer_4 = pretrained.act_postprocess4[3:len(pretrained.act_postprocess4)]( + layer_4) + + return layer_1, layer_2, layer_3, layer_4 + + +def _resize_pos_embed(self, posemb, gs_h, gs_w): + posemb_tok, posemb_grid = ( + posemb[:, :self.start_index], + posemb[0, self.start_index:], + ) + + gs_old = int(math.sqrt(len(posemb_grid))) + + posemb_grid = posemb_grid.reshape(1, gs_old, gs_old, + -1).permute(0, 3, 1, 2) + posemb_grid = F.interpolate(posemb_grid, + size=(gs_h, gs_w), + mode='bilinear') + posemb_grid = posemb_grid.permute(0, 2, 3, 1).reshape(1, gs_h * gs_w, -1) + + posemb = torch.cat([posemb_tok, posemb_grid], dim=1) + + return posemb + + +def forward_flex(self, x): + b, c, h, w = x.shape + + pos_embed = self._resize_pos_embed(self.pos_embed, h // self.patch_size[1], + w // self.patch_size[0]) + + B = x.shape[0] + + if hasattr(self.patch_embed, 'backbone'): + x = self.patch_embed.backbone(x) + if isinstance(x, (list, tuple)): + x = x[ + -1] # last feature if backbone outputs list/tuple of features + + x = self.patch_embed.proj(x).flatten(2).transpose(1, 2) + + if getattr(self, 'dist_token', None) is not None: + cls_tokens = self.cls_token.expand( + B, -1, -1) # stole cls_tokens impl from Phil Wang, thanks + dist_token = self.dist_token.expand(B, -1, -1) + x = torch.cat((cls_tokens, dist_token, x), dim=1) + else: + cls_tokens = self.cls_token.expand( + B, -1, -1) # stole cls_tokens impl from Phil Wang, thanks + x = torch.cat((cls_tokens, x), dim=1) + + x = x + pos_embed + x = self.pos_drop(x) + + for blk in self.blocks: + x = blk(x) + + x = self.norm(x) + + return x + + +activations = {} + + +def get_activation(name): + def hook(model, input, output): + activations[name] = output + + return hook + + +def get_readout_oper(vit_features, features, use_readout, start_index=1): + if use_readout == 'ignore': + readout_oper = [Slice(start_index)] * len(features) + elif use_readout == 'add': + readout_oper = [AddReadout(start_index)] * len(features) + elif use_readout == 'project': + readout_oper = [ + ProjectReadout(vit_features, start_index) for out_feat in features + ] + else: + assert ( + False + ), "wrong operation for readout token, use_readout can be 'ignore', 'add', or 'project'" + + return readout_oper + + +def _make_vit_b16_backbone( + model, + features=[96, 192, 384, 768], + size=[384, 384], + hooks=[2, 5, 8, 11], + vit_features=768, + use_readout='ignore', + start_index=1, +): + pretrained = nn.Module() + + pretrained.model = model + pretrained.model.blocks[hooks[0]].register_forward_hook( + get_activation('1')) + pretrained.model.blocks[hooks[1]].register_forward_hook( + get_activation('2')) + pretrained.model.blocks[hooks[2]].register_forward_hook( + get_activation('3')) + pretrained.model.blocks[hooks[3]].register_forward_hook( + get_activation('4')) + + pretrained.activations = activations + + readout_oper = get_readout_oper(vit_features, features, use_readout, + start_index) + + # 32, 48, 136, 384 + pretrained.act_postprocess1 = nn.Sequential( + readout_oper[0], + Transpose(1, 2), + nn.Unflatten(2, torch.Size([size[0] // 16, size[1] // 16])), + nn.Conv2d( + in_channels=vit_features, + out_channels=features[0], + kernel_size=1, + stride=1, + padding=0, + ), + nn.ConvTranspose2d( + in_channels=features[0], + out_channels=features[0], + kernel_size=4, + stride=4, + padding=0, + bias=True, + dilation=1, + groups=1, + ), + ) + + pretrained.act_postprocess2 = nn.Sequential( + readout_oper[1], + Transpose(1, 2), + nn.Unflatten(2, torch.Size([size[0] // 16, size[1] // 16])), + nn.Conv2d( + in_channels=vit_features, + out_channels=features[1], + kernel_size=1, + stride=1, + padding=0, + ), + nn.ConvTranspose2d( + in_channels=features[1], + out_channels=features[1], + kernel_size=2, + stride=2, + padding=0, + bias=True, + dilation=1, + groups=1, + ), + ) + + pretrained.act_postprocess3 = nn.Sequential( + readout_oper[2], + Transpose(1, 2), + nn.Unflatten(2, torch.Size([size[0] // 16, size[1] // 16])), + nn.Conv2d( + in_channels=vit_features, + out_channels=features[2], + kernel_size=1, + stride=1, + padding=0, + ), + ) + + pretrained.act_postprocess4 = nn.Sequential( + readout_oper[3], + Transpose(1, 2), + nn.Unflatten(2, torch.Size([size[0] // 16, size[1] // 16])), + nn.Conv2d( + in_channels=vit_features, + out_channels=features[3], + kernel_size=1, + stride=1, + padding=0, + ), + nn.Conv2d( + in_channels=features[3], + out_channels=features[3], + kernel_size=3, + stride=2, + padding=1, + ), + ) + + pretrained.model.start_index = start_index + pretrained.model.patch_size = [16, 16] + + # We inject this function into the VisionTransformer instances so that + # we can use it with interpolated position embeddings without modifying the library source. + pretrained.model.forward_flex = types.MethodType(forward_flex, + pretrained.model) + pretrained.model._resize_pos_embed = types.MethodType( + _resize_pos_embed, pretrained.model) + + return pretrained + + +def _make_pretrained_vitl16_384(pretrained, use_readout='ignore', hooks=None): + model = timm.create_model('vit_large_patch16_384', pretrained=pretrained) + + hooks = [5, 11, 17, 23] if hooks is None else hooks + return _make_vit_b16_backbone( + model, + features=[256, 512, 1024, 1024], + hooks=hooks, + vit_features=1024, + use_readout=use_readout, + ) + + +def _make_pretrained_vitb16_384(pretrained, use_readout='ignore', hooks=None): + model = timm.create_model('vit_base_patch16_384', pretrained=pretrained) + + hooks = [2, 5, 8, 11] if hooks is None else hooks + return _make_vit_b16_backbone(model, + features=[96, 192, 384, 768], + hooks=hooks, + use_readout=use_readout) + + +def _make_pretrained_deitb16_384(pretrained, use_readout='ignore', hooks=None): + model = timm.create_model('vit_deit_base_patch16_384', + pretrained=pretrained) + + hooks = [2, 5, 8, 11] if hooks is None else hooks + return _make_vit_b16_backbone(model, + features=[96, 192, 384, 768], + hooks=hooks, + use_readout=use_readout) + + +def _make_pretrained_deitb16_distil_384(pretrained, + use_readout='ignore', + hooks=None): + model = timm.create_model('vit_deit_base_distilled_patch16_384', + pretrained=pretrained) + + hooks = [2, 5, 8, 11] if hooks is None else hooks + return _make_vit_b16_backbone( + model, + features=[96, 192, 384, 768], + hooks=hooks, + use_readout=use_readout, + start_index=2, + ) + + +def _make_vit_b_rn50_backbone( + model, + features=[256, 512, 768, 768], + size=[384, 384], + hooks=[0, 1, 8, 11], + vit_features=768, + use_vit_only=False, + use_readout='ignore', + start_index=1, +): + pretrained = nn.Module() + + pretrained.model = model + + if use_vit_only is True: + pretrained.model.blocks[hooks[0]].register_forward_hook( + get_activation('1')) + pretrained.model.blocks[hooks[1]].register_forward_hook( + get_activation('2')) + else: + pretrained.model.patch_embed.backbone.stages[0].register_forward_hook( + get_activation('1')) + pretrained.model.patch_embed.backbone.stages[1].register_forward_hook( + get_activation('2')) + + pretrained.model.blocks[hooks[2]].register_forward_hook( + get_activation('3')) + pretrained.model.blocks[hooks[3]].register_forward_hook( + get_activation('4')) + + pretrained.activations = activations + + readout_oper = get_readout_oper(vit_features, features, use_readout, + start_index) + + if use_vit_only is True: + pretrained.act_postprocess1 = nn.Sequential( + readout_oper[0], + Transpose(1, 2), + nn.Unflatten(2, torch.Size([size[0] // 16, size[1] // 16])), + nn.Conv2d( + in_channels=vit_features, + out_channels=features[0], + kernel_size=1, + stride=1, + padding=0, + ), + nn.ConvTranspose2d( + in_channels=features[0], + out_channels=features[0], + kernel_size=4, + stride=4, + padding=0, + bias=True, + dilation=1, + groups=1, + ), + ) + + pretrained.act_postprocess2 = nn.Sequential( + readout_oper[1], + Transpose(1, 2), + nn.Unflatten(2, torch.Size([size[0] // 16, size[1] // 16])), + nn.Conv2d( + in_channels=vit_features, + out_channels=features[1], + kernel_size=1, + stride=1, + padding=0, + ), + nn.ConvTranspose2d( + in_channels=features[1], + out_channels=features[1], + kernel_size=2, + stride=2, + padding=0, + bias=True, + dilation=1, + groups=1, + ), + ) + else: + pretrained.act_postprocess1 = nn.Sequential(nn.Identity(), + nn.Identity(), + nn.Identity()) + pretrained.act_postprocess2 = nn.Sequential(nn.Identity(), + nn.Identity(), + nn.Identity()) + + pretrained.act_postprocess3 = nn.Sequential( + readout_oper[2], + Transpose(1, 2), + nn.Unflatten(2, torch.Size([size[0] // 16, size[1] // 16])), + nn.Conv2d( + in_channels=vit_features, + out_channels=features[2], + kernel_size=1, + stride=1, + padding=0, + ), + ) + + pretrained.act_postprocess4 = nn.Sequential( + readout_oper[3], + Transpose(1, 2), + nn.Unflatten(2, torch.Size([size[0] // 16, size[1] // 16])), + nn.Conv2d( + in_channels=vit_features, + out_channels=features[3], + kernel_size=1, + stride=1, + padding=0, + ), + nn.Conv2d( + in_channels=features[3], + out_channels=features[3], + kernel_size=3, + stride=2, + padding=1, + ), + ) + + pretrained.model.start_index = start_index + pretrained.model.patch_size = [16, 16] + + # We inject this function into the VisionTransformer instances so that + # we can use it with interpolated position embeddings without modifying the library source. + pretrained.model.forward_flex = types.MethodType(forward_flex, + pretrained.model) + + # We inject this function into the VisionTransformer instances so that + # we can use it with interpolated position embeddings without modifying the library source. + pretrained.model._resize_pos_embed = types.MethodType( + _resize_pos_embed, pretrained.model) + + return pretrained + + +def _make_pretrained_vitb_rn50_384(pretrained, + use_readout='ignore', + hooks=None, + use_vit_only=False): + model = timm.create_model('vit_base_resnet50_384', pretrained=pretrained) + + hooks = [0, 1, 8, 11] if hooks is None else hooks + return _make_vit_b_rn50_backbone( + model, + features=[256, 512, 768, 768], + size=[384, 384], + hooks=hooks, + use_vit_only=use_vit_only, + use_readout=use_readout, + ) diff --git a/scepter/modules/annotator/midas_op.py b/scepter/modules/annotator/midas_op.py new file mode 100644 index 0000000..09a883d --- /dev/null +++ b/scepter/modules/annotator/midas_op.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# Midas Depth Estimation +# From https://github.com/isl-org/MiDaS +# MIT LICENSE +from abc import ABCMeta + +import numpy as np +import torch +from einops import rearrange +from PIL import Image + +from scepter.modules.annotator.base_annotator import BaseAnnotator +from scepter.modules.annotator.midas.api import MiDaSInference +from scepter.modules.annotator.registry import ANNOTATORS +from scepter.modules.annotator.utils import resize_image, resize_image_ori +from scepter.modules.utils.config import dict_to_yaml +from scepter.modules.utils.distribute import we +from scepter.modules.utils.file_system import FS + + +@ANNOTATORS.register_class() +class MidasDetector(BaseAnnotator, metaclass=ABCMeta): + def __init__(self, cfg, logger=None): + super().__init__(cfg, logger=logger) + pretrained_model = cfg.get('PRETRAINED_MODEL', None) + if pretrained_model: + with FS.get_from(pretrained_model, wait_finish=True) as local_path: + self.model = MiDaSInference(model_type='dpt_hybrid', + model_path=local_path) + self.a = cfg.get('A', np.pi * 2.0) + self.bg_th = cfg.get('BG_TH', 0.1) + + @torch.no_grad() + @torch.inference_mode() + @torch.autocast('cuda', enabled=False) + def forward(self, image): + if isinstance(image, Image.Image): + image = np.array(image) + elif isinstance(image, torch.Tensor): + image = image.detach().cpu().numpy() + elif isinstance(image, np.ndarray): + image = image.copy() + else: + raise f'Unsurpport datatype{type(image)}, only surpport np.ndarray, torch.Tensor, Pillow Image.' + image_depth = image + h, w, c = image.shape + image_depth, k = resize_image(image_depth, + 1024 if min(h, w) > 1024 else min(h, w)) + image_depth = torch.from_numpy(image_depth).float().to(we.device_id) + image_depth = image_depth / 127.5 - 1.0 + image_depth = rearrange(image_depth, 'h w c -> 1 c h w') + depth = self.model(image_depth)[0] + + depth_pt = depth.clone() + depth_pt -= torch.min(depth_pt) + depth_pt /= torch.max(depth_pt) + depth_pt = depth_pt.cpu().numpy() + depth_image = (depth_pt * 255.0).clip(0, 255).astype(np.uint8) + depth_image = depth_image[..., None].repeat(3, 2) + + # depth_np = depth.cpu().numpy() # float16 error + # x = cv2.Sobel(depth_np, cv2.CV_32F, 1, 0, ksize=3) + # y = cv2.Sobel(depth_np, cv2.CV_32F, 0, 1, ksize=3) + # z = np.ones_like(x) * self.a + # x[depth_pt < self.bg_th] = 0 + # y[depth_pt < self.bg_th] = 0 + # normal = np.stack([x, y, z], axis=2) + # normal /= np.sum(normal**2.0, axis=2, keepdims=True)**0.5 + # normal_image = (normal * 127.5 + 127.5).clip(0, 255).astype(np.uint8) + depth_image = resize_image_ori(h, w, depth_image, k) + return depth_image + + @staticmethod + def get_config_template(): + return dict_to_yaml('ANNOTATORS', + __class__.__name__, + MidasDetector.para_dict, + set_name=True) diff --git a/scepter/modules/annotator/mlsd/__init__.py b/scepter/modules/annotator/mlsd/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scepter/modules/annotator/mlsd/mbv2_mlsd_large.py b/scepter/modules/annotator/mlsd/mbv2_mlsd_large.py new file mode 100644 index 0000000..7555e93 --- /dev/null +++ b/scepter/modules/annotator/mlsd/mbv2_mlsd_large.py @@ -0,0 +1,303 @@ +# -*- coding: utf-8 -*- + +import torch +import torch.nn as nn +import torch.utils.model_zoo as model_zoo +from torch.nn import functional as F + + +class BlockTypeA(nn.Module): + def __init__(self, in_c1, in_c2, out_c1, out_c2, upscale=True): + super(BlockTypeA, self).__init__() + self.conv1 = nn.Sequential(nn.Conv2d(in_c2, out_c2, kernel_size=1), + nn.BatchNorm2d(out_c2), + nn.ReLU(inplace=True)) + self.conv2 = nn.Sequential(nn.Conv2d(in_c1, out_c1, kernel_size=1), + nn.BatchNorm2d(out_c1), + nn.ReLU(inplace=True)) + self.upscale = upscale + + def forward(self, a, b): + b = self.conv1(b) + a = self.conv2(a) + if self.upscale: + b = F.interpolate(b, + scale_factor=2.0, + mode='bilinear', + align_corners=True) + return torch.cat((a, b), dim=1) + + +class BlockTypeB(nn.Module): + def __init__(self, in_c, out_c): + super(BlockTypeB, self).__init__() + self.conv1 = nn.Sequential( + nn.Conv2d(in_c, in_c, kernel_size=3, padding=1), + nn.BatchNorm2d(in_c), nn.ReLU()) + self.conv2 = nn.Sequential( + nn.Conv2d(in_c, out_c, kernel_size=3, padding=1), + nn.BatchNorm2d(out_c), nn.ReLU()) + + def forward(self, x): + x = self.conv1(x) + x + x = self.conv2(x) + return x + + +class BlockTypeC(nn.Module): + def __init__(self, in_c, out_c): + super(BlockTypeC, self).__init__() + self.conv1 = nn.Sequential( + nn.Conv2d(in_c, in_c, kernel_size=3, padding=5, dilation=5), + nn.BatchNorm2d(in_c), nn.ReLU()) + self.conv2 = nn.Sequential( + nn.Conv2d(in_c, in_c, kernel_size=3, padding=1), + nn.BatchNorm2d(in_c), nn.ReLU()) + self.conv3 = nn.Conv2d(in_c, out_c, kernel_size=1) + + def forward(self, x): + x = self.conv1(x) + x = self.conv2(x) + x = self.conv3(x) + return x + + +def _make_divisible(v, divisor, min_value=None): + """ + This function is taken from the original tf repo. + It ensures that all layers have a channel number that is divisible by 8 + It can be seen here: + https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py + :param v: + :param divisor: + :param min_value: + :return: + """ + if min_value is None: + min_value = divisor + new_v = max(min_value, int(v + divisor / 2) // divisor * divisor) + # Make sure that round down does not go down by more than 10%. + if new_v < 0.9 * v: + new_v += divisor + return new_v + + +class ConvBNReLU(nn.Sequential): + def __init__(self, + in_planes, + out_planes, + kernel_size=3, + stride=1, + groups=1): + self.channel_pad = out_planes - in_planes + self.stride = stride + # padding = (kernel_size - 1) // 2 + + # TFLite uses slightly different padding than PyTorch + if stride == 2: + padding = 0 + else: + padding = (kernel_size - 1) // 2 + + super(ConvBNReLU, self).__init__( + nn.Conv2d(in_planes, + out_planes, + kernel_size, + stride, + padding, + groups=groups, + bias=False), nn.BatchNorm2d(out_planes), + nn.ReLU6(inplace=True)) + self.max_pool = nn.MaxPool2d(kernel_size=stride, stride=stride) + + def forward(self, x): + # TFLite uses different padding + if self.stride == 2: + x = F.pad(x, (0, 1, 0, 1), 'constant', 0) + # print(x.shape) + + for module in self: + if not isinstance(module, nn.MaxPool2d): + x = module(x) + return x + + +class InvertedResidual(nn.Module): + def __init__(self, inp, oup, stride, expand_ratio): + super(InvertedResidual, self).__init__() + self.stride = stride + assert stride in [1, 2] + + hidden_dim = int(round(inp * expand_ratio)) + self.use_res_connect = self.stride == 1 and inp == oup + + layers = [] + if expand_ratio != 1: + # pw + layers.append(ConvBNReLU(inp, hidden_dim, kernel_size=1)) + layers.extend([ + # dw + ConvBNReLU(hidden_dim, + hidden_dim, + stride=stride, + groups=hidden_dim), + # pw-linear + nn.Conv2d(hidden_dim, oup, 1, 1, 0, bias=False), + nn.BatchNorm2d(oup), + ]) + self.conv = nn.Sequential(*layers) + + def forward(self, x): + if self.use_res_connect: + return x + self.conv(x) + else: + return self.conv(x) + + +class MobileNetV2(nn.Module): + def __init__(self, pretrained=True): + """ + MobileNet V2 main class + Args: + num_classes (int): Number of classes + width_mult (float): Width multiplier - adjusts number of channels in each layer by this amount + inverted_residual_setting: Network structure + round_nearest (int): Round the number of channels in each layer to be a multiple of this number + Set to 1 to turn off rounding + block: Module specifying inverted residual building block for mobilenet + """ + super(MobileNetV2, self).__init__() + + block = InvertedResidual + input_channel = 32 + last_channel = 1280 + width_mult = 1.0 + round_nearest = 8 + + inverted_residual_setting = [ + # t, c, n, s + [1, 16, 1, 1], + [6, 24, 2, 2], + [6, 32, 3, 2], + [6, 64, 4, 2], + [6, 96, 3, 1], + # [6, 160, 3, 2], + # [6, 320, 1, 1], + ] + + # only check the first element, assuming user knows t,c,n,s are required + if len(inverted_residual_setting) == 0 or len( + inverted_residual_setting[0]) != 4: + raise ValueError('inverted_residual_setting should be non-empty ' + 'or a 4-element list, got {}'.format( + inverted_residual_setting)) + + # building first layer + input_channel = _make_divisible(input_channel * width_mult, + round_nearest) + self.last_channel = _make_divisible( + last_channel * max(1.0, width_mult), round_nearest) + features = [ConvBNReLU(4, input_channel, stride=2)] + # building inverted residual blocks + for t, c, n, s in inverted_residual_setting: + output_channel = _make_divisible(c * width_mult, round_nearest) + for i in range(n): + stride = s if i == 0 else 1 + features.append( + block(input_channel, + output_channel, + stride, + expand_ratio=t)) + input_channel = output_channel + + self.features = nn.Sequential(*features) + self.fpn_selected = [1, 3, 6, 10, 13] + # weight initialization + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight, mode='fan_out') + if m.bias is not None: + nn.init.zeros_(m.bias) + elif isinstance(m, nn.BatchNorm2d): + nn.init.ones_(m.weight) + nn.init.zeros_(m.bias) + elif isinstance(m, nn.Linear): + nn.init.normal_(m.weight, 0, 0.01) + nn.init.zeros_(m.bias) + if pretrained: + self._load_pretrained_model() + + def _forward_impl(self, x): + # This exists since TorchScript doesn't support inheritance, so the superclass method + # (this one) needs to have a name other than `forward` that can be accessed in a subclass + fpn_features = [] + for i, f in enumerate(self.features): + if i > self.fpn_selected[-1]: + break + x = f(x) + if i in self.fpn_selected: + fpn_features.append(x) + + c1, c2, c3, c4, c5 = fpn_features + return c1, c2, c3, c4, c5 + + def forward(self, x): + return self._forward_impl(x) + + def _load_pretrained_model(self): + pretrain_dict = model_zoo.load_url( + 'https://download.pytorch.org/models/mobilenet_v2-b0353104.pth') + model_dict = {} + state_dict = self.state_dict() + for k, v in pretrain_dict.items(): + if k in state_dict: + model_dict[k] = v + state_dict.update(model_dict) + self.load_state_dict(state_dict) + + +class MobileV2_MLSD_Large(nn.Module): + def __init__(self): + super(MobileV2_MLSD_Large, self).__init__() + + self.backbone = MobileNetV2(pretrained=False) + # A, B + self.block15 = BlockTypeA(in_c1=64, + in_c2=96, + out_c1=64, + out_c2=64, + upscale=False) + self.block16 = BlockTypeB(128, 64) + + # A, B + self.block17 = BlockTypeA(in_c1=32, in_c2=64, out_c1=64, out_c2=64) + self.block18 = BlockTypeB(128, 64) + + # A, B + self.block19 = BlockTypeA(in_c1=24, in_c2=64, out_c1=64, out_c2=64) + self.block20 = BlockTypeB(128, 64) + + # A, B, C + self.block21 = BlockTypeA(in_c1=16, in_c2=64, out_c1=64, out_c2=64) + self.block22 = BlockTypeB(128, 64) + + self.block23 = BlockTypeC(64, 16) + + def forward(self, x): + c1, c2, c3, c4, c5 = self.backbone(x) + + x = self.block15(c4, c5) + x = self.block16(x) + + x = self.block17(c3, x) + x = self.block18(x) + + x = self.block19(c2, x) + x = self.block20(x) + + x = self.block21(c1, x) + x = self.block22(x) + x = self.block23(x) + x = x[:, 7:, :, :] + + return x diff --git a/scepter/modules/annotator/mlsd/mbv2_mlsd_tiny.py b/scepter/modules/annotator/mlsd/mbv2_mlsd_tiny.py new file mode 100644 index 0000000..4e906c5 --- /dev/null +++ b/scepter/modules/annotator/mlsd/mbv2_mlsd_tiny.py @@ -0,0 +1,287 @@ +# -*- coding: utf-8 -*- +import torch +import torch.nn as nn +import torch.utils.model_zoo as model_zoo +from torch.nn import functional as F + + +class BlockTypeA(nn.Module): + def __init__(self, in_c1, in_c2, out_c1, out_c2, upscale=True): + super(BlockTypeA, self).__init__() + self.conv1 = nn.Sequential(nn.Conv2d(in_c2, out_c2, kernel_size=1), + nn.BatchNorm2d(out_c2), + nn.ReLU(inplace=True)) + self.conv2 = nn.Sequential(nn.Conv2d(in_c1, out_c1, kernel_size=1), + nn.BatchNorm2d(out_c1), + nn.ReLU(inplace=True)) + self.upscale = upscale + + def forward(self, a, b): + b = self.conv1(b) + a = self.conv2(a) + b = F.interpolate(b, + scale_factor=2.0, + mode='bilinear', + align_corners=True) + return torch.cat((a, b), dim=1) + + +class BlockTypeB(nn.Module): + def __init__(self, in_c, out_c): + super(BlockTypeB, self).__init__() + self.conv1 = nn.Sequential( + nn.Conv2d(in_c, in_c, kernel_size=3, padding=1), + nn.BatchNorm2d(in_c), nn.ReLU()) + self.conv2 = nn.Sequential( + nn.Conv2d(in_c, out_c, kernel_size=3, padding=1), + nn.BatchNorm2d(out_c), nn.ReLU()) + + def forward(self, x): + x = self.conv1(x) + x + x = self.conv2(x) + return x + + +class BlockTypeC(nn.Module): + def __init__(self, in_c, out_c): + super(BlockTypeC, self).__init__() + self.conv1 = nn.Sequential( + nn.Conv2d(in_c, in_c, kernel_size=3, padding=5, dilation=5), + nn.BatchNorm2d(in_c), nn.ReLU()) + self.conv2 = nn.Sequential( + nn.Conv2d(in_c, in_c, kernel_size=3, padding=1), + nn.BatchNorm2d(in_c), nn.ReLU()) + self.conv3 = nn.Conv2d(in_c, out_c, kernel_size=1) + + def forward(self, x): + x = self.conv1(x) + x = self.conv2(x) + x = self.conv3(x) + return x + + +def _make_divisible(v, divisor, min_value=None): + """ + This function is taken from the original tf repo. + It ensures that all layers have a channel number that is divisible by 8 + It can be seen here: + https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py + :param v: + :param divisor: + :param min_value: + :return: + """ + if min_value is None: + min_value = divisor + new_v = max(min_value, int(v + divisor / 2) // divisor * divisor) + # Make sure that round down does not go down by more than 10%. + if new_v < 0.9 * v: + new_v += divisor + return new_v + + +class ConvBNReLU(nn.Sequential): + def __init__(self, + in_planes, + out_planes, + kernel_size=3, + stride=1, + groups=1): + self.channel_pad = out_planes - in_planes + self.stride = stride + # padding = (kernel_size - 1) // 2 + + # TFLite uses slightly different padding than PyTorch + if stride == 2: + padding = 0 + else: + padding = (kernel_size - 1) // 2 + + super(ConvBNReLU, self).__init__( + nn.Conv2d(in_planes, + out_planes, + kernel_size, + stride, + padding, + groups=groups, + bias=False), nn.BatchNorm2d(out_planes), + nn.ReLU6(inplace=True)) + self.max_pool = nn.MaxPool2d(kernel_size=stride, stride=stride) + + def forward(self, x): + # TFLite uses different padding + if self.stride == 2: + x = F.pad(x, (0, 1, 0, 1), 'constant', 0) + # print(x.shape) + + for module in self: + if not isinstance(module, nn.MaxPool2d): + x = module(x) + return x + + +class InvertedResidual(nn.Module): + def __init__(self, inp, oup, stride, expand_ratio): + super(InvertedResidual, self).__init__() + self.stride = stride + assert stride in [1, 2] + + hidden_dim = int(round(inp * expand_ratio)) + self.use_res_connect = self.stride == 1 and inp == oup + + layers = [] + if expand_ratio != 1: + # pw + layers.append(ConvBNReLU(inp, hidden_dim, kernel_size=1)) + layers.extend([ + # dw + ConvBNReLU(hidden_dim, + hidden_dim, + stride=stride, + groups=hidden_dim), + # pw-linear + nn.Conv2d(hidden_dim, oup, 1, 1, 0, bias=False), + nn.BatchNorm2d(oup), + ]) + self.conv = nn.Sequential(*layers) + + def forward(self, x): + if self.use_res_connect: + return x + self.conv(x) + else: + return self.conv(x) + + +class MobileNetV2(nn.Module): + def __init__(self, pretrained=True): + """ + MobileNet V2 main class + Args: + num_classes (int): Number of classes + width_mult (float): Width multiplier - adjusts number of channels in each layer by this amount + inverted_residual_setting: Network structure + round_nearest (int): Round the number of channels in each layer to be a multiple of this number + Set to 1 to turn off rounding + block: Module specifying inverted residual building block for mobilenet + """ + super(MobileNetV2, self).__init__() + + block = InvertedResidual + input_channel = 32 + last_channel = 1280 + width_mult = 1.0 + round_nearest = 8 + + inverted_residual_setting = [ + # t, c, n, s + [1, 16, 1, 1], + [6, 24, 2, 2], + [6, 32, 3, 2], + [6, 64, 4, 2], + # [6, 96, 3, 1], + # [6, 160, 3, 2], + # [6, 320, 1, 1], + ] + + # only check the first element, assuming user knows t,c,n,s are required + if len(inverted_residual_setting) == 0 or len( + inverted_residual_setting[0]) != 4: + raise ValueError('inverted_residual_setting should be non-empty ' + 'or a 4-element list, got {}'.format( + inverted_residual_setting)) + + # building first layer + input_channel = _make_divisible(input_channel * width_mult, + round_nearest) + self.last_channel = _make_divisible( + last_channel * max(1.0, width_mult), round_nearest) + features = [ConvBNReLU(4, input_channel, stride=2)] + # building inverted residual blocks + for t, c, n, s in inverted_residual_setting: + output_channel = _make_divisible(c * width_mult, round_nearest) + for i in range(n): + stride = s if i == 0 else 1 + features.append( + block(input_channel, + output_channel, + stride, + expand_ratio=t)) + input_channel = output_channel + self.features = nn.Sequential(*features) + + self.fpn_selected = [3, 6, 10] + # weight initialization + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight, mode='fan_out') + if m.bias is not None: + nn.init.zeros_(m.bias) + elif isinstance(m, nn.BatchNorm2d): + nn.init.ones_(m.weight) + nn.init.zeros_(m.bias) + elif isinstance(m, nn.Linear): + nn.init.normal_(m.weight, 0, 0.01) + nn.init.zeros_(m.bias) + + # if pretrained: + # self._load_pretrained_model() + + def _forward_impl(self, x): + # This exists since TorchScript doesn't support inheritance, so the superclass method + # (this one) needs to have a name other than `forward` that can be accessed in a subclass + fpn_features = [] + for i, f in enumerate(self.features): + if i > self.fpn_selected[-1]: + break + x = f(x) + if i in self.fpn_selected: + fpn_features.append(x) + + c2, c3, c4 = fpn_features + return c2, c3, c4 + + def forward(self, x): + return self._forward_impl(x) + + def _load_pretrained_model(self): + pretrain_dict = model_zoo.load_url( + 'https://download.pytorch.org/models/mobilenet_v2-b0353104.pth') + model_dict = {} + state_dict = self.state_dict() + for k, v in pretrain_dict.items(): + if k in state_dict: + model_dict[k] = v + state_dict.update(model_dict) + self.load_state_dict(state_dict) + + +class MobileV2_MLSD_Tiny(nn.Module): + def __init__(self): + super(MobileV2_MLSD_Tiny, self).__init__() + + self.backbone = MobileNetV2(pretrained=True) + + self.block12 = BlockTypeA(in_c1=32, in_c2=64, out_c1=64, out_c2=64) + self.block13 = BlockTypeB(128, 64) + + self.block14 = BlockTypeA(in_c1=24, in_c2=64, out_c1=32, out_c2=32) + self.block15 = BlockTypeB(64, 64) + + self.block16 = BlockTypeC(64, 16) + + def forward(self, x): + c2, c3, c4 = self.backbone(x) + + x = self.block12(c3, c4) + x = self.block13(x) + x = self.block14(c2, x) + x = self.block15(x) + x = self.block16(x) + x = x[:, 7:, :, :] + # print(x.shape) + x = F.interpolate(x, + scale_factor=2.0, + mode='bilinear', + align_corners=True) + + return x diff --git a/scepter/modules/annotator/mlsd/utils.py b/scepter/modules/annotator/mlsd/utils.py new file mode 100644 index 0000000..83bad84 --- /dev/null +++ b/scepter/modules/annotator/mlsd/utils.py @@ -0,0 +1,638 @@ +# -*- coding: utf-8 -*- + +# modified by lihaoweicv +# pytorch version +# +# M-LSD +# Copyright 2021-present NAVER Corp. +# Apache License v2.0 + +import cv2 +import numpy as np +import torch +from torch.nn import functional as F + + +def deccode_output_score_and_ptss(tpMap, topk_n=200, ksize=5): + ''' + tpMap: + center: tpMap[1, 0, :, :] + displacement: tpMap[1, 1:5, :, :] + ''' + b, c, h, w = tpMap.shape + assert b == 1, 'only support bsize==1' + displacement = tpMap[:, 1:5, :, :][0] + center = tpMap[:, 0, :, :] + heat = torch.sigmoid(center) + hmax = F.max_pool2d(heat, (ksize, ksize), + stride=1, + padding=(ksize - 1) // 2) + keep = (hmax == heat).float() + heat = heat * keep + heat = heat.reshape(-1, ) + + scores, indices = torch.topk(heat, topk_n, dim=-1, largest=True) + yy = torch.floor_divide(indices, w).unsqueeze(-1) + xx = torch.fmod(indices, w).unsqueeze(-1) + ptss = torch.cat((yy, xx), dim=-1) + + ptss = ptss.detach().cpu().numpy() + scores = scores.detach().cpu().numpy() + displacement = displacement.detach().cpu().numpy() + displacement = displacement.transpose((1, 2, 0)) + return ptss, scores, displacement + + +def pred_lines(image, + model, + input_shape=[512, 512], + score_thr=0.10, + dist_thr=20.0, + device='cuda'): + h, w, _ = image.shape + h_ratio, w_ratio = [h / input_shape[0], w / input_shape[1]] + + resized_image = np.concatenate([ + cv2.resize(image, (input_shape[1], input_shape[0]), + interpolation=cv2.INTER_AREA), + np.ones([input_shape[0], input_shape[1], 1]) + ], + axis=-1) + + resized_image = resized_image.transpose((2, 0, 1)) + batch_image = np.expand_dims(resized_image, axis=0).astype('float32') + batch_image = (batch_image / 127.5) - 1.0 + + batch_image = torch.from_numpy(batch_image).float().to(device) + outputs = model(batch_image) + pts, pts_score, vmap = deccode_output_score_and_ptss(outputs, 200, 3) + start = vmap[:, :, :2] + end = vmap[:, :, 2:] + dist_map = np.sqrt(np.sum((start - end)**2, axis=-1)) + + segments_list = [] + for center, score in zip(pts, pts_score): + y, x = center + distance = dist_map[y, x] + if score > score_thr and distance > dist_thr: + disp_x_start, disp_y_start, disp_x_end, disp_y_end = vmap[y, x, :] + x_start = x + disp_x_start + y_start = y + disp_y_start + x_end = x + disp_x_end + y_end = y + disp_y_end + segments_list.append([x_start, y_start, x_end, y_end]) + + lines = 2 * np.array(segments_list) # 256 > 512 + lines[:, 0] = lines[:, 0] * w_ratio + lines[:, 1] = lines[:, 1] * h_ratio + lines[:, 2] = lines[:, 2] * w_ratio + lines[:, 3] = lines[:, 3] * h_ratio + + return lines + + +def pred_squares( + image, + model, + input_shape=[512, 512], + device='cuda', + params={ + 'score': 0.06, + 'outside_ratio': 0.28, + 'inside_ratio': 0.45, + 'w_overlap': 0.0, + 'w_degree': 1.95, + 'w_length': 0.0, + 'w_area': 1.86, + 'w_center': 0.14 + }): # noqa + # shape = [height, width] + h, w, _ = image.shape + original_shape = [h, w] + + resized_image = np.concatenate([ + cv2.resize(image, (input_shape[0], input_shape[1]), + interpolation=cv2.INTER_AREA), + np.ones([input_shape[0], input_shape[1], 1]) + ], + axis=-1) + resized_image = resized_image.transpose((2, 0, 1)) + batch_image = np.expand_dims(resized_image, axis=0).astype('float32') + batch_image = (batch_image / 127.5) - 1.0 + + batch_image = torch.from_numpy(batch_image).float().to(device) + outputs = model(batch_image) + + pts, pts_score, vmap = deccode_output_score_and_ptss(outputs, 200, 3) + start = vmap[:, :, :2] # (x, y) + end = vmap[:, :, 2:] # (x, y) + dist_map = np.sqrt(np.sum((start - end)**2, axis=-1)) + + junc_list = [] + segments_list = [] + for junc, score in zip(pts, pts_score): + y, x = junc + distance = dist_map[y, x] + if score > params['score'] and distance > 20.0: + junc_list.append([x, y]) + disp_x_start, disp_y_start, disp_x_end, disp_y_end = vmap[y, x, :] + d_arrow = 1.0 + x_start = x + d_arrow * disp_x_start + y_start = y + d_arrow * disp_y_start + x_end = x + d_arrow * disp_x_end + y_end = y + d_arrow * disp_y_end + segments_list.append([x_start, y_start, x_end, y_end]) + + segments = np.array(segments_list) + + # post processing for squares + # 1. get unique lines + point = np.array([[0, 0]]) + point = point[0] + start = segments[:, :2] + end = segments[:, 2:] + diff = start - end + a = diff[:, 1] + b = -diff[:, 0] + c = a * start[:, 0] + b * start[:, 1] + + d = np.abs(a * point[0] + b * point[1] - c) / np.sqrt(a**2 + b**2 + 1e-10) + theta = np.arctan2(diff[:, 0], diff[:, 1]) * 180 / np.pi + theta[theta < 0.0] += 180 + hough = np.concatenate([d[:, None], theta[:, None]], axis=-1) + + d_quant = 1 + theta_quant = 2 + hough[:, 0] //= d_quant + hough[:, 1] //= theta_quant + _, indices, counts = np.unique(hough, + axis=0, + return_index=True, + return_counts=True) + + acc_map = np.zeros([512 // d_quant + 1, 360 // theta_quant + 1], + dtype='float32') + idx_map = np.zeros([512 // d_quant + 1, 360 // theta_quant + 1], + dtype='int32') - 1 + yx_indices = hough[indices, :].astype('int32') + acc_map[yx_indices[:, 0], yx_indices[:, 1]] = counts + idx_map[yx_indices[:, 0], yx_indices[:, 1]] = indices + + acc_map_np = acc_map + # acc_map = acc_map[None, :, :, None] + # + # ### fast suppression using tensorflow op + # acc_map = tf.constant(acc_map, dtype=tf.float32) + # max_acc_map = tf.keras.layers.MaxPool2D(pool_size=(5, 5), strides=1, padding='same')(acc_map) + # acc_map = acc_map * tf.cast(tf.math.equal(acc_map, max_acc_map), tf.float32) + # flatten_acc_map = tf.reshape(acc_map, [1, -1]) + # topk_values, topk_indices = tf.math.top_k(flatten_acc_map, k=len(pts)) + # _, h, w, _ = acc_map.shape + # y = tf.expand_dims(topk_indices // w, axis=-1) + # x = tf.expand_dims(topk_indices % w, axis=-1) + # yx = tf.concat([y, x], axis=-1) + + # fast suppression using pytorch op + acc_map = torch.from_numpy(acc_map_np).unsqueeze(0).unsqueeze(0) + _, _, h, w = acc_map.shape + max_acc_map = F.max_pool2d(acc_map, kernel_size=5, stride=1, padding=2) + acc_map = acc_map * ((acc_map == max_acc_map).float()) + flatten_acc_map = acc_map.reshape([ + -1, + ]) + + scores, indices = torch.topk(flatten_acc_map, + len(pts), + dim=-1, + largest=True) + yy = torch.div(indices, w, rounding_mode='floor').unsqueeze(-1) + xx = torch.fmod(indices, w).unsqueeze(-1) + yx = torch.cat((yy, xx), dim=-1) + + yx = yx.detach().cpu().numpy() + + topk_values = scores.detach().cpu().numpy() + indices = idx_map[yx[:, 0], yx[:, 1]] + basis = 5 // 2 + + merged_segments = [] + for yx_pt, max_indice, value in zip(yx, indices, topk_values): + y, x = yx_pt + if max_indice == -1 or value == 0: + continue + segment_list = [] + for y_offset in range(-basis, basis + 1): + for x_offset in range(-basis, basis + 1): + indice = idx_map[y + y_offset, x + x_offset] + cnt = int(acc_map_np[y + y_offset, x + x_offset]) + if indice != -1: + segment_list.append(segments[indice]) + if cnt > 1: + check_cnt = 1 + current_hough = hough[indice] + for new_indice, new_hough in enumerate(hough): + if (current_hough + == new_hough).all() and indice != new_indice: + segment_list.append(segments[new_indice]) + check_cnt += 1 + if check_cnt == cnt: + break + group_segments = np.array(segment_list).reshape([-1, 2]) + sorted_group_segments = np.sort(group_segments, axis=0) + x_min, y_min = sorted_group_segments[0, :] + x_max, y_max = sorted_group_segments[-1, :] + + deg = theta[max_indice] + if deg >= 90: + merged_segments.append([x_min, y_max, x_max, y_min]) + else: + merged_segments.append([x_min, y_min, x_max, y_max]) + + # 2. get intersections + new_segments = np.array(merged_segments) # (x1, y1, x2, y2) + start = new_segments[:, :2] # (x1, y1) + end = new_segments[:, 2:] # (x2, y2) + new_centers = (start + end) / 2.0 + diff = start - end + dist_segments = np.sqrt(np.sum(diff**2, axis=-1)) + + # ax + by = c + a = diff[:, 1] + b = -diff[:, 0] + c = a * start[:, 0] + b * start[:, 1] + pre_det = a[:, None] * b[None, :] + det = pre_det - np.transpose(pre_det) + + pre_inter_y = a[:, None] * c[None, :] + inter_y = (pre_inter_y - np.transpose(pre_inter_y)) / (det + 1e-10) + pre_inter_x = c[:, None] * b[None, :] + inter_x = (pre_inter_x - np.transpose(pre_inter_x)) / (det + 1e-10) + inter_pts = np.concatenate([inter_x[:, :, None], inter_y[:, :, None]], + axis=-1).astype('int32') + + # 3. get corner information + # 3.1 get distance + ''' + dist_segments: + | dist(0), dist(1), dist(2), ...| + dist_inter_to_segment1: + | dist(inter,0), dist(inter,0), dist(inter,0), ... | + | dist(inter,1), dist(inter,1), dist(inter,1), ... | + ... + dist_inter_to_semgnet2: + | dist(inter,0), dist(inter,1), dist(inter,2), ... | + | dist(inter,0), dist(inter,1), dist(inter,2), ... | + ... + ''' + + dist_inter_to_segment1_start = np.sqrt( + np.sum(((inter_pts - start[:, None, :])**2), axis=-1, + keepdims=True)) # [n_batch, n_batch, 1] + dist_inter_to_segment1_end = np.sqrt( + np.sum(((inter_pts - end[:, None, :])**2), axis=-1, + keepdims=True)) # [n_batch, n_batch, 1] + dist_inter_to_segment2_start = np.sqrt( + np.sum(((inter_pts - start[None, :, :])**2), axis=-1, + keepdims=True)) # [n_batch, n_batch, 1] + dist_inter_to_segment2_end = np.sqrt( + np.sum(((inter_pts - end[None, :, :])**2), axis=-1, + keepdims=True)) # [n_batch, n_batch, 1] + + # sort ascending + dist_inter_to_segment1 = np.sort(np.concatenate( + [dist_inter_to_segment1_start, dist_inter_to_segment1_end], axis=-1), + axis=-1) # [n_batch, n_batch, 2] + dist_inter_to_segment2 = np.sort(np.concatenate( + [dist_inter_to_segment2_start, dist_inter_to_segment2_end], axis=-1), + axis=-1) # [n_batch, n_batch, 2] + + # 3.2 get degree + inter_to_start = new_centers[:, None, :] - inter_pts + deg_inter_to_start = np.arctan2(inter_to_start[:, :, 1], + inter_to_start[:, :, 0]) * 180 / np.pi + deg_inter_to_start[deg_inter_to_start < 0.0] += 360 + inter_to_end = new_centers[None, :, :] - inter_pts + deg_inter_to_end = np.arctan2(inter_to_end[:, :, 1], + inter_to_end[:, :, 0]) * 180 / np.pi + deg_inter_to_end[deg_inter_to_end < 0.0] += 360 + ''' + B -- G + | | + C -- R + B : blue / G: green / C: cyan / R: red + + 0 -- 1 + | | + 3 -- 2 + ''' + # rename variables + deg1_map, deg2_map = deg_inter_to_start, deg_inter_to_end + # sort deg ascending + deg_sort = np.sort(np.concatenate( + [deg1_map[:, :, None], deg2_map[:, :, None]], axis=-1), + axis=-1) + + deg_diff_map = np.abs(deg1_map - deg2_map) + # we only consider the smallest degree of intersect + deg_diff_map[deg_diff_map > 180] = 360 - deg_diff_map[deg_diff_map > 180] + + # define available degree range + deg_range = [60, 120] + + corner_dict = {corner_info: [] for corner_info in range(4)} + inter_points = [] + for i in range(inter_pts.shape[0]): + for j in range(i + 1, inter_pts.shape[1]): + # i, j > line index, always i < j + x, y = inter_pts[i, j, :] + deg1, deg2 = deg_sort[i, j, :] + deg_diff = deg_diff_map[i, j] + + check_degree = deg_diff > deg_range[0] and deg_diff < deg_range[1] + + outside_ratio = params['outside_ratio'] # over ratio >>> drop it! + inside_ratio = params['inside_ratio'] # over ratio >>> drop it! + check_distance = ((dist_inter_to_segment1[i, j, 1] >= dist_segments[i] and + dist_inter_to_segment1[i, j, 0] <= dist_segments[i] * outside_ratio) or + (dist_inter_to_segment1[i, j, 1] <= dist_segments[i] and + dist_inter_to_segment1[i, j, 0] <= dist_segments[i] * inside_ratio)) and \ + ((dist_inter_to_segment2[i, j, 1] >= dist_segments[j] and + dist_inter_to_segment2[i, j, 0] <= dist_segments[j] * outside_ratio) or + (dist_inter_to_segment2[i, j, 1] <= dist_segments[j] and + dist_inter_to_segment2[i, j, 0] <= dist_segments[j] * inside_ratio)) + + if check_degree and check_distance: + corner_info = None # noqa + + if (deg1 >= 0 and deg1 <= 45 and deg2 >= 45 and deg2 <= 120) or \ + (deg2 >= 315 and deg1 >= 45 and deg1 <= 120): + corner_info, color_info = 0, 'blue' + elif (deg1 >= 45 and deg1 <= 125 and deg2 >= 125 + and deg2 <= 225): + corner_info, color_info = 1, 'green' + elif (deg1 >= 125 and deg1 <= 225 and deg2 >= 225 + and deg2 <= 315): + corner_info, color_info = 2, 'black' + elif (deg1 >= 0 and deg1 <= 45 and deg2 >= 225 and deg2 <= 315) or \ + (deg2 >= 315 and deg1 >= 225 and deg1 <= 315): + corner_info, color_info = 3, 'cyan' + else: + corner_info, color_info = 4, 'red' # we don't use it # noqa + continue + + corner_dict[corner_info].append([x, y, i, j]) + inter_points.append([x, y]) + + square_list = [] + connect_list = [] + segments_list = [] + for corner0 in corner_dict[0]: + for corner1 in corner_dict[1]: + connect01 = False + for corner0_line in corner0[2:]: + if corner0_line in corner1[2:]: + connect01 = True + break + if connect01: + for corner2 in corner_dict[2]: + connect12 = False + for corner1_line in corner1[2:]: + if corner1_line in corner2[2:]: + connect12 = True + break + if connect12: + for corner3 in corner_dict[3]: + connect23 = False + for corner2_line in corner2[2:]: + if corner2_line in corner3[2:]: + connect23 = True + break + if connect23: + for corner3_line in corner3[2:]: + if corner3_line in corner0[2:]: + # SQUARE!!! + ''' + 0 -- 1 + | | + 3 -- 2 + square_list: + order: 0 > 1 > 2 > 3 + | x0, y0, x1, y1, x2, y2, x3, y3 | + | x0, y0, x1, y1, x2, y2, x3, y3 | + ... + connect_list: + order: 01 > 12 > 23 > 30 + | line_idx01, line_idx12, line_idx23, line_idx30 | + | line_idx01, line_idx12, line_idx23, line_idx30 | + ... + segments_list: + order: 0 > 1 > 2 > 3 + | line_idx0_i, line_idx0_j, line_idx1_i, line_idx1_j, line_idx2_i, + line_idx2_j, line_idx3_i, line_idx3_j | + | line_idx0_i, line_idx0_j, line_idx1_i, line_idx1_j, line_idx2_i, + line_idx2_j, line_idx3_i, line_idx3_j | + ... + ''' + square_list.append(corner0[:2] + + corner1[:2] + + corner2[:2] + + corner3[:2]) + connect_list.append([ + corner0_line, corner1_line, + corner2_line, corner3_line + ]) + segments_list.append(corner0[2:] + + corner1[2:] + + corner2[2:] + + corner3[2:]) + + def check_outside_inside(segments_info, connect_idx): + # return 'outside or inside', min distance, cover_param, peri_param + if connect_idx == segments_info[0]: + check_dist_mat = dist_inter_to_segment1 + else: + check_dist_mat = dist_inter_to_segment2 + + i, j = segments_info + min_dist, max_dist = check_dist_mat[i, j, :] + connect_dist = dist_segments[connect_idx] + if max_dist > connect_dist: + return 'outside', min_dist, 0, 1 + else: + return 'inside', min_dist, -1, -1 + + top_square = None # noqa + + try: + map_size = input_shape[0] / 2 + squares = np.array(square_list).reshape([-1, 4, 2]) + score_array = [] + connect_array = np.array(connect_list) + segments_array = np.array(segments_list).reshape([-1, 4, 2]) + + # get degree of corners: + squares_rollup = np.roll(squares, 1, axis=1) + squares_rolldown = np.roll(squares, -1, axis=1) + vec1 = squares_rollup - squares + normalized_vec1 = vec1 / ( + np.linalg.norm(vec1, axis=-1, keepdims=True) + 1e-10) + vec2 = squares_rolldown - squares + normalized_vec2 = vec2 / ( + np.linalg.norm(vec2, axis=-1, keepdims=True) + 1e-10) + inner_products = np.sum(normalized_vec1 * normalized_vec2, + axis=-1) # [n_squares, 4] + squares_degree = np.arccos( + inner_products) * 180 / np.pi # [n_squares, 4] + + # get square score + overlap_scores = [] + degree_scores = [] + length_scores = [] + + for connects, segments, square, degree in zip(connect_array, + segments_array, squares, + squares_degree): + ''' + 0 -- 1 + | | + 3 -- 2 + + # segments: [4, 2] + # connects: [4] + ''' + + # OVERLAP SCORES + cover = 0 + perimeter = 0 + # check 0 > 1 > 2 > 3 + square_length = [] + + for start_idx in range(4): + end_idx = (start_idx + 1) % 4 + + connect_idx = connects[start_idx] # segment idx of segment01 + start_segments = segments[start_idx] + end_segments = segments[end_idx] + + start_point = square[start_idx] # noqa + end_point = square[end_idx] # noqa + + # check whether outside or inside + start_position, start_min, start_cover_param, start_peri_param = check_outside_inside( + start_segments, connect_idx) + end_position, end_min, end_cover_param, end_peri_param = check_outside_inside( + end_segments, connect_idx) + + cover += dist_segments[ + connect_idx] + start_cover_param * start_min + end_cover_param * end_min + perimeter += dist_segments[ + connect_idx] + start_peri_param * start_min + end_peri_param * end_min + + square_length.append(dist_segments[connect_idx] + + start_peri_param * start_min + + end_peri_param * end_min) + + overlap_scores.append(cover / perimeter) + # DEGREE SCORES + ''' + deg0 vs deg2 + deg1 vs deg3 + ''' + deg0, deg1, deg2, deg3 = degree + deg_ratio1 = deg0 / deg2 + if deg_ratio1 > 1.0: + deg_ratio1 = 1 / deg_ratio1 + deg_ratio2 = deg1 / deg3 + if deg_ratio2 > 1.0: + deg_ratio2 = 1 / deg_ratio2 + degree_scores.append((deg_ratio1 + deg_ratio2) / 2) + # LENGTH SCORES + ''' + len0 vs len2 + len1 vs len3 + ''' + len0, len1, len2, len3 = square_length + len_ratio1 = len0 / len2 if len2 > len0 else len2 / len0 + len_ratio2 = len1 / len3 if len3 > len1 else len3 / len1 + length_scores.append((len_ratio1 + len_ratio2) / 2) + + ###################################### + + overlap_scores = np.array(overlap_scores) + overlap_scores /= np.max(overlap_scores) + + degree_scores = np.array(degree_scores) + # degree_scores /= np.max(degree_scores) + + length_scores = np.array(length_scores) + + # AREA SCORES + area_scores = np.reshape(squares, [-1, 4, 2]) + area_x = area_scores[:, :, 0] + area_y = area_scores[:, :, 1] + correction = area_x[:, -1] * area_y[:, 0] - area_y[:, -1] * area_x[:, + 0] + area_scores = np.sum(area_x[:, :-1] * area_y[:, 1:], axis=-1) - np.sum( + area_y[:, :-1] * area_x[:, 1:], axis=-1) + area_scores = 0.5 * np.abs(area_scores + correction) + area_scores /= (map_size * map_size) # np.max(area_scores) + + # CENTER SCORES + centers = np.array([[256 // 2, 256 // 2]], dtype='float32') # [1, 2] + # squares: [n, 4, 2] + square_centers = np.mean(squares, axis=1) # [n, 2] + center2center = np.sqrt(np.sum((centers - square_centers)**2)) + center_scores = center2center / (map_size / np.sqrt(2.0)) + ''' + score_w = [overlap, degree, area, center, length] + ''' + score_w = [0.0, 1.0, 10.0, 0.5, 1.0] # noqa + score_array = (params['w_overlap'] * overlap_scores + + params['w_degree'] * degree_scores + + params['w_area'] * area_scores - + params['w_center'] * center_scores + + params['w_length'] * length_scores) + + best_square = [] # noqa + + sorted_idx = np.argsort(score_array)[::-1] + score_array = score_array[sorted_idx] + squares = squares[sorted_idx] + + except Exception: + pass + '''return list + merged_lines, squares, scores + ''' + + try: + new_segments[:, 0] = new_segments[:, 0] * 2 / input_shape[ + 1] * original_shape[1] + new_segments[:, 1] = new_segments[:, 1] * 2 / input_shape[ + 0] * original_shape[0] + new_segments[:, 2] = new_segments[:, 2] * 2 / input_shape[ + 1] * original_shape[1] + new_segments[:, 3] = new_segments[:, 3] * 2 / input_shape[ + 0] * original_shape[0] + except Exception: + new_segments = [] + + try: + squares[:, :, + 0] = squares[:, :, 0] * 2 / input_shape[1] * original_shape[1] + squares[:, :, + 1] = squares[:, :, 1] * 2 / input_shape[0] * original_shape[0] + except Exception: + squares = [] + score_array = [] + + try: + inter_points = np.array(inter_points) + inter_points[:, 0] = inter_points[:, 0] * 2 / input_shape[ + 1] * original_shape[1] + inter_points[:, 1] = inter_points[:, 1] * 2 / input_shape[ + 0] * original_shape[0] + except Exception: + inter_points = [] + + return new_segments, squares, score_array, inter_points diff --git a/scepter/modules/annotator/mlsd_op.py b/scepter/modules/annotator/mlsd_op.py new file mode 100644 index 0000000..fbab416 --- /dev/null +++ b/scepter/modules/annotator/mlsd_op.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +# MLSD Line Detection +# From https://github.com/navervision/mlsd +# Apache-2.0 license + +import warnings +from abc import ABCMeta + +import cv2 +import numpy as np +import torch +from PIL import Image + +from scepter.modules.annotator.base_annotator import BaseAnnotator +from scepter.modules.annotator.mlsd.mbv2_mlsd_large import MobileV2_MLSD_Large +from scepter.modules.annotator.mlsd.utils import pred_lines +from scepter.modules.annotator.registry import ANNOTATORS +from scepter.modules.annotator.utils import resize_image, resize_image_ori +from scepter.modules.utils.config import dict_to_yaml +from scepter.modules.utils.distribute import we +from scepter.modules.utils.file_system import FS + + +@ANNOTATORS.register_class() +class MLSDdetector(BaseAnnotator, metaclass=ABCMeta): + def __init__(self, cfg, logger=None): + super().__init__(cfg, logger=logger) + model = MobileV2_MLSD_Large() + pretrained_model = cfg.get('PRETRAINED_MODEL', None) + if pretrained_model: + with FS.get_from(pretrained_model, wait_finish=True) as local_path: + model.load_state_dict(torch.load(local_path), strict=True) + self.model = model.eval() + self.thr_v = cfg.get('THR_V', 0.1) + self.thr_d = cfg.get('THR_D', 0.1) + + @torch.no_grad() + @torch.inference_mode() + @torch.autocast('cuda', enabled=False) + def forward(self, image): + if isinstance(image, Image.Image): + image = np.array(image) + elif isinstance(image, torch.Tensor): + image = image.detach().cpu().numpy() + elif isinstance(image, np.ndarray): + image = image.copy() + else: + raise f'Unsurpport datatype{type(image)}, only surpport np.ndarray, torch.Tensor, Pillow Image.' + h, w, c = image.shape + image, k = resize_image(image, 1024 if min(h, w) > 1024 else min(h, w)) + img_output = np.zeros_like(image) + try: + lines = pred_lines(image, + self.model, [image.shape[0], image.shape[1]], + self.thr_v, + self.thr_d, + device=we.device_id) + for line in lines: + x_start, y_start, x_end, y_end = [int(val) for val in line] + cv2.line(img_output, (x_start, y_start), (x_end, y_end), + [255, 255, 255], 1) + except Exception as e: + warnings.warn(f'{e}') + return None + img_output = resize_image_ori(h, w, img_output, k) + return img_output[:, :, 0] + + @staticmethod + def get_config_template(): + return dict_to_yaml('ANNOTATORS', + __class__.__name__, + MLSDdetector.para_dict, + set_name=True) diff --git a/scepter/modules/annotator/openpose.py b/scepter/modules/annotator/openpose.py new file mode 100644 index 0000000..0c3b608 --- /dev/null +++ b/scepter/modules/annotator/openpose.py @@ -0,0 +1,811 @@ +# -*- coding: utf-8 -*- +# Openpose +# Original from CMU https://github.com/CMU-Perceptual-Computing-Lab/openpose +# 2nd Edited by https://github.com/Hzzone/pytorch-openpose +# The implementation is modified from 3rd Edited Version by ControlNet +import math +import os +from abc import ABCMeta +from collections import OrderedDict + +import cv2 +import matplotlib +import numpy as np +import torch +import torch.nn as nn +from PIL import Image +from scipy.ndimage.filters import gaussian_filter +from skimage.measure import label + +from scepter.modules.annotator.base_annotator import BaseAnnotator +from scepter.modules.annotator.registry import ANNOTATORS +from scepter.modules.utils.config import dict_to_yaml +from scepter.modules.utils.file_system import FS + +os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE' + + +def padRightDownCorner(img, stride, padValue): + h = img.shape[0] + w = img.shape[1] + + pad = 4 * [None] + pad[0] = 0 # up + pad[1] = 0 # left + pad[2] = 0 if (h % stride == 0) else stride - (h % stride) # down + pad[3] = 0 if (w % stride == 0) else stride - (w % stride) # right + + img_padded = img + pad_up = np.tile(img_padded[0:1, :, :] * 0 + padValue, (pad[0], 1, 1)) + img_padded = np.concatenate((pad_up, img_padded), axis=0) + pad_left = np.tile(img_padded[:, 0:1, :] * 0 + padValue, (1, pad[1], 1)) + img_padded = np.concatenate((pad_left, img_padded), axis=1) + pad_down = np.tile(img_padded[-2:-1, :, :] * 0 + padValue, (pad[2], 1, 1)) + img_padded = np.concatenate((img_padded, pad_down), axis=0) + pad_right = np.tile(img_padded[:, -2:-1, :] * 0 + padValue, (1, pad[3], 1)) + img_padded = np.concatenate((img_padded, pad_right), axis=1) + + return img_padded, pad + + +# transfer caffe model to pytorch which will match the layer name +def transfer(model, model_weights): + transfered_model_weights = {} + for weights_name in model.state_dict().keys(): + transfered_model_weights[weights_name] = model_weights['.'.join( + weights_name.split('.')[1:])] + return transfered_model_weights + + +# draw the body keypoint and lims +def draw_bodypose(canvas, candidate, subset): + stickwidth = 4 + limbSeq = [[2, 3], [2, 6], [3, 4], [4, 5], [6, 7], [7, 8], [2, 9], [9, 10], + [10, 11], [2, 12], [12, 13], [13, 14], [2, 1], [1, 15], + [15, 17], [1, 16], [16, 18], [3, 17], [6, 18]] + + colors = [[255, 0, 0], [255, 85, 0], [255, 170, 0], [255, 255, 0], + [170, 255, 0], [85, 255, 0], [0, 255, 0], [0, 255, 85], + [0, 255, 170], [0, 255, 255], [0, 170, 255], [0, 85, 255], + [0, 0, 255], [85, 0, 255], [170, 0, 255], [255, 0, 255], + [255, 0, 170], [255, 0, 85]] + for i in range(18): + for n in range(len(subset)): + index = int(subset[n][i]) + if index == -1: + continue + x, y = candidate[index][0:2] + cv2.circle(canvas, (int(x), int(y)), 4, colors[i], thickness=-1) + for i in range(17): + for n in range(len(subset)): + index = subset[n][np.array(limbSeq[i]) - 1] + if -1 in index: + continue + cur_canvas = canvas.copy() + Y = candidate[index.astype(int), 0] + X = candidate[index.astype(int), 1] + mX = np.mean(X) + mY = np.mean(Y) + length = ((X[0] - X[1])**2 + (Y[0] - Y[1])**2)**0.5 + angle = math.degrees(math.atan2(X[0] - X[1], Y[0] - Y[1])) + polygon = cv2.ellipse2Poly( + (int(mY), int(mX)), (int(length / 2), stickwidth), int(angle), + 0, 360, 1) + cv2.fillConvexPoly(cur_canvas, polygon, colors[i]) + canvas = cv2.addWeighted(canvas, 0.4, cur_canvas, 0.6, 0) + # plt.imsave("preview.jpg", canvas[:, :, [2, 1, 0]]) + # plt.imshow(canvas[:, :, [2, 1, 0]]) + return canvas + + +# image drawed by opencv is not good. +def draw_handpose(canvas, all_hand_peaks, show_number=False): + edges = [[0, 1], [1, 2], [2, 3], [3, 4], [0, 5], [5, 6], [6, 7], [7, 8], + [0, 9], [9, 10], [10, 11], [11, 12], [0, 13], [13, 14], [14, 15], + [15, 16], [0, 17], [17, 18], [18, 19], [19, 20]] + + for peaks in all_hand_peaks: + for ie, e in enumerate(edges): + if np.sum(np.all(peaks[e], axis=1) == 0) == 0: + x1, y1 = peaks[e[0]] + x2, y2 = peaks[e[1]] + cv2.line(canvas, (x1, y1), (x2, y2), + matplotlib.colors.hsv_to_rgb( + [ie / float(len(edges)), 1.0, 1.0]) * 255, + thickness=2) + + for i, keyponit in enumerate(peaks): + x, y = keyponit + cv2.circle(canvas, (x, y), 4, (0, 0, 255), thickness=-1) + if show_number: + cv2.putText(canvas, + str(i), (x, y), + cv2.FONT_HERSHEY_SIMPLEX, + 0.3, (0, 0, 0), + lineType=cv2.LINE_AA) + return canvas + + +# detect hand according to body pose keypoints +# please refer to https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/ +# master/src/openpose/hand/handDetector.cpp +def handDetect(candidate, subset, oriImg): + # right hand: wrist 4, elbow 3, shoulder 2 + # left hand: wrist 7, elbow 6, shoulder 5 + ratioWristElbow = 0.33 + detect_result = [] + image_height, image_width = oriImg.shape[0:2] + for person in subset.astype(int): + # if any of three not detected + has_left = np.sum(person[[5, 6, 7]] == -1) == 0 + has_right = np.sum(person[[2, 3, 4]] == -1) == 0 + if not (has_left or has_right): + continue + hands = [] + # left hand + if has_left: + left_shoulder_index, left_elbow_index, left_wrist_index = person[[ + 5, 6, 7 + ]] + x1, y1 = candidate[left_shoulder_index][:2] + x2, y2 = candidate[left_elbow_index][:2] + x3, y3 = candidate[left_wrist_index][:2] + hands.append([x1, y1, x2, y2, x3, y3, True]) + # right hand + if has_right: + right_shoulder_index, right_elbow_index, right_wrist_index = person[ + [2, 3, 4]] + x1, y1 = candidate[right_shoulder_index][:2] + x2, y2 = candidate[right_elbow_index][:2] + x3, y3 = candidate[right_wrist_index][:2] + hands.append([x1, y1, x2, y2, x3, y3, False]) + + for x1, y1, x2, y2, x3, y3, is_left in hands: + # pos_hand = pos_wrist + ratio * (pos_wrist - pos_elbox) = (1 + ratio) * pos_wrist - ratio * pos_elbox + # handRectangle.x = posePtr[wrist*3] + ratioWristElbow * (posePtr[wrist*3] - posePtr[elbow*3]); + # handRectangle.y = posePtr[wrist*3+1] + ratioWristElbow * (posePtr[wrist*3+1] - posePtr[elbow*3+1]); + # const auto distanceWristElbow = getDistance(poseKeypoints, person, wrist, elbow); + # const auto distanceElbowShoulder = getDistance(poseKeypoints, person, elbow, shoulder); + # handRectangle.width = 1.5f * fastMax(distanceWristElbow, 0.9f * distanceElbowShoulder); + x = x3 + ratioWristElbow * (x3 - x2) + y = y3 + ratioWristElbow * (y3 - y2) + distanceWristElbow = math.sqrt((x3 - x2)**2 + (y3 - y2)**2) + distanceElbowShoulder = math.sqrt((x2 - x1)**2 + (y2 - y1)**2) + width = 1.5 * max(distanceWristElbow, 0.9 * distanceElbowShoulder) + # x-y refers to the center --> offset to topLeft point + # handRectangle.x -= handRectangle.width / 2.f; + # handRectangle.y -= handRectangle.height / 2.f; + x -= width / 2 + y -= width / 2 # width = height + # overflow the image + if x < 0: + x = 0 + if y < 0: + y = 0 + width1 = width + width2 = width + if x + width > image_width: + width1 = image_width - x + if y + width > image_height: + width2 = image_height - y + width = min(width1, width2) + # the max hand box value is 20 pixels + if width >= 20: + detect_result.append([int(x), int(y), int(width), is_left]) + ''' + return value: [[x, y, w, True if left hand else False]]. + width=height since the network require squared input. + x, y is the coordinate of top left + ''' + return detect_result + + +# get max index of 2d array +def npmax(array): + arrayindex = array.argmax(1) + arrayvalue = array.max(1) + i = arrayvalue.argmax() + j = arrayindex[i] + return i, j + + +def make_layers(block, no_relu_layers): + layers = [] + for layer_name, v in block.items(): + if 'pool' in layer_name: + layer = nn.MaxPool2d(kernel_size=v[0], stride=v[1], padding=v[2]) + layers.append((layer_name, layer)) + else: + conv2d = nn.Conv2d(in_channels=v[0], + out_channels=v[1], + kernel_size=v[2], + stride=v[3], + padding=v[4]) + layers.append((layer_name, conv2d)) + if layer_name not in no_relu_layers: + layers.append(('relu_' + layer_name, nn.ReLU(inplace=True))) + + return nn.Sequential(OrderedDict(layers)) + + +class bodypose_model(nn.Module): + def __init__(self): + super(bodypose_model, self).__init__() + + # these layers have no relu layer + no_relu_layers = [ + 'conv5_5_CPM_L1', 'conv5_5_CPM_L2', 'Mconv7_stage2_L1', + 'Mconv7_stage2_L2', 'Mconv7_stage3_L1', 'Mconv7_stage3_L2', + 'Mconv7_stage4_L1', 'Mconv7_stage4_L2', 'Mconv7_stage5_L1', + 'Mconv7_stage5_L2', 'Mconv7_stage6_L1', 'Mconv7_stage6_L1' + ] + blocks = {} + block0 = OrderedDict([('conv1_1', [3, 64, 3, 1, 1]), + ('conv1_2', [64, 64, 3, 1, 1]), + ('pool1_stage1', [2, 2, 0]), + ('conv2_1', [64, 128, 3, 1, 1]), + ('conv2_2', [128, 128, 3, 1, 1]), + ('pool2_stage1', [2, 2, 0]), + ('conv3_1', [128, 256, 3, 1, 1]), + ('conv3_2', [256, 256, 3, 1, 1]), + ('conv3_3', [256, 256, 3, 1, 1]), + ('conv3_4', [256, 256, 3, 1, 1]), + ('pool3_stage1', [2, 2, 0]), + ('conv4_1', [256, 512, 3, 1, 1]), + ('conv4_2', [512, 512, 3, 1, 1]), + ('conv4_3_CPM', [512, 256, 3, 1, 1]), + ('conv4_4_CPM', [256, 128, 3, 1, 1])]) + + # Stage 1 + block1_1 = OrderedDict([('conv5_1_CPM_L1', [128, 128, 3, 1, 1]), + ('conv5_2_CPM_L1', [128, 128, 3, 1, 1]), + ('conv5_3_CPM_L1', [128, 128, 3, 1, 1]), + ('conv5_4_CPM_L1', [128, 512, 1, 1, 0]), + ('conv5_5_CPM_L1', [512, 38, 1, 1, 0])]) + + block1_2 = OrderedDict([('conv5_1_CPM_L2', [128, 128, 3, 1, 1]), + ('conv5_2_CPM_L2', [128, 128, 3, 1, 1]), + ('conv5_3_CPM_L2', [128, 128, 3, 1, 1]), + ('conv5_4_CPM_L2', [128, 512, 1, 1, 0]), + ('conv5_5_CPM_L2', [512, 19, 1, 1, 0])]) + blocks['block1_1'] = block1_1 + blocks['block1_2'] = block1_2 + + self.model0 = make_layers(block0, no_relu_layers) + + # Stages 2 - 6 + for i in range(2, 7): + blocks['block%d_1' % i] = OrderedDict([ + ('Mconv1_stage%d_L1' % i, [185, 128, 7, 1, 3]), + ('Mconv2_stage%d_L1' % i, [128, 128, 7, 1, 3]), + ('Mconv3_stage%d_L1' % i, [128, 128, 7, 1, 3]), + ('Mconv4_stage%d_L1' % i, [128, 128, 7, 1, 3]), + ('Mconv5_stage%d_L1' % i, [128, 128, 7, 1, 3]), + ('Mconv6_stage%d_L1' % i, [128, 128, 1, 1, 0]), + ('Mconv7_stage%d_L1' % i, [128, 38, 1, 1, 0]) + ]) + + blocks['block%d_2' % i] = OrderedDict([ + ('Mconv1_stage%d_L2' % i, [185, 128, 7, 1, 3]), + ('Mconv2_stage%d_L2' % i, [128, 128, 7, 1, 3]), + ('Mconv3_stage%d_L2' % i, [128, 128, 7, 1, 3]), + ('Mconv4_stage%d_L2' % i, [128, 128, 7, 1, 3]), + ('Mconv5_stage%d_L2' % i, [128, 128, 7, 1, 3]), + ('Mconv6_stage%d_L2' % i, [128, 128, 1, 1, 0]), + ('Mconv7_stage%d_L2' % i, [128, 19, 1, 1, 0]) + ]) + + for k in blocks.keys(): + blocks[k] = make_layers(blocks[k], no_relu_layers) + + self.model1_1 = blocks['block1_1'] + self.model2_1 = blocks['block2_1'] + self.model3_1 = blocks['block3_1'] + self.model4_1 = blocks['block4_1'] + self.model5_1 = blocks['block5_1'] + self.model6_1 = blocks['block6_1'] + + self.model1_2 = blocks['block1_2'] + self.model2_2 = blocks['block2_2'] + self.model3_2 = blocks['block3_2'] + self.model4_2 = blocks['block4_2'] + self.model5_2 = blocks['block5_2'] + self.model6_2 = blocks['block6_2'] + + def forward(self, x): + + out1 = self.model0(x) + + out1_1 = self.model1_1(out1) + out1_2 = self.model1_2(out1) + out2 = torch.cat([out1_1, out1_2, out1], 1) + + out2_1 = self.model2_1(out2) + out2_2 = self.model2_2(out2) + out3 = torch.cat([out2_1, out2_2, out1], 1) + + out3_1 = self.model3_1(out3) + out3_2 = self.model3_2(out3) + out4 = torch.cat([out3_1, out3_2, out1], 1) + + out4_1 = self.model4_1(out4) + out4_2 = self.model4_2(out4) + out5 = torch.cat([out4_1, out4_2, out1], 1) + + out5_1 = self.model5_1(out5) + out5_2 = self.model5_2(out5) + out6 = torch.cat([out5_1, out5_2, out1], 1) + + out6_1 = self.model6_1(out6) + out6_2 = self.model6_2(out6) + + return out6_1, out6_2 + + +class handpose_model(nn.Module): + def __init__(self): + super(handpose_model, self).__init__() + + # these layers have no relu layer + no_relu_layers = [ + 'conv6_2_CPM', 'Mconv7_stage2', 'Mconv7_stage3', 'Mconv7_stage4', + 'Mconv7_stage5', 'Mconv7_stage6' + ] + # stage 1 + block1_0 = OrderedDict([('conv1_1', [3, 64, 3, 1, 1]), + ('conv1_2', [64, 64, 3, 1, 1]), + ('pool1_stage1', [2, 2, 0]), + ('conv2_1', [64, 128, 3, 1, 1]), + ('conv2_2', [128, 128, 3, 1, 1]), + ('pool2_stage1', [2, 2, 0]), + ('conv3_1', [128, 256, 3, 1, 1]), + ('conv3_2', [256, 256, 3, 1, 1]), + ('conv3_3', [256, 256, 3, 1, 1]), + ('conv3_4', [256, 256, 3, 1, 1]), + ('pool3_stage1', [2, 2, 0]), + ('conv4_1', [256, 512, 3, 1, 1]), + ('conv4_2', [512, 512, 3, 1, 1]), + ('conv4_3', [512, 512, 3, 1, 1]), + ('conv4_4', [512, 512, 3, 1, 1]), + ('conv5_1', [512, 512, 3, 1, 1]), + ('conv5_2', [512, 512, 3, 1, 1]), + ('conv5_3_CPM', [512, 128, 3, 1, 1])]) + + block1_1 = OrderedDict([('conv6_1_CPM', [128, 512, 1, 1, 0]), + ('conv6_2_CPM', [512, 22, 1, 1, 0])]) + + blocks = {} + blocks['block1_0'] = block1_0 + blocks['block1_1'] = block1_1 + + # stage 2-6 + for i in range(2, 7): + blocks['block%d' % i] = OrderedDict([ + ('Mconv1_stage%d' % i, [150, 128, 7, 1, 3]), + ('Mconv2_stage%d' % i, [128, 128, 7, 1, 3]), + ('Mconv3_stage%d' % i, [128, 128, 7, 1, 3]), + ('Mconv4_stage%d' % i, [128, 128, 7, 1, 3]), + ('Mconv5_stage%d' % i, [128, 128, 7, 1, 3]), + ('Mconv6_stage%d' % i, [128, 128, 1, 1, 0]), + ('Mconv7_stage%d' % i, [128, 22, 1, 1, 0]) + ]) + + for k in blocks.keys(): + blocks[k] = make_layers(blocks[k], no_relu_layers) + + self.model1_0 = blocks['block1_0'] + self.model1_1 = blocks['block1_1'] + self.model2 = blocks['block2'] + self.model3 = blocks['block3'] + self.model4 = blocks['block4'] + self.model5 = blocks['block5'] + self.model6 = blocks['block6'] + + def forward(self, x): + out1_0 = self.model1_0(x) + out1_1 = self.model1_1(out1_0) + concat_stage2 = torch.cat([out1_1, out1_0], 1) + out_stage2 = self.model2(concat_stage2) + concat_stage3 = torch.cat([out_stage2, out1_0], 1) + out_stage3 = self.model3(concat_stage3) + concat_stage4 = torch.cat([out_stage3, out1_0], 1) + out_stage4 = self.model4(concat_stage4) + concat_stage5 = torch.cat([out_stage4, out1_0], 1) + out_stage5 = self.model5(concat_stage5) + concat_stage6 = torch.cat([out_stage5, out1_0], 1) + out_stage6 = self.model6(concat_stage6) + return out_stage6 + + +class Hand(object): + def __init__(self, model_path, device='cuda'): + self.model = handpose_model() + if torch.cuda.is_available(): + self.model = self.model.to(device) + model_dict = transfer(self.model, torch.load(model_path)) + self.model.load_state_dict(model_dict) + self.model.eval() + self.device = device + + def __call__(self, oriImg): + scale_search = [0.5, 1.0, 1.5, 2.0] + # scale_search = [0.5] + boxsize = 368 + stride = 8 + padValue = 128 + thre = 0.05 + multiplier = [x * boxsize / oriImg.shape[0] for x in scale_search] + heatmap_avg = np.zeros((oriImg.shape[0], oriImg.shape[1], 22)) + # paf_avg = np.zeros((oriImg.shape[0], oriImg.shape[1], 38)) + + for m in range(len(multiplier)): + scale = multiplier[m] + imageToTest = cv2.resize(oriImg, (0, 0), + fx=scale, + fy=scale, + interpolation=cv2.INTER_CUBIC) + imageToTest_padded, pad = padRightDownCorner( + imageToTest, stride, padValue) + im = np.transpose( + np.float32(imageToTest_padded[:, :, :, np.newaxis]), + (3, 2, 0, 1)) / 256 - 0.5 + im = np.ascontiguousarray(im) + + data = torch.from_numpy(im).float() + if torch.cuda.is_available(): + data = data.to(self.device) + # data = data.permute([2, 0, 1]).unsqueeze(0).float() + with torch.no_grad(): + output = self.model(data).cpu().numpy() + # output = self.model(data).numpy()q + + # extract outputs, resize, and remove padding + heatmap = np.transpose(np.squeeze(output), + (1, 2, 0)) # output 1 is heatmaps + heatmap = cv2.resize(heatmap, (0, 0), + fx=stride, + fy=stride, + interpolation=cv2.INTER_CUBIC) + heatmap = heatmap[:imageToTest_padded.shape[0] - + pad[2], :imageToTest_padded.shape[1] - pad[3], :] + heatmap = cv2.resize(heatmap, (oriImg.shape[1], oriImg.shape[0]), + interpolation=cv2.INTER_CUBIC) + + heatmap_avg += heatmap / len(multiplier) + + all_peaks = [] + for part in range(21): + map_ori = heatmap_avg[:, :, part] + one_heatmap = gaussian_filter(map_ori, sigma=3) + binary = np.ascontiguousarray(one_heatmap > thre, dtype=np.uint8) + # 全部小于阈值 + if np.sum(binary) == 0: + all_peaks.append([0, 0]) + continue + label_img, label_numbers = label(binary, + return_num=True, + connectivity=binary.ndim) + max_index = np.argmax([ + np.sum(map_ori[label_img == i]) + for i in range(1, label_numbers + 1) + ]) + 1 + label_img[label_img != max_index] = 0 + map_ori[label_img == 0] = 0 + + y, x = npmax(map_ori) + all_peaks.append([x, y]) + return np.array(all_peaks) + + +class Body(object): + def __init__(self, model_path, device='cuda'): + self.model = bodypose_model() + if torch.cuda.is_available(): + self.model = self.model.to(device) + model_dict = transfer(self.model, torch.load(model_path)) + self.model.load_state_dict(model_dict) + self.model.eval() + self.device = device + + def __call__(self, oriImg): + # scale_search = [0.5, 1.0, 1.5, 2.0] + scale_search = [0.5] + boxsize = 368 + stride = 8 + padValue = 128 + thre1 = 0.1 + thre2 = 0.05 + multiplier = [x * boxsize / oriImg.shape[0] for x in scale_search] + heatmap_avg = np.zeros((oriImg.shape[0], oriImg.shape[1], 19)) + paf_avg = np.zeros((oriImg.shape[0], oriImg.shape[1], 38)) + + for m in range(len(multiplier)): + scale = multiplier[m] + imageToTest = cv2.resize(oriImg, (0, 0), + fx=scale, + fy=scale, + interpolation=cv2.INTER_CUBIC) + imageToTest_padded, pad = padRightDownCorner( + imageToTest, stride, padValue) + im = np.transpose( + np.float32(imageToTest_padded[:, :, :, np.newaxis]), + (3, 2, 0, 1)) / 256 - 0.5 + im = np.ascontiguousarray(im) + + data = torch.from_numpy(im).float() + if torch.cuda.is_available(): + data = data.to(self.device) + # data = data.permute([2, 0, 1]).unsqueeze(0).float() + with torch.no_grad(): + Mconv7_stage6_L1, Mconv7_stage6_L2 = self.model(data) + Mconv7_stage6_L1 = Mconv7_stage6_L1.cpu().numpy() + Mconv7_stage6_L2 = Mconv7_stage6_L2.cpu().numpy() + + # extract outputs, resize, and remove padding + # heatmap = np.transpose(np.squeeze(net.blobs[output_blobs.keys()[1]].data), (1, 2, 0)) + # output 1 is heatmaps + heatmap = np.transpose(np.squeeze(Mconv7_stage6_L2), + (1, 2, 0)) # output 1 is heatmaps + heatmap = cv2.resize(heatmap, (0, 0), + fx=stride, + fy=stride, + interpolation=cv2.INTER_CUBIC) + heatmap = heatmap[:imageToTest_padded.shape[0] - + pad[2], :imageToTest_padded.shape[1] - pad[3], :] + heatmap = cv2.resize(heatmap, (oriImg.shape[1], oriImg.shape[0]), + interpolation=cv2.INTER_CUBIC) + + # paf = np.transpose(np.squeeze(net.blobs[output_blobs.keys()[0]].data), (1, 2, 0)) # output 0 is PAFs + paf = np.transpose(np.squeeze(Mconv7_stage6_L1), + (1, 2, 0)) # output 0 is PAFs + paf = cv2.resize(paf, (0, 0), + fx=stride, + fy=stride, + interpolation=cv2.INTER_CUBIC) + paf = paf[:imageToTest_padded.shape[0] - + pad[2], :imageToTest_padded.shape[1] - pad[3], :] + paf = cv2.resize(paf, (oriImg.shape[1], oriImg.shape[0]), + interpolation=cv2.INTER_CUBIC) + + heatmap_avg += heatmap_avg + heatmap / len(multiplier) + paf_avg += +paf / len(multiplier) + + all_peaks = [] + peak_counter = 0 + + for part in range(18): + map_ori = heatmap_avg[:, :, part] + one_heatmap = gaussian_filter(map_ori, sigma=3) + + map_left = np.zeros(one_heatmap.shape) + map_left[1:, :] = one_heatmap[:-1, :] + map_right = np.zeros(one_heatmap.shape) + map_right[:-1, :] = one_heatmap[1:, :] + map_up = np.zeros(one_heatmap.shape) + map_up[:, 1:] = one_heatmap[:, :-1] + map_down = np.zeros(one_heatmap.shape) + map_down[:, :-1] = one_heatmap[:, 1:] + + peaks_binary = np.logical_and.reduce( + (one_heatmap >= map_left, one_heatmap >= map_right, + one_heatmap >= map_up, one_heatmap >= map_down, + one_heatmap > thre1)) + peaks = list( + zip(np.nonzero(peaks_binary)[1], + np.nonzero(peaks_binary)[0])) # note reverse + peaks_with_score = [x + (map_ori[x[1], x[0]], ) for x in peaks] + peak_id = range(peak_counter, peak_counter + len(peaks)) + peaks_with_score_and_id = [ + peaks_with_score[i] + (peak_id[i], ) + for i in range(len(peak_id)) + ] + + all_peaks.append(peaks_with_score_and_id) + peak_counter += len(peaks) + + # find connection in the specified sequence, center 29 is in the position 15 + limbSeq = [[2, 3], [2, 6], [3, 4], [4, 5], [6, 7], [7, 8], [2, 9], + [9, 10], [10, 11], [2, 12], [12, 13], [13, 14], [2, 1], + [1, 15], [15, 17], [1, 16], [16, 18], [3, 17], [6, 18]] + # the middle joints heatmap correpondence + mapIdx = [[31, 32], [39, 40], [33, 34], [35, 36], [41, 42], [43, 44], + [19, 20], [21, 22], [23, 24], [25, 26], [27, 28], [29, 30], + [47, 48], [49, 50], [53, 54], [51, 52], [55, 56], [37, 38], + [45, 46]] + + connection_all = [] + special_k = [] + mid_num = 10 + + for k in range(len(mapIdx)): + score_mid = paf_avg[:, :, [x - 19 for x in mapIdx[k]]] + candA = all_peaks[limbSeq[k][0] - 1] + candB = all_peaks[limbSeq[k][1] - 1] + nA = len(candA) + nB = len(candB) + indexA, indexB = limbSeq[k] + if (nA != 0 and nB != 0): + connection_candidate = [] + for i in range(nA): + for j in range(nB): + vec = np.subtract(candB[j][:2], candA[i][:2]) + norm = math.sqrt(vec[0] * vec[0] + vec[1] * vec[1]) + norm = max(0.001, norm) + vec = np.divide(vec, norm) + + startend = list( + zip( + np.linspace(candA[i][0], + candB[j][0], + num=mid_num), + np.linspace(candA[i][1], + candB[j][1], + num=mid_num))) + + vec_x = np.array([ + score_mid[int(round(startend[ii][1])), + int(round(startend[ii][0])), 0] + for ii in range(len(startend)) + ]) + vec_y = np.array([ + score_mid[int(round(startend[ii][1])), + int(round(startend[ii][0])), 1] + for ii in range(len(startend)) + ]) + + score_midpts = np.multiply( + vec_x, vec[0]) + np.multiply(vec_y, vec[1]) + score_with_dist_prior = sum(score_midpts) / len( + score_midpts) + min( + 0.5 * oriImg.shape[0] / norm - 1, 0) + criterion1 = len(np.nonzero( + score_midpts > thre2)[0]) > 0.8 * len(score_midpts) + criterion2 = score_with_dist_prior > 0 + if criterion1 and criterion2: + connection_candidate.append([ + i, j, score_with_dist_prior, + score_with_dist_prior + candA[i][2] + + candB[j][2] + ]) + + connection_candidate = sorted(connection_candidate, + key=lambda x: x[2], + reverse=True) + connection = np.zeros((0, 5)) + for c in range(len(connection_candidate)): + i, j, s = connection_candidate[c][0:3] + if (i not in connection[:, 3] + and j not in connection[:, 4]): + connection = np.vstack( + [connection, [candA[i][3], candB[j][3], s, i, j]]) + if (len(connection) >= min(nA, nB)): + break + + connection_all.append(connection) + else: + special_k.append(k) + connection_all.append([]) + + # last number in each row is the total parts number of that person + # the second last number in each row is the score of the overall configuration + subset = -1 * np.ones((0, 20)) + candidate = np.array( + [item for sublist in all_peaks for item in sublist]) + + for k in range(len(mapIdx)): + if k not in special_k: + partAs = connection_all[k][:, 0] + partBs = connection_all[k][:, 1] + indexA, indexB = np.array(limbSeq[k]) - 1 + + for i in range(len(connection_all[k])): # = 1:size(temp,1) + found = 0 + subset_idx = [-1, -1] + for j in range(len(subset)): # 1:size(subset,1): + if subset[j][indexA] == partAs[i] or subset[j][ + indexB] == partBs[i]: + subset_idx[found] = j + found += 1 + + if found == 1: + j = subset_idx[0] + if subset[j][indexB] != partBs[i]: + subset[j][indexB] = partBs[i] + subset[j][-1] += 1 + subset[j][-2] += candidate[ + partBs[i].astype(int), + 2] + connection_all[k][i][2] + elif found == 2: # if found 2 and disjoint, merge them + j1, j2 = subset_idx + membership = ((subset[j1] >= 0).astype(int) + + (subset[j2] >= 0).astype(int))[:-2] + if len(np.nonzero(membership == 2)[0]) == 0: # merge + subset[j1][:-2] += (subset[j2][:-2] + 1) + subset[j1][-2:] += subset[j2][-2:] + subset[j1][-2] += connection_all[k][i][2] + subset = np.delete(subset, j2, 0) + else: # as like found == 1 + subset[j1][indexB] = partBs[i] + subset[j1][-1] += 1 + subset[j1][-2] += candidate[ + partBs[i].astype(int), + 2] + connection_all[k][i][2] + + # if find no partA in the subset, create a new subset + elif not found and k < 17: + row = -1 * np.ones(20) + row[indexA] = partAs[i] + row[indexB] = partBs[i] + row[-1] = 2 + row[-2] = sum( + candidate[connection_all[k][i, :2].astype(int), + 2]) + connection_all[k][i][2] + subset = np.vstack([subset, row]) + # delete some rows of subset which has few parts occur + deleteIdx = [] + for i in range(len(subset)): + if subset[i][-1] < 4 or subset[i][-2] / subset[i][-1] < 0.4: + deleteIdx.append(i) + subset = np.delete(subset, deleteIdx, axis=0) + + # subset: n*20 array, 0-17 is the index in candidate, 18 is the total score, 19 is the total parts + # candidate: x, y, score, id + return candidate, subset + + +@ANNOTATORS.register_class() +class OpenposeAnnotator(BaseAnnotator, metaclass=ABCMeta): + para_dict = {} + + def __init__(self, cfg, logger=None): + super().__init__(cfg, logger=logger) + with FS.get_from(cfg.BODY_MODEL_PATH, + wait_finish=True) as body_model_path: + self.body_estimation = Body(body_model_path, device='cpu') + with FS.get_from(cfg.HAND_MODEL_PATH, + wait_finish=True) as hand_model_path: + self.hand_estimation = Hand(hand_model_path, device='cpu') + self.use_hand = cfg.get('USE_HAND', False) + + def to(self, device): + self.body_estimation.model = self.body_estimation.model.to(device) + self.body_estimation.device = device + self.hand_estimation.model = self.hand_estimation.model.to(device) + self.hand_estimation.device = device + return self + + @torch.no_grad() + @torch.inference_mode() + @torch.autocast('cuda', enabled=False) + def forward(self, image): + if isinstance(image, Image.Image): + image = np.array(image) + elif isinstance(image, torch.Tensor): + image = image.detach().cpu().numpy() + elif isinstance(image, np.ndarray): + image = image.copy() + else: + raise f'Unsurpport datatype{type(image)}, only surpport np.ndarray, torch.Tensor, Pillow Image.' + image = image[:, :, ::-1] + candidate, subset = self.body_estimation(image) + canvas = np.zeros_like(image) + canvas = draw_bodypose(canvas, candidate, subset) + if self.use_hand: + hands_list = handDetect(candidate, subset, image) + all_hand_peaks = [] + for x, y, w, is_left in hands_list: + peaks = self.hand_estimation(image[y:y + w, x:x + w, :]) + peaks[:, 0] = np.where(peaks[:, 0] == 0, peaks[:, 0], + peaks[:, 0] + x) + peaks[:, 1] = np.where(peaks[:, 1] == 0, peaks[:, 1], + peaks[:, 1] + y) + all_hand_peaks.append(peaks) + canvas = draw_handpose(canvas, all_hand_peaks) + return canvas + + @staticmethod + def get_config_template(): + return dict_to_yaml('ANNOTATORS', + __class__.__name__, + OpenposeAnnotator.para_dict, + set_name=True) diff --git a/scepter/modules/annotator/registry.py b/scepter/modules/annotator/registry.py new file mode 100644 index 0000000..d141bb6 --- /dev/null +++ b/scepter/modules/annotator/registry.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +from scepter.modules.utils.config import Config +from scepter.modules.utils.registry import Registry, build_from_config + + +def build_annotator(cfg, registry, logger=None, *args, **kwargs): + """ After build model, load pretrained model if exists key `pretrain`. + + pretrain (str, dict): Describes how to load pretrained model. + str, treat pretrain as model path; + dict: should contains key `path`, and other parameters token by function load_pretrained(); + """ + if not isinstance(cfg, Config): + raise TypeError(f'Config must be type dict, got {type(cfg)}') + if cfg.have('PRETRAINED_MODEL'): + pretrain_cfg = cfg.PRETRAINED_MODEL + if pretrain_cfg is not None and not isinstance(pretrain_cfg, (str)): + raise TypeError('Pretrain parameter must be a string') + else: + pretrain_cfg = None + + model = build_from_config(cfg, registry, logger=logger, *args, **kwargs) + if pretrain_cfg is not None: + if hasattr(model, 'load_pretrained_model'): + model.load_pretrained_model(pretrain_cfg) + return model + + +ANNOTATORS = Registry('ANNOTATORS', build_func=build_annotator) diff --git a/scepter/modules/annotator/utils.py b/scepter/modules/annotator/utils.py new file mode 100644 index 0000000..672e921 --- /dev/null +++ b/scepter/modules/annotator/utils.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- +import cv2 +import numpy as np + + +def resize_image(input_image, resolution): + H, W, C = input_image.shape + H = float(H) + W = float(W) + k = float(resolution) / min(H, W) + H *= k + W *= k + H = int(np.round(H / 64.0)) * 64 + W = int(np.round(W / 64.0)) * 64 + img = cv2.resize( + input_image, (W, H), + interpolation=cv2.INTER_LANCZOS4 if k > 1 else cv2.INTER_AREA) + return img, k + + +def resize_image_ori(h, w, image, k): + img = cv2.resize( + image, (w, h), + interpolation=cv2.INTER_LANCZOS4 if k > 1 else cv2.INTER_AREA) + return img + + +class AnnotatorProcessor(): + canny_cfg = { + 'NAME': 'CannyAnnotator', + 'LOW_THRESHOLD': 100, + 'HIGH_THRESHOLD': 200, + 'INPUT_KEYS': ['img'], + 'OUTPUT_KEYS': ['canny'] + } + hed_cfg = { + 'NAME': 'HedAnnotator', + 'PRETRAINED_MODEL': + 'ms://damo/scepter_scedit@annotator/ckpts/ControlNetHED.pth', + 'INPUT_KEYS': ['img'], + 'OUTPUT_KEYS': ['hed'] + } + openpose_cfg = { + 'NAME': 'OpenposeAnnotator', + 'BODY_MODEL_PATH': + 'ms://damo/scepter_scedit@annotator/ckpts/body_pose_model.pth', + 'HAND_MODEL_PATH': + 'ms://damo/scepter_scedit@annotator/ckpts/hand_pose_model.pth', + 'INPUT_KEYS': ['img'], + 'OUTPUT_KEYS': ['openpose'] + } + midas_cfg = { + 'NAME': 'MidasDetector', + 'PRETRAINED_MODEL': + 'ms://damo/scepter_scedit@annotator/ckpts/dpt_hybrid-midas-501f0c75.pt', + 'INPUT_KEYS': ['img'], + 'OUTPUT_KEYS': ['depth'] + } + mlsd_cfg = { + 'NAME': 'MLSDdetector', + 'PRETRAINED_MODEL': + 'ms://damo/scepter_scedit@annotator/ckpts/mlsd_large_512_fp32.pth', + 'INPUT_KEYS': ['img'], + 'OUTPUT_KEYS': ['mlsd'] + } + color_cfg = { + 'NAME': 'ColorAnnotator', + 'RATIO': 64, + 'INPUT_KEYS': ['img'], + 'OUTPUT_KEYS': ['color'] + } + + anno_type_map = { + 'canny': canny_cfg, + 'hed': hed_cfg, + 'pose': openpose_cfg, + 'depth': midas_cfg, + 'mlsd': mlsd_cfg, + 'color': color_cfg + } + + def __init__(self, anno_type): + from scepter.modules.annotator.registry import ANNOTATORS + from scepter.modules.utils.config import Config + from scepter.modules.utils.distribute import we + + if isinstance(anno_type, str): + assert anno_type in self.anno_type_map.keys() + anno_type = [anno_type] + elif isinstance(anno_type, (list, tuple)): + assert all(tp in self.anno_type_map.keys() for tp in anno_type) + else: + raise Exception(f'Error anno_type: {anno_type}') + + general_dict = { + 'NAME': 'GeneralAnnotator', + 'ANNOTATORS': [self.anno_type_map[tp] for tp in anno_type] + } + general_anno = Config(cfg_dict=general_dict, load=False) + self.general_ins = ANNOTATORS.build(general_anno).to(we.device_id) + + def run(self, image, anno_type=None): + output_image = self.general_ins({'img': image}) + if anno_type is not None: + if isinstance(anno_type, str) and anno_type in output_image: + return output_image[anno_type] + else: + return { + tp: output_image[tp] + for tp in anno_type if tp in output_image + } + else: + return output_image diff --git a/scepter/modules/data/dataset/__init__.py b/scepter/modules/data/dataset/__init__.py index f513bb1..1bde76b 100644 --- a/scepter/modules/data/dataset/__init__.py +++ b/scepter/modules/data/dataset/__init__.py @@ -6,5 +6,6 @@ from scepter.modules.data.dataset.dataset import (Image2ImageDataset, ImageClassifyPublicDataset, ImageTextPairDataset, Text2ImageDataset) -from scepter.modules.data.dataset.ms_dataset import ImageTextPairMSDataset +from scepter.modules.data.dataset.ms_dataset import ( + ImageTextPairFolderDataset, ImageTextPairMSDataset) from scepter.modules.data.dataset.registry import DATASETS diff --git a/scepter/modules/data/dataset/dataset.py b/scepter/modules/data/dataset/dataset.py index c82c50b..5fb7942 100644 --- a/scepter/modules/data/dataset/dataset.py +++ b/scepter/modules/data/dataset/dataset.py @@ -2,6 +2,7 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import numbers +import os import sys from collections.abc import Iterable @@ -235,6 +236,7 @@ class Text2ImageDataset(BaseDataset): delimiter = cfg.get('DELIMITER', ',') fields = cfg.get('FIELDS', ['row_key', 'prompt']) prompt_prefix = cfg.get('PROMPT_PREFIX', '') + path_prefix = cfg.get('PATH_PREFIX', '') use_num = cfg.get('USE_NUM', -1) image_size = cfg.get('IMAGE_SIZE', 1024) @@ -257,11 +259,14 @@ class Text2ImageDataset(BaseDataset): if key in ['prompt', 'caption', 'text']: item['ori_prompt'] = value item['prompt'] = prompt_prefix + value + elif key in ['oss_key', 'path', 'img_path', 'target_img_path']: + item['meta']['img_path'] = os.path.join(path_prefix, value) + elif key in ['width', 'height']: + item['meta'][key] = int(value) elif key != 'meta': item[key] = value else: continue - self.items.append(item) if use_num > 0: self.items = self.items[:use_num] diff --git a/scepter/modules/data/dataset/ms_dataset.py b/scepter/modules/data/dataset/ms_dataset.py index 190135c..12b29aa 100644 --- a/scepter/modules/data/dataset/ms_dataset.py +++ b/scepter/modules/data/dataset/ms_dataset.py @@ -9,6 +9,7 @@ from scepter.modules.data.dataset.base_dataset import BaseDataset from scepter.modules.data.dataset.registry import DATASETS from scepter.modules.utils.config import dict_to_yaml from scepter.modules.utils.distribute import we +from scepter.modules.utils.file_system import FS @DATASETS.register_class() @@ -105,14 +106,17 @@ class ImageTextPairMSDataset(BaseDataset): raise ( 'Your must set MS_DATASET_NAME as modelscope dataset or your local dataset orignized ' 'as modelscope dataset.') + if FS.exists(ms_dataset_name): + ms_dataset_name = FS.get_dir_to_local_dir(ms_dataset_name) + ms_remap_path = ms_dataset_name try: self.data = MsDataset.load(str(ms_dataset_name), namespace=ms_dataset_namespace, subset_name=ms_dataset_subname, split=ms_dataset_split) - except Exception as e: + except Exception: self.logger.info( - f"Load Modelscope dataset failed with {e}, retry with download_mode='force_redownload'." + "Load Modelscope dataset failed, retry with download_mode='force_redownload'." ) try: self.data = MsDataset.load( @@ -177,3 +181,119 @@ class ImageTextPairMSDataset(BaseDataset): __class__.__name__, ImageTextPairMSDataset.para_dict, set_name=True) + + +@DATASETS.register_class() +class ImageTextPairFolderDataset(BaseDataset): + para_dict = { + 'DATA_FOLDER': { + 'value': '', + 'description': 'Dataset folder.' + }, + 'TRIGGER_WORDS': { + 'value': + '', + 'description': + 'The words used to describe the common features of your data, especially when you customize a ' + 'tuner. Use these words you can get what you want.' + }, + 'REPLACE_STYLE': { + 'value': + False, + 'description': + 'Whether use the MS_DATASET_SUBNAME to replace the word in your description, default is False.' + }, + 'HIGHLIGHT_KEYWORDS': { + 'value': + '', + 'description': + 'The keywords you want to highlight in prompt, which will be replace by .' + }, + 'KEYWORDS_SIGN': { + 'value': + '', + 'description': + 'The keywords sign you want to add, which is like <{HIGHLIGHT_KEYWORDS}{KEYWORDS_SIGN}>' + }, + 'OUTPUT_SIZE': { + 'value': + None, + 'description': + 'If you use the FlexibleResize transforms, this filed will output the image_size as [h, w],' + 'which will be used to set the output size of images used to train the model.' + }, + } + + def __init__(self, cfg, logger=None): + super().__init__(cfg=cfg, logger=logger) + data_folder = cfg.get('DATA_FOLDER', None) + self.replace_style = cfg.get('REPLACE_STYLE', False) + self.trigger_words = cfg.get('TRIGGER_WORDS', '') + self.replace_keywords = cfg.get('HIGHLIGHT_KEYWORDS', '') + self.keywords_sign = cfg.get('KEYWORDS_SIGN', '') + self.output_size = cfg.get('OUTPUT_SIZE', None) + if self.output_size is not None: + if isinstance(self.output_size, numbers.Number): + self.output_size = [self.output_size, self.output_size] + # Use modelscope dataset + if not data_folder or not FS.exists(data_folder): + raise ('Your must set datafolder for local dataset.') + data_folder = FS.get_dir_to_local_dir(data_folder) + all_lines = open(os.path.join(data_folder, 'train.csv'), + 'r').read().split('\n') + assert all_lines[0] == 'Target:FILE,Prompt' + self.data = [] + for line in all_lines[1:]: + line = line.strip() + if line == '': + continue + self.data.append({ + 'Target:FILE': + os.path.join(data_folder, + line.split(',', 1)[0]), + 'Prompt': + line.split(',', 1)[1] + }) + self.real_number = len(self.data) + + def __len__(self): + if self.mode == 'train': + return sys.maxsize + else: + return len(self.data) + + def _get(self, index: int): + current_data = self.data[index % len(self.data)] + # print(current_data.keys()) + image_path = current_data['Target:FILE'] + prompt = current_data['Prompt'] + style = current_data['Style'] if 'Style' in current_data else '' + # print(prompt, style) + if self.replace_style and not style == '': + prompt = prompt.replace(style, f'<{self.keywords_sign}>') + elif not self.replace_keywords.strip() == '': + prompt = prompt.replace( + self.replace_keywords, + '<' + self.replace_keywords + f'{self.keywords_sign}>') + if not self.trigger_words == '': + prompt = self.trigger_words.strip() + ' ' + prompt + if we.debug: + print(prompt, self.replace_keywords.strip()) + ret_item = { + 'meta': { + 'img_path': image_path, + 'data_key': style, + 'data_num': self.real_number + }, + 'prompt': prompt + } + if self.output_size is not None: + ret_item['meta']['image_size'] = self.output_size + return ret_item + + @staticmethod + def get_config_template(): + return dict_to_yaml('DATASet', + __class__.__name__, + ImageTextPairMSDataset.para_dict, + set_name=True) diff --git a/scepter/modules/data/dataset/utils.py b/scepter/modules/data/dataset/utils.py new file mode 100644 index 0000000..f34ab63 --- /dev/null +++ b/scepter/modules/data/dataset/utils.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. + +from PIL import Image +from torch.utils.data.dataloader import default_collate + + +def pil_collate_fn(self, batch): + batch_data = {} + for items in batch: + for key, item in items.items(): + if isinstance(item, Image.Image): + if key not in batch_data: + batch_data[key] = [] + batch_data[key].append(item) + else: + if key not in batch_data: + batch_data[key] = [] + batch_data[key].append(item) + + for key, item in batch_data.items(): + if not all(isinstance(x, Image.Image) for x in item): + batch_data[key] = default_collate(item) + + return batch_data diff --git a/scepter/modules/inference/__init__.py b/scepter/modules/inference/__init__.py new file mode 100644 index 0000000..6c8b984 --- /dev/null +++ b/scepter/modules/inference/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from scepter.modules.inference.diffusion_inference import DiffusionInference diff --git a/scepter/modules/inference/diffusion_inference.py b/scepter/modules/inference/diffusion_inference.py new file mode 100644 index 0000000..0bd925c --- /dev/null +++ b/scepter/modules/inference/diffusion_inference.py @@ -0,0 +1,848 @@ +# -*- coding: utf-8 -*- +import copy +import hashlib +import json +import os.path +import random +from collections import OrderedDict + +import torch +import torch.nn as nn +import torch.nn.functional as F +import torchvision.transforms as TT +from peft.utils import CONFIG_NAME, SAFETENSORS_WEIGHTS_NAME, WEIGHTS_NAME +from PIL.Image import Image +from swift import Swift, SwiftModel + +from scepter.modules.model.network.diffusion.diffusion import GaussianDiffusion +from scepter.modules.model.network.diffusion.schedules import noise_schedule +from scepter.modules.model.registry import (BACKBONES, EMBEDDERS, MODELS, + TOKENIZERS, TUNERS) +from scepter.modules.utils.config import Config +from scepter.modules.utils.distribute import we +from scepter.modules.utils.file_system import FS + + +def get_model(model_tuple): + assert 'model' in model_tuple + return model_tuple['model'] + + +class DiffusionInference(): + ''' + define vae, unet, text-encoder, tuner, refiner components + support to load the components dynamicly. + create and load model when run this model at the first time. + ''' + def __init__(self, logger=None): + self.logger = logger + + def init_from_cfg(self, cfg): + self.name = cfg.NAME + self.is_default = cfg.get('IS_DEFAULT', False) + module_paras = self.load_default(cfg.get('DEFAULT_PARAS', None)) + assert cfg.have('MODEL') + cfg.MODEL = self.redefine_paras(cfg.MODEL) + self.diffusion = self.load_schedule(cfg.MODEL.SCHEDULE) + self.diffusion_model = self.infer_model( + cfg.MODEL.DIFFUSION_MODEL, module_paras.get( + 'DIFFUSION_MODEL', + None)) if cfg.MODEL.have('DIFFUSION_MODEL') else None + self.first_stage_model = self.infer_model( + cfg.MODEL.FIRST_STAGE_MODEL, + module_paras.get( + 'FIRST_STAGE_MODEL', + None)) if cfg.MODEL.have('FIRST_STAGE_MODEL') else None + self.cond_stage_model = self.infer_model( + cfg.MODEL.COND_STAGE_MODEL, + module_paras.get( + 'COND_STAGE_MODEL', + None)) if cfg.MODEL.have('COND_STAGE_MODEL') else None + self.refiner_cond_model = self.infer_model( + cfg.MODEL.REFINER_COND_MODEL, + module_paras.get( + 'REFINER_COND_MODEL', + None)) if cfg.MODEL.have('REFINER_COND_MODEL') else None + self.refiner_diffusion_model = self.infer_model( + cfg.MODEL.REFINER_MODEL, module_paras.get( + 'REFINER_MODEL', + None)) if cfg.MODEL.have('REFINER_MODEL') else None + self.tokenizer = TOKENIZERS.build( + cfg.MODEL.TOKENIZER, + logger=self.logger) if cfg.MODEL.have('TOKENIZER') else None + + if self.tokenizer is not None: + self.cond_stage_model['cfg'].KWARGS = { + 'vocab_size': self.tokenizer.vocab_size + } + + def register_tuner(self, tuner_model_list): + if len(tuner_model_list) < 1: + if isinstance(self.diffusion_model['model'], SwiftModel): + for adapter_name in self.diffusion_model['model'].adapters: + self.diffusion_model['model'].deactivate_adapter( + adapter_name, offload='cpu') + if isinstance(self.cond_stage_model['model'], SwiftModel): + for adapter_name in self.cond_stage_model['model'].adapters: + self.cond_stage_model['model'].deactivate_adapter( + adapter_name, offload='cpu') + return + all_diffusion_tuner = {} + all_cond_tuner = {} + save_root_dir = '.cache_tuner' + for tuner_model in tuner_model_list: + tunner_model_folder = tuner_model.MODEL_PATH + local_tuner_model = FS.get_dir_to_local_dir(tunner_model_folder) + all_tuner_datas = os.listdir(local_tuner_model) + cur_tuner_md5 = hashlib.md5( + tunner_model_folder.encode('utf-8')).hexdigest() + + local_diffusion_cache = os.path.join( + save_root_dir, cur_tuner_md5 + '_' + 'diffusion') + local_cond_cache = os.path.join(save_root_dir, + cur_tuner_md5 + '_' + 'cond') + + meta_file = os.path.join(save_root_dir, + cur_tuner_md5 + '_meta.json') + if not os.path.exists(meta_file): + diffusion_tuner = {} + cond_tuner = {} + for sub in all_tuner_datas: + sub_file = os.path.join(local_tuner_model, sub) + config_file = os.path.join(sub_file, CONFIG_NAME) + safe_file = os.path.join(sub_file, + SAFETENSORS_WEIGHTS_NAME) + bin_file = os.path.join(sub_file, WEIGHTS_NAME) + if os.path.isdir(sub_file) and os.path.isfile(config_file): + # diffusion or cond + cfg = json.load(open(config_file, 'r')) + if 'cond_stage_model.' in cfg['target_modules']: + cond_cfg = copy.deepcopy(cfg) + if 'cond_stage_model.*' in cond_cfg[ + 'target_modules']: + cond_cfg['target_modules'] = cond_cfg[ + 'target_modules'].replace( + 'cond_stage_model.*', '.*') + else: + cond_cfg['target_modules'] = cond_cfg[ + 'target_modules'].replace( + 'cond_stage_model.', '') + if cond_cfg['target_modules'].startswith('*'): + cond_cfg['target_modules'] = '.' + cond_cfg[ + 'target_modules'] + os.makedirs(local_cond_cache + '_' + sub, + exist_ok=True) + cond_tuner[os.path.basename(local_cond_cache) + + '_' + sub] = hashlib.md5( + (local_cond_cache + '_' + + sub).encode('utf-8')).hexdigest() + os.makedirs(local_cond_cache + '_' + sub, + exist_ok=True) + + json.dump( + cond_cfg, + open( + os.path.join(local_cond_cache + '_' + sub, + CONFIG_NAME), 'w')) + if 'model.' in cfg['target_modules'].replace( + 'cond_stage_model.', ''): + diffusion_cfg = copy.deepcopy(cfg) + if 'model.*' in diffusion_cfg['target_modules']: + diffusion_cfg[ + 'target_modules'] = diffusion_cfg[ + 'target_modules'].replace( + 'model.*', '.*') + else: + diffusion_cfg[ + 'target_modules'] = diffusion_cfg[ + 'target_modules'].replace( + 'model.', '') + if diffusion_cfg['target_modules'].startswith('*'): + diffusion_cfg[ + 'target_modules'] = '.' + diffusion_cfg[ + 'target_modules'] + os.makedirs(local_diffusion_cache + '_' + sub, + exist_ok=True) + diffusion_tuner[ + os.path.basename(local_diffusion_cache) + '_' + + sub] = hashlib.md5( + (local_diffusion_cache + '_' + + sub).encode('utf-8')).hexdigest() + json.dump( + diffusion_cfg, + open( + os.path.join( + local_diffusion_cache + '_' + sub, + CONFIG_NAME), 'w')) + + state_dict = {} + is_bin_file = True + if os.path.isfile(bin_file): + state_dict = torch.load(bin_file) + elif os.path.isfile(safe_file): + is_bin_file = False + from safetensors.torch import \ + load_file as safe_load_file + state_dict = safe_load_file( + safe_file, + device='cuda' + if torch.cuda.is_available() else 'cpu') + save_diffusion_state_dict = {} + save_cond_state_dict = {} + for key, value in state_dict.items(): + if key.startswith('model.'): + save_diffusion_state_dict[ + key[len('model.'):].replace( + sub, + os.path.basename(local_diffusion_cache) + + '_' + sub)] = value + elif key.startswith('cond_stage_model.'): + save_cond_state_dict[ + key[len('cond_stage_model.'):].replace( + sub, + os.path.basename(local_cond_cache) + + '_' + sub)] = value + + if is_bin_file: + if len(save_diffusion_state_dict) > 0: + torch.save( + save_diffusion_state_dict, + os.path.join( + local_diffusion_cache + '_' + sub, + WEIGHTS_NAME)) + if len(save_cond_state_dict) > 0: + torch.save( + save_cond_state_dict, + os.path.join(local_cond_cache + '_' + sub, + WEIGHTS_NAME)) + else: + from safetensors.torch import \ + save_file as safe_save_file + if len(save_diffusion_state_dict) > 0: + safe_save_file( + save_diffusion_state_dict, + os.path.join( + local_diffusion_cache + '_' + sub, + SAFETENSORS_WEIGHTS_NAME), + metadata={'format': 'pt'}) + if len(save_cond_state_dict) > 0: + safe_save_file( + save_cond_state_dict, + os.path.join(local_cond_cache + '_' + sub, + SAFETENSORS_WEIGHTS_NAME), + metadata={'format': 'pt'}) + json.dump( + { + 'diffusion_tuner': diffusion_tuner, + 'cond_tuner': cond_tuner + }, open(meta_file, 'w')) + else: + meta_conf = json.load(open(meta_file, 'r')) + diffusion_tuner = meta_conf['diffusion_tuner'] + cond_tuner = meta_conf['cond_tuner'] + all_diffusion_tuner.update(diffusion_tuner) + all_cond_tuner.update(cond_tuner) + if len(all_diffusion_tuner) > 0: + self.load(self.diffusion_model) + self.diffusion_model['model'] = Swift.from_pretrained( + self.diffusion_model['model'], + save_root_dir, + adapter_name=all_diffusion_tuner) + self.diffusion_model['model'].set_active_adapters( + list(all_diffusion_tuner.values())) + self.unload(self.diffusion_model) + if len(all_cond_tuner) > 0: + self.load(self.cond_stage_model) + self.cond_stage_model['model'] = Swift.from_pretrained( + self.cond_stage_model['model'], + save_root_dir, + adapter_name=all_cond_tuner) + self.cond_stage_model['model'].set_active_adapters( + list(all_cond_tuner.values())) + self.unload(self.cond_stage_model) + + def register_controllers(self, control_model_ins): + if control_model_ins is None or control_model_ins == '': + if isinstance(self.diffusion_model['model'], SwiftModel): + if (hasattr(self.diffusion_model['model'].base_model, + 'control_blocks') and + self.diffusion_model['model'].base_model.control_blocks + ): # noqa + del self.diffusion_model['model'].base_model.control_blocks + self.diffusion_model[ + 'model'].base_model.control_blocks = None + self.diffusion_model['model'].base_model.control_name = [] + else: + del self.diffusion_model['model'].control_blocks + self.diffusion_model['model'].control_blocks = None + self.diffusion_model['model'].control_name = [] + return + if not isinstance(control_model_ins, list): + control_model_ins = [control_model_ins] + control_model = nn.ModuleList([]) + control_model_folder = [] + for one_control in control_model_ins: + one_control_model_folder = one_control.MODEL_PATH + control_model_folder.append(one_control_model_folder) + have_list = getattr(self.diffusion_model['model'], 'control_name', + []) + if one_control_model_folder in have_list: + ind = have_list.index(one_control_model_folder) + csc_tuners = copy.deepcopy( + self.diffusion_model['model'].control_blocks[ind]) + else: + one_local_control_model = FS.get_dir_to_local_dir( + one_control_model_folder) + control_cfg = Config(cfg_file=os.path.join( + one_local_control_model, 'configuration.json')) + assert hasattr(control_cfg, 'CONTROL_MODEL') + control_cfg.CONTROL_MODEL[ + 'INPUT_BLOCK_CHANS'] = self.diffusion_model[ + 'model']._input_block_chans + control_cfg.CONTROL_MODEL[ + 'INPUT_DOWN_FLAG'] = self.diffusion_model[ + 'model']._input_down_flag + control_cfg.CONTROL_MODEL.PRETRAINED_MODEL = os.path.join( + one_local_control_model, 'pytorch_model.bin') + csc_tuners = TUNERS.build(control_cfg.CONTROL_MODEL, + logger=self.logger) + control_model.append(csc_tuners) + if isinstance(self.diffusion_model['model'], SwiftModel): + del self.diffusion_model['model'].base_model.control_blocks + self.diffusion_model[ + 'model'].base_model.control_blocks = control_model + self.diffusion_model[ + 'model'].base_model.control_name = control_model_folder + else: + del self.diffusion_model['model'].control_blocks + self.diffusion_model['model'].control_blocks = control_model + self.diffusion_model['model'].control_name = control_model_folder + + def redefine_paras(self, cfg): + if cfg.get('PRETRAINED_MODEL', None): + assert FS.isfile(cfg.PRETRAINED_MODEL) + with FS.get_from(cfg.PRETRAINED_MODEL, + wait_finish=True) as local_path: + if local_path.endswith('safetensors'): + from safetensors.torch import load_file as load_safetensors + sd = load_safetensors(local_path) + else: + sd = torch.load(local_path, map_location='cpu') + first_stage_model_path = os.path.join( + os.path.dirname(local_path), 'first_stage_model.pth') + cond_stage_model_path = os.path.join( + os.path.dirname(local_path), 'cond_stage_model.pth') + diffusion_model_path = os.path.join( + os.path.dirname(local_path), 'diffusion_model.pth') + if (not os.path.exists(first_stage_model_path) + or not os.path.exists(cond_stage_model_path) + or not os.path.exists(diffusion_model_path)): + self.logger.info( + 'Now read the whole model and rearrange the modules, it may take several mins.' + ) + first_stage_model = OrderedDict() + cond_stage_model = OrderedDict() + diffusion_model = OrderedDict() + for k, v in sd.items(): + if k.startswith('first_stage_model.'): + first_stage_model[k.replace( + 'first_stage_model.', '')] = v + elif k.startswith('conditioner.'): + cond_stage_model[k.replace('conditioner.', '')] = v + elif k.startswith('cond_stage_model.'): + if k.startswith('cond_stage_model.model.'): + cond_stage_model[k.replace( + 'cond_stage_model.model.', '')] = v + else: + cond_stage_model[k.replace( + 'cond_stage_model.', '')] = v + elif k.startswith('model.diffusion_model.'): + diffusion_model[k.replace('model.diffusion_model.', + '')] = v + else: + continue + if cfg.have('FIRST_STAGE_MODEL'): + with open(first_stage_model_path + 'cache', 'wb') as f: + torch.save(first_stage_model, f) + os.rename(first_stage_model_path + 'cache', + first_stage_model_path) + self.logger.info( + 'First stage model has been processed.') + if cfg.have('COND_STAGE_MODEL'): + with open(cond_stage_model_path + 'cache', 'wb') as f: + torch.save(cond_stage_model, f) + os.rename(cond_stage_model_path + 'cache', + cond_stage_model_path) + self.logger.info( + 'Cond stage model has been processed.') + if cfg.have('DIFFUSION_MODEL'): + with open(diffusion_model_path + 'cache', 'wb') as f: + torch.save(diffusion_model, f) + os.rename(diffusion_model_path + 'cache', + diffusion_model_path) + self.logger.info('Diffusion model has been processed.') + if not cfg.FIRST_STAGE_MODEL.get('PRETRAINED_MODEL', None): + cfg.FIRST_STAGE_MODEL.PRETRAINED_MODEL = first_stage_model_path + else: + cfg.FIRST_STAGE_MODEL.RELOAD_MODEL = first_stage_model_path + if not cfg.COND_STAGE_MODEL.get('PRETRAINED_MODEL', None): + cfg.COND_STAGE_MODEL.PRETRAINED_MODEL = cond_stage_model_path + else: + cfg.COND_STAGE_MODEL.RELOAD_MODEL = cond_stage_model_path + if not cfg.DIFFUSION_MODEL.get('PRETRAINED_MODEL', None): + cfg.DIFFUSION_MODEL.PRETRAINED_MODEL = diffusion_model_path + else: + cfg.DIFFUSION_MODEL.RELOAD_MODEL = diffusion_model_path + return cfg + + def init_from_modules(self, modules): + for k, v in modules.items(): + self.__setattr__(k, v) + + def infer_model(self, cfg, module_paras=None): + module = { + 'model': None, + 'cfg': cfg, + 'device': 'offline', + 'name': cfg.NAME, + 'function_info': {}, + 'paras': {} + } + if module_paras is None: + return module + function_info = {} + paras = { + k.lower(): v + for k, v in module_paras.get('PARAS', {}).items() + } + for function in module_paras.get('FUNCTION', []): + input_dict = {} + for inp in function.get('INPUT', []): + if inp.lower() in self.input: + input_dict[inp.lower()] = self.input[inp.lower()] + function_info[function.NAME] = { + 'dtype': function.get('DTYPE', 'float32'), + 'input': input_dict + } + module['paras'] = paras + module['function_info'] = function_info + return module + + def init_from_ckpt(self, path, model, ignore_keys=list()): + if path.endswith('safetensors'): + from safetensors.torch import load_file as load_safetensors + sd = load_safetensors(path) + else: + sd = torch.load(path, map_location='cpu') + + new_sd = OrderedDict() + for k, v in sd.items(): + ignored = False + for ik in ignore_keys: + if ik in k: + if we.rank == 0: + self.logger.info( + 'Ignore key {} from state_dict.'.format(k)) + ignored = True + break + if not ignored: + new_sd[k] = v + + missing, unexpected = model.load_state_dict(new_sd, strict=False) + if we.rank == 0: + self.logger.info( + f'Restored from {path} with {len(missing)} missing and {len(unexpected)} unexpected keys' + ) + if len(missing) > 0: + self.logger.info(f'Missing Keys:\n {missing}') + if len(unexpected) > 0: + self.logger.info(f'\nUnexpected Keys:\n {unexpected}') + + def load(self, module): + if module['device'] == 'offline': + if module['cfg'].NAME in MODELS.class_map: + model = MODELS.build(module['cfg'], logger=self.logger).eval() + elif module['cfg'].NAME in BACKBONES.class_map: + model = BACKBONES.build(module['cfg'], + logger=self.logger).eval() + elif module['cfg'].NAME in EMBEDDERS.class_map: + model = EMBEDDERS.build(module['cfg'], + logger=self.logger).eval() + else: + raise NotImplementedError + if module['cfg'].get('RELOAD_MODEL', None): + self.init_from_ckpt(module['cfg'].RELOAD_MODEL, model) + module['model'] = model + module['device'] = 'cpu' + if module['device'] == 'cpu': + module['device'] = we.device_id + module['model'] = module['model'].to(we.device_id) + return module + + def unload(self, module): + module['model'] = module['model'].to('cpu') + module['device'] = 'cpu' + torch.cuda.empty_cache() + torch.cuda.ipc_collect() + return module + + def load_default(self, cfg): + module_paras = {} + if cfg is not None: + self.paras = cfg.PARAS + self.input = {k.lower(): v for k, v in cfg.INPUT.items()} + self.output = {k.lower(): v for k, v in cfg.OUTPUT.items()} + module_paras = cfg.MODULES_PARAS + return module_paras + + def load_schedule(self, cfg): + parameterization = cfg.get('PARAMETERIZATION', 'eps') + assert parameterization in [ + 'eps', 'x0', 'v' + ], 'currently only supporting "eps" and "x0" and "v"' + num_timesteps = cfg.get('TIMESTEPS', 1000) + + schedule_args = { + k.lower(): v + for k, v in cfg.get('SCHEDULE_ARGS', { + 'NAME': 'logsnr_cosine_interp', + 'SCALE_MIN': 2.0, + 'SCALE_MAX': 4.0 + }).items() + } + + zero_terminal_snr = cfg.get('ZERO_TERMINAL_SNR', False) + if zero_terminal_snr: + assert parameterization == 'v', 'Now zero_terminal_snr only support v-prediction mode.' + sigmas = noise_schedule(schedule=schedule_args.pop('name'), + n=num_timesteps, + zero_terminal_snr=zero_terminal_snr, + **schedule_args) + diffusion = GaussianDiffusion(sigmas=sigmas, + prediction_type=parameterization) + return diffusion + + def get_batch(self, value_dict, num_samples=1): + batch = {} + batch_uc = {} + N = num_samples + device = we.device_id + for key in value_dict: + if key == 'prompt': + if not self.tokenizer: + batch['prompt'] = value_dict['prompt'] + batch_uc['prompt'] = value_dict['negative_prompt'] + else: + batch['tokens'] = self.tokenizer(value_dict['prompt']).to( + we.device_id) + batch_uc['tokens'] = self.tokenizer( + value_dict['negative_prompt']).to(we.device_id) + elif key == 'original_size_as_tuple': + batch['original_size_as_tuple'] = (torch.tensor( + value_dict['original_size_as_tuple']).to(device).repeat( + N, 1)) + elif key == 'crop_coords_top_left': + batch['crop_coords_top_left'] = (torch.tensor( + value_dict['crop_coords_top_left']).to(device).repeat( + N, 1)) + elif key == 'aesthetic_score': + batch['aesthetic_score'] = (torch.tensor( + [value_dict['aesthetic_score']]).to(device).repeat(N, 1)) + batch_uc['aesthetic_score'] = (torch.tensor([ + value_dict['negative_aesthetic_score'] + ]).to(device).repeat(N, 1)) + + elif key == 'target_size_as_tuple': + batch['target_size_as_tuple'] = (torch.tensor( + value_dict['target_size_as_tuple']).to(device).repeat( + N, 1)) + elif key == 'image': + batch[key] = self.load_image(value_dict[key], num_samples=N) + else: + batch[key] = value_dict[key] + + for key in batch.keys(): + if key not in batch_uc and isinstance(batch[key], torch.Tensor): + batch_uc[key] = torch.clone(batch[key]) + return batch, batch_uc + + def load_image(self, image, num_samples=1): + if isinstance(image, torch.Tensor): + pass + elif isinstance(image, Image): + pass + elif isinstance(image, Image): + pass + + def get_function_info(self, module, function_name=None): + all_function = module['function_info'] + if function_name in all_function: + return function_name, all_function[function_name]['dtype'] + if function_name is None and len(all_function) == 1: + for k, v in all_function.items(): + return k, v['dtype'] + + def encode_first_stage(self, x, **kwargs): + _, dtype = self.get_function_info(self.first_stage_model, 'encode') + with torch.autocast('cuda', + enabled=dtype == 'float16', + dtype=getattr(torch, dtype)): + z = get_model(self.first_stage_model).encode(x) + return self.first_stage_model['paras']['scale_factor'] * z + + def decode_first_stage(self, z): + _, dtype = self.get_function_info(self.first_stage_model, 'encode') + with torch.autocast('cuda', + enabled=dtype == 'float16', + dtype=getattr(torch, dtype)): + z = 1. / self.first_stage_model['paras']['scale_factor'] * z + return get_model(self.first_stage_model).decode(z) + + @torch.no_grad() + def __call__(self, + input, + num_samples=1, + intermediate_callback=None, + refine_strength=0, + img_to_img_strength=0, + cat_uc=True, + tuner_model=None, + control_model=None, + **kwargs): + + value_input = copy.deepcopy(self.input) + value_input.update(input) + print(value_input) + height, width = value_input['target_size_as_tuple'] + value_output = copy.deepcopy(self.output) + batch, batch_uc = self.get_batch(value_input, num_samples=1) + # + if not isinstance(tuner_model, list): + tuner_model = [tuner_model] + for tuner in tuner_model: + if tuner is None or tuner == '': + tuner_model.remove(tuner) + self.register_tuner(tuner_model) + # control_cond_image + control_cond_image = kwargs.pop('control_cond_image', None) + # crop_type = kwargs.pop('crop_type', 'center_crop') + hints = [] + if control_cond_image and control_model: + if not isinstance(control_model, list): + control_model = [control_model] + if not isinstance(control_cond_image, list): + control_cond_image = [control_cond_image] + assert len(control_cond_image) == len(control_model) + for img in control_cond_image: + if isinstance(img, Image): + w, h = img.size + if not h == height or not w == width: + img = TT.Resize(min(height, width))(img) + img = TT.CenterCrop((height, width))(img) + hint = TT.ToTensor()(img) + hints.append(hint) + else: + raise NotImplementedError + if len(hints) > 0: + hints = torch.stack(hints).to(we.device_id) + else: + hints = None + + # first stage encode + image = input.pop('image', None) + if image is not None and img_to_img_strength > 0: + # run image2image + b, c, ori_width, ori_height = image.shape + if not (ori_width == width and ori_height == height): + image = F.interpolate(image, (width, height), mode='bicubic') + self.first_stage_model = self.load(self.first_stage_model) + input_latent = self.encode_first_stage(image) + self.first_stage_model = self.unload(self.first_stage_model) + else: + input_latent = None + if 'input_latent' in value_output and input_latent is not None: + value_output['input_latent'] = input_latent + # cond stage + self.cond_stage_model = self.load(self.cond_stage_model) + function_name, dtype = self.get_function_info(self.cond_stage_model) + with torch.autocast('cuda', + enabled=dtype == 'float16', + dtype=getattr(torch, dtype)): + if self.tokenizer: + context = getattr(get_model(self.cond_stage_model), + function_name)(batch['tokens']) + null_context = getattr(get_model(self.cond_stage_model), + function_name)(batch_uc['tokens']) + else: + context = getattr(get_model(self.cond_stage_model), + function_name)(batch) + null_context = getattr(get_model(self.cond_stage_model), + function_name)(batch_uc) + self.cond_stage_model = self.unload(self.cond_stage_model) + + if refine_strength > 0 and self.refiner_diffusion_model is not None: + assert self.refiner_cond_model is not None + self.refiner_cond_model = self.load(self.refiner_cond_model) + function_name, dtype = self.get_function_info( + self.refiner_cond_model) + with torch.autocast('cuda', + enabled=dtype == 'float16', + dtype=getattr(torch, dtype)): + if self.tokenizer: + refine_context = getattr( + get_model(self.refiner_cond_model), + function_name)(batch['tokens']) + refine_null_context = getattr( + get_model(self.refiner_cond_model), + function_name)(batch_uc['tokens']) + else: + refine_context = getattr( + get_model(self.refiner_cond_model), + function_name)(batch) + refine_null_context = getattr( + get_model(self.refiner_cond_model), + function_name)(batch_uc) + self.refiner_cond_model = self.unload(self.refiner_cond_model) + self.load(self.diffusion_model) + self.register_controllers(control_model) + self.unload(self.diffusion_model) + # get noise + seed = kwargs.pop('seed', -1) + g = torch.Generator(device=we.device_id) + seed = seed if seed >= 0 else random.randint(0, 2**32 - 1) + g.manual_seed(seed) + if 'seed' in value_output: + value_output['seed'] = seed + for sample_id in range(num_samples): + if self.diffusion_model is not None: + noise = torch.empty( + 1, + 4, + height // self.first_stage_model['paras']['size_factor'], + width // self.first_stage_model['paras']['size_factor'], + device=we.device_id).normal_(generator=g) + # + self.load(self.diffusion_model) + # UNet use input n_prompt + function_name, dtype = self.get_function_info( + self.diffusion_model) + with torch.autocast('cuda', + enabled=dtype == 'float16', + dtype=getattr(torch, dtype)): + latent = self.diffusion.sample( + noise=noise, + x=input_latent, + denoising_strength=img_to_img_strength + if input_latent is not None else 1.0, + refine_strength=refine_strength, + solver=value_input.get('sample', 'ddim'), + model=get_model(self.diffusion_model), + model_kwargs=[{ + 'cond': context, + 'hint': hints + }, { + 'cond': null_context, + 'hint': hints + }], + steps=value_input.get('sample_steps', 50), + guide_scale=value_input.get('guide_scale', 7.5), + guide_rescale=value_input.get('guide_rescale', 0.5), + discretization=value_input.get('discretization', + 'trailing'), + show_progress=True, + seed=seed, + condition_fn=None, + clamp=None, + percentile=None, + t_max=None, + t_min=None, + discard_penultimate_step=None, + intermediate_callback=intermediate_callback, + cat_uc=cat_uc, + **kwargs) + self.diffusion_model = self.unload(self.diffusion_model) + + # apply refiner + if refine_strength > 0 and self.refiner_diffusion_model is not None: + assert self.refiner_diffusion_model is not None + # decode intermidiet latent before refine + self.first_stage_model = self.load(self.first_stage_model) + before_refiner_samples = self.decode_first_stage( + latent).float() + self.first_stage_model = self.unload(self.first_stage_model) + + before_refiner_samples = torch.clamp( + (before_refiner_samples + 1.0) / 2.0, min=0.0, max=1.0) + if 'before_refine_images' in value_output: + if value_output['before_refine_images'] is None or ( + isinstance(value_output['before_refine_images'], + list) + and len(value_output['before_refine_images']) < 1): + value_output['before_refine_images'] = [] + value_output['before_refine_images'].append( + before_refiner_samples) + self.refiner_model = self.load(self.refiner_diffusion_model) + function_name, dtype = self.get_function_info( + self.refiner_model) + with torch.autocast('cuda', + enabled=dtype == 'float16', + dtype=getattr(torch, dtype)): + latent = self.diffusion.sample( + noise=noise, + x=latent, + denoising_strength=img_to_img_strength + if input_latent is not None else 1.0, + refine_strength=refine_strength, + refine_stage=True, + solver=value_input.get('refine_sample', 'ddim'), + model=get_model(self.refiner_model), + model_kwargs=[{ + 'cond': refine_context + }, { + 'cond': refine_null_context + }], + steps=value_input.get('sample_steps', 50), + guide_scale=value_input.get('refine_guide_scale', 7.5), + guide_rescale=value_input.get('refine_guide_rescale', + 0.5), + discretization=value_input.get('refine_discretization', + 'trailing'), + show_progress=True, + seed=seed, + condition_fn=None, + clamp=None, + percentile=None, + t_max=None, + t_min=None, + discard_penultimate_step=None, + return_intermediate=None, + intermediate_callback=intermediate_callback, + cat_uc=cat_uc, + **kwargs) + self.refiner_model = self.unload(self.refiner_model) + + if 'latent' in value_output: + if value_output['latent'] is None or ( + isinstance(value_output['latent'], list) + and len(value_output['latent']) < 1): + value_output['latent'] = [] + value_output['latent'].append(latent) + + self.first_stage_model = self.load(self.first_stage_model) + x_samples = self.decode_first_stage(latent).float() + self.first_stage_model = self.unload(self.first_stage_model) + + images = torch.clamp((x_samples + 1.0) / 2.0, min=0.0, max=1.0) + if 'images' in value_output: + if value_output['images'] is None or ( + isinstance(value_output['images'], list) + and len(value_output['images']) < 1): + value_output['images'] = [] + value_output['images'].append(images) + + for k, v in value_output.items(): + if isinstance(v, list): + value_output[k] = torch.cat(v, dim=0) + if isinstance(v, torch.Tensor): + value_output[k] = v.cpu() + return value_output diff --git a/scepter/modules/model/backbone/unet/unet_module.py b/scepter/modules/model/backbone/unet/unet_module.py index b7e399e..9fcb98a 100644 --- a/scepter/modules/model/backbone/unet/unet_module.py +++ b/scepter/modules/model/backbone/unet/unet_module.py @@ -190,6 +190,7 @@ class DiffusionUNet(BaseModel): super().__init__(cfg, logger=logger) self.init_params(cfg) self.construct_network() + self.control_blocks = None def init_params(self, cfg): self.in_channels = cfg.IN_CHANNELS @@ -285,6 +286,7 @@ class DiffusionUNet(BaseModel): ]) self._feature_size = model_channels input_block_chans = [model_channels] + input_down_flag = [False] ch = model_channels ds = 1 for level, mult in enumerate(channel_mult): @@ -323,6 +325,7 @@ class DiffusionUNet(BaseModel): self.input_blocks.append(TimestepEmbedSequential(*layers)) self._feature_size += ch input_block_chans.append(ch) + input_down_flag.append(False) if level != len(channel_mult) - 1: out_ch = ch self.input_blocks.append( @@ -341,9 +344,11 @@ class DiffusionUNet(BaseModel): ) ch = out_ch input_block_chans.append(ch) + input_down_flag.append(True) ds *= 2 self._feature_size += ch self._input_block_chans = copy.deepcopy(input_block_chans) + self._input_down_flag = input_down_flag if num_head_channels == -1: dim_head = ch // num_heads @@ -479,22 +484,7 @@ class DiffusionUNet(BaseModel): if len(unexpected) > 0: self.logger.info(f'\nUnexpected Keys:\n {unexpected}') - def forward(self, x, t=None, cond=dict()): - t_emb = timestep_embedding(t, self.model_channels, repeat_only=False) - emb = self.time_embed(t_emb) - - if isinstance(cond, dict): - if 'y' in cond and cond['y'] is not None: - assert self.num_classes is not None - emb = emb + self.label_emb(cond['y']) - if 'concat' in cond: - c = cond['concat'] - x = torch.cat([x, c], dim=1) - - context = cond.get('crossattn', None) - else: - context = cond - + def _forward_origin(self, x, emb, context, hint=None): hs = [] h = x for module in self.input_blocks: @@ -505,8 +495,76 @@ class DiffusionUNet(BaseModel): h = torch.cat([h, self.lsc_identity[m_id](hs.pop())], dim=1) target_size = hs[-1].shape[-2:] if len(hs) > 0 else None h = module(h, emb, context, target_size) + out = self.out(h) + return out - return self.out(h) + def _forward_control(self, x, emb, context, hint, alpha=0.5): + multi_csc_tuners = self.control_blocks + # hints + multi_hint_hs = [] + for sc_id, csc_tuners in enumerate(multi_csc_tuners): + hint_input = hint[sc_id] if isinstance(hint, list) else hint + hint_h = csc_tuners.pre_hint_blocks(hint_input) + hint_hs = [] + for dsh_blk in csc_tuners.dense_hint_blocks: + hint_h = dsh_blk(hint_h) + hint_hs.append(hint_h) + multi_hint_hs.append(hint_hs) + # unet + hs = [] + h = x + for module in self.input_blocks: + h = module(h, emb, context) + hs.append(h) + h = self.middle_block(h, emb, context) + for m_id, module in enumerate(self.output_blocks): + skip_h = hs.pop() + multi_control_h = 0 + for sc_id, csc_tuners in enumerate(multi_csc_tuners): + hint_h = multi_hint_hs[sc_id][::-1][m_id] + control_h = csc_tuners.lsc_tuner_blocks[m_id]( + skip_h + hint_h, x_shortcut=hint_h) + multi_control_h += csc_tuners.scale * control_h + tuner_h = self.lsc_identity[m_id](skip_h) - skip_h + if torch.all( + torch.isclose(tuner_h, + torch.zeros_like(tuner_h), + atol=1e-6)): + # csc-tuner + skip_h_new = skip_h + multi_control_h + else: + # csc-tuner + sc-tuner + skip_h_new = skip_h + alpha * multi_control_h + ( + 1 - alpha) * tuner_h + h = torch.cat([h, skip_h_new], dim=1) + target_size = hs[-1].shape[-2:] if len(hs) > 0 else None + h = module(h, emb, context, target_size) + out = self.out(h) + return out + + def forward(self, x, t=None, cond=dict(), **kwargs): + t_emb = timestep_embedding(t, self.model_channels, repeat_only=False) + emb = self.time_embed(t_emb) + hint = None + if isinstance(cond, dict): + if 'y' in cond and cond['y'] is not None: + assert self.num_classes is not None + emb = emb + self.label_emb(cond['y']) + if 'concat' in cond: + c = cond['concat'] + x = torch.cat([x, c], dim=1) + if 'hint' in cond: + hint = cond['hint'] + context = cond.get('crossattn', None) + else: + context = cond + hint = kwargs.pop('hint', None) + + if self.control_blocks is not None: + out = self._forward_control(x, emb, context, hint) + else: + out = self._forward_origin(x, emb, context) + return out @staticmethod def get_config_template(): @@ -602,6 +660,7 @@ class DiffusionUNetXL(DiffusionUNet): ]) self._feature_size = model_channels input_block_chans = [model_channels] + input_down_flag = [False] ch = model_channels ds = 1 for level, mult in enumerate(channel_mult): @@ -640,6 +699,7 @@ class DiffusionUNetXL(DiffusionUNet): self.input_blocks.append(TimestepEmbedSequential(*layers)) self._feature_size += ch input_block_chans.append(ch) + input_down_flag.append(False) if level != len(channel_mult) - 1: out_ch = ch self.input_blocks.append( @@ -658,9 +718,11 @@ class DiffusionUNetXL(DiffusionUNet): ) ch = out_ch input_block_chans.append(ch) + input_down_flag.append(True) ds *= 2 self._feature_size += ch self._input_block_chans = copy.deepcopy(input_block_chans) + self._input_down_flag = input_down_flag if num_head_channels == -1: dim_head = ch // num_heads @@ -760,25 +822,7 @@ class DiffusionUNetXL(DiffusionUNet): conv_nd(dims, model_channels, out_channels, 3, padding=1)), ) - def forward(self, x, t=None, cond=dict()): - t_emb = timestep_embedding(t, - self.model_channels, - repeat_only=False, - legacy=True) - emb = self.time_embed(t_emb) - - if isinstance(cond, dict): - if 'y' in cond: - assert self.num_classes is not None - emb = emb + self.label_emb(cond['y']) - if 'concat' in cond: - c = cond['concat'] - x = torch.cat([x, c], dim=1) - - context = cond.get('crossattn', None) - else: - context = cond - + def _forward_origin(self, x, emb, context, hint=None): hs = [] h = x for module in self.input_blocks: @@ -789,8 +833,79 @@ class DiffusionUNetXL(DiffusionUNet): h = torch.cat([h, self.lsc_identity[m_id](hs.pop())], dim=1) target_size = hs[-1].shape[-2:] if len(hs) > 0 else None h = module(h, emb, context, target_size) + out = self.out(h) + return out - return self.out(h) + def _forward_control(self, x, emb, context, hint, alpha=0.5): + multi_csc_tuners = self.control_blocks + # hints + multi_hint_hs = [] + for sc_id, csc_tuners in enumerate(multi_csc_tuners): + hint_input = hint[sc_id] if isinstance(hint, list) else hint + hint_h = csc_tuners.pre_hint_blocks(hint_input) + hint_hs = [] + for dsh_blk in csc_tuners.dense_hint_blocks: + hint_h = dsh_blk(hint_h) + hint_hs.append(hint_h) + multi_hint_hs.append(hint_hs) + # unet + hs = [] + h = x + for module in self.input_blocks: + h = module(h, emb, context) + hs.append(h) + h = self.middle_block(h, emb, context) + for m_id, module in enumerate(self.output_blocks): + skip_h = hs.pop() + multi_control_h = 0 + for sc_id, csc_tuners in enumerate(multi_csc_tuners): + hint_h = multi_hint_hs[sc_id][::-1][m_id] + control_h = csc_tuners.lsc_tuner_blocks[m_id]( + skip_h + hint_h, x_shortcut=hint_h) + multi_control_h += csc_tuners.scale * control_h + tuner_h = self.lsc_identity[m_id](skip_h) - skip_h + if torch.all( + torch.isclose(tuner_h, + torch.zeros_like(tuner_h), + atol=1e-6)): + # csc-tuner + skip_h_new = skip_h + multi_control_h + else: + # csc-tuner + sc-tuner + skip_h_new = skip_h + alpha * multi_control_h + ( + 1 - alpha) * tuner_h + h = torch.cat([h, skip_h_new], dim=1) + target_size = hs[-1].shape[-2:] if len(hs) > 0 else None + h = module(h, emb, context, target_size) + out = self.out(h) + return out + + def forward(self, x, t=None, cond=dict(), **kwargs): + t_emb = timestep_embedding(t, + self.model_channels, + repeat_only=False, + legacy=True) + emb = self.time_embed(t_emb) + hint = None + if isinstance(cond, dict): + if 'y' in cond: + assert self.num_classes is not None + emb = emb + self.label_emb(cond['y']) + if 'concat' in cond: + c = cond['concat'] + x = torch.cat([x, c], dim=1) + if 'hint' in cond: + hint = cond['hint'] + context = cond.get('crossattn', None) + else: + context = cond + hint = kwargs.pop('hint', None) + + if self.control_blocks is not None: + out = self._forward_control(x, emb, context, hint) + else: + out = self._forward_origin(x, emb, context) + return out def convert_to_fp16(self): """ diff --git a/scepter/modules/model/embedder/embedder.py b/scepter/modules/model/embedder/embedder.py index e710cef..5cc1d38 100644 --- a/scepter/modules/model/embedder/embedder.py +++ b/scepter/modules/model/embedder/embedder.py @@ -224,16 +224,13 @@ class FrozenOpenCLIPEmbedder(BaseEmbedder): super().__init__(cfg, logger=logger) arch = cfg.get('ARCH', 'ViT-H-14') - if cfg.PRETRAINED_MODEL is None: - model, _, _ = open_clip.create_model_and_transforms( - arch, device=torch.device('cpu'), pretrained=None) - del model.visual - else: + model, _, _ = open_clip.create_model_and_transforms( + arch, device=torch.device('cpu'), pretrained=None) + del model.visual + if cfg.PRETRAINED_MODEL is not None: with FS.get_from(cfg.PRETRAINED_MODEL, wait_finish=True) as local_path: - model, _, _ = open_clip.create_model_and_transforms( - arch, device=torch.device('cpu'), pretrained=local_path) - del model.visual + model.load_state_dict(torch.load(local_path), strict=False) self.model = model self.use_grad = cfg.get('USE_GRAD', False) @@ -362,7 +359,7 @@ class FrozenOpenCLIPEmbedder2(BaseEmbedder): def __init__(self, cfg, logger=None): super().__init__(cfg, logger=logger) arch = cfg.get('ARCH', 'ViT-H-14') - if cfg.PRETRAINED_MODEL is None: + if cfg.get('PRETRAINED_MODEL', None) is None: model, _, _ = open_clip.create_model_and_transforms( arch, device=torch.device('cpu'), pretrained=None) del model.visual diff --git a/scepter/modules/model/network/__init__.py b/scepter/modules/model/network/__init__.py index dda2aba..0e11597 100644 --- a/scepter/modules/model/network/__init__.py +++ b/scepter/modules/model/network/__init__.py @@ -4,4 +4,4 @@ from scepter.modules.model.network.autoencoder import ae_kl from scepter.modules.model.network.classifier import Classifier from scepter.modules.model.network.diffusion import (diffusion, schedules, solvers) -from scepter.modules.model.network.ldm import ldm, ldm_xl +from scepter.modules.model.network.ldm import ldm, ldm_sce, ldm_xl diff --git a/scepter/modules/model/network/diffusion/diffusion.py b/scepter/modules/model/network/diffusion/diffusion.py index ac0240d..5a23c56 100644 --- a/scepter/modules/model/network/diffusion/diffusion.py +++ b/scepter/modules/model/network/diffusion/diffusion.py @@ -159,7 +159,8 @@ class GaussianDiffusion(object): model, model_kwargs={}, reduction='mean', - noise=None): + noise=None, + **kwargs): # hyperparams sigmas = _i(self.sigmas, t, x0) alphas = _i(self.alphas, t, x0) @@ -168,7 +169,7 @@ class GaussianDiffusion(object): if noise is None: noise = torch.randn_like(x0) xt = self.diffuse(x0, t, noise) - out = model(xt, t=t, **model_kwargs) + out = model(xt, t=t, **model_kwargs, **kwargs) # mse loss target = { diff --git a/scepter/modules/model/network/diffusion/solvers.py b/scepter/modules/model/network/diffusion/solvers.py index a8fcb7c..ab4bf22 100644 --- a/scepter/modules/model/network/diffusion/solvers.py +++ b/scepter/modules/model/network/diffusion/solvers.py @@ -54,7 +54,8 @@ def sample_euler(noise, s_tmax=float('inf'), s_noise=1., seed=None, - show_progress=True): + show_progress=True, + **kwargs): """ Implements Algorithm 2 (Euler steps) from Karras et al. (2022). """ @@ -87,7 +88,8 @@ def sample_euler_ancestral(noise, eta=1., s_noise=1., seed=None, - show_progress=True): + show_progress=True, + **kwargs): """ Ancestral sampling with Euler method steps. """ @@ -120,7 +122,8 @@ def sample_heun(noise, s_tmax=float('inf'), s_noise=1., seed=None, - show_progress=True): + show_progress=True, + **kwargs): """ Implements Algorithm 2 (Heun steps) from Karras et al. (2022). """ @@ -165,7 +168,8 @@ def sample_dpm_2(noise, s_tmax=float('inf'), s_noise=1., seed=None, - show_progress=True): + show_progress=True, + **kwargs): """ A sampler inspired by DPM-Solver-2 and Algorithm 2 from Karras et al. (2022). """ @@ -211,7 +215,8 @@ def sample_dpm_2_ancestral(noise, eta=1., s_noise=1., seed=None, - show_progress=True): + show_progress=True, + **kwargs): """ Ancestral sampling with DPM-Solver second-order steps. """ @@ -253,7 +258,8 @@ def sample_dpmpp_2s_ancestral(noise, eta=1., s_noise=1., seed=None, - show_progress=True): + show_progress=True, + **kwargs): """ Ancestral sampling with DPM-Solver++ (2S) second-order steps. """ @@ -372,7 +378,8 @@ def sample_dpmpp_sde(noise, s_noise=1., r=1 / 2, seed=None, - show_progress=True): + show_progress=True, + **kwargs): """ DPM-Solver++ (stochastic). """ @@ -429,7 +436,12 @@ def sample_dpmpp_sde(noise, @torch.no_grad() -def sample_dpmpp_2m(noise, model, sigmas, seed=None, show_progress=True): +def sample_dpmpp_2m(noise, + model, + sigmas, + seed=None, + show_progress=True, + **kwargs): """ DPM-Solver++ (2M). """ @@ -475,7 +487,8 @@ def sample_dpmpp_2m_sde(noise, s_noise=1., solver_type='midpoint', seed=None, - show_progress=True): + show_progress=True, + **kwargs): """ DPM-Solver++ (2M) SDE. """ @@ -527,7 +540,13 @@ def sample_dpmpp_2m_sde(noise, # -------------------- variation preserving (VP) solver --------------------# @torch.no_grad() -def sample_ddim(noise, model, sigmas, eta=0., seed=None, show_progress=True): +def sample_ddim(noise, + model, + sigmas, + eta=0., + seed=None, + show_progress=True, + **kwargs): """ DDIM solver steps. """ @@ -556,7 +575,8 @@ def sample_img2img_euler(noise, s_tmax=float('inf'), s_noise=1., seed=None, - show_progress=True): + show_progress=True, + **kwargs): """ Implements Algorithm 2 (Euler steps) from Karras et al. (2022). """ @@ -588,7 +608,8 @@ def sample_img2img_euler_ancestral(noise, eta=1., s_noise=1., seed=None, - show_progress=True): + show_progress=True, + **kwargs): """ Ancestral sampling with Euler method steps. """ diff --git a/scepter/modules/model/network/ldm/__init__.py b/scepter/modules/model/network/ldm/__init__.py index 30f2253..bb8d1a9 100644 --- a/scepter/modules/model/network/ldm/__init__.py +++ b/scepter/modules/model/network/ldm/__init__.py @@ -1,4 +1,7 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. from scepter.modules.model.network.ldm.ldm import LatentDiffusion +from scepter.modules.model.network.ldm.ldm_sce import ( + LatentDiffusionSCEControl, LatentDiffusionSCETuning, + LatentDiffusionXLSCEControl, LatentDiffusionXLSCETuning) from scepter.modules.model.network.ldm.ldm_xl import LatentDiffusionXL diff --git a/scepter/modules/model/network/ldm/ldm.py b/scepter/modules/model/network/ldm/ldm.py index 5e0ffff..4063bf5 100644 --- a/scepter/modules/model/network/ldm/ldm.py +++ b/scepter/modules/model/network/ldm/ldm.py @@ -241,6 +241,14 @@ class LatentDiffusion(TrainModule): with torch.autocast(device_type='cuda', enabled=False): context = self.encode_condition( self.tokenizer(prompt).to(we.device_id)) + if 'hint' in kwargs and kwargs['hint'] is not None: + hint = kwargs.pop('hint') + if isinstance(context, dict): + context['hint'] = hint + else: + context = {'crossattn': context, 'hint': hint} + else: + hint = None if self.min_snr_gamma is not None: alphas = self.diffusion.alphas.to(we.device_id)[t] sigmas = self.diffusion.sigmas.pow(2).to(we.device_id)[t] @@ -250,11 +258,13 @@ class LatentDiffusion(TrainModule): else: weights = 1 self.register_probe({'snrs_weights': weights}) + loss = self.diffusion.loss(x0=x_start, t=t, model=self.model, model_kwargs={'cond': context}, - noise=noise) + noise=noise, + **kwargs) loss = loss * weights loss = loss.mean() ret = {'loss': loss, 'probe_data': {'prompt': prompt}} @@ -305,7 +315,18 @@ class LatentDiffusion(TrainModule): null_context = self.encode_condition(self.tokenizer(n_prompt).to( we.device_id), method=method) - + if 'hint' in kwargs and kwargs['hint'] is not None: + hint = kwargs.pop('hint') + if isinstance(context, dict): + context['hint'] = hint + else: + context = {'crossattn': context, 'hint': hint} + if isinstance(null_context, dict): + null_context['hint'] = hint + else: + null_context = {'crossattn': null_context, 'hint': hint} + else: + hint = None if 'index' in kwargs: kwargs.pop('index') image_size = None @@ -317,7 +338,9 @@ class LatentDiffusion(TrainModule): image_size = [h, w] if 'image_size' in kwargs: image_size = kwargs.pop('image_size') - if image_size is None or isinstance(image_size, numbers.Number): + if isinstance(image_size, numbers.Number): + image_size = [image_size, image_size] + if image_size is None: image_size = [1024, 1024] height, width = image_size noise = self.noise_sample(num_samples, height // self.size_factor, @@ -387,9 +410,11 @@ class LatentDiffusion(TrainModule): t_x_samples = [None for _ in prompt] outputs = list() - for p, np, tnp, img, t_img in zip(prompt, n_prompt, train_n_prompt, - x_samples, t_x_samples): + for i, (p, np, tnp, img, t_img) in enumerate( + zip(prompt, n_prompt, train_n_prompt, x_samples, t_x_samples)): one_tup = {'prompt': p, 'n_prompt': np, 'image': img} + if hint is not None: + one_tup.update({'hint': hint[i]}) if t_img is not None: one_tup['train_n_prompt'] = tnp one_tup['train_n_image'] = t_img @@ -408,6 +433,8 @@ class LatentDiffusion(TrainModule): 'prompt': res['prompt'], 'n_prompt': res['n_prompt'] } + if 'hint' in res: + one_tup.update({'hint': res['hint']}) if 'train_n_prompt' in res: one_tup['train_n_prompt'] = res['train_n_prompt'] one_tup['train_n_image'] = res['train_n_image'] diff --git a/scepter/modules/model/network/ldm/ldm_sce.py b/scepter/modules/model/network/ldm/ldm_sce.py new file mode 100644 index 0000000..e398953 --- /dev/null +++ b/scepter/modules/model/network/ldm/ldm_sce.py @@ -0,0 +1,156 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import copy + +import torch +import torch.nn as nn +import torchvision.transforms as TT + +from scepter.modules.annotator.registry import ANNOTATORS +from scepter.modules.model.registry import MODELS, TUNERS +from scepter.modules.utils.config import Config, dict_to_yaml + +from .ldm import LatentDiffusion +from .ldm_xl import LatentDiffusionXL + + +@MODELS.register_class() +class LatentDiffusionSCETuning(LatentDiffusion): + para_dict = {} + para_dict.update(LatentDiffusion.para_dict) + + def __init__(self, cfg, logger): + super().__init__(cfg, logger=logger) + + def init_params(self): + super().init_params() + self.tuner_model_config = self.cfg.TUNER_MODEL + + def construct_network(self): + super().construct_network() + input_block_channels = self.model._input_block_chans + sc_tuner_cfg = self.tuner_model_config['SC_TUNER_CFG'] + use_layers = self.tuner_model_config.get('USE_LAYERS', None) + lsc_tuner_blocks = nn.ModuleList([]) + for i, chan in enumerate(input_block_channels[::-1]): + if use_layers and i not in use_layers: + lsc_tuner_blocks.append(nn.Identity()) + continue + tuner_cfg = copy.deepcopy(sc_tuner_cfg) + tuner_cfg['DIM'] = chan + tuner_cfg['TUNER_LENGTH'] = int(chan * + tuner_cfg.get('DOWN_RATIO', 1.0)) + sc_tuner = TUNERS.build(tuner_cfg, logger=self.logger) + lsc_tuner_blocks.append(sc_tuner) + self.model.lsc_identity = lsc_tuner_blocks + + def save_pretrained(self, + *args, + destination=None, + prefix='', + keep_vars=False): + save_state = { + key: value + for key, value in self.state_dict().items() + if 'lsc_identity' in key + } + return save_state + + def save_pretrained_config(self): + return copy.deepcopy(self.cfg.TUNER_MODEL.cfg_dict) + + @staticmethod + def get_config_template(): + return dict_to_yaml('MODELS', + __class__.__name__, + LatentDiffusionSCETuning.para_dict, + set_name=True) + + +@MODELS.register_class() +class LatentDiffusionXLSCETuning(LatentDiffusionSCETuning, LatentDiffusionXL): + pass + + +@MODELS.register_class() +class LatentDiffusionSCEControl(LatentDiffusion): + para_dict = { + 'CONTROL_MODEL': {}, + } + para_dict.update(LatentDiffusion.para_dict) + + def __init__(self, cfg, logger): + super().__init__(cfg, logger=logger) + + def init_params(self): + super().init_params() + self.control_model_config = self.cfg.CONTROL_MODEL + self.control_anno_config = self.cfg.CONTROL_ANNO + + def construct_network(self): + super().construct_network() + # anno + self.control_processor = ANNOTATORS.build(self.control_anno_config) + if isinstance(self.control_model_config, (dict, Config)): + self.control_model_config = [self.control_model_config] + control_model = nn.ModuleList([]) + for k, sub_cfg in enumerate(self.control_model_config): + sub_cfg['INPUT_BLOCK_CHANS'] = self.model._input_block_chans + sub_cfg['INPUT_DOWN_FLAG'] = self.model._input_down_flag + csc_tuners = TUNERS.build(sub_cfg, logger=self.logger) + control_model.append(csc_tuners) + self.model.control_blocks = control_model + + @torch.no_grad() + def get_control_input(self, control, *args, **kwargs): + hints = [] + for ctr in control: + hint = self.control_processor(ctr) + hint = TT.ToTensor()(hint) + hints.append(hint) + hints = torch.stack(hints).to(control.device) + return hints + + def forward_train(self, **kwargs): + # if ('module' not in kwargs) or ('module' in kwargs and self.control_method not in kwargs['module']): + # kwargs['module'] = {self.control_method: self.control_model} + if 'hint' not in kwargs and 'image_preprocess' in kwargs: + image_preprocess = kwargs.pop('image_preprocess') + kwargs['hint'] = self.get_control_input(image_preprocess) + return super().forward_train(**kwargs) + + @torch.no_grad() + @torch.autocast('cuda', dtype=torch.float16) + def forward_test(self, **kwargs): + # if ('module' not in kwargs) or ('module' in kwargs and self.control_method not in kwargs['module']): + # kwargs['module'] = {self.control_method: self.control_model} + if 'hint' not in kwargs and 'image_preprocess' in kwargs: + image_preprocess = kwargs.pop('image_preprocess') + kwargs['hint'] = self.get_control_input(image_preprocess) + kwargs['image_size'] = kwargs['hint'].shape[-2:] + return super().forward_test(**kwargs) + + def save_pretrained(self, + *args, + destination=None, + prefix='', + keep_vars=False): + return self.model.control_blocks.state_dict(*args, + destination=destination, + keep_vars=keep_vars) + + def save_pretrained_config(self): + return copy.deepcopy(self.cfg.CONTROL_MODEL.cfg_dict) + + @staticmethod + def get_config_template(): + return dict_to_yaml('MODELS', + __class__.__name__, + LatentDiffusionSCEControl.para_dict, + set_name=True) + + +@MODELS.register_class() +class LatentDiffusionXLSCEControl(LatentDiffusionSCEControl, + LatentDiffusionXL): + pass diff --git a/scepter/modules/model/network/ldm/ldm_xl.py b/scepter/modules/model/network/ldm/ldm_xl.py index a02edf2..0730670 100644 --- a/scepter/modules/model/network/ldm/ldm_xl.py +++ b/scepter/modules/model/network/ldm/ldm_xl.py @@ -176,7 +176,14 @@ class LatentDiffusionXL(LatentDiffusion): continue batch[key] = kwargs[key].to(we.device_id) context = getattr(self.cond_stage_model, 'encode')(batch) - + if 'hint' in kwargs and kwargs['hint'] is not None: + hint = kwargs.pop('hint') + if isinstance(context, dict): + context['hint'] = hint + else: + context = {'crossattn': context, 'hint': hint} + else: + hint = None if self.min_snr_gamma is not None: alphas = self.diffusion.alphas.to(we.device_id)[t] sigmas = self.diffusion.sigmas.pow(2).to(we.device_id)[t] @@ -190,7 +197,8 @@ class LatentDiffusionXL(LatentDiffusion): t=t, model=self.model, model_kwargs={'cond': context}, - noise=noise) + noise=noise, + **kwargs) loss = loss * weights loss = loss.mean() ret = {'loss': loss, 'probe_data': {'prompt': prompt}} @@ -273,6 +281,19 @@ class LatentDiffusionXL(LatentDiffusion): context = getattr(self.cond_stage_model, 'encode')(batch) null_context = getattr(self.cond_stage_model, 'encode')(batch_uc) + if 'hint' in kwargs and kwargs['hint'] is not None: + hint = kwargs.pop('hint') + if isinstance(context, dict): + context['hint'] = hint + else: + context = {'crossattn': context, 'hint': hint} + if isinstance(null_context, dict): + null_context['hint'] = hint + else: + null_context = {'crossattn': null_context, 'hint': hint} + else: + hint = None + if 'index' in kwargs: kwargs.pop('index') height, width = batch['target_size_as_tuple'][0].cpu().numpy().tolist() @@ -482,15 +503,18 @@ class LatentDiffusionXL(LatentDiffusion): before_refiner_t_samples = [None for _ in prompt] outputs = list() - for p, np, tnp, img, r_img, t_img, r_t_img in zip( - prompt, n_prompt, train_n_prompt, x_samples, - before_refiner_samples, t_x_samples, before_refiner_t_samples): + for i, (p, np, tnp, img, r_img, t_img, r_t_img) in enumerate( + zip(prompt, n_prompt, train_n_prompt, x_samples, + before_refiner_samples, t_x_samples, + before_refiner_t_samples)): one_tup = { 'prompt': p, 'n_prompt': np, 'image': img, 'before_refiner_image': r_img } + if hint is not None: + one_tup.update({'hint': hint[i]}) if t_img is not None: one_tup['train_n_prompt'] = tnp one_tup['train_n_image'] = t_img diff --git a/scepter/modules/model/tuner/__init__.py b/scepter/modules/model/tuner/__init__.py index 3ecebea..097158f 100644 --- a/scepter/modules/model/tuner/__init__.py +++ b/scepter/modules/model/tuner/__init__.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. +from scepter.modules.model.tuner import sce from scepter.modules.model.tuner.swift_tuner import (SwiftAdapter, SwiftFull, SwiftLoRA) diff --git a/scepter/modules/model/tuner/sce/__init__.py b/scepter/modules/model/tuner/sce/__init__.py new file mode 100644 index 0000000..8c549fe --- /dev/null +++ b/scepter/modules/model/tuner/sce/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +from scepter.modules.model.tuner.sce.scetuning import CSCTuners, SCTuner +from scepter.modules.model.tuner.sce.scetuning_component import SCEAdapter diff --git a/scepter/modules/model/tuner/sce/scetuning.py b/scepter/modules/model/tuner/sce/scetuning.py new file mode 100644 index 0000000..667aa6e --- /dev/null +++ b/scepter/modules/model/tuner/sce/scetuning.py @@ -0,0 +1,178 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +from collections import OrderedDict + +import torch +import torch.nn as nn + +from scepter.modules.model.registry import TUNERS +from scepter.modules.model.tuner.base_tuner import BaseTuner +from scepter.modules.model.tuner.tuner_component import conv_nd, zero_module +from scepter.modules.utils.config import dict_to_yaml +from scepter.modules.utils.file_system import FS + + +@TUNERS.register_class() +class SCTuner(BaseTuner): + def __init__(self, cfg, logger=None): + super().__init__(cfg, logger=logger) + self.logger = logger + dim = cfg['DIM'] + tuner_length = cfg['TUNER_LENGTH'] + tuner_name = cfg.get('TUNER_NAME', 'SCEAdapter') + self.tuner_name = tuner_name + if tuner_name == 'SCEAdapter': + from .scetuning_component import SCEAdapter + self.tuner_op = SCEAdapter(dim=dim, adapter_length=tuner_length) + else: + raise Exception(f'Error tuner op {tuner_name}') + + def forward(self, x, x_shortcut=None, use_shortcut=True, **kwargs): + if self.tuner_name == 'SCEAdapter': + out = self.tuner_op(x, x_shortcut, use_shortcut) + else: + out = x + return out + + @staticmethod + def get_config_template(): + return dict_to_yaml('TUNERS', + __class__.__name__, + SCTuner.para_dict, + set_name=True) + + +@TUNERS.register_class() +class CSCTuners(BaseTuner): + def __init__(self, cfg, logger=None): + super().__init__(cfg, logger=logger) + self.logger = logger + input_block_channels = cfg['INPUT_BLOCK_CHANS'] + input_down_flag = cfg['INPUT_DOWN_FLAG'] + assert len(input_block_channels) == len(input_down_flag) + pre_hint_in_channels = cfg.get('PRE_HINT_IN_CHANNELS', 3) + pre_hint_out_channels = cfg.get('PRE_HINT_OUT_CHANNELS', 256) + pre_hint_dim_ratio = cfg.get('PRE_HINT_DIM_RATIO', 1.0) + dense_hint_kernal = cfg.get('DENSE_HINT_KERNAL', 3) + sc_tuner_cfg = cfg['SC_TUNER_CFG'] + use_layers = cfg.get('USE_LAYERS', None) + self.pretrained_model = cfg.get('PRETRAINED_MODEL', None) + self.scale = cfg.get('SCALE', 1.0) + self.method = 'csctuning' + + # pre_hint + dims = 2 + ch = pre_hint_out_channels + self.pre_hint_blocks = nn.Sequential( + conv_nd(dims, + pre_hint_in_channels, + int(16 * pre_hint_dim_ratio), + 3, + padding=1), + nn.SiLU(), + conv_nd(dims, + int(16 * pre_hint_dim_ratio), + int(16 * pre_hint_dim_ratio), + 3, + padding=1), + nn.SiLU(), + conv_nd(dims, + int(16 * pre_hint_dim_ratio), + int(32 * pre_hint_dim_ratio), + 3, + padding=1, + stride=2), + nn.SiLU(), + conv_nd(dims, + int(32 * pre_hint_dim_ratio), + int(32 * pre_hint_dim_ratio), + 3, + padding=1), + nn.SiLU(), + conv_nd(dims, + int(32 * pre_hint_dim_ratio), + int(96 * pre_hint_dim_ratio), + 3, + padding=1, + stride=2), + nn.SiLU(), + conv_nd(dims, + int(96 * pre_hint_dim_ratio), + int(96 * pre_hint_dim_ratio), + 3, + padding=1), + nn.SiLU(), + conv_nd(dims, + int(96 * pre_hint_dim_ratio), + ch, + 3, + padding=1, + stride=2), + ) + # dense_hint + self.dense_hint_blocks = nn.ModuleList([]) + stride_list = [2 if flag else 1 for flag in input_down_flag] + for i, chan in enumerate(input_block_channels): + if use_layers and i not in use_layers: + self.dense_hint_blocks.append(nn.Identity()) + continue + self.dense_hint_blocks.append( + nn.Sequential( + nn.SiLU(), + zero_module( + conv_nd(dims, + ch, + chan, + dense_hint_kernal, + padding=1, + stride=stride_list[i])) + if dense_hint_kernal == 3 else zero_module( + conv_nd(dims, + ch, + chan, + dense_hint_kernal, + padding=0, + stride=stride_list[i])))) + ch = chan + # tuner + self.lsc_tuner_blocks = nn.ModuleList([]) + for i, chan in enumerate(input_block_channels[::-1]): + if use_layers and i not in use_layers: + self.lsc_tuner_blocks.append(nn.Identity()) + continue + sc_tuner_cfg['DIM'] = chan + sc_tuner_cfg['TUNER_LENGTH'] = int(chan * + cfg.get('DOWN_RATIO', 1.0)) + sc_tuner = TUNERS.build(sc_tuner_cfg, logger=self.logger) + self.lsc_tuner_blocks.append(sc_tuner) + + def load_pretrained_model(self, pretrained_model): + if self.pretrained_model: + with FS.get_from(self.pretrained_model, + wait_finish=True) as local_path: + self.init_from_ckpt(local_path) + + def init_from_ckpt(self, path): + model_new = OrderedDict() + model = torch.load(path, map_location='cpu') + for k, v in model.items(): + if k.startswith('model.'): + k = k[len('model.'):] + if k.startswith('0.'): + k = k[len('0.'):] + model_new[k] = v + missing, unexpected = self.load_state_dict(model_new, strict=False) + print( + f'Restored from {path} with {len(missing)} missing and {len(unexpected)} unexpected keys' + ) + if len(missing) > 0: + print(f'Missing Keys:\n {missing}') + if len(unexpected) > 0: + print(f'\nUnexpected Keys:\n {unexpected}') + + @staticmethod + def get_config_template(): + return dict_to_yaml('TUNERS', + __class__.__name__, + CSCTuners.para_dict, + set_name=True) diff --git a/scepter/modules/model/tuner/sce/scetuning_component.py b/scepter/modules/model/tuner/sce/scetuning_component.py new file mode 100644 index 0000000..c5520e6 --- /dev/null +++ b/scepter/modules/model/tuner/sce/scetuning_component.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import math + +import torch.nn as nn + +from scepter.modules.model.tuner.tuner_utils import (choose_weight_type, + get_weight_value) + + +class SCEAdapter(nn.Module): + def __init__(self, + dim, + adapter_length, + adapter_type=None, + adapter_weight=None, + act_layer=nn.GELU, + zero_init_last=True, + use_bias=True): + super(SCEAdapter, self).__init__() + self.dim = dim + self.adapter_length = adapter_length + self.adapter_type = adapter_type + self.adapter_weight = adapter_weight + self.zero_init_last = zero_init_last + self.use_bias = use_bias + self.ln1 = nn.Linear(dim, adapter_length, bias=use_bias) + self.activate = act_layer() + self.ln2 = nn.Linear(adapter_length, dim, bias=use_bias) + self.init_weights() + self.init_scaling() + + def _zero_init_weights(self, m): + if isinstance(m, nn.Linear): + nn.init.zeros_(m.weight) + if self.use_bias: + nn.init.zeros_(m.bias) + + def _kaiming_init_weights(self, m): + if isinstance(m, nn.Linear): + nn.init.kaiming_uniform_(m.weight, a=math.sqrt(5)) + + def init_weights(self): + self._kaiming_init_weights(self.ln1) + if self.zero_init_last: + self._zero_init_weights(self.ln2) + else: + self._kaiming_init_weights(self.ln2) + + def init_scaling(self): + if self.adapter_weight: + self.scaling = choose_weight_type(self.adapter_weight, self.dim) + else: + self.scaling = None + + def forward(self, x, x_shortcut=None, use_shortcut=True, **kwargs): + if x_shortcut is None: + x_shortcut = x + x_shape = x.shape + if len(x_shape) == 4: + b, d, h, w = x_shape + x = x.permute(0, 2, 3, 1).reshape(b, h * w, d) + out = self.ln2(self.activate(self.ln1(x))) + if self.adapter_weight: + scaling = get_weight_value(self.adapter_weight, self.scaling, out) + out = out * scaling if scaling is not None else out + if len(x_shape) == 4: + b, d, h, w = x_shape + out = out.reshape(b, h, w, -1).permute(0, 3, 1, 2).contiguous() + if use_shortcut: + out = x_shortcut + out + return out diff --git a/scepter/modules/model/tuner/swift_tuner.py b/scepter/modules/model/tuner/swift_tuner.py index df877ff..f4890e6 100644 --- a/scepter/modules/model/tuner/swift_tuner.py +++ b/scepter/modules/model/tuner/swift_tuner.py @@ -104,6 +104,7 @@ class SwiftAdapter(BaseTuner): SwiftAdapter.para_dict, set_name=True) + @TUNERS.register_class() class SwiftSCETuning(BaseTuner): para_dict = { diff --git a/scepter/modules/model/tuner/tuner_component.py b/scepter/modules/model/tuner/tuner_component.py index bd2183f..25c6c9e 100644 --- a/scepter/modules/model/tuner/tuner_component.py +++ b/scepter/modules/model/tuner/tuner_component.py @@ -6,6 +6,28 @@ import torch import torch.nn as nn +def conv_nd(dims, *args, **kwargs): + """ + Create a 1D, 2D, or 3D convolution module. + """ + if dims == 1: + return nn.Conv1d(*args, **kwargs) + elif dims == 2: + return nn.Conv2d(*args, **kwargs) + elif dims == 3: + return nn.Conv3d(*args, **kwargs) + raise ValueError(f'unsupported dimensions: {dims}') + + +def zero_module(module): + """ + Zero out the parameters of a module and return it. + """ + for p in module.parameters(): + p.detach().zero_() + return module + + class Prompt(nn.Module): """The implementation of vision prompt tuning method. diff --git a/scepter/modules/solver/base_solver.py b/scepter/modules/solver/base_solver.py index e62d59c..c7b49ae 100644 --- a/scepter/modules/solver/base_solver.py +++ b/scepter/modules/solver/base_solver.py @@ -110,7 +110,7 @@ try: self.solver.after_epoch(self.solver.hooks_dict['test']) def setup(self, stage: str) -> None: - self.solver.logger = get_logger(name='std_torch') + self.solver.logger = get_logger(name='scepter') self.solver._prefix = FS.init_fs_client(self.solver.file_system, logger=self.solver.logger) self.solver._local_rank = self.global_rank diff --git a/scepter/modules/solver/diffusion_solver.py b/scepter/modules/solver/diffusion_solver.py index f2705ae..3b5b3e9 100644 --- a/scepter/modules/solver/diffusion_solver.py +++ b/scepter/modules/solver/diffusion_solver.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. +import copy import os from collections import OrderedDict, defaultdict @@ -97,6 +98,8 @@ class LatentDiffusionSolver(BaseSolver): def __init__(self, cfg, logger=None): super().__init__(cfg, logger=logger) self.max_steps = cfg.MAX_STEPS + if self.max_steps > 0: + self.max_epochs = -1 self.use_amp = cfg.get('USE_AMP', False) self.dtype = getattr(torch, cfg.DTYPE) self.use_fairscale = cfg.get('USE_FAIRSCALE', False) @@ -297,6 +300,25 @@ class LatentDiffusionSolver(BaseSolver): ckpt['scaler'] = self.scaler.state_dict() return ckpt + def save_pretrained(self): + if hasattr(self.model, 'save_pretrained'): + ckpt = self.model.save_pretrained() + elif hasattr(self.model, 'module') and hasattr(self.model.module, + 'save_pretrained'): + ckpt = self.model.module.save_pretrained() + else: + ckpt = dict() + if hasattr(self.model, 'save_pretrained_config'): + cfg = self.model.save_pretrained_config() + elif hasattr(self.model, 'module') and hasattr( + self.model.module, 'save_pretrained_config'): + cfg = self.model.module.save_pretrained_config() + else: + cfg = copy.deepcopy(self.cfg.MODEL.cfg_dict) + if 'FILE_SYSTEM' in cfg: + cfg.pop('FILE_SYSTEM') + return ckpt, cfg + def solve(self): self.before_solve() if 'train' in self._mode_set: @@ -366,8 +388,17 @@ class LatentDiffusionSolver(BaseSolver): log_data, log_label, ori_label = [], [], [] for result in all_results: # the inference image use - log_data.append((result['image'].permute(1, 2, 0).cpu().numpy() * - 255).astype(np.uint8)) + if 'hint' in result: + merge_image = torch.cat([ + result['hint'][:result['image'].shape[0]], result['image'] + ], + dim=2) + log_data.append((merge_image.permute(1, 2, 0).cpu().numpy() * + 255).astype(np.uint8)) + else: + log_data.append( + (result['image'].permute(1, 2, 0).cpu().numpy() * + 255).astype(np.uint8)) log_label.append(result['prompt'] + ' NegPrompt: ' + result['n_prompt']) ori_label.append(result['prompt']) @@ -385,9 +416,18 @@ class LatentDiffusionSolver(BaseSolver): for result in all_results: # the inference image use if 'train_n_image' in result: - log_data.append( - (result['train_n_image'].permute(1, 2, 0).cpu().numpy() * - 255).astype(np.uint8)) + if 'hint' in result: + merge_image = torch.cat([ + result['hint'][:result['train_n_image'].shape[0]], + result['train_n_image'] + ], + dim=2) + log_data.append( + (merge_image.permute(1, 2, 0).cpu().numpy() * + 255).astype(np.uint8)) + else: + log_data.append((result['train_n_image'].permute( + 1, 2, 0).cpu().numpy() * 255).astype(np.uint8)) log_label.append(result['prompt'] + 'NegPrompt' + result['train_n_prompt']) ori_label.append(result['prompt']) @@ -578,8 +618,16 @@ class LatentDiffusionSolver(BaseSolver): transfer_data_to_cuda(self.current_batch_data[self.mode])) log_data, log_label = [], [] for result in outputs: - merge_image = torch.cat([result['orig'], result['recon']], - dim=2) + if 'hint' in result: + merge_image = torch.cat([ + result['orig'], + result['hint'][:result['orig'].shape[0]], + result['recon'] + ], + dim=2) + else: + merge_image = torch.cat([result['orig'], result['recon']], + dim=2) log_data.append((merge_image.permute(1, 2, 0).cpu().numpy() * 255).astype(np.uint8)) log_label.append('recon image: ' + result['prompt'] + @@ -599,8 +647,16 @@ class LatentDiffusionSolver(BaseSolver): log_data, log_label = [], [] for result in outputs: if 'train_n_image' in result: - merge_image = torch.cat( - [result['orig'], result['train_n_image']], dim=2) + if 'hint' in result: + merge_image = torch.cat([ + result['orig'], + result['hint'][:result['orig'].shape[0]], + result['train_n_image'] + ], + dim=2) + else: + merge_image = torch.cat( + [result['orig'], result['train_n_image']], dim=2) log_data.append( (merge_image.permute(1, 2, 0).cpu().numpy() * 255).astype(np.uint8)) diff --git a/scepter/modules/solver/hooks/checkpoint.py b/scepter/modules/solver/hooks/checkpoint.py index ec38d81..45b91cc 100644 --- a/scepter/modules/solver/hooks/checkpoint.py +++ b/scepter/modules/solver/hooks/checkpoint.py @@ -1,11 +1,15 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. +import json +import os import os.path as osp +import shutil import sys import warnings import torch import torch.distributed as du +from swift import push_to_hub from scepter.modules.solver.hooks.hook import Hook from scepter.modules.solver.hooks.registry import HOOKS @@ -56,6 +60,9 @@ class CheckpointHook(Hook): self.save_last = cfg.get('SAVE_LAST', False) self.save_best = cfg.get('SAVE_BEST', False) self.save_best_by = cfg.get('SAVE_BEST_BY', '') + self.push_to_hub = cfg.get('PUSH_TO_HUB', False) + self.hub_model_id = cfg.get('HUB_MODEL_ID', None) + self.last_ckpt = None if self.save_best and not self.save_best_by: warnings.warn( "CheckpointHook: Parameter 'save_best_by' is not set, turn off save_best function." @@ -96,7 +103,6 @@ class CheckpointHook(Hook): if solver.total_iter != 0 and ( (solver.total_iter + 1) % self.interval == 0 or solver.total_iter == solver.max_steps - 1): - checkpoint = solver.save_checkpoint() solver.logger.info( f'Saving checkpoint after {solver.total_iter + 1} steps') if we.rank == 0: @@ -106,11 +112,44 @@ class CheckpointHook(Hook): solver.total_iter + 1)) with FS.put_to(save_path) as local_path: with open(local_path, 'wb') as f: + checkpoint = solver.save_checkpoint() torch.save(checkpoint, f) + + from swift import SwiftModel + if isinstance(solver.model, SwiftModel): + save_path = osp.join( + solver.work_dir, + 'checkpoints/{}-{}'.format(self.save_name_prefix, + solver.total_iter + 1)) + local_folder, _ = FS.map_to_local(save_path) + solver.model.save_pretrained(local_folder) + FS.put_dir_from_local_dir(local_folder, save_path) + else: + if hasattr(solver, 'save_pretrained'): + save_path = osp.join( + solver.work_dir, 'checkpoints/{}-{}-bin'.format( + self.save_name_prefix, solver.total_iter + 1)) + local_folder, _ = FS.map_to_local(save_path) + FS.make_dir(local_folder) + ckpt, cfg = solver.save_pretrained() + with FS.put_to( + os.path.join( + local_folder, + 'pytorch_model.bin')) as local_path: + with open(local_path, 'wb') as f: + torch.save(ckpt, f) + with FS.put_to( + os.path.join( + local_folder, + 'configuration.json')) as local_path: + json.dump(cfg, open(local_path, 'w')) + FS.put_dir_from_local_dir(local_folder, save_path) + if self.save_last and solver.total_iter == solver.max_steps - 1: with FS.get_fs_client(save_path) as client: last_path = osp.join(solver.work_dir, 'checkpoint.pth') client.make_link(last_path, save_path) + self.last_ckpt = save_path torch.cuda.synchronize() if we.is_distributed: @@ -173,6 +212,48 @@ class CheckpointHook(Hook): torch.save(checkpoint['pre_state_dict'], f) client.put_object_from_local_file(local_file, save_path) + def create_or_update_model_card(self, model, output_dir: str): + """ + Updates or create the model card. + """ + if not os.path.exists(os.path.join(output_dir, 'README.md')): + lines = [] + else: + with open(os.path.join(output_dir, 'README.md'), 'r') as f: + lines = f.readlines() + + # write the lines back to README.md + with open(os.path.join(output_dir, 'README.md'), 'w') as f: + f.writelines(lines) + + def after_all_iter(self, solver): + if we.rank == 0: + if self.push_to_hub and self.last_ckpt: + if os.path.isfile(self.last_ckpt): + base_dir = os.path.dirname(self.last_ckpt) + base_file = os.path.basename(self.last_ckpt) + save_path = os.path.join(base_dir, 'after_all_iter') + os.makedirs(save_path) + self.create_or_update_model_card(solver.model, save_path) + try: + os.link(self.last_ckpt, + os.path.join(save_path, base_file)) + except OSError: + shutil.copyfile(self.last_ckpt, + os.path.join(save_path, base_file)) + + push_to_hub(repo_name=self.hub_model_id, + output_dir=self.last_ckpt, + private=False) + current_dir = os.path.dirname(__file__) + base_path = os.sep.join(current_dir.split(os.sep)[:-4]) + base_path = os.path.join(base_path, 'config') + file_name = self.hub_model_id.replace(os.sep, '_') + content = {'name': self.hub_model_id} + import json + with open(os.path.join(base_path, file_name), 'w') as f: + json.dump(content, f) + @staticmethod def get_config_template(): return dict_to_yaml('hook', diff --git a/scepter/modules/transform/__init__.py b/scepter/modules/transform/__init__.py index b57b57e..9b2e1b4 100644 --- a/scepter/modules/transform/__init__.py +++ b/scepter/modules/transform/__init__.py @@ -16,7 +16,7 @@ from scepter.modules.transform.io import (LoadCvImageFromFile, from scepter.modules.transform.io_video import (DecodeVideoToTensor, LoadVideoFromFile) from scepter.modules.transform.registry import TRANSFORMS, build_pipeline -from scepter.modules.transform.tensor import Rename, Select, ToTensor +from scepter.modules.transform.tensor import Rename, Select, ToNumpy, ToTensor from scepter.modules.transform.transform_xl import FlexibleCropXL from scepter.modules.transform.video import (AutoResizedCropVideo, CenterCropVideo, NormalizeVideo, diff --git a/scepter/modules/transform/tensor.py b/scepter/modules/transform/tensor.py index 4612b2f..f2df463 100644 --- a/scepter/modules/transform/tensor.py +++ b/scepter/modules/transform/tensor.py @@ -3,6 +3,7 @@ import numpy as np import torch +from PIL import Image from scepter.modules.transform.registry import TRANSFORMS from scepter.modules.utils.config import dict_to_yaml @@ -24,6 +25,17 @@ def to_tensor(data): raise TypeError(f'Unsupported type {type(data)}') +def to_numpy(data): + if isinstance(data, torch.Tensor): + return data.detach().cpu().numpy() + elif isinstance(data, (int, float, list, tuple, dict, Image.Image)): + return np.array(data) + elif isinstance(data, np.ndarray): + return data + else: + raise TypeError(f'Unsupported type {type(data)}') + + @TRANSFORMS.register_class() class ToTensor(object): def __init__(self, cfg, logger=None): @@ -54,6 +66,50 @@ class ToTensor(object): set_name=True) +@TRANSFORMS.register_class() +class ToNumpy(object): + def __init__(self, cfg, logger=None): + self.input_key = cfg.get('INPUT_KEY', 'img') + self.output_key = cfg.get('OUTPUT_KEY', 'img') + + def __call__(self, item): + if isinstance(self.input_key, str): + self.input_key = [self.input_key] + if isinstance(self.output_key, str): + self.output_key = [self.output_key] + for idx, key in enumerate(self.input_key): + item[self.output_key[idx]] = to_numpy(item[key]) + return item + + @staticmethod + def get_config_template(): + ''' + { "ENV" : + { "description" : "", + "A" : { + "value": 1.0, + "description": "" + } + } + } + :return: + ''' + para_dict = [{ + 'INPUT_KEY': { + 'value': [], + 'description': 'input_key' + }, + 'OUTPUT_KEY': { + 'value': [], + 'description': 'output_key' + } + }] + return dict_to_yaml('TRANSFORM', + __class__.__name__, + para_dict, + set_name=True) + + @TRANSFORMS.register_class() class Select(object): def __init__(self, cfg, logger=None): @@ -107,14 +163,14 @@ class Select(object): @TRANSFORMS.register_class() class Rename(object): def __init__(self, cfg, logger=None): - self.in_keys = cfg.IN_KEYS - self.out_keys = cfg.OUT_KEYS + self.input_key = cfg.INPUT_KEY + self.output_key = cfg.OUTPUT_KEY def __call__(self, item): data = {} - for idx, key in enumerate(self.in_keys): - data[self.out_keys[idx]] = item[key] - have_key_set = set(self.in_keys) + for idx, key in enumerate(self.input_key): + data[self.output_key[idx]] = item[key] + have_key_set = set(self.input_key) for k, v in item.items(): if k not in have_key_set: data[k] = v @@ -134,12 +190,12 @@ class Rename(object): :return: ''' para_dict = [{ - 'IN_KEYS': { + 'INPUT_KEY': { 'value': [], 'description': 'The keys need to rename, the other keys are outputed by default.' }, - 'OUT_KEYS': { + 'OUTPUT_KEY': { 'value': [], 'description': 'The keys need to rename, the other keys are outputed by default.' diff --git a/scepter/modules/utils/config.py b/scepter/modules/utils/config.py index 947c232..d7bceb1 100644 --- a/scepter/modules/utils/config.py +++ b/scepter/modules/utils/config.py @@ -3,6 +3,7 @@ import argparse import copy import json +import numbers import os import sys @@ -579,7 +580,7 @@ class Config(object): for key, val in cfg_dict.items(): if isinstance(val, (Config, dict, list)): cfg_new[key] = Config.get_plain_cfg(val) - else: + elif isinstance(val, (str, numbers.Number)): cfg_new[key] = val return cfg_new elif isinstance(cfg, dict): @@ -588,7 +589,7 @@ class Config(object): for key, val in cfg_dict.items(): if isinstance(val, (Config, dict, list)): cfg_new[key] = Config.get_plain_cfg(val) - else: + elif isinstance(val, (str, numbers.Number)): cfg_new[key] = val return cfg_new elif isinstance(cfg, list): @@ -597,7 +598,7 @@ class Config(object): for val in cfg_list: if isinstance(val, (Config, dict, list)): cfg_new.append(Config.get_plain_cfg(val)) - else: + elif isinstance(val, (str, numbers.Number)): cfg_new.append(val) return cfg_new else: diff --git a/scepter/modules/utils/distribute.py b/scepter/modules/utils/distribute.py index abdefb4..439eda5 100644 --- a/scepter/modules/utils/distribute.py +++ b/scepter/modules/utils/distribute.py @@ -327,7 +327,7 @@ class Workenv(object): self.seed = 2023 self.debug = False self.use_pl = False - self.launcher = 'spawn' + self.launcher = 'spawn' if torch.cuda.device_count() > 1 else None self.data_online = False self.share_storage = False @@ -358,7 +358,7 @@ class Workenv(object): fn(config) return - if (os.environ.get('WORLD_SIZE') is None or os.environ.get('WORLD_SIZE') == 1) \ + if (os.environ.get('WORLD_SIZE') is None or int(os.environ.get('WORLD_SIZE')) == 1) \ and torch.cuda.device_count() == 1 and not self.launcher == 'dist': self.device_id = 0 fn(config) diff --git a/scepter/modules/utils/file_clients/local_fs.py b/scepter/modules/utils/file_clients/local_fs.py index b568503..7cd3d05 100644 --- a/scepter/modules/utils/file_clients/local_fs.py +++ b/scepter/modules/utils/file_clients/local_fs.py @@ -239,7 +239,7 @@ class LocalFs(BaseFs): return True def walk_dir(self, file_dir, recurse=True): - for root, dirs, files in os.walk(file_dir, topdown=True): + for root, dirs, files in os.walk(file_dir, topdown=recurse): sub_files = files + dirs for name in sub_files: yield os.path.join(root, name) diff --git a/scepter/studio/__init__.py b/scepter/studio/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scepter/studio/home/__init__.py b/scepter/studio/home/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scepter/studio/home/home.py b/scepter/studio/home/home.py new file mode 100644 index 0000000..c272c05 --- /dev/null +++ b/scepter/studio/home/home.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- + +import gradio as gr + +from scepter.modules.utils.config import Config +from scepter.studio.home.home_ui.desc_ui import DescUI +from scepter.studio.home.home_ui.guide_ui import GuideUI + + +class HomeUI(): + def __init__(self, + cfg_general_file, + is_debug=False, + language='en', + root_work_dir='./'): + cfg_general = Config(cfg_file=cfg_general_file) + desc_info = cfg_general.DESC_INFO + self.desc_ui = DescUI(desc_info=desc_info, + is_debug=is_debug, + language=language) + guide_info = cfg_general.GUIDE_INFO + self.guide_ui = GuideUI(guide_info=guide_info, + is_debug=is_debug, + language=language) + + def create_ui(self): + self.desc_ui.create_ui() + self.guide_ui.create_ui() + + def set_callbacks(self, manager): + self.desc_ui.set_callbacks(self.desc_ui, manager) + self.guide_ui.set_callbacks(self.guide_ui, manager) + + +if __name__ == '__main__': + st_ins = HomeUI(None, + is_debug=True, + language='zh', + root_work_dir='./cache') + with gr.Blocks() as demo: + gr.Markdown('

    SCEPTER Home

    ') + with gr.Tabs(elem_id='tabs') as tabs: + with gr.TabItem('editor', id=1, elem_id=f'tab_{1}'): + st_ins.create_ui() + st_ins.set_callbacks() + demo.queue(status_update_rate=1).launch(show_error=True, + debug=True, + enable_queue=True) diff --git a/scepter/studio/home/home_ui/__init__.py b/scepter/studio/home/home_ui/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scepter/studio/home/home_ui/component_names.py b/scepter/studio/home/home_ui/component_names.py new file mode 100644 index 0000000..1d01b7a --- /dev/null +++ b/scepter/studio/home/home_ui/component_names.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + + +class DescUIName(): + def __init__(self, language='en'): + if language == 'en': + pass + + elif language == 'zh': + pass + + +class GuideUIName(): + def __init__(self, language='en'): + if language == 'en': + pass + + elif language == 'zh': + pass diff --git a/scepter/studio/home/home_ui/desc_ui.py b/scepter/studio/home/home_ui/desc_ui.py new file mode 100644 index 0000000..22b15b4 --- /dev/null +++ b/scepter/studio/home/home_ui/desc_ui.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +import gradio as gr + +from scepter.studio.home.home_ui.component_names import DescUIName +from scepter.studio.utils.uibase import UIBase + + +class DescUI(UIBase): + def __init__(self, desc_info, is_debug=False, language='en'): + self.desc_info = desc_info + self.language = language + self.is_debug = is_debug + self.component_names = DescUIName(language) + + def create_ui(self, *args, **kwargs): + if self.language == 'en': + gr.HTML(self.desc_info.EN_INFO) + elif self.language == 'zh': + gr.HTML(self.desc_info.ZH_INFO) + + def set_callbacks(self, desc_ui, manager=None): + pass diff --git a/scepter/studio/home/home_ui/guide_ui.py b/scepter/studio/home/home_ui/guide_ui.py new file mode 100644 index 0000000..981fcfa --- /dev/null +++ b/scepter/studio/home/home_ui/guide_ui.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +import gradio as gr + +from scepter.studio.home.home_ui.component_names import GuideUIName +from scepter.studio.utils.uibase import UIBase + + +class GuideUI(UIBase): + def __init__(self, guide_info, is_debug=False, language='en'): + self.guide_info = guide_info + self.language = language + self.is_debug = is_debug + self.component_names = GuideUIName(language) + + def create_ui(self, *args, **kwargs): + if self.language == 'en': + gr.HTML(self.guide_info.EN_INFO) + elif self.language == 'zh': + gr.HTML(self.guide_info.ZH_INFO) + + def set_callbacks(self, guide_ui, manager=None): + pass diff --git a/scepter/studio/inference/__init__.py b/scepter/studio/inference/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scepter/studio/inference/inference.py b/scepter/studio/inference/inference.py new file mode 100644 index 0000000..323ee4c --- /dev/null +++ b/scepter/studio/inference/inference.py @@ -0,0 +1,177 @@ +# -*- coding: utf-8 -*- +import os +from glob import glob + +import gradio as gr + +import scepter +from scepter.modules.utils.config import Config +from scepter.modules.utils.file_system import FS +from scepter.studio.inference.inference_manager.infer_runer import \ + PipelineManager +from scepter.studio.inference.inference_ui.component_names import \ + InferenceUIName +from scepter.studio.inference.inference_ui.control_ui import ControlUI +from scepter.studio.inference.inference_ui.diffusion_ui import DiffusionUI +from scepter.studio.inference.inference_ui.gallery_ui import GalleryUI +from scepter.studio.inference.inference_ui.mantra_ui import MantraUI +from scepter.studio.inference.inference_ui.model_manage_ui import ModelManageUI +from scepter.studio.inference.inference_ui.refiner_ui import RefinerUI +from scepter.studio.inference.inference_ui.tuner_ui import TunerUI +from scepter.studio.utils.env import init_env + + +class InferenceUI(): + def __init__(self, + cfg_general_file, + is_debug=False, + language='en', + root_work_dir='./'): + config_dir = os.path.dirname(cfg_general_file) + cfg_general = Config(cfg_file=cfg_general_file) + cfg_general.WORK_DIR = os.path.join(root_work_dir, + cfg_general.WORK_DIR) + if not FS.exists(cfg_general.WORK_DIR): + FS.make_dir(cfg_general.WORK_DIR) + cfg_general = init_env(cfg_general) + # official mantra + mantra_book = Config( + cfg_file=os.path.join(os.path.dirname(scepter.dirname), + cfg_general.EXTENSION_PARAS.MANTRA_BOOK)) + cfg_general.MANTRAS = mantra_book.MANTRAS + # official tuners + official_tuners = Config( + cfg_file=os.path.join(os.path.dirname(scepter.dirname), + cfg_general.EXTENSION_PARAS.OFFICIAL_TUNERS)) + cfg_general.TUNERS = official_tuners.TUNERS + official_controllers = Config(cfg_file=os.path.join( + os.path.dirname(scepter.dirname), + cfg_general.EXTENSION_PARAS.OFFICIAL_CONTROLLERS)) + cfg_general.CONTROLLERS = official_controllers.CONTROLLERS + + pipe_manager = PipelineManager() + config_list = glob(os.path.join(config_dir, '*/*_pro.yaml'), + recursive=True) + for config_file in config_list: + pipe_manager.register_pipeline(Config(cfg_file=config_file)) + + for one_tuner in cfg_general.TUNERS: + pipe_manager.register_tuner( + one_tuner, + name=one_tuner.NAME_ZH if language == 'zh' else one_tuner.NAME) + + for one_controller in cfg_general.CONTROLLERS: + pipe_manager.register_controllers(one_controller) + + self.model_manage_ui = ModelManageUI(cfg_general, + pipe_manager, + is_debug=is_debug, + language=language) + self.gallery_ui = GalleryUI(cfg_general, + pipe_manager, + is_debug=is_debug, + language=language) + self.diffusion_ui = DiffusionUI(cfg_general, + pipe_manager, + is_debug=is_debug, + language=language) + self.mantra_ui = MantraUI(cfg_general, + pipe_manager, + is_debug=is_debug, + language=language) + self.tuner_ui = TunerUI(cfg_general, + pipe_manager, + is_debug=is_debug, + language=language) + self.refiner_ui = RefinerUI(cfg_general, + pipe_manager, + is_debug=is_debug, + language=language) + self.control_ui = ControlUI(cfg_general, + pipe_manager, + is_debug=is_debug, + language=language) + self.component_names = InferenceUIName(language=language) + + def create_ui(self): + self.model_manage_ui.create_ui() + self.gallery_ui.create_ui() + with gr.Row(variant='panel', equal_height=True): + self.check_box_for_setting = gr.CheckboxGroup( + choices=self.component_names.check_box_for_setting, + show_label=False) + with gr.Row(variant='panel', equal_height=True): + with gr.Accordion(label=self.component_names.advance_block_name, + open=True): + with gr.Tabs() as self.setting_tab: + with gr.TabItem(label=self.component_names.diffusion_paras, + id='diffusion_ui'): + self.diffusion_ui.create_ui() + # 0 + with gr.TabItem(label=self.component_names.mantra_paras, + id='mantra_ui', + visible=True) as self.mantra_tab: + self.mantra_ui.create_ui() + self.mantra_state = gr.State(value=False) + # 1 + with gr.TabItem(label=self.component_names.tuner_paras, + id='tuner_ui', + visible=True) as self.tuner_tab: + self.tuner_ui.create_ui() + self.tuner_state = gr.State(value=False) + # 2 + with gr.TabItem(label=self.component_names.contrl_paras, + id='control_ui', + visible=True) as self.control_tab: + self.control_ui.create_ui() + self.control_state = gr.State(value=False) + # 3 + with gr.TabItem(label=self.component_names.refine_paras, + id='refiner_ui', + visible=True) as self.refine_tab: + self.refiner_ui.create_ui() + + def set_callbacks(self, manager): + self.model_manage_ui.set_callbacks(self.diffusion_ui, self.tuner_ui, + self.control_ui, self.mantra_ui) + self.gallery_ui.set_callbacks(self, self.model_manage_ui, + self.diffusion_ui, self.mantra_ui, + self.tuner_ui, self.refiner_ui, + self.control_ui) + self.diffusion_ui.set_callbacks(self.model_manage_ui) + self.mantra_ui.set_callbacks(self.model_manage_ui) + self.tuner_ui.set_callbacks(self.model_manage_ui) + self.control_ui.set_callbacks(self.model_manage_ui, self.diffusion_ui) + self.refiner_ui.set_callbacks() + + def change_setting_tab(check_box): + mantra_ui, tuner_ui, control_ui = False, False, False + for key in check_box: + if self.component_names.check_box_for_setting.index(key) == 0: + mantra_ui = True + if self.component_names.check_box_for_setting.index(key) == 1: + tuner_ui = True + if self.component_names.check_box_for_setting.index(key) == 2: + control_ui = True + return (mantra_ui, tuner_ui, control_ui) + + self.check_box_for_setting.change( + change_setting_tab, + inputs=[self.check_box_for_setting], + outputs=[self.mantra_state, self.tuner_state, self.control_state]) + + +if __name__ == '__main__': + infer_ins = InferenceUI('scepter/methods/studio/inference/inference.yaml', + is_debug=True, + language='en', + root_work_dir='./cache') + with gr.Blocks() as demo: + gr.Markdown('

    scepter studio

    ') + with gr.Tabs(elem_id='tabs') as tabs: + with gr.TabItem('editor', id=1, elem_id=f'tab_{1}'): + infer_ins.creat_ui() + infer_ins.set_callbacks() + demo.queue(status_update_rate=1).launch(show_error=True, + debug=True, + enable_queue=True) diff --git a/scepter/studio/inference/inference_manager/__init__.py b/scepter/studio/inference/inference_manager/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scepter/studio/inference/inference_manager/infer_runer.py b/scepter/studio/inference/inference_manager/infer_runer.py new file mode 100644 index 0000000..1007525 --- /dev/null +++ b/scepter/studio/inference/inference_manager/infer_runer.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- +from scepter.modules.inference.diffusion_inference import DiffusionInference +from scepter.modules.utils.logger import get_logger + + +class PipelineManager(): + def __init__(self, logger=None): + ''' + Args: + logger: + ''' + """ + Only (refine) cond model and (refine) diffusion model are binded strictly. + Users can choose any vae or refiner according to the given diffusion model. + """ + if logger is None: + logger = get_logger(name='scepter') + + self.module_list = [ + 'diffusion_model', 'first_stage_model', 'cond_stage_model', + 'refiner_cond_model', 'refiner_diffusion_model' + ] + self.pipeline_level_modules = {} + self.module_level_choices = {} + self.model_level_info = {} + self.logger = logger + + def contruct_models_index(self, pipeline_name, pipeline): + """ + + Args: + pipeline_name: + pipeline: + + Returns: + + """ + """ + self.pipeline_level_modules is used to index the modules given pipeline + { + "SD_XL1.0": { + "diffusion_model": "", + .... + } + } + self.module_level_choices is used to provide all choices for modules. + an example for self.module_level_models + { + "diffusion_model" : { + "choices": [], + "default": "" + } + .... + } + + self.model_level_info is used to index the best combination for different modules give model name + and check the combination is legal or not. + { + "xxxxxx": { + "pipeline": [], + "check_bind_module": [], + "model_info": {} + .... + } + } + + """ + self.pipeline_level_modules[pipeline_name] = pipeline + for module_name in self.module_list: + if module_name not in self.module_level_choices: + self.module_level_choices[module_name] = { + 'choices': [], + 'default': '' + } + module = getattr(pipeline, module_name) + if module is None: + continue + model_name = f"{pipeline_name}_{module['name']}" + self.module_level_choices[module_name]['choices'].append( + model_name) + if pipeline.is_default or self.module_level_choices[module_name][ + 'default'] == '': + self.module_level_choices[module_name]['default'] = model_name + if model_name not in self.model_level_info: + self.model_level_info[model_name] = { + 'pipeline': [], + 'check_bind_module': [], + 'model_info': {} + } + self.model_level_info[model_name]['pipeline'].append(pipeline_name) + self.model_level_info[model_name]['model_info'] = module + + def construct_new_pipeline(self): + pass + + def register_pipeline(self, cfg): + new_inference = DiffusionInference(logger=self.logger) + new_inference.init_from_cfg(cfg) + self.contruct_models_index(cfg.NAME, new_inference) + + def register_tuner(self, cfg, name=None, is_customized=False): + ''' + Args: + cfg: { + NAME: "" + NAME_ZH: "" + BASE_MODEL: "" + MODEL_PATH: "", + DESCRIPTION: "" + } + + Returns: + + ''' + if not is_customized: + tuners_key = 'tuners' + else: + tuners_key = 'customized_tuners' + + if tuners_key not in self.module_level_choices: + self.module_level_choices[tuners_key] = {} + + if cfg.BASE_MODEL not in self.module_level_choices[tuners_key]: + self.module_level_choices[tuners_key][cfg.BASE_MODEL] = { + 'choices': [], + 'default': '' + } + if name not in self.module_level_choices[tuners_key][ + cfg.BASE_MODEL]['choices']: + self.module_level_choices[tuners_key][ + cfg.BASE_MODEL]['choices'].append(name) + self.module_level_choices[tuners_key][cfg.BASE_MODEL]['default'] = name + if tuners_key not in self.model_level_info: + self.model_level_info[tuners_key] = {} + if cfg.BASE_MODEL not in self.model_level_info[tuners_key]: + self.model_level_info[tuners_key][cfg.BASE_MODEL] = {} + self.model_level_info[tuners_key][cfg.BASE_MODEL][name] = { + 'pipeline': [], + 'check_bind_module': [], + 'model_info': cfg + } + + def register_controllers(self, cfg): + ''' + Args: + cfg: { + NAME: "" + NAME_ZH: "" + BASE_MODEL: "" + MODEL_PATH: "", + DESCRIPTION: "" + } + + Returns: + + ''' + if 'controllers' not in self.module_level_choices: + self.module_level_choices['controllers'] = {} + + if cfg.BASE_MODEL not in self.module_level_choices['controllers']: + self.module_level_choices['controllers'][cfg.BASE_MODEL] = {} + if cfg.TYPE not in self.module_level_choices['controllers'][ + cfg.BASE_MODEL]: + self.module_level_choices['controllers'][cfg.BASE_MODEL][ + cfg.TYPE] = { + 'choices': [], + 'default': '' + } + controller_name = cfg.BASE_MODEL + '_' + cfg.NAME + self.module_level_choices['controllers'][cfg.BASE_MODEL][ + cfg.TYPE]['choices'].append(controller_name) + self.module_level_choices['controllers'][cfg.BASE_MODEL][ + cfg.TYPE]['default'] = controller_name + if 'controllers' not in self.model_level_info: + self.model_level_info['controllers'] = {} + if cfg.BASE_MODEL not in self.model_level_info['controllers']: + self.model_level_info['controllers'][cfg.BASE_MODEL] = {} + self.model_level_info['controllers'][ + cfg.BASE_MODEL][controller_name] = { + 'pipeline': [], + 'check_bind_module': [], + 'model_info': cfg + } + + def get_pipeline_given_modules(self, modules): + diffusion_model = modules['diffusion_model'] + pipepline_name = self.model_level_info[diffusion_model]['pipeline'][0] + return self.pipeline_level_modules[pipepline_name] diff --git a/scepter/studio/inference/inference_ui/__init__.py b/scepter/studio/inference/inference_ui/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scepter/studio/inference/inference_ui/component_names.py b/scepter/studio/inference/inference_ui/component_names.py new file mode 100644 index 0000000..715d10b --- /dev/null +++ b/scepter/studio/inference/inference_ui/component_names.py @@ -0,0 +1,214 @@ +# -*- coding: utf-8 -*- +# For dataset manager + + +class InferenceUIName(): + def __init__(self, language='en'): + if language == 'en': + self.advance_block_name = 'Advance Setting' + self.check_box_for_setting = [ + 'Use Mantra', 'Use Tuners', 'Use Controller' + ] + self.diffusion_paras = 'Generation Setting' + self.mantra_paras = 'Mantra Book' + self.tuner_paras = 'Tuners' + self.contrl_paras = 'Controlable Generation' + self.refine_paras = 'Refiner Setting' + elif language == 'zh': + self.advance_block_name = '生成选项' + self.check_box_for_setting = ['使用咒语', '使用微调', '使用控制'] + self.diffusion_paras = '生成参数设置' + self.mantra_paras = '咒语书' + self.tuner_paras = '微调模型' + self.contrl_paras = '可控生成' + self.refine_paras = 'Refine设置' + + +class ModelManageUIName(): + def __init__(self, language='en'): + if language == 'en': + self.model_block_name = 'Model Management' + self.postprocess_model_name = 'Refiners and Tuners' + self.diffusion_model = 'Unet' + self.first_stage_model = 'Vae' + self.cond_stage_model = 'Condition Model' + self.refine_diffusion_model = 'Refine Unet' + self.refine_cond_model = 'Refine Condition Model' + self.load_lora_tuner = 'Load Lora Tuner' + self.load_swift_tuner = 'Load swift Tuner' + elif language == 'zh': + self.model_block_name = '模型管理' + self.postprocess_model_name = 'Refiners and Tuners' + self.diffusion_model = 'Unet' + self.first_stage_model = 'Vae' + self.cond_stage_model = 'Condition Model' + self.refine_diffusion_model = 'Refine Unet' + self.refine_cond_model = 'Refine Condition Model' + self.load_lora_tuner = '加载 Lora 微调模型' + self.load_swift_tuner = '加载 Swift 微调模型' + + +class GalleryUIName(): + def __init__(self, language='en'): + if language == 'en': + self.gallery_block_name = "Model's Output" + self.gallery_diffusion_output = 'Diffusion Output' + self.gallery_before_refine_output = 'Before Refine Output' + self.prompt_input = 'Type Prompt Here' + self.generate = 'Generate' + elif language == 'zh': + self.gallery_block_name = '模型的输出' + self.gallery_diffusion_output = '扩散输出' + self.gallery_before_refine_output = '精炼前输出' + self.prompt_input = '在此输入提示' + self.generate = '生成' + + +class DiffusionUIName(): + def __init__(self, language='en'): + if language == 'en': + + self.sample = 'Sampler' + self.sample_steps = 'Sample Steps' + self.image_number = 'Images Number' + self.resolutions_height = 'Output Height' + self.resolutions_width = 'Output Width' + + self.negative_prompt = 'Negative Prompt' + self.negative_prompt_placeholder = 'Type Prompt Here' + self.negative_prompt_description = 'Describing what you do not want to see.' + self.prompt_prefix = 'Prompt Prefix' + self.guide_scale = 'Guide Scale For Uncondition' + self.guide_rescale = 'Guide ReScale' + self.discretization = 'Discretization' + self.random_seed = 'Use Random Seed' + self.seed = 'Used Seed' + + elif language == 'zh': + + self.sample = '采样器' + self.sample_steps = '采样步数' + self.image_number = '图片数量' + self.resolutions_height = '输出高度' + self.resolutions_width = '输出宽度' + self.negative_prompt = '负向提示' + self.negative_prompt_placeholder = '在此输入提示' + self.negative_prompt_description = '描述您不希望看到的内容。' + self.prompt_prefix = '提示前缀词' + self.guide_scale = '条件引导比例' + self.guide_rescale = '引导缩放' + self.discretization = '离散化' + self.random_seed = '使用随机种子' + self.seed = '使用的种子' + + +class MantraUIName(): + def __init__(self, language='en'): + if language == 'en': + + self.mantra_styles = 'Mantra Styles' + self.style_name = 'Mantra Name' + self.style_prompt = 'Mantra Prompt' + self.style_source = 'Mantra Source' + self.style_negative_prompt = 'Mantra Negative Prompt' + self.select_style = 'Selected Mantra' + self.style_desc = 'Mantra Description' + self.style_template = 'Mantra Prompt Template' + self.style_negative_template = 'Mantra Negative Prompt Template' + self.style_example = 'Mantra Results Example' + self.style_example_prompt = 'Mantra Example Prompt' + + elif language == 'zh': + self.mantra_styles = '咒语风格' + self.style_name = '咒语名称' + self.style_prompt = '咒语提示' + self.style_source = '咒语来源' + self.style_negative_prompt = '咒语负向提示' + self.select_style = '选定的咒语' + self.style_desc = '咒语描述' + self.style_template = '咒语提示模板' + self.style_negative_template = '咒语负向提示模板' + self.style_example = '咒语示例图' + self.style_example_prompt = '咒语示例提示词' + + +class RefinerUIName(): + def __init__(self, language='en'): + if language == 'en': + + self.refine_sample = 'Refine Sampler' + self.refine_discretization = 'Refine Discretization' + self.refine_guide_scale = 'Refine Guide Scale For Uncondition' + self.refine_guide_rescale = 'Guide ReScale' + self.refine_strength = 'Refine Strength' + self.refine_strength_description = 'Use to control how many steps used to refine.' + self.refine_diffusion_model = 'Refiner' + self.refine_cond_model = 'Refine Cond' + + elif language == 'zh': + + self.refine_sample = 'Refine采样器' + self.refine_discretization = 'Refine离散化' + self.refine_guide_scale = 'Refine条件引导比例' + self.refine_guide_rescale = 'Refine引导缩放' + self.refine_strength = 'Refine强度' + self.refine_strength_description = '用于控制用于Refine步数。' + self.refine_diffusion_model = 'Refiner' + self.refine_cond_model = 'Refine Cond' + + +class TunerUIName(): + def __init__(self, language='en'): + if language == 'en': + + self.tuner_model = 'Tuner' + self.tuner_name = 'Tuner Name' + self.tuner_type = 'Tuner Type' + self.tuner_desc = 'Tuner Description' + self.tuner_example = 'Results Example' + self.tuner_prompt_example = 'Prompt Example' + self.base_model = 'Base Model Name' + self.custom_tuner_model = 'Customized Model' + + elif language == 'zh': + self.tuner_model = '微调模型' + self.tuner_name = '微调模型名' + self.tuner_type = '微调模型类型' + self.tuner_desc = '微调模型描述' + self.tuner_example = '示例结果' + self.tuner_prompt_example = '示例提示词' + self.base_model = '基础模型' + self.custom_tuner_model = '自定义模型' + + +class ControlUIName(): + def __init__(self, language='en'): + if language == 'en': + + self.source_image = 'Source Image' + self.cond_image = 'Conditional Image' + self.control_preprocessor = 'Control Preprocessor' + self.crop_type = 'Crop type' + self.direction = ( + "Note: 1) After clicking 'Extract', you can extract " + 'the conditional image from the original image on the left;\n' + '2) You can also directly transfer the conditional image on the right; \n' + '3) Or simply upload the original image and directly run the\n' + "'Conditional Inference' below.") + self.preprocess = 'Preprocess' + self.control_model = 'Generation Model' + + self.control_err1 = "Condition preprocessor doesn't exist." + self.control_err2 = 'Condition preprocessor failed.' + elif language == 'zh': + self.preprocess = '条件预处理' + self.source_image = '源图片' + self.cond_image = '条件图片' + self.control_preprocessor = '图像预处理器' + self.crop_type = '抠图方式' + self.direction = ('注:1)点击【Extract】后可从左侧原始图像提取出条件图像;\n' + '2)也可直接传输右侧条件图像;\n' + '3)或只上传原始图像直接运行下方的【条件推理】') + self.control_err1 = '预处理器不存在。' + self.control_err2 = '预处理失败。' + self.control_model = '生成模型' diff --git a/scepter/studio/inference/inference_ui/control_ui.py b/scepter/studio/inference/inference_ui/control_ui.py new file mode 100644 index 0000000..5068465 --- /dev/null +++ b/scepter/studio/inference/inference_ui/control_ui.py @@ -0,0 +1,156 @@ +# -*- coding: utf-8 -*- + +import gradio as gr +import numpy as np +import torchvision.transforms as TT +from PIL import Image + +from scepter.modules.annotator.registry import ANNOTATORS +from scepter.modules.utils.distribute import we +from scepter.studio.inference.inference_ui.component_names import ControlUIName +from scepter.studio.utils.uibase import UIBase + +refresh_symbol = '\U0001f504' # 🔄 + + +class ControlUI(UIBase): + def __init__(self, cfg, pipe_manager, is_debug=False, language='en'): + self.cfg = cfg + self.pipe_manager = pipe_manager + + controlable_anno = cfg.CONTROLABLE_ANNOTATORS + self.controlable_annotators = {} + self.control_choices = [] + self.control_defult = None + for control_anno in controlable_anno: + self.controlable_annotators[control_anno.TYPE] = { + 'cfg': control_anno, + 'device': 'offline', + 'model': None + } + if control_anno.IS_DEFAULT: + self.control_defult = control_anno.TYPE + self.control_choices.append(control_anno.TYPE) + if self.control_defult is None: + self.control_defult = self.control_choices[0] if len( + self.control_choices) > 0 else None + + default_choices = pipe_manager.module_level_choices + default_diffusion_model = default_choices['diffusion_model']['default'] + default_pipeline = pipe_manager.model_level_info[ + default_diffusion_model]['pipeline'][0] + if default_pipeline in default_choices[ + 'controllers'] and self.control_defult is not None: + self.controller_choices = default_choices['controllers'][ + default_pipeline][self.control_defult]['choices'] + self.controller_default = default_choices['controllers'][ + default_pipeline][self.control_defult]['default'] + else: + self.controller_choices = [] + self.controller_default = '' + self.component_names = ControlUIName(language) + + def load_annotator(self, annotator): + if annotator['device'] == 'offline': + annotator['model'] = ANNOTATORS.build(annotator['cfg']) + annotator['device'] = 'cpu' + if annotator['device'] == 'cpu': + annotator['model'] = annotator['model'].to(we.device_id) + annotator['device'] = we.device_id + return annotator + + def unload_annotator(self, annotator): + if not annotator['device'] == 'offline' and not annotator[ + 'device'] == 'cpu': + annotator['model'] = annotator['model'].to('cpu') + annotator['device'] = 'cpu' + return annotator + + def create_ui(self, *args, **kwargs): + gr.Markdown(self.component_names.preprocess) + with gr.Group(): + with gr.Row(): + with gr.Column(scale=1, min_width=0): + self.source_image = gr.Image( + label=self.component_names.source_image, + type='pil', + tool='editor', + interactive=True) + with gr.Column(scale=1, min_width=0): + self.cond_image = gr.Image( + label=self.component_names.cond_image, + type='pil', + tool='editor', + interactive=True) + with gr.Row(): + with gr.Column(scale=1, min_width=0): + with gr.Row(): + self.control_mode = gr.Dropdown( + label=self.component_names.control_preprocessor, + choices=self.control_choices, + value=self.control_defult, + interactive=True) + self.crop_type = gr.Dropdown( + label=self.component_names.crop_type, + choices=['CenterCrop', 'NoCrop'], + value='CenterCrop', + interactive=True) + self.control_model = gr.Dropdown( + label=self.component_names.control_model, + choices=self.controller_choices, + value=self.controller_default, + interactive=True) + with gr.Column(scale=1, min_width=0): + self.cond_button = gr.Button('Extract') + gr.Markdown(self.component_names.direction) + + def set_callbacks(self, model_manage_ui, diffusion_ui): + def extract_condition(source_image, control_mode, crop_type, + output_height, output_width): + if control_mode not in self.controlable_annotators: + gr.Error(self.component_names.control_err1 + ' ' + + control_mode) + annotator = self.controlable_annotators[control_mode] + annotator = self.load_annotator(annotator) + if crop_type == 'CenterCrop': + source_image = TT.Resize(max(output_height, + output_width))(source_image) + source_image = TT.CenterCrop( + (output_height, output_width))(source_image) + cond_image = annotator['model'](np.array(source_image)) + self.controlable_annotators[control_mode] = self.unload_annotator( + annotator) + if cond_image is None: + gr.Error(self.component_names.control_err2) + cond_image = Image.fromarray(cond_image) + return gr.Image(value=cond_image) + + self.cond_button.click(extract_condition, + inputs=[ + self.source_image, self.control_mode, + self.crop_type, diffusion_ui.output_height, + diffusion_ui.output_width + ], + outputs=[self.cond_image]) + + def change_control_mode(control_mode, diffusion_model): + default_choices = self.pipe_manager.module_level_choices + now_pipeline = self.pipe_manager.model_level_info[diffusion_model][ + 'pipeline'][0] + if now_pipeline in default_choices[ + 'controllers'] and control_mode in default_choices[ + 'controllers'][now_pipeline]: + controller_choices = default_choices['controllers'][ + now_pipeline][control_mode]['choices'] + controller_default = default_choices['controllers'][ + now_pipeline][control_mode]['default'] + else: + controller_choices = [] + controller_default = '' + return gr.Dropdown(choices=controller_choices, + value=controller_default) + + self.control_mode.change( + change_control_mode, + inputs=[self.control_mode, model_manage_ui.diffusion_model], + outputs=[self.control_model]) diff --git a/scepter/studio/inference/inference_ui/diffusion_ui.py b/scepter/studio/inference/inference_ui/diffusion_ui.py new file mode 100644 index 0000000..69451a3 --- /dev/null +++ b/scepter/studio/inference/inference_ui/diffusion_ui.py @@ -0,0 +1,182 @@ +# -*- coding: utf-8 -*- +import copy +import random + +import gradio as gr + +from scepter.studio.inference.inference_ui.component_names import \ + DiffusionUIName +from scepter.studio.utils.uibase import UIBase + +refresh_symbol = '\U0001f504' # 🔄 + + +class DiffusionUI(UIBase): + def __init__(self, cfg, pipe_manager, is_debug=False, language='en'): + self.cfg = cfg + self.pipe_manager = pipe_manager + + default_choices = pipe_manager.module_level_choices + default_diffusion = default_choices['diffusion_model']['default'] + now_pipeline = pipe_manager.model_level_info[default_diffusion][ + 'pipeline'][0] + + self.default_resolutions = pipe_manager.pipeline_level_modules[ + now_pipeline].paras.RESOLUTIONS + self.default_input = pipe_manager.pipeline_level_modules[ + now_pipeline].input + + self.diffusion_paras = self.load_all_paras() + # deal with resolution + self.h_level_dict = {} + for hw_tuple in self.diffusion_paras.RESOLUTIONS.get('VALUES', []): + h, w = hw_tuple + if h not in self.h_level_dict: + self.h_level_dict[h] = [] + self.h_level_dict[h].append(w) + self.component_names = DiffusionUIName(language) + + def merge_resolutions(self, ori_h_level_dict, default_resolutions): + h_level_dict = copy.deepcopy(ori_h_level_dict) + for res in default_resolutions: + h, w = res + if h not in h_level_dict: + h_level_dict[h] = [] + h_level_dict[h].append(w) + if len(self.default_resolutions) > 0: + default_res = default_resolutions[0] + else: + default_res = self.diffusion_paras.RESOLUTIONS.DEFAULT + return h_level_dict, default_res + + def get_default(self, ori_diffusion_paras, cur_default): + diffusion_paras = copy.deepcopy(ori_diffusion_paras) + for key in diffusion_paras: + if key.lower() in cur_default: + diffusion_paras.get(key).DEFAULT = cur_default.get(key.lower()) + value = diffusion_paras.get(key).get('VALUES') + if value is not None and cur_default.get( + key.lower()) not in value: + value.VALUES.append(cur_default.get(key.lower())) + return diffusion_paras + + def load_all_paras(self): + diffusion_paras = self.cfg.DIFFUSION_PARAS + return diffusion_paras + + def create_ui(self, *args, **kwargs): + self.cur_paras = self.get_default(self.diffusion_paras, + self.default_input) + with gr.Row(equal_height=True): + self.negative_prompt = gr.Textbox( + label=self.component_names.negative_prompt, + show_label=True, + placeholder=self.component_names.negative_prompt_placeholder, + info=self.component_names.negative_prompt_description, + value=self.cur_paras.NEGATIVE_PROMPT.get('DEFAULT', ''), + lines=2) + with gr.Row(equal_height=True): + with gr.Column(scale=1): + self.prompt_prefix = gr.Textbox( + label=self.component_names.prompt_prefix, + value=self.cur_paras.PROMPT_PREFIX.get('DEFAULT', ''), + interactive=True) + with gr.Column(scale=2): + self.sampler = gr.Dropdown( + label=self.component_names.sample, + choices=self.cur_paras.SAMPLE.get('VALUES', []), + value=self.cur_paras.SAMPLE.get('DEFAULT', ''), + interactive=True) + with gr.Row(equal_height=True): + with gr.Column(scale=1): + self.discretization = gr.Dropdown( + label=self.component_names.discretization, + choices=self.cur_paras.DISCRETIZATION.get('VALUES', []), + value=self.cur_paras.DISCRETIZATION.get('DEFAULT', ''), + interactive=True) + self.cur_h_level_dict, default_res = self.merge_resolutions( + self.h_level_dict, self.default_resolutions) + with gr.Column(scale=1): + self.output_height = gr.Dropdown( + label=self.component_names.resolutions_height, + choices=[key for key in self.cur_h_level_dict.keys()], + value=default_res[0], + interactive=True) + with gr.Column(scale=1): + self.output_width = gr.Dropdown( + label=self.component_names.resolutions_width, + choices=self.cur_h_level_dict[default_res[0]], + value=default_res[1], + interactive=True) + with gr.Row(equal_height=True): + self.image_number = gr.Slider( + label=self.component_names.image_number, + minimum=self.cur_paras.SAMPLES.get('MIN', 1), + maximum=self.cur_paras.SAMPLES.get('MAX', 4), + step=1, + value=self.cur_paras.SAMPLES.get('DEFAULT', 1), + interactive=True) + with gr.Row(equal_height=True): + self.sample_steps = gr.Slider( + label=self.component_names.sample_steps, + minimum=self.cur_paras.SAMPLE_STEPS.get('MIN', 1), + maximum=self.cur_paras.SAMPLE_STEPS.get('MAX', 100), + step=1, + value=self.cur_paras.SAMPLE_STEPS.get('DEFAULT', 30), + interactive=True) + + self.guide_scale = gr.Slider( + label=self.component_names.guide_scale, + minimum=self.cur_paras.GUIDE_SCALE.get('MIN', 1), + maximum=self.cur_paras.GUIDE_SCALE.get('MAX', 10), + step=0.5, + value=self.cur_paras.GUIDE_SCALE.get('DEFAULT', 7.5), + interactive=True) + self.guide_rescale = gr.Slider( + label=self.component_names.guide_rescale, + minimum=self.cur_paras.GUIDE_RESCALE.get('MIN', 1), + maximum=self.cur_paras.GUIDE_RESCALE.get('MAX', 1.0), + step=0.1, + value=self.cur_paras.GUIDE_RESCALE.get('DEFAULT', 0.5), + interactive=True) + with gr.Row(equal_height=True): + with gr.Column(scale=1): + self.seed_random = gr.Checkbox( + label=self.component_names.random_seed, value=True) + with gr.Row(equal_height=True, visible=False) as self.seed_panel: + with gr.Column(scale=2): + self.image_seed = gr.Textbox(label=self.component_names.seed, + value=-1, + max_lines=1, + interactive=True) + with gr.Column(scale=1): + self.refresh_seed = gr.Button(value=refresh_symbol) + + def set_callbacks(self, model_manage_ui): + def random_checked(r): + value = -1 + return (gr.Row(visible=not r), gr.Textbox(value=value)) + + def refresh_seed(): + return random.randint(0, 10**12) + + self.seed_random.change(random_checked, + inputs=[self.seed_random], + outputs=[self.seed_panel, self.image_seed], + queue=False, + show_progress=False) + self.refresh_seed.click(refresh_seed, outputs=[self.image_seed]) + + def change_height(h): + if h not in self.cur_h_level_dict: + return gr.Dropdown() + all_choices = self.cur_h_level_dict[h] + if len(all_choices) > 0: + default = all_choices[-1] + else: + default = -1 + return gr.Dropdown(choices=all_choices, value=default) + + self.output_height.change(change_height, + inputs=[self.output_height], + outputs=[self.output_width]) diff --git a/scepter/studio/inference/inference_ui/gallery_ui.py b/scepter/studio/inference/inference_ui/gallery_ui.py new file mode 100644 index 0000000..df2108c --- /dev/null +++ b/scepter/studio/inference/inference_ui/gallery_ui.py @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- +import gradio as gr +import numpy as np +from PIL import Image + +from scepter.studio.inference.inference_ui.component_names import GalleryUIName +from scepter.studio.utils.uibase import UIBase + + +class GalleryUI(UIBase): + def __init__(self, cfg, pipe_manager, is_debug=False, language='en'): + self.pipe_manager = pipe_manager + self.component_names = GalleryUIName(language) + + def create_ui(self, *args, **kwargs): + with gr.Group(): + gr.Markdown(value=self.component_names.gallery_block_name) + with gr.Row(variant='panel', equal_height=True): + with gr.Column(scale=2, min_width=0, + visible=False) as self.before_refine_panel: + self.before_refine_gallery = gr.Gallery( + label=self.component_names. + gallery_before_refine_output, + value=[]) + with gr.Column(scale=2, min_width=0): + self.output_gallery = gr.Gallery( + label=self.component_names.gallery_diffusion_output, + value=[]) + with gr.Row(elem_classes='type_row'): + with gr.Column(scale=17): + self.prompt = gr.Textbox( + show_label=False, + placeholder=self.component_names.prompt_input, + elem_id='positive_prompt', + container=False, + autofocus=True, + elem_classes='type_row', + lines=1) + + with gr.Column(scale=3, min_width=0): + self.generate_button = gr.Button( + label='Generate', + value=self.component_names.generate, + elem_classes='type_row', + elem_id='generate_button', + visible=True) + + def set_callbacks(self, inference_ui, model_manage_ui, diffusion_ui, + mantra_ui, tuner_ui, refiner_ui, control_ui): + def generate_image( + mantra_state, tuner_state, control_state, diffusion_model, + first_stage_model, cond_stage_model, refiner_cond_model, + refiner_diffusion_model, tuner_model, custom_tuner_model, + control_model, crop_type, control_cond_image, prompt, + negative_prompt, prompt_prefix, sample, discretization, + output_height, output_width, image_number, sample_steps, + guide_scale, guide_rescale, refine_state, refine_strength, + refine_sampler, refine_discretization, refine_guide_scale, + refine_guide_rescale, style_template, style_negative_template, + image_seed): + current_pipeline = self.pipe_manager.get_pipeline_given_modules({ + 'diffusion_model': + diffusion_model, + 'first_stage_model': + first_stage_model, + 'cond_stage_model': + cond_stage_model, + 'refiner_cond_model': + refiner_cond_model, + 'refiner_diffusion_model': + refiner_diffusion_model + }) + now_pipeline = self.pipe_manager.model_level_info[diffusion_model][ + 'pipeline'][0] + used_tuner_model = [] + if not isinstance(tuner_model, list): + tuner_model = [tuner_model] + for tuner_m in tuner_model: + if tuner_m is None or tuner_m == '': + continue + if (now_pipeline + in self.pipe_manager.model_level_info['tuners'] + and tuner_m in self.pipe_manager. + model_level_info['tuners'][now_pipeline]): + tuner_m = self.pipe_manager.model_level_info['tuners'][ + now_pipeline][tuner_m]['model_info'] + used_tuner_model.append(tuner_m) + used_custom_tuner_model = [] + if not isinstance(custom_tuner_model, list): + custom_tuner_model = [custom_tuner_model] + for tuner_m in custom_tuner_model: + if tuner_m is None or tuner_m == '': + continue + if (now_pipeline in + self.pipe_manager.model_level_info['customized_tuners'] + and tuner_m in self.pipe_manager. + model_level_info['customized_tuners'][now_pipeline]): + tuner_m = self.pipe_manager.model_level_info[ + 'customized_tuners'][now_pipeline][tuner_m][ + 'model_info'] + used_custom_tuner_model.append(tuner_m) + + if (now_pipeline + in self.pipe_manager.model_level_info['controllers'] + and control_model in self.pipe_manager. + model_level_info['controllers'][now_pipeline]): + control_model = self.pipe_manager.model_level_info[ + 'controllers'][now_pipeline][control_model]['model_info'] + + prompt_rephrased = style_template.replace( + '{prompt}', prompt + ) if not style_template == '' and mantra_state else prompt + prompt_rephrased = f'{prompt_prefix}{prompt_rephrased}' if not prompt_prefix == '' else prompt_rephrased + negative_prompt_rephrased = negative_prompt + style_negative_template if mantra_state else negative_prompt + pipeline_input = { + 'prompt': prompt_rephrased, + 'negative_prompt': negative_prompt_rephrased, + 'sample': sample, + 'sample_steps': sample_steps, + 'discretization': discretization, + 'original_size_as_tuple': + [int(output_height), int(output_width)], + 'target_size_as_tuple': + [int(output_height), int(output_width)], + 'crop_coords_top_left': [0, 0], + 'guide_scale': guide_scale, + 'guide_rescale': guide_rescale, + } + if refine_state: + pipeline_input['refine_sampler'] = refine_sampler + pipeline_input['refine_discretization'] = refine_discretization + pipeline_input['refine_guide_scale'] = refine_guide_scale + pipeline_input['refine_guide_rescale'] = refine_guide_rescale + else: + refine_strength = 0 + results = current_pipeline( + pipeline_input, + num_samples=image_number, + intermediate_callback=None, + refine_strength=refine_strength, + img_to_img_strength=0, + tuner_model=used_tuner_model + + used_custom_tuner_model if tuner_state else None, + control_model=control_model if control_state else None, + control_cond_image=control_cond_image + if control_state else None, + crop_type=crop_type if control_state else None, + seed=int(image_seed)) + images = [] + before_images = [] + if 'images' in results: + images_tensor = results['images'] * 255 + images = [ + Image.fromarray(images_tensor[idx].permute( + 1, 2, 0).cpu().numpy().astype(np.uint8)) + for idx in range(images_tensor.shape[0]) + ] + if 'before_refine_images' in results and results[ + 'before_refine_images'] is not None: + before_refine_images_tensor = results[ + 'before_refine_images'] * 255 + before_images = [ + Image.fromarray(before_refine_images_tensor[idx].permute( + 1, 2, 0).cpu().numpy().astype(np.uint8)) + for idx in range(before_refine_images_tensor.shape[0]) + ] + if 'seed' in results: + print(results['seed']) + print(images, before_images) + return ( + gr.Column(visible=len(before_images) > 0), + before_images, + images, + ) + + self.generate_button.click( + generate_image, + inputs=[ + inference_ui.mantra_state, inference_ui.tuner_state, + inference_ui.control_state, model_manage_ui.diffusion_model, + model_manage_ui.first_stage_model, + model_manage_ui.cond_stage_model, + refiner_ui.refiner_cond_model, + refiner_ui.refiner_diffusion_model, tuner_ui.tuner_model, + tuner_ui.custom_tuner_model, control_ui.control_model, + control_ui.crop_type, control_ui.cond_image, self.prompt, + diffusion_ui.negative_prompt, diffusion_ui.prompt_prefix, + diffusion_ui.sampler, diffusion_ui.discretization, + diffusion_ui.output_height, diffusion_ui.output_width, + diffusion_ui.image_number, diffusion_ui.sample_steps, + diffusion_ui.guide_scale, diffusion_ui.guide_rescale, + refiner_ui.refine_state, refiner_ui.refine_strength, + refiner_ui.refine_sampler, refiner_ui.refine_discretization, + refiner_ui.refine_guide_scale, refiner_ui.refine_guide_rescale, + mantra_ui.style_template, mantra_ui.style_negative_template, + diffusion_ui.image_seed + ], + outputs=[ + self.before_refine_panel, self.before_refine_gallery, + self.output_gallery + ]) diff --git a/scepter/studio/inference/inference_ui/mantra_ui.py b/scepter/studio/inference/inference_ui/mantra_ui.py new file mode 100644 index 0000000..19c3e7c --- /dev/null +++ b/scepter/studio/inference/inference_ui/mantra_ui.py @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- +import os + +import gradio as gr +from tqdm import tqdm + +from scepter.modules.utils.file_system import FS +from scepter.studio.inference.inference_ui.component_names import MantraUIName +from scepter.studio.utils.uibase import UIBase + +refresh_symbol = '\U0001f504' # 🔄 + + +class MantraUI(UIBase): + def __init__(self, cfg, pipe_manager, is_debug=False, language='en'): + self.cfg = cfg + self.language = language + self.pipe_manager = pipe_manager + default_choices = pipe_manager.module_level_choices + default_diffusion_model = default_choices['diffusion_model']['default'] + self.default_pipeline = pipe_manager.model_level_info[ + default_diffusion_model]['pipeline'][0] + self.cfg_mantra = cfg.MANTRAS + self.name_level_style, self.all_styles = self.load_all_styles() + self.component_names = MantraUIName(language) + + def load_all_styles(self): + all_styles = {} + name_level_style = {} + for one_style in tqdm(self.cfg_mantra): + if one_style.BASE_MODEL not in name_level_style: + name_level_style[one_style.BASE_MODEL] = {} + if one_style.BASE_MODEL not in all_styles: + all_styles[one_style.BASE_MODEL] = [] + if self.language == 'zh': + name_level_style[one_style.BASE_MODEL][ + one_style.NAME_ZH] = one_style + all_styles[one_style.BASE_MODEL].append(one_style.NAME_ZH) + else: + name_level_style[one_style.BASE_MODEL][ + one_style.NAME] = one_style + all_styles[one_style.BASE_MODEL].append(one_style.NAME) + # if one_style.get('IMAGE_PATH', None): + # one_style.IMAGE_PATH = FS.get_from(one_style.IMAGE_PATH) + return name_level_style, all_styles + + def create_ui(self, *args, **kwargs): + with gr.Row(equal_height=True): + with gr.Column(scale=1): + with gr.Group(visible=True): + with gr.Row(equal_height=True): + self.style = gr.Dropdown( + label=self.component_names.mantra_styles, + choices=self.all_styles[self.default_pipeline], + value=None, + multiselect=True, + interactive=True) + with gr.Row(equal_height=True): + with gr.Column(scale=1): + self.style_name = gr.Text( + value='', + label=self.component_names.style_name) + with gr.Column(scale=1): + self.style_source = gr.Text( + value='', + label=self.component_names.style_source) + with gr.Column(scale=1): + self.style_desc = gr.Text( + value='', + label=self.component_names.style_desc) + with gr.Row(equal_height=True): + self.style_prompt = gr.Text( + value='', + label=self.component_names.style_prompt, + lines=4) + with gr.Row(equal_height=True): + self.style_negative_prompt = gr.Text( + value='', + label=self.component_names.style_negative_prompt, + lines=4) + with gr.Column(scale=1): + with gr.Group(visible=True): + with gr.Row(equal_height=True): + self.style_template = gr.Text( + value='', + label=self.component_names.style_template, + lines=2) + with gr.Row(equal_height=True): + self.style_negative_template = gr.Text( + value='', + label=self.component_names.style_negative_template, + lines=2) + with gr.Row(equal_height=True): + self.style_example = gr.Image( + label=self.component_names.style_example, + source='upload', + value=None, + interactive=False) + with gr.Row(equal_height=True): + self.style_example_prompt = gr.Text( + value='', + label=self.component_names.style_example_prompt, + lines=2) + + def set_callbacks(self, model_manage_ui): + def change_style(style, diffusion_model): + style_template = '' + style_negative_template = [] + if len(style) > 0: + style_name = style[-1] + diffusion_model_info = self.pipe_manager.model_level_info[ + diffusion_model] + now_pipeline = diffusion_model_info['pipeline'][0] + style_info = self.name_level_style[now_pipeline].get( + style_name, {}) + for st in style: + c_style_info = self.name_level_style[now_pipeline].get( + st, {}) + c_prompt = c_style_info.get('PROMPT', '') + c_negative_prompt = c_style_info.get('NEGATIVE_PROMPT', '') + if style_template == '': + style_template = c_prompt + elif '{prompt}' in style_template: + if '{prompt}' in c_prompt: + style_template = style_template.replace( + '{prompt}', c_prompt) + else: + style_template += c_prompt + style_negative_template.append(c_negative_prompt) + else: + style_name = '' + style_info = {} + style_negative_template = ','.join(style_negative_template) + if style_info.get( + 'IMAGE_PATH', + None) and not os.path.exists(style_info.IMAGE_PATH): + style_info.IMAGE_PATH = FS.get_from(style_info.IMAGE_PATH) + return (gr.Text(value=style_name), + gr.Text(value=style_info.get('SOURCE', '')), + gr.Text(value=style_info.get('PROMPT', '')), + gr.Text(value=style_info.get('NEGATIVE_PROMPT', '')), + gr.Text(value=style_template), + gr.Text(value=style_negative_template), + gr.Image(value=style_info.get('IMAGE_PATH', None)), + gr.Text(value=style_info.get('PROMPT_EXAMPLE', ''))) + + self.style.change(change_style, + inputs=[self.style, model_manage_ui.diffusion_model], + outputs=[ + self.style_name, self.style_source, + self.style_prompt, self.style_negative_prompt, + self.style_template, + self.style_negative_template, self.style_example, + self.style_example_prompt + ]) diff --git a/scepter/studio/inference/inference_ui/model_manage_ui.py b/scepter/studio/inference/inference_ui/model_manage_ui.py new file mode 100644 index 0000000..8861ad0 --- /dev/null +++ b/scepter/studio/inference/inference_ui/model_manage_ui.py @@ -0,0 +1,199 @@ +# -*- coding: utf-8 -*- + +import gradio as gr + +from scepter.studio.inference.inference_ui.component_names import \ + ModelManageUIName +from scepter.studio.utils.uibase import UIBase + +refresh_symbol = '\U0001f504' # 🔄 + + +class ModelManageUI(UIBase): + def __init__(self, cfg, pipe_manager, is_debug=False, language='en'): + self.pipe_manager = pipe_manager + self.default_choices = pipe_manager.module_level_choices + self.component_names = ModelManageUIName(language) + + def create_ui(self, *args, **kwargs): + with gr.Group(): + gr.Markdown(value=self.component_names.model_block_name) + with gr.Row(variant='panel', equal_height=True): + with gr.Column(scale=1, min_width=0) as self.diffusion_panel: + self.diffusion_model = gr.Dropdown( + label=self.component_names.diffusion_model, + choices=self.default_choices['diffusion_model'] + ['choices'], + value=self.default_choices['diffusion_model'] + ['default'], + interactive=True) + with gr.Column(scale=1, min_width=0) as self.first_stage_panel: + self.first_stage_model = gr.Dropdown( + label=self.component_names.first_stage_model, + choices=self.default_choices['first_stage_model'] + ['choices'], + value=self.default_choices['first_stage_model'] + ['default'], + interactive=False) + with gr.Column(scale=1, min_width=0) as self.cond_stage_panel: + self.cond_stage_model = gr.Dropdown( + label=self.component_names.cond_stage_model, + choices=self.default_choices['cond_stage_model'] + ['choices'], + value=self.default_choices['cond_stage_model'] + ['default'], + interactive=False) + # with gr.Accordion( + # label=self.component_names.postprocess_model_name, + # open=False): + # with gr.Row(equal_height=True): + # self.advance_postprocess_checkbox = gr.CheckboxGroup( + # # choices=['Refiners', 'Tuners'], show_label=False) + # choices=['Tuners'], show_label=False) + # with gr.Row(equal_height=True, + # visible=False) as self.refine_diffusion_panel: + # with gr.Column(variant='panel', scale=1, min_width=0): + # self.refiner_diffusion_model = gr.Dropdown( + # label=self.component_names.refine_diffusion_model, + # choices=self.default_choices[ + # 'refiner_diffusion_model']['choices'], + # value=self.default_choices[ + # 'refiner_diffusion_model']['default'], + # interactive=True) + # with gr.Column(variant='panel', scale=1, min_width=0): + # self.refiner_cond_model = gr.Dropdown( + # label=self.component_names.refine_cond_model, + # choices=self.default_choices['refiner_cond_model'] + # ['choices'], + # value=self.default_choices['refiner_cond_model'] + # ['default'], + # interactive=True) + # with gr.Column(variant='panel', scale=1, min_width=0): + # self.tuner_button = gr.Button(value=refresh_symbol) + # + # def refresh_choices(): + # return gr.update(choices=get_tuner_choices()) + # + # self.tuner_button.click(refresh_choices, [], + # [self.tuner_model]) + # with gr.Column(variant='panel', scale=4, min_width=0): + # with gr.Group() as self.tuners_group: + # with gr.Row(variant='panel') as self.tuners_panel: + # with gr.Column( + # scale=1, + # min_width=0) as self.tuners_management: + # self.load_Lora_tuner_btn = gr.Button( + # value=self.component_names. + # load_lora_tuner) + # self.load_swift_tuner_btn = gr.Button( + # value=self.component_names. + # load_swift_tuner) + # with gr.Column(scale=1, + # min_width=0) as self.load_panel: + # self.tuner_name = gr.Text( + # label='tuner_name') + # with gr.Row(variant='panel') as self.tuner_info: + # with gr.Accordion(label=self.component_names. + # postprocess_model_name, + # open=False): + # self.tuner_name = gr.Text( + # label='tuner_name') + + def set_callbacks(self, diffusion_ui, tuner_ui, control_ui, mantra_ui): + # def select_refine_tuner(all_select, evt: gr.SelectData): + # if 'Refiners' in all_select: + # refine_panel = gr.Row(visible=True) + # refine_tab = gr.Group(visible=True) + # refine_state = True + # else: + # refine_panel = gr.Row(visible=False) + # refine_tab = gr.Group(visible=False) + # refine_state = False + # # if 'Tuners' in all_select: + # # tuner_panel = gr.Row(visible=True) + # # else: + # # tuner_panel = gr.Row(visible=False) + # return refine_panel, refine_tab, refine_state + # + # self.advance_postprocess_checkbox.select( + # select_refine_tuner, + # inputs=[self.advance_postprocess_checkbox], + # outputs=[ + # self.refine_diffusion_panel, self.tuner_choice_panel, + # advance_ui.refine_tab, advance_ui.refine_state + # ]) + def diffusion_model_change(diffusion_model, control_mode): + diffusion_model_info = self.pipe_manager.model_level_info[ + diffusion_model] + now_pipeline = diffusion_model_info['pipeline'][0] + pipeline_ins = self.pipe_manager.pipeline_level_modules[ + now_pipeline] + all_module_name = {} + for module_name in self.pipe_manager.module_list: + module = getattr(pipeline_ins, module_name) + if module is None: + continue + model_name = f"{now_pipeline}_{module['name']}" + all_module_name[module_name] = model_name + if now_pipeline in self.default_choices['tuners']: + tunner_choices = self.default_choices['tuners'][now_pipeline][ + 'choices'] + else: + tunner_choices = [] + + if now_pipeline in self.default_choices[ + 'controllers'] and control_mode in self.default_choices[ + 'controllers'][now_pipeline]: + controller_choices = self.default_choices['controllers'][ + now_pipeline][control_mode]['choices'] + controller_default = self.default_choices['controllers'][ + now_pipeline][control_mode]['default'] + else: + controller_choices = [] + controller_default = '' + + default_resolutions = self.pipe_manager.pipeline_level_modules[ + now_pipeline].paras.RESOLUTIONS + h_level_dict, default_res = diffusion_ui.merge_resolutions( + diffusion_ui.h_level_dict, default_resolutions) + diffusion_ui.cur_h_level_dict = h_level_dict + + default_input = self.pipe_manager.pipeline_level_modules[ + now_pipeline].input + cur_paras = diffusion_ui.get_default(diffusion_ui.diffusion_paras, + default_input) + diffusion_ui.cur_paras = cur_paras + return ( + gr.Dropdown(value=all_module_name['first_stage_model']), + gr.Dropdown(value=all_module_name['cond_stage_model']), + gr.Dropdown(choices=tunner_choices, value=None), + gr.Dropdown(choices=controller_choices, + value=controller_default), + gr.Dropdown(choices=mantra_ui.all_styles[now_pipeline], + value=[]), + gr.Textbox(choices=cur_paras.NEGATIVE_PROMPT.get('VALUES', []), + value=cur_paras.NEGATIVE_PROMPT.get('DEFAULT', '')), + gr.Textbox(choices=cur_paras.PROMPT_PREFIX.get('VALUES', []), + value=cur_paras.PROMPT_PREFIX.get('DEFAULT', '')), + gr.Dropdown(choices=[key for key in h_level_dict.keys()], + value=default_res[0]), + gr.Dropdown(choices=cur_paras.SAMPLE.get('VALUES', []), + value=cur_paras.SAMPLE.get('DEFAULT', '')), + gr.Dropdown(choices=cur_paras.DISCRETIZATION.get('VALUES', []), + value=cur_paras.DISCRETIZATION.get('DEFAULT', '')), + gr.Slider(value=cur_paras.SAMPLE_STEPS.get('DEFAULT', 30)), + gr.Slider(value=cur_paras.GUIDE_SCALE.get('DEFAULT', 7.5)), + gr.Slider(value=cur_paras.GUIDE_RESCALE.get('DEFAULT', 0.5))) + + self.diffusion_model.change( + diffusion_model_change, + inputs=[self.diffusion_model, control_ui.control_mode], + outputs=[ + self.first_stage_model, self.cond_stage_model, + tuner_ui.tuner_model, control_ui.control_model, + mantra_ui.style, diffusion_ui.negative_prompt, + diffusion_ui.prompt_prefix, diffusion_ui.output_height, + diffusion_ui.sampler, diffusion_ui.discretization, + diffusion_ui.sample_steps, diffusion_ui.guide_scale, + diffusion_ui.guide_rescale + ]) diff --git a/scepter/studio/inference/inference_ui/refiner_ui.py b/scepter/studio/inference/inference_ui/refiner_ui.py new file mode 100644 index 0000000..7158a46 --- /dev/null +++ b/scepter/studio/inference/inference_ui/refiner_ui.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +import gradio as gr + +from scepter.studio.inference.inference_ui.component_names import RefinerUIName +from scepter.studio.utils.uibase import UIBase + +refresh_symbol = '\U0001f504' # 🔄 + + +class RefinerUI(UIBase): + def __init__(self, cfg, pipe_manager, is_debug=False, language='en'): + self.cfg = cfg + self.pipe_manager = pipe_manager + self.diffusion_paras = self.load_all_paras() + self.component_names = RefinerUIName(language) + + def load_all_paras(self): + diffusion_paras = self.cfg.DIFFUSION_PARAS + return diffusion_paras + + def create_ui(self, *args, **kwargs): + self.refine_state = gr.State(value=False) + with gr.Group(visible=False) as self.refine_tab: + with gr.Row(equal_height=True): + with gr.Column(variant='panel', scale=1, min_width=0): + self.refiner_diffusion_model = gr.Dropdown( + label=self.component_names.refine_diffusion_model, + choices=[], + value=None, + interactive=True) + with gr.Column(variant='panel', scale=1, min_width=0): + self.refiner_cond_model = gr.Dropdown( + label=self.component_names.refine_cond_model, + choices=[], + value=None, + interactive=True) + with gr.Row(equal_height=True): + self.refine_strength = gr.Slider( + label=self.component_names.refine_strength, + minimum=self.diffusion_paras.REFINE_STRENGTH.get( + 'MIN', 0.0), + maximum=self.diffusion_paras.REFINE_STRENGTH.get( + 'MAX', 1.0), + step=0.05, + value=self.diffusion_paras.REFINE_STRENGTH.get( + 'DEFAULT', 7.5), + interactive=True) + with gr.Row(equal_height=True): + with gr.Column(scale=1): + self.refine_sampler = gr.Dropdown( + label=self.component_names.refine_sample, + choices=self.diffusion_paras.REFINE_SAMPLERS.get( + 'VALUES', []), + value=self.diffusion_paras.REFINE_SAMPLERS.get( + 'DEFAULT', ''), + interactive=True) + with gr.Column(scale=1): + self.refine_discretization = gr.Dropdown( + label=self.component_names.refine_discretization, + choices=self.diffusion_paras.REFINE_DISCRETIZATION.get( + 'VALUES', []), + value=self.diffusion_paras.REFINE_DISCRETIZATION.get( + 'DEFAULT', ''), + interactive=True) + with gr.Row(equal_height=True): + with gr.Column(scale=1): + self.refine_guide_scale = gr.Slider( + label=self.component_names.refine_guide_scale, + minimum=self.diffusion_paras.REFINE_GUIDE_SCALE.get( + 'MIN', 1), + maximum=self.diffusion_paras.REFINE_GUIDE_SCALE.get( + 'MAX', 10), + step=0.5, + value=self.diffusion_paras.REFINE_GUIDE_SCALE.get( + 'DEFAULT', 7.5), + interactive=True) + with gr.Column(scale=1): + self.refine_guide_rescale = gr.Slider( + label=self.component_names.refine_guide_rescale, + minimum=self.diffusion_paras.REFINE_GUIDE_RESCALE.get( + 'MIN', 1), + maximum=self.diffusion_paras.REFINE_GUIDE_RESCALE.get( + 'MAX', 1.0), + step=0.1, + value=self.diffusion_paras.REFINE_GUIDE_RESCALE.get( + 'DEFAULT', 0.5), + interactive=True) + + def set_callbacks(self): + pass diff --git a/scepter/studio/inference/inference_ui/tuner_ui.py b/scepter/studio/inference/inference_ui/tuner_ui.py new file mode 100644 index 0000000..14ff853 --- /dev/null +++ b/scepter/studio/inference/inference_ui/tuner_ui.py @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- +import os + +import gradio as gr +from tqdm import tqdm + +from scepter.modules.utils.file_system import FS +from scepter.studio.inference.inference_ui.component_names import TunerUIName +from scepter.studio.utils.uibase import UIBase + +refresh_symbol = '\U0001f504' # 🔄 + + +class TunerUI(UIBase): + def __init__(self, cfg, pipe_manager, is_debug=False, language='en'): + self.cfg = cfg + self.pipe_manager = pipe_manager + self.default_choices = pipe_manager.module_level_choices + default_diffusion_model = self.default_choices['diffusion_model'][ + 'default'] + self.default_pipeline = pipe_manager.model_level_info[ + default_diffusion_model]['pipeline'][0] + if self.default_pipeline in self.default_choices['tuners']: + self.tunner_choices = self.default_choices['tuners'][ + self.default_pipeline]['choices'] + self.tunner_default = self.default_choices['tuners'][ + self.default_pipeline]['default'] + else: + self.tunner_choices = [] + + self.tunner_default = None + self.component_names = TunerUIName(language) + self.cfg_tuners = cfg.TUNERS + self.name_level_tuners = {} + for one_tuner in tqdm(self.cfg_tuners): + if one_tuner.BASE_MODEL not in self.name_level_tuners: + self.name_level_tuners[one_tuner.BASE_MODEL] = {} + # if one_tuner.get('IMAGE_PATH', None): + # one_tuner.IMAGE_PATH = FS.get_from(one_tuner.IMAGE_PATH) + if language == 'zh': + self.name_level_tuners[one_tuner.BASE_MODEL][ + one_tuner.NAME_ZH] = one_tuner + else: + self.name_level_tuners[one_tuner.BASE_MODEL][ + one_tuner.NAME] = one_tuner + + def create_ui(self, *args, **kwargs): + with gr.Row(equal_height=True): + with gr.Column(variant='panel', scale=1, min_width=0): + with gr.Group(visible=True): + with gr.Row(equal_height=True): + with gr.Column(scale=1): + self.tuner_model = gr.Dropdown( + label=self.component_names.tuner_model, + choices=self.tunner_choices, + value=None, + multiselect=True, + interactive=True) + with gr.Column(scale=1): + self.custom_tuner_model = gr.Dropdown( + label=self.component_names.custom_tuner_model, + choices=[], + value=None, + multiselect=True, + interactive=True) + with gr.Row(equal_height=True): + with gr.Column(scale=1): + self.tuner_type = gr.Text( + value='', + label=self.component_names.tuner_type) + with gr.Column(scale=1): + self.base_model = gr.Text( + value='', + label=self.component_names.base_model) + with gr.Column(scale=1): + self.tuner_desc = gr.Text( + value='', + label=self.component_names.tuner_desc, + lines=4) + with gr.Column(variant='panel', scale=1, min_width=0): + with gr.Group(visible=True): + with gr.Row(equal_height=True): + self.tuner_example = gr.Image( + label=self.component_names.tuner_example, + source='upload', + value=None, + interactive=False) + with gr.Row(equal_height=True): + self.tuner_prompt_example = gr.Text( + value='', + label=self.component_names.tuner_prompt_example, + lines=2) + + def set_callbacks(self, model_manage_ui): + def tuner_model_change(tuner_model, diffusion_model): + diffusion_model_info = self.pipe_manager.model_level_info[ + diffusion_model] + now_pipeline = diffusion_model_info['pipeline'][0] + tuner_info = {} + if tuner_model is not None and len(tuner_model) > 0: + tuner_info = self.name_level_tuners[now_pipeline].get( + tuner_model[-1], {}) + if tuner_info.get( + 'IMAGE_PATH', + None) and not os.path.exists(tuner_info.IMAGE_PATH): + tuner_info.IMAGE_PATH = FS.get_from(tuner_info.IMAGE_PATH) + return (gr.Text(value=tuner_info.get('TUNER_TYPE', '')), + gr.Text(value=tuner_info.get('BASE_MODEL', '')), + gr.Text(value=tuner_info.get('DESCRIPTION', '')), + gr.Image(value=tuner_info.get('IMAGE_PATH', None)), + gr.Text(value=tuner_info.get('PROMPT_EXAMPLE', ''))) + + self.tuner_model.change( + tuner_model_change, + inputs=[self.tuner_model, model_manage_ui.diffusion_model], + outputs=[ + self.tuner_type, self.base_model, self.tuner_desc, + self.tuner_example, self.tuner_prompt_example + ]) diff --git a/scepter/studio/preprocess/__init__.py b/scepter/studio/preprocess/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scepter/studio/preprocess/caption_editor_ui/__init__.py b/scepter/studio/preprocess/caption_editor_ui/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scepter/studio/preprocess/caption_editor_ui/component_names.py b/scepter/studio/preprocess/caption_editor_ui/component_names.py new file mode 100644 index 0000000..4d64f3a --- /dev/null +++ b/scepter/studio/preprocess/caption_editor_ui/component_names.py @@ -0,0 +1,125 @@ +# -*- coding: utf-8 -*- +# For dataset manager +class CreateDatasetUIName(): + def __init__(self, language='en'): + if language == 'en': + self.dataset_name = 'All Dataset' + self.btn_create_datasets = 'Create Dataset' + self.user_data_name = 'Current Dataset Name' + self.modify_data_button = 'Modify Name' + self.confirm_data_button = 'Confirm' + self.refresh_list_button = 'Refresh List' + self.zip_file = 'Upload Dataset(Zip/Txt)' + self.zip_file_url = 'Dataset Url' + self.btn_create_datasets_from_file = 'Create Dataset From File' + self.user_direction = ( + '### User Guide: \n' + + f'* {self.btn_create_datasets} button is used to create a new dataset ' + "from scratch. Please make sure to modify the dataset's name and version. After creation, " + 'you can upload images one by one. \n' + f'* The {self.btn_create_datasets_from_file} button supports creating a new dataset from ' + 'a file, currently supporting zip files. For zip files, the format should be consistent' + " with the one used during training, ensuring it contains an 'images/' folder and a '" + "train.csv' (which will use the image paths in this file); " + 'The first line is Target:FILE, Prompt, followed by the format of each line: image path, description.' + 'we also surpport the zip of ' + 'one level subfolder of images whose format are in jpg, jpeg, png, webp.\n' + f'* If you have refreshed the page, please click the {self.refresh_list_button} ' + 'button to ensure all previously created datasets are visible in the dropdown menu.\n' + '* ZIP example: https://modelscope.cn/api/v1/models/damo/scepter/repo?Revision=master&FilePath=datasets/3D_example_csv.zip \n' # noqa + '* For processing and training with large-scale data, it is recommended to use the command line.' + ) + # Error or Warning + self.illegal_data_name_err1 = ( + 'The data name is empty or contains illegal ' + "characters ' ' (space) or '/' (slash).") + self.illegal_data_name_err2 = "Please follow the format '{name}-{version}-{randomstr}'" + self.illegal_data_name_err3 = "Do not include '.' in the dataset name." + self.illegal_data_name_err4 = 'Please do not upload files and set dataset links simultaneously.' + self.illegal_data_name_err5 = 'Invalid dataset name, please switch datasets or create a new one.' + self.illegal_data_err1 = 'File download failed' + self.illegal_data_err2 = 'Illegal file format' + self.illegal_data_err3 = 'File decompression failed, failed to upload to storage!' + self.modify_data_name_err1 = 'Failed to change dataset name!' + self.refresh_data_list_info1 = ( + 'The dataset name has been changed, ' + 'please refresh the list and try again.') + elif language == 'zh': + self.dataset_name = '数据集' + self.btn_create_datasets = '新建' + self.user_data_name = '当前数据集名称' + self.modify_data_button = '修改数据集名称' + self.confirm_data_button = '确认' + self.refresh_list_button = '刷新列表' + self.zip_file = '上传数据集' + self.zip_file_url = '数据集链接' + self.btn_create_datasets_from_file = '从文件新建' + self.user_direction = ( + '### 使用说明 \n' + + f'* {self.btn_create_datasets} 按钮用于从零新建数据集,请注意修改数据集的name和version,' + '新建完成后可以逐个上传图片。\n' + + f'* {self.btn_create_datasets_from_file} 按钮支持从文件中来新建数据集,目前支持zip文件,' + '需要保证在文件夹外进行打包,并包含images/文件夹和train.csv(会使用该文件中的图片路径),首行为Target:FILE,Prompt,' + '其次每行格式为:图片路径,描述;' + '同时我们也支持图像文件的zip包,格式在jpg、jpeg、png或webp \n' + + f'* 如果刷新了页面,请点击{self.refresh_list_button} 按钮以确保所有以往创建的数据集在下拉框中可见。\n' + '* ZIP样例路径:https://modelscope.cn/api/v1/models/damo/scepter/repo?Revision=master&FilePath=datasets/3D_example_csv.zip \n' # noqa + '* 对于大规模数据的处理和训练,建议使用命令行形式') + # Error or Warning + self.illegal_data_name_err1 = "数据名称为空或包含非法字符' '或者'/'" + self.illegal_data_name_err2 = '请按照{name}-{version}-{randomstr}' + self.illegal_data_name_err3 = "数据集名称中不要包含'.'" + self.illegal_data_name_err4 = '请不要同时上传文件和设置数据集链接' + self.illegal_data_name_err5 = '不合法的数据集名称,请切换数据集或新建数据集。' + self.illegal_data_err1 = '文件下载失败' + self.illegal_data_err2 = '非法的文件格式' + self.illegal_data_err3 = '文件解压失败,上传存储器失败!' + self.modify_data_name_err1 = '变更数据集名称失败!' + self.refresh_data_list_info1 = '该数据集名称发生了变更,请刷新列表试一下。' + + +class DatasetGalleryUIName(): + def __init__(self, language='en'): + if language == 'en': + self.upload_image = 'Upload Image' + self.upload_image_btn = 'Upload' + self.image_caption = 'Image Caption' + self.dataset_images = 'Dataset Images' + self.ori_caption = 'Original Caption' + self.edit_caption = 'Editable Caption' + self.btn_modify = 'Replace Caption' + self.btn_delete = 'Delete Image' + # Error or Warning + self.delete_err1 = 'Deletion failed, the data is already empty.' + elif language == 'zh': + self.upload_image = '上传图片' + self.upload_image_btn = '上传' + self.image_caption = '图片描述' + self.dataset_images = '图片集' + self.ori_caption = '原始描述' + self.edit_caption = '编辑描述' + self.btn_modify = '替换描述' + self.btn_delete = '删除图片' + # Error or Warning + self.delete_err1 = '删除失败,数据已经为空了' + + +class ExportDatasetUIName(): + def __init__(self, language='en'): + if language == 'en': + self.btn_export_zip = 'Download Data' + self.btn_export_list = 'Export List' + self.export_file = 'Download Data' + # Error or Warning + self.export_err1 = 'The dataset is empty, export is not possible!' + self.export_zip_err1 = 'Failed to compress the file!' + self.upload_err1 = 'Failed to compress the file!' + self.go_to_train = 'Go to train...' + elif language == 'zh': + self.btn_export_zip = '导出数据' + self.btn_export_list = '导出列表' + self.export_file = '下载数据' + self.export_err1 = '数据集为空,无法导出!' + self.export_zip_err1 = '压缩文件失败!' + self.upload_err1 = '压缩文件失败!' + self.go_to_train = '去训练...' diff --git a/scepter/studio/preprocess/caption_editor_ui/create_dataset_ui.py b/scepter/studio/preprocess/caption_editor_ui/create_dataset_ui.py new file mode 100644 index 0000000..a683a23 --- /dev/null +++ b/scepter/studio/preprocess/caption_editor_ui/create_dataset_ui.py @@ -0,0 +1,605 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +import copy +import csv +import datetime +import json +import os.path + +import gradio as gr +from PIL import Image +from tqdm import tqdm + +from scepter.modules.utils.directory import get_md5 +from scepter.modules.utils.file_system import FS +from scepter.studio.preprocess.caption_editor_ui.component_names import \ + CreateDatasetUIName +from scepter.studio.utils.uibase import UIBase + +refresh_symbol = '\U0001f504' # 🔄 + + +class CreateDatasetUI(UIBase): + def __init__(self, cfg, is_debug=False, language='en'): + self.work_dir = cfg.WORK_DIR + self.dir_list = FS.walk_dir(self.work_dir, recurse=False) + self.cache_file = {} + self.meta_dict = {} + self.dataset_list = self.load_history() + self.components_name = CreateDatasetUIName(language) + + def load_meta(self, meta_file): + dataset_meta = json.load(open(meta_file, 'r')) + return dataset_meta + + def write_csv(self, file_list, save_csv, data_folder): + with FS.put_to(save_csv) as local_path: + print(local_path) + with open(local_path, 'w') as f: + writer = csv.writer(f) + writer.writerow(['Target:FILE', 'Prompt']) + for one_file in file_list: + relative_file = one_file['relative_path'] + if relative_file.startswith('/'): + relative_file = relative_file[1:] + writer.writerow([relative_file, one_file['caption']]) + return save_csv + + def write_file_list(self, file_list, save_csv): + with FS.put_to(save_csv) as local_path: + print(local_path) + with open(local_path, 'w') as f: + for one_file in file_list: + is_flag, file_path = self.del_prefix( + one_file['image_path'], prefix=one_file['prefix']) + f.write('{},{},{},{}\n'.format(file_path, + one_file['width'], + one_file['height'], + one_file['caption'])) + return save_csv + + def save_meta(self, meta, dataset_folder): + meta_file = os.path.join(dataset_folder, 'meta.json') + save_meta = copy.deepcopy(meta) + if 'local_work_dir' in meta: + save_meta.pop('local_work_dir') + if 'work_dir' in meta: + save_meta.pop('work_dir') + with FS.put_to(meta_file) as local_path: + json.dump(save_meta, open(local_path, 'w')) + return meta_file + + def construct_meta(self, cursor, file_list, dataset_folder, user_name): + ''' + { + "dataset_name": "xxxx", + "dataset_scale": 100, + "file_list": "xxxxx", # image_path#;#width#;#height#;#caption + "update_time": "", + "create_time": "" + } + ''' + train_csv = os.path.join(dataset_folder, 'train.csv') + train_csv = self.write_csv(file_list, train_csv, dataset_folder) + save_file_list = os.path.join(dataset_folder, 'file.csv') + save_file_list = self.write_file_list(file_list, save_file_list) + meta = { + 'dataset_name': user_name, + 'cursor': cursor, + 'file_list': file_list, + 'train_csv': train_csv, + 'save_file_list': save_file_list + } + self.save_meta(meta, dataset_folder) + return meta + + def load_from_list(self, save_file, dataset_folder, local_dataset_folder): + file_list = [] + images_folder = os.path.join(local_dataset_folder, 'images') + os.makedirs(images_folder, exist_ok=True) + with FS.get_from(save_file) as local_path: + all_remote_list, all_local_list = [], [] + all_save_list = [] + with open(local_path, 'r') as f: + for line in tqdm(f): + line = line.strip() + if line == '': + continue + try: + image_path, width, height, caption = line.split( + '#;#', 3) + except Exception: + try: + image_path, width, height, caption = line.split( + ',', 3) + except Exception: + raise gr.Error('列表只支持,或#;#作为分割符,四列分别为图像路径/宽/高/描述') + is_legal, new_path, prefix = self.find_prefix(image_path) + try: + int(width), int(height) + except Exception: + raise gr.Error(f'不合法的width({width}),height({height})') + + if not is_legal: + raise gr.Error( + f'路径不支持{image_path},应该为oss路径(oss://)或者省略前缀(xxx/xxx)' + ) + relative_path = os.path.join('images', + image_path.split('/')[-1]) + + all_remote_list.append(new_path) + all_local_list.append( + os.path.join(local_dataset_folder, relative_path)) + all_save_list.append( + os.path.join(dataset_folder, relative_path)) + file_list.append({ + 'image_path': + os.path.join(dataset_folder, relative_path), + 'relative_path': + relative_path, + 'width': + int(width), + 'height': + int(height), + 'caption': + caption, + 'prefix': + prefix, + 'edit_caption': + caption + }) + cache_file_list = [] + for idx, local_path in enumerate( + FS.get_batch_objects_from(all_remote_list)): + if local_path is None: + raise gr.Error(f'下载图像失败{all_remote_list[idx]}') + _ = FS.put_object_from_local_file(local_path, all_local_list[idx]) + cache_file_list.append(local_path) + + for local_path, target_path, flg in FS.put_batch_objects_to( + cache_file_list, all_save_list): + if not flg: + raise gr.Error(f'上传图像失败{local_path}') + if os.path.exists(local_path): + try: + os.remove(local_path) + except Exception: + pass + + return file_list + + def load_from_zip(self, save_file, data_folder, local_dataset_folder): + with FS.get_from(save_file) as local_path: + res = os.popen( + f"unzip -o '{local_path}' -d '{local_dataset_folder}'") + res = res.readlines() + if not os.path.exists(local_dataset_folder): + raise gr.Error(f'解压{save_file}失败{str(res)}') + file_folder = None + train_list = None + hit_dir = None + raw_list = [] + mac_osx = os.path.join(local_dataset_folder, '__MACOSX') + if os.path.exists(mac_osx): + res = os.popen(f"rm -rf '{mac_osx}'") + res = res.readlines() + for one_dir in FS.walk_dir(local_dataset_folder, recurse=False): + if one_dir.endswith('__MACOSX'): + res = os.popen(f"rm -rf '{one_dir}'") + res = res.readlines() + continue + if FS.isdir(one_dir): + sub_dir = FS.walk_dir(one_dir) + for one_s_dir in sub_dir: + if FS.isdir(one_s_dir) and one_s_dir.split( + one_dir)[1].replace('/', '') == 'images': + file_folder = one_s_dir + hit_dir = one_dir + if FS.isfile(one_s_dir) and one_s_dir.split( + one_dir)[1].replace('/', '') == 'train.csv': + train_list = one_s_dir + if file_folder is not None and train_list is not None: + break + if (one_s_dir.endswith('.jpg') + or one_s_dir.endswith('.jpeg') + or one_s_dir.endswith('.png') + or one_s_dir.endswith('.webp')): + raw_list.append(one_s_dir) + else: + if (one_dir.endswith('.jpg') or one_dir.endswith('.jpeg') + or one_dir.endswith('.png') + or one_dir.endswith('.webp')): + raw_list.append(one_dir) + + if file_folder is None and len(raw_list) < 1: + raise gr.Error( + "images folder or train.csv doesn't exists, or nothing exists in your zip" + ) + new_file_folder = f'{local_dataset_folder}/images' + os.makedirs(new_file_folder, exist_ok=True) + if file_folder is not None: + res = os.popen(f"mv '{file_folder}'/* '{new_file_folder}'") + res = res.readlines() + elif len(raw_list) > 0: + raw_list = list(set(raw_list)) + for img_id, cur_image in enumerate(raw_list): + _, surfix = os.path.splitext(cur_image) + try: + os.rename( + os.path.abspath(cur_image), + f'{new_file_folder}/{get_md5(cur_image)}{surfix}') + raw_list[img_id] = [ + os.path.join('images', + f'{get_md5(cur_image)}{surfix}'), + cur_image.split('/')[-1] + ] + except Exception as e: + print(e) + + if not os.path.exists(new_file_folder): + raise gr.Error(f'{str(res)}') + new_train_list = f'{local_dataset_folder}/train.csv' + if train_list is None or not os.path.exists(train_list): + with open(new_train_list, 'w') as f: + writer = csv.writer(f) + writer.writerow(['Target:FILE', 'Prompt']) + for cur_image, cur_prompt in raw_list: + writer.writerow([cur_image, cur_prompt]) + else: + res = os.popen(f"mv '{train_list}' '{new_train_list}'") + res = res.readlines() + if not os.path.exists(new_train_list): + raise gr.Error(f'{str(res)}') + res = os.popen(f"rm -rf '{hit_dir}'") + res = res.readlines() + file_list = self.load_train_csv(new_train_list, data_folder) + return file_list + + def get_image_meta(self, image): + img = Image.open(image) + return img.size + + def load_train_csv(self, file_path, data_folder): + base_folder = os.path.dirname(file_path) + file_list = [] + with open(file_path, 'r') as f: + reader = csv.reader(f) + for row in reader: + image_path, prompt = row[0], row[1] + if image_path == 'Target:FILE': + continue + local_image_path = os.path.join(base_folder, image_path) + w, h = self.get_image_meta(local_image_path) + file_list.append({ + 'image_path': + os.path.join(data_folder, image_path), + 'relative_path': + image_path, + 'width': + w, + 'height': + h, + 'caption': + prompt, + 'prefix': + '', + 'edit_caption': + prompt + }) + return file_list + + def find_prefix(self, file_path): + for k in FS._prefix_to_clients.keys(): + if file_path.startswith(k): + return True, file_path, '' + elif FS.exists(os.path.join(k, file_path)): + return True, os.path.join(k, file_path), '' + elif FS.exists(os.path.join(k, 'datasets', file_path)): + return True, os.path.join(k, 'datasets', file_path), 'datasets' + return False, None, None + + def del_prefix(self, file_path, prefix=''): + for k in FS._prefix_to_clients.keys(): + if file_path.startswith(k): + file_path = file_path.replace(k, '') + while file_path.startswith('/'): + file_path = file_path[1:] + if not prefix == '' and file_path.startswith(prefix): + file_path = file_path.split(prefix)[-1] + while file_path.startswith('/'): + file_path = file_path[1:] + return True, file_path + return False, file_path + + def load_history(self): + dataset_list = [] + for one_dir in self.dir_list: + if FS.isdir(one_dir): + meta_file = os.path.join(one_dir, 'meta.json') + if FS.exists(meta_file): + local_dataset_folder, _ = FS.map_to_local(one_dir) + local_dataset_folder = FS.get_dir_to_local_dir( + one_dir, local_dataset_folder) + meta_data = self.load_meta( + os.path.join(local_dataset_folder, 'meta.json')) + meta_data['local_work_dir'] = local_dataset_folder + meta_data['work_dir'] = one_dir + dataset_list.append(meta_data['dataset_name']) + self.meta_dict[meta_data['dataset_name']] = meta_data + return dataset_list + + def create_ui(self): + with gr.Box(): + gr.Markdown(self.components_name.user_direction) + with gr.Box(): + with gr.Row(): + with gr.Column(scale=1, min_width=0): + self.dataset_name = gr.Dropdown( + label=self.components_name.dataset_name, + choices=self.dataset_list, + interactive=True) + with gr.Column(scale=1, min_width=0): + self.refresh_dataset_name = gr.Button( + value=self.components_name.refresh_list_button) + self.btn_create_datasets = gr.Button( + value=self.components_name.btn_create_datasets) + self.btn_create_datasets_from_file = gr.Button( + value=self.components_name. + btn_create_datasets_from_file) + self.panel_state = gr.Checkbox(label='panel_state', + value=False, + visible=False) + with gr.Column(scale=2, min_width=0): + with gr.Row(equal_height=True): + with gr.Column(visible=False, min_width=0) as panel: + self.user_data_name = gr.Text( + label=self.components_name.user_data_name, + value='', + interactive=True) + self.user_data_name_state = gr.State(value='') + self.create_mode = gr.State(value=0) + with gr.Column(visible=False, + min_width=0) as file_panel: + self.file_path = gr.File( + label=self.components_name.zip_file, + min_width=0, + file_types=['.zip', '.txt', '.csv']) + self.file_path_url = gr.Text( + label=self.components_name.zip_file_url, + value='', + visible=False) + with gr.Column(visible=False, + min_width=0) as btn_panel: + self.random_data_button = gr.Button( + value=refresh_symbol) + self.confirm_data_button = gr.Button( + value=self.components_name.confirm_data_button) + with gr.Column(visible=False, + min_width=0) as modify_panel: + self.modify_data_button = gr.Button( + value=self.components_name.modify_data_button) + + self.dataset_panel = panel + self.btn_panel = btn_panel + self.file_panel = file_panel + self.modify_panel = modify_panel + + def set_callbacks(self, gallery_dataset, export_dataset): + def show_dataset_panel(): + return (gr.Column(visible=False), gr.Column(visible=True), + gr.Column(visible=True), + gr.Checkbox(value=False, visible=False), + gr.Text(value=get_random_dataset_name(), + interactive=True), 1) + + def show_file_panel(): + return (gr.Column(visible=True), gr.Column(visible=True), + gr.Column(visible=True), + gr.Checkbox(value=False, visible=False), + gr.Text(value=get_random_dataset_name(), interactive=True), + gr.File(value=None), gr.Text(value='', visible=False), 2) + + def get_random_dataset_name(): + data_name = 'name-version-{0:%Y%m%d_%H_%M_%S}'.format( + datetime.datetime.now()) + return data_name + + def refresh(): + return gr.Dropdown(value=self.dataset_list[-1] + if len(self.dataset_list) > 0 else '', + choices=self.dataset_list) + + self.refresh_dataset_name.click(refresh, outputs=[self.dataset_name]) + + def confirm_create_dataset(user_name, create_mode, file_url, file_path, + panel_state): + if user_name.strip() == '' or ' ' in user_name or '/' in user_name: + raise gr.Error(self.components_name.illegal_data_name_err1) + + if len(user_name.split('-')) < 3: + raise gr.Error(self.components_name.illegal_data_name_err2) + + if '.' in user_name: + raise gr.Error(self.components_name.illegal_data_name_err3) + + if not file_url.strip() == '' and file_path is not None: + raise gr.Error(self.components_name.illegal_data_name_err4) + if create_mode == 1 and not file_url.strip() == '': + file_name, surfix = os.path.splitext(file_url.split('?')[0]) + save_file = os.path.join(self.work_dir, f'{user_name}{surfix}') + with FS.put_to(save_file) as local_path: + res = os.popen(f"wget '{file_url}' -O '{local_path}'") + res.readlines() + if not FS.exists(save_file): + raise gr.Error( + f'{self.components_name.illegal_data_err1} {str(res)}') + elif create_mode == 2 and file_path is not None and file_path.name: + self.cache_file[user_name] = { + 'file_name': file_path.name, + 'surfix': os.path.splitext(file_path.name)[-1] + } + cache_file = self.cache_file.pop(user_name) + surfix = cache_file['surfix'] + ori_file = cache_file['file_name'] + save_file = os.path.join(self.work_dir, f'{user_name}{surfix}') + with FS.put_to(save_file) as local_path: + res = os.popen(f"cp '{ori_file}' '{local_path}'") + res = res.readlines() + if not FS.exists(save_file): + raise gr.Error( + f'{self.components_name.illegal_data_err1}{str(res)}') + else: + surfix = None + # untar file or create blank dataset + dataset_folder = os.path.join(self.work_dir, user_name) + local_dataset_folder, _ = FS.map_to_local(dataset_folder) + if surfix == '.zip': + file_list = self.load_from_zip(save_file, dataset_folder, + local_dataset_folder) + elif surfix in ['.txt', '.csv']: + file_list = self.load_from_list(save_file, dataset_folder, + local_dataset_folder) + elif surfix is None: + file_list = [] + else: + raise gr.Error( + f'{self.components_name.illegal_data_err2} {surfix}') + is_flag = FS.put_dir_from_local_dir(local_dataset_folder, + dataset_folder) + if not is_flag: + raise gr.Error(f'{self.components_name.illegal_data_err3}') + + cursor = 0 if len(file_list) > 0 else -1 + meta = self.construct_meta(cursor, file_list, dataset_folder, + user_name) + + meta['local_work_dir'] = local_dataset_folder + meta['work_dir'] = dataset_folder + + self.meta_dict[meta['dataset_name']] = meta + self.dataset_list.append(meta['dataset_name']) + return ( + gr.Checkbox(value=True, visible=False), + gr.Dropdown(value=user_name, choices=self.dataset_list), + ) + + def clear_file(): + return gr.Text(visible=True) + + # Click Create + self.btn_create_datasets.click(show_dataset_panel, [], [ + self.file_panel, self.dataset_panel, self.btn_panel, + self.panel_state, self.user_data_name, self.create_mode + ]) + + self.btn_create_datasets_from_file.click(show_file_panel, [], [ + self.file_panel, self.dataset_panel, self.btn_panel, + self.panel_state, self.user_data_name, self.file_path, + self.file_path_url, self.create_mode + ]) + + # Click Refresh + self.random_data_button.click(get_random_dataset_name, [], + [self.user_data_name]) + + self.file_path.clear(clear_file, outputs=[self.file_path_url]) + + # Click Confirm + self.confirm_data_button.click(confirm_create_dataset, [ + self.user_data_name, self.create_mode, self.file_path_url, + self.file_path, self.panel_state + ], [self.panel_state, self.dataset_name]) + + def show_edit_panel(panel_state, data_name): + if panel_state: + return (gr.Row(visible=True), gr.Row(visible=True), + gr.Row(visible=True), gr.Column(visible=True), + gr.Column(visible=False), gr.Column(visible=False), + data_name) + else: + return (gr.Row(visible=False), gr.Row(visible=False), + gr.Row(visible=False), gr.Column(visible=False), + gr.Column(), gr.Column(), data_name) + + self.panel_state.change( + show_edit_panel, [self.panel_state, self.dataset_name], [ + gallery_dataset.gallery_panel, gallery_dataset.upload_panel, + export_dataset.export_panel, self.modify_panel, + self.file_panel, self.btn_panel, self.user_data_name_state + ]) + + def modify_data_name(user_name, prev_data_name): + print( + f'Current file name {prev_data_name}, new file name {user_name}.' + ) + if user_name.strip() == '' or ' ' in user_name or '/' in user_name: + raise gr.Error(self.components_name.illegal_data_name_err1) + if len(user_name.split('-')) < 3: + raise gr.Error(self.components_name.illegal_data_name_err2) + if '.' in user_name: + raise gr.Error(self.components_name.illegal_data_name_err3) + if user_name != prev_data_name: + if prev_data_name in self.meta_dict: + ori_meta = self.meta_dict[prev_data_name] + dataset_folder = os.path.join(self.work_dir, user_name) + local_dataset_folder, _ = FS.map_to_local(dataset_folder) + os.makedirs(local_dataset_folder, exist_ok=True) + is_flag = FS.get_dir_to_local_dir(ori_meta['work_dir'], + local_dataset_folder) + file_list = ori_meta['file_list'] + is_flag = FS.put_dir_from_local_dir( + local_dataset_folder, dataset_folder) + if not is_flag: + raise gr.Error(self.components_name.illegal_data_err3) + is_flag = FS.put_dir_from_local_dir( + local_dataset_folder, dataset_folder) + if not is_flag: + raise gr.Error(self.components_name.illegal_data_err3) + cursor = ori_meta['cursor'] + meta = self.construct_meta(cursor, file_list, + dataset_folder, user_name) + meta['local_work_dir'] = local_dataset_folder + meta['work_dir'] = dataset_folder + + if prev_data_name in self.dataset_list: + self.dataset_list.remove(prev_data_name) + self.dataset_list.append(user_name) + self.meta_dict.pop(prev_data_name) + self.meta_dict[user_name] = meta + _ = FS.delete_object( + os.path.join(ori_meta['work_dir'], 'meta.json')) + _ = FS.delete_object( + os.path.join(ori_meta['local_work_dir'], 'meta.json')) + else: + raise gr.Error(self.components_name.modify_data_name_err1) + return user_name, gr.Dropdown( + choices=self.dataset_list, + value=user_name, + select_index=len(self.dataset_list) - 1) + else: + return user_name, gr.Dropdown() + + self.modify_data_button.click( + modify_data_name, + inputs=[self.user_data_name, self.user_data_name_state], + outputs=[self.user_data_name_state, self.dataset_name]) + + def dataset_change(user_name): + if user_name is None or user_name == '': + raise gr.Error(self.components_name.illegal_data_name_err5 + + f'{user_name}') + if user_name not in self.meta_dict: + raise gr.Error(self.components_name.refresh_data_list_info1) + return (gr.Column(visible=True), gr.Column(visible=False), + gr.Checkbox(value=True, visible=False), + gr.Text(value=user_name, + interactive=True), gr.Text(value=user_name)) + + self.dataset_name.change(dataset_change, + inputs=[self.dataset_name], + outputs=[ + self.dataset_panel, self.file_panel, + self.panel_state, self.user_data_name, + gallery_dataset.gallery_state + ]) diff --git a/scepter/studio/preprocess/caption_editor_ui/dataset_gallery_ui.py b/scepter/studio/preprocess/caption_editor_ui/dataset_gallery_ui.py new file mode 100644 index 0000000..d723f73 --- /dev/null +++ b/scepter/studio/preprocess/caption_editor_ui/dataset_gallery_ui.py @@ -0,0 +1,288 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +import os.path + +import gradio as gr +import imagehash + +from scepter.modules.utils.file_system import FS +from scepter.studio.preprocess.caption_editor_ui.component_names import \ + DatasetGalleryUIName +from scepter.studio.preprocess.caption_editor_ui.create_dataset_ui import \ + CreateDatasetUI +from scepter.studio.utils.uibase import UIBase + + +class DatasetGalleryUI(UIBase): + def __init__(self, cfg, is_debug=False, language='en'): + self.selected_path = '' + self.selected_index = -1 + self.selected_index_prev = -1 + self.component_names = DatasetGalleryUIName(language) + + def create_ui(self): + with gr.Row(variant='panel', visible=False, + equal_height=True) as upload_panel: + with gr.Column(): + self.upload_image = gr.Image( + label=self.component_names.upload_image, + tool='sketch', + type='pil') + with gr.Column(min_width=80): + self.caption = gr.Textbox( + label=self.component_names.image_caption, + placeholder='', + value='', + lines=5) + self.upload_button = gr.Button( + value=self.component_names.upload_image_btn) + + with gr.Row(visible=False, equal_height=True) as gallery_panel: + with gr.Row(visible=False): + # self.gallery_state = gr.Checkbox(label='gallery_state', value=False, visible=False) + self.cbg_hidden_dataset_filter = gr.CheckboxGroup( + label='Dataset Filter') + self.nb_hidden_dataset_filter_apply = gr.Number( + label='Filter Apply', value=-1) + self.btn_hidden_set_index = gr.Button( + elem_id='dataset_tag_editor_btn_hidden_set_index') + self.nb_hidden_image_index = gr.Number(value=None, + label='hidden_idx_next') + self.nb_hidden_image_index_prev = gr.Number( + value=None, label='hidden_idx_prev') + self.gallery_state = gr.Text(label='gallery_state', + value='', + visible=False) + + # with gr.Row(variant='panel', equal_height=True): + with gr.Column(scale=1): + self.gl_dataset_images = gr.Gallery( + label=self.component_names.dataset_images, + elem_id='dataset_tag_editor_dataset_gallery', + columns=4) + with gr.Column(scale=1): + with gr.Row(equal_height=True): + self.info = gr.Text(value='', + label=None, + show_label=False, + interactive=False) + with gr.Row(equal_height=True): + with gr.Column(scale=1, min_width=0): + self.ori_caption = gr.Textbox( + label=self.component_names.ori_caption, + placeholder='', + value='', + lines=10, + autoscroll=False, + interactive=False) + with gr.Column(scale=1, min_width=0): + self.edit_caption = gr.Textbox( + label=self.component_names.edit_caption, + placeholder='', + value='', + lines=10, + autoscroll=False, + interactive=True) + with gr.Row(equal_height=True): + self.modify_button = gr.Button( + value=self.component_names.btn_modify) + with gr.Row(equal_height=True): + self.delete_button = gr.Button( + value=self.component_names.btn_delete) + + self.upload_panel = upload_panel + self.gallery_panel = gallery_panel + + def set_callbacks(self, create_dataset: CreateDatasetUI): + def change_gallery(dataset_name): + meta_data = create_dataset.meta_dict[dataset_name] + if len(meta_data['file_list']) > 0: + cursor = create_dataset.meta_dict[dataset_name]['cursor'] + else: + cursor = -1 + image_list = [ + os.path.join(meta_data['local_work_dir'], v['relative_path']) + for v in meta_data['file_list'] + ] + if cursor >= 0: + return gr.Gallery(label=dataset_name, + value=image_list, + selected_index=cursor) + else: + return gr.Gallery(label=dataset_name, + value=image_list, + selected_index=None) + + self.gallery_state.change(change_gallery, + inputs=[create_dataset.user_data_name], + outputs=[self.gl_dataset_images]) + + def select_image(dataset_name, evt: gr.SelectData): + meta_data = create_dataset.meta_dict[dataset_name] + if len(meta_data['file_list']) > 0: + current_info = meta_data['file_list'][evt.index] + create_dataset.meta_dict[dataset_name]['cursor'] = evt.index + cursor = evt.index + else: + current_info = {'caption': ''} + cursor = -1 + + all_number = len(meta_data['file_list']) + if cursor >= 0: + return (gr.Gallery(selected_index=cursor), + gr.Textbox(value=current_info['caption']), + gr.Textbox(value=current_info['edit_caption']), + gr.Text(value=f'{cursor+1}/{all_number}')) + else: + return (gr.Gallery(value=[], selected_index=None), + gr.Textbox(value=current_info['caption']), + gr.Textbox(value=current_info['edit_caption']), + gr.Text(value=f'{cursor + 1}/{all_number}')) + + def change_image(dataset_name): + meta_data = create_dataset.meta_dict[dataset_name] + cursor = create_dataset.meta_dict[dataset_name]['cursor'] + if cursor >= 0: + current_info = meta_data['file_list'][cursor] + else: + current_info = {'caption': '', 'edit_caption': ''} + all_number = len(meta_data['file_list']) + return (gr.Textbox(value=current_info['caption']), + gr.Textbox(value=current_info['edit_caption']), + gr.Text(value=f'{cursor+1}/{all_number}')) + + def change_caption(dataset_name, edit_caption): + cursor = create_dataset.meta_dict[dataset_name]['cursor'] + create_dataset.meta_dict[dataset_name]['file_list'][cursor][ + 'caption'] = edit_caption + create_dataset.save_meta( + create_dataset.meta_dict[dataset_name], + create_dataset.meta_dict[dataset_name]['work_dir']) + return gr.Textbox(value=edit_caption) + + self.gl_dataset_images.select(select_image, + inputs=[create_dataset.user_data_name], + outputs=[ + self.gl_dataset_images, + self.ori_caption, self.edit_caption, + self.info + ]) + self.gl_dataset_images.change( + change_image, + inputs=[create_dataset.user_data_name], + outputs=[self.ori_caption, self.edit_caption, self.info]) + + self.modify_button.click( + change_caption, + inputs=[create_dataset.user_data_name, self.edit_caption], + outputs=[self.ori_caption]) + + def delete_file(dataset_name): + cursor = create_dataset.meta_dict[dataset_name]['cursor'] + if len(create_dataset.meta_dict[dataset_name]['file_list']) < 1: + raise gr.Error(self.component_names.delete_err1) + current_file = create_dataset.meta_dict[dataset_name][ + 'file_list'].pop(cursor) + local_file = os.path.join( + create_dataset.meta_dict[dataset_name]['local_work_dir'], + current_file['relative_path']) + try: + os.remove(local_file) + except Exception: + print(f'remove file {local_file} error') + if cursor >= len( + create_dataset.meta_dict[dataset_name]['file_list']): + cursor = 0 + create_dataset.meta_dict[dataset_name]['cursor'] = cursor + create_dataset.save_meta( + create_dataset.meta_dict[dataset_name], + create_dataset.meta_dict[dataset_name]['work_dir']) + current_info = create_dataset.meta_dict[dataset_name]['file_list'][ + cursor] + image_list = [ + os.path.join( + create_dataset.meta_dict[dataset_name]['local_work_dir'], + v['relative_path']) + for v in create_dataset.meta_dict[dataset_name]['file_list'] + ] + return (gr.Gallery(value=image_list, selected_index=cursor), + gr.Textbox(value=current_info['caption']), + gr.Textbox(value=current_info['caption'] + if current_info['edit_caption'] == + '' else current_info['edit_caption']), + gr.Text(value=f'{cursor + 1}/{len(image_list)}')) + + self.delete_button.click(delete_file, + inputs=[create_dataset.user_data_name], + outputs=[ + self.gl_dataset_images, self.ori_caption, + self.edit_caption, self.info + ]) + + def add_file(dataset_name, upload_image, caption): + if 'image' in upload_image: + image = upload_image['image'] + + else: + image = upload_image + w, h = image.size + meta = create_dataset.meta_dict[dataset_name] + local_work_dir = meta['local_work_dir'] + work_dir = meta['work_dir'] + + save_folder = os.path.join(local_work_dir, 'images') + os.makedirs(save_folder, exist_ok=True) + + relative_path = os.path.join('images', + f'{imagehash.phash(image)}.png') + image_path = os.path.join(work_dir, relative_path) + + local_image_path = os.path.join(local_work_dir, relative_path) + with FS.put_to(image_path) as local_path: + image.save(local_path) + + image.save(local_image_path) + + meta['file_list'].append({ + 'image_path': image_path, + 'relative_path': relative_path, + 'width': w, + 'height': h, + 'caption': caption, + 'prefix': '', + 'edit_caption': caption + }) + + meta['cursor'] = len(meta['file_list']) - 1 + create_dataset.meta_dict[dataset_name] = meta + image_list = [ + os.path.join( + create_dataset.meta_dict[dataset_name]['local_work_dir'], + v['relative_path']) + for v in create_dataset.meta_dict[dataset_name]['file_list'] + ] + return (gr.Gallery(value=image_list, + selected_index=meta['cursor']), + gr.Textbox(value=caption), gr.Textbox(value=caption), + gr.Text(value=f"{meta['cursor'] + 1}/{len(image_list)}")) + + self.upload_button.click(add_file, + inputs=[ + create_dataset.user_data_name, + self.upload_image, self.caption + ], + outputs=[ + self.gl_dataset_images, self.ori_caption, + self.edit_caption, self.info + ]) + + def edit_caption_change(dataset_name, edit_caption): + meta = create_dataset.meta_dict[dataset_name] + cursor = meta['cursor'] + if cursor >= 0: + meta['file_list'][cursor]['edit_caption'] = edit_caption + + self.edit_caption.change( + edit_caption_change, + inputs=[create_dataset.user_data_name, self.edit_caption]) diff --git a/scepter/studio/preprocess/caption_editor_ui/export_dataset_ui.py b/scepter/studio/preprocess/caption_editor_ui/export_dataset_ui.py new file mode 100644 index 0000000..24abb61 --- /dev/null +++ b/scepter/studio/preprocess/caption_editor_ui/export_dataset_ui.py @@ -0,0 +1,139 @@ +# -*- coding: utf-8 -*- +from __future__ import annotations + +import os +import urllib.parse as parse + +import gradio as gr + +from scepter.modules.utils.file_system import FS +from scepter.studio.preprocess.caption_editor_ui.component_names import \ + ExportDatasetUIName +from scepter.studio.utils.uibase import UIBase + + +class ExportDatasetUI(UIBase): + def __init__(self, cfg, is_debug=False, language='en'): + self.dataset_name = '' + self.work_dir = cfg.WORK_DIR + self.export_folder = os.path.join(self.work_dir, cfg.EXPORT_DIR) + self.component_names = ExportDatasetUIName(language) + + def create_ui(self): + with gr.Row(variant='panel', visible=False, + equal_height=True) as export_panel: + self.data_state = gr.State(value=False) + with gr.Column(scale=1, min_width=0): + self.export_to_zip = gr.Button( + value=self.component_names.btn_export_zip) + self.export_url = gr.File( + label=self.component_names.export_file, + visible=False, + value=None, + interactive=False, + show_label=True) + with gr.Column(scale=1, min_width=0): + self.go_to_train = gr.Button( + value=self.component_names.go_to_train, size='lg') + self.export_panel = export_panel + + def set_callbacks(self, create_dataset, manager): + def export_zip(dataset_name): + meta = create_dataset.meta_dict[dataset_name] + work_dir = meta['work_dir'] + local_work_dir = meta['local_work_dir'] + train_csv = os.path.join(work_dir, 'train.csv') + if len(meta['file_list']) < 1: + raise gr.Error(self.component_names.export_err1) + train_csv = create_dataset.write_csv(meta['file_list'], train_csv, + work_dir) + _ = FS.get_from(train_csv, os.path.join(local_work_dir, + 'train.csv')) + save_file_list = work_dir + '_file.csv' + save_file_list = create_dataset.write_file_list( + meta['file_list'], save_file_list) + _ = FS.get_from(save_file_list, + os.path.join(local_work_dir, 'file.csv')) + zip_path = os.path.join(self.export_folder, f'{dataset_name}.zip') + with FS.put_to(zip_path) as local_zip: + res = os.popen( + f"cd '{local_work_dir}' && mkdir -p '{dataset_name}' " + f"&& cp -rf images '{dataset_name}/images' " + f"&& cp -rf train.csv '{dataset_name}/train.csv' " + f"&& zip -r '{os.path.abspath(local_zip)}' '{dataset_name}'/* " + f"&& rm -rf '{dataset_name}'") + print(res.readlines()) + + if not FS.exists(zip_path): + raise gr.Error(self.component_names.export_zip_err1) + create_dataset.save_meta(meta, work_dir) + local_zip = FS.get_from(zip_path) + return gr.File(value=local_zip, visible=True) + + self.export_to_zip.click(export_zip, + inputs=[create_dataset.user_data_name], + outputs=[self.export_url]) + + def export_csv(dataset_name): + meta = create_dataset.meta_dict[dataset_name] + work_dir = meta['work_dir'] + local_work_dir = meta['local_work_dir'] + train_csv = os.path.join(work_dir, 'train.csv') + if len(meta['file_list']) < 1: + raise gr.Error(self.component_names.export_err1) + train_csv = create_dataset.write_csv(meta['file_list'], train_csv, + work_dir) + _ = FS.get_from(train_csv, os.path.join(local_work_dir, + 'train.csv')) + save_file_list = os.path.join(work_dir, 'file.csv') + save_file_list = create_dataset.write_file_list( + meta['file_list'], save_file_list) + local_file_csv = FS.get_from( + save_file_list, os.path.join(local_work_dir, 'file.csv')) + create_dataset.save_meta(meta, work_dir) + is_flag = FS.put_object_from_local_file( + local_file_csv, + os.path.join(self.export_folder, dataset_name + '_file.csv')) + if not is_flag: + raise gr.Error(self.component_names.upload_err1) + list_url = FS.get_url(os.path.join(self.export_folder, + dataset_name + '_file.csv'), + set_public=True) + list_url = parse.unquote(list_url) + if 'wulanchabu' in list_url: + list_url = list_url.replace( + '.cn-wulanchabu.oss-internal.aliyun-inc.', + '.oss-cn-wulanchabu.aliyuncs.') + else: + list_url = list_url.replace('.oss-internal.aliyun-inc.', + '.oss.aliyuncs.') + if not list_url.split('/')[-1] == dataset_name + '_file.csv': + list_url = os.path.join(os.path.dirname(list_url), + dataset_name + '_file.csv') + return gr.Text(value=list_url) + + # self.export_to_list.click(export_csv, + # inputs=[create_dataset.user_data_name], + # outputs=[self.export_url]) + + def go_to_train(dataset_name): + meta = create_dataset.meta_dict[dataset_name] + work_dir = meta['work_dir'] + local_work_dir = meta['local_work_dir'] + train_csv = os.path.join(work_dir, 'train.csv') + if len(meta['file_list']) < 1: + raise gr.Error(self.component_names.export_err1) + train_csv = create_dataset.write_csv(meta['file_list'], train_csv, + work_dir) + _ = FS.get_from(train_csv, os.path.join(local_work_dir, + 'train.csv')) + save_file_list = work_dir + '_file.csv' + _ = create_dataset.write_file_list(meta['file_list'], + save_file_list) + return (gr.Tabs(selected='self_train'), + gr.Textbox(value=os.path.abspath(local_work_dir))) + + self.go_to_train.click( + go_to_train, + inputs=[create_dataset.user_data_name], + outputs=[manager.tabs, manager.self_train.trainer_ui.ms_data_name]) diff --git a/scepter/studio/preprocess/preprocess.py b/scepter/studio/preprocess/preprocess.py new file mode 100644 index 0000000..27dbbe2 --- /dev/null +++ b/scepter/studio/preprocess/preprocess.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +import os.path + +import gradio as gr + +from scepter.modules.utils.config import Config +from scepter.modules.utils.file_system import FS +from scepter.studio.preprocess.caption_editor_ui.create_dataset_ui import \ + CreateDatasetUI +from scepter.studio.preprocess.caption_editor_ui.dataset_gallery_ui import \ + DatasetGalleryUI +from scepter.studio.preprocess.caption_editor_ui.export_dataset_ui import \ + ExportDatasetUI +from scepter.studio.utils.env import init_env + + +class PreprocessUI(): + def __init__(self, + cfg_general_file, + is_debug=False, + language='en', + root_work_dir='./'): + cfg_general = Config(cfg_file=cfg_general_file) + + cfg_general.WORK_DIR = os.path.join(root_work_dir, + cfg_general.WORK_DIR) + if not FS.exists(cfg_general.WORK_DIR): + FS.make_dir(cfg_general.WORK_DIR) + + cfg_general = init_env(cfg_general) + self.create_dataset = CreateDatasetUI.get_instance(cfg_general, + is_debug=is_debug, + language=language) + self.dataset_gallery = DatasetGalleryUI.get_instance(cfg_general, + is_debug=is_debug, + language=language) + self.export_dataset = ExportDatasetUI.get_instance(cfg_general, + is_debug=is_debug, + language=language) + + def create_ui(self): + self.create_dataset.create_ui() + self.dataset_gallery.create_ui() + self.export_dataset.create_ui() + + def set_callbacks(self, manager): + self.create_dataset.set_callbacks(self.dataset_gallery, + self.export_dataset) + self.dataset_gallery.set_callbacks(self.create_dataset) + self.export_dataset.set_callbacks(self.create_dataset, manager) + + +if __name__ == '__main__': + pre_ui = PreprocessUI('scepter/methods/studio/preprocess/preprocess.yaml', + root_work_dir='./cache') + with gr.Blocks() as demo: + gr.Markdown('

    SCEPTER Preprocess

    ') + with gr.Tabs(elem_id='tabs') as tabs: + with gr.TabItem('editor', id=1, elem_id=f'tab_{1}'): + pre_ui.create_ui() + pre_ui.set_callbacks(None) + demo.queue(status_update_rate=1).launch(show_error=True, + debug=True, + enable_queue=True) diff --git a/scepter/studio/self_train/__init__.py b/scepter/studio/self_train/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scepter/studio/self_train/scripts/__init__.py b/scepter/studio/self_train/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scepter/studio/self_train/scripts/run_task.py b/scepter/studio/self_train/scripts/run_task.py new file mode 100644 index 0000000..c6ad59d --- /dev/null +++ b/scepter/studio/self_train/scripts/run_task.py @@ -0,0 +1,165 @@ +# -*- coding: utf-8 -*- +import argparse +import os + +import cv2 +import numpy as np +import torch + +from scepter.modules.solver.hooks.checkpoint import CheckpointHook +from scepter.modules.solver.registry import SOLVERS +from scepter.modules.utils.config import Config +from scepter.modules.utils.distribute import we +from scepter.modules.utils.file_system import FS +from scepter.modules.utils.logger import get_logger + + +def run_task(cfg): + # torch.cuda.set_per_process_memory_fraction(0.4, we.device_id) + # torch.cuda.empty_cache() + std_logger = get_logger(name='scepter') + std_logger.info(f'Pytorch version: {torch.__version__}') + # std_logger.info(f"Os environment: {os.environ}") + if cfg.args.stage == 'train': + solver = SOLVERS.build(cfg.SOLVER, logger=std_logger) + save_config(cfg) + solver.set_up_pre() + solver.set_up() + ori_steps = solver.max_steps + if 'train' in solver.datas: + dataset = solver.datas['train'].dataset + if hasattr(dataset, 'real_number'): + solver.max_steps = int( + cfg.SOLVER.MAX_EPOCHS * dataset.real_number / + (solver.datas['train'].batch_size * we.world_size)) + std_logger.info( + f'max step is changed from {ori_steps} to {solver.max_steps} ' + f'according to the setting epoches {cfg.SOLVER.MAX_EPOCHS} ' + f'and dataset size {dataset.real_number}') + if 'train' in solver.hooks_dict: + for hook in solver.hooks_dict['train']: + if isinstance(hook, CheckpointHook): + ori_interval = hook.interval + hook.interval = int(hook.interval * + solver.max_steps / + cfg.SOLVER.MAX_EPOCHS) + std_logger.info( + f'checkpoint save interval is changed from {ori_interval} ' + f'to {hook.interval} according to the setting epoches ' + f'interval {ori_interval}') + # size 为无限的时候,使用默认值。 + solver.solve() + + +def save_image(image, save_path, backend='cv2'): + if backend == 'cv2': + image = image.copy() + cv2.cvtColor(image, cv2.COLOR_RGB2BGR, image) + cv2.imwrite(save_path, image) + + +def concatenate_images(images): + heights = [img.shape[0] for img in images] + max_width = sum([img.shape[1] for img in images]) + + concatenated_image = np.zeros((max(heights), max_width, 3), dtype=np.uint8) + x_offset = 0 + for img in images: + concatenated_image[0:img.shape[0], + x_offset:x_offset + img.shape[1], :] = img + x_offset += img.shape[1] + return concatenated_image + + +def save_config(cfg): + from scepter.modules.utils.distribute import get_dist_info + rank, _ = get_dist_info() + if rank == 0: + config_path = os.path.join(cfg.SOLVER.WORK_DIR, + cfg.args.cfg_file.split('/')[-1]) + with FS.put_to(config_path) as local_config_path: + with open(local_config_path, 'w') as f_out: + f_out.write(cfg.dump()) + + +def update_config(cfg): + if cfg.args.work_dir and cfg.args.work_dir != '': + cfg.SOLVER.WORK_DIR = cfg.args.work_dir + return cfg + + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description='Argparser for Cate process:\n') + parser.add_argument( + '--stage', + dest='stage', + help='Running stage!', + default='train', + choices=['train', 'inference', 'upsampler_inference', 'control']) + parser.add_argument('--base_model', + dest='base_model', + help='Base model name!', + default='sd') + parser.add_argument( + '--prompt', + dest='prompt', + help='Prompt sentence!', + default='a woman is walking on the street in a rainy day.') + parser.add_argument('--n_prompt', + dest='n_prompt', + help='Add Prompt sentence!', + default='') + parser.add_argument('--image', + dest='image', + help='Image to be upsampled!', + default='') + parser.add_argument('--num_samples', + dest='num_samples', + help="Output image's number!", + default=4, + type=int) + parser.add_argument('--sampler', + dest='sampler', + help='sampler', + default='ddim', + type=str) + parser.add_argument('--sample_steps', + dest='sample_steps', + help='sample_steps', + default=50, + type=int) + parser.add_argument('--inference_resolution', + dest='inference_resolution', + help='inference resolution', + default=1024, + type=int) + parser.add_argument('--seed', + dest='seed', + help='seed', + default=2023, + type=int) + parser.add_argument('--save_folder', + dest='save_folder', + help="Output image's save folder!", + default='test_images') + parser.add_argument('--pretrained_model', + dest='pretrained_model', + help='The pretrained model for our network!', + default='') + parser.add_argument('--learning_rate', + dest='learning_rate', + help='The learning rate for our network!', + default=None) + parser.add_argument('--max_steps', + dest='max_steps', + help='The max steps for our network!', + default=None) + parser.add_argument('--control_mode', + dest='control_mode', + help='', + default=None) + parser.add_argument('--work_dir', dest='work_dir', help='', default=None) + cfg = Config(load=True, parser_ins=parser) + cfg = update_config(cfg) + we.init_env(cfg, logger=None, fn=run_task) diff --git a/scepter/studio/self_train/self_train.py b/scepter/studio/self_train/self_train.py new file mode 100644 index 0000000..9465f8a --- /dev/null +++ b/scepter/studio/self_train/self_train.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +import os + +import gradio as gr + +import scepter +from scepter.modules.utils.config import Config +from scepter.modules.utils.file_system import FS +from scepter.studio.self_train.self_train_ui.inference_ui import InferenceUI +from scepter.studio.self_train.self_train_ui.trainer_ui import TrainerUI +from scepter.studio.self_train.utils.config_parser import get_all_config +from scepter.studio.utils.env import init_env + + +class SelfTrainUI(): + def __init__(self, + cfg_general_file, + is_debug=False, + language='en', + root_work_dir='./'): + cfg_general = Config(cfg_file=cfg_general_file) + + BASE_CFG_VALUE = get_all_config(os.path.dirname(cfg_general_file), + global_meta=cfg_general) + + cfg_general.WORK_DIR = os.path.join(root_work_dir, + cfg_general.WORK_DIR) + if not FS.exists(cfg_general.WORK_DIR): + FS.make_dir(cfg_general.WORK_DIR) + cfg_general = init_env(cfg_general) + + self.trainer_ui = TrainerUI(cfg_general, + BASE_CFG_VALUE, + is_debug=is_debug, + language=language) + self.inference_ui = InferenceUI(cfg_general, + BASE_CFG_VALUE, + is_debug=is_debug, + language=language) + + def create_ui(self): + with gr.Row(): + self.trainer_ui.create_ui() + with gr.Row(): + self.inference_ui.create_ui() + + def set_callbacks(self, manager): + self.trainer_ui.set_callbacks(self.inference_ui) + self.inference_ui.set_callbacks(self.trainer_ui, manager) + + +if __name__ == '__main__': + st_ins = SelfTrainUI(os.path.join( + scepter.dirname, 'scepter/methods/studio/self_train/self_train.yaml'), + is_debug=True, + language='zh', + root_work_dir='./cache') + with gr.Blocks() as demo: + gr.Markdown('

    SCEPTER SELF TRAIN

    ') + with gr.Tabs(elem_id='tabs') as tabs: + with gr.TabItem('editor', id=1, elem_id=f'tab_{1}'): + st_ins.create_ui() + st_ins.set_callbacks() + demo.queue(status_update_rate=1).launch(show_error=True, + debug=True, + enable_queue=True) diff --git a/scepter/studio/self_train/self_train_ui/__init__.py b/scepter/studio/self_train/self_train_ui/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scepter/studio/self_train/self_train_ui/component_names.py b/scepter/studio/self_train/self_train_ui/component_names.py new file mode 100644 index 0000000..4b61343 --- /dev/null +++ b/scepter/studio/self_train/self_train_ui/component_names.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- +# For dataset manager +class InferenceUIName(): + def __init__(self, language='en'): + if language == 'en': + self.output_model_block = 'Model Output' + self.output_model_name = 'Output Model Name' + self.test_prompt = 'Test Prompt' + self.test_prefix = 'Test Prefix' + self.test_n_prompt = 'Negative Prompt' + self.sampler = 'Sampler' + self.num_inference_steps = 'Sampling Step Length' + self.inference_num = 'Number of Inferences' + self.generator_seed = 'Sampling Seed' + self.tuner_method = 'Tuning Method' + self.inference_resolution = 'Inference Resolution' + self.output_image = 'Output Result' + self.display_button = 'Infer' + self.extra_model_gtxt = 'Extra Model' + self.extra_model_gbtn = 'Add Model' + self.refresh_model_gbtn = 'Refresh Model' + self.go_to_inference = 'Go to inference' + # Error or Warning + self.inference_err1 = 'Inference failed, please try again.' + self.inference_err2 = 'Test prompt is empty.' + self.inference_err3 = "Doesn't surpport this base model" + self.inference_err4 = "This model maybe not finish training, because model doesn't exist." + + elif language == 'zh': + self.output_model_block = '模型产出' + self.output_model_name = '产出模型名称' + self.test_prompt = '测试提示词' + self.test_prefix = '测试前缀' + self.test_n_prompt = '负向提示词' + self.sampler = '采样器' + self.num_inference_steps = '采样步长' + self.inference_num = '推理数' + self.generator_seed = '采样种子' + self.tuner_method = '训练方式' + self.inference_resolution = '推理分辨率' + self.output_image = '输出结果' + self.display_button = '推理' + self.extra_model_gtxt = '额外模型' + self.extra_model_gbtn = '添加模型' + self.refresh_model_gbtn = '刷新模型' + # Error or Warning + self.inference_err1 = '推理失败,请重试。' + self.inference_err2 = '测试提示词为空。' + self.inference_err3 = '不支持的基础模型' + self.go_to_inference = '使用模型' + self.inference_err4 = '模型可能没有训练完成或者模型不存在' + + +class TrainerUIName(): + def __init__(self, language='en'): + if language == 'en': + self.user_direction = ''' + ### User Guide + - Data: Select the template data from Examples, or prepare your custom data + for upload according to the format of the example dog.zip package. + - Parameters: You can try modifying the related parameters. + - Training: Click on [Start Training]. + - Testing: After completing the training, click [Go to inference ]. + - Note: Timeouts may cause the connection to disconnect (an Error may occur). + After waiting for the time when the training is likely to be almost complete, + refresh the interface and then click [Refresh Model] at the bottom of the page. + The trained model should appear in the [Output Model Name] if training was successful; + if not, the training may be incomplete or have failed. + - zip example: https://modelscope.cn/api/v1/models/damo/scepter/repo?Revision=master&FilePath=datasets/3D_example_csv.zip + - For processing and training with large-scale data, it is recommended to use the command line. + ''' # noqa + self.data_type_choices = ['Dataset zip', 'MaaS Dataset'] + self.data_type_value = 'Dataset zip' + self.data_type_name = 'Data Source' + self.ms_data_name_place_hold = 'Supports MaaS dataset/local/HTTP Zip package' + self.ms_data_space = 'ModelScope Space' + self.ms_data_subname = 'MaaS Dataset - Subset' + self.training_block = 'Training Parameters' + self.base_model = 'Base Model' + self.tuner_name = 'Fine-tuning Method' + self.base_model_revision = 'Model Version Number' + self.resolution = 'Resolution' + self.train_epoch = 'Number of Training Epochs' + self.learning_rate = 'Learning Rate' + self.save_interval = 'Save Interval' + self.train_batch_size = 'Training Batch Size' + self.prompt_prefix = 'Prefix' + self.replace_keywords = 'Trigger Keywords' + self.work_name = 'Save Model Name (refresh to get a random value)' + self.push_to_hub = 'Push to hub' + self.log_block = 'Training Log...' + self.training_button = 'Start Training' + + # Error or Warning + self.training_err1 = 'CUDA is unavailable.' + self.training_err2 = 'Currently insufficient VRAM, training failed!' + self.training_err3 = 'You need to prepare training data.' + self.training_err4 = 'Save model name already exists or is None, please regenerate this name.' + self.training_err5 = 'Training failed.' + self.training_err6 = "Can't process training data" + + elif language == 'zh': + self.user_direction = ''' + ### 使用说明 + - 数据: 选择Example的模版数据或可以按照样例中dog.zip包的格式准备自定义数据进行上传 + - 参数: 可尝试进行相关参数的修改 + - 训练: 点击【开始训练】 + - 测试: 完成训练后点击【使用模型】 + - 注意:超时可能导致连接断开(出现Error),可以等差不多可能训完后,刷新界面再点击页面最后的[刷新模型],即可在[产出模型名称中]出现已经完成训练的模型,若不存在则没有完成训练或训练失败 + - ZIP样例:https://modelscope.cn/api/v1/models/damo/scepter/repo?Revision=master&FilePath=datasets/3D_example_csv.zip + - 对于大规模数据的处理和训练,建议使用命令行形式 + ''' # noqa + self.data_type_choices = ['数据集zip', 'MaaS数据集'] + self.data_type_value = '数据集zip' + self.data_type_name = '数据集来源' + self.ms_data_name_place_hold = '支持MaaS数据集/本地/Http Zip包' + self.ms_data_space = 'ModelScope 空间' + self.ms_data_subname = 'MaaS数据集-子集' + self.training_block = '训练参数' + self.base_model = '基础模型' + self.tuner_name = '微调方法' + self.base_model_revision = '模型版本号' + self.resolution = '分辨率' + self.train_epoch = '训练轮数' + self.learning_rate = '学习率' + self.save_interval = '存储间隔' + self.train_batch_size = '训练批次' + self.prompt_prefix = '前缀' + self.replace_keywords = '触发关键词' + self.work_name = '保存模型名称(刷新获得随机值)' + self.push_to_hub = '推送魔搭社区' + self.log_block = '训练日志...' + self.training_button = '开始训练' + # Error or Warning + self.training_err1 = 'CUDA不可用.' + self.training_err2 = '目前显存不足,训练失败!' + self.training_err3 = '您需要准备训练数据' + self.training_err4 = '保存模型未生成或名称已经存在,请重新生成名称' + self.training_err5 = '训练失败' + self.training_err6 = '无法处理的数据' diff --git a/scepter/studio/self_train/self_train_ui/inference_ui.py b/scepter/studio/self_train/self_train_ui/inference_ui.py new file mode 100644 index 0000000..787fd3c --- /dev/null +++ b/scepter/studio/self_train/self_train_ui/inference_ui.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- +import os + +import gradio as gr + +from scepter.modules.utils.config import Config +from scepter.modules.utils.file_system import FS +from scepter.studio.self_train.self_train_ui.component_names import \ + InferenceUIName +from scepter.studio.self_train.utils.config_parser import ( + get_base_model_list, get_inference_para_by_model_version) +from scepter.studio.utils.uibase import UIBase + + +class InferenceUI(UIBase): + def __init__(self, cfg, all_cfg_value, is_debug=False, language='en'): + self.BASE_CFG_VALUE = all_cfg_value + self.language = language + self.base_model_info = get_base_model_list(self.BASE_CFG_VALUE) + self.work_dir, _ = FS.map_to_local(cfg.WORK_DIR) + os.makedirs(self.work_dir, exist_ok=True) + self.model_list = [] + # self.model_list.extend(self.base_model_info.get('model_choices', [])) + have_model_list = [] + if not self.work_dir.endswith('/'): + self.work_dir += '/' + for one_dir in FS.walk_dir(self.work_dir): + if one_dir.startswith(self.work_dir): + one_dir = one_dir[len(self.work_dir):] + if not os.path.isdir(os.path.join(self.work_dir, one_dir)): + continue + if len(one_dir.split('/')) > 1: + continue + if '@' in one_dir and os.path.exists( + os.path.join(self.work_dir, one_dir, 'checkpoint.pth')): + if len(one_dir.split('@')) > 4: + have_model_list.append([one_dir, one_dir.split('@')[-1]]) + have_model_list.sort(key=lambda x: -int(x[-1][:-3])) + self.model_list.extend([v[0].split('/')[-1] + for v in have_model_list][:50]) + self.infer_para_data = get_inference_para_by_model_version( + self.BASE_CFG_VALUE, self.base_model_info.get('model_name', []), + self.base_model_info.get('version_name', [])) + self.is_debug = is_debug + self.component_names = InferenceUIName(language) + + def create_ui(self, *args, **kwargs): + with gr.Box(): + gr.Markdown(self.component_names.output_model_block) + with gr.Row(): + with gr.Column(scale=2, min_width=0): + self.output_model_name = gr.Dropdown( + label=self.component_names.output_model_name, + choices=self.model_list, + value=self.base_model_info.get('model_default', ''), + interactive=True) + with gr.Column(scale=1, min_width=0): + self.refresh_model_gbtn = gr.Button( + self.component_names.refresh_model_gbtn) + with gr.Row(): + with gr.Column(scale=2, min_width=0): + self.extra_model_gtxt = gr.Text( + label=self.component_names.extra_model_gtxt, + show_label=False, + placeholder='Add Extra Model') + with gr.Column(scale=1, min_width=0): + self.extra_model_gbtn = gr.Button( + self.component_names.extra_model_gbtn) + with gr.Row(): + with gr.Column(scale=1, min_width=0): + self.go_to_inferece_btn = gr.Button( + self.component_names.go_to_inference) + + def set_callbacks(self, trainer_ui, manager): + self.manager = manager + + def add_model(model_name): + if model_name not in self.model_list: + self.model_list.append(model_name) + return '', gr.Dropdown(choices=self.model_list) + + def refresh_model(): + return gr.Dropdown(choices=self.model_list) + + self.extra_model_gbtn.click( + fn=add_model, + inputs=[self.extra_model_gtxt], + outputs=[self.extra_model_gtxt, self.output_model_name], + queue=False) + self.refresh_model_gbtn.click(fn=refresh_model, + inputs=[], + outputs=[self.output_model_name], + queue=False) + + def go_to_inferece(output_model): + output_model_path = os.path.join(self.work_dir, output_model) + _, _, base_model, _, resolution, _ = output_model_path.split('@') + tuner_cfg = Config(cfg_dict={}, load=False) + tuner_cfg.NAME = output_model + tuner_cfg.NAME_ZH = output_model + tuner_cfg.BASE_MODEL = base_model + model_path = os.path.join(output_model_path, 'checkpoint.pth') + if not os.path.exists(model_path): + gr.Error(self.component_names.inference_err4) + tuner_cfg.MODEL_PATH = model_path + self.manager.inference.model_manage_ui.pipe_manager.register_tuner( + tuner_cfg, + name=tuner_cfg.NAME_ZH + if self.language == 'zh' else tuner_cfg.NAME, + is_customized=True) + + pipeline_level_modules = self.manager.inference.model_manage_ui.pipe_manager.pipeline_level_modules + if tuner_cfg.BASE_MODEL not in pipeline_level_modules: + gr.Error(self.component_names.inference_err3 + + tuner_cfg.BASE_MODEL) + pipeline_ins = pipeline_level_modules[tuner_cfg.BASE_MODEL] + diffusion_model = f"{tuner_cfg.BASE_MODEL}_{pipeline_ins.diffusion_model['name']}" + + default_choices = self.manager.inference.model_manage_ui.pipe_manager.module_level_choices + if 'customized_tuners' in default_choices and tuner_cfg.BASE_MODEL in default_choices[ + 'customized_tuners']: + tunner_choices = default_choices['customized_tuners'][ + tuner_cfg.BASE_MODEL]['choices'] + tunner_default = default_choices['customized_tuners'][ + tuner_cfg.BASE_MODEL]['default'] + if not isinstance(tunner_default, list): + tunner_default = [tunner_default] + else: + tunner_choices = [] + tunner_default = '' + return (gr.Tabs(selected='inference'), + gr.Dropdown(choices=tunner_choices, value=tunner_default), + gr.Dropdown(value=diffusion_model), + gr.Tabs(selected='tuner_ui')) + + self.go_to_inferece_btn.click( + go_to_inferece, + inputs=[self.output_model_name], + outputs=[ + manager.tabs, manager.inference.tuner_ui.custom_tuner_model, + manager.inference.model_manage_ui.diffusion_model, + manager.inference.setting_tab + ]) diff --git a/scepter/studio/self_train/self_train_ui/trainer_ui.py b/scepter/studio/self_train/self_train_ui/trainer_ui.py new file mode 100644 index 0000000..f00681d --- /dev/null +++ b/scepter/studio/self_train/self_train_ui/trainer_ui.py @@ -0,0 +1,585 @@ +# -*- coding: utf-8 -*- +import copy +import datetime +import os +import random +import time + +import gradio as gr +import torch +import yaml + +import scepter +from scepter.modules.utils.file_system import FS +from scepter.studio.self_train.self_train_ui.component_names import \ + TrainerUIName +from scepter.studio.self_train.utils.config_parser import ( + get_default, get_values_by_model, get_values_by_model_version, + get_values_by_model_version_tuner, + get_values_by_model_version_tuner_resolution) +from scepter.studio.utils.uibase import UIBase + + +def print_memory_status(is_debug): + if not is_debug: + nvi_info = os.popen('nvidia-smi').read() + gpu_mem = nvi_info.split('\n')[9].split('|')[2].split('/')[0].strip() + else: + gpu_mem = 0 + return gpu_mem + + +refresh_symbol = '\U0001f504' # 🔄 + + +def get_work_name(model, version, tuner, resolution): + model_prefix = f'Swift@{model}@{version}@{tuner}@{resolution}' + return model_prefix + '@' + '{0:%Y%m%d%H%M%S%f}'.format( + datetime.datetime.now()) + ''.join( + [str(random.randint(1, 10)) for i in range(3)]) + + +class TrainerUI(UIBase): + def __init__(self, cfg, all_cfg_value, is_debug=False, language='en'): + self.BASE_CFG_VALUE = all_cfg_value + self.para_data = get_default(self.BASE_CFG_VALUE) + self.run_script = os.path.join(os.path.dirname(scepter.dirname), + cfg.SCRIPT_DIR, 'run_task.py') + self.work_dir_pre, _ = FS.map_to_local(cfg.WORK_DIR) + self.is_debug = is_debug + self.component_names = TrainerUIName(language=language) + + def create_ui(self): + with gr.Box(): + with gr.Row(variant='panel', equal_height=True): + with gr.Column(variant='panel'): + gr.Markdown(self.component_names.user_direction) + self.data_type = gr.Dropdown( + choices=self.component_names.data_type_choices, + value=self.component_names.data_type_value, + label=self.component_names.data_type_name, + interactive=True) + self.ms_data_name = gr.Textbox( + label=' or '.join( + self.component_names.data_type_choices), + max_lines=1, + placeholder=self.component_names. + ms_data_name_place_hold, + interactive=True) + with gr.Box(visible=False) as self.ms_data_box: + with gr.Row(): + self.ms_data_space = gr.Textbox( + label=self.component_names.ms_data_space, + max_lines=1) + self.ms_data_subname = gr.Textbox( + label=self.component_names.ms_data_subname, + value='default', + max_lines=1) + with gr.Column(variant='panel'): + with gr.Box(): + gr.Markdown(self.component_names.training_block) + with gr.Row(): + with gr.Column(scale=1, min_width=0): + self.base_model = gr.Dropdown( + choices=self.para_data.get( + 'model_choices', []), + value=self.para_data.get( + 'model_default', ''), + label=self.component_names.base_model, + interactive=True) + with gr.Column(scale=1, min_width=0): + self.tuner_name = gr.Dropdown( + choices=self.para_data.get( + 'tuner_choices', []), + value=self.para_data.get( + 'tuner_default', ''), + label=self.component_names.tuner_name, + interactive=True) + with gr.Row(): + with gr.Column(scale=1, min_width=0): + self.base_model_revision = gr.Dropdown( + choices=self.para_data.get( + 'version_choices', []), + value=self.para_data.get( + 'version_default', ''), + label=self.component_names. + base_model_revision, + interactive=True) + + with gr.Column(scale=1, min_width=0): + self.resolution = gr.Dropdown( + choices=self.para_data.get( + 'resolution_choices', []), + value=self.para_data.get( + 'resolution_default', 1024), + label=self.component_names.resolution, + allow_custom_value=True, + interactive=True) + + with gr.Row(): + with gr.Column(scale=1, min_width=0): + self.train_epoch = gr.Number( + label=self.component_names.train_epoch, + value=self.para_data.get('EPOCHS', 10), + precision=0, + interactive=True) + with gr.Column(scale=1, min_width=0): + self.learning_rate = gr.Number( + label=self.component_names.learning_rate, + value=self.para_data.get( + 'LEARNING_RATE', 0.0001), + interactive=True) + + with gr.Row(): + with gr.Column(scale=1, min_width=0): + self.save_interval = gr.Number( + label=self.component_names.save_interval, + value=self.para_data.get( + 'SAVE_INTERVAL', 10), + precision=0, + interactive=True) + with gr.Column(scale=1, min_width=0): + self.train_batch_size = gr.Number( + label=self.component_names. + train_batch_size, + value=self.para_data.get( + 'TRAIN_BATCH_SIZE', 4), + precision=0, + interactive=True) + + with gr.Row(): + with gr.Column(scale=1, min_width=0): + self.prompt_prefix = gr.Text( + label=self.component_names.prompt_prefix, + value=self.para_data.get( + 'TRAIN_PREFIX', '')) + with gr.Column(scale=1, min_width=0): + self.replace_keywords = gr.Text( + label=self.component_names. + replace_keywords, + value='') + + with gr.Row(): + with gr.Column(scale=5, min_width=0): + self.work_name = gr.Text( + label=self.component_names.work_name, + value=None, + interactive=False) + with gr.Column(scale=1, min_width=0): + self.work_name_button = gr.Button( + value=refresh_symbol) + with gr.Column(scale=2, min_width=0): + self.push_to_hub = gr.Checkbox( + label=self.component_names.push_to_hub, + value=False, + visible=False) + + with gr.Row(variant='panel', equal_height=True): + self.examples = gr.Examples( + examples=[ + [ + self.component_names.data_type_choices[0], + '', + 'https://modelscope.cn/api/v1/models/damo/scepter/repo?Revision=master&FilePath=datasets/3D_example_csv.zip', # noqa + '' + ], + [ + self.component_names.data_type_choices[1], 'damo', + 'style_custom_dataset', '3D' + ] + ], + inputs=[ + self.data_type, self.ms_data_space, self.ms_data_name, + self.ms_data_subname + ]) + + with gr.Row(variant='panel', equal_height=True): + with gr.Box(): + gr.Markdown(self.component_names.log_block) + self.training_message = gr.Markdown() + with gr.Row(variant='panel', equal_height=True): + self.training_button = gr.Button() + + def set_callbacks(self, inference_ui): + def change_data_type(data_type): + if data_type == self.component_names.data_type_choices[0]: + return gr.Box(visible=False) + elif data_type == self.component_names.data_type_choices[1]: + return gr.Box(visible=True) + + self.data_type.change(fn=change_data_type, + inputs=[self.data_type], + outputs=[self.ms_data_box], + queue=False) + + self.work_name_button.click(fn=get_work_name, + inputs=[ + self.base_model, + self.base_model_revision, + self.tuner_name, self.resolution + ], + outputs=[self.work_name], + queue=False) + + def change_train_value_by_model(base_model): + ''' + Changes to the base model will affect the training parameters, + and it is best to define the related default values in the YAML. + Training Iterations: + Learning Rate: + Training Prefix Used: + Training Batch Size: + Supported Resolutions: + Supported Fine-tuning Methods: + Supported Fine-tuning Methods: + Prefix for Saved Model: + ''' + ret_data = get_values_by_model(self.BASE_CFG_VALUE, base_model) + return ret_data.get('EPOCHS', 10), \ + ret_data.get('LEARNING_RATE', 0.0001), \ + ret_data.get('SAVE_INTERVAL', 10), \ + ret_data.get('TRAIN_BATCH_SIZE', 4), \ + ret_data.get('TRAIN_PREFIX', ''), \ + gr.Dropdown(value=ret_data.get('version_default', ''), choices=ret_data.get('version_choices', []), + interactive=True), \ + gr.Dropdown(value=ret_data.get('tuner_default', ''), choices=ret_data.get('tuner_choices', []), + interactive=True), \ + gr.Dropdown(value=ret_data.get('resolution_default', 1024), + choices=ret_data.get('resolution_choices', []), interactive=True) + + self.base_model.change(fn=change_train_value_by_model, + inputs=[self.base_model], + outputs=[ + self.train_epoch, self.learning_rate, + self.save_interval, self.train_batch_size, + self.prompt_prefix, + self.base_model_revision, self.tuner_name, + self.resolution + ], + queue=False) + + # + def change_train_value_by_model_version(base_model, + base_model_revision): + ''' + Changes to the base model will affect the training parameters, + and it is best to define the related default values in the YAML. + Training Iterations: + Learning Rate: + Training Prefix Used: + Training Batch Size: + Supported Resolutions: + Supported Fine-tuning Methods: + Supported Fine-tuning Methods: + Prefix for Saved Model: + ''' + ret_data = get_values_by_model_version(self.BASE_CFG_VALUE, + base_model, + base_model_revision) + return ret_data.get('EPOCHS', 10), \ + ret_data.get('LEARNING_RATE', 0.0001), \ + ret_data.get('SAVE_INTERVAL', 10), \ + ret_data.get('TRAIN_BATCH_SIZE', 4), \ + ret_data.get('TRAIN_PREFIX', ''), \ + gr.Dropdown(value=ret_data.get('tuner_default', ''), choices=ret_data.get('tuner_choices', []), + interactive=True), \ + gr.Dropdown(value=ret_data.get('resolution_default', 1024), + choices=ret_data.get('resolution_choices', []), interactive=True) + + # + self.base_model_revision.change( + fn=change_train_value_by_model_version, + inputs=[self.base_model, self.base_model_revision], + outputs=[ + self.train_epoch, self.learning_rate, self.save_interval, + self.train_batch_size, self.prompt_prefix, self.tuner_name, + self.resolution + ], + queue=False) + + # + # + def change_train_value_by_model_version_tuner(base_model, + base_model_revision, + tuner_name): + ''' + Changes to the base model will affect the training parameters, + and it is best to define the related default values in the YAML. + Training Iterations: + Learning Rate: + Training Prefix Used: + Training Batch Size: + Supported Resolutions: + Supported Fine-tuning Methods: + Supported Fine-tuning Methods: + Prefix for Saved Model: + ''' + ret_data = get_values_by_model_version_tuner( + self.BASE_CFG_VALUE, base_model, base_model_revision, + tuner_name) + return ret_data.get('EPOCHS', 10), \ + ret_data.get('LEARNING_RATE', 0.0001), \ + ret_data.get('SAVE_INTERVAL', 10), \ + ret_data.get('TRAIN_BATCH_SIZE', 4), \ + ret_data.get('TRAIN_PREFIX', ''), \ + gr.Dropdown(value=ret_data.get('resolution_default', 1024), + choices=ret_data.get('resolution_choices', []), interactive=True) + + # + self.tuner_name.change(fn=change_train_value_by_model_version_tuner, + inputs=[ + self.base_model, self.base_model_revision, + self.tuner_name + ], + outputs=[ + self.train_epoch, self.learning_rate, + self.save_interval, self.train_batch_size, + self.prompt_prefix, self.resolution + ], + queue=False) + + # + def change_train_value_by_model_version_tuner_resolution( + base_model, base_model_revision, tuner_name, resolution): + ''' + Changes to the base model will affect the training parameters, + and it is best to define the related default values in the YAML. + Training Iterations: + Learning Rate: + Training Prefix Used: + Training Batch Size: + Supported Resolutions: + Supported Fine-tuning Methods: + Supported Fine-tuning Methods: + Prefix for Saved Model: + ''' + ret_data = get_values_by_model_version_tuner_resolution( + self.BASE_CFG_VALUE, base_model, base_model_revision, + tuner_name, resolution) + print('change_train_value_by_model_version_tuner_resolution', + ret_data) + # work_name = get_work_name(base_model, base_model_revision, + # tuner_name, resolution) + return ret_data.get('EPOCHS', 10), \ + ret_data.get('LEARNING_RATE', 0.0001), \ + ret_data.get('SAVE_INTERVAL', 10), \ + ret_data.get('TRAIN_BATCH_SIZE', 4), \ + ret_data.get('TRAIN_PREFIX', '') + + # + self.resolution.change( + fn=change_train_value_by_model_version_tuner_resolution, + inputs=[ + self.base_model, self.base_model_revision, self.tuner_name, + self.resolution + ], + outputs=[ + self.train_epoch, self.learning_rate, self.save_interval, + self.train_batch_size, self.prompt_prefix + ], + queue=False) + + def run_train(work_name, data_type, ms_data_space, ms_data_name, + ms_data_subname, base_model, base_model_revision, + tuner_name, resolution, train_epoch, learning_rate, + save_interval, train_batch_size, prompt_prefix, + replace_keywords, push_to_hub): + # Check Cuda + if not torch.cuda.is_available() and not self.is_debug: + raise gr.Error(self.component_names.training_err1) + + if work_name == 'custom' or work_name is None or work_name == '': + raise gr.Error(self.component_names.training_err4) + work_dir = os.path.join(self.work_dir_pre, work_name) + if not os.path.exists(work_dir): + os.makedirs(work_dir) + else: + raise gr.Error(self.component_names.training_err4) + + if push_to_hub: + model_id = work_name + model_id = model_id.replace('@', '-') + hub_model_id = f'scepter/{model_id}' + else: + hub_model_id = '' + + # Check Cuda Memory + if torch.cuda.is_available() and not self.is_debug: + device = torch.device('cuda:0') + required_memory_bytes = 40 * (1024**3) + try: + tensor = torch.empty( # noqa + (required_memory_bytes // 4, ), device=device + ) # create 18GB tensor to check the memory if enough + del tensor + except RuntimeError: + raise gr.Error(self.component_names.training_err2) + + # Check Instance Valid + if ms_data_name is None: + raise gr.Error(self.component_names.training_err3) + + st_time = time.time() + + def prepare_data(data_cfg): + data_cfg['BATCH_SIZE'] = int(train_batch_size) + data_cfg['PROMPT_PREFIX'] = prompt_prefix + data_cfg['REPLACE_KEYWORDS'] = replace_keywords + if data_type in self.component_names.data_type_choices: + if ms_data_name.startswith( + 'http') or ms_data_name.endswith('zip'): + work_data_dir = os.path.join(work_dir, 'data') + if not os.path.exists(work_data_dir): + os.makedirs(work_data_dir) + ms_data_http_zip_path = ms_data_name + ms_data_local_name = ms_data_name.split( + '/')[-1].replace('.zip', '') + ms_data_local_zip_path = os.path.join( + work_data_dir, + ms_data_name.split('/')[-1]) + ms_data_local_file_path = os.path.join( + work_data_dir, ms_data_local_name) + if not os.path.exists(ms_data_local_file_path): + if ms_data_http_zip_path.startswith('http'): + os.system( + f"wget '{ms_data_http_zip_path}' -O '{ms_data_local_zip_path}'" + ) + elif os.path.exists(ms_data_http_zip_path): + ms_data_local_zip_path = ms_data_http_zip_path + else: + raise gr.Error( + self.component_names.training_err6) + print( + f"unzip -o '{ms_data_local_zip_path}' -d '{work_data_dir}'" + ) + os.system( + f"unzip -o '{ms_data_local_zip_path}' -d '{work_data_dir}'" + ) + data_cfg['MS_DATASET_NAME'] = ms_data_local_file_path + data_cfg['MS_DATASET_NAMESPACE'] = '' + data_cfg['MS_DATASET_SUBNAME'] = '' + data_cfg['MS_REMAP_PATH'] = ms_data_local_file_path + data_cfg['MS_REMAP_KEYS'] = None + elif (os.path.exists(ms_data_name) and os.path.exists( + os.path.join(ms_data_name, 'train.csv')) + and os.path.exists( + os.path.join(ms_data_name, 'images'))): + data_cfg['MS_DATASET_NAME'] = ms_data_name + data_cfg['MS_DATASET_NAMESPACE'] = '' + data_cfg['MS_DATASET_SUBNAME'] = '' + data_cfg['MS_REMAP_PATH'] = ms_data_name + data_cfg['MS_REMAP_KEYS'] = None + else: + data_cfg['MS_DATASET_NAME'] = ms_data_name + data_cfg['MS_DATASET_NAMESPACE'] = ms_data_space + data_cfg['MS_DATASET_SUBNAME'] = ms_data_subname + if ms_data_name == 'style_custom_dataset': + data_cfg['MS_REMAP_KEYS'] = { + 'Image:FILE': 'Target:FILE' + } + elif ms_data_name == 'lora-stable-diffusion-finetune': + data_cfg['MS_REMAP_KEYS'] = {'Text': 'Prompt'} + else: + data_cfg['MS_REMAP_KEYS'] = None + data_cfg['OUTPUT_SIZE'] = int(resolution) + return data_cfg + + def prepare_train_config(): + cfg_file = os.path.join(work_dir, 'train.yaml') + current_model_info = self.BASE_CFG_VALUE[base_model][ + base_model_revision] + modify_para = current_model_info['modify_para'] + cfg = current_model_info['config_value'] + if isinstance(modify_para, dict) and tuner_name in modify_para: + modify_c = modify_para[tuner_name] + if isinstance(modify_c, dict) and 'TRAIN' in modify_c: + train_modify_c = modify_c['TRAIN'] + if isinstance(train_modify_c, dict): + for key, val in train_modify_c.items(): + cache_value = [cfg] + c_k_list = key.split('.') + for idx, c_k in enumerate(c_k_list): + if c_k.strip() == '': + continue + cache_value.append( + copy.deepcopy(cache_value[idx][c_k])) + current_val = copy.deepcopy(val) + for c_k, v in zip(c_k_list[::-1], + cache_value[:-1][::-1]): + v[c_k] = current_val + current_val = v + cfg = current_val + + # update config + cfg['SOLVER']['WORK_DIR'] = work_dir + cfg['SOLVER']['OPTIMIZER']['LEARNING_RATE'] = float( + learning_rate * 640 / int(train_batch_size)) + cfg['SOLVER']['MAX_EPOCHS'] = int(train_epoch) + cfg['SOLVER']['TRAIN_DATA']['BATCH_SIZE'] = int( + train_batch_size) + cfg['SOLVER']['TUNER'] = current_model_info[ + 'tuner_para'][tuner_name] if isinstance( + current_model_info['tuner_para'], + dict) and tuner_name in current_model_info[ + 'tuner_para'] else None + cfg['SOLVER']['TRAIN_DATA'] = prepare_data( + cfg['SOLVER']['TRAIN_DATA']) + for hook in cfg['SOLVER']['TRAIN_HOOKS']: + if hook['NAME'] == 'CheckpointHook': + hook['INTERVAL'] = save_interval + hook['PUSH_TO_HUB'] = push_to_hub + hook['HUB_MODEL_ID'] = hub_model_id + + with open(cfg_file, 'w') as f_out: + yaml.dump(cfg, + f_out, + encoding='utf-8', + allow_unicode=True, + default_flow_style=False) + return cfg_file + + cfg = prepare_train_config() + + def train_fn(cfg_file): + torch.cuda.empty_cache() + cmd = f'PYTHONPATH=. python {self.run_script} ' \ + f'--cfg={cfg_file} 2> {self.work_dir_pre}/std_out.txt' + print(cmd) + if not self.is_debug: + res = os.system(cmd) + else: + res = 0 + if res != 0: + error_info = '\n'.join( + open(f'{self.work_dir_pre}/std_out.txt', + 'r').read().split('\n')[-20:]) + raise gr.Error( + f'{self.component_names.training_err5} ({error_info}) ' + ) + + train_fn(cfg) + + if work_name not in inference_ui.model_list: + inference_ui.model_list.append(work_name) + message = f''' + Training completed! \n + Save in [ {work_name} ] \n + Take time [ {time.time() - st_time:.4f}s ] \n + Mem: [ {print_memory_status(self.is_debug)} ] + ''' + print(message) + return message, gr.Dropdown.update(choices=inference_ui.model_list, + value=work_name) + + self.training_button.click( + run_train, + inputs=[ + self.work_name, self.data_type, self.ms_data_space, + self.ms_data_name, self.ms_data_subname, self.base_model, + self.base_model_revision, self.tuner_name, self.resolution, + self.train_epoch, self.learning_rate, self.save_interval, + self.train_batch_size, self.prompt_prefix, + self.replace_keywords, self.push_to_hub + ], + outputs=[self.training_message, inference_ui.output_model_name], + queue=True) diff --git a/scepter/studio/self_train/utils/__init__.py b/scepter/studio/self_train/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scepter/studio/self_train/utils/config_parser.py b/scepter/studio/self_train/utils/config_parser.py new file mode 100644 index 0000000..5d2c350 --- /dev/null +++ b/scepter/studio/self_train/utils/config_parser.py @@ -0,0 +1,384 @@ +# -*- coding: utf-8 -*- +import os +from glob import glob + +import yaml + +paras_keys = [ + 'TRAIN_BATCH_SIZE', 'TRAIN_PREFIX', 'TRAIN_N_PROMPT', 'RESOLUTION', + 'MEMORY', 'EPOCHS', 'SAVE_INTERVAL', 'EPSEC', 'LEARNING_RATE', + 'IS_DEFAULT', 'TUNER' +] + +control_paras_keys = ['CONTROL_MODE', 'RESOLUTION', 'IS_DEFAULT'] + + +def build_meta_index(meta_cfg, config_file): + tuner_type = {} + paras = meta_cfg.get('PARAS', None) + if paras: + for idx, para in enumerate(paras): + for key in paras_keys: + if key not in para: + print( + f'Para key {key} not defined in {config_file} META/RARAS[{idx}]' + ) + assert key in para + tuner_type[para['TUNER'] + '@' + str(para['RESOLUTION'])] = para + if para['IS_DEFAULT']: + tuner_type['default'] = para['TUNER'] + '@' + str( + para['RESOLUTION']) + + tuner_type['choices'] = list(tuner_type.keys()) + if 'default' in tuner_type['choices']: + tuner_type['choices'].remove('default') + if 'default' not in tuner_type: + tuner_type['default'] = tuner_type['choices'][0] if len( + tuner_type['choices']) > 0 else '' + + # 重新组织选项 + choices = {} + for t_type in tuner_type['choices']: + t_name, resolution = t_type.split('@') + if t_name not in choices: + choices[t_name] = [] + choices[t_name].append(int(resolution)) + tuner_type['choices'] = choices + tuner_paras = meta_cfg.get('TUNERS', None) + return tuner_type, tuner_paras + + +def build_meta_index_control(meta_cfg, config_file): + control_type = {} + paras = meta_cfg.get('CONTROL_PARAS', None) + if paras: + for idx, para in enumerate(paras): + for key in control_paras_keys: + if key not in para: + print( + f'Para key {key} not defined in {config_file} META/RARAS[{idx}]' + ) + assert key in para + control_type[para['CONTROL_MODE'] + '@' + + str(para['RESOLUTION'])] = para + # control_type[para["CONTROL_MODE"]] = para + if para['IS_DEFAULT']: + control_type['default'] = para['CONTROL_MODE'] + '@' + str( + para['RESOLUTION']) + # control_type["default"] = para["CONTROL_MODE"] + + control_type['choices'] = list(control_type.keys()) + if 'default' in control_type['choices']: + control_type['choices'].remove('default') + if 'default' not in control_type: + control_type['default'] = control_type['choices'][0] if len( + control_type['choices']) > 0 else '' + + # 重新组织选项 + choices = {} + for t_type in control_type['choices']: + t_name, resolution = t_type.split('@') + if t_name not in choices: + choices[t_name] = [] + choices[t_name].append(int(resolution)) + control_type['choices'] = choices + return control_type, paras + + +def get_all_config(config_root, global_meta): + config_dict = {} + config_list = glob(os.path.join(config_root, '*/*_pro.yaml'), + recursive=True) + for config_file in config_list: + base_model_name = config_file.split('/')[-2] + with open(config_file, 'r') as f: + cfg = yaml.load(f.read(), Loader=yaml.SafeLoader) + if base_model_name not in config_dict: + config_dict[base_model_name] = {} + + meta_cfg = cfg.pop('META') + inference_paras = meta_cfg.pop('INFERENCE_PARAS') + if 'MODIFY_PARAS' in meta_cfg: + modify_para = meta_cfg['MODIFY_PARAS'] + else: + modify_para = {} + version = meta_cfg['VERSION'] + if version in config_dict[base_model_name]: + ori_config = config_dict[base_model_name][version]['config_file'] + print( + f'Current config {config_file} for {base_model_name}_{version} will be replaced by {ori_config}.' + ) + + tuner_type, tuner_para = build_meta_index(meta_cfg, config_file) + config_dict[base_model_name][version] = { + 'config_file': config_file, + 'config_value': cfg, + 'inference_para': inference_paras, + 'tuner_type': tuner_type, + 'tuner_para': tuner_para, + 'modify_para': modify_para + } + if 'CONTROL_PARAS' in meta_cfg: + control_type, control_para = build_meta_index_control( + meta_cfg, config_file) + config_dict[base_model_name][version].update({ + 'control_type': + control_type, + 'control_para': + control_para + }) + if meta_cfg['IS_DEFAULT']: + config_dict[base_model_name]['default'] = version + + for base_model_name in config_dict: + config_dict[base_model_name]['choices'] = list( + config_dict[base_model_name].keys()) + if 'default' in config_dict[base_model_name]['choices']: + config_dict[base_model_name]['choices'].remove('default') + if 'default' not in config_dict[base_model_name]: + config_dict[base_model_name][ + 'default'] = config_dict[base_model_name]['choices'][0] if len( + config_dict[base_model_name]['choices']) > 0 else '' + + config_dict['choices'] = list(config_dict.keys()) + config_dict['default'] = config_dict['choices'][0] if len( + config_dict['choices']) > 0 else '' + default_base_model = global_meta.DEFAULT_FOLDER + if default_base_model in config_dict: + config_dict['default'] = default_base_model + config_dict['samplers'] = { + sampler['NAME']: sampler + for sampler in global_meta.SAMPLERS + } + config_dict.update(cfg) + return config_dict + + +def get_default(config_dict): + ret_data = {} + # 默认的模型 + ret_data['model_choices'] = config_dict['choices'] + ret_data['model_default'] = config_dict['default'] + default_version_cfg = config_dict.get(config_dict['default'], None) + # 默认的版本 + if default_version_cfg is None: + return ret_data + ret_data['version_choices'] = default_version_cfg['choices'] + ret_data['version_default'] = default_version_cfg['default'] + default_tuner_cfg = default_version_cfg.get(default_version_cfg['default'], + None) + if default_tuner_cfg is None: + return ret_data + if 'tuner_type' in default_tuner_cfg and default_tuner_cfg['tuner_type'][ + 'default'] != '': + default_tuner_cfg = default_tuner_cfg['tuner_type'] + else: + return ret_data + ret_data['tuner_choices'] = list(default_tuner_cfg['choices'].keys()) + defalt_t_type = default_tuner_cfg['default'] + type_paras = default_tuner_cfg.get(defalt_t_type, None) + + default_t_n = defalt_t_type.split('@')[0] + default_r_n = int(defalt_t_type.split('@')[1]) + + ret_data['resolution_choices'] = default_tuner_cfg['choices'].get( + default_t_n, []) + ret_data['tuner_default'] = default_t_n + ret_data['resolution_default'] = default_r_n + if type_paras is not None: + ret_data.update(type_paras) + return ret_data + + +def get_values_by_model(config_dict, model_name): + ret_data = {} + version_cfg = config_dict.get(model_name, None) + if version_cfg is None: + return ret_data + ret_data['version_choices'] = version_cfg['choices'] + ret_data['version_default'] = version_cfg['default'] + default_tuner_cfg = version_cfg.get(version_cfg['default'], None) + if default_tuner_cfg is None: + return ret_data + default_tuner_cfg = default_tuner_cfg['tuner_type'] + ret_data['tuner_choices'] = list(default_tuner_cfg['choices'].keys()) + defalt_t_type = default_tuner_cfg['default'] + type_paras = default_tuner_cfg.get(defalt_t_type, None) + + default_t_n = defalt_t_type.split('@')[0] + default_r_n = int(defalt_t_type.split('@')[1]) + + ret_data['resolution_choices'] = default_tuner_cfg['choices'].get( + default_t_n, []) + ret_data['tuner_default'] = default_t_n + ret_data['resolution_default'] = default_r_n + if type_paras is not None: + ret_data.update(type_paras) + return ret_data + + +def get_values_by_model_version(config_dict, model_name, version): + ret_data = {} + version_cfg = config_dict.get(model_name, None) + if version_cfg is None: + return ret_data + tuner_cfg = version_cfg.get(version, None) + if tuner_cfg is None: + return ret_data + default_tuner_cfg = tuner_cfg['tuner_type'] + ret_data['tuner_choices'] = list(default_tuner_cfg['choices'].keys()) + defalt_t_type = default_tuner_cfg['default'] + type_paras = default_tuner_cfg.get(defalt_t_type, None) + + default_t_n = defalt_t_type.split('@')[0] + default_r_n = int(defalt_t_type.split('@')[1]) + + ret_data['resolution_choices'] = default_tuner_cfg['choices'].get( + default_t_n, []) + ret_data['tuner_default'] = default_t_n + ret_data['resolution_default'] = default_r_n + if type_paras is not None: + ret_data.update(type_paras) + return ret_data + + +def get_values_by_model_version_tuner(config_dict, model_name, version, + tuner_name): + ret_data = {} + version_cfg = config_dict.get(model_name, None) + if version_cfg is None: + return ret_data + tuner_cfg = version_cfg.get(version, None) + if tuner_cfg is None: + return ret_data + tuner_cfg = tuner_cfg['tuner_type'] + + ret_data['resolution_choices'] = tuner_cfg['choices'].get(tuner_name, []) + + if len(ret_data['resolution_choices']) > 0: + t_type = '{}@{}'.format(tuner_name, ret_data['resolution_choices'][0]) + ret_data['resolution_default'] = ret_data['resolution_choices'][0] + type_paras = tuner_cfg.get(t_type, None) + if type_paras is not None: + ret_data.update(type_paras) + return ret_data + + +def get_values_by_model_version_tuner_resolution(config_dict, model_name, + version, tuner_name, + resolution): + ret_data = {} + version_cfg = config_dict.get(model_name, None) + if version_cfg is None: + return ret_data + tuner_cfg = version_cfg.get(version, None) + if tuner_cfg is None: + return ret_data + tuner_cfg = tuner_cfg['tuner_type'] + type_paras = tuner_cfg.get('{}@{}'.format(tuner_name, resolution), None) + if type_paras is not None: + ret_data.update(type_paras) + return ret_data + + +def get_inference_para_by_model_version(config_dict, model_name, version): + ret_data = {} + version_cfg = config_dict.get(model_name, None) + if version_cfg is None: + return ret_data + tuner_cfg = version_cfg.get(version, None) + if tuner_cfg is None: + return ret_data + samplers_list = list(config_dict['samplers'].keys()) + ret_data.update(tuner_cfg['inference_para']) + ret_data['sampler_default'] = ret_data['DEFAULT_SAMPLER'] + if ret_data['DEFAULT_SAMPLER'] in samplers_list: + samplers_list.remove(ret_data['DEFAULT_SAMPLER']) + ret_data['sampler_choices'] = [ret_data['DEFAULT_SAMPLER']] + samplers_list + return ret_data + + +def get_base_model_list(config_dict): + ret_data = {'model_choices': [], 'model_default': '@'} + default_model = config_dict['default'] + if not default_model == '': + default_version = config_dict[default_model]['default'] + else: + default_version = '' + ret_data['model_default'] = f'{default_model}@{default_version}' + for base_model_name in config_dict: + if base_model_name in ['default', 'choices', 'samplers']: + continue + for version in config_dict[base_model_name]: + if version in ['default', 'choices', 'samplers']: + continue + ret_data['model_choices'].append(f'{base_model_name}@{version}') + if not ret_data['model_default'] == '@': + ret_data['model_choices'].remove(ret_data['model_default']) + ret_data['model_choices'] = [ret_data['model_default'] + ] + ret_data['model_choices'] + else: + ret_data['model_default'] = ret_data['model_choices'][0] if len( + ret_data['model_choices']) > 0 else '' + + if not ret_data['model_default'] == '': + ret_data['model_name'] = ret_data['model_default'].split('@')[0] + ret_data['version_name'] = ret_data['model_default'].split('@')[1] + else: + ret_data['model_name'] = '' + ret_data['version_name'] = '' + return ret_data + + +def get_control_para_by_model_version(config_dict, model_name, version): + ret_data = {} + version_cfg = config_dict.get(model_name, None) + if version_cfg is None: + return ret_data + tuner_cfg = version_cfg.get(version, None) + if tuner_cfg is None: + return ret_data + samplers_list = list(config_dict['samplers'].keys()) + ret_data.update(tuner_cfg['inference_para']) + ret_data['sampler_default'] = ret_data['DEFAULT_SAMPLER'] + if ret_data['DEFAULT_SAMPLER'] in samplers_list: + samplers_list.remove(ret_data['DEFAULT_SAMPLER']) + ret_data['sampler_choices'] = [ret_data['DEFAULT_SAMPLER']] + samplers_list + return ret_data + + +def get_control_default(config_dict): + ret_data = {} + # 默认的模型 + ret_data['model_choices'] = config_dict['choices'] + ret_data['model_default'] = config_dict['default'] + default_version_cfg = config_dict.get(config_dict['default'], None) + # 默认的版本 + if default_version_cfg is None: + return ret_data + ret_data['version_choices'] = default_version_cfg['choices'] + ret_data['version_default'] = default_version_cfg['default'] + default_control_cfg = default_version_cfg.get( + default_version_cfg['default'], None) + if default_control_cfg is None: + return ret_data + if 'control_type' in default_control_cfg and default_control_cfg[ + 'control_type']['default'] != '': + default_control_cfg = default_control_cfg['control_type'] + else: + return ret_data + # import pdb; pdb.set_trace() + ret_data['control_choices'] = list(default_control_cfg['choices'].keys()) + defalt_t_type = default_control_cfg['default'] + type_paras = default_control_cfg.get(defalt_t_type, None) + + default_t_n = defalt_t_type.split('@')[0] + default_r_n = int(defalt_t_type.split('@')[1]) + + ret_data['resolution_choices'] = default_control_cfg['choices'].get( + default_t_n, []) + ret_data['control_default'] = default_t_n + ret_data['resolution_default'] = default_r_n + if type_paras is not None: + ret_data.update(type_paras) + return ret_data diff --git a/scepter/studio/utils/__init__.py b/scepter/studio/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scepter/studio/utils/env.py b/scepter/studio/utils/env.py new file mode 100644 index 0000000..d6755f6 --- /dev/null +++ b/scepter/studio/utils/env.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from scepter.modules.utils.file_system import FS + + +def init_env(cfg_general): + work_dir = cfg_general.WORK_DIR + file_system = cfg_general.get('FILE_SYSTEM', None) + if file_system is not None: + if isinstance(file_system, list): + for file_sys in file_system: + _prefix = FS.init_fs_client(file_sys) + elif file_system is not None: + _prefix = FS.init_fs_client(file_system) # noqa + is_flag = FS.make_dir(work_dir) + assert is_flag + return cfg_general diff --git a/scepter/studio/utils/file.py b/scepter/studio/utils/file.py new file mode 100644 index 0000000..2ace679 --- /dev/null +++ b/scepter/studio/utils/file.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +import os + + +def get_tuner_choices(): + tuner_choices = [] + current_dir = os.path.dirname(__file__) + base_path = os.sep.join(current_dir.split(os.sep)[:-3]) + base_path = os.path.join(base_path, 'config') + for file in os.listdir(base_path): + if 'ipynb' in file: + continue + import json + + with open(os.path.join(base_path, file), 'r') as f: + content = json.load(f) + tuner_choices.append(content['name']) + return tuner_choices diff --git a/scepter/studio/utils/singleton.py b/scepter/studio/utils/singleton.py new file mode 100644 index 0000000..3ea30e0 --- /dev/null +++ b/scepter/studio/utils/singleton.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +class Singleton(object): + @classmethod + def get_instance(cls, cfg, **kwargs): + if not hasattr(cls, '_instance'): + cls._instance = cls(cfg, **kwargs) + return cls._instance diff --git a/scepter/studio/utils/uibase.py b/scepter/studio/utils/uibase.py new file mode 100644 index 0000000..3b81f72 --- /dev/null +++ b/scepter/studio/utils/uibase.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from scepter.studio.utils.singleton import Singleton + + +class UIBase(Singleton): + def create_ui(self, *args, **kwargs): + raise NotImplementedError() + + def set_callbacks(self, *args, **kwargs): + raise NotImplementedError() + + def func_to_set_value(self, name, type=None): + def func(value): + if type is not None: + value = type(value) + setattr(self, name, value) + return value + + return func diff --git a/scepter/tools/run_inference.py b/scepter/tools/run_inference.py index 2d0e98f..7376e33 100644 --- a/scepter/tools/run_inference.py +++ b/scepter/tools/run_inference.py @@ -7,6 +7,8 @@ import cv2 import numpy as np import torch import torch.cuda.amp as amp +import torchvision.transforms as TT +from PIL import Image from scepter.modules.solver.registry import SOLVERS from scepter.modules.utils.config import Config @@ -41,7 +43,7 @@ def run_task(cfg): image_size = [int(h), int(w)] else: image_size = [int(image_size), int(image_size)] - + batch_data = {} if solver.sample_args: batch_data.update(solver.sample_args.get_lowercase_dict()) @@ -56,7 +58,7 @@ def run_task(cfg): 'guide_scale': guide_scale, 'guide_rescale': guide_rescale, }) - + dtype = getattr(torch, cfg.SOLVER.DTYPE) with amp.autocast(enabled=True, dtype=dtype): batch_data = transfer_data_to_cuda(batch_data) @@ -74,8 +76,98 @@ def run_task(cfg): cv2.imwrite(local_path, image) +def run_task_control(cfg): + from scepter.modules.annotator.utils import AnnotatorProcessor + + std_logger = get_logger(name='scepter') + solver = SOLVERS.build(cfg.SOLVER, logger=std_logger) + solver.set_up() + if not cfg.args.pretrained_model == '': + with FS.get_from(cfg.args.pretrained_model, + wait_finish=True) as local_path: + state = torch.load(local_path, map_location='cuda') + state = state['model'] if 'model' in state else state + missing, unexpected = solver.model.model.control_blocks[ + 0].load_state_dict(state, strict=False) + if we.rank == 0: + std_logger.info( + f'Restored from {cfg.args.pretrained_model} with ' + f'{len(missing)} missing and {len(unexpected)} unexpected keys' + ) + + solver.test_mode() + num_samples = cfg.args.num_samples + prompt = [cfg.args.prompt] * num_samples + n_prompt = [cfg.args.n_prompt] * num_samples + sampler = cfg.args.sampler + sample_steps = cfg.args.sample_steps + seed = cfg.args.seed + guide_scale = cfg.args.guide_scale + guide_rescale = cfg.args.guide_rescale + image_size = cfg.args.image_size + if image_size is not None: + if ',' in image_size: + h, w = image_size.split(',') + image_size = [int(h), int(w)] + else: + image_size = int(image_size) + + with FS.get_from(cfg.args.image, wait_finish=True) as local_path: + image = Image.open(local_path) + if not image.mode == 'RGB': + image = image.convert('RGB') + image = TT.CenterCrop(image_size)(TT.Resize(image_size)(image)) + + if cfg.args.control_mode != 'source': + anno_processor = AnnotatorProcessor(anno_type=cfg.args.control_mode) + hint = anno_processor.run(image, cfg.args.control_mode) + else: + hint = image + hint = TT.ToTensor()(hint)[None, ...].repeat(num_samples, 1, 1, + 1).to(we.device_id) + + batch_data = {} + if solver.sample_args: + batch_data.update(solver.sample_args.get_lowercase_dict()) + if image_size is not None: + batch_data.update({'image_size': image_size}) + batch_data.update({ + 'prompt': prompt, + 'n_prompt': n_prompt, + 'sampler': sampler, + 'sample_steps': sample_steps, + 'seed': seed, + 'guide_scale': guide_scale, + 'guide_rescale': guide_rescale, + 'hint': hint + }) + + dtype = getattr(torch, cfg.SOLVER.DTYPE) + with amp.autocast(enabled=True, dtype=dtype): + batch_data = transfer_data_to_cuda(batch_data) + ret = solver.run_step_test(batch_data) + save_folder = os.path.join(solver.work_dir, cfg.args.save_folder) + for idx, out in enumerate(ret): + for name in ['image', 'hint']: + img = out[name] + img = img.permute(1, 2, 0).cpu().numpy() + img = (img * 255).astype(np.uint8) + filename = '{}_{}_{}.png'.format('inference', name, idx) + save_file = os.path.join(save_folder, filename) + with FS.put_to(save_file) as local_path: + image = img.copy() + cv2.cvtColor(image, cv2.COLOR_RGB2BGR, image) + cv2.imwrite(local_path, image) + std_logger.info(f'Processed {filename} save to {local_path}') + + if __name__ == '__main__': parser = argparse.ArgumentParser(description='Argparser for Scepter:\n') + parser.add_argument('--task', + dest='task', + help='Running task!', + default='t2i', + choices=['t2i', 'control']) parser.add_argument( '--prompt', dest='prompt', @@ -128,5 +220,18 @@ if __name__ == '__main__': dest='pretrained_model', help='The pretrained model for our network!', default='') + parser.add_argument('--image', + dest='image', + help='For image-guided task (control, upsample)', + default='') + parser.add_argument('--control_mode', + dest='control_mode', + help='For controllable image synthesis task', + choices=['source', 'canny', 'pose'], + default=None) cfg = Config(load=True, parser_ins=parser) - we.init_env(cfg, logger=None, fn=run_task) + if cfg.args.task == 'control': + task_fn = run_task_control + else: + task_fn = run_task + we.init_env(cfg, logger=None, fn=task_fn) diff --git a/scepter/tools/run_train.py b/scepter/tools/run_train.py index 0761a9e..e369035 100644 --- a/scepter/tools/run_train.py +++ b/scepter/tools/run_train.py @@ -16,8 +16,31 @@ def run_task(cfg): solver.solve() +def update_config(cfg): + if hasattr(cfg.args, 'learning_rate') and cfg.args.learning_rate: + print( + f'learning_rate change from {cfg.SOLVER.OPTIMIZER.LEARNING_RATE} to {cfg.args.learning_rate}' + ) + cfg.SOLVER.OPTIMIZER.LEARNING_RATE = float(cfg.args.learning_rate) + if hasattr(cfg.args, 'max_steps') and cfg.args.max_steps: + print( + f'max_steps change from {cfg.SOLVER.MAX_STEPS} to {cfg.args.max_steps}' + ) + cfg.SOLVER.MAX_STEPS = int(cfg.args.max_steps) + return cfg + + if __name__ == '__main__': parser = argparse.ArgumentParser(description='Argparser for Scepter:\n') + parser.add_argument('--learning_rate', + dest='learning_rate', + help='The learning rate for our network!', + default=None) + parser.add_argument('--max_steps', + dest='max_steps', + help='The max steps for training!', + default=None) cfg = Config(load=True, parser_ins=parser) + cfg = update_config(cfg) we.init_env(cfg, logger=None, fn=run_task) diff --git a/scepter/tools/webui.py b/scepter/tools/webui.py new file mode 100644 index 0000000..ea4abd3 --- /dev/null +++ b/scepter/tools/webui.py @@ -0,0 +1,123 @@ +# -*- coding: utf-8 -*- +import argparse +import datetime +import os +import random + +import gradio as gr + +import scepter +from scepter.modules.utils.config import Config +from scepter.modules.utils.file_system import FS +from scepter.modules.utils.logger import get_logger, init_logger + + +def prepare(config): + if 'FILE_SYSTEM' in config: + for fs_info in config['FILE_SYSTEM']: + FS.init_fs_client(fs_info) + + if 'LOG_FILE' in config: + logger = get_logger() + tid = '{0:%Y%m%d%H%M%S%f}'.format(datetime.datetime.now()) + ''.join( + [str(random.randint(1, 10)) for i in range(3)]) + init_logger(logger, log_file=config['LOG_FILE'].format(tid)) + + +class TabManager(): + def __init__(self): + pass + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--cfg', + dest='config', + type=str, + default='/config/config.yaml') + parser.add_argument('--debug', + dest='debug', + action='store_true', + help='Switch debug mode.') + parser.add_argument( + '--host', + dest='host', + default=None, + help='The host of Gradio, default is set in ui config.') + parser.add_argument('--port', + dest='port', + default=None, + help='The port of Gradio.') + parser.add_argument('--language', + dest='language', + choices=['en', 'zh'], + default='en', + help='Now we only support english(en) and chinese(zh)') + args = parser.parse_args() + config = Config(load=True, cfg_file=args.config) + prepare(config) + + tab_manager = TabManager() + interfaces = [] + for info in config['INTERFACE']: + name = info.get('NAME_EN', + '') if args.language == 'en' else info['NAME'] + ifid = info['IFID'] + if not FS.exists(info['CONFIG']): + info['CONFIG'] = os.path.join(os.path.dirname(scepter.dirname), + info['CONFIG']) + if not FS.exists(info['CONFIG']): + raise f"{info['CONFIG']} doesn't exist." + interface = None + if ifid == 'home': + from scepter.studio.home.home import HomeUI + interface = HomeUI(info['CONFIG'], + is_debug=args.debug, + language=args.language, + root_work_dir=config.WORK_DIR) + if ifid == 'preprocess': + from scepter.studio.preprocess.preprocess import PreprocessUI + interface = PreprocessUI(info['CONFIG'], + is_debug=args.debug, + language=args.language, + root_work_dir=config.WORK_DIR) + if ifid == 'self_train': + from scepter.studio.self_train.self_train import SelfTrainUI + interface = SelfTrainUI(info['CONFIG'], + is_debug=args.debug, + language=args.language, + root_work_dir=config.WORK_DIR) + if ifid == 'inference': + from scepter.studio.inference.inference import InferenceUI + interface = InferenceUI(info['CONFIG'], + is_debug=args.debug, + language=args.language, + root_work_dir=config.WORK_DIR) + if ifid == '': + pass # TODO: Add New Features + if interface: + interfaces.append((interface, name, ifid)) + setattr(tab_manager, ifid, interface) + + with gr.Blocks() as demo: + if 'BANNER' in config: + gr.HTML(config.BANNER) + else: + gr.Markdown( + f"

    {config.get('TITLE', 'scepter studio')}

    " + ) + with gr.Tabs(elem_id='tabs') as tabs: + setattr(tab_manager, 'tabs', tabs) + for interface, label, ifid in interfaces: + with gr.TabItem(label, id=ifid, elem_id=f'tab_{ifid}'): + interface.create_ui() + for interface, label, ifid in interfaces: + interface.set_callbacks(tab_manager) + + demo.queue(status_update_rate=1).launch( + server_name=args.host if args.host else config['HOST'], + server_port=args.port if args.port else config['PORT'], + root_path=config['ROOT'], + show_error=True, + debug=True, + enable_queue=True) diff --git a/scepter/version.py b/scepter/version.py index a0d74d0..1c5ccae 100644 --- a/scepter/version.py +++ b/scepter/version.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. -__version__ = '0.0.1' +__version__ = '0.0.2' version_info = tuple(int(x) for x in __version__.split('.')[0:3]) diff --git a/setup.py b/setup.py index ca3df25..c7eeeed 100644 --- a/setup.py +++ b/setup.py @@ -131,7 +131,10 @@ def restorefile(contents): required = parse_requirements() contents = backupfile() - +print([ + pkg for pkg in setuptools.find_packages() + if '__pycache__' not in pkg and 'scepter' in pkg +]) setuptools.setup( name='scepter', version=get_version(), @@ -146,6 +149,8 @@ setuptools.setup( pkg for pkg in setuptools.find_packages() if '__pycache__' not in pkg and 'scepter' in pkg ], + include_package_data=True, + # package_data={'': ['*.yaml']}, data_files=[('lib/docs', glob.glob('docs/*.md') + glob.glob('docs/*/*.md')) ], classifiers=[ diff --git a/tests/tools/test_annotators.py b/tests/tools/test_annotators.py new file mode 100644 index 0000000..631daac --- /dev/null +++ b/tests/tools/test_annotators.py @@ -0,0 +1,209 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. + +import os +import unittest + +import numpy as np +from PIL import Image + +from scepter.modules.annotator.registry import ANNOTATORS +from scepter.modules.utils.config import Config +from scepter.modules.utils.distribute import we +from scepter.modules.utils.file_system import FS + + +class AnnotatorTest(unittest.TestCase): + def setUp(self): + print(('Testing %s.%s' % (type(self).__name__, self._testMethodName))) + _ = FS.init_fs_client(Config(cfg_dict={ + 'NAME': 'ModelscopeFs', + 'TEMP_DIR': './cache/data' + }, + load=False), + overwrite=False) + image_path = 'asset/images/sunflower.jpeg' + image = Image.open(image_path) + if image.mode != 'RGB': + image = image.convert('RGB') + self.image = np.array(image) + + self.save_dir = './cache/save_data/images' + if not os.path.exists(self.save_dir): + os.makedirs(self.save_dir) + + def tearDown(self): + super().tearDown() + + @unittest.skip('') + def test_annotator_canny(self): + # canny + canny_dict = { + 'NAME': 'CannyAnnotator', + 'LOW_THRESHOLD': 100, + 'HIGH_THRESHOLD': 200 + } + canny_anno = Config(cfg_dict=canny_dict, load=False) + canny_ins = ANNOTATORS.build(canny_anno).to(we.device_id) + canny_image = canny_ins(self.image) + print("canny's shape:", canny_image.shape) + Image.fromarray(canny_image).save( + os.path.join(self.save_dir, 'sunflower_canny.png')) + + @unittest.skip('') + def test_annotator_hed(self): + # hed + hed_dict = { + 'NAME': + 'HedAnnotator', + 'PRETRAINED_MODEL': + 'ms://damo/scepter_scedit@annotator/ckpts/ControlNetHED.pth' + } + hed_anno = Config(cfg_dict=hed_dict, load=False) + hed_ins = ANNOTATORS.build(hed_anno).to(we.device_id) + hed_image = hed_ins(self.image) + print("hed's shape:", hed_image.shape) + Image.fromarray(hed_image).save( + os.path.join(self.save_dir, 'sunflower_hed.png')) + + @unittest.skip('') + def test_annotator_openpose(self): + # openpose + openpose_dict = { + 'NAME': + 'OpenposeAnnotator', + 'BODY_MODEL_PATH': + 'ms://damo/scepter_scedit@annotator/ckpts/body_pose_model.pth', + 'HAND_MODEL_PATH': + 'ms://damo/scepter_scedit@annotator/ckpts/hand_pose_model.pth' + } + openpose_anno = Config(cfg_dict=openpose_dict, load=False) + openpose_ins = ANNOTATORS.build(openpose_anno).to(we.device_id) + openpose_image = openpose_ins(self.image) + print("openpose's shape:", openpose_image.shape) + Image.fromarray(openpose_image).save( + os.path.join(self.save_dir, 'sunflower_openpose.png')) + + @unittest.skip('') + def test_annotator_midas(self): + # midas + midas_dict = { + 'NAME': 'MidasDetector', + 'PRETRAINED_MODEL': + 'ms://damo/scepter_scedit@annotator/ckpts/dpt_hybrid-midas-501f0c75.pt', + 'A': 6.2, + 'BG_TH': 0.1 + } + midas_anno = Config(cfg_dict=midas_dict, load=False) + midas_ins = ANNOTATORS.build(midas_anno).to(we.device_id) + midas_image = midas_ins(self.image) + print("midas's shape:", midas_image.shape) + Image.fromarray(midas_image).save( + os.path.join(self.save_dir, 'sunflower_midas.png')) + + @unittest.skip('') + def test_annotator_mlsd(self): + # mlsd + mlsd_dict = { + 'NAME': 'MLSDdetector', + 'PRETRAINED_MODEL': + 'ms://damo/scepter_scedit@annotator/ckpts/mlsd_large_512_fp32.pth', + 'THR_V': 0.1, + 'THR_D': 0.1 + } + mlsd_anno = Config(cfg_dict=mlsd_dict, load=False) + mlsd_ins = ANNOTATORS.build(mlsd_anno).to(we.device_id) + mlsd_image = mlsd_ins(self.image) + print("mlsd's shape:", mlsd_image.shape) + Image.fromarray(mlsd_image).save( + os.path.join(self.save_dir, 'sunflower_mlsd.png')) + + @unittest.skip('') + def test_annotator_color(self): + # color + color_dict = {'NAME': 'ColorAnnotator', 'RATIO': 64} + color_anno = Config(cfg_dict=color_dict, load=False) + color_ins = ANNOTATORS.build(color_anno).to(we.device_id) + color_image = color_ins(self.image) + print("color's shape:", color_image.shape) + Image.fromarray(color_image).save( + os.path.join(self.save_dir, 'sunflower_color.png')) + + @unittest.skip('') + def test_annotator_multi(self): + # multi annotators + canny_dict = { + 'NAME': 'CannyAnnotator', + 'LOW_THRESHOLD': 100, + 'HIGH_THRESHOLD': 200, + 'INPUT_KEYS': ['img'], + 'OUTPUT_KEYS': ['canny_img'] + } + hed_dict = { + 'NAME': 'HedAnnotator', + 'PRETRAINED_MODEL': + 'ms://damo/scepter_scedit@annotator/ckpts/ControlNetHED.pth', + 'INPUT_KEYS': ['img'], + 'OUTPUT_KEYS': ['hed_img'] + } + openpose_dict = { + 'NAME': 'OpenposeAnnotator', + 'BODY_MODEL_PATH': + 'ms://damo/scepter_scedit@annotator/ckpts/body_pose_model.pth', + 'HAND_MODEL_PATH': + 'ms://damo/scepter_scedit@annotator/ckpts/hand_pose_model.pth', + 'INPUT_KEYS': ['img'], + 'OUTPUT_KEYS': ['openpose_img'] + } + midas_dict = { + 'NAME': 'MidasDetector', + 'PRETRAINED_MODEL': + 'ms://damo/scepter_scedit@annotator/ckpts/dpt_hybrid-midas-501f0c75.pt', + 'INPUT_KEYS': ['img'], + 'OUTPUT_KEYS': ['midas_img'] + } + mlsd_dict = { + 'NAME': 'MLSDdetector', + 'PRETRAINED_MODEL': + 'ms://damo/scepter_scedit@annotator/ckpts/mlsd_large_512_fp32.pth', + 'INPUT_KEYS': ['img'], + 'OUTPUT_KEYS': ['mlsd_img'] + } + color_dict = {'NAME': 'ColorAnnotator', 'RATIO': 64} + general_dict = { + 'NAME': + 'GeneralAnnotator', + 'ANNOTATORS': [ + canny_dict, hed_dict, openpose_dict, midas_dict, mlsd_dict, + color_dict + ] + } + general_anno = Config(cfg_dict=general_dict, load=False) + general_ins = ANNOTATORS.build(general_anno).to(we.device_id) + output_image = general_ins({'img': self.image}) + for key, save_image in output_image.items(): + Image.fromarray(save_image).save( + os.path.join(self.save_dir, f'sunflower_multi_{key}.png')) + + # @unittest.skip('') + def test_annotator_processor(self): + from scepter.modules.annotator.utils import AnnotatorProcessor + anno_processor = AnnotatorProcessor(anno_type='hed') + output_image = anno_processor.run(self.image, 'hed') + Image.fromarray(output_image).save( + os.path.join(self.save_dir, 'sunflower_processor_hed.png')) + + anno_processor = AnnotatorProcessor( + anno_type=['canny', 'color', 'depth']) + output_image = anno_processor.run(self.image, 'color') + Image.fromarray(output_image).save( + os.path.join(self.save_dir, 'sunflower_processor_color.png')) + + output_image = anno_processor.run(self.image, ['canny', 'depth']) + for key, save_image in output_image.items(): + Image.fromarray(save_image).save( + os.path.join(self.save_dir, f'sunflower_processor_{key}.png')) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/tools/test_inference.py b/tests/tools/test_inference.py index 1462e49..e77f133 100644 --- a/tests/tools/test_inference.py +++ b/tests/tools/test_inference.py @@ -12,53 +12,171 @@ class InferenceTest(unittest.TestCase): def tearDown(self): super().tearDown() - # @unittest.skip('') + @unittest.skip('') def test_infer_args(self): - os.system("python scepter/tools/run_inference.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml " - "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_2023'") - os.system("python scepter/tools/run_inference.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml " - "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_2024' --seed 2024") - os.system("python scepter/tools/run_inference.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml " - "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_size768' " - "--image_size '768'") - os.system("python scepter/tools/run_inference.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml " - "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_1280_720' " - "--image_size '1280,720'") - os.system("python scepter/tools/run_inference.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml " - "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_720_1280_step10' " - "--image_size '720,1280' --sample_steps 10") - os.system("python scepter/tools/run_inference.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml " - "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_num2' --num_samples 2") - os.system("python scepter/tools/run_inference.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml " - "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_dpmpp_2s_ancestral' " - "--sampler 'dpmpp_2s_ancestral'") - os.system("python scepter/tools/run_inference.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml " - "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_scale5' " - "--guide_scale 5.0") - os.system("python scepter/tools/run_inference.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml " - "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_rescale0_1' " - "--guide_rescale 0.1") + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml ' + "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_2023'" + ) + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml ' + "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_2024' --seed 2024" + ) + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml ' + "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_size768' " + "--image_size '768'") + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml ' + "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_1280_720' " + "--image_size '1280,720'") + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml ' + "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_720_1280_step10' " + "--image_size '720,1280' --sample_steps 10") + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml ' + "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_num2' --num_samples 2" + ) + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml ' + "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_dpmpp_2s_ancestral' " + "--sampler 'dpmpp_2s_ancestral'") + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml ' + "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_scale5' " + '--guide_scale 5.0') + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml ' + "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog_rescale0_1' " + '--guide_rescale 0.1') + + @unittest.skip('') + def test_example_infer(self): + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml ' + "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog'") + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_2.1_768.yaml ' + "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog'") + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_xl_1024.yaml ' + "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog'") + + @unittest.skip('') + def test_trained_infer(self): + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml ' + "--pretrained_model 'cache/save_data/sd15_512_full/checkpoints/ldm_step-100.pth' " + "--prompt 'A close up of a small rabbit wearing a hat and scarf' " + "--save_folder 'trained_test_prompt_rabbit' ") + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_2.1_768.yaml ' + "--pretrained_model 'cache/save_data/sd21_768_full/checkpoints/ldm_step-100.pth' " + "--prompt 'A close up of a small rabbit wearing a hat and scarf' " + "--save_folder 'trained_test_prompt_rabbit' ") + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_xl_1024.yaml --guide_scale 5.0 ' + "--pretrained_model 'cache/save_data/sdxl_1024_full/checkpoints/ldm_step-100.pth' " + "--prompt 'A close up of a small rabbit wearing a hat and scarf' " + "--save_folder 'trained_test_prompt_rabbit' ") + + @unittest.skip('') + def test_trained_tuning_infer(self): + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512_lora.yaml ' + "--pretrained_model 'cache/save_data/sd15_512_lora/checkpoints/ldm_step-100.pth' " + "--prompt 'A close up of a small rabbit wearing a hat and scarf' " + "--save_folder 'trained_test_prompt_rabbit' ") + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_2.1_768_lora.yaml ' + "--pretrained_model 'cache/save_data/sd21_768_lora/checkpoints/ldm_step-100.pth' " + "--prompt 'A close up of a small rabbit wearing a hat and scarf' " + "--save_folder 'trained_test_prompt_rabbit' ") + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_xl_1024_lora.yaml ' + "--pretrained_model 'cache/save_data/sdxl_1024_lora/checkpoints/ldm_step-100.pth' " + "--prompt 'A close up of a small rabbit wearing a hat and scarf' " + "--save_folder 'trained_test_prompt_rabbit' ") + + @unittest.skip('') + def test_trained_scedit_infer(self): + # swift + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/scedit/t2i/sd15_512_sce_t2i_swift.yaml ' + "--pretrained_model 'cache/save_data/sd15_512_sce_t2i_swift/checkpoints/ldm_step-100.pth' " + "--prompt 'A close up of a small rabbit wearing a hat and scarf' " + "--save_folder 'trained_test_prompt_rabbit' ") + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/scedit/t2i/sd21_768_sce_t2i_swift.yaml ' + "--pretrained_model 'cache/save_data/sd21_768_sce_t2i_swift/checkpoints/ldm_step-100.pth' " + "--prompt 'A close up of a small rabbit wearing a hat and scarf' " + "--save_folder 'trained_test_prompt_rabbit' ") + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/scedit/t2i/sdxl_1024_sce_t2i_swift.yaml ' + "--pretrained_model 'cache/save_data/sdxl_1024_sce_t2i_swift/checkpoints/ldm_step-100.pth' " + "--prompt 'A close up of a small rabbit wearing a hat and scarf' " + "--save_folder 'trained_test_prompt_rabbit' ") + # original + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/scedit/t2i/sd15_512_sce_t2i.yaml ' + "--pretrained_model 'cache/save_data/sd15_512_sce_t2i/checkpoints/ldm_step-100.pth' " + "--prompt 'A close up of a small rabbit wearing a hat and scarf' " + "--save_folder 'trained_test_prompt_rabbit' ") + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/scedit/t2i/sd21_768_sce_t2i.yaml ' + "--pretrained_model 'cache/save_data/sd21_768_sce_t2i/checkpoints/ldm_step-100.pth' " + "--prompt 'A close up of a small rabbit wearing a hat and scarf' " + "--save_folder 'trained_test_prompt_rabbit' ") + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/scedit/t2i/sdxl_1024_sce_t2i.yaml ' + "--pretrained_model 'cache/save_data/sdxl_1024_sce_t2i/checkpoints/ldm_step-100.pth' " + "--prompt 'A close up of a small rabbit wearing a hat and scarf' " + "--save_folder 'trained_test_prompt_rabbit' ") # @unittest.skip('') - def test_example_infer(self): - os.system("python scepter/tools/run_inference.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml " - "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog'") - os.system("python scepter/tools/run_inference.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_2.1_768.yaml " - "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog'") - os.system("python scepter/tools/run_inference.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_xl_1024.yaml " - "--prompt 'a cute dog' --save_folder 'test_prompt_a_cute_dog'") + def test_pretrained_scedit_control_infer(self): + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/scedit/ctr/sd21_768_sce_ctr_canny.yaml --num_samples 1 ' + "--prompt 'a single flower is shown in front of a tree' --save_folder 'test_flower_canny' " + "--image_size 768 --task control --image 'asset/images/flower.jpg' --control_mode canny " + '--pretrained_model ' + 'ms://damo/scepter_scedit@controllable_model/SD2.1/canny_control/0_SwiftSCETuning/pytorch_model.bin' + ) + + os.system( + 'python scepter/tools/run_inference.py ' + '--cfg scepter/methods/scedit/ctr/sd21_768_sce_ctr_pose.yaml --num_samples 1 ' + "--prompt 'super mario' --save_folder 'test_mario_pose' " + "--image_size 768 --task control --image 'asset/images/pose_source.png' --control_mode source " + '--pretrained_model ' + 'ms://damo/scepter_scedit@controllable_model/SD2.1/pose_control/0_SwiftSCETuning/pytorch_model.bin' + ) if __name__ == '__main__': diff --git a/tests/tools/test_train.py b/tests/tools/test_train.py index 7f0216c..0752644 100644 --- a/tests/tools/test_train.py +++ b/tests/tools/test_train.py @@ -8,37 +8,178 @@ import unittest class TrainTest(unittest.TestCase): def setUp(self): print(('Testing %s.%s' % (type(self).__name__, self._testMethodName))) + self.tmp_dir = './cache/save_data' def tearDown(self): super().tearDown() - # @unittest.skip('') + @unittest.skip('') def test_generation_example_full(self): - os.system("python scepter/tools/run_train.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml ") - os.system("python scepter/tools/run_train.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_2.1_768.yaml ") - os.system("python scepter/tools/run_train.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_xl_1024.yaml ") - - # @unittest.skip('') + os.system( + 'python scepter/tools/run_train.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, 'sd15_512_full/checkpoints'))) + + os.system( + 'python scepter/tools/run_train.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_2.1_768.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, 'sd21_768_full/checkpoints'))) + + os.system( + 'python scepter/tools/run_train.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_xl_1024.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, 'sdxl_1024_full/checkpoints'))) + + @unittest.skip('') def test_generation_example_lora(self): - os.system("python scepter/tools/run_train.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512_lora.yaml ") - os.system("python scepter/tools/run_train.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_2.1_768_lora.yaml ") - os.system("python scepter/tools/run_train.py " - "--cfg scepter/methods/examples/generation/stable_diffusion_xl_1024_lora.yaml ") - + os.system( + 'python scepter/tools/run_train.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_1.5_512_lora.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, 'sd15_512_lora/checkpoints'))) + + os.system( + 'python scepter/tools/run_train.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_2.1_768_lora.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, 'sd21_768_lora/checkpoints'))) + + os.system( + 'python scepter/tools/run_train.py ' + '--cfg scepter/methods/examples/generation/stable_diffusion_xl_1024_lora.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, 'sdxl_1024_lora/checkpoints'))) + + @unittest.skip('') + def test_generation_example_scedit_t2i_swift(self): + os.system( + 'python scepter/tools/run_train.py ' + '--cfg scepter/methods/scedit/t2i/sd15_512_sce_t2i_swift.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, + 'sd15_512_sce_t2i_swift/checkpoints'))) + + os.system( + 'python scepter/tools/run_train.py ' + '--cfg scepter/methods/scedit/t2i/sd21_768_sce_t2i_swift.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, + 'sd21_768_sce_t2i_swift/checkpoints'))) + + os.system( + 'python scepter/tools/run_train.py ' + '--cfg scepter/methods/scedit/t2i/sdxl_1024_sce_t2i_swift.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, + 'sdxl_1024_sce_t2i_swift/checkpoints'))) + + @unittest.skip('') + def test_generation_example_scedit_t2i(self): + os.system('python scepter/tools/run_train.py ' + '--cfg scepter/methods/scedit/t2i/sd15_512_sce_t2i.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, 'sd15_512_sce_t2i/checkpoints'))) + + os.system('python scepter/tools/run_train.py ' + '--cfg scepter/methods/scedit/t2i/sd21_768_sce_t2i.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, 'sd21_768_sce_t2i/checkpoints'))) + + os.system('python scepter/tools/run_train.py ' + '--cfg scepter/methods/scedit/t2i/sdxl_1024_sce_t2i.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, 'sdxl_1024_sce_t2i/checkpoints'))) + + @unittest.skip('') + def test_generation_example_scedit_ctr(self): + os.system('python scepter/tools/run_train.py ' + '--cfg scepter/methods/scedit/ctr/sd15_512_sce_ctr_hed.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, + 'sd15_512_sce_ctr_hed/checkpoints'))) + + os.system( + 'python scepter/tools/run_train.py ' + '--cfg scepter/methods/scedit/ctr/sd21_768_sce_ctr_canny.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, + 'sd21_768_sce_ctr_canny/checkpoints'))) + + os.system( + 'python scepter/tools/run_train.py ' + '--cfg scepter/methods/scedit/ctr/sd21_768_sce_ctr_pose.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, + 'sd21_768_sce_ctr_pose/checkpoints'))) + + os.system( + 'python scepter/tools/run_train.py ' + '--cfg scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_depth.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, + 'sdxl_1024_sce_ctr_depth/checkpoints'))) + + os.system( + 'python scepter/tools/run_train.py ' + '--cfg scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_color.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, + 'sdxl_1024_sce_ctr_color/checkpoints'))) + # @unittest.skip('') - def test_generation_example_scedit(self): - os.system("python scepter/tools/run_train.py " - "--cfg scepter/methods/SCEdit/t2i_sd15_512_sce.yaml ") - os.system("python scepter/tools/run_train.py " - "--cfg scepter/methods/SCEdit/t2i_sd21_768_sce.yaml ") - os.system("python scepter/tools/run_train.py " - "--cfg scepter/methods/SCEdit/t2i_sdxl_1024_sce.yaml ") - + def test_generation_example_datatxt(self): + # os.system( + # 'python scepter/tools/run_train.py ' + # '--cfg scepter/methods/scedit/t2i/sdxl_1024_sce_t2i_datatxt.yaml ' + # '--max_steps 100' + # ) + # self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'sdxl_1024_sce_t2i_datatxt/checkpoints'))) + + os.system( + 'python scepter/tools/run_train.py ' + '--cfg scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_color_datatxt.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, + 'sdxl_1024_sce_ctr_color_datatxt/checkpoints'))) if __name__ == '__main__': diff --git a/tests/utils/test_fs.py b/tests/utils/test_fs.py index 969ba93..3286b65 100644 --- a/tests/utils/test_fs.py +++ b/tests/utils/test_fs.py @@ -45,6 +45,11 @@ class FSTest(unittest.TestCase): print(f'Download from {path} to {local_path}') self.assertTrue(os.path.exists(local_path)) + path = 'ms://AI-ModelScope/clip-vit-large-patch14' + with FS.get_dir_to_local_dir(path, wait_finish=True) as local_path: + print(f'Download from {path} to {local_path}') + self.assertTrue(os.path.exists(local_path)) + if __name__ == '__main__': unittest.main()

wQ|CQg5E!2GeccEm%)wW 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-$**DGq9-g_?cz%TVy*# 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�(xZYpp^k#Fu>#~OfS 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

}nXWnDY&3x}qhXh#^o7}VdVYHMaYdS|JE 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