diff --git a/.gitignore b/.gitignore index e9d27c2..5a877c2 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,6 @@ dev scepter.egg-info .readthedocs.yml 1.9 -MANIFEST.in +#MANIFEST.in *resources *.ipynb_checkpoints* diff --git a/asset/images/edit_tuner/cat_512.jpg b/asset/images/edit_tuner/cat_512.jpg new file mode 100644 index 0000000..afac590 Binary files /dev/null and b/asset/images/edit_tuner/cat_512.jpg differ diff --git a/asset/images/edit_tuner/depth.jpg b/asset/images/edit_tuner/depth.jpg new file mode 100644 index 0000000..d632883 Binary files /dev/null and b/asset/images/edit_tuner/depth.jpg differ diff --git a/asset/images/edit_tuner/depth2image.jpeg b/asset/images/edit_tuner/depth2image.jpeg new file mode 100644 index 0000000..d57f79c Binary files /dev/null and b/asset/images/edit_tuner/depth2image.jpeg differ diff --git a/asset/images/edit_tuner/detext.jpeg b/asset/images/edit_tuner/detext.jpeg new file mode 100644 index 0000000..6ddb0d3 Binary files /dev/null and b/asset/images/edit_tuner/detext.jpeg differ diff --git a/asset/images/edit_tuner/hed.jpeg b/asset/images/edit_tuner/hed.jpeg new file mode 100644 index 0000000..c29af91 Binary files /dev/null and b/asset/images/edit_tuner/hed.jpeg differ diff --git a/asset/images/edit_tuner/house.jpg b/asset/images/edit_tuner/house.jpg new file mode 100644 index 0000000..f4b67fd Binary files /dev/null and b/asset/images/edit_tuner/house.jpg differ diff --git a/asset/images/edit_tuner/image2depth.jpeg b/asset/images/edit_tuner/image2depth.jpeg new file mode 100644 index 0000000..a972132 Binary files /dev/null and b/asset/images/edit_tuner/image2depth.jpeg differ diff --git a/asset/images/edit_tuner/text.jpg b/asset/images/edit_tuner/text.jpg new file mode 100644 index 0000000..16b37c2 Binary files /dev/null and b/asset/images/edit_tuner/text.jpg differ diff --git a/docs/en/conf.py b/docs/en/conf.py index a713930..941cbb1 100644 --- a/docs/en/conf.py +++ b/docs/en/conf.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. # Configuration file for the Sphinx documentation builder. # # This file only contains a selection of the most common options. For a full diff --git a/docs/en/tasks/stylebooth.md b/docs/en/tasks/stylebooth.md index d448bcd..84be3ea 100644 --- a/docs/en/tasks/stylebooth.md +++ b/docs/en/tasks/stylebooth.md @@ -29,8 +29,21 @@ Given an original image, image editing aims to generate an image that align with + + Origin Image + Lowpoly + Colored Pencil Art + Watercolor + misc-disco + + + + + + + + - ## Features | **Text-Based** | **Exemplar-Based** | @@ -92,7 +105,7 @@ class DiffusionInferenceTest(unittest.TestCase): output = diff_infer({'prompt': 'Let this image be in the style of sai-lowpoly'}, style_edit_image=Image.open('asset/images/inpainting_text_ref/ex4_scene_im.jpg'), style_guide_scale_text=7.5, - style_guide_scale_image=0.5) + style_guide_scale_image=1.5) save_path = os.path.join(self.tmp_dir, 'stylebooth_test_lowpoly_cute_dog.png') save_image(output['images'], save_path) diff --git a/docs/en/tutorials/dataset.md b/docs/en/tutorials/dataset.md index c954382..9c13c33 100644 --- a/docs/en/tutorials/dataset.md +++ b/docs/en/tutorials/dataset.md @@ -16,7 +16,11 @@ print(next(iter(ms_train_dataset))) ## CSV Format -For the data format used by SCEPTER Studio, please refer to [3D_example_csv.zip](https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=datasets/3D_example_csv.zip). +For the data format used by SCEPTER Studio, please refer to [3D_example_csv.zip](https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=datasets/3D_example_csv.zip) and [hed_pair.zip](https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=datasets%2Fhed_pair.zip). +```shell +mkdir -p cache/datasets/ && wget 'https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=datasets/3D_example_csv.zip' -O cache/datasets/3D_example_csv.zip && unzip cache/datasets/3D_example_csv.zip -d cache/datasets/ && rm cache/datasets/3D_example_csv.zip +mkdir -p cache/datasets/ && wget 'https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=datasets/hed_pair.zip' -O cache/datasets/hed_pair.zip && unzip cache/datasets/hed_pair.zip -d cache/datasets/ && rm cache/datasets/hed_pair.zip +``` ## TXT Format @@ -24,3 +28,4 @@ To facilitate starting training in command-line mode, you can use a dataset in t ```shell mkdir -p cache/datasets/ && wget 'https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=datasets/3D_example_txt.zip' -O cache/datasets/3D_example_txt.zip && unzip cache/datasets/3D_example_txt.zip -d cache/datasets/ && rm cache/datasets/3D_example_txt.zip +``` diff --git a/docs/en/tutorials/inference.md b/docs/en/tutorials/inference.md index f5a98f4..078f9bc 100644 --- a/docs/en/tutorials/inference.md +++ b/docs/en/tutorials/inference.md @@ -40,6 +40,6 @@ python scepter/tools/run_inference.py --cfg scepter/methods/scedit/t2i/sd15_512_ - SCEdit ```shell -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 +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://iic/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://iic/scepter_scedit@controllable_model/SD2.1/pose_control/0_SwiftSCETuning/pytorch_model.bin # pose ``` diff --git a/docs/zh_cn/conf.py b/docs/zh_cn/conf.py index a713930..941cbb1 100644 --- a/docs/zh_cn/conf.py +++ b/docs/zh_cn/conf.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. # Configuration file for the Sphinx documentation builder. # # This file only contains a selection of the most common options. For a full diff --git a/example/classifier/classifier_dataset.py b/example/classifier/classifier_dataset.py index 4d8334a..eb0a4b7 100644 --- a/example/classifier/classifier_dataset.py +++ b/example/classifier/classifier_dataset.py @@ -2,7 +2,6 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import numpy as np import torchvision - 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 diff --git a/readme.md b/readme.md index a401d85..2320218 100644 --- a/readme.md +++ b/readme.md @@ -18,6 +18,7 @@ SCEPTER offers 3 core components: ## 🎉 News +- [2024.05]: Introducing SCEPTER v1, supporting customized image edit tasks! Simply provide 10 image pairs, SCEPTER will tune an edit tuner for your own Image-to-Image tasks, like `de-text`, `segmentation`, etc. - [2024.04]: New [StyleBooth](https://ali-vilab.github.io/stylebooth-page/) demo on SCEPTER Studio for`Text-Based Style Editing`. - [2024.03]: We optimize the training UI and checkpoint management. New [LAR-Gen](https://arxiv.org/abs/2403.19534) model has been added on SCEPTER Studio, supporting `zoom-out`, `virtual try on`, `inpainting`. - [2024.02]: We release new SCEdit controllable image synthesis models for SD v2.1 and SD XL. Multiple strategies applied to accelerate inference time for SCEPTER Studio. @@ -29,38 +30,18 @@ SCEPTER offers 3 core components: ## 🖼 Gallery for Recent Works -### StyleBooth - - - - - - - - - - - - - - - -
Origin Image
Gold Dragon Tuner
Graffiti ArtAdorable Kawaiigame-retro gameVincent van Gogh
+### Edit Tuners +Simply provide 10 image pairs, SCEPTER will tune an edit tuner for your own Image-to-Image tasks, like `de-text`, `segmentation`, etc. +Try our official few-shot datasets: [De-Text](https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=datasets%2Fdetext.zip), [Image2Hed](https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=datasets%2Fhed_pair.zip), [image2depth](https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=datasets%2Fimage2depth.zip), [depth2image](https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=datasets%2Fdepth2image.zip) - - - - - + + - - - - - + +
Origin ImageLowpolyColored Pencil ArtWatercolormisc-discoDe-Text

Prompt: "Remove the texts" (Left: input Right: output)
Image2Hed

Prompt: "Convert to an edge map" (Left: input Right: output)
Image2Depth

Prompt: "Calculate the depth map" (Left: input Right: output)
Depth2Image

Prompt: "Convert depth map into color image" (Left: input Right: output)
@@ -132,8 +113,6 @@ The startup of **SCEPTER Studio** eliminates the need for manual downloading and Depending on the network and hardware situation, the initial startup usually requires 15-60 minutes, primarily involving the download and processing of SDv1.5, SDv2.1, and SDXL models. Therefore, subsequent startups will become much faster (about one minute) as downloading is no longer required. -To support the sharing and downloading of models, -please make sure that you have installed **zip** and Git Large File Storage (**git lfs**). ### Usage Demo | [Image Editing](https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=assets%2Fscepter_studio%2Fimage_editing_20240419.webm) | [Training](https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=assets%2Fscepter_studio%2Ftraining_20240419.webm) | [Model Sharing](https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=assets%2Fscepter_studio%2Fmodel_sharing_20240419.webm) | [Model Inference](https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=assets%2Fscepter_studio%2Fmodel_inference_20240419.webm) | [Data Management](https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=assets%2Fscepter_studio%2Fdata_management_20240419.webm) | diff --git a/scepter/methods/edit/edit_512_lora.yaml b/scepter/methods/edit/edit_512_lora.yaml new file mode 100644 index 0000000..5f68804 --- /dev/null +++ b/scepter/methods/edit/edit_512_lora.yaml @@ -0,0 +1,250 @@ +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/edit_512_lora + LOG_FILE: std_log.txt + # + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + TUNER: + - + NAME: SwiftLoRA + R: 64 + LORA_ALPHA: 64 + LORA_DROPOUT: 0.0 + BIAS: "none" + TARGET_MODULES: model.*(to_q|to_k|to_v|to_out.0|net.0.proj|net.2)$ + # + MODEL: + NAME: LatentDiffusionEdit + PARAMETERIZATION: eps + TIMESTEPS: 1000 + MIN_SNR_GAMMA: + ZERO_TERMINAL_SNR: False + PRETRAINED_MODEL: ms://damo/stylebooth@models/stylebooth-tb-5000-0.bin + IGNORE_KEYS: [ ] + CONCAT_NO_SCALE_FACTOR: True + 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: 8 + 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 + # + SAMPLE_ARGS: + SAMPLER: ddim + SAMPLE_STEPS: 50 + SEED: 2023 + GUIDE_SCALE: #7.5 + image: 1.5 + text: 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: cache/datasets/hed_pair + MS_DATASET_NAMESPACE: "" + MS_DATASET_SPLIT: "train" + MS_DATASET_SUBNAME: "" + PROMPT_PREFIX: "" + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 1 + NUM_WORKERS: 4 + SAMPLER: + NAME: LoopSampler + TRANSFORMS: + - NAME: LoadImageFromFileList + FILE_KEYS: ['img_path', 'src_path'] + RGB_ORDER: RGB + BACKEND: pillow + - NAME: FlexibleResize + INTERPOLATION: bilinear + SIZE: [ 512, 512 ] + INPUT_KEY: [ 'img', 'src' ] + OUTPUT_KEY: [ 'img', 'src' ] + BACKEND: pillow + - NAME: FlexibleCenterCrop + SIZE: [ 512, 512 ] + INPUT_KEY: [ 'img', 'src' ] + OUTPUT_KEY: [ 'img', 'src' ] + BACKEND: pillow + - NAME: ImageToTensor + INPUT_KEY: [ 'img', 'src' ] + OUTPUT_KEY: [ 'img', 'src' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img', 'src' ] + OUTPUT_KEY: [ 'image', 'condition_cat' ] + BACKEND: torchvision + - NAME: Select + KEYS: [ 'image', 'condition_cat', 'prompt' ] + META_KEYS: [ 'data_key' ] + # + TRAIN_HOOKS: + - + NAME: BackwardHook + PRIORITY: 0 + - + NAME: LogHook + LOG_INTERVAL: 50 + - + NAME: CheckpointHook + INTERVAL: 1000 + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 + + EVAL_DATA: + NAME: Text2ImageDataset + MODE: eval + PROMPT_FILE: + PROMPT_DATA: [ "Convert to an edge map#;#cache/datasets/hed_pair/images/src_001.jpeg" ] + IMAGE_SIZE: [ 512, 512 ] + FIELDS: [ "prompt", "src_path" ] + DELIMITER: '#;#' + PROMPT_PREFIX: '' + PIN_MEMORY: True + BATCH_SIZE: 1 + NUM_WORKERS: 4 + TRANSFORMS: + - NAME: LoadImageFromFileList + FILE_KEYS: [ 'src_path' ] + RGB_ORDER: RGB + BACKEND: pillow + - NAME: FlexibleResize + INTERPOLATION: bilinear + SIZE: [ 512, 512 ] + INPUT_KEY: [ 'src' ] + OUTPUT_KEY: [ 'src' ] + BACKEND: pillow + - NAME: FlexibleCenterCrop + SIZE: [ 512, 512 ] + INPUT_KEY: [ 'src' ] + OUTPUT_KEY: [ 'src' ] + BACKEND: pillow + - NAME: ImageToTensor + INPUT_KEY: [ 'src' ] + OUTPUT_KEY: [ 'src' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'src' ] + OUTPUT_KEY: [ 'condition_cat' ] + BACKEND: torchvision + - NAME: Select + KEYS: [ 'condition_cat', 'prompt' ] + META_KEYS: [ 'image_size' ] + EVAL_HOOKS: + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 + SAVE_LAST: True + SAVE_NAME_PREFIX: 'step' + SAVE_PROBE_PREFIX: 'image' diff --git a/scepter/methods/scedit/ctr/sd15_512_sce_ctr_hed.yaml b/scepter/methods/scedit/ctr/sd15_512_sce_ctr_hed.yaml index ddb9a86..4e727e5 100644 --- a/scepter/methods/scedit/ctr/sd15_512_sce_ctr_hed.yaml +++ b/scepter/methods/scedit/ctr/sd15_512_sce_ctr_hed.yaml @@ -127,7 +127,7 @@ SOLVER: DOWN_RATIO: 1.0 CONTROL_ANNO: NAME: HedAnnotator - PRETRAINED_MODEL: ms://damo/scepter_scedit@annotator/ckpts/ControlNetHED.pth + PRETRAINED_MODEL: ms://iic/scepter_scedit@annotator/ckpts/ControlNetHED.pth # SAMPLE_ARGS: SAMPLER: ddim diff --git a/scepter/methods/scedit/ctr/sd21_768_sce_ctr_pose.yaml b/scepter/methods/scedit/ctr/sd21_768_sce_ctr_pose.yaml index bce9527..b3255bf 100644 --- a/scepter/methods/scedit/ctr/sd21_768_sce_ctr_pose.yaml +++ b/scepter/methods/scedit/ctr/sd21_768_sce_ctr_pose.yaml @@ -125,8 +125,8 @@ SOLVER: 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 + BODY_MODEL_PATH: ms://iic/scepter_scedit@annotator/ckpts/body_pose_model.pth + HAND_MODEL_PATH: ms://iic/scepter_scedit@annotator/ckpts/hand_pose_model.pth # SAMPLE_ARGS: SAMPLER: ddim diff --git a/scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_depth.yaml b/scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_depth.yaml index af556a6..815ffce 100644 --- a/scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_depth.yaml +++ b/scepter/methods/scedit/ctr/sdxl_1024_sce_ctr_depth.yaml @@ -241,7 +241,7 @@ SOLVER: DOWN_RATIO: 1.0 CONTROL_ANNO: NAME: MidasDetector - PRETRAINED_MODEL: ms://damo/scepter_scedit@annotator/ckpts/dpt_hybrid-midas-501f0c75.pt + PRETRAINED_MODEL: ms://iic/scepter_scedit@annotator/ckpts/dpt_hybrid-midas-501f0c75.pt # SAMPLE_ARGS: SAMPLER: ddim diff --git a/scepter/methods/studio/extensions/controllers/official_controllers.yaml b/scepter/methods/studio/extensions/controllers/official_controllers.yaml index 836bfed..7b17c99 100644 --- a/scepter/methods/studio/extensions/controllers/official_controllers.yaml +++ b/scepter/methods/studio/extensions/controllers/official_controllers.yaml @@ -5,59 +5,59 @@ CONTROLLERS: DESCRIPTION: BASE_MODEL: SD2.1 TYPE: Canny - MODEL_PATH: ms://damo/scepter_scedit@controllable_model/SD2.1/canny_control/ + MODEL_PATH: ms://iic/scepter_scedit@controllable_model/SD2.1/canny_control/ - NAME: openpose NAME_ZH: DESCRIPTION: BASE_MODEL: SD2.1 TYPE: Openpose - MODEL_PATH: ms://damo/scepter_scedit@controllable_model/SD2.1/pose_control/ + MODEL_PATH: ms://iic/scepter_scedit@controllable_model/SD2.1/pose_control/ - NAME: color NAME_ZH: DESCRIPTION: BASE_MODEL: SD2.1 TYPE: Color - MODEL_PATH: ms://damo/scepter_scedit@controllable_model/SD2.1/color_control/ + MODEL_PATH: ms://iic/scepter_scedit@controllable_model/SD2.1/color_control/ - NAME: hed NAME_ZH: DESCRIPTION: BASE_MODEL: SD2.1 TYPE: Hed - MODEL_PATH: ms://damo/scepter_scedit@controllable_model/SD2.1/hed_control + MODEL_PATH: ms://iic/scepter_scedit@controllable_model/SD2.1/hed_control - NAME: depth NAME_ZH: DESCRIPTION: BASE_MODEL: SD2.1 TYPE: Midas - MODEL_PATH: ms://damo/scepter_scedit@controllable_model/SD2.1/depth_control + MODEL_PATH: ms://iic/scepter_scedit@controllable_model/SD2.1/depth_control # SD_XL1.0 - NAME: canny NAME_ZH: DESCRIPTION: BASE_MODEL: SD_XL1.0 TYPE: Canny - MODEL_PATH: ms://damo/scepter_scedit@controllable_model/SD_XL1.0/canny_control + MODEL_PATH: ms://iic/scepter_scedit@controllable_model/SD_XL1.0/canny_control - NAME: color NAME_ZH: DESCRIPTION: BASE_MODEL: SD_XL1.0 TYPE: Color - MODEL_PATH: ms://damo/scepter_scedit@controllable_model/SD_XL1.0/color_control + MODEL_PATH: ms://iic/scepter_scedit@controllable_model/SD_XL1.0/color_control - NAME: depth NAME_ZH: DESCRIPTION: BASE_MODEL: SD_XL1.0 TYPE: Midas - MODEL_PATH: ms://damo/scepter_scedit@controllable_model/SD_XL1.0/depth_control + MODEL_PATH: ms://iic/scepter_scedit@controllable_model/SD_XL1.0/depth_control - NAME: hed NAME_ZH: DESCRIPTION: BASE_MODEL: SD_XL1.0 TYPE: Hed - MODEL_PATH: ms://damo/scepter_scedit@controllable_model/SD_XL1.0/hed_control + MODEL_PATH: ms://iic/scepter_scedit@controllable_model/SD_XL1.0/hed_control - NAME: openpose NAME_ZH: DESCRIPTION: BASE_MODEL: SD_XL1.0 TYPE: Openpose - MODEL_PATH: ms://damo/scepter_scedit@controllable_model/SD_XL1.0/pose_control + MODEL_PATH: ms://iic/scepter_scedit@controllable_model/SD_XL1.0/pose_control diff --git a/scepter/methods/studio/extensions/mantra_book/mantra_book.yaml b/scepter/methods/studio/extensions/mantra_book/mantra_book.yaml index bc3ce95..109f639 100644 --- a/scepter/methods/studio/extensions/mantra_book/mantra_book.yaml +++ b/scepter/methods/studio/extensions/mantra_book/mantra_book.yaml @@ -7,7 +7,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/967b1852ea26dcf41360fc5542a0df6b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Abstract Expressionism @@ -17,7 +17,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/11667c7a085b53a6ffbb76b83788f8b5.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Academia @@ -27,7 +27,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/c95197ef78312e2bbd45883bfbfa095a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Action Figure @@ -37,7 +37,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/24ac67fe21833fc1300fba09d5de6090.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Adorable 3D Character @@ -47,7 +47,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/31a0ffbfc93b5b336a3bedc0a9985a02.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Adorable Kawaii @@ -57,7 +57,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/82624c429d504c8290d4c9147be64029.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Art Deco @@ -67,7 +67,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/c60ef3e7ada8774c92bb6e73c570f819.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Art Nouveau @@ -77,7 +77,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/153d83e71fbf145d0aa5c41ecab0a505.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Astral Aura @@ -87,7 +87,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/e093c9d0f81037002e88f2a6c3f38a55.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Avant-garde @@ -97,7 +97,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/9921d1944893466edfc6a060faf4070e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Baroque @@ -107,7 +107,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/d8279be4bb34e5cb00a95919412154a4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Bauhaus-Style Poster @@ -117,7 +117,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/4bd18b32c23e13b9e4fc7f65a1916eab.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Blueprint Schematic Drawing @@ -127,7 +127,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/62392c3715267f7162a37a8ff1caa3a1.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Caricature @@ -137,7 +137,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/894f40ed44b37c3372e6a22b8ae577a4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Cel Shaded Art @@ -147,7 +147,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/71c2e8a2cd1031b2bfae1640f7b72c88.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Character Design Sheet @@ -157,7 +157,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/eacf2134aa51d4b4a6f2f35cc170f315.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Classicism Art @@ -167,7 +167,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/10025b4f3a09e6134086e3cdec4ef2c8.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Color Field Painting @@ -177,7 +177,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/80e5b4075c572c04cbb4e48c37b8366b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Colored Pencil Art @@ -187,7 +187,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/9ae235d7f1a7c2a4edab52a5e9f9cbae.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Conceptual Art @@ -197,7 +197,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/cf2e6781997c6842a16155fdff911ef8.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Constructivism @@ -207,7 +207,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/d07feccabcadfd3310464bedba858bd1.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Cubism @@ -217,7 +217,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/aa8313f6c3cb9cafb9a7ec07db78df1c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Dadaism @@ -227,7 +227,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/db27030369cb3ccb042b8aea6bf635e2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Dark Fantasy @@ -237,7 +237,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/c88b6e641c707afc0c8d278ba7e1ac19.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Dark Moody Atmosphere @@ -247,7 +247,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/3da915da2f5cedaf243e57e08163f35b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: DMT Art Style @@ -257,7 +257,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/d4a823d2bfa912ca4bb56d96f722f08f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Doodle Art @@ -267,7 +267,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/8e1e21745c149b9634d3ce96fc7d505f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Double Exposure @@ -277,7 +277,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/efd7aea4af1c4ede99fdfac17350e264.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Dripping Paint Splatter Art @@ -287,7 +287,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/69fd81f5983107acc3d334af62915851.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Expressionism @@ -297,7 +297,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/3dfa862bd1c80cec237e4a5717cea2bd.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Faded Polaroid Photo @@ -307,7 +307,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/f152edb4b3ca6248758b48115258ddfa.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fauvism @@ -317,7 +317,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/0506b350cadcf8fca42da764cd6fd5bf.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Flat 2D Art @@ -327,7 +327,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/940cfd34155634cf051e1b2942cca426.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fortnite Art Style @@ -337,7 +337,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/156f8d943ff6d283f7a34f265daaa46c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Futurism @@ -347,7 +347,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/855283cc2ab6283b627ef32d06a1ae0f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Glitchcore @@ -357,7 +357,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/9af62376402a85774179e82cf7e0dc59.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Glo-fi @@ -367,7 +367,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/275a6e2a3297cec57f9b5a4a17b0f749.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Googie Art Style @@ -377,7 +377,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/08ee77586d7bec3f6bad7d60cee3c540.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Graffiti Art @@ -387,7 +387,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/57b751b11564cb22cd49ef21f2004a5f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Harlem Renaissance Art @@ -397,7 +397,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/d09ea3dadcd0a15d8fa247ee74a75e6b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: High Fashion @@ -407,7 +407,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/868f752bbb5ef992a0be36d7d13de3be.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Idyllic @@ -417,7 +417,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/55bab29eeb628e7a9ae018e45e7e24db.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Impressionism @@ -427,7 +427,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/0312b673dc6858a9864d7f45f0c5c1fc.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Infographic Drawing @@ -437,7 +437,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/b09151f6e0883d26056b80fcc9d398bb.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Ink Dripping Drawing @@ -447,7 +447,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/5f09912a07e915250a96b2023db15821.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Japanese Ink Drawing @@ -457,7 +457,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/633ad971ff30fe4717782fc6b5f92fda.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Knolling Photography @@ -467,7 +467,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/89a205be3a276349ecddf0eeca43ed80.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Light Cheery Atmosphere @@ -477,7 +477,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/0913ac9815f892411f8327a630f51ae4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Logo Design @@ -487,7 +487,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/9aa040b0c60d289da9610c91ad9b7c7e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Luxurious Elegance @@ -497,7 +497,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/e796e84ed745150f0d4e28e0ac99b4cf.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Macro Photography @@ -507,7 +507,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/92e8b84379828f38e3d01c7272f41b0b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Mandola Art @@ -517,7 +517,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/dbf5ca944d9213c3181348666cf337ac.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Marker Drawing @@ -527,7 +527,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/c558745f7a4b77d7ca9a428d8874efe4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Medievalism @@ -537,7 +537,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/26aa6244359a4fd87f6438a341057901.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Minimalism @@ -547,7 +547,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/dce92a90da6299339cf8e9ebc6596ea2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neo-Baroque @@ -557,7 +557,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/9b6cd8751b18c65b259769b44cfac351.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neo-Byzantine @@ -567,7 +567,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/99c67768869b546bf527ef0b1735c0d5.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neo-Futurism @@ -577,7 +577,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/bada1534f7a60187f584febcc92f40d1.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neo-Impressionism @@ -587,7 +587,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/6bafeac67ce2679b64a86ee1023b53c9.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neo-Rococo @@ -597,7 +597,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/9ab0ad2b88e03933ea479357ff1e4435.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neoclassicism @@ -607,7 +607,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/83a4e3a2ca577400b05a81b5b2b8650e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Op Art @@ -617,7 +617,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/5f11132803dff2de5213293b91d407d7.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Ornate and Intricate @@ -627,7 +627,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/24b895dca946c8765ad9fa38f720f671.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Pencil Sketch Drawing @@ -637,7 +637,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/a9056e1eac85e5e4fe96a93917d4cce4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Pop Art 2 @@ -647,7 +647,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/83c4c06c70a48da6558ff970ece247b6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Rococo @@ -657,7 +657,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/4850170f410e10bc833b7d00324dff18.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Silhouette Art @@ -667,7 +667,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/568777f447fc02510b618152726d5002.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Simple Vector Art @@ -677,7 +677,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/24d2ab1fd175bf4e9ef3a8327651dd4b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Sketchup @@ -687,7 +687,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/337dca7ac49cf7820c85ede096ebde9c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Steampunk 2 @@ -697,7 +697,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/07d7b27cd73f2d43684003563511c15b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Surrealism @@ -707,7 +707,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/38bae70377b323d1a5f5756d7e04886d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Suprematism @@ -717,7 +717,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/c48fbd8cedee84d06b4d875d566f1bb8.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Terragen @@ -727,7 +727,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/8974cd8e0f38fb7aac117cf0983fc36d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Tranquil Relaxing Atmosphere @@ -737,7 +737,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/69170d8443a67be4210af8d5558779c2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Sticker Designs @@ -747,7 +747,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/2d1e9867058db2c57f2fe47530de3243.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Vibrant Rim Light @@ -757,7 +757,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/bb08936ca184daba2b30b4a9efb308f2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Volumetric Lighting @@ -767,7 +767,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/bbad7964a2ae70b66c72804273f11e74.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Watercolor 2 @@ -777,7 +777,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/8859d532ae5901cc8457d6118fb9b7da.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Whimsical and Playful @@ -787,7 +787,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/af2267f1942e870be957c37cd73d4359.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Enhance @@ -800,7 +800,7 @@ MANTRAS: } 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/e501823a21bbda56592055c9613c1dbb.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Sharp @@ -810,7 +810,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/393fb7aab57992a1c3af7cbad01c1001.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Masterpiece @@ -820,7 +820,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/9e27c3d1475dacae0ee45cea783aaaf5.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Photograph @@ -830,7 +830,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/8b2ea41ec15bf1a16d6a837d46dbc2ac.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Negative @@ -843,7 +843,7 @@ MANTRAS: } 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/daaec2962291137532189b8a31012532.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Cinematic @@ -853,7 +853,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/adc4d52aa5b0afca0593a475ddc9d055.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-cinematic-dynamic @@ -863,7 +863,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/bd2470068e09d9f1b7d0a690c879b3ce.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-spontaneous-picture @@ -873,7 +873,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/19ad6082cee5516ce330641b515467ef.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-artistic-vision @@ -883,7 +883,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/95af94e50bcb91ae8fd2914a3bf13f1e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-dark-dream @@ -893,7 +893,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/572c8c26cc20ac0ee66684e3c5ee4e8c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-gloomy-art @@ -903,7 +903,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/66cbdf819e930f7580bd66a41bde7dfe.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-bad-dream @@ -913,7 +913,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/b92b2bbfc400db9204fe8249354132b4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-underground @@ -923,7 +923,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/8d46eca558d791a1f2b41b0ed7bba4d2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-surreal-painting @@ -933,7 +933,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/58858425832b10d233f7887af4a2022f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-dynamic-illustration @@ -943,7 +943,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/8bf9861d4d3fadcdb98ceec88a941582.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-undead-art @@ -953,7 +953,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/fada50979ca180006eba9a45a00f3675.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-elemental-art @@ -963,7 +963,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/5895d78cf58c1ca05178991f37cc48ff.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-space-art @@ -973,7 +973,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/e9815495587895a21d970728474c8be6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-ancient-illustration @@ -983,7 +983,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/151e07c17a89ebaf7688905ea0199862.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-brave-art @@ -993,7 +993,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/1a068f2728327d21ebb99285c2ce1370.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-heroic-fantasy @@ -1003,7 +1003,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/78d05472067e0b86c8270fa5476fcb8e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-dark-cyberpunk @@ -1013,7 +1013,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/a9f50e3162958fd783872d6955ad7d0b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-lyrical-geometry @@ -1023,7 +1023,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/dfabd41d3042ced804bc97ae35e3a7cb.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-sumi-e-symbolic @@ -1033,7 +1033,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/695b1ba687544eaeec9fb5f871917aeb.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-sumi-e-detailed @@ -1043,7 +1043,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/16eb95e180385b88794e368b28da1812.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-manga @@ -1053,7 +1053,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/ebec631bf467937f82d05958ae59f9dc.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-anime @@ -1063,7 +1063,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/a08149bc8e50f6bc65c0010d4cd416f8.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-comic @@ -1073,7 +1073,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/48c65cebf1fa4284d7b8feb619412e65.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-3d-model @@ -1083,7 +1083,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/c1a765ac089fdfb3c1d11b33c75d2afd.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-analog film @@ -1093,7 +1093,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/3c46d19957efd7fb78f4ab2bdada5468.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-anime @@ -1103,7 +1103,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/c030e72561eda96abcf738f1370d36ff.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-cinematic @@ -1113,7 +1113,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/d9161c0d5cbf2133b2bfc1021c0c5e2a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-comic book @@ -1123,7 +1123,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/6759ecb831037367e64c4b36d802be87.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-craft clay @@ -1133,7 +1133,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/8fc51113f725f27326c4398a7457cd6d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-digital art @@ -1143,7 +1143,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/d29adb44458700c4a45ee6edaa04bfb6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-enhance @@ -1153,7 +1153,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/2be0de541ff65f8da80ddc24a65c98d8.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-fantasy art @@ -1163,7 +1163,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/a6f8d92afcd5803dfb2ebecbc92091b6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-isometric @@ -1173,7 +1173,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/d4e3fcbbfd7b1323bd89decf5d7b0006.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-line art @@ -1183,7 +1183,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/034a51b0dd34b018be8859bf45b4f7ed.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-lowpoly @@ -1193,7 +1193,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/76b9913e9fa5704b6d30adbde9e1f70f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-neonpunk @@ -1203,7 +1203,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/7e9ed25bb34008beb5f417df63c4b2fe.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-origami @@ -1213,7 +1213,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/924f46a8f276011a0953d7988e90ee25.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-photographic @@ -1223,7 +1223,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/d6a2d8f3d37cc21c20c5dfc13d000b67.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-pixel art @@ -1233,7 +1233,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/a5ab89c0960be8c1216e65c98d92ae4a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-texture @@ -1243,7 +1243,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/ebfeab574283fff2ac096e348a585e6d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-advertising @@ -1253,7 +1253,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/1aa26a16126e2756bf4bf3fda29baa12.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-automotive @@ -1263,7 +1263,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/ddc833b36ca23c85a4f6e7bf0088d081.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-corporate @@ -1273,7 +1273,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/df97fa45c7842296c138aca4057db272.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-fashion editorial @@ -1283,7 +1283,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/89259be723479cd0b81546b715bea04d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-food photography @@ -1293,7 +1293,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/33acc98f8615940c8cebbac8ce5297b2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-gourmet food photography @@ -1303,7 +1303,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/897bbd3f1d232de122796266f3845b50.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-luxury @@ -1313,7 +1313,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/5b33ecc84dc5ff285a0f2e69f43162cb.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-real estate @@ -1323,7 +1323,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/1b99b7bcd0476144d80d066e747d8dfc.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-retail @@ -1333,7 +1333,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/0029e46ef36380dde2084257108f8a6f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-abstract @@ -1343,7 +1343,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/8c401cb0a6ea288230222c4985e78667.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-abstract expressionism @@ -1353,7 +1353,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/9df6635149c576b65d911c2e4cc6a86b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-art deco @@ -1363,7 +1363,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/82fff8a25de8075777caf14cb3eb5650.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-art nouveau @@ -1373,7 +1373,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/84075c5c0cb4b7a2541c6fbca9835cfd.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-constructivist @@ -1383,7 +1383,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/2a634ad0c89ecefbbea4ce5bcab3d5e5.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-cubist @@ -1393,7 +1393,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/2a3d797008c08e12b485d61624741ea6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-expressionist @@ -1403,7 +1403,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/83914655659001716a1acede295289d0.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-graffiti @@ -1413,7 +1413,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/f72a23c7623eb480737eb73c08bf8423.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-hyperrealism @@ -1423,7 +1423,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/db378d5a64a8e7ad1e29a4389bda5d1c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-impressionist @@ -1433,7 +1433,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/53b151aec4d5685dfc24511b6705b90e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-pointillism @@ -1443,7 +1443,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/23b137a409ee8a8c6ee160c1ddf0659f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-pop art @@ -1453,7 +1453,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/bd4faf0e2b7dbc2d0eb21f3ebee97d3d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-psychedelic @@ -1463,7 +1463,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/7dc0131817f4c31517581dd4a811067b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-renaissance @@ -1473,7 +1473,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/69796484f61dc2e94d5853f5bbe27c05.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-steampunk @@ -1483,7 +1483,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/985005e28858b03c9500a6eb5bd9e201.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-surrealist @@ -1493,7 +1493,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/892d19ec3c429b7148562796df0024db.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-typography @@ -1503,7 +1503,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/9adafe1bb169e1ee3f78ba2c1b1cf8d3.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-watercolor @@ -1513,7 +1513,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/29ca23d7a0397e9beaa72e3b63d17551.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-biomechanical @@ -1523,7 +1523,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/5987795487a3fa74469499ae53963d5d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-biomechanical cyberpunk @@ -1533,7 +1533,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/75b56d7cff9b3f011248b3092ae3b8d2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-cybernetic @@ -1543,7 +1543,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/47df6db04290f01aeee7381aaf12ec07.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-cybernetic robot @@ -1553,7 +1553,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/6f18121b4ba22c8ba7834f404501fa4c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-cyberpunk cityscape @@ -1563,7 +1563,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/5e4107dace2c9dd0217a9d1b18ae28f6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-futuristic @@ -1573,7 +1573,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/8a61c0853ee4079bae96ad502a6ae840.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-retro cyberpunk @@ -1583,7 +1583,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/460957bf9a07a58ddec08bf22d5b3698.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-retro futurism @@ -1593,7 +1593,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/0434a7b23a0f936db615d7a9b8e805f1.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-sci-fi @@ -1603,7 +1603,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/7c3bde651f426273758b68a2805d0c8a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-vaporwave @@ -1613,7 +1613,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/1ebb0bf67ee3ef76288b4c0a2a65d557.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-bubble bobble @@ -1623,7 +1623,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/19257352df33228555cb350963d9432a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-cyberpunk game @@ -1633,7 +1633,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/6165ef47bc859e3dd0e3399ba2264c2b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-fighting game @@ -1643,7 +1643,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/aebda69ec1097dc61966995956ae34cc.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-gta @@ -1653,7 +1653,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/edff7ba5fc983468e79e64beb838b829.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-mario @@ -1663,7 +1663,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/2a229f623ce89160d1f67620599dfc7c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-minecraft @@ -1673,7 +1673,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/83e77332a9f234fd8c9cddd29e2ec3c7.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-pokemon @@ -1683,7 +1683,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/9bfe2805e6578875a8dfe2a0ea96c281.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-retro arcade @@ -1693,7 +1693,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/76885e0b110f1fdf3eaee52fbaf27abf.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-retro game @@ -1703,7 +1703,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/61fbae41c50f56e24dcf20fe3612d456.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-rpg fantasy game @@ -1713,7 +1713,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/34797baf58e32b4e1a37753fe9dcff5c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-strategy game @@ -1723,7 +1723,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/0d276527d22510a1b5f8f74eac2790df.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-streetfighter @@ -1733,7 +1733,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/f5927fc2b8d4a8212242bd97adcbdfa1.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-zelda @@ -1743,7 +1743,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/4f9eadddbc196268258089b8cc4e5c5c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-architectural @@ -1753,7 +1753,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/488545e9fc9417d62961f42d578547d2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-disco @@ -1763,7 +1763,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/784b0ac35e0c0fdb2df21a95d5ca1c55.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-dreamscape @@ -1773,7 +1773,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/2bf77804b5bf352c4e97475b1e8eb29e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-dystopian @@ -1783,7 +1783,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/065db0385e126192cbd27e22ca4f154c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-fairy tale @@ -1793,7 +1793,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/578dfe65d9f03e83c95820d4c45cd396.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-gothic @@ -1803,7 +1803,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/332a1f8cd655b724cb48bc5c91b764fc.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-grunge @@ -1813,7 +1813,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/0ccb4c03c6d983b9f6d05ba383f9d690.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-horror @@ -1823,7 +1823,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/fdca4780d099a39dc50e4553622fba72.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-kawaii @@ -1833,7 +1833,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/99dab4185e7337189d8959878bfa308b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-lovecraftian @@ -1843,7 +1843,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/b7c9d084ed62c1c2e1ea080ad95af61e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-macabre @@ -1853,7 +1853,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/fd7cf2315b27b0434b909020414e1173.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-manga @@ -1863,7 +1863,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/531aac90b321d39221ba7cf70a97b232.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-metropolis @@ -1873,7 +1873,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/eaad79fe3d7160cec6e0656fc3b02d3c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-minimalist @@ -1883,7 +1883,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/e85dd1ccc7f22bdac054d74ba58521b2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-monochrome @@ -1893,7 +1893,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/cc793ada6b47561f4b63aa66dcd282ac.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-nautical @@ -1903,7 +1903,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/3d9f6528180670804a2c5e85c7665c42.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-space @@ -1913,7 +1913,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/6f5742d23b43fc99cc01c8b68518df7c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-stained glass @@ -1923,7 +1923,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/ab0512ced9ed572075c49ad4f9f9a45d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-techwear fashion @@ -1933,7 +1933,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/652a6bdb1b36860041222a458c7915d0.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-tribal @@ -1943,7 +1943,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/1ecdaf153ece5e16250b87020b7a209b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-zentangle @@ -1953,7 +1953,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/80f3488cdb69f0ff13d83a4feac4499d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-collage @@ -1963,7 +1963,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/c9bbdaba28358faf1a8c1df44b3de950.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-flat papercut @@ -1973,7 +1973,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/1bffcd9a4086b29c367b8301f26eed3b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-kirigami @@ -1983,7 +1983,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/2e5f95977b97b2a6248924e118a23076.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-paper mache @@ -1993,7 +1993,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/68441f668fcf7a51db5fc9b9d4d45ce7.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-paper quilling @@ -2003,7 +2003,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/8c0504eb14341b66796612c46bb3748b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-papercut collage @@ -2013,7 +2013,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/217e7c8b905b63c63c94bd6ff8fe3477.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-papercut shadow box @@ -2023,7 +2023,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/2af0d61de1b17a5a5257f512549f9616.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-stacked papercut @@ -2033,7 +2033,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/62618e32e90539827e0eb279a6ea170a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-thick layered papercut @@ -2043,7 +2043,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/17008c40a6be8d41d3921ee88bac27ad.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-alien @@ -2053,7 +2053,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/eae6043dee2b2d94cd9a22cb044db8b3.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-film noir @@ -2063,7 +2063,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/0b3629be5ebb7cda463877a1993a0298.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-glamour @@ -2073,7 +2073,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/f85dc6aa5d7f7d6d3663f2270e276796.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-hdr @@ -2083,7 +2083,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/269a98b284ae1345b0e5ac1f85c33179.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-iphone photographic @@ -2093,7 +2093,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/48c556a6b3c3a533847b80b031cd4962.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-long exposure @@ -2103,7 +2103,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/fda88c3fc43ea8cc04ce9b5c0261627f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-neon noir @@ -2113,7 +2113,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/8a5b71434592771e064af4b9017b59d6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-silhouette @@ -2123,7 +2123,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/1892a37e66d33cdd9b713aaab6b8c597.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-tilt-shift @@ -2133,7 +2133,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/d058a157de848a5c03d9a3e1e0e560a2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: cinematic-diva @@ -2143,7 +2143,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/967b1852ea26dcf41360fc5542a0df6b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Abstract Expressionism @@ -2153,7 +2153,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/11667c7a085b53a6ffbb76b83788f8b5.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Academia @@ -2163,7 +2163,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/c95197ef78312e2bbd45883bfbfa095a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Action Figure @@ -2173,7 +2173,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/24ac67fe21833fc1300fba09d5de6090.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Adorable 3D Character @@ -2183,7 +2183,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/31a0ffbfc93b5b336a3bedc0a9985a02.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Adorable Kawaii @@ -2193,7 +2193,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/82624c429d504c8290d4c9147be64029.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Art Deco @@ -2203,7 +2203,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/c60ef3e7ada8774c92bb6e73c570f819.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Art Nouveau @@ -2213,7 +2213,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/153d83e71fbf145d0aa5c41ecab0a505.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Astral Aura @@ -2223,7 +2223,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/e093c9d0f81037002e88f2a6c3f38a55.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Avant-garde @@ -2233,7 +2233,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/9921d1944893466edfc6a060faf4070e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Baroque @@ -2243,7 +2243,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/d8279be4bb34e5cb00a95919412154a4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Bauhaus-Style Poster @@ -2253,7 +2253,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/4bd18b32c23e13b9e4fc7f65a1916eab.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Blueprint Schematic Drawing @@ -2263,7 +2263,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/62392c3715267f7162a37a8ff1caa3a1.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Caricature @@ -2273,7 +2273,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/894f40ed44b37c3372e6a22b8ae577a4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Cel Shaded Art @@ -2283,7 +2283,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/71c2e8a2cd1031b2bfae1640f7b72c88.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Character Design Sheet @@ -2293,7 +2293,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/eacf2134aa51d4b4a6f2f35cc170f315.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Classicism Art @@ -2303,7 +2303,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/10025b4f3a09e6134086e3cdec4ef2c8.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Color Field Painting @@ -2313,7 +2313,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/80e5b4075c572c04cbb4e48c37b8366b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Colored Pencil Art @@ -2323,7 +2323,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/9ae235d7f1a7c2a4edab52a5e9f9cbae.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Conceptual Art @@ -2333,7 +2333,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/cf2e6781997c6842a16155fdff911ef8.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Constructivism @@ -2343,7 +2343,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/d07feccabcadfd3310464bedba858bd1.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Cubism @@ -2353,7 +2353,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/aa8313f6c3cb9cafb9a7ec07db78df1c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Dadaism @@ -2363,7 +2363,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/db27030369cb3ccb042b8aea6bf635e2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Dark Fantasy @@ -2373,7 +2373,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/c88b6e641c707afc0c8d278ba7e1ac19.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Dark Moody Atmosphere @@ -2383,7 +2383,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/3da915da2f5cedaf243e57e08163f35b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: DMT Art Style @@ -2393,7 +2393,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/d4a823d2bfa912ca4bb56d96f722f08f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Doodle Art @@ -2403,7 +2403,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/8e1e21745c149b9634d3ce96fc7d505f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Double Exposure @@ -2413,7 +2413,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/efd7aea4af1c4ede99fdfac17350e264.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Dripping Paint Splatter Art @@ -2423,7 +2423,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/69fd81f5983107acc3d334af62915851.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Expressionism @@ -2433,7 +2433,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/3dfa862bd1c80cec237e4a5717cea2bd.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Faded Polaroid Photo @@ -2443,7 +2443,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/f152edb4b3ca6248758b48115258ddfa.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fauvism @@ -2453,7 +2453,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/0506b350cadcf8fca42da764cd6fd5bf.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Flat 2D Art @@ -2463,7 +2463,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/940cfd34155634cf051e1b2942cca426.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fortnite Art Style @@ -2473,7 +2473,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/156f8d943ff6d283f7a34f265daaa46c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Futurism @@ -2483,7 +2483,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/855283cc2ab6283b627ef32d06a1ae0f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Glitchcore @@ -2493,7 +2493,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/9af62376402a85774179e82cf7e0dc59.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Glo-fi @@ -2503,7 +2503,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/275a6e2a3297cec57f9b5a4a17b0f749.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Googie Art Style @@ -2513,7 +2513,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/08ee77586d7bec3f6bad7d60cee3c540.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Graffiti Art @@ -2523,7 +2523,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/57b751b11564cb22cd49ef21f2004a5f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Harlem Renaissance Art @@ -2533,7 +2533,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/d09ea3dadcd0a15d8fa247ee74a75e6b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: High Fashion @@ -2543,7 +2543,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/868f752bbb5ef992a0be36d7d13de3be.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Idyllic @@ -2553,7 +2553,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/55bab29eeb628e7a9ae018e45e7e24db.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Impressionism @@ -2563,7 +2563,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/0312b673dc6858a9864d7f45f0c5c1fc.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Infographic Drawing @@ -2573,7 +2573,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/b09151f6e0883d26056b80fcc9d398bb.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Ink Dripping Drawing @@ -2583,7 +2583,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/5f09912a07e915250a96b2023db15821.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Japanese Ink Drawing @@ -2593,7 +2593,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/633ad971ff30fe4717782fc6b5f92fda.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Knolling Photography @@ -2603,7 +2603,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/89a205be3a276349ecddf0eeca43ed80.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Light Cheery Atmosphere @@ -2613,7 +2613,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/0913ac9815f892411f8327a630f51ae4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Logo Design @@ -2623,7 +2623,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/9aa040b0c60d289da9610c91ad9b7c7e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Luxurious Elegance @@ -2633,7 +2633,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/e796e84ed745150f0d4e28e0ac99b4cf.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Macro Photography @@ -2643,7 +2643,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/92e8b84379828f38e3d01c7272f41b0b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Mandola Art @@ -2653,7 +2653,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/dbf5ca944d9213c3181348666cf337ac.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Marker Drawing @@ -2663,7 +2663,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/c558745f7a4b77d7ca9a428d8874efe4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Medievalism @@ -2673,7 +2673,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/26aa6244359a4fd87f6438a341057901.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Minimalism @@ -2683,7 +2683,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/dce92a90da6299339cf8e9ebc6596ea2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neo-Baroque @@ -2693,7 +2693,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/9b6cd8751b18c65b259769b44cfac351.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neo-Byzantine @@ -2703,7 +2703,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/99c67768869b546bf527ef0b1735c0d5.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neo-Futurism @@ -2713,7 +2713,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/bada1534f7a60187f584febcc92f40d1.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neo-Impressionism @@ -2723,7 +2723,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/6bafeac67ce2679b64a86ee1023b53c9.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neo-Rococo @@ -2733,7 +2733,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/9ab0ad2b88e03933ea479357ff1e4435.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neoclassicism @@ -2743,7 +2743,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/83a4e3a2ca577400b05a81b5b2b8650e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Op Art @@ -2753,7 +2753,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/5f11132803dff2de5213293b91d407d7.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Ornate and Intricate @@ -2763,7 +2763,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/24b895dca946c8765ad9fa38f720f671.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Pencil Sketch Drawing @@ -2773,7 +2773,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/a9056e1eac85e5e4fe96a93917d4cce4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Pop Art 2 @@ -2783,7 +2783,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/83c4c06c70a48da6558ff970ece247b6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Rococo @@ -2793,7 +2793,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/4850170f410e10bc833b7d00324dff18.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Silhouette Art @@ -2803,7 +2803,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/568777f447fc02510b618152726d5002.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Simple Vector Art @@ -2813,7 +2813,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/24d2ab1fd175bf4e9ef3a8327651dd4b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Sketchup @@ -2823,7 +2823,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/337dca7ac49cf7820c85ede096ebde9c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Steampunk 2 @@ -2833,7 +2833,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/07d7b27cd73f2d43684003563511c15b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Surrealism @@ -2843,7 +2843,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/38bae70377b323d1a5f5756d7e04886d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Suprematism @@ -2853,7 +2853,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/c48fbd8cedee84d06b4d875d566f1bb8.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Terragen @@ -2863,7 +2863,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/8974cd8e0f38fb7aac117cf0983fc36d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Tranquil Relaxing Atmosphere @@ -2873,7 +2873,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/69170d8443a67be4210af8d5558779c2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Sticker Designs @@ -2883,7 +2883,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/2d1e9867058db2c57f2fe47530de3243.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Vibrant Rim Light @@ -2893,7 +2893,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/bb08936ca184daba2b30b4a9efb308f2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Volumetric Lighting @@ -2903,7 +2903,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/bbad7964a2ae70b66c72804273f11e74.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Watercolor 2 @@ -2913,7 +2913,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/8859d532ae5901cc8457d6118fb9b7da.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Whimsical and Playful @@ -2923,7 +2923,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/af2267f1942e870be957c37cd73d4359.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Enhance @@ -2936,7 +2936,7 @@ MANTRAS: } 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/e501823a21bbda56592055c9613c1dbb.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Sharp @@ -2946,7 +2946,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/393fb7aab57992a1c3af7cbad01c1001.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Masterpiece @@ -2956,7 +2956,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/9e27c3d1475dacae0ee45cea783aaaf5.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Photograph @@ -2966,7 +2966,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/8b2ea41ec15bf1a16d6a837d46dbc2ac.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Negative @@ -2979,7 +2979,7 @@ MANTRAS: } 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/daaec2962291137532189b8a31012532.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Cinematic @@ -2989,7 +2989,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/adc4d52aa5b0afca0593a475ddc9d055.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-cinematic-dynamic @@ -2999,7 +2999,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/bd2470068e09d9f1b7d0a690c879b3ce.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-spontaneous-picture @@ -3009,7 +3009,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/19ad6082cee5516ce330641b515467ef.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-artistic-vision @@ -3019,7 +3019,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/95af94e50bcb91ae8fd2914a3bf13f1e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-dark-dream @@ -3029,7 +3029,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/572c8c26cc20ac0ee66684e3c5ee4e8c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-gloomy-art @@ -3039,7 +3039,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/66cbdf819e930f7580bd66a41bde7dfe.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-bad-dream @@ -3049,7 +3049,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/b92b2bbfc400db9204fe8249354132b4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-underground @@ -3059,7 +3059,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/8d46eca558d791a1f2b41b0ed7bba4d2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-surreal-painting @@ -3069,7 +3069,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/58858425832b10d233f7887af4a2022f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-dynamic-illustration @@ -3079,7 +3079,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/8bf9861d4d3fadcdb98ceec88a941582.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-undead-art @@ -3089,7 +3089,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/fada50979ca180006eba9a45a00f3675.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-elemental-art @@ -3099,7 +3099,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/5895d78cf58c1ca05178991f37cc48ff.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-space-art @@ -3109,7 +3109,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/e9815495587895a21d970728474c8be6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-ancient-illustration @@ -3119,7 +3119,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/151e07c17a89ebaf7688905ea0199862.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-brave-art @@ -3129,7 +3129,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/1a068f2728327d21ebb99285c2ce1370.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-heroic-fantasy @@ -3139,7 +3139,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/78d05472067e0b86c8270fa5476fcb8e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-dark-cyberpunk @@ -3149,7 +3149,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/a9f50e3162958fd783872d6955ad7d0b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-lyrical-geometry @@ -3159,7 +3159,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/dfabd41d3042ced804bc97ae35e3a7cb.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-sumi-e-symbolic @@ -3169,7 +3169,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/695b1ba687544eaeec9fb5f871917aeb.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-sumi-e-detailed @@ -3179,7 +3179,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/16eb95e180385b88794e368b28da1812.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-manga @@ -3189,7 +3189,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/ebec631bf467937f82d05958ae59f9dc.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-anime @@ -3199,7 +3199,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/a08149bc8e50f6bc65c0010d4cd416f8.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-comic @@ -3209,7 +3209,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/48c65cebf1fa4284d7b8feb619412e65.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-3d-model @@ -3219,7 +3219,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/c1a765ac089fdfb3c1d11b33c75d2afd.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-analog film @@ -3229,7 +3229,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/3c46d19957efd7fb78f4ab2bdada5468.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-anime @@ -3239,7 +3239,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/c030e72561eda96abcf738f1370d36ff.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-cinematic @@ -3249,7 +3249,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/d9161c0d5cbf2133b2bfc1021c0c5e2a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-comic book @@ -3259,7 +3259,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/6759ecb831037367e64c4b36d802be87.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-craft clay @@ -3269,7 +3269,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/8fc51113f725f27326c4398a7457cd6d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-digital art @@ -3279,7 +3279,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/d29adb44458700c4a45ee6edaa04bfb6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-enhance @@ -3289,7 +3289,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/2be0de541ff65f8da80ddc24a65c98d8.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-fantasy art @@ -3299,7 +3299,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/a6f8d92afcd5803dfb2ebecbc92091b6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-isometric @@ -3309,7 +3309,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/d4e3fcbbfd7b1323bd89decf5d7b0006.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-line art @@ -3319,7 +3319,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/034a51b0dd34b018be8859bf45b4f7ed.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-lowpoly @@ -3329,7 +3329,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/76b9913e9fa5704b6d30adbde9e1f70f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-neonpunk @@ -3339,7 +3339,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/7e9ed25bb34008beb5f417df63c4b2fe.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-origami @@ -3349,7 +3349,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/924f46a8f276011a0953d7988e90ee25.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-photographic @@ -3359,7 +3359,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/d6a2d8f3d37cc21c20c5dfc13d000b67.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-pixel art @@ -3369,7 +3369,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/a5ab89c0960be8c1216e65c98d92ae4a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-texture @@ -3379,7 +3379,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/ebfeab574283fff2ac096e348a585e6d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-advertising @@ -3389,7 +3389,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/1aa26a16126e2756bf4bf3fda29baa12.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-automotive @@ -3399,7 +3399,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/ddc833b36ca23c85a4f6e7bf0088d081.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-corporate @@ -3409,7 +3409,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/df97fa45c7842296c138aca4057db272.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-fashion editorial @@ -3419,7 +3419,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/89259be723479cd0b81546b715bea04d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-food photography @@ -3429,7 +3429,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/33acc98f8615940c8cebbac8ce5297b2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-gourmet food photography @@ -3439,7 +3439,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/897bbd3f1d232de122796266f3845b50.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-luxury @@ -3449,7 +3449,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/5b33ecc84dc5ff285a0f2e69f43162cb.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-real estate @@ -3459,7 +3459,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/1b99b7bcd0476144d80d066e747d8dfc.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-retail @@ -3469,7 +3469,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/0029e46ef36380dde2084257108f8a6f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-abstract @@ -3479,7 +3479,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/8c401cb0a6ea288230222c4985e78667.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-abstract expressionism @@ -3489,7 +3489,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/9df6635149c576b65d911c2e4cc6a86b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-art deco @@ -3499,7 +3499,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/82fff8a25de8075777caf14cb3eb5650.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-art nouveau @@ -3509,7 +3509,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/84075c5c0cb4b7a2541c6fbca9835cfd.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-constructivist @@ -3519,7 +3519,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/2a634ad0c89ecefbbea4ce5bcab3d5e5.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-cubist @@ -3529,7 +3529,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/2a3d797008c08e12b485d61624741ea6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-expressionist @@ -3539,7 +3539,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/83914655659001716a1acede295289d0.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-graffiti @@ -3549,7 +3549,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/f72a23c7623eb480737eb73c08bf8423.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-hyperrealism @@ -3559,7 +3559,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/db378d5a64a8e7ad1e29a4389bda5d1c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-impressionist @@ -3569,7 +3569,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/53b151aec4d5685dfc24511b6705b90e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-pointillism @@ -3579,7 +3579,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/23b137a409ee8a8c6ee160c1ddf0659f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-pop art @@ -3589,7 +3589,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/bd4faf0e2b7dbc2d0eb21f3ebee97d3d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-psychedelic @@ -3599,7 +3599,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/7dc0131817f4c31517581dd4a811067b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-renaissance @@ -3609,7 +3609,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/69796484f61dc2e94d5853f5bbe27c05.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-steampunk @@ -3619,7 +3619,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/985005e28858b03c9500a6eb5bd9e201.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-surrealist @@ -3629,7 +3629,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/892d19ec3c429b7148562796df0024db.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-typography @@ -3639,7 +3639,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/9adafe1bb169e1ee3f78ba2c1b1cf8d3.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-watercolor @@ -3649,7 +3649,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/29ca23d7a0397e9beaa72e3b63d17551.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-biomechanical @@ -3659,7 +3659,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/5987795487a3fa74469499ae53963d5d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-biomechanical cyberpunk @@ -3669,7 +3669,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/75b56d7cff9b3f011248b3092ae3b8d2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-cybernetic @@ -3679,7 +3679,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/47df6db04290f01aeee7381aaf12ec07.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-cybernetic robot @@ -3689,7 +3689,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/6f18121b4ba22c8ba7834f404501fa4c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-cyberpunk cityscape @@ -3699,7 +3699,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/5e4107dace2c9dd0217a9d1b18ae28f6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-futuristic @@ -3709,7 +3709,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/8a61c0853ee4079bae96ad502a6ae840.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-retro cyberpunk @@ -3719,7 +3719,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/460957bf9a07a58ddec08bf22d5b3698.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-retro futurism @@ -3729,7 +3729,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/0434a7b23a0f936db615d7a9b8e805f1.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-sci-fi @@ -3739,7 +3739,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/7c3bde651f426273758b68a2805d0c8a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-vaporwave @@ -3749,7 +3749,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/1ebb0bf67ee3ef76288b4c0a2a65d557.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-bubble bobble @@ -3759,7 +3759,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/19257352df33228555cb350963d9432a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-cyberpunk game @@ -3769,7 +3769,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/6165ef47bc859e3dd0e3399ba2264c2b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-fighting game @@ -3779,7 +3779,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/aebda69ec1097dc61966995956ae34cc.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-gta @@ -3789,7 +3789,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/edff7ba5fc983468e79e64beb838b829.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-mario @@ -3799,7 +3799,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/2a229f623ce89160d1f67620599dfc7c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-minecraft @@ -3809,7 +3809,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/83e77332a9f234fd8c9cddd29e2ec3c7.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-pokemon @@ -3819,7 +3819,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/9bfe2805e6578875a8dfe2a0ea96c281.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-retro arcade @@ -3829,7 +3829,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/76885e0b110f1fdf3eaee52fbaf27abf.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-retro game @@ -3839,7 +3839,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/61fbae41c50f56e24dcf20fe3612d456.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-rpg fantasy game @@ -3849,7 +3849,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/34797baf58e32b4e1a37753fe9dcff5c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-strategy game @@ -3859,7 +3859,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/0d276527d22510a1b5f8f74eac2790df.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-streetfighter @@ -3869,7 +3869,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/f5927fc2b8d4a8212242bd97adcbdfa1.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-zelda @@ -3879,7 +3879,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/4f9eadddbc196268258089b8cc4e5c5c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-architectural @@ -3889,7 +3889,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/488545e9fc9417d62961f42d578547d2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-disco @@ -3899,7 +3899,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/784b0ac35e0c0fdb2df21a95d5ca1c55.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-dreamscape @@ -3909,7 +3909,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/2bf77804b5bf352c4e97475b1e8eb29e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-dystopian @@ -3919,7 +3919,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/065db0385e126192cbd27e22ca4f154c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-fairy tale @@ -3929,7 +3929,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/578dfe65d9f03e83c95820d4c45cd396.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-gothic @@ -3939,7 +3939,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/332a1f8cd655b724cb48bc5c91b764fc.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-grunge @@ -3949,7 +3949,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/0ccb4c03c6d983b9f6d05ba383f9d690.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-horror @@ -3959,7 +3959,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/fdca4780d099a39dc50e4553622fba72.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-kawaii @@ -3969,7 +3969,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/99dab4185e7337189d8959878bfa308b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-lovecraftian @@ -3979,7 +3979,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/b7c9d084ed62c1c2e1ea080ad95af61e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-macabre @@ -3989,7 +3989,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/fd7cf2315b27b0434b909020414e1173.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-manga @@ -3999,7 +3999,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/531aac90b321d39221ba7cf70a97b232.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-metropolis @@ -4009,7 +4009,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/eaad79fe3d7160cec6e0656fc3b02d3c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-minimalist @@ -4019,7 +4019,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/e85dd1ccc7f22bdac054d74ba58521b2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-monochrome @@ -4029,7 +4029,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/cc793ada6b47561f4b63aa66dcd282ac.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-nautical @@ -4039,7 +4039,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/3d9f6528180670804a2c5e85c7665c42.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-space @@ -4049,7 +4049,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/6f5742d23b43fc99cc01c8b68518df7c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-stained glass @@ -4059,7 +4059,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/ab0512ced9ed572075c49ad4f9f9a45d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-techwear fashion @@ -4069,7 +4069,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/652a6bdb1b36860041222a458c7915d0.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-tribal @@ -4079,7 +4079,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/1ecdaf153ece5e16250b87020b7a209b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-zentangle @@ -4089,7 +4089,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/80f3488cdb69f0ff13d83a4feac4499d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-collage @@ -4099,7 +4099,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/c9bbdaba28358faf1a8c1df44b3de950.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-flat papercut @@ -4109,7 +4109,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/1bffcd9a4086b29c367b8301f26eed3b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-kirigami @@ -4119,7 +4119,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/2e5f95977b97b2a6248924e118a23076.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-paper mache @@ -4129,7 +4129,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/68441f668fcf7a51db5fc9b9d4d45ce7.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-paper quilling @@ -4139,7 +4139,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/8c0504eb14341b66796612c46bb3748b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-papercut collage @@ -4149,7 +4149,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/217e7c8b905b63c63c94bd6ff8fe3477.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-papercut shadow box @@ -4159,7 +4159,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/2af0d61de1b17a5a5257f512549f9616.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-stacked papercut @@ -4169,7 +4169,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/62618e32e90539827e0eb279a6ea170a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-thick layered papercut @@ -4179,7 +4179,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/17008c40a6be8d41d3921ee88bac27ad.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-alien @@ -4189,7 +4189,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/eae6043dee2b2d94cd9a22cb044db8b3.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-film noir @@ -4199,7 +4199,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/0b3629be5ebb7cda463877a1993a0298.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-glamour @@ -4209,7 +4209,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/f85dc6aa5d7f7d6d3663f2270e276796.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-hdr @@ -4219,7 +4219,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/269a98b284ae1345b0e5ac1f85c33179.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-iphone photographic @@ -4229,7 +4229,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/48c556a6b3c3a533847b80b031cd4962.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-long exposure @@ -4239,7 +4239,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/fda88c3fc43ea8cc04ce9b5c0261627f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-neon noir @@ -4249,7 +4249,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/8a5b71434592771e064af4b9017b59d6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-silhouette @@ -4259,7 +4259,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/1892a37e66d33cdd9b713aaab6b8c597.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-tilt-shift @@ -4269,7 +4269,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/d058a157de848a5c03d9a3e1e0e560a2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: cinematic-diva @@ -4279,7 +4279,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/967b1852ea26dcf41360fc5542a0df6b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Abstract Expressionism @@ -4289,7 +4289,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/11667c7a085b53a6ffbb76b83788f8b5.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Academia @@ -4299,7 +4299,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/c95197ef78312e2bbd45883bfbfa095a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Action Figure @@ -4309,7 +4309,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/24ac67fe21833fc1300fba09d5de6090.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Adorable 3D Character @@ -4319,7 +4319,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/31a0ffbfc93b5b336a3bedc0a9985a02.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Adorable Kawaii @@ -4329,7 +4329,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/82624c429d504c8290d4c9147be64029.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Art Deco @@ -4339,7 +4339,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/c60ef3e7ada8774c92bb6e73c570f819.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Art Nouveau @@ -4349,7 +4349,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/153d83e71fbf145d0aa5c41ecab0a505.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Astral Aura @@ -4359,7 +4359,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/e093c9d0f81037002e88f2a6c3f38a55.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Avant-garde @@ -4369,7 +4369,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/9921d1944893466edfc6a060faf4070e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Baroque @@ -4379,7 +4379,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/d8279be4bb34e5cb00a95919412154a4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Bauhaus-Style Poster @@ -4389,7 +4389,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/4bd18b32c23e13b9e4fc7f65a1916eab.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Blueprint Schematic Drawing @@ -4399,7 +4399,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/62392c3715267f7162a37a8ff1caa3a1.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Caricature @@ -4409,7 +4409,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/894f40ed44b37c3372e6a22b8ae577a4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Cel Shaded Art @@ -4419,7 +4419,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/71c2e8a2cd1031b2bfae1640f7b72c88.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Character Design Sheet @@ -4429,7 +4429,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/eacf2134aa51d4b4a6f2f35cc170f315.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Classicism Art @@ -4439,7 +4439,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/10025b4f3a09e6134086e3cdec4ef2c8.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Color Field Painting @@ -4449,7 +4449,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/80e5b4075c572c04cbb4e48c37b8366b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Colored Pencil Art @@ -4459,7 +4459,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/9ae235d7f1a7c2a4edab52a5e9f9cbae.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Conceptual Art @@ -4469,7 +4469,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/cf2e6781997c6842a16155fdff911ef8.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Constructivism @@ -4479,7 +4479,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/d07feccabcadfd3310464bedba858bd1.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Cubism @@ -4489,7 +4489,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/aa8313f6c3cb9cafb9a7ec07db78df1c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Dadaism @@ -4499,7 +4499,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/db27030369cb3ccb042b8aea6bf635e2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Dark Fantasy @@ -4509,7 +4509,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/c88b6e641c707afc0c8d278ba7e1ac19.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Dark Moody Atmosphere @@ -4519,7 +4519,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/3da915da2f5cedaf243e57e08163f35b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: DMT Art Style @@ -4529,7 +4529,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/d4a823d2bfa912ca4bb56d96f722f08f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Doodle Art @@ -4539,7 +4539,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/8e1e21745c149b9634d3ce96fc7d505f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Double Exposure @@ -4549,7 +4549,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/efd7aea4af1c4ede99fdfac17350e264.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Dripping Paint Splatter Art @@ -4559,7 +4559,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/69fd81f5983107acc3d334af62915851.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Expressionism @@ -4569,7 +4569,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/3dfa862bd1c80cec237e4a5717cea2bd.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Faded Polaroid Photo @@ -4579,7 +4579,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/f152edb4b3ca6248758b48115258ddfa.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fauvism @@ -4589,7 +4589,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/0506b350cadcf8fca42da764cd6fd5bf.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Flat 2D Art @@ -4599,7 +4599,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/940cfd34155634cf051e1b2942cca426.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fortnite Art Style @@ -4609,7 +4609,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/156f8d943ff6d283f7a34f265daaa46c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Futurism @@ -4619,7 +4619,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/855283cc2ab6283b627ef32d06a1ae0f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Glitchcore @@ -4629,7 +4629,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/9af62376402a85774179e82cf7e0dc59.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Glo-fi @@ -4639,7 +4639,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/275a6e2a3297cec57f9b5a4a17b0f749.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Googie Art Style @@ -4649,7 +4649,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/08ee77586d7bec3f6bad7d60cee3c540.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Graffiti Art @@ -4659,7 +4659,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/57b751b11564cb22cd49ef21f2004a5f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Harlem Renaissance Art @@ -4669,7 +4669,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/d09ea3dadcd0a15d8fa247ee74a75e6b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: High Fashion @@ -4679,7 +4679,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/868f752bbb5ef992a0be36d7d13de3be.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Idyllic @@ -4689,7 +4689,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/55bab29eeb628e7a9ae018e45e7e24db.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Impressionism @@ -4699,7 +4699,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/0312b673dc6858a9864d7f45f0c5c1fc.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Infographic Drawing @@ -4709,7 +4709,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/b09151f6e0883d26056b80fcc9d398bb.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Ink Dripping Drawing @@ -4719,7 +4719,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/5f09912a07e915250a96b2023db15821.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Japanese Ink Drawing @@ -4729,7 +4729,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/633ad971ff30fe4717782fc6b5f92fda.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Knolling Photography @@ -4739,7 +4739,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/89a205be3a276349ecddf0eeca43ed80.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Light Cheery Atmosphere @@ -4749,7 +4749,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/0913ac9815f892411f8327a630f51ae4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Logo Design @@ -4759,7 +4759,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/9aa040b0c60d289da9610c91ad9b7c7e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Luxurious Elegance @@ -4769,7 +4769,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/e796e84ed745150f0d4e28e0ac99b4cf.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Macro Photography @@ -4779,7 +4779,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/92e8b84379828f38e3d01c7272f41b0b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Mandola Art @@ -4789,7 +4789,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/dbf5ca944d9213c3181348666cf337ac.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Marker Drawing @@ -4799,7 +4799,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/c558745f7a4b77d7ca9a428d8874efe4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Medievalism @@ -4809,7 +4809,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/26aa6244359a4fd87f6438a341057901.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Minimalism @@ -4819,7 +4819,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/dce92a90da6299339cf8e9ebc6596ea2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neo-Baroque @@ -4829,7 +4829,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/9b6cd8751b18c65b259769b44cfac351.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neo-Byzantine @@ -4839,7 +4839,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/99c67768869b546bf527ef0b1735c0d5.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neo-Futurism @@ -4849,7 +4849,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/bada1534f7a60187f584febcc92f40d1.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neo-Impressionism @@ -4859,7 +4859,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/6bafeac67ce2679b64a86ee1023b53c9.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neo-Rococo @@ -4869,7 +4869,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/9ab0ad2b88e03933ea479357ff1e4435.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Neoclassicism @@ -4879,7 +4879,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/83a4e3a2ca577400b05a81b5b2b8650e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Op Art @@ -4889,7 +4889,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/5f11132803dff2de5213293b91d407d7.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Ornate and Intricate @@ -4899,7 +4899,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/24b895dca946c8765ad9fa38f720f671.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Pencil Sketch Drawing @@ -4909,7 +4909,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/a9056e1eac85e5e4fe96a93917d4cce4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Pop Art 2 @@ -4919,7 +4919,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/83c4c06c70a48da6558ff970ece247b6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Rococo @@ -4929,7 +4929,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/4850170f410e10bc833b7d00324dff18.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Silhouette Art @@ -4939,7 +4939,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/568777f447fc02510b618152726d5002.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Simple Vector Art @@ -4949,7 +4949,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/24d2ab1fd175bf4e9ef3a8327651dd4b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Sketchup @@ -4959,7 +4959,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/337dca7ac49cf7820c85ede096ebde9c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Steampunk 2 @@ -4969,7 +4969,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/07d7b27cd73f2d43684003563511c15b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Surrealism @@ -4979,7 +4979,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/38bae70377b323d1a5f5756d7e04886d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Suprematism @@ -4989,7 +4989,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/c48fbd8cedee84d06b4d875d566f1bb8.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Terragen @@ -4999,7 +4999,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/8974cd8e0f38fb7aac117cf0983fc36d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Tranquil Relaxing Atmosphere @@ -5009,7 +5009,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/69170d8443a67be4210af8d5558779c2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Sticker Designs @@ -5019,7 +5019,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/2d1e9867058db2c57f2fe47530de3243.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Vibrant Rim Light @@ -5029,7 +5029,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/bb08936ca184daba2b30b4a9efb308f2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Volumetric Lighting @@ -5039,7 +5039,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/bbad7964a2ae70b66c72804273f11e74.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Watercolor 2 @@ -5049,7 +5049,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/8859d532ae5901cc8457d6118fb9b7da.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Whimsical and Playful @@ -5059,7 +5059,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/af2267f1942e870be957c37cd73d4359.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Enhance @@ -5072,7 +5072,7 @@ MANTRAS: } 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/e501823a21bbda56592055c9613c1dbb.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Sharp @@ -5082,7 +5082,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/393fb7aab57992a1c3af7cbad01c1001.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Masterpiece @@ -5092,7 +5092,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/9e27c3d1475dacae0ee45cea783aaaf5.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Photograph @@ -5102,7 +5102,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/8b2ea41ec15bf1a16d6a837d46dbc2ac.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Negative @@ -5115,7 +5115,7 @@ MANTRAS: } 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/daaec2962291137532189b8a31012532.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: Fooocus Cinematic @@ -5125,7 +5125,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/adc4d52aa5b0afca0593a475ddc9d055.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-cinematic-dynamic @@ -5135,7 +5135,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/bd2470068e09d9f1b7d0a690c879b3ce.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-spontaneous-picture @@ -5145,7 +5145,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/19ad6082cee5516ce330641b515467ef.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-artistic-vision @@ -5155,7 +5155,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/95af94e50bcb91ae8fd2914a3bf13f1e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-dark-dream @@ -5165,7 +5165,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/572c8c26cc20ac0ee66684e3c5ee4e8c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-gloomy-art @@ -5175,7 +5175,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/66cbdf819e930f7580bd66a41bde7dfe.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-bad-dream @@ -5185,7 +5185,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/b92b2bbfc400db9204fe8249354132b4.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-underground @@ -5195,7 +5195,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/8d46eca558d791a1f2b41b0ed7bba4d2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-surreal-painting @@ -5205,7 +5205,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/58858425832b10d233f7887af4a2022f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-dynamic-illustration @@ -5215,7 +5215,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/8bf9861d4d3fadcdb98ceec88a941582.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-undead-art @@ -5225,7 +5225,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/fada50979ca180006eba9a45a00f3675.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-elemental-art @@ -5235,7 +5235,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/5895d78cf58c1ca05178991f37cc48ff.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-space-art @@ -5245,7 +5245,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/e9815495587895a21d970728474c8be6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-ancient-illustration @@ -5255,7 +5255,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/151e07c17a89ebaf7688905ea0199862.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-brave-art @@ -5265,7 +5265,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/1a068f2728327d21ebb99285c2ce1370.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-heroic-fantasy @@ -5275,7 +5275,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/78d05472067e0b86c8270fa5476fcb8e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-dark-cyberpunk @@ -5285,7 +5285,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/a9f50e3162958fd783872d6955ad7d0b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-lyrical-geometry @@ -5295,7 +5295,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/dfabd41d3042ced804bc97ae35e3a7cb.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-sumi-e-symbolic @@ -5305,7 +5305,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/695b1ba687544eaeec9fb5f871917aeb.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-sumi-e-detailed @@ -5315,7 +5315,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/16eb95e180385b88794e368b28da1812.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-manga @@ -5325,7 +5325,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/ebec631bf467937f82d05958ae59f9dc.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-anime @@ -5335,7 +5335,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/a08149bc8e50f6bc65c0010d4cd416f8.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: mre-comic @@ -5345,7 +5345,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/48c65cebf1fa4284d7b8feb619412e65.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-3d-model @@ -5355,7 +5355,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/c1a765ac089fdfb3c1d11b33c75d2afd.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-analog film @@ -5365,7 +5365,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/3c46d19957efd7fb78f4ab2bdada5468.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-anime @@ -5375,7 +5375,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/c030e72561eda96abcf738f1370d36ff.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-cinematic @@ -5385,7 +5385,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/d9161c0d5cbf2133b2bfc1021c0c5e2a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-comic book @@ -5395,7 +5395,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/6759ecb831037367e64c4b36d802be87.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-craft clay @@ -5405,7 +5405,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/8fc51113f725f27326c4398a7457cd6d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-digital art @@ -5415,7 +5415,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/d29adb44458700c4a45ee6edaa04bfb6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-enhance @@ -5425,7 +5425,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/2be0de541ff65f8da80ddc24a65c98d8.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-fantasy art @@ -5435,7 +5435,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/a6f8d92afcd5803dfb2ebecbc92091b6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-isometric @@ -5445,7 +5445,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/d4e3fcbbfd7b1323bd89decf5d7b0006.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-line art @@ -5455,7 +5455,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/034a51b0dd34b018be8859bf45b4f7ed.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-lowpoly @@ -5465,7 +5465,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/76b9913e9fa5704b6d30adbde9e1f70f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-neonpunk @@ -5475,7 +5475,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/7e9ed25bb34008beb5f417df63c4b2fe.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-origami @@ -5485,7 +5485,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/924f46a8f276011a0953d7988e90ee25.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-photographic @@ -5495,7 +5495,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/d6a2d8f3d37cc21c20c5dfc13d000b67.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-pixel art @@ -5505,7 +5505,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/a5ab89c0960be8c1216e65c98d92ae4a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: sai-texture @@ -5515,7 +5515,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/ebfeab574283fff2ac096e348a585e6d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-advertising @@ -5525,7 +5525,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/1aa26a16126e2756bf4bf3fda29baa12.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-automotive @@ -5535,7 +5535,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/ddc833b36ca23c85a4f6e7bf0088d081.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-corporate @@ -5545,7 +5545,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/df97fa45c7842296c138aca4057db272.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-fashion editorial @@ -5555,7 +5555,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/89259be723479cd0b81546b715bea04d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-food photography @@ -5565,7 +5565,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/33acc98f8615940c8cebbac8ce5297b2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-gourmet food photography @@ -5575,7 +5575,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/897bbd3f1d232de122796266f3845b50.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-luxury @@ -5585,7 +5585,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/5b33ecc84dc5ff285a0f2e69f43162cb.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-real estate @@ -5595,7 +5595,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/1b99b7bcd0476144d80d066e747d8dfc.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: ads-retail @@ -5605,7 +5605,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/0029e46ef36380dde2084257108f8a6f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-abstract @@ -5615,7 +5615,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/8c401cb0a6ea288230222c4985e78667.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-abstract expressionism @@ -5625,7 +5625,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/9df6635149c576b65d911c2e4cc6a86b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-art deco @@ -5635,7 +5635,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/82fff8a25de8075777caf14cb3eb5650.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-art nouveau @@ -5645,7 +5645,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/84075c5c0cb4b7a2541c6fbca9835cfd.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-constructivist @@ -5655,7 +5655,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/2a634ad0c89ecefbbea4ce5bcab3d5e5.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-cubist @@ -5665,7 +5665,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/2a3d797008c08e12b485d61624741ea6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-expressionist @@ -5675,7 +5675,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/83914655659001716a1acede295289d0.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-graffiti @@ -5685,7 +5685,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/f72a23c7623eb480737eb73c08bf8423.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-hyperrealism @@ -5695,7 +5695,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/db378d5a64a8e7ad1e29a4389bda5d1c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-impressionist @@ -5705,7 +5705,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/53b151aec4d5685dfc24511b6705b90e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-pointillism @@ -5715,7 +5715,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/23b137a409ee8a8c6ee160c1ddf0659f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-pop art @@ -5725,7 +5725,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/bd4faf0e2b7dbc2d0eb21f3ebee97d3d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-psychedelic @@ -5735,7 +5735,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/7dc0131817f4c31517581dd4a811067b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-renaissance @@ -5745,7 +5745,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/69796484f61dc2e94d5853f5bbe27c05.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-steampunk @@ -5755,7 +5755,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/985005e28858b03c9500a6eb5bd9e201.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-surrealist @@ -5765,7 +5765,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/892d19ec3c429b7148562796df0024db.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-typography @@ -5775,7 +5775,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/9adafe1bb169e1ee3f78ba2c1b1cf8d3.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: artstyle-watercolor @@ -5785,7 +5785,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/29ca23d7a0397e9beaa72e3b63d17551.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-biomechanical @@ -5795,7 +5795,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/5987795487a3fa74469499ae53963d5d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-biomechanical cyberpunk @@ -5805,7 +5805,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/75b56d7cff9b3f011248b3092ae3b8d2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-cybernetic @@ -5815,7 +5815,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/47df6db04290f01aeee7381aaf12ec07.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-cybernetic robot @@ -5825,7 +5825,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/6f18121b4ba22c8ba7834f404501fa4c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-cyberpunk cityscape @@ -5835,7 +5835,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/5e4107dace2c9dd0217a9d1b18ae28f6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-futuristic @@ -5845,7 +5845,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/8a61c0853ee4079bae96ad502a6ae840.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-retro cyberpunk @@ -5855,7 +5855,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/460957bf9a07a58ddec08bf22d5b3698.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-retro futurism @@ -5865,7 +5865,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/0434a7b23a0f936db615d7a9b8e805f1.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-sci-fi @@ -5875,7 +5875,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/7c3bde651f426273758b68a2805d0c8a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: futuristic-vaporwave @@ -5885,7 +5885,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/1ebb0bf67ee3ef76288b4c0a2a65d557.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-bubble bobble @@ -5895,7 +5895,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/19257352df33228555cb350963d9432a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-cyberpunk game @@ -5905,7 +5905,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/6165ef47bc859e3dd0e3399ba2264c2b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-fighting game @@ -5915,7 +5915,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/aebda69ec1097dc61966995956ae34cc.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-gta @@ -5925,7 +5925,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/edff7ba5fc983468e79e64beb838b829.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-mario @@ -5935,7 +5935,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/2a229f623ce89160d1f67620599dfc7c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-minecraft @@ -5945,7 +5945,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/83e77332a9f234fd8c9cddd29e2ec3c7.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-pokemon @@ -5955,7 +5955,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/9bfe2805e6578875a8dfe2a0ea96c281.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-retro arcade @@ -5965,7 +5965,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/76885e0b110f1fdf3eaee52fbaf27abf.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-retro game @@ -5975,7 +5975,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/61fbae41c50f56e24dcf20fe3612d456.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-rpg fantasy game @@ -5985,7 +5985,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/34797baf58e32b4e1a37753fe9dcff5c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-strategy game @@ -5995,7 +5995,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/0d276527d22510a1b5f8f74eac2790df.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-streetfighter @@ -6005,7 +6005,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/f5927fc2b8d4a8212242bd97adcbdfa1.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: game-zelda @@ -6015,7 +6015,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/4f9eadddbc196268258089b8cc4e5c5c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-architectural @@ -6025,7 +6025,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/488545e9fc9417d62961f42d578547d2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-disco @@ -6035,7 +6035,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/784b0ac35e0c0fdb2df21a95d5ca1c55.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-dreamscape @@ -6045,7 +6045,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/2bf77804b5bf352c4e97475b1e8eb29e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-dystopian @@ -6055,7 +6055,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/065db0385e126192cbd27e22ca4f154c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-fairy tale @@ -6065,7 +6065,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/578dfe65d9f03e83c95820d4c45cd396.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-gothic @@ -6075,7 +6075,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/332a1f8cd655b724cb48bc5c91b764fc.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-grunge @@ -6085,7 +6085,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/0ccb4c03c6d983b9f6d05ba383f9d690.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-horror @@ -6095,7 +6095,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/fdca4780d099a39dc50e4553622fba72.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-kawaii @@ -6105,7 +6105,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/99dab4185e7337189d8959878bfa308b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-lovecraftian @@ -6115,7 +6115,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/b7c9d084ed62c1c2e1ea080ad95af61e.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-macabre @@ -6125,7 +6125,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/fd7cf2315b27b0434b909020414e1173.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-manga @@ -6135,7 +6135,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/531aac90b321d39221ba7cf70a97b232.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-metropolis @@ -6145,7 +6145,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/eaad79fe3d7160cec6e0656fc3b02d3c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-minimalist @@ -6155,7 +6155,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/e85dd1ccc7f22bdac054d74ba58521b2.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-monochrome @@ -6165,7 +6165,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/cc793ada6b47561f4b63aa66dcd282ac.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-nautical @@ -6175,7 +6175,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/3d9f6528180670804a2c5e85c7665c42.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-space @@ -6185,7 +6185,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/6f5742d23b43fc99cc01c8b68518df7c.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-stained glass @@ -6195,7 +6195,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/ab0512ced9ed572075c49ad4f9f9a45d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-techwear fashion @@ -6205,7 +6205,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/652a6bdb1b36860041222a458c7915d0.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-tribal @@ -6215,7 +6215,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/1ecdaf153ece5e16250b87020b7a209b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: misc-zentangle @@ -6225,7 +6225,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/80f3488cdb69f0ff13d83a4feac4499d.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-collage @@ -6235,7 +6235,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/c9bbdaba28358faf1a8c1df44b3de950.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-flat papercut @@ -6245,7 +6245,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/1bffcd9a4086b29c367b8301f26eed3b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-kirigami @@ -6255,7 +6255,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/2e5f95977b97b2a6248924e118a23076.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-paper mache @@ -6265,7 +6265,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/68441f668fcf7a51db5fc9b9d4d45ce7.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-paper quilling @@ -6275,7 +6275,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/8c0504eb14341b66796612c46bb3748b.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-papercut collage @@ -6285,7 +6285,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/217e7c8b905b63c63c94bd6ff8fe3477.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-papercut shadow box @@ -6295,7 +6295,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/2af0d61de1b17a5a5257f512549f9616.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-stacked papercut @@ -6305,7 +6305,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/62618e32e90539827e0eb279a6ea170a.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: papercraft-thick layered papercut @@ -6315,7 +6315,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/17008c40a6be8d41d3921ee88bac27ad.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-alien @@ -6325,7 +6325,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/eae6043dee2b2d94cd9a22cb044db8b3.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-film noir @@ -6335,7 +6335,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/0b3629be5ebb7cda463877a1993a0298.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-glamour @@ -6345,7 +6345,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/f85dc6aa5d7f7d6d3663f2270e276796.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-hdr @@ -6355,7 +6355,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/269a98b284ae1345b0e5ac1f85c33179.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-iphone photographic @@ -6365,7 +6365,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/48c556a6b3c3a533847b80b031cd4962.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-long exposure @@ -6375,7 +6375,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/fda88c3fc43ea8cc04ce9b5c0261627f.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-neon noir @@ -6385,7 +6385,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/8a5b71434592771e064af4b9017b59d6.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-silhouette @@ -6395,7 +6395,7 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/1892a37e66d33cdd9b713aaab6b8c597.jpg PROMPT_EXAMPLE: a boy wearing green jacket - NAME: photo-tilt-shift @@ -6405,5 +6405,5 @@ MANTRAS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/d058a157de848a5c03d9a3e1e0e560a2.jpg 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 index 3fcec5c..868c32c 100644 --- a/scepter/methods/studio/extensions/tuners/official_tuners.yaml +++ b/scepter/methods/studio/extensions/tuners/official_tuners.yaml @@ -4,8 +4,8 @@ TUNERS: SOURCE: scepter DESCRIPTION: None BASE_MODEL: SD_XL1.0 - MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/azure_dragon/ - IMAGE_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/azure_dragon/xl_azure_dragon.png + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/azure_dragon/ + IMAGE_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/azure_dragon/xl_azure_dragon.png TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: Azure Dragon, 8K, high quality,Ultra High Detail.One of the Four Divine Creatures in Charge of Water. - NAME: Gold-Dragon @@ -13,8 +13,8 @@ TUNERS: SOURCE: scepter DESCRIPTION: None BASE_MODEL: SD_XL1.0 - MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/gold_dragon/ - IMAGE_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/gold_dragon/xl_gold_dragon.png + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/gold_dragon/ + IMAGE_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/gold_dragon/xl_gold_dragon.png TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: Chinese Gold Dragon in the clouds. Translucent Texture. Zbrush. Fuzzy Art. Exquisite Craftsmanship. 3D. 8K. Ultra High Detail - NAME: SpringFestival-Dragon @@ -22,8 +22,8 @@ TUNERS: SOURCE: scepter DESCRIPTION: None BASE_MODEL: SD_XL1.0 - MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/spring_festival_dragon/ - IMAGE_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/spring_festival_dragon/xl_spring_festival_dragon.png + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/spring_festival_dragon/ + IMAGE_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/spring_festival_dragon/xl_spring_festival_dragon.png TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: Chinese dragon. Spring Festival.Festive.Street.Lanterns.32K.High quality.expressive, dramatic, dreamlike and mysterious, Surrealism - NAME: Red-Dragon @@ -31,8 +31,8 @@ TUNERS: SOURCE: scepter DESCRIPTION: None BASE_MODEL: SD_XL1.0 - MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/red_dragon/ - IMAGE_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/red_dragon/xl_red_dragon.png + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/red_dragon/ + IMAGE_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/red_dragon/xl_red_dragon.png TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: Traditional Red Dragon of China. Low Water Level. Studio Ghibli Style. Mural Illustration. White Background. High Detail - NAME: ChinesePunk-Dragon @@ -40,8 +40,8 @@ TUNERS: SOURCE: scepter DESCRIPTION: None BASE_MODEL: SD_XL1.0 - MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/chinese_punk_dragon/ - IMAGE_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/chinese_punk_dragon/xl_chinese_punk_dragon.png + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/chinese_punk_dragon/ + IMAGE_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/chinese_punk_dragon/xl_chinese_punk_dragon.png TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: uhd Image,Dragon,Chinese Dragon, Dunhuang Mural Style, Traditional Maritime Art Style - NAME: Cute-Dragon @@ -49,8 +49,8 @@ TUNERS: SOURCE: scepter DESCRIPTION: None BASE_MODEL: SD_XL1.0 - MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/cute_dragon/ - IMAGE_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/cute_dragon/xl_kawaii_dragon.png + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/cute_dragon/ + IMAGE_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/cute_dragon/xl_kawaii_dragon.png TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: China Kawaii Dragon. Contest Winner. Minimalist Illustration. White Background. Flat Style. Digital Painting Style. Red. 32k uhd. Fun Comics. Fuzzy Art. Bold. Comic-Inspired Characters - NAME: Dragon-Baby @@ -58,8 +58,8 @@ TUNERS: SOURCE: scepter DESCRIPTION: None BASE_MODEL: SD_XL1.0 - MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/baby_dragon/ - IMAGE_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/baby_dragon/xl_baby_dragon.png + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/baby_dragon/ + IMAGE_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/baby_dragon/xl_baby_dragon.png TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: Warm Colors, Soft,Chinese Dragon Baby, Felt Style,Dragon Baby, Best Quality, 3D Doll, Macaron Tones, Glittering Big Eyes, Winter,Dragon - NAME: Sloppy-Dragon @@ -67,8 +67,8 @@ TUNERS: SOURCE: scepter DESCRIPTION: None BASE_MODEL: SD_XL1.0 - MODEL_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/sloppy_dragon/ - IMAGE_PATH: ms://damo/scepter_scedit@tuners_model/SD_XL1.0/sloppy_dragon/xl_sloppy_dragon.png + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/sloppy_dragon/ + IMAGE_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/sloppy_dragon/xl_sloppy_dragon.png TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: Messy Chinese Dragon,Cute, Wu Guanzhong, Rough - @@ -77,8 +77,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/894f40ed44b37c3372e6a22b8ae577a4.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/Caricature TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -87,8 +87,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/894f40ed44b37c3372e6a22b8ae577a4.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/Caricature TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -97,8 +97,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/894f40ed44b37c3372e6a22b8ae577a4.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/Caricature TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -107,8 +107,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/80e5b4075c572c04cbb4e48c37b8366b.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/ColorFieldPainting TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -117,8 +117,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/80e5b4075c572c04cbb4e48c37b8366b.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/ColorFieldPainting TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -127,8 +127,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/80e5b4075c572c04cbb4e48c37b8366b.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/ColorFieldPainting TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -137,8 +137,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/9ae235d7f1a7c2a4edab52a5e9f9cbae.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/ColoredPencilArt TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -147,8 +147,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/9ae235d7f1a7c2a4edab52a5e9f9cbae.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/ColoredPencilArt TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -157,8 +157,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/9ae235d7f1a7c2a4edab52a5e9f9cbae.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/ColoredPencilArt TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -167,8 +167,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/3da915da2f5cedaf243e57e08163f35b.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/DarkMoodyAtmosphere TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -177,8 +177,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/3da915da2f5cedaf243e57e08163f35b.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/DarkMoodyAtmosphere TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -187,8 +187,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/3da915da2f5cedaf243e57e08163f35b.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/DarkMoodyAtmosphere TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -197,8 +197,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/69fd81f5983107acc3d334af62915851.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/DrippingPaintSplatterArt TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -207,8 +207,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/69fd81f5983107acc3d334af62915851.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/DrippingPaintSplatterArt TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -217,8 +217,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/69fd81f5983107acc3d334af62915851.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/DrippingPaintSplatterArt TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -227,8 +227,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/f152edb4b3ca6248758b48115258ddfa.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/FadedPolaroidPhoto TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -237,8 +237,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/f152edb4b3ca6248758b48115258ddfa.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/FadedPolaroidPhoto TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -247,8 +247,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/f152edb4b3ca6248758b48115258ddfa.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/FadedPolaroidPhoto TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -257,8 +257,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/940cfd34155634cf051e1b2942cca426.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/Flat2DArt TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -267,8 +267,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/940cfd34155634cf051e1b2942cca426.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/Flat2DArt TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -277,8 +277,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/940cfd34155634cf051e1b2942cca426.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/Flat2DArt TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -287,8 +287,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/57b751b11564cb22cd49ef21f2004a5f.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/GraffitiArt TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -297,8 +297,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/57b751b11564cb22cd49ef21f2004a5f.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/GraffitiArt TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -307,8 +307,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/57b751b11564cb22cd49ef21f2004a5f.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/GraffitiArt TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -317,8 +317,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/0312b673dc6858a9864d7f45f0c5c1fc.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/Impressionism TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -327,8 +327,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/0312b673dc6858a9864d7f45f0c5c1fc.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/Impressionism TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -337,8 +337,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/0312b673dc6858a9864d7f45f0c5c1fc.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/Impressionism TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -347,8 +347,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/9aa040b0c60d289da9610c91ad9b7c7e.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/LogoDesign TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -357,8 +357,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/9aa040b0c60d289da9610c91ad9b7c7e.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/LogoDesign TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -367,8 +367,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/9aa040b0c60d289da9610c91ad9b7c7e.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/LogoDesign TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -377,8 +377,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/a9056e1eac85e5e4fe96a93917d4cce4.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/PencilSketchDrawing TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -387,8 +387,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/a9056e1eac85e5e4fe96a93917d4cce4.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/PencilSketchDrawing TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -397,8 +397,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/a9056e1eac85e5e4fe96a93917d4cce4.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/PencilSketchDrawing TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -407,8 +407,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/568777f447fc02510b618152726d5002.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/SilhouetteArt TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -417,8 +417,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/568777f447fc02510b618152726d5002.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/SilhouetteArt TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -427,8 +427,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/568777f447fc02510b618152726d5002.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/SilhouetteArt TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -437,8 +437,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/07d7b27cd73f2d43684003563511c15b.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/Steampunk2 TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -447,8 +447,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/07d7b27cd73f2d43684003563511c15b.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/Steampunk2 TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -457,8 +457,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/07d7b27cd73f2d43684003563511c15b.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/Steampunk2 TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -467,8 +467,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/2d1e9867058db2c57f2fe47530de3243.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/StickerDesigns TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -477,8 +477,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/2d1e9867058db2c57f2fe47530de3243.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/StickerDesigns TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -487,8 +487,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/2d1e9867058db2c57f2fe47530de3243.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/StickerDesigns TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -497,8 +497,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/8859d532ae5901cc8457d6118fb9b7da.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/Watercolor2 TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -507,8 +507,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/8859d532ae5901cc8457d6118fb9b7da.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/Watercolor2 TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -517,8 +517,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/8859d532ae5901cc8457d6118fb9b7da.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/Watercolor2 TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -527,8 +527,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/5895d78cf58c1ca05178991f37cc48ff.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/mre-elemental-art TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -537,8 +537,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/5895d78cf58c1ca05178991f37cc48ff.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/mre-elemental-art TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -547,8 +547,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/5895d78cf58c1ca05178991f37cc48ff.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/mre-elemental-art TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -557,8 +557,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/a08149bc8e50f6bc65c0010d4cd416f8.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/mre-anime TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -567,8 +567,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/a08149bc8e50f6bc65c0010d4cd416f8.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/mre-anime TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -577,8 +577,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/a08149bc8e50f6bc65c0010d4cd416f8.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/mre-anime TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -587,8 +587,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/48c65cebf1fa4284d7b8feb619412e65.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/mre-comic TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -597,8 +597,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/48c65cebf1fa4284d7b8feb619412e65.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/mre-comic TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -607,8 +607,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/48c65cebf1fa4284d7b8feb619412e65.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/mre-comic TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -617,8 +617,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/8fc51113f725f27326c4398a7457cd6d.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/sai-craftclay TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -627,8 +627,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/8fc51113f725f27326c4398a7457cd6d.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/sai-craftclay TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -637,8 +637,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/8fc51113f725f27326c4398a7457cd6d.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/sai-craftclay TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -647,8 +647,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/a6f8d92afcd5803dfb2ebecbc92091b6.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/sai-fantasyart TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -657,8 +657,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/a6f8d92afcd5803dfb2ebecbc92091b6.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/sai-fantasyart TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -667,8 +667,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/a6f8d92afcd5803dfb2ebecbc92091b6.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/sai-fantasyart TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -677,8 +677,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/034a51b0dd34b018be8859bf45b4f7ed.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/sai-lineart TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -687,8 +687,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/034a51b0dd34b018be8859bf45b4f7ed.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/sai-lineart TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -697,8 +697,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/034a51b0dd34b018be8859bf45b4f7ed.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/sai-lineart TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -707,8 +707,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/7e9ed25bb34008beb5f417df63c4b2fe.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/sai-neonpunk TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -717,8 +717,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/7e9ed25bb34008beb5f417df63c4b2fe.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/sai-neonpunk TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -727,8 +727,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/7e9ed25bb34008beb5f417df63c4b2fe.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/sai-neonpunk TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -737,8 +737,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/924f46a8f276011a0953d7988e90ee25.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/sai-origami TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -747,8 +747,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/924f46a8f276011a0953d7988e90ee25.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/sai-origami TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -757,8 +757,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/924f46a8f276011a0953d7988e90ee25.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/sai-origami TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -767,8 +767,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD_XL1.0/a5ab89c0960be8c1216e65c98d92ae4a.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD_XL1.0/sai-pixelart TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -777,8 +777,8 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD2.1/a5ab89c0960be8c1216e65c98d92ae4a.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD2.1/sai-pixelart TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket - @@ -787,7 +787,7 @@ TUNERS: 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 + IMAGE_PATH: ms://iic/scepter@mantra_images_jpg/SD1.5/a5ab89c0960be8c1216e65c98d92ae4a.jpg + MODEL_PATH: ms://iic/scepter_scedit@tuners_model/SD1.5/sai-pixelart TUNER_TYPE: SwiftSCE PROMPT_EXAMPLE: a boy wearing green jacket diff --git a/scepter/methods/studio/inference/edit/stylebooth_tb_pro.yaml b/scepter/methods/studio/inference/edit/stylebooth_tb_pro.yaml index 25c105c..ecc297b 100644 --- a/scepter/methods/studio/inference/edit/stylebooth_tb_pro.yaml +++ b/scepter/methods/studio/inference/edit/stylebooth_tb_pro.yaml @@ -2,7 +2,7 @@ NAME: EDIT IS_DEFAULT: False DEFAULT_PARAS: PARAS: - RESOLUTIONS: [[1024, 1024]] + RESOLUTIONS: [[512, 512], [1024, 1024]] INPUT: IMAGE: PROMPT: "" diff --git a/scepter/methods/studio/inference/inference.yaml b/scepter/methods/studio/inference/inference.yaml index 286a418..e6bf473 100644 --- a/scepter/methods/studio/inference/inference.yaml +++ b/scepter/methods/studio/inference/inference.yaml @@ -63,7 +63,8 @@ DIFFUSION_PARAS: MAX: 1.0 DEFAULT: 0.15 RESOLUTIONS: - VALUES: [[704, 1408], [704, 1344], [768, 1344], + VALUES: [ [512, 512], [768, 768], + [704, 1408], [704, 1344], [768, 1344], [720, 1280], [768, 1280], [832, 1216], [832, 1152], [896, 1152], [896, 1088], [960, 1088], @@ -87,18 +88,18 @@ CONTROLABLE_ANNOTATORS: IS_DEFAULT: True - NAME: "HedAnnotator" - PRETRAINED_MODEL: "ms://damo/scepter_scedit@annotator/ckpts/ControlNetHED.pth" + PRETRAINED_MODEL: "ms://iic/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" + BODY_MODEL_PATH: "ms://iic/scepter_scedit@annotator/ckpts/body_pose_model.pth" + HAND_MODEL_PATH: "ms://iic/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" + PRETRAINED_MODEL: "ms://iic/scepter_scedit@annotator/ckpts/dpt_hybrid-midas-501f0c75.pt" TYPE: Midas IS_DEFAULT: False - diff --git a/scepter/methods/studio/self_train/edit/stylebooth_tb_pro.yaml b/scepter/methods/studio/self_train/edit/stylebooth_tb_pro.yaml new file mode 100644 index 0000000..c2ebb25 --- /dev/null +++ b/scepter/methods/studio/self_train/edit/stylebooth_tb_pro.yaml @@ -0,0 +1,376 @@ +ENV: + BACKEND: nccl +META: + VERSION: 'EDIT' + DESCRIPTION: "EDIT" + IS_DEFAULT: False + IS_SHARE: True + INFERENCE_PARAS: + INFERENCE_BATCH_SIZE: 1 + INFERENCE_PREFIX: "" + DEFAULT_SAMPLER: "ddim" + DEFAULT_SAMPLE_STEPS: 40 + INFERENCE_N_PROMPT: "" + RESOLUTION: [512, 512] + PARAS: + - + TASK: 'Image Editing' + TRAIN_BATCH_SIZE: 1 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: [512, 512] + MEMORY: 29000 + EPOCHS: 50 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: False + TUNER: FULL + - + TASK: 'Image Editing' + TRAIN_BATCH_SIZE: 1 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: [512, 512] + MEMORY: 29000 + EPOCHS: 50 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: True + TUNER: LORA + - + TASK: 'Image Editing' + TRAIN_BATCH_SIZE: 1 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: [512, 512] + MEMORY: 29000 + EPOCHS: 50 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: False + TUNER: SCE + + - + TASK: 'Image Editing' + TRAIN_BATCH_SIZE: 1 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: [512, 512] + MEMORY: 29000 + EPOCHS: 50 + SAVE_INTERVAL: 25 + EPSEC: 0.818 + LEARNING_RATE: 0.0001 + IS_DEFAULT: False + TUNER: TEXT_SCE + + - + TASK: 'Image Editing' + TRAIN_BATCH_SIZE: 4 + TRAIN_PREFIX: "" + TRAIN_N_PROMPT: "" + RESOLUTION: [512, 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 + EVAL_INTERVAL: -1 + # + WORK_DIR: + LOG_FILE: std_log.txt + # + FILE_SYSTEM: + NAME: "ModelscopeFs" + TEMP_DIR: "./cache/data" + # + FREEZE: + # + TUNER: + # + MODEL: + NAME: LatentDiffusionEdit + PARAMETERIZATION: eps + TIMESTEPS: 1000 + MIN_SNR_GAMMA: + ZERO_TERMINAL_SNR: False + PRETRAINED_MODEL: ms://damo/stylebooth@models/stylebooth-tb-5000-0.bin + IGNORE_KEYS: [ ] + CONCAT_NO_SCALE_FACTOR: True + 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: 8 + 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 + image: 1.5 + text: 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: cache/save_data/delogo/ + MS_DATASET_NAMESPACE: "" + MS_DATASET_SPLIT: "train" + MS_DATASET_SUBNAME: "" + PROMPT_PREFIX: "" + REPLACE_STYLE: False + PIN_MEMORY: True + BATCH_SIZE: 1 + NUM_WORKERS: 4 + SAMPLER: + NAME: LoopSampler + TRANSFORMS: + - NAME: LoadImageFromFileList + FILE_KEYS: ['img_path', 'src_path'] + RGB_ORDER: RGB + BACKEND: pillow + - NAME: FlexibleResize + INTERPOLATION: bilinear + SIZE: [ 512, 512 ] + INPUT_KEY: [ 'img', 'src' ] + OUTPUT_KEY: [ 'img', 'src' ] + BACKEND: pillow + - NAME: FlexibleCenterCrop + SIZE: [ 512, 512 ] + INPUT_KEY: [ 'img', 'src' ] + OUTPUT_KEY: [ 'img', 'src' ] + BACKEND: pillow + - NAME: ImageToTensor + INPUT_KEY: [ 'img', 'src' ] + OUTPUT_KEY: [ 'img', 'src' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'img', 'src' ] + OUTPUT_KEY: [ 'image', 'condition_cat' ] + BACKEND: torchvision + - NAME: Select + KEYS: [ 'image', 'condition_cat', 'prompt' ] + META_KEYS: [ 'data_key' ] + # + TRAIN_HOOKS: + - + NAME: BackwardHook + PRIORITY: 0 + - + NAME: LogHook + LOG_INTERVAL: 10 + SHOW_GPU_MEM: True + - + NAME: TensorboardLogHook + - + NAME: CheckpointHook + INTERVAL: 10000 + PRIORITY: 200 + SAVE_LAST: True + SAVE_NAME_PREFIX: 'step' + DISABLE_SNAPSHOT: True + # + EVAL_DATA: + NAME: Text2ImageDataset + MODE: eval + PROMPT_FILE: + PROMPT_DATA: [ ] + IMAGE_SIZE: [ 512, 512 ] + FIELDS: [ "prompt", "src_path" ] + DELIMITER: '#;#' + PROMPT_PREFIX: '' + PIN_MEMORY: True + BATCH_SIZE: 1 + NUM_WORKERS: 4 + TRANSFORMS: + - NAME: LoadImageFromFileList + FILE_KEYS: [ 'src_path' ] + RGB_ORDER: RGB + BACKEND: pillow + - NAME: FlexibleResize + INTERPOLATION: bilinear + SIZE: [ 512, 512 ] + INPUT_KEY: [ 'src' ] + OUTPUT_KEY: [ 'src' ] + BACKEND: pillow + - NAME: FlexibleCenterCrop + SIZE: [ 512, 512 ] + INPUT_KEY: [ 'src' ] + OUTPUT_KEY: [ 'src' ] + BACKEND: pillow + - NAME: ImageToTensor + INPUT_KEY: [ 'src' ] + OUTPUT_KEY: [ 'src' ] + BACKEND: pillow + - NAME: Normalize + MEAN: [ 0.5, 0.5, 0.5 ] + STD: [ 0.5, 0.5, 0.5 ] + INPUT_KEY: [ 'src' ] + OUTPUT_KEY: [ 'condition_cat' ] + BACKEND: torchvision + - NAME: Select + KEYS: [ 'condition_cat', 'prompt' ] + META_KEYS: [ 'image_size' ] + EVAL_HOOKS: + - + NAME: ProbeDataHook + PROB_INTERVAL: 100 + SAVE_LAST: True + SAVE_NAME_PREFIX: 'step' + SAVE_PROBE_PREFIX: 'image' diff --git a/scepter/methods/studio/tuner_manager/readme_en.md b/scepter/methods/studio/tuner_manager/readme_en.md index 40e5391..5b63674 100644 --- a/scepter/methods/studio/tuner_manager/readme_en.md +++ b/scepter/methods/studio/tuner_manager/readme_en.md @@ -1,7 +1,7 @@ --- frameworks: - Pytorch -license: Apache License 2.0 +license: apache-2.0 tasks: - efficient-diffusion-tuning --- diff --git a/scepter/methods/studio/tuner_manager/readme_zh.md b/scepter/methods/studio/tuner_manager/readme_zh.md index 204ebf4..f09cb5d 100644 --- a/scepter/methods/studio/tuner_manager/readme_zh.md +++ b/scepter/methods/studio/tuner_manager/readme_zh.md @@ -1,7 +1,7 @@ --- frameworks: - Pytorch -license: Apache License 2.0 +license: apache-2.0 tasks: - efficient-diffusion-tuning --- diff --git a/scepter/methods/studio/tuner_manager/tuner_manager.yaml b/scepter/methods/studio/tuner_manager/tuner_manager.yaml index 91e61dd..ec29345 100644 --- a/scepter/methods/studio/tuner_manager/tuner_manager.yaml +++ b/scepter/methods/studio/tuner_manager/tuner_manager.yaml @@ -1,14 +1,15 @@ WORK_DIR: "tuner_manager" -SELF_TRAIN_DIR: "self_train" EXPORT_DIR: "export_model" TUNER_LIST_YAML: "tuner_list.yaml" README_EN: "scepter/methods/studio/tuner_manager/readme_en.md" README_ZH: "scepter/methods/studio/tuner_manager/readme_zh.md" BASE_MODEL_VERSION: - - BASE_MODEL: 'SD_XL1.0' - TUNER_TYPE: [ 'TEXT_SCE', 'SCE', 'LORA', 'TEXT_LORA', 'FULL' ] - BASE_MODEL: 'SD1.5' - TUNER_TYPE: [ 'TEXT_SCE', 'SCE', 'LORA', 'TEXT_LORA', 'FULL' ] + TUNER_TYPE: [ 'TEXT_LORA', 'TEXT_SCE', 'LORA', 'SCE', 'FULL' ] + - BASE_MODEL: 'SD_XL1.0' + TUNER_TYPE: [ 'TEXT_LORA', 'TEXT_SCE', 'LORA', 'SCE', 'FULL' ] - BASE_MODEL: 'SD2.1' - TUNER_TYPE: [ 'SCE', 'LORA', 'FULL' ] + TUNER_TYPE: [ 'LORA', 'SCE', 'FULL' ] + - BASE_MODEL: 'EDIT' + TUNER_TYPE: [ 'LORA', 'SCE', 'FULL' ] diff --git a/scepter/modules/annotator/base_annotator.py b/scepter/modules/annotator/base_annotator.py index 11d9def..9a51140 100644 --- a/scepter/modules/annotator/base_annotator.py +++ b/scepter/modules/annotator/base_annotator.py @@ -4,7 +4,6 @@ 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 diff --git a/scepter/modules/annotator/canny.py b/scepter/modules/annotator/canny.py index c0f7a18..fd6229f 100644 --- a/scepter/modules/annotator/canny.py +++ b/scepter/modules/annotator/canny.py @@ -6,7 +6,6 @@ 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 diff --git a/scepter/modules/annotator/color.py b/scepter/modules/annotator/color.py index 40690e3..7103d6a 100644 --- a/scepter/modules/annotator/color.py +++ b/scepter/modules/annotator/color.py @@ -6,7 +6,6 @@ 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 diff --git a/scepter/modules/annotator/hed.py b/scepter/modules/annotator/hed.py index b06f4f9..5956be7 100644 --- a/scepter/modules/annotator/hed.py +++ b/scepter/modules/annotator/hed.py @@ -11,13 +11,14 @@ from abc import ABCMeta import cv2 import numpy as np import torch +import torchvision 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 +from torchvision.transforms import InterpolationMode def nms(x, t, s): @@ -123,6 +124,8 @@ class HedAnnotator(BaseAnnotator, metaclass=ABCMeta): if len(image.shape) == 3: image = rearrange(image, 'h w c -> 1 c h w') B, C, H, W = image.shape + elif len(image.shape) == 4: + B, C, H, W = image.shape else: raise "Unsurpport input image's shape" elif isinstance(image, np.ndarray): @@ -130,22 +133,22 @@ class HedAnnotator(BaseAnnotator, metaclass=ABCMeta): if len(image.shape) == 3: image = rearrange(image, 'h w c -> 1 c h w') B, C, H, W = image.shape + elif len(image.shape) == 4: + B, C, H, W = image.shape else: raise "Unsurpport input image's shape" else: raise "Unsurpport input image's type" + transform = torchvision.transforms.Resize( + (H, W), interpolation=InterpolationMode.BILINEAR, antialias=True) 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) + edges = [transform(e) for e in edges] + edges = torch.cat(edges, dim=1) + edges = 1 / (1 + + torch.exp(-torch.mean(edges, dim=1).type(torch.float))) + edges = edges.cpu().numpy() + edges = 255 - (edges * 255.0).clip(0, 255).astype(np.uint8) + return edges[..., None].repeat(3, -1) @staticmethod def get_config_template(): diff --git a/scepter/modules/annotator/midas/__init__.py b/scepter/modules/annotator/midas/__init__.py index e69de29..cc26a06 100644 --- a/scepter/modules/annotator/midas/__init__.py +++ b/scepter/modules/annotator/midas/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. diff --git a/scepter/modules/annotator/midas/api.py b/scepter/modules/annotator/midas/api.py index 490cd18..87beeb7 100644 --- a/scepter/modules/annotator/midas/api.py +++ b/scepter/modules/annotator/midas/api.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. # based on https://github.com/isl-org/MiDaS import cv2 diff --git a/scepter/modules/annotator/midas/base_model.py b/scepter/modules/annotator/midas/base_model.py index 68d985b..c51ac55 100644 --- a/scepter/modules/annotator/midas/base_model.py +++ b/scepter/modules/annotator/midas/base_model.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. import torch diff --git a/scepter/modules/annotator/midas/blocks.py b/scepter/modules/annotator/midas/blocks.py index 472a40e..8759490 100644 --- a/scepter/modules/annotator/midas/blocks.py +++ b/scepter/modules/annotator/midas/blocks.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. import torch import torch.nn as nn diff --git a/scepter/modules/annotator/midas/dpt_depth.py b/scepter/modules/annotator/midas/dpt_depth.py index 2c25e0d..a2db4a9 100644 --- a/scepter/modules/annotator/midas/dpt_depth.py +++ b/scepter/modules/annotator/midas/dpt_depth.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. import torch import torch.nn as nn diff --git a/scepter/modules/annotator/midas/midas_net.py b/scepter/modules/annotator/midas/midas_net.py index b041646..04878f4 100644 --- a/scepter/modules/annotator/midas/midas_net.py +++ b/scepter/modules/annotator/midas/midas_net.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. """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 diff --git a/scepter/modules/annotator/midas/midas_net_custom.py b/scepter/modules/annotator/midas/midas_net_custom.py index fcdf78d..7c5a354 100644 --- a/scepter/modules/annotator/midas/midas_net_custom.py +++ b/scepter/modules/annotator/midas/midas_net_custom.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. """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 diff --git a/scepter/modules/annotator/midas/transforms.py b/scepter/modules/annotator/midas/transforms.py index c1da433..5388362 100644 --- a/scepter/modules/annotator/midas/transforms.py +++ b/scepter/modules/annotator/midas/transforms.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. import math import cv2 diff --git a/scepter/modules/annotator/midas/utils.py b/scepter/modules/annotator/midas/utils.py index 6bf792a..8c703b1 100644 --- a/scepter/modules/annotator/midas/utils.py +++ b/scepter/modules/annotator/midas/utils.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. """Utils for monoDepth.""" import re import sys diff --git a/scepter/modules/annotator/midas/vit.py b/scepter/modules/annotator/midas/vit.py index 4729b4b..a85488b 100644 --- a/scepter/modules/annotator/midas/vit.py +++ b/scepter/modules/annotator/midas/vit.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. import math import types diff --git a/scepter/modules/annotator/midas_op.py b/scepter/modules/annotator/midas_op.py index af9e47a..f387f75 100644 --- a/scepter/modules/annotator/midas_op.py +++ b/scepter/modules/annotator/midas_op.py @@ -9,7 +9,6 @@ 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 diff --git a/scepter/modules/annotator/mlsd/__init__.py b/scepter/modules/annotator/mlsd/__init__.py index e69de29..cc26a06 100644 --- a/scepter/modules/annotator/mlsd/__init__.py +++ b/scepter/modules/annotator/mlsd/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. diff --git a/scepter/modules/annotator/mlsd/mbv2_mlsd_large.py b/scepter/modules/annotator/mlsd/mbv2_mlsd_large.py index 7555e93..b63d77e 100644 --- a/scepter/modules/annotator/mlsd/mbv2_mlsd_large.py +++ b/scepter/modules/annotator/mlsd/mbv2_mlsd_large.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. import torch import torch.nn as nn diff --git a/scepter/modules/annotator/mlsd/mbv2_mlsd_tiny.py b/scepter/modules/annotator/mlsd/mbv2_mlsd_tiny.py index 4e906c5..e55b1a7 100644 --- a/scepter/modules/annotator/mlsd/mbv2_mlsd_tiny.py +++ b/scepter/modules/annotator/mlsd/mbv2_mlsd_tiny.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. import torch import torch.nn as nn import torch.utils.model_zoo as model_zoo diff --git a/scepter/modules/annotator/mlsd/utils.py b/scepter/modules/annotator/mlsd/utils.py index 83bad84..e2ef712 100644 --- a/scepter/modules/annotator/mlsd/utils.py +++ b/scepter/modules/annotator/mlsd/utils.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. # modified by lihaoweicv # pytorch version diff --git a/scepter/modules/annotator/mlsd_op.py b/scepter/modules/annotator/mlsd_op.py index ec5f094..1c778c8 100644 --- a/scepter/modules/annotator/mlsd_op.py +++ b/scepter/modules/annotator/mlsd_op.py @@ -11,7 +11,6 @@ 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 diff --git a/scepter/modules/annotator/openpose.py b/scepter/modules/annotator/openpose.py index 69320ec..b95fd9e 100644 --- a/scepter/modules/annotator/openpose.py +++ b/scepter/modules/annotator/openpose.py @@ -15,13 +15,12 @@ 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 +from scipy.ndimage.filters import gaussian_filter +from skimage.measure import label os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE' diff --git a/scepter/modules/annotator/utils.py b/scepter/modules/annotator/utils.py index 89a25bd..900d563 100644 --- a/scepter/modules/annotator/utils.py +++ b/scepter/modules/annotator/utils.py @@ -37,30 +37,30 @@ class AnnotatorProcessor(): hed_cfg = { 'NAME': 'HedAnnotator', 'PRETRAINED_MODEL': - 'ms://damo/scepter_scedit@annotator/ckpts/ControlNetHED.pth', + 'ms://iic/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', + 'ms://iic/scepter_scedit@annotator/ckpts/body_pose_model.pth', 'HAND_MODEL_PATH': - 'ms://damo/scepter_scedit@annotator/ckpts/hand_pose_model.pth', + 'ms://iic/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', + 'ms://iic/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', + 'ms://iic/scepter_scedit@annotator/ckpts/mlsd_large_512_fp32.pth', 'INPUT_KEYS': ['img'], 'OUTPUT_KEYS': ['mlsd'] } diff --git a/scepter/modules/data/dataset/base_dataset.py b/scepter/modules/data/dataset/base_dataset.py index fa9dc8d..e985201 100644 --- a/scepter/modules/data/dataset/base_dataset.py +++ b/scepter/modules/data/dataset/base_dataset.py @@ -3,14 +3,13 @@ from abc import ABCMeta, abstractmethod -from torch.utils.data import Dataset - from scepter.modules.transform.registry import TRANSFORMS, build_pipeline from scepter.modules.utils.config import dict_to_yaml from scepter.modules.utils.distribute import we from scepter.modules.utils.file_system import FS from scepter.modules.utils.logger import get_logger from scepter.modules.utils.registry import old_python_version +from torch.utils.data import Dataset class BaseDataset(Dataset, metaclass=ABCMeta): diff --git a/scepter/modules/data/dataset/dataset.py b/scepter/modules/data/dataset/dataset.py index 9721406..22a6980 100644 --- a/scepter/modules/data/dataset/dataset.py +++ b/scepter/modules/data/dataset/dataset.py @@ -8,7 +8,6 @@ from collections.abc import Iterable import numpy as np import torchvision - 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 @@ -272,6 +271,11 @@ class Text2ImageDataset(BaseDataset): 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 [ + 'src_oss_key', 'src_path', 'src_img_path', + 'src_target_img_path' + ]: + item['meta']['src_path'] = os.path.join(path_prefix, value) elif key in ['width', 'height']: item['meta'][key] = int(value) else: diff --git a/scepter/modules/data/dataset/ms_dataset.py b/scepter/modules/data/dataset/ms_dataset.py index 12b29aa..ab656fb 100644 --- a/scepter/modules/data/dataset/ms_dataset.py +++ b/scepter/modules/data/dataset/ms_dataset.py @@ -133,9 +133,11 @@ class ImageTextPairMSDataset(BaseDataset): if ms_remap_path: def map_func(example): - example['Target:FILE'] = os.path.join(ms_remap_path, - example['Target:FILE']) - return example + return { + k: os.path.join(ms_remap_path, v) + if k.endswith(':FILE') else v + for k, v in example.items() + } self.data = self.data.ds_instance.map(map_func) self.real_number = len(self.data) @@ -152,6 +154,8 @@ class ImageTextPairMSDataset(BaseDataset): image_path = current_data['Target:FILE'] prompt = current_data['Prompt'] style = current_data['Style'] if 'Style' in current_data else '' + src_image_path = current_data[ + 'Source:FILE'] if 'Source:FILE' in current_data else '' # print(prompt, style) if self.replace_style and not style == '': prompt = prompt.replace(style, f'<{self.keywords_sign}>') @@ -166,6 +170,7 @@ class ImageTextPairMSDataset(BaseDataset): ret_item = { 'meta': { 'img_path': image_path, + 'src_path': src_image_path, 'data_key': style, 'data_num': self.real_number }, @@ -241,19 +246,18 @@ class ImageTextPairFolderDataset(BaseDataset): 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' + header = all_lines[0].split(',') 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] - }) + record = dict(zip(header, line.split(',', len(header) - 1))) + record = { + k: os.path.join(data_folder, v) if k.endswith(':FILE') else v + for k, v in record.items() + } + self.data.append(record) self.real_number = len(self.data) def __len__(self): @@ -268,6 +272,8 @@ class ImageTextPairFolderDataset(BaseDataset): image_path = current_data['Target:FILE'] prompt = current_data['Prompt'] style = current_data['Style'] if 'Style' in current_data else '' + src_image_path = current_data[ + 'Source:FILE'] if 'Source:FILE' in current_data else '' # print(prompt, style) if self.replace_style and not style == '': prompt = prompt.replace(style, f'<{self.keywords_sign}>') @@ -282,6 +288,7 @@ class ImageTextPairFolderDataset(BaseDataset): ret_item = { 'meta': { 'img_path': image_path, + 'src_path': src_image_path, 'data_key': style, 'data_num': self.real_number }, diff --git a/scepter/modules/data/dataset/registry.py b/scepter/modules/data/dataset/registry.py index b64d600..573c0a2 100644 --- a/scepter/modules/data/dataset/registry.py +++ b/scepter/modules/data/dataset/registry.py @@ -7,13 +7,12 @@ import re from functools import partial import torch -from torch.utils.data import DataLoader, DistributedSampler - from scepter.modules.data.sampler import (SAMPLERS, MixtureOfSamplers, MultiFoldDistributedSampler, MultiLevelBatchSampler) from scepter.modules.utils.registry import (Registry, deep_copy, old_python_version) +from torch.utils.data import DataLoader, DistributedSampler string_classes = (str, bytes) int_classes = (int, ) diff --git a/scepter/modules/data/sampler/base_sampler.py b/scepter/modules/data/sampler/base_sampler.py index 017f359..6982600 100644 --- a/scepter/modules/data/sampler/base_sampler.py +++ b/scepter/modules/data/sampler/base_sampler.py @@ -1,10 +1,9 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. -from torch.utils.data.sampler import Sampler - from scepter.modules.utils.config import dict_to_yaml from scepter.modules.utils.distribute import we +from torch.utils.data.sampler import Sampler class BaseSampler(Sampler): diff --git a/scepter/modules/data/sampler/sampler.py b/scepter/modules/data/sampler/sampler.py index b7c5899..50ea158 100644 --- a/scepter/modules/data/sampler/sampler.py +++ b/scepter/modules/data/sampler/sampler.py @@ -12,7 +12,6 @@ from typing import List, Optional import numpy as np import torch import torch.distributed as dist - from scepter.modules.data.sampler.base_sampler import BaseSampler from scepter.modules.data.sampler.registry import SAMPLERS from scepter.modules.data.utils.data_bucket import (BucketBatchIndex, diff --git a/scepter/modules/inference/control_inference.py b/scepter/modules/inference/control_inference.py index 10d8438..1d08e14 100644 --- a/scepter/modules/inference/control_inference.py +++ b/scepter/modules/inference/control_inference.py @@ -8,7 +8,6 @@ import torch import torch.nn as nn import torchvision.transforms as TT from PIL.Image import Image - from scepter.modules.model.registry import TUNERS from scepter.modules.utils.config import Config from scepter.modules.utils.distribute import we diff --git a/scepter/modules/inference/diffusion_inference.py b/scepter/modules/inference/diffusion_inference.py index 2b7314b..43ceac7 100644 --- a/scepter/modules/inference/diffusion_inference.py +++ b/scepter/modules/inference/diffusion_inference.py @@ -8,7 +8,6 @@ from collections import OrderedDict import torch import torch.nn.functional as F from PIL.Image import Image - 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, @@ -277,7 +276,7 @@ class DiffusionInference(): module = self.load(module) self.loaded_model[name] = module return module - elif module['device'] == 'cpu' or module['device'] == "offline": + elif module['device'] == 'cpu' or module['device'] == 'offline': module = self.load(module) return module else: @@ -629,7 +628,7 @@ class DiffusionInference(): }, { 'cond': refine_null_context }], - steps=value_input.get('sample_steps', 50), + steps=value_input.get('refine_sample_steps', 50), guide_scale=value_input.get('refine_guide_scale', 7.5), guide_rescale=value_input.get('refine_guide_rescale', 0.5), diff --git a/scepter/modules/inference/stylebooth_inference.py b/scepter/modules/inference/stylebooth_inference.py index b4182df..156bf02 100644 --- a/scepter/modules/inference/stylebooth_inference.py +++ b/scepter/modules/inference/stylebooth_inference.py @@ -120,7 +120,7 @@ class StyleboothInference(DiffusionInference): cat_uc=True, tuner_model=None, control_model=None, - stylebooth_state=False, + stylebooth_state=True, style_edit_image=None, style_exemplar_image=None, style_guide_scale_text=None, diff --git a/scepter/modules/inference/tuner_inference.py b/scepter/modules/inference/tuner_inference.py index ea7797c..79fbecb 100644 --- a/scepter/modules/inference/tuner_inference.py +++ b/scepter/modules/inference/tuner_inference.py @@ -7,7 +7,6 @@ import os import warnings import torch - from scepter.modules.utils.file_system import FS try: diff --git a/scepter/modules/model/backbone/autoencoder/ae_module.py b/scepter/modules/model/backbone/autoencoder/ae_module.py index 5ee854c..1066ed8 100644 --- a/scepter/modules/model/backbone/autoencoder/ae_module.py +++ b/scepter/modules/model/backbone/autoencoder/ae_module.py @@ -4,14 +4,13 @@ import torch import torch.nn as nn from einops import repeat -from torch.utils.checkpoint import checkpoint - from scepter.modules.model.backbone.autoencoder.ae_utils import ( XFORMERS_IS_AVAILBLE, AttnBlock, Downsample, MemoryEfficientAttention, Normalize, ResnetBlock, Upsample, nonlinearity) from scepter.modules.model.base_model import BaseModel from scepter.modules.model.registry import BACKBONES from scepter.modules.utils.config import dict_to_yaml +from torch.utils.checkpoint import checkpoint @BACKBONES.register_class() diff --git a/scepter/modules/model/backbone/image/mlp.py b/scepter/modules/model/backbone/image/mlp.py index 58f10df..b479425 100644 --- a/scepter/modules/model/backbone/image/mlp.py +++ b/scepter/modules/model/backbone/image/mlp.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. import torch.nn as nn - from scepter.modules.model.base_model import BaseModel from scepter.modules.model.registry import BACKBONES from scepter.modules.utils.config import dict_to_yaml diff --git a/scepter/modules/model/backbone/image/utils/clip.py b/scepter/modules/model/backbone/image/utils/clip.py index 702be1d..8d38ad7 100644 --- a/scepter/modules/model/backbone/image/utils/clip.py +++ b/scepter/modules/model/backbone/image/utils/clip.py @@ -3,14 +3,14 @@ from collections import OrderedDict from typing import List, Tuple, Union +from pkg_resources import packaging + import numpy as np import torch import torch.nn.functional as F -from pkg_resources import packaging -from torch import nn - from scepter.modules.model.backbone.image.utils.simple_tokenizer import \ SimpleTokenizer as _Tokenizer +from torch import nn _tokenizer = _Tokenizer() diff --git a/scepter/modules/model/backbone/image/vit_modify.py b/scepter/modules/model/backbone/image/vit_modify.py index 4e5d84b..7a3e72f 100644 --- a/scepter/modules/model/backbone/image/vit_modify.py +++ b/scepter/modules/model/backbone/image/vit_modify.py @@ -2,7 +2,6 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import torch import torch.nn as nn - from scepter.modules.model.backbone.image.utils.vit import ( MULTI_HEAD_VIT_MODEL, VIT, VIT_MODEL, MULTI_HEAD_VIT_MODEL_Split) from scepter.modules.model.base_model import BaseModel diff --git a/scepter/modules/model/backbone/unet/unet_module.py b/scepter/modules/model/backbone/unet/unet_module.py index 99caccb..67ccb27 100644 --- a/scepter/modules/model/backbone/unet/unet_module.py +++ b/scepter/modules/model/backbone/unet/unet_module.py @@ -6,7 +6,6 @@ from collections import OrderedDict import torch import torch.nn as nn - from scepter.modules.model.backbone.unet.unet_utils import ( BasicTransformerBlock, Downsample, ResBlock, SpatialTransformer, SpatialTransformerV2, Timestep, TimestepEmbedSequential, diff --git a/scepter/modules/model/backbone/unet/unet_utils.py b/scepter/modules/model/backbone/unet/unet_utils.py index bfe5307..738711f 100644 --- a/scepter/modules/model/backbone/unet/unet_utils.py +++ b/scepter/modules/model/backbone/unet/unet_utils.py @@ -6,16 +6,16 @@ import warnings from abc import abstractmethod from importlib import find_loader +from packaging import version + import numpy as np import torch import torch.nn as nn import torch.nn.functional as F import torchvision.transforms.functional as TF from einops import rearrange, repeat -from packaging import version -from torch.utils.checkpoint import checkpoint - from scepter.modules.model.utils.basic_utils import default, exists +from torch.utils.checkpoint import checkpoint try: import xformers diff --git a/scepter/modules/model/backbone/video/bricks/csn_branch.py b/scepter/modules/model/backbone/video/bricks/csn_branch.py index 57bef51..ce2a02b 100644 --- a/scepter/modules/model/backbone/video/bricks/csn_branch.py +++ b/scepter/modules/model/backbone/video/bricks/csn_branch.py @@ -2,7 +2,6 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import torch.nn as nn - from scepter.modules.model.backbone.video.bricks.base_branch import BaseBranch from scepter.modules.model.registry import BRICKS from scepter.modules.utils.config import Config, dict_to_yaml diff --git a/scepter/modules/model/backbone/video/bricks/non_local.py b/scepter/modules/model/backbone/video/bricks/non_local.py index 61cf92f..db3edac 100644 --- a/scepter/modules/model/backbone/video/bricks/non_local.py +++ b/scepter/modules/model/backbone/video/bricks/non_local.py @@ -5,7 +5,6 @@ import torch import torch.nn as nn import torch.nn.functional as F - from scepter.modules.model.backbone.video.bricks.visualize_3d_module import \ Visualize3DModule from scepter.modules.model.registry import BRICKS diff --git a/scepter/modules/model/backbone/video/bricks/r2d3d_branch.py b/scepter/modules/model/backbone/video/bricks/r2d3d_branch.py index d0386f8..024f0fd 100644 --- a/scepter/modules/model/backbone/video/bricks/r2d3d_branch.py +++ b/scepter/modules/model/backbone/video/bricks/r2d3d_branch.py @@ -2,7 +2,6 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import torch.nn as nn - from scepter.modules.model.backbone.video.bricks.base_branch import BaseBranch from scepter.modules.model.registry import BRICKS from scepter.modules.utils.config import Config, dict_to_yaml diff --git a/scepter/modules/model/backbone/video/bricks/r2plus1d_branch.py b/scepter/modules/model/backbone/video/bricks/r2plus1d_branch.py index e028ae8..da8783c 100644 --- a/scepter/modules/model/backbone/video/bricks/r2plus1d_branch.py +++ b/scepter/modules/model/backbone/video/bricks/r2plus1d_branch.py @@ -4,7 +4,6 @@ import math import torch.nn as nn - from scepter.modules.model.backbone.video.bricks.base_branch import BaseBranch from scepter.modules.model.registry import BRICKS from scepter.modules.utils.config import Config, dict_to_yaml diff --git a/scepter/modules/model/backbone/video/bricks/stems/base_2d_stem.py b/scepter/modules/model/backbone/video/bricks/stems/base_2d_stem.py index cfecd0b..8e17e01 100644 --- a/scepter/modules/model/backbone/video/bricks/stems/base_2d_stem.py +++ b/scepter/modules/model/backbone/video/bricks/stems/base_2d_stem.py @@ -2,7 +2,6 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import torch.nn as nn - from scepter.modules.model.backbone.video.bricks.visualize_3d_module import \ Visualize3DModule from scepter.modules.model.registry import STEMS diff --git a/scepter/modules/model/backbone/video/bricks/stems/base_3d_stem.py b/scepter/modules/model/backbone/video/bricks/stems/base_3d_stem.py index be7e64c..445d016 100644 --- a/scepter/modules/model/backbone/video/bricks/stems/base_3d_stem.py +++ b/scepter/modules/model/backbone/video/bricks/stems/base_3d_stem.py @@ -2,7 +2,6 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import torch.nn as nn - from scepter.modules.model.backbone.video.bricks.visualize_3d_module import \ Visualize3DModule from scepter.modules.model.registry import STEMS diff --git a/scepter/modules/model/backbone/video/bricks/stems/down_sample_stem.py b/scepter/modules/model/backbone/video/bricks/stems/down_sample_stem.py index cf3d332..f77e2b6 100644 --- a/scepter/modules/model/backbone/video/bricks/stems/down_sample_stem.py +++ b/scepter/modules/model/backbone/video/bricks/stems/down_sample_stem.py @@ -2,7 +2,6 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import torch.nn as nn - from scepter.modules.model.backbone.video.bricks.stems.base_3d_stem import \ Base3DStem from scepter.modules.model.registry import STEMS diff --git a/scepter/modules/model/backbone/video/bricks/stems/embedding_stem.py b/scepter/modules/model/backbone/video/bricks/stems/embedding_stem.py index 725a308..9f9ece5 100644 --- a/scepter/modules/model/backbone/video/bricks/stems/embedding_stem.py +++ b/scepter/modules/model/backbone/video/bricks/stems/embedding_stem.py @@ -2,7 +2,6 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import torch.nn as nn - from scepter.modules.model.backbone.video.bricks.visualize_3d_module import \ Visualize3DModule from scepter.modules.model.registry import STEMS diff --git a/scepter/modules/model/backbone/video/bricks/stems/r2plus1d_stem.py b/scepter/modules/model/backbone/video/bricks/stems/r2plus1d_stem.py index c1a5c69..2fea90b 100644 --- a/scepter/modules/model/backbone/video/bricks/stems/r2plus1d_stem.py +++ b/scepter/modules/model/backbone/video/bricks/stems/r2plus1d_stem.py @@ -4,7 +4,6 @@ import math import torch.nn as nn - from scepter.modules.model.backbone.video.bricks.stems.base_3d_stem import \ Base3DStem from scepter.modules.model.registry import STEMS diff --git a/scepter/modules/model/backbone/video/bricks/tada_conv.py b/scepter/modules/model/backbone/video/bricks/tada_conv.py index c673ab1..41716eb 100644 --- a/scepter/modules/model/backbone/video/bricks/tada_conv.py +++ b/scepter/modules/model/backbone/video/bricks/tada_conv.py @@ -8,7 +8,6 @@ from itertools import repeat import torch import torch.nn as nn import torch.nn.functional as F - from scepter.modules.model.backbone.video.bricks.base_branch import BaseBranch from scepter.modules.model.registry import BRICKS from scepter.modules.utils.config import Config, dict_to_yaml diff --git a/scepter/modules/model/backbone/video/bricks/transformer_branch.py b/scepter/modules/model/backbone/video/bricks/transformer_branch.py index 31314db..cf4d65d 100644 --- a/scepter/modules/model/backbone/video/bricks/transformer_branch.py +++ b/scepter/modules/model/backbone/video/bricks/transformer_branch.py @@ -22,7 +22,6 @@ import torch import torch.nn as nn import torch.nn.functional as F from einops import rearrange, repeat - from scepter.modules.model.backbone.video.bricks.visualize_3d_module import \ Visualize3DModule from scepter.modules.model.registry import BRICKS diff --git a/scepter/modules/model/backbone/video/bricks/visualize_3d_module.py b/scepter/modules/model/backbone/video/bricks/visualize_3d_module.py index c22f63e..066bde4 100644 --- a/scepter/modules/model/backbone/video/bricks/visualize_3d_module.py +++ b/scepter/modules/model/backbone/video/bricks/visualize_3d_module.py @@ -4,7 +4,6 @@ import os import torch.nn as nn - from scepter.modules.utils.config import dict_to_yaml diff --git a/scepter/modules/model/backbone/video/resnet_3d.py b/scepter/modules/model/backbone/video/resnet_3d.py index e5194b7..744ee22 100644 --- a/scepter/modules/model/backbone/video/resnet_3d.py +++ b/scepter/modules/model/backbone/video/resnet_3d.py @@ -2,7 +2,6 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import torch.nn as nn - from scepter.modules.model.backbone.video.bricks.non_local import NonLocal from scepter.modules.model.backbone.video.init_helper import \ _init_convnet_weights diff --git a/scepter/modules/model/backbone/video/video_transformer.py b/scepter/modules/model/backbone/video/video_transformer.py index 783cbde..d98fa3a 100644 --- a/scepter/modules/model/backbone/video/video_transformer.py +++ b/scepter/modules/model/backbone/video/video_transformer.py @@ -33,7 +33,6 @@ import torch import torch.nn as nn import torch.nn.functional from einops import rearrange - from scepter.modules.model.backbone.video.init_helper import ( _init_transformer_weights, trunc_normal_) from scepter.modules.model.registry import BACKBONES, BRICKS, STEMS diff --git a/scepter/modules/model/base_model.py b/scepter/modules/model/base_model.py index 6adf8c1..6685a2a 100644 --- a/scepter/modules/model/base_model.py +++ b/scepter/modules/model/base_model.py @@ -3,7 +3,6 @@ import copy import torch.nn as nn - from scepter.modules.utils.config import dict_to_yaml from scepter.modules.utils.distribute import gather_data, we from scepter.modules.utils.probe import (ProbeData, merge_gathered_probe, diff --git a/scepter/modules/model/embedder/embedder.py b/scepter/modules/model/embedder/embedder.py index fc28d72..3000e35 100644 --- a/scepter/modules/model/embedder/embedder.py +++ b/scepter/modules/model/embedder/embedder.py @@ -11,8 +11,6 @@ import torch import torch.nn as nn import torch.utils.dlpack from einops import rearrange -from torch.utils.checkpoint import checkpoint - # to check from scepter.modules.model.backbone.unet.unet_utils import Timestep from scepter.modules.model.registry import EMBEDDERS @@ -20,6 +18,7 @@ from scepter.modules.model.utils.basic_utils import expand_dims_like from scepter.modules.utils.config import dict_to_yaml from scepter.modules.utils.distribute import we from scepter.modules.utils.file_system import FS +from torch.utils.checkpoint import checkpoint from .base_embedder import BaseEmbedder from .resampler import Resampler diff --git a/scepter/modules/model/head/classifier_head.py b/scepter/modules/model/head/classifier_head.py index 00cdb85..5451c40 100644 --- a/scepter/modules/model/head/classifier_head.py +++ b/scepter/modules/model/head/classifier_head.py @@ -7,11 +7,10 @@ from collections import OrderedDict import torch import torch.nn as nn import torch.nn.functional as F -from torch.nn.parameter import Parameter - from scepter.modules.model.base_model import BaseModel from scepter.modules.model.registry import HEADS from scepter.modules.utils.config import dict_to_yaml +from torch.nn.parameter import Parameter @HEADS.register_class() diff --git a/scepter/modules/model/loss/base_losses.py b/scepter/modules/model/loss/base_losses.py index 181f72b..3fb35fe 100644 --- a/scepter/modules/model/loss/base_losses.py +++ b/scepter/modules/model/loss/base_losses.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. -import torch.nn as nn from packaging import version -from torch.version import __version__ as torch_version +import torch.nn as nn from scepter.modules.model.registry import LOSSES from scepter.modules.utils.config import dict_to_yaml +from torch.version import __version__ as torch_version @LOSSES.register_class() diff --git a/scepter/modules/model/loss/rec_loss.py b/scepter/modules/model/loss/rec_loss.py index 75a9452..afeaeac 100644 --- a/scepter/modules/model/loss/rec_loss.py +++ b/scepter/modules/model/loss/rec_loss.py @@ -1,10 +1,9 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. import torch -from torch import nn - from scepter.modules.model.registry import LOSSES from scepter.modules.utils.config import dict_to_yaml +from torch import nn @LOSSES.register_class() diff --git a/scepter/modules/model/metric/classification.py b/scepter/modules/model/metric/classification.py index fb83ebc..54673ec 100644 --- a/scepter/modules/model/metric/classification.py +++ b/scepter/modules/model/metric/classification.py @@ -5,7 +5,6 @@ from collections import OrderedDict import numpy as np import torch - from scepter.modules.model.metric.base_metric import BaseMetric from scepter.modules.model.metric.registry import METRICS from scepter.modules.utils.config import dict_to_yaml diff --git a/scepter/modules/model/neck/global_average_pooling.py b/scepter/modules/model/neck/global_average_pooling.py index 41da23c..be7d223 100644 --- a/scepter/modules/model/neck/global_average_pooling.py +++ b/scepter/modules/model/neck/global_average_pooling.py @@ -2,7 +2,6 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import torch.nn as nn - from scepter.modules.model.base_model import BaseModel from scepter.modules.model.registry import NECKS from scepter.modules.utils.config import dict_to_yaml diff --git a/scepter/modules/model/network/autoencoder/ae_kl.py b/scepter/modules/model/network/autoencoder/ae_kl.py index bd88d14..19a90a5 100644 --- a/scepter/modules/model/network/autoencoder/ae_kl.py +++ b/scepter/modules/model/network/autoencoder/ae_kl.py @@ -5,7 +5,6 @@ from collections import OrderedDict import numpy as np import torch - from scepter.modules.model.network.train_module import TrainModule from scepter.modules.model.registry import BACKBONES, LOSSES, MODELS from scepter.modules.utils.config import dict_to_yaml diff --git a/scepter/modules/model/network/classifier.py b/scepter/modules/model/network/classifier.py index 979bd6a..2656178 100644 --- a/scepter/modules/model/network/classifier.py +++ b/scepter/modules/model/network/classifier.py @@ -1,17 +1,16 @@ # -*- coding: utf-8 -*- -# Copyright 2021 Alibaba Group Holding Limited. All Rights Reserved. +# Copyright (c) Alibaba, Inc. and its affiliates. from collections import OrderedDict from functools import partial import torch.nn as nn -from torch.nn.functional import sigmoid, softmax - from scepter.modules.model.metric.registry import METRICS from scepter.modules.model.network.train_module import TrainModule from scepter.modules.model.registry import (BACKBONES, HEADS, LOSSES, MODELS, NECKS) from scepter.modules.utils.config import Config, dict_to_yaml +from torch.nn.functional import sigmoid, softmax _ACTIVATE_MAPPER = {'softmax': partial(softmax, dim=1), 'sigmoid': sigmoid} diff --git a/scepter/modules/model/network/diffusion/diffusion.py b/scepter/modules/model/network/diffusion/diffusion.py index bc98256..48405fe 100644 --- a/scepter/modules/model/network/diffusion/diffusion.py +++ b/scepter/modules/model/network/diffusion/diffusion.py @@ -10,10 +10,12 @@ import random import torch from .schedules import karras_schedule -from .solvers import (sample_ddim, sample_dpm_2, sample_dpm_2_ancestral, - sample_dpmpp_2m, sample_dpmpp_2m_sde, - sample_dpmpp_2s_ancestral, sample_dpmpp_sde, - sample_euler, sample_euler_ancestral, sample_heun) +from .solvers import ( + sample_ddim, sample_dpm_2, sample_dpm_2_ancestral, sample_dpmpp_2m, + sample_dpmpp_2m_sde, sample_dpmpp_2m_sde_lcm, sample_dpmpp_2s_ancestral, + sample_dpmpp_sde, sample_euler, sample_euler_ancestral, sample_heun, + sample_onestep, stochastic_iterative_sampler, + stochastic_iterative_sampler2, stochastic_iterative_sampler3) __all__ = ['GaussianDiffusion'] @@ -427,7 +429,12 @@ class GaussianDiffusion(object): 'dpmpp_2s_ancestral_karras': sample_dpmpp_2s_ancestral, 'dpmpp_2m_karras': sample_dpmpp_2m, 'dpmpp_sde_karras': sample_dpmpp_sde, - 'dpmpp_2m_sde_karras': sample_dpmpp_2m_sde + 'dpmpp_2m_sde_karras': sample_dpmpp_2m_sde, + 'onestep': sample_onestep, + 'multistep': stochastic_iterative_sampler, + 'multistep2': stochastic_iterative_sampler2, + 'multistep3': stochastic_iterative_sampler3, + 'dpmpp_2m_sde_lcm': sample_dpmpp_2m_sde_lcm, }[solver] # options @@ -620,6 +627,44 @@ class GaussianDiffusion(object): | torch.isinf(log_sigma)] = float('inf') return log_sigma.exp() + @torch.no_grad() + def stochastic_encode(self, x0, t, steps): + # fast, but does not allow for exact reconstruction + # t serves as an index to gather the correct alphas + + t_max = None + t_min = None + + # discretization method + discretization = 'trailing' if self.prediction_type == 'v' else 'leading' + + # timesteps + if isinstance(steps, int): + t_max = self.num_timesteps - 1 if t_max is None else t_max + t_min = 0 if t_min is None else t_min + steps = discretize_timesteps(t_max, t_min, steps, discretization) + steps = torch.as_tensor(steps).round().long().flip(0).to(x0.device) + # steps = torch.as_tensor(steps).round().long().to(x0.device) + + # self.alphas_bar = torch.cumprod(1 - self.sigmas ** 2, dim=0) + # print('sigma: ', self.sigmas, len(self.sigmas)) + # print('alpha_bar: ', self.alphas_bar, len(self.alphas_bar)) + # print('steps: ', steps, len(steps)) + # sqrt_alphas_cumprod = torch.sqrt(self.alphas_bar).to(x0.device)[steps] + # sqrt_one_minus_alphas_cumprod = torch.sqrt(1 - self.alphas_bar).to(x0.device)[steps] + + sqrt_alphas_cumprod = self.alphas.to(x0.device)[steps] + sqrt_one_minus_alphas_cumprod = self.sigmas.to(x0.device)[steps] + # print('sigma: ', self.sigmas, len(self.sigmas)) + # print('alpha: ', self.alphas, len(self.alphas)) + # print('steps: ', steps, len(steps)) + + noise = torch.randn_like(x0) + return ( + extract_into_tensor(sqrt_alphas_cumprod, t, x0.shape) * x0 + + extract_into_tensor(sqrt_one_minus_alphas_cumprod, t, x0.shape) * + noise) + def extract_into_tensor(a, t, x_shape): b, *_ = t.shape @@ -642,3 +687,19 @@ def discretize_timesteps(t_max, t_min, steps, discretization): raise NotImplementedError( f'{discretization} discretization not implemented') return steps.clamp_(t_min, t_max) + + +def get_scalings_for_boundary_condition(sigma): + sigma_data = 0.5 + c_skip = (1 - + sigma**2)**0.5 * sigma_data**2 / (sigma**2 + + (1 - sigma**2) * sigma_data**2) + c_out = (sigma * sigma_data / (sigma**2 + + (1 - sigma**2) * sigma_data**2)**0.5) + return c_skip, c_out + + +def v_to_x0(v, t, x_t, diffusion): + sigmas = _i(diffusion.sigmas, t, v) + alphas = _i(diffusion.alphas, t, v) + return alphas * x_t - sigmas * v diff --git a/scepter/modules/model/network/diffusion/solvers.py b/scepter/modules/model/network/diffusion/solvers.py index ab4bf22..437da91 100644 --- a/scepter/modules/model/network/diffusion/solvers.py +++ b/scepter/modules/model/network/diffusion/solvers.py @@ -12,13 +12,17 @@ q(x_t | x_0) = N(x_t | alpha_t x_0, sigma_t^2 I), where 0 <= sigma_t <= 1 and alpha_t^2 = 1 - sigma_t^2. """ -import torch from tqdm.auto import trange +import torch + __all__ = [ 'sample_euler', 'sample_euler_ancestral', 'sample_heun', 'sample_dpm_2', 'sample_dpm_2_ancestral', 'sample_dpmpp_2s_ancestral', 'sample_dpmpp_sde', - 'sample_dpmpp_2m', 'sample_dpmpp_2m_sde', 'sample_ddim' + 'sample_dpmpp_2m', 'sample_dpmpp_2m_sde', 'sample_ddim', + 'sample_dpmpp_2m_sde_lcm', 'sample_onestep', + 'stochastic_iterative_sampler', 'stochastic_iterative_sampler2', + 'stochastic_iterative_sampler3' ] # -------------------- variation exploding (VE) solver --------------------# @@ -630,3 +634,183 @@ def sample_img2img_euler_ancestral(noise, if sigmas[i + 1] > 0: x = x + torch.randn_like(x) * s_noise * sigma_up return x + + +# --------- LCM ------------ + + +@torch.no_grad() +def sample_dpmpp_2m_sde_lcm(noise, + model, + sigmas, + eta=1., + s_noise=1., + solver_type='midpoint', + show_progress=True, + total_sample_steps=50, + sample_steps=5, + **kwargs): + """ + DPM-Solver++ (2M) SDE. + """ + assert solver_type in {'heun', 'midpoint'} + + dm_steps = sample_steps + x = noise * (sigmas[-dm_steps - 1]**2 + 1)**0.5 + sigma_min, sigma_max = sigmas[sigmas > 0].min(), sigmas[ + sigmas < float('inf')].max() + noise_sampler = BrownianTreeNoiseSampler(x, sigma_min, sigma_max) + old_denoised = None + h_last = None + + for i in trange(len(sigmas) - dm_steps - 1, + len(sigmas) - 1, + disable=not show_progress): + if sigmas[i] == float('inf'): + # Euler method + denoised = model(noise, sigmas[i]) + x = denoised + sigmas[i + 1] * noise + else: + _, c_in = get_scalings(sigmas[i]) + denoised = model(x * c_in, sigmas[i]) + if sigmas[i + 1] == 0: + # Denoising step + x = denoised + else: + # DPM-Solver++(2M) SDE + t, s = -sigmas[i].log(), -sigmas[i + 1].log() + h = s - t + eta_h = eta * h + + x = sigmas[i + 1] / sigmas[i] * (-eta_h).exp() * x + \ + (-h - eta_h).expm1().neg() * denoised + + if old_denoised is not None: + r = h_last / h + if solver_type == 'heun': + x = x + ((-h - eta_h).expm1().neg() / (-h - eta_h) + 1) * \ + (1 / r) * (denoised - old_denoised) + elif solver_type == 'midpoint': + x = x + 0.5 * (-h - eta_h).expm1().neg() * \ + (1 / r) * (denoised - old_denoised) + + x = x + noise_sampler(sigmas[i], sigmas[i + 1]) * sigmas[ + i + 1] * (-2 * eta_h).expm1().neg().sqrt() * s_noise + + old_denoised = denoised + h_last = h + return x + + +@torch.no_grad() +def sample_onestep(noise, model, sigmas, show_progress=True, **kwargs): + """ + CM one step solver. + """ + x = noise + denoised = model(x, sigmas[0]) + return denoised + + +@torch.no_grad() +def stochastic_iterative_sampler(noise, + model, + sigmas, + show_progress=True, + **kwargs): + """ + CM multiple steps solver. + """ + x = noise + sigmas_vp = (sigmas**2 / (1 + sigmas**2))**0.5 + sigmas_vp[sigmas == float('inf')] = 1. + for i in trange(len(sigmas) - 1, disable=not show_progress): + denoised = model(x, sigmas[i]) + + sigma = sigmas_vp[i + 1] + alpha = torch.sqrt(1 - sigma**2) + noises = torch.randn_like(x) + x = alpha * denoised + sigma * noises + return x + + +@torch.no_grad() +def stochastic_iterative_sampler2(noise, + model, + sigmas, + show_progress=True, + repeat=1, + ema=0.05, + **kwargs): + """ + CM multiple steps solver. + """ + # denoised_s = [] + # for _ in range(repeat): + # noise = torch.randn_like(noise) + # denoised_s.append(model(noise, sigmas[0])) + + # denoised_s = torch.cat(denoised_s, dim = 0) + # denoised = torch.mean(denoised_s, dim=0, keepdim=True) + denoised = model(noise, sigmas[0]) + denoised_ema = denoised + + sigmas_vp = (sigmas**2 / (1 + sigmas**2))**0.5 + sigmas_vp[sigmas == float('inf')] = 1. + for i in trange(1, len(sigmas) - 1, disable=not show_progress): + sigma = sigmas_vp[i] + alpha = torch.sqrt(1 - sigma**2) + noise = torch.randn_like(noise) + x = alpha * denoised + sigma * noise + denoised = model(x, sigmas[i]) + denoised_ema = ema * denoised_ema + (1.0 - ema) * denoised + return denoised_ema + + +@torch.no_grad() +def stochastic_iterative_sampler3(noise, + model, + sigmas, + show_progress=True, + repeat=1, + solver_eta=0.2, + solver_ema=0.05, + **kwargs): + """ + CM multiple steps solver. + """ + eta = solver_eta + ema = solver_ema + # denoised_s = [] + # for _ in range(repeat): + # noise = torch.randn_like(noise) + # denoised_s.append(model(noise, sigmas[0])) + + # denoised_s = torch.cat(denoised_s, dim = 0) + # denoised = torch.mean(denoised_s, dim=0, keepdim=True) + denoised = model(noise, sigmas[0]) + denoised_ema = denoised + eta = float(eta) + + sigmas_vp = (sigmas**2 / (1 + sigmas**2))**0.5 + sigmas_vp[sigmas == float('inf')] = 1. + noises = [ + noise.clone(), + ] + for i in trange(1, len(sigmas) - 1, disable=not show_progress): + sigma = sigmas_vp[i] + alpha = torch.sqrt(1 - sigma**2) + # x = alpha * denoised + sigma * torch.randn_like(noise) + # x = alpha * denoised + sigma * (eta * noise + (1 - eta ** 2) ** 0.5 * torch.randn_like(noise)) + # eta = 0.2*sigma / (sigma + 1.0) + # noise = eta * noise + (1 - eta ** 2) ** 0.5 * torch.randn_like(noise) + noise2 = 0 + for n in noises: + noise2 += eta * n + noise2 += (1 - (eta * len(noises))**2)**0.5 * torch.randn_like(noise) + noises.append(noise2.clone()) + # noise = torch.randn_like(noise) + x = alpha * denoised + sigma * noise2 + denoised = model(x, sigmas[i]) + denoised_ema = ema * denoised_ema + (1.0 - ema) * denoised + return denoised_ema diff --git a/scepter/modules/model/network/ldm/__init__.py b/scepter/modules/model/network/ldm/__init__.py index bb8d1a9..9f8f971 100644 --- a/scepter/modules/model/network/ldm/__init__.py +++ b/scepter/modules/model/network/ldm/__init__.py @@ -1,6 +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_edit import LatentDiffusionEdit from scepter.modules.model.network.ldm.ldm_sce import ( LatentDiffusionSCEControl, LatentDiffusionSCETuning, LatentDiffusionXLSCEControl, LatentDiffusionXLSCETuning) diff --git a/scepter/modules/model/network/ldm/ldm.py b/scepter/modules/model/network/ldm/ldm.py index 4a6964f..492039a 100644 --- a/scepter/modules/model/network/ldm/ldm.py +++ b/scepter/modules/model/network/ldm/ldm.py @@ -5,7 +5,6 @@ import random from collections import OrderedDict import torch - from scepter.modules.model.network.diffusion.diffusion import GaussianDiffusion from scepter.modules.model.network.diffusion.schedules import noise_schedule from scepter.modules.model.network.train_module import TrainModule diff --git a/scepter/modules/model/network/ldm/ldm_edit.py b/scepter/modules/model/network/ldm/ldm_edit.py new file mode 100644 index 0000000..742f4b5 --- /dev/null +++ b/scepter/modules/model/network/ldm/ldm_edit.py @@ -0,0 +1,302 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import copy +import numbers +import random + +import numpy as np +import torch +from scepter.modules.model.network.ldm.ldm import LatentDiffusion +from scepter.modules.model.registry import MODELS +from scepter.modules.model.utils.basic_utils import default +from scepter.modules.utils.config import dict_to_yaml +from scepter.modules.utils.distribute import we + + +@MODELS.register_class() +class LatentDiffusionEdit(LatentDiffusion): + para_dict = { + 'CONCAT_NO_SCALE_FACTOR': { + 'value': False, + 'description': 'Whether concat input scaled after VAE.' + }, + 'I_ZERO': { + 'value': 0.0, + 'description': 'P-zero of concat image.' + }, + } + para_dict.update(LatentDiffusion.para_dict) + + def __init__(self, cfg, logger): + super().__init__(cfg, logger=logger) + self.concat_no_scale_factor = self.cfg.get('CONCAT_NO_SCALE_FACTOR', + False) + self.i_zero = self.cfg.get('I_ZERO', 0.0) + # # overwrite the original diffusion + # self.diffusion = GaussianDiffusion( + # sigmas=self.sigmas, prediction_type=self.parameterization) + + def forward_train(self, image=None, noise=None, prompt=None, **kwargs): + condition_attn = None + if 'condition_attn' in kwargs and kwargs['condition_attn'] is not None: + condition_attn = kwargs.pop('condition_attn') + if np.random.uniform() < self.i_zero: + condition_attn = torch.zeros_like(condition_attn) + + condition_cat = None + if 'condition_cat' in kwargs and kwargs['condition_cat'] is not None: + condition_cat = kwargs.pop('condition_cat') + if np.random.uniform() < self.i_zero: + condition_cat = torch.zeros_like(condition_cat) + + ############################### + x_start = self.encode_first_stage(image, **kwargs) + t = torch.randint(0, + self.num_timesteps, (x_start.shape[0], ), + device=x_start.device).long() + + context = {} + if prompt and self.cond_stage_model: + zeros = (torch.rand(len(prompt)) < self.p_zero).numpy().tolist() + prompt = [ + self.train_n_prompt if zeros[idx] else p + for idx, p in enumerate(prompt) + ] + self.register_probe({'after_prompt': prompt}) + with torch.autocast(device_type='cuda', enabled=False): + if condition_attn is None: + context['crossattn'] = self.encode_condition(prompt) + else: + image_feature = self.encode_condition(condition_attn, + type='image') + context['crossattn'] = self.encode_condition(prompt, + image_feature, + type='hybrid') + if isinstance(context['crossattn'], dict): + attn = context.pop('crossattn') + context.update(attn) + + if condition_cat is not None: + cat = self.encode_first_stage(condition_cat, **kwargs) + if self.concat_no_scale_factor: + cat /= self.scale_factor + context['concat'] = cat + + if 'hint' in kwargs and kwargs['hint'] is not None: + hint = kwargs.pop('hint') + context['hint'] = hint + + 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] + snrs = (alphas / sigmas).clamp(min=1e-20) + min_snrs = snrs.clamp(max=self.min_snr_gamma) + weights = min_snrs / snrs + 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, + **kwargs) + loss = loss * weights + loss = loss.mean() + ret = {'loss': loss, 'probe_data': {'prompt': prompt}} + # ret = {'loss': loss, 'probe_data': {'prompt': prompt, 'concat': condition_cat, 'attn': condition_attn}} + return ret + + @torch.no_grad() + @torch.autocast('cuda', dtype=torch.float16) + def forward_test(self, + prompt=None, + n_prompt=None, + sampler='ddim', + sample_steps=50, + seed=2023, + guide_scale=7.5, + guide_rescale=0.5, + discretization='trailing', + run_train_n=True, + **kwargs): + condition_attn = None + if 'condition_attn' in kwargs and kwargs['condition_attn'] is not None: + condition_attn = kwargs.pop('condition_attn') + + condition_cat = None + if 'condition_cat' in kwargs and kwargs['condition_cat'] is not None: + condition_cat = kwargs.pop('condition_cat') + + image = None + if 'image' in kwargs and kwargs['image'] is not None: + image = kwargs.pop('image') + + ############################### + g = torch.Generator(device=we.device_id) + seed = seed if seed >= 0 else random.randint(0, 2**32 - 1) + g.manual_seed(seed) + # torch.manual_seed(seed) + num_samples = len(prompt) + + # if 'dynamic_encode_text' in kwargs and kwargs.pop( + # 'dynamic_encode_text'): + # method = 'dynamic_encode_text' + # else: + # method = 'encode_text' + + n_prompt = default(n_prompt, [self.default_n_prompt] * len(prompt)) + assert isinstance(prompt, list) and \ + isinstance(n_prompt, list) and \ + len(prompt) == len(n_prompt) + + context = {} + with torch.autocast(device_type='cuda', enabled=False): + if condition_attn is None: + context['crossattn'] = self.encode_condition(prompt) + else: + image_feature = self.encode_condition(condition_attn, + type='image') + context['crossattn'] = self.encode_condition(prompt, + image_feature, + type='hybrid') + if isinstance(context['crossattn'], dict): + attn = context.pop('crossattn') + context.update(attn) + + null_context = {} + null_context['crossattn'] = self.encode_condition(n_prompt) + if isinstance(null_context['crossattn'], dict): + attn = null_context.pop('crossattn') + null_context.update(attn) + + if 'hint' in kwargs and kwargs['hint'] is not None: + hint = kwargs.pop('hint') + context['hint'] = hint + null_context['hint'] = hint + else: + hint = None + + model_kwargs = [{'cond': context}] + if condition_cat is not None: + cat = self.encode_first_stage(condition_cat, **kwargs) + if self.concat_no_scale_factor: + cat /= self.scale_factor + context['concat'] = cat + null_context['concat'] = torch.zeros_like(cat) + + mid_context = {} + mid_context.update(null_context) + mid_context.update({'concat': cat}) + model_kwargs.append({'cond': mid_context}) + model_kwargs.append({'cond': null_context}) + + if 'index' in kwargs: + kwargs.pop('index') + image_size = None + + if 'meta' in kwargs: + meta = kwargs.pop('meta') + if 'image_size' in meta: + h = int(meta['image_size'][0][0]) + w = int(meta['image_size'][1][0]) + image_size = [h, w] + if 'image_size' in kwargs: + image_size = kwargs.pop('image_size') + if condition_cat is not None: + image_size = condition_cat.shape[2:4] + 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, + width // self.size_factor, g) + # UNet use input n_prompt + samples = self.diffusion.sample(solver=sampler, + noise=noise, + model=self.model, + model_kwargs=model_kwargs, + steps=sample_steps, + guide_scale=guide_scale, + guide_rescale=guide_rescale, + discretization=discretization, + 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, + **kwargs) + x_samples = self.decode_first_stage(samples).float() + x_samples = torch.clamp((x_samples + 1.0) / 2.0, min=0.0, max=1.0) + if image is not None: + x_samples = torch.cat([image, x_samples], dim=-1) + if condition_attn is not None: + condition_attn = torch.clamp((condition_attn + 1.8) / 4, + min=0.0, + max=1.0) + x_samples = torch.cat([condition_attn, x_samples], dim=-1) + if condition_cat is not None: + condition_cat = torch.clamp((condition_cat + 1.0) / 2.0, + min=0.0, + max=1.0) + x_samples = torch.cat([condition_cat, x_samples], dim=-1) + # UNet use train n_prompt + # deleted! + train_n_prompt = ['' for _ in prompt] + t_x_samples = [None for _ in prompt] + + outputs = list() + for i, (p, n_p, tnp, img, t_img) in enumerate( + zip(prompt, n_prompt, train_n_prompt, x_samples, t_x_samples)): + one_tup = {'prompt': p, 'n_prompt': n_p, '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 + outputs.append(one_tup) + + return outputs + + def encode_condition(self, data, data2=None, type='text'): + assert hasattr(self, 'tokenizer') + if type == 'image' and ( + hasattr(self.cond_stage_model, 'build_new_tokens') + and not hasattr(self.cond_stage_model, 'new_tokens_to_ids')): + self.cond_stage_model.build_new_tokens(self.tokenizer) + + if type == 'text': + text = self.tokenizer(data).to(we.device_id) + return self.cond_stage_model.encode_text(text) + elif type == 'image': + return self.cond_stage_model.encode_image(data) + elif type == 'hybrid': + text = self.tokenizer(data).to(we.device_id) + return self.cond_stage_model.encode_text(text, data2) + + def save_pretrained(self, + *args, + destination=None, + prefix='', + keep_vars=False): + return self.model.state_dict(*args, + destination=destination, + keep_vars=keep_vars) + + def save_pretrained_config(self): + return copy.deepcopy(self.cfg.COND_STAGE_MODEL.cfg_dict) + + @staticmethod + def get_config_template(): + return dict_to_yaml('MODELS', + __class__.__name__, + LatentDiffusionEdit.para_dict, + set_name=True) diff --git a/scepter/modules/model/network/ldm/ldm_sce.py b/scepter/modules/model/network/ldm/ldm_sce.py index e398953..e60a371 100644 --- a/scepter/modules/model/network/ldm/ldm_sce.py +++ b/scepter/modules/model/network/ldm/ldm_sce.py @@ -5,7 +5,6 @@ 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 diff --git a/scepter/modules/model/network/ldm/ldm_xl.py b/scepter/modules/model/network/ldm/ldm_xl.py index 0730670..502ca11 100644 --- a/scepter/modules/model/network/ldm/ldm_xl.py +++ b/scepter/modules/model/network/ldm/ldm_xl.py @@ -6,7 +6,6 @@ from collections import OrderedDict import torch import torch.nn.functional as F - from scepter.modules.model.network.ldm import LatentDiffusion from scepter.modules.model.registry import BACKBONES, MODELS from scepter.modules.model.utils.basic_utils import default diff --git a/scepter/modules/model/network/train_module.py b/scepter/modules/model/network/train_module.py index b13439a..2248c92 100644 --- a/scepter/modules/model/network/train_module.py +++ b/scepter/modules/model/network/train_module.py @@ -4,7 +4,6 @@ from abc import ABCMeta, abstractmethod import torch - from scepter.modules.model.base_model import BaseModel from scepter.modules.utils.config import dict_to_yaml diff --git a/scepter/modules/model/tokenizer/tokenizer.py b/scepter/modules/model/tokenizer/tokenizer.py index 9a03a08..92c8d86 100644 --- a/scepter/modules/model/tokenizer/tokenizer.py +++ b/scepter/modules/model/tokenizer/tokenizer.py @@ -1,14 +1,13 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. import open_clip -from transformers import CLIPTokenizer as transformer_clip_tokenizer - from scepter.modules.model.registry import TOKENIZERS from scepter.modules.model.tokenizer import BaseTokenizer from scepter.modules.model.tokenizer.tokenizer_component import ( basic_clean, whitespace_clean) from scepter.modules.utils.config import dict_to_yaml from scepter.modules.utils.file_system import FS +from transformers import CLIPTokenizer as transformer_clip_tokenizer @TOKENIZERS.register_class() diff --git a/scepter/modules/model/tuner/sce/scetuning.py b/scepter/modules/model/tuner/sce/scetuning.py index 667aa6e..827b15d 100644 --- a/scepter/modules/model/tuner/sce/scetuning.py +++ b/scepter/modules/model/tuner/sce/scetuning.py @@ -4,7 +4,6 @@ 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 diff --git a/scepter/modules/model/tuner/sce/scetuning_component.py b/scepter/modules/model/tuner/sce/scetuning_component.py index c5520e6..acf77c0 100644 --- a/scepter/modules/model/tuner/sce/scetuning_component.py +++ b/scepter/modules/model/tuner/sce/scetuning_component.py @@ -3,7 +3,6 @@ import math import torch.nn as nn - from scepter.modules.model.tuner.tuner_utils import (choose_weight_type, get_weight_value) diff --git a/scepter/modules/opt/lr_schedulers/define_schedulers.py b/scepter/modules/opt/lr_schedulers/define_schedulers.py index b03bab5..764c9da 100644 --- a/scepter/modules/opt/lr_schedulers/define_schedulers.py +++ b/scepter/modules/opt/lr_schedulers/define_schedulers.py @@ -1,10 +1,9 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. -from torch.optim.lr_scheduler import _LRScheduler - from scepter.modules.opt.lr_schedulers.base_scheduler import BaseScheduler from scepter.modules.opt.lr_schedulers.registry import LR_SCHEDULERS from scepter.modules.utils.config import dict_to_yaml +from torch.optim.lr_scheduler import _LRScheduler class PolyLR(_LRScheduler): diff --git a/scepter/modules/opt/lr_schedulers/official_schedulers.py b/scepter/modules/opt/lr_schedulers/official_schedulers.py index 8b304db..70160c6 100644 --- a/scepter/modules/opt/lr_schedulers/official_schedulers.py +++ b/scepter/modules/opt/lr_schedulers/official_schedulers.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. import torch.optim.lr_scheduler as lr_sch - from scepter.modules.opt.lr_schedulers.base_scheduler import BaseScheduler from scepter.modules.opt.lr_schedulers.registry import LR_SCHEDULERS from scepter.modules.utils.config import dict_to_yaml diff --git a/scepter/modules/opt/lr_schedulers/warmup.py b/scepter/modules/opt/lr_schedulers/warmup.py index 97f30d0..f8ffe31 100644 --- a/scepter/modules/opt/lr_schedulers/warmup.py +++ b/scepter/modules/opt/lr_schedulers/warmup.py @@ -3,11 +3,10 @@ import math import torch.optim.lr_scheduler as lr_scheduler -from torch.optim.lr_scheduler import _LRScheduler - from scepter.modules.opt.lr_schedulers import LR_SCHEDULERS from scepter.modules.opt.lr_schedulers.base_scheduler import BaseScheduler from scepter.modules.utils.config import dict_to_yaml +from torch.optim.lr_scheduler import _LRScheduler @LR_SCHEDULERS.register_class() diff --git a/scepter/modules/opt/optimizers/official_optimizers.py b/scepter/modules/opt/optimizers/official_optimizers.py index 45909a4..f71aee1 100644 --- a/scepter/modules/opt/optimizers/official_optimizers.py +++ b/scepter/modules/opt/optimizers/official_optimizers.py @@ -2,7 +2,6 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import torch.optim as optim - from scepter.modules.opt.optimizers.base_optimizer import BaseOptimize from scepter.modules.opt.optimizers.registry import OPTIMIZERS from scepter.modules.utils.config import dict_to_yaml diff --git a/scepter/modules/solver/base_solver.py b/scepter/modules/solver/base_solver.py index c7b49ae..9fd18c9 100644 --- a/scepter/modules/solver/base_solver.py +++ b/scepter/modules/solver/base_solver.py @@ -8,8 +8,6 @@ from abc import ABCMeta from collections import OrderedDict, defaultdict import torch -from torch.nn.parallel import DistributedDataParallel - from scepter.modules.data.dataset import DATASETS from scepter.modules.model.base_model import BaseModel from scepter.modules.model.metric.registry import METRICS @@ -25,6 +23,7 @@ from scepter.modules.utils.file_system import FS from scepter.modules.utils.logger import get_logger, init_logger from scepter.modules.utils.probe import (ProbeData, merge_gathered_probe, register_data) +from torch.nn.parallel import DistributedDataParallel try: import pytorch_lightning as pl diff --git a/scepter/modules/solver/diffusion_solver.py b/scepter/modules/solver/diffusion_solver.py index 4997a81..03fba64 100644 --- a/scepter/modules/solver/diffusion_solver.py +++ b/scepter/modules/solver/diffusion_solver.py @@ -4,16 +4,11 @@ import copy import os from collections import OrderedDict, defaultdict +from tqdm import tqdm + import numpy as np import torch import torch.cuda.amp as amp -from torch.distributed.fsdp import (BackwardPrefetch, CPUOffload, - FullStateDictConfig, - FullyShardedDataParallel, MixedPrecision, - ShardingStrategy, StateDictType) -from torch.nn.parallel import DistributedDataParallel -from tqdm import tqdm - from scepter.modules.data.dataset import DATASETS from scepter.modules.opt.lr_schedulers import LR_SCHEDULERS from scepter.modules.opt.optimizers import OPTIMIZERS @@ -23,6 +18,11 @@ from scepter.modules.utils.config import Config, dict_to_yaml from scepter.modules.utils.data import transfer_data_to_cuda from scepter.modules.utils.distribute import we from scepter.modules.utils.probe import ProbeData +from torch.distributed.fsdp import (BackwardPrefetch, CPUOffload, + FullStateDictConfig, + FullyShardedDataParallel, MixedPrecision, + ShardingStrategy, StateDictType) +from torch.nn.parallel import DistributedDataParallel sharding_strategy_map = { 'full_shard': ShardingStrategy.FULL_SHARD, @@ -127,13 +127,7 @@ class LatentDiffusionSolver(BaseSolver): self.construct_model() self.construct_metrics() self.model_to_device() - if 'train' in self.datas and self.cfg.have('OPTIMIZER'): - if we.world_size > 1: - all_batch_size = self.datas['train'].batch_size * we.world_size - else: - all_batch_size = self.datas['train'].batch_size - self.cfg.OPTIMIZER.LEARNING_RATE *= all_batch_size - self.cfg.OPTIMIZER.LEARNING_RATE /= 640 + self.init_lr() self.init_opti() def construct_hook(self): @@ -184,6 +178,16 @@ class LatentDiffusionSolver(BaseSolver): def model_to_device(self): self.model = self.model.to(we.device_id) + def init_lr(self): + rescale_lr = self.cfg.get('RESCALE_LR', True) + if rescale_lr and 'train' in self.datas and self.cfg.have('OPTIMIZER'): + if we.world_size > 1: + all_batch_size = self.datas['train'].batch_size * we.world_size + else: + all_batch_size = self.datas['train'].batch_size + self.cfg.OPTIMIZER.LEARNING_RATE *= all_batch_size + self.cfg.OPTIMIZER.LEARNING_RATE /= 640 + def init_opti(self): if hasattr(self.model, 'ignored_parameters'): train_params, ignored_params = self.model.parameters( @@ -367,6 +371,7 @@ class LatentDiffusionSolver(BaseSolver): if 'eval' in self._mode_set and (self.eval_interval > 0 and step == self.max_steps - 1): self.run_eval() + self.train_mode() self.after_all_iter(self.hooks_dict[self._mode]) @torch.no_grad() diff --git a/scepter/modules/solver/hooks/backward.py b/scepter/modules/solver/hooks/backward.py index 08e5e8e..d9c087a 100644 --- a/scepter/modules/solver/hooks/backward.py +++ b/scepter/modules/solver/hooks/backward.py @@ -3,7 +3,6 @@ import warnings import torch - from scepter.modules.solver.hooks.hook import Hook from scepter.modules.solver.hooks.registry import HOOKS from scepter.modules.utils.config import dict_to_yaml diff --git a/scepter/modules/solver/hooks/checkpoint.py b/scepter/modules/solver/hooks/checkpoint.py index ef3f674..856ceb7 100644 --- a/scepter/modules/solver/hooks/checkpoint.py +++ b/scepter/modules/solver/hooks/checkpoint.py @@ -3,19 +3,17 @@ 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 from scepter.modules.utils.config import dict_to_yaml from scepter.modules.utils.distribute import we from scepter.modules.utils.file_system import FS +from swift import push_to_hub _DEFAULT_CHECKPOINT_PRIORITY = 300 @@ -51,10 +49,8 @@ class CheckpointHook(Hook): 'If save the best model, which order should be sorted, +/-!' }, 'DISABLE_SNAPSHOT': { - 'value': - False, - 'description': - 'Skip to save snapshot checkpoint.' + 'value': False, + 'description': 'Skip to save snapshot checkpoint.' } }] @@ -223,47 +219,13 @@ 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=self.hub_private) - 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) + with FS.get_dir_to_local_dir(self.last_ckpt) as local_dir: + push_to_hub(repo_name=self.hub_model_id, + output_dir=local_dir, + private=self.hub_private) @staticmethod def get_config_template(): diff --git a/scepter/modules/solver/hooks/data_probe.py b/scepter/modules/solver/hooks/data_probe.py index b51aaeb..b0de316 100644 --- a/scepter/modules/solver/hooks/data_probe.py +++ b/scepter/modules/solver/hooks/data_probe.py @@ -4,7 +4,6 @@ import json import os import torch - from scepter.modules.solver.hooks.hook import Hook from scepter.modules.solver.hooks.registry import HOOKS from scepter.modules.utils.config import dict_to_yaml @@ -34,6 +33,7 @@ class ProbeDataHook(Hook): self.save_name_prefix = cfg.get('SAVE_NAME_PREFIX', 'step') self.save_probe_prefix = cfg.get('SAVE_PROBE_PREFIX', None) self.save_last = cfg.get('SAVE_LAST', False) + self.save_image_postfix = cfg.get('SAVE_IMAGE_POSTFIX', 'jpg') def before_all_iter(self, solver): pass @@ -58,7 +58,7 @@ class ProbeDataHook(Hook): ret_prefix = os.path.join( save_folder, k.replace('/', '_') + f'_step_{solver.total_iter}') - ret_one = v.to_log(ret_prefix) + ret_one = v.to_log(ret_prefix, self.save_image_postfix) if (isinstance(ret_one, list) or isinstance(ret_one, dict)) and len(ret_one) < 1: continue @@ -90,7 +90,7 @@ class ProbeDataHook(Hook): ret_prefix = os.path.join( save_folder, k.replace('/', '_') + f'_step_{step}') - ret_one = v.to_log(ret_prefix) + ret_one = v.to_log(ret_prefix, self.save_image_postfix) if (isinstance(ret_one, list) or isinstance(ret_one, dict)) and len(ret_one) < 1: continue diff --git a/scepter/modules/solver/hooks/ema.py b/scepter/modules/solver/hooks/ema.py index 0d3b042..e3e5711 100644 --- a/scepter/modules/solver/hooks/ema.py +++ b/scepter/modules/solver/hooks/ema.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. import torch -from torch.distributed.fsdp import (FullStateDictConfig, - FullyShardedDataParallel, StateDictType) - from scepter.modules.solver.hooks.hook import Hook from scepter.modules.solver.hooks.registry import HOOKS from scepter.modules.utils.config import dict_to_yaml from scepter.modules.utils.distribute import we +from torch.distributed.fsdp import (FullStateDictConfig, + FullyShardedDataParallel, StateDictType) @HOOKS.register_class() diff --git a/scepter/modules/solver/hooks/log.py b/scepter/modules/solver/hooks/log.py index 4ea3b4c..2ef47f1 100644 --- a/scepter/modules/solver/hooks/log.py +++ b/scepter/modules/solver/hooks/log.py @@ -11,7 +11,6 @@ from typing import Optional import numpy as np import torch - from scepter.modules.solver.hooks.hook import Hook from scepter.modules.solver.hooks.registry import HOOKS from scepter.modules.utils.config import dict_to_yaml diff --git a/scepter/modules/solver/hooks/safetensors.py b/scepter/modules/solver/hooks/safetensors.py index 5abfb4d..73925f0 100644 --- a/scepter/modules/solver/hooks/safetensors.py +++ b/scepter/modules/solver/hooks/safetensors.py @@ -4,7 +4,6 @@ import os.path as osp import torch from safetensors.torch import save_file - from scepter.modules.solver.hooks.hook import Hook from scepter.modules.solver.hooks.registry import HOOKS from scepter.modules.utils.config import dict_to_yaml diff --git a/scepter/modules/solver/train_val_solver.py b/scepter/modules/solver/train_val_solver.py index 25e65b6..3e0af6f 100644 --- a/scepter/modules/solver/train_val_solver.py +++ b/scepter/modules/solver/train_val_solver.py @@ -4,7 +4,6 @@ import os.path as osp from collections import OrderedDict, defaultdict import torch - from scepter.modules.solver.base_solver import BaseSolver from scepter.modules.solver.registry import SOLVERS from scepter.modules.utils.config import dict_to_yaml diff --git a/scepter/modules/transform/augmention.py b/scepter/modules/transform/augmention.py index c419443..89926b3 100644 --- a/scepter/modules/transform/augmention.py +++ b/scepter/modules/transform/augmention.py @@ -5,14 +5,13 @@ import random # https://github.com/TengdaHan/DPC/blob/master/utils/augmentation.py import torch -from torchvision.transforms import Compose, Lambda - from scepter.modules.transform.image import ImageTransform from scepter.modules.transform.registry import TRANSFORMS from scepter.modules.transform.utils import (BACKEND_CV2, BACKEND_PILLOW, BACKEND_TORCHVISION, TORCHVISION_CAPABILITY) from scepter.modules.utils.config import dict_to_yaml +from torchvision.transforms import Compose, Lambda if TORCHVISION_CAPABILITY: BACKENDS = (BACKEND_PILLOW, BACKEND_CV2, BACKEND_TORCHVISION) diff --git a/scepter/modules/transform/image.py b/scepter/modules/transform/image.py index fea07d0..7208bb9 100644 --- a/scepter/modules/transform/image.py +++ b/scepter/modules/transform/image.py @@ -8,7 +8,6 @@ import opencv_transforms.transforms as cv2_transforms import torch import torchvision.transforms as transforms import torchvision.transforms.functional as TF - from scepter.modules.transform.registry import TRANSFORMS from scepter.modules.transform.utils import ( BACKEND_CV2, BACKEND_PILLOW, BACKEND_TORCHVISION, INPUT_CV2_TYPE_WARNING, diff --git a/scepter/modules/transform/io.py b/scepter/modules/transform/io.py index b49cc02..76c7d34 100644 --- a/scepter/modules/transform/io.py +++ b/scepter/modules/transform/io.py @@ -7,7 +7,6 @@ import cv2 import numpy as np import torch from PIL import Image, ImageFile - from scepter.modules.transform.registry import TRANSFORMS from scepter.modules.utils.config import dict_to_yaml from scepter.modules.utils.distribute import we diff --git a/scepter/modules/transform/io_video.py b/scepter/modules/transform/io_video.py index b0a7170..267c39b 100644 --- a/scepter/modules/transform/io_video.py +++ b/scepter/modules/transform/io_video.py @@ -8,7 +8,6 @@ import threading import numpy as np import torch - from scepter.modules.transform import LoadImageFromFile from scepter.modules.transform.registry import TRANSFORMS from scepter.modules.utils.config import dict_to_yaml diff --git a/scepter/modules/transform/tensor.py b/scepter/modules/transform/tensor.py index ea281e2..044ff60 100644 --- a/scepter/modules/transform/tensor.py +++ b/scepter/modules/transform/tensor.py @@ -4,7 +4,6 @@ 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 from scepter.modules.utils.distribute import we diff --git a/scepter/modules/transform/transform_xl.py b/scepter/modules/transform/transform_xl.py index b3ba963..ec95ea9 100644 --- a/scepter/modules/transform/transform_xl.py +++ b/scepter/modules/transform/transform_xl.py @@ -7,7 +7,6 @@ import opencv_transforms.functional as cv2_TF import torch import torchvision.transforms.functional as TF from PIL.Image import Image - from scepter.modules.transform import TRANSFORMS, ImageTransform from scepter.modules.transform.image import BACKENDS from scepter.modules.transform.utils import BACKEND_PILLOW, BACKEND_TORCHVISION diff --git a/scepter/modules/transform/utils.py b/scepter/modules/transform/utils.py index f842915..f1d7827 100644 --- a/scepter/modules/transform/utils.py +++ b/scepter/modules/transform/utils.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. +from packaging import version + import cv2 import numpy as np import torch -from packaging import version from PIL import Image from torchvision.version import __version__ as tv_version diff --git a/scepter/modules/transform/video.py b/scepter/modules/transform/video.py index af5d00a..24212fa 100644 --- a/scepter/modules/transform/video.py +++ b/scepter/modules/transform/video.py @@ -3,18 +3,18 @@ import random +from packaging import version + import numpy as np import torch import torchvision.transforms.functional as functional import torchvision.transforms.transforms as transforms -from packaging import version -from torchvision.version import __version__ as tv_version - from scepter.modules.transform.registry import TRANSFORMS from scepter.modules.transform.utils import (BACKEND_TORCHVISION, INTERPOLATION_STYLE, is_tensor) # torchvision.transform._transforms_video is deprecated since torchvision 0.10.0, use transform instead from scepter.modules.utils.config import dict_to_yaml +from torchvision.version import __version__ as tv_version use_video_transforms = version.parse(tv_version) < version.parse('0.10.0') diff --git a/scepter/modules/utils/__init__.py b/scepter/modules/utils/__init__.py index c243788..8e97972 100644 --- a/scepter/modules/utils/__init__.py +++ b/scepter/modules/utils/__init__.py @@ -1,3 +1,4 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. -from scepter.modules.utils import config, distribute, file_clients, file_system +from scepter.modules.utils import (config, distribute, file_clients, + file_system, module_transform) diff --git a/scepter/modules/utils/config.py b/scepter/modules/utils/config.py index a109fdb..a498c74 100644 --- a/scepter/modules/utils/config.py +++ b/scepter/modules/utils/config.py @@ -5,6 +5,7 @@ import copy import json import numbers import os +import re import sys import yaml @@ -207,6 +208,21 @@ def dict_to_yaml(module_name, name, json_config, set_name=False): return yaml_str +pattern = re.compile('.*?(\${\w+}).*?') # noqa + + +def env_var_constructor(loader, node): + value = loader.construct_scalar(node) + for item in pattern.findall(value): + var_name = item.strip('${}') + value = value.replace(item, os.getenv(var_name, item)) + return value + + +yaml.SafeLoader.add_constructor('$', env_var_constructor) +yaml.SafeLoader.add_implicit_resolver('$', pattern, None) + + def _parse_args(parser): if parser is None: parser = argparse.ArgumentParser( diff --git a/scepter/modules/utils/data.py b/scepter/modules/utils/data.py index b4e734a..c5e75dd 100644 --- a/scepter/modules/utils/data.py +++ b/scepter/modules/utils/data.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. - +import base64 from collections import OrderedDict +import numpy as np import torch @@ -86,3 +87,17 @@ def transfer_data_to_cuda(data_map: dict) -> dict: else: ret[key] = value return ret + + +def np_to_base64(np_array): + shape = list(np_array.shape) + dtype = str(np_array.dtype) + np_str = np_array.tostring() + np_base64 = base64.b64encode(np_str).decode() + return {'array': np_base64, 'shape': shape, 'dtype': dtype} + + +def base64_to_np(base64_str, shape, dtype=np.float32): + base64_str = base64.b64decode(base64_str) + np_array = np.frombuffer(base64_str, dtype).reshape(shape) + return np_array diff --git a/scepter/modules/utils/distribute.py b/scepter/modules/utils/distribute.py index 3fc81dc..19d5671 100644 --- a/scepter/modules/utils/distribute.py +++ b/scepter/modules/utils/distribute.py @@ -10,7 +10,6 @@ from collections import OrderedDict import numpy as np import torch import torch.distributed as dist - from scepter.modules.utils.model import StdMsg __all__ = [ @@ -447,8 +446,8 @@ class Workenv(object): environ_str += f'Current pod have {self.device_count} devices!\n' environ_str += f'Current task executes on device {self.device_id}!\n' environ_str += f"Current task's global rank is {self.rank} \n" - environ_str += f"Current task's data online is set {self.data_online}" - environ_str += f"Current task's share storage is set {self.share_storage}" + environ_str += f"Current task's data online is set {self.data_online} \n" + environ_str += f"Current task's share storage is set {self.share_storage} \n" environ_str += f"Current task's global seed is set {self.seed}" return environ_str diff --git a/scepter/modules/utils/export_model.py b/scepter/modules/utils/export_model.py index 679e3ef..9f43750 100644 --- a/scepter/modules/utils/export_model.py +++ b/scepter/modules/utils/export_model.py @@ -6,9 +6,8 @@ from io import BytesIO import onnx import onnxruntime import torch -from torch.onnx import OperatorExportTypes - from scepter.modules.utils.distribute import we +from torch.onnx import OperatorExportTypes type_map = { 'float32': torch.float32, diff --git a/scepter/modules/utils/file_clients/aliyun_oss_fs.py b/scepter/modules/utils/file_clients/aliyun_oss_fs.py index 622710c..4c21ffb 100644 --- a/scepter/modules/utils/file_clients/aliyun_oss_fs.py +++ b/scepter/modules/utils/file_clients/aliyun_oss_fs.py @@ -14,11 +14,11 @@ import time import warnings from typing import Optional +from tqdm import tqdm + import oss2 from oss2 import determine_part_size from oss2.models import PartInfo -from tqdm import tqdm - from scepter.modules.utils.config import dict_to_yaml from scepter.modules.utils.directory import get_md5 from scepter.modules.utils.file_clients.base_fs import BaseFs @@ -451,8 +451,14 @@ class AliyunOssFs(BaseFs): else: return False - def check_folder(self, check_file): + def check_folder(self, check_file, sign_key=None): meta_dict = json.load(open(check_file, 'r')) + if sign_key in meta_dict: + etag, size = self.get_meta(sign_key) + if not etag == meta_dict[sign_key]: + return False + else: + return True for key, v in meta_dict.items(): etag, size = self.get_meta(key) if not etag == v: @@ -567,6 +573,7 @@ class AliyunOssFs(BaseFs): wait_finish=False, timeout=3600, multi_thread=False, + sign_key=None, worker_id=-1) -> Optional[str]: if not self.isdir(target_path): self.logger.info( @@ -586,7 +593,8 @@ class AliyunOssFs(BaseFs): from scepter.modules.utils.distribute import we wait_times = timeout while wait_times > 0 and not (osp.exists(check_file) - and self.check_folder(check_file)): + and self.check_folder( + check_file, sign_key=sign_key)): if we.share_storage and we.rank == 0: break if not we.share_storage and (we.device_id == 0 @@ -599,7 +607,8 @@ class AliyunOssFs(BaseFs): ) time.sleep(5) wait_times -= 1 - if osp.exists(check_file) and self.check_folder(check_file): + if osp.exists(check_file) and self.check_folder(check_file, + sign_key=sign_key): return local_path if osp.exists(check_file): @@ -941,10 +950,11 @@ class AliyunOssFs(BaseFs): target_path, set_public=False, lifecycle=3600 * 100, + skip_check=False, slash_safe=True): key = osp.relpath(target_path, self._prefix) _bucket = self._init_bucket() - if not _bucket.object_exists(key): + if not skip_check and not _bucket.object_exists(key): self.logger.info(f'{target_path} is not exists!') return None retry = 0 diff --git a/scepter/modules/utils/file_clients/http_fs.py b/scepter/modules/utils/file_clients/http_fs.py index a6ad579..fadc133 100644 --- a/scepter/modules/utils/file_clients/http_fs.py +++ b/scepter/modules/utils/file_clients/http_fs.py @@ -128,10 +128,15 @@ class HttpFs(BaseFs): wait_finish=False, multi_thread=False, timeout=3600, + sign_key=None, worker_id=0) -> Optional[str]: raise NotImplementedError - def get_url(self, target_path, set_public=False, lifecycle=3600 * 100): + def get_url(self, + target_path, + set_public=False, + skip_check=False, + lifecycle=3600 * 100): return target_path def exists(self, target_path) -> bool: diff --git a/scepter/modules/utils/file_clients/huggingface_fs.py b/scepter/modules/utils/file_clients/huggingface_fs.py index a7375cf..d51dc4d 100644 --- a/scepter/modules/utils/file_clients/huggingface_fs.py +++ b/scepter/modules/utils/file_clients/huggingface_fs.py @@ -85,6 +85,7 @@ class HuggingfaceFs(BaseFs): local_path=None, wait_finish=False, timeout=3600, + sign_key=None, worker_id=-1) -> Optional[str]: from huggingface_hub import snapshot_download assert target_path.startswith(self.get_prefix()) @@ -181,7 +182,11 @@ class HuggingfaceFs(BaseFs): delimiter=None) -> (Union[bytes, str, None], Optional[int]): raise NotImplementedError - def get_url(self, target_path, set_public=False, lifecycle=3600 * 100): + def get_url(self, + target_path, + set_public=False, + skip_check=False, + lifecycle=3600 * 100): return target_path def exists(self, target_path) -> bool: diff --git a/scepter/modules/utils/file_clients/local_fs.py b/scepter/modules/utils/file_clients/local_fs.py index 8a97443..7be8a6e 100644 --- a/scepter/modules/utils/file_clients/local_fs.py +++ b/scepter/modules/utils/file_clients/local_fs.py @@ -87,6 +87,7 @@ class LocalFs(BaseFs): wait_finish=False, multi_thread=False, timeout=3600, + sign_key=None, worker_id=0) -> Optional[str]: if not self.isdir(target_path): self.logger.info( @@ -255,7 +256,11 @@ class LocalFs(BaseFs): return False return True - def get_url(self, target_path, set_public=False, lifecycle=3600 * 100): + def get_url(self, + target_path, + set_public=False, + skip_check=False, + lifecycle=3600 * 100): return target_path def make_dir(self, target_dir) -> bool: diff --git a/scepter/modules/utils/file_clients/modelscope_fs.py b/scepter/modules/utils/file_clients/modelscope_fs.py index f71233c..eb152e8 100644 --- a/scepter/modules/utils/file_clients/modelscope_fs.py +++ b/scepter/modules/utils/file_clients/modelscope_fs.py @@ -94,6 +94,7 @@ class ModelscopeFs(BaseFs): wait_finish=False, multi_thread=False, timeout=3600, + sign_key=None, worker_id=-1) -> Optional[str]: from modelscope.hub.snapshot_download import snapshot_download assert target_path.startswith(self.get_prefix()) @@ -199,7 +200,11 @@ class ModelscopeFs(BaseFs): delimiter=None) -> (Union[bytes, str, None], Optional[int]): raise NotImplementedError - def get_url(self, target_path, set_public=False, lifecycle=3600 * 100): + def get_url(self, + target_path, + set_public=False, + skip_check=False, + lifecycle=3600 * 100): return target_path def exists(self, target_path) -> bool: diff --git a/scepter/modules/utils/file_system.py b/scepter/modules/utils/file_system.py index 042bfac..6fc2313 100644 --- a/scepter/modules/utils/file_system.py +++ b/scepter/modules/utils/file_system.py @@ -131,6 +131,7 @@ class FileSystem(object): wait_finish=False, timeout=3600, multi_thread=False, + sign_key=None, worker_id=0): with self.get_fs_client(target_path) as client: local_path = client.get_dir_to_local_dir(target_path, @@ -138,6 +139,7 @@ class FileSystem(object): wait_finish=wait_finish, timeout=timeout, multi_thread=multi_thread, + sign_key=sign_key, worker_id=worker_id) if local_path is None: raise ReadException( @@ -247,10 +249,15 @@ class FileSystem(object): f'Failed to fetch {target_path} to {local_path}') return IoString(local_path) - def get_url(self, target_path, set_public=False, lifecycle=3600 * 100): + def get_url(self, + target_path, + set_public=False, + skip_check=False, + lifecycle=3600 * 100): with self.get_fs_client(target_path) as client: output_url = client.get_url(target_path, set_public=set_public, + skip_check=skip_check, lifecycle=lifecycle) return output_url @@ -258,7 +265,7 @@ class FileSystem(object): with self.get_fs_client(target_path) as client: local_data = client.get_object(target_path) if local_data is None: - return IoBytes(None) + return IoBytes(b'') return IoBytes(local_data) def put_object(self, local_data, target_path): diff --git a/scepter/modules/utils/logger.py b/scepter/modules/utils/logger.py index 7a5648d..caf51b3 100644 --- a/scepter/modules/utils/logger.py +++ b/scepter/modules/utils/logger.py @@ -9,7 +9,6 @@ from collections import OrderedDict import numpy as np import torch - from scepter.modules.utils.distribute import get_dist_info diff --git a/scepter/modules/utils/module_transform.py b/scepter/modules/utils/module_transform.py new file mode 100644 index 0000000..d89ae28 --- /dev/null +++ b/scepter/modules/utils/module_transform.py @@ -0,0 +1,1195 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +# codes borrowed from https://github.com/kohya-ss/sd-scripts +NUM_TRAIN_TIMESTEPS = 1000 +BETA_START = 0.00085 +BETA_END = 0.0120 + +UNET_PARAMS_MODEL_CHANNELS = 320 +UNET_PARAMS_CHANNEL_MULT = [1, 2, 4, 4] +UNET_PARAMS_ATTENTION_RESOLUTIONS = [4, 2, 1] +UNET_PARAMS_IMAGE_SIZE = 64 # fixed from old invalid value `32` +UNET_PARAMS_IN_CHANNELS = 4 +UNET_PARAMS_OUT_CHANNELS = 4 +UNET_PARAMS_NUM_RES_BLOCKS = 2 +UNET_PARAMS_CONTEXT_DIM = 768 +UNET_PARAMS_NUM_HEADS = 8 + +VAE_PARAMS_Z_CHANNELS = 4 +VAE_PARAMS_RESOLUTION = 256 +VAE_PARAMS_IN_CHANNELS = 3 +VAE_PARAMS_OUT_CH = 3 +VAE_PARAMS_CH = 128 +VAE_PARAMS_CH_MULT = [1, 2, 4, 4] +VAE_PARAMS_NUM_RES_BLOCKS = 2 + +# V2 +V2_UNET_PARAMS_ATTENTION_HEAD_DIM = [5, 10, 20, 20] +V2_UNET_PARAMS_CONTEXT_DIM = 1024 + +DIFFUSERS_REF_MODEL_ID_V1 = 'runwayml/stable-diffusion-v1-5' +DIFFUSERS_REF_MODEL_ID_V2 = 'stabilityai/stable-diffusion-2-1' + +CIVITAI_TO_SCEPTER_PARAMS_DICT = { + 'down_blocks_0_attentions_0_transformer_blocks_0_attn1_to_q.lora_down.weight': + 'input_blocks.1.1.transformer_blocks.0.attn1.to_q.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_attn1_to_q.lora_up.weight': + 'input_blocks.1.1.transformer_blocks.0.attn1.to_q.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_attn1_to_k.lora_down.weight': + 'input_blocks.1.1.transformer_blocks.0.attn1.to_k.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_attn1_to_k.lora_up.weight': + 'input_blocks.1.1.transformer_blocks.0.attn1.to_k.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_attn1_to_v.lora_down.weight': + 'input_blocks.1.1.transformer_blocks.0.attn1.to_v.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_attn1_to_v.lora_up.weight': + 'input_blocks.1.1.transformer_blocks.0.attn1.to_v.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_attn1_to_out_0.lora_down.weight': + 'input_blocks.1.1.transformer_blocks.0.attn1.to_out.0.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_attn1_to_out_0.lora_up.weight': + 'input_blocks.1.1.transformer_blocks.0.attn1.to_out.0.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_ff_net_0_proj.lora_down.weight': + 'input_blocks.1.1.transformer_blocks.0.ff.net.0.proj.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_ff_net_0_proj.lora_up.weight': + 'input_blocks.1.1.transformer_blocks.0.ff.net.0.proj.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_ff_net_2.lora_down.weight': + 'input_blocks.1.1.transformer_blocks.0.ff.net.2.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_ff_net_2.lora_up.weight': + 'input_blocks.1.1.transformer_blocks.0.ff.net.2.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_attn2_to_q.lora_down.weight': + 'input_blocks.1.1.transformer_blocks.0.attn2.to_q.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_attn2_to_q.lora_up.weight': + 'input_blocks.1.1.transformer_blocks.0.attn2.to_q.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_attn2_to_k.lora_down.weight': + 'input_blocks.1.1.transformer_blocks.0.attn2.to_k.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_attn2_to_k.lora_up.weight': + 'input_blocks.1.1.transformer_blocks.0.attn2.to_k.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_attn2_to_v.lora_down.weight': + 'input_blocks.1.1.transformer_blocks.0.attn2.to_v.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_attn2_to_v.lora_up.weight': + 'input_blocks.1.1.transformer_blocks.0.attn2.to_v.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_attn2_to_out_0.lora_down.weight': + 'input_blocks.1.1.transformer_blocks.0.attn2.to_out.0.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_0_transformer_blocks_0_attn2_to_out_0.lora_up.weight': + 'input_blocks.1.1.transformer_blocks.0.attn2.to_out.0.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_attn1_to_q.lora_down.weight': + 'input_blocks.2.1.transformer_blocks.0.attn1.to_q.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_attn1_to_q.lora_up.weight': + 'input_blocks.2.1.transformer_blocks.0.attn1.to_q.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_attn1_to_k.lora_down.weight': + 'input_blocks.2.1.transformer_blocks.0.attn1.to_k.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_attn1_to_k.lora_up.weight': + 'input_blocks.2.1.transformer_blocks.0.attn1.to_k.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_attn1_to_v.lora_down.weight': + 'input_blocks.2.1.transformer_blocks.0.attn1.to_v.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_attn1_to_v.lora_up.weight': + 'input_blocks.2.1.transformer_blocks.0.attn1.to_v.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_attn1_to_out_0.lora_down.weight': + 'input_blocks.2.1.transformer_blocks.0.attn1.to_out.0.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_attn1_to_out_0.lora_up.weight': + 'input_blocks.2.1.transformer_blocks.0.attn1.to_out.0.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_ff_net_0_proj.lora_down.weight': + 'input_blocks.2.1.transformer_blocks.0.ff.net.0.proj.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_ff_net_0_proj.lora_up.weight': + 'input_blocks.2.1.transformer_blocks.0.ff.net.0.proj.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_ff_net_2.lora_down.weight': + 'input_blocks.2.1.transformer_blocks.0.ff.net.2.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_ff_net_2.lora_up.weight': + 'input_blocks.2.1.transformer_blocks.0.ff.net.2.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_attn2_to_q.lora_down.weight': + 'input_blocks.2.1.transformer_blocks.0.attn2.to_q.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_attn2_to_q.lora_up.weight': + 'input_blocks.2.1.transformer_blocks.0.attn2.to_q.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_attn2_to_k.lora_down.weight': + 'input_blocks.2.1.transformer_blocks.0.attn2.to_k.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_attn2_to_k.lora_up.weight': + 'input_blocks.2.1.transformer_blocks.0.attn2.to_k.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_attn2_to_v.lora_down.weight': + 'input_blocks.2.1.transformer_blocks.0.attn2.to_v.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_attn2_to_v.lora_up.weight': + 'input_blocks.2.1.transformer_blocks.0.attn2.to_v.lora_B.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_attn2_to_out_0.lora_down.weight': + 'input_blocks.2.1.transformer_blocks.0.attn2.to_out.0.lora_A.0_SwiftLoRA.weight', + 'down_blocks_0_attentions_1_transformer_blocks_0_attn2_to_out_0.lora_up.weight': + 'input_blocks.2.1.transformer_blocks.0.attn2.to_out.0.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_attn1_to_q.lora_down.weight': + 'input_blocks.4.1.transformer_blocks.0.attn1.to_q.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_attn1_to_q.lora_up.weight': + 'input_blocks.4.1.transformer_blocks.0.attn1.to_q.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_attn1_to_k.lora_down.weight': + 'input_blocks.4.1.transformer_blocks.0.attn1.to_k.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_attn1_to_k.lora_up.weight': + 'input_blocks.4.1.transformer_blocks.0.attn1.to_k.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_attn1_to_v.lora_down.weight': + 'input_blocks.4.1.transformer_blocks.0.attn1.to_v.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_attn1_to_v.lora_up.weight': + 'input_blocks.4.1.transformer_blocks.0.attn1.to_v.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_attn1_to_out_0.lora_down.weight': + 'input_blocks.4.1.transformer_blocks.0.attn1.to_out.0.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_attn1_to_out_0.lora_up.weight': + 'input_blocks.4.1.transformer_blocks.0.attn1.to_out.0.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_ff_net_0_proj.lora_down.weight': + 'input_blocks.4.1.transformer_blocks.0.ff.net.0.proj.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_ff_net_0_proj.lora_up.weight': + 'input_blocks.4.1.transformer_blocks.0.ff.net.0.proj.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_ff_net_2.lora_down.weight': + 'input_blocks.4.1.transformer_blocks.0.ff.net.2.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_ff_net_2.lora_up.weight': + 'input_blocks.4.1.transformer_blocks.0.ff.net.2.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_attn2_to_q.lora_down.weight': + 'input_blocks.4.1.transformer_blocks.0.attn2.to_q.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_attn2_to_q.lora_up.weight': + 'input_blocks.4.1.transformer_blocks.0.attn2.to_q.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_attn2_to_k.lora_down.weight': + 'input_blocks.4.1.transformer_blocks.0.attn2.to_k.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_attn2_to_k.lora_up.weight': + 'input_blocks.4.1.transformer_blocks.0.attn2.to_k.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_attn2_to_v.lora_down.weight': + 'input_blocks.4.1.transformer_blocks.0.attn2.to_v.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_attn2_to_v.lora_up.weight': + 'input_blocks.4.1.transformer_blocks.0.attn2.to_v.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_attn2_to_out_0.lora_down.weight': + 'input_blocks.4.1.transformer_blocks.0.attn2.to_out.0.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_0_transformer_blocks_0_attn2_to_out_0.lora_up.weight': + 'input_blocks.4.1.transformer_blocks.0.attn2.to_out.0.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_attn1_to_q.lora_down.weight': + 'input_blocks.5.1.transformer_blocks.0.attn1.to_q.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_attn1_to_q.lora_up.weight': + 'input_blocks.5.1.transformer_blocks.0.attn1.to_q.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_attn1_to_k.lora_down.weight': + 'input_blocks.5.1.transformer_blocks.0.attn1.to_k.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_attn1_to_k.lora_up.weight': + 'input_blocks.5.1.transformer_blocks.0.attn1.to_k.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_attn1_to_v.lora_down.weight': + 'input_blocks.5.1.transformer_blocks.0.attn1.to_v.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_attn1_to_v.lora_up.weight': + 'input_blocks.5.1.transformer_blocks.0.attn1.to_v.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_attn1_to_out_0.lora_down.weight': + 'input_blocks.5.1.transformer_blocks.0.attn1.to_out.0.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_attn1_to_out_0.lora_up.weight': + 'input_blocks.5.1.transformer_blocks.0.attn1.to_out.0.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_ff_net_0_proj.lora_down.weight': + 'input_blocks.5.1.transformer_blocks.0.ff.net.0.proj.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_ff_net_0_proj.lora_up.weight': + 'input_blocks.5.1.transformer_blocks.0.ff.net.0.proj.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_ff_net_2.lora_down.weight': + 'input_blocks.5.1.transformer_blocks.0.ff.net.2.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_ff_net_2.lora_up.weight': + 'input_blocks.5.1.transformer_blocks.0.ff.net.2.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_attn2_to_q.lora_down.weight': + 'input_blocks.5.1.transformer_blocks.0.attn2.to_q.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_attn2_to_q.lora_up.weight': + 'input_blocks.5.1.transformer_blocks.0.attn2.to_q.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_attn2_to_k.lora_down.weight': + 'input_blocks.5.1.transformer_blocks.0.attn2.to_k.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_attn2_to_k.lora_up.weight': + 'input_blocks.5.1.transformer_blocks.0.attn2.to_k.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_attn2_to_v.lora_down.weight': + 'input_blocks.5.1.transformer_blocks.0.attn2.to_v.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_attn2_to_v.lora_up.weight': + 'input_blocks.5.1.transformer_blocks.0.attn2.to_v.lora_B.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_attn2_to_out_0.lora_down.weight': + 'input_blocks.5.1.transformer_blocks.0.attn2.to_out.0.lora_A.0_SwiftLoRA.weight', + 'down_blocks_1_attentions_1_transformer_blocks_0_attn2_to_out_0.lora_up.weight': + 'input_blocks.5.1.transformer_blocks.0.attn2.to_out.0.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_attn1_to_q.lora_down.weight': + 'input_blocks.7.1.transformer_blocks.0.attn1.to_q.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_attn1_to_q.lora_up.weight': + 'input_blocks.7.1.transformer_blocks.0.attn1.to_q.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_attn1_to_k.lora_down.weight': + 'input_blocks.7.1.transformer_blocks.0.attn1.to_k.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_attn1_to_k.lora_up.weight': + 'input_blocks.7.1.transformer_blocks.0.attn1.to_k.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_attn1_to_v.lora_down.weight': + 'input_blocks.7.1.transformer_blocks.0.attn1.to_v.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_attn1_to_v.lora_up.weight': + 'input_blocks.7.1.transformer_blocks.0.attn1.to_v.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_attn1_to_out_0.lora_down.weight': + 'input_blocks.7.1.transformer_blocks.0.attn1.to_out.0.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_attn1_to_out_0.lora_up.weight': + 'input_blocks.7.1.transformer_blocks.0.attn1.to_out.0.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_ff_net_0_proj.lora_down.weight': + 'input_blocks.7.1.transformer_blocks.0.ff.net.0.proj.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_ff_net_0_proj.lora_up.weight': + 'input_blocks.7.1.transformer_blocks.0.ff.net.0.proj.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_ff_net_2.lora_down.weight': + 'input_blocks.7.1.transformer_blocks.0.ff.net.2.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_ff_net_2.lora_up.weight': + 'input_blocks.7.1.transformer_blocks.0.ff.net.2.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_attn2_to_q.lora_down.weight': + 'input_blocks.7.1.transformer_blocks.0.attn2.to_q.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_attn2_to_q.lora_up.weight': + 'input_blocks.7.1.transformer_blocks.0.attn2.to_q.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_attn2_to_k.lora_down.weight': + 'input_blocks.7.1.transformer_blocks.0.attn2.to_k.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_attn2_to_k.lora_up.weight': + 'input_blocks.7.1.transformer_blocks.0.attn2.to_k.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_attn2_to_v.lora_down.weight': + 'input_blocks.7.1.transformer_blocks.0.attn2.to_v.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_attn2_to_v.lora_up.weight': + 'input_blocks.7.1.transformer_blocks.0.attn2.to_v.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_attn2_to_out_0.lora_down.weight': + 'input_blocks.7.1.transformer_blocks.0.attn2.to_out.0.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_0_transformer_blocks_0_attn2_to_out_0.lora_up.weight': + 'input_blocks.7.1.transformer_blocks.0.attn2.to_out.0.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_attn1_to_q.lora_down.weight': + 'input_blocks.8.1.transformer_blocks.0.attn1.to_q.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_attn1_to_q.lora_up.weight': + 'input_blocks.8.1.transformer_blocks.0.attn1.to_q.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_attn1_to_k.lora_down.weight': + 'input_blocks.8.1.transformer_blocks.0.attn1.to_k.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_attn1_to_k.lora_up.weight': + 'input_blocks.8.1.transformer_blocks.0.attn1.to_k.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_attn1_to_v.lora_down.weight': + 'input_blocks.8.1.transformer_blocks.0.attn1.to_v.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_attn1_to_v.lora_up.weight': + 'input_blocks.8.1.transformer_blocks.0.attn1.to_v.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_attn1_to_out_0.lora_down.weight': + 'input_blocks.8.1.transformer_blocks.0.attn1.to_out.0.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_attn1_to_out_0.lora_up.weight': + 'input_blocks.8.1.transformer_blocks.0.attn1.to_out.0.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_ff_net_0_proj.lora_down.weight': + 'input_blocks.8.1.transformer_blocks.0.ff.net.0.proj.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_ff_net_0_proj.lora_up.weight': + 'input_blocks.8.1.transformer_blocks.0.ff.net.0.proj.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_ff_net_2.lora_down.weight': + 'input_blocks.8.1.transformer_blocks.0.ff.net.2.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_ff_net_2.lora_up.weight': + 'input_blocks.8.1.transformer_blocks.0.ff.net.2.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_attn2_to_q.lora_down.weight': + 'input_blocks.8.1.transformer_blocks.0.attn2.to_q.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_attn2_to_q.lora_up.weight': + 'input_blocks.8.1.transformer_blocks.0.attn2.to_q.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_attn2_to_k.lora_down.weight': + 'input_blocks.8.1.transformer_blocks.0.attn2.to_k.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_attn2_to_k.lora_up.weight': + 'input_blocks.8.1.transformer_blocks.0.attn2.to_k.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_attn2_to_v.lora_down.weight': + 'input_blocks.8.1.transformer_blocks.0.attn2.to_v.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_attn2_to_v.lora_up.weight': + 'input_blocks.8.1.transformer_blocks.0.attn2.to_v.lora_B.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_attn2_to_out_0.lora_down.weight': + 'input_blocks.8.1.transformer_blocks.0.attn2.to_out.0.lora_A.0_SwiftLoRA.weight', + 'down_blocks_2_attentions_1_transformer_blocks_0_attn2_to_out_0.lora_up.weight': + 'input_blocks.8.1.transformer_blocks.0.attn2.to_out.0.lora_B.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_attn1_to_q.lora_down.weight': + 'middle_block.1.transformer_blocks.0.attn1.to_q.lora_A.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_attn1_to_q.lora_up.weight': + 'middle_block.1.transformer_blocks.0.attn1.to_q.lora_B.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_attn1_to_k.lora_down.weight': + 'middle_block.1.transformer_blocks.0.attn1.to_k.lora_A.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_attn1_to_k.lora_up.weight': + 'middle_block.1.transformer_blocks.0.attn1.to_k.lora_B.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_attn1_to_v.lora_down.weight': + 'middle_block.1.transformer_blocks.0.attn1.to_v.lora_A.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_attn1_to_v.lora_up.weight': + 'middle_block.1.transformer_blocks.0.attn1.to_v.lora_B.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_attn1_to_out_0.lora_down.weight': + 'middle_block.1.transformer_blocks.0.attn1.to_out.0.lora_A.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_attn1_to_out_0.lora_up.weight': + 'middle_block.1.transformer_blocks.0.attn1.to_out.0.lora_B.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_ff_net_0_proj.lora_down.weight': + 'middle_block.1.transformer_blocks.0.ff.net.0.proj.lora_A.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_ff_net_0_proj.lora_up.weight': + 'middle_block.1.transformer_blocks.0.ff.net.0.proj.lora_B.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_ff_net_2.lora_down.weight': + 'middle_block.1.transformer_blocks.0.ff.net.2.lora_A.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_ff_net_2.lora_up.weight': + 'middle_block.1.transformer_blocks.0.ff.net.2.lora_B.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_attn2_to_q.lora_down.weight': + 'middle_block.1.transformer_blocks.0.attn2.to_q.lora_A.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_attn2_to_q.lora_up.weight': + 'middle_block.1.transformer_blocks.0.attn2.to_q.lora_B.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_attn2_to_k.lora_down.weight': + 'middle_block.1.transformer_blocks.0.attn2.to_k.lora_A.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_attn2_to_k.lora_up.weight': + 'middle_block.1.transformer_blocks.0.attn2.to_k.lora_B.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_attn2_to_v.lora_down.weight': + 'middle_block.1.transformer_blocks.0.attn2.to_v.lora_A.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_attn2_to_v.lora_up.weight': + 'middle_block.1.transformer_blocks.0.attn2.to_v.lora_B.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_attn2_to_out_0.lora_down.weight': + 'middle_block.1.transformer_blocks.0.attn2.to_out.0.lora_A.0_SwiftLoRA.weight', + 'mid_block_attentions_0_transformer_blocks_0_attn2_to_out_0.lora_up.weight': + 'middle_block.1.transformer_blocks.0.attn2.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_attn1_to_q.lora_down.weight': + 'output_blocks.3.1.transformer_blocks.0.attn1.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_attn1_to_q.lora_up.weight': + 'output_blocks.3.1.transformer_blocks.0.attn1.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_attn1_to_k.lora_down.weight': + 'output_blocks.3.1.transformer_blocks.0.attn1.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_attn1_to_k.lora_up.weight': + 'output_blocks.3.1.transformer_blocks.0.attn1.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_attn1_to_v.lora_down.weight': + 'output_blocks.3.1.transformer_blocks.0.attn1.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_attn1_to_v.lora_up.weight': + 'output_blocks.3.1.transformer_blocks.0.attn1.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_attn1_to_out_0.lora_down.weight': + 'output_blocks.3.1.transformer_blocks.0.attn1.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_attn1_to_out_0.lora_up.weight': + 'output_blocks.3.1.transformer_blocks.0.attn1.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_ff_net_0_proj.lora_down.weight': + 'output_blocks.3.1.transformer_blocks.0.ff.net.0.proj.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_ff_net_0_proj.lora_up.weight': + 'output_blocks.3.1.transformer_blocks.0.ff.net.0.proj.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_ff_net_2.lora_down.weight': + 'output_blocks.3.1.transformer_blocks.0.ff.net.2.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_ff_net_2.lora_up.weight': + 'output_blocks.3.1.transformer_blocks.0.ff.net.2.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_attn2_to_q.lora_down.weight': + 'output_blocks.3.1.transformer_blocks.0.attn2.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_attn2_to_q.lora_up.weight': + 'output_blocks.3.1.transformer_blocks.0.attn2.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_attn2_to_k.lora_down.weight': + 'output_blocks.3.1.transformer_blocks.0.attn2.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_attn2_to_k.lora_up.weight': + 'output_blocks.3.1.transformer_blocks.0.attn2.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_attn2_to_v.lora_down.weight': + 'output_blocks.3.1.transformer_blocks.0.attn2.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_attn2_to_v.lora_up.weight': + 'output_blocks.3.1.transformer_blocks.0.attn2.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_attn2_to_out_0.lora_down.weight': + 'output_blocks.3.1.transformer_blocks.0.attn2.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_0_transformer_blocks_0_attn2_to_out_0.lora_up.weight': + 'output_blocks.3.1.transformer_blocks.0.attn2.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_attn1_to_q.lora_down.weight': + 'output_blocks.4.1.transformer_blocks.0.attn1.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_attn1_to_q.lora_up.weight': + 'output_blocks.4.1.transformer_blocks.0.attn1.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_attn1_to_k.lora_down.weight': + 'output_blocks.4.1.transformer_blocks.0.attn1.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_attn1_to_k.lora_up.weight': + 'output_blocks.4.1.transformer_blocks.0.attn1.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_attn1_to_v.lora_down.weight': + 'output_blocks.4.1.transformer_blocks.0.attn1.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_attn1_to_v.lora_up.weight': + 'output_blocks.4.1.transformer_blocks.0.attn1.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_attn1_to_out_0.lora_down.weight': + 'output_blocks.4.1.transformer_blocks.0.attn1.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_attn1_to_out_0.lora_up.weight': + 'output_blocks.4.1.transformer_blocks.0.attn1.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_ff_net_0_proj.lora_down.weight': + 'output_blocks.4.1.transformer_blocks.0.ff.net.0.proj.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_ff_net_0_proj.lora_up.weight': + 'output_blocks.4.1.transformer_blocks.0.ff.net.0.proj.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_ff_net_2.lora_down.weight': + 'output_blocks.4.1.transformer_blocks.0.ff.net.2.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_ff_net_2.lora_up.weight': + 'output_blocks.4.1.transformer_blocks.0.ff.net.2.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_attn2_to_q.lora_down.weight': + 'output_blocks.4.1.transformer_blocks.0.attn2.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_attn2_to_q.lora_up.weight': + 'output_blocks.4.1.transformer_blocks.0.attn2.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_attn2_to_k.lora_down.weight': + 'output_blocks.4.1.transformer_blocks.0.attn2.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_attn2_to_k.lora_up.weight': + 'output_blocks.4.1.transformer_blocks.0.attn2.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_attn2_to_v.lora_down.weight': + 'output_blocks.4.1.transformer_blocks.0.attn2.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_attn2_to_v.lora_up.weight': + 'output_blocks.4.1.transformer_blocks.0.attn2.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_attn2_to_out_0.lora_down.weight': + 'output_blocks.4.1.transformer_blocks.0.attn2.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_1_transformer_blocks_0_attn2_to_out_0.lora_up.weight': + 'output_blocks.4.1.transformer_blocks.0.attn2.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_attn1_to_q.lora_down.weight': + 'output_blocks.5.1.transformer_blocks.0.attn1.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_attn1_to_q.lora_up.weight': + 'output_blocks.5.1.transformer_blocks.0.attn1.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_attn1_to_k.lora_down.weight': + 'output_blocks.5.1.transformer_blocks.0.attn1.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_attn1_to_k.lora_up.weight': + 'output_blocks.5.1.transformer_blocks.0.attn1.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_attn1_to_v.lora_down.weight': + 'output_blocks.5.1.transformer_blocks.0.attn1.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_attn1_to_v.lora_up.weight': + 'output_blocks.5.1.transformer_blocks.0.attn1.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_attn1_to_out_0.lora_down.weight': + 'output_blocks.5.1.transformer_blocks.0.attn1.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_attn1_to_out_0.lora_up.weight': + 'output_blocks.5.1.transformer_blocks.0.attn1.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_ff_net_0_proj.lora_down.weight': + 'output_blocks.5.1.transformer_blocks.0.ff.net.0.proj.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_ff_net_0_proj.lora_up.weight': + 'output_blocks.5.1.transformer_blocks.0.ff.net.0.proj.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_ff_net_2.lora_down.weight': + 'output_blocks.5.1.transformer_blocks.0.ff.net.2.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_ff_net_2.lora_up.weight': + 'output_blocks.5.1.transformer_blocks.0.ff.net.2.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_attn2_to_q.lora_down.weight': + 'output_blocks.5.1.transformer_blocks.0.attn2.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_attn2_to_q.lora_up.weight': + 'output_blocks.5.1.transformer_blocks.0.attn2.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_attn2_to_k.lora_down.weight': + 'output_blocks.5.1.transformer_blocks.0.attn2.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_attn2_to_k.lora_up.weight': + 'output_blocks.5.1.transformer_blocks.0.attn2.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_attn2_to_v.lora_down.weight': + 'output_blocks.5.1.transformer_blocks.0.attn2.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_attn2_to_v.lora_up.weight': + 'output_blocks.5.1.transformer_blocks.0.attn2.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_attn2_to_out_0.lora_down.weight': + 'output_blocks.5.1.transformer_blocks.0.attn2.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_1_attentions_2_transformer_blocks_0_attn2_to_out_0.lora_up.weight': + 'output_blocks.5.1.transformer_blocks.0.attn2.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_attn1_to_q.lora_down.weight': + 'output_blocks.6.1.transformer_blocks.0.attn1.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_attn1_to_q.lora_up.weight': + 'output_blocks.6.1.transformer_blocks.0.attn1.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_attn1_to_k.lora_down.weight': + 'output_blocks.6.1.transformer_blocks.0.attn1.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_attn1_to_k.lora_up.weight': + 'output_blocks.6.1.transformer_blocks.0.attn1.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_attn1_to_v.lora_down.weight': + 'output_blocks.6.1.transformer_blocks.0.attn1.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_attn1_to_v.lora_up.weight': + 'output_blocks.6.1.transformer_blocks.0.attn1.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_attn1_to_out_0.lora_down.weight': + 'output_blocks.6.1.transformer_blocks.0.attn1.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_attn1_to_out_0.lora_up.weight': + 'output_blocks.6.1.transformer_blocks.0.attn1.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_ff_net_0_proj.lora_down.weight': + 'output_blocks.6.1.transformer_blocks.0.ff.net.0.proj.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_ff_net_0_proj.lora_up.weight': + 'output_blocks.6.1.transformer_blocks.0.ff.net.0.proj.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_ff_net_2.lora_down.weight': + 'output_blocks.6.1.transformer_blocks.0.ff.net.2.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_ff_net_2.lora_up.weight': + 'output_blocks.6.1.transformer_blocks.0.ff.net.2.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_attn2_to_q.lora_down.weight': + 'output_blocks.6.1.transformer_blocks.0.attn2.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_attn2_to_q.lora_up.weight': + 'output_blocks.6.1.transformer_blocks.0.attn2.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_attn2_to_k.lora_down.weight': + 'output_blocks.6.1.transformer_blocks.0.attn2.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_attn2_to_k.lora_up.weight': + 'output_blocks.6.1.transformer_blocks.0.attn2.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_attn2_to_v.lora_down.weight': + 'output_blocks.6.1.transformer_blocks.0.attn2.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_attn2_to_v.lora_up.weight': + 'output_blocks.6.1.transformer_blocks.0.attn2.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_attn2_to_out_0.lora_down.weight': + 'output_blocks.6.1.transformer_blocks.0.attn2.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_0_transformer_blocks_0_attn2_to_out_0.lora_up.weight': + 'output_blocks.6.1.transformer_blocks.0.attn2.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_attn1_to_q.lora_down.weight': + 'output_blocks.7.1.transformer_blocks.0.attn1.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_attn1_to_q.lora_up.weight': + 'output_blocks.7.1.transformer_blocks.0.attn1.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_attn1_to_k.lora_down.weight': + 'output_blocks.7.1.transformer_blocks.0.attn1.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_attn1_to_k.lora_up.weight': + 'output_blocks.7.1.transformer_blocks.0.attn1.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_attn1_to_v.lora_down.weight': + 'output_blocks.7.1.transformer_blocks.0.attn1.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_attn1_to_v.lora_up.weight': + 'output_blocks.7.1.transformer_blocks.0.attn1.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_attn1_to_out_0.lora_down.weight': + 'output_blocks.7.1.transformer_blocks.0.attn1.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_attn1_to_out_0.lora_up.weight': + 'output_blocks.7.1.transformer_blocks.0.attn1.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_ff_net_0_proj.lora_down.weight': + 'output_blocks.7.1.transformer_blocks.0.ff.net.0.proj.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_ff_net_0_proj.lora_up.weight': + 'output_blocks.7.1.transformer_blocks.0.ff.net.0.proj.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_ff_net_2.lora_down.weight': + 'output_blocks.7.1.transformer_blocks.0.ff.net.2.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_ff_net_2.lora_up.weight': + 'output_blocks.7.1.transformer_blocks.0.ff.net.2.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_attn2_to_q.lora_down.weight': + 'output_blocks.7.1.transformer_blocks.0.attn2.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_attn2_to_q.lora_up.weight': + 'output_blocks.7.1.transformer_blocks.0.attn2.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_attn2_to_k.lora_down.weight': + 'output_blocks.7.1.transformer_blocks.0.attn2.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_attn2_to_k.lora_up.weight': + 'output_blocks.7.1.transformer_blocks.0.attn2.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_attn2_to_v.lora_down.weight': + 'output_blocks.7.1.transformer_blocks.0.attn2.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_attn2_to_v.lora_up.weight': + 'output_blocks.7.1.transformer_blocks.0.attn2.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_attn2_to_out_0.lora_down.weight': + 'output_blocks.7.1.transformer_blocks.0.attn2.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_1_transformer_blocks_0_attn2_to_out_0.lora_up.weight': + 'output_blocks.7.1.transformer_blocks.0.attn2.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_attn1_to_q.lora_down.weight': + 'output_blocks.8.1.transformer_blocks.0.attn1.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_attn1_to_q.lora_up.weight': + 'output_blocks.8.1.transformer_blocks.0.attn1.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_attn1_to_k.lora_down.weight': + 'output_blocks.8.1.transformer_blocks.0.attn1.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_attn1_to_k.lora_up.weight': + 'output_blocks.8.1.transformer_blocks.0.attn1.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_attn1_to_v.lora_down.weight': + 'output_blocks.8.1.transformer_blocks.0.attn1.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_attn1_to_v.lora_up.weight': + 'output_blocks.8.1.transformer_blocks.0.attn1.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_attn1_to_out_0.lora_down.weight': + 'output_blocks.8.1.transformer_blocks.0.attn1.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_attn1_to_out_0.lora_up.weight': + 'output_blocks.8.1.transformer_blocks.0.attn1.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_ff_net_0_proj.lora_down.weight': + 'output_blocks.8.1.transformer_blocks.0.ff.net.0.proj.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_ff_net_0_proj.lora_up.weight': + 'output_blocks.8.1.transformer_blocks.0.ff.net.0.proj.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_ff_net_2.lora_down.weight': + 'output_blocks.8.1.transformer_blocks.0.ff.net.2.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_ff_net_2.lora_up.weight': + 'output_blocks.8.1.transformer_blocks.0.ff.net.2.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_attn2_to_q.lora_down.weight': + 'output_blocks.8.1.transformer_blocks.0.attn2.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_attn2_to_q.lora_up.weight': + 'output_blocks.8.1.transformer_blocks.0.attn2.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_attn2_to_k.lora_down.weight': + 'output_blocks.8.1.transformer_blocks.0.attn2.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_attn2_to_k.lora_up.weight': + 'output_blocks.8.1.transformer_blocks.0.attn2.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_attn2_to_v.lora_down.weight': + 'output_blocks.8.1.transformer_blocks.0.attn2.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_attn2_to_v.lora_up.weight': + 'output_blocks.8.1.transformer_blocks.0.attn2.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_attn2_to_out_0.lora_down.weight': + 'output_blocks.8.1.transformer_blocks.0.attn2.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_2_attentions_2_transformer_blocks_0_attn2_to_out_0.lora_up.weight': + 'output_blocks.8.1.transformer_blocks.0.attn2.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_attn1_to_q.lora_down.weight': + 'output_blocks.9.1.transformer_blocks.0.attn1.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_attn1_to_q.lora_up.weight': + 'output_blocks.9.1.transformer_blocks.0.attn1.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_attn1_to_k.lora_down.weight': + 'output_blocks.9.1.transformer_blocks.0.attn1.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_attn1_to_k.lora_up.weight': + 'output_blocks.9.1.transformer_blocks.0.attn1.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_attn1_to_v.lora_down.weight': + 'output_blocks.9.1.transformer_blocks.0.attn1.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_attn1_to_v.lora_up.weight': + 'output_blocks.9.1.transformer_blocks.0.attn1.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_attn1_to_out_0.lora_down.weight': + 'output_blocks.9.1.transformer_blocks.0.attn1.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_attn1_to_out_0.lora_up.weight': + 'output_blocks.9.1.transformer_blocks.0.attn1.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_ff_net_0_proj.lora_down.weight': + 'output_blocks.9.1.transformer_blocks.0.ff.net.0.proj.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_ff_net_0_proj.lora_up.weight': + 'output_blocks.9.1.transformer_blocks.0.ff.net.0.proj.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_ff_net_2.lora_down.weight': + 'output_blocks.9.1.transformer_blocks.0.ff.net.2.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_ff_net_2.lora_up.weight': + 'output_blocks.9.1.transformer_blocks.0.ff.net.2.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_attn2_to_q.lora_down.weight': + 'output_blocks.9.1.transformer_blocks.0.attn2.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_attn2_to_q.lora_up.weight': + 'output_blocks.9.1.transformer_blocks.0.attn2.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_attn2_to_k.lora_down.weight': + 'output_blocks.9.1.transformer_blocks.0.attn2.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_attn2_to_k.lora_up.weight': + 'output_blocks.9.1.transformer_blocks.0.attn2.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_attn2_to_v.lora_down.weight': + 'output_blocks.9.1.transformer_blocks.0.attn2.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_attn2_to_v.lora_up.weight': + 'output_blocks.9.1.transformer_blocks.0.attn2.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_attn2_to_out_0.lora_down.weight': + 'output_blocks.9.1.transformer_blocks.0.attn2.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_0_transformer_blocks_0_attn2_to_out_0.lora_up.weight': + 'output_blocks.9.1.transformer_blocks.0.attn2.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_attn1_to_q.lora_down.weight': + 'output_blocks.10.1.transformer_blocks.0.attn1.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_attn1_to_q.lora_up.weight': + 'output_blocks.10.1.transformer_blocks.0.attn1.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_attn1_to_k.lora_down.weight': + 'output_blocks.10.1.transformer_blocks.0.attn1.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_attn1_to_k.lora_up.weight': + 'output_blocks.10.1.transformer_blocks.0.attn1.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_attn1_to_v.lora_down.weight': + 'output_blocks.10.1.transformer_blocks.0.attn1.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_attn1_to_v.lora_up.weight': + 'output_blocks.10.1.transformer_blocks.0.attn1.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_attn1_to_out_0.lora_down.weight': + 'output_blocks.10.1.transformer_blocks.0.attn1.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_attn1_to_out_0.lora_up.weight': + 'output_blocks.10.1.transformer_blocks.0.attn1.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_ff_net_0_proj.lora_down.weight': + 'output_blocks.10.1.transformer_blocks.0.ff.net.0.proj.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_ff_net_0_proj.lora_up.weight': + 'output_blocks.10.1.transformer_blocks.0.ff.net.0.proj.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_ff_net_2.lora_down.weight': + 'output_blocks.10.1.transformer_blocks.0.ff.net.2.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_ff_net_2.lora_up.weight': + 'output_blocks.10.1.transformer_blocks.0.ff.net.2.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_attn2_to_q.lora_down.weight': + 'output_blocks.10.1.transformer_blocks.0.attn2.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_attn2_to_q.lora_up.weight': + 'output_blocks.10.1.transformer_blocks.0.attn2.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_attn2_to_k.lora_down.weight': + 'output_blocks.10.1.transformer_blocks.0.attn2.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_attn2_to_k.lora_up.weight': + 'output_blocks.10.1.transformer_blocks.0.attn2.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_attn2_to_v.lora_down.weight': + 'output_blocks.10.1.transformer_blocks.0.attn2.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_attn2_to_v.lora_up.weight': + 'output_blocks.10.1.transformer_blocks.0.attn2.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_attn2_to_out_0.lora_down.weight': + 'output_blocks.10.1.transformer_blocks.0.attn2.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_1_transformer_blocks_0_attn2_to_out_0.lora_up.weight': + 'output_blocks.10.1.transformer_blocks.0.attn2.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_attn1_to_q.lora_down.weight': + 'output_blocks.11.1.transformer_blocks.0.attn1.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_attn1_to_q.lora_up.weight': + 'output_blocks.11.1.transformer_blocks.0.attn1.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_attn1_to_k.lora_down.weight': + 'output_blocks.11.1.transformer_blocks.0.attn1.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_attn1_to_k.lora_up.weight': + 'output_blocks.11.1.transformer_blocks.0.attn1.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_attn1_to_v.lora_down.weight': + 'output_blocks.11.1.transformer_blocks.0.attn1.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_attn1_to_v.lora_up.weight': + 'output_blocks.11.1.transformer_blocks.0.attn1.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_attn1_to_out_0.lora_down.weight': + 'output_blocks.11.1.transformer_blocks.0.attn1.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_attn1_to_out_0.lora_up.weight': + 'output_blocks.11.1.transformer_blocks.0.attn1.to_out.0.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_ff_net_0_proj.lora_down.weight': + 'output_blocks.11.1.transformer_blocks.0.ff.net.0.proj.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_ff_net_0_proj.lora_up.weight': + 'output_blocks.11.1.transformer_blocks.0.ff.net.0.proj.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_ff_net_2.lora_down.weight': + 'output_blocks.11.1.transformer_blocks.0.ff.net.2.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_ff_net_2.lora_up.weight': + 'output_blocks.11.1.transformer_blocks.0.ff.net.2.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_attn2_to_q.lora_down.weight': + 'output_blocks.11.1.transformer_blocks.0.attn2.to_q.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_attn2_to_q.lora_up.weight': + 'output_blocks.11.1.transformer_blocks.0.attn2.to_q.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_attn2_to_k.lora_down.weight': + 'output_blocks.11.1.transformer_blocks.0.attn2.to_k.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_attn2_to_k.lora_up.weight': + 'output_blocks.11.1.transformer_blocks.0.attn2.to_k.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_attn2_to_v.lora_down.weight': + 'output_blocks.11.1.transformer_blocks.0.attn2.to_v.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_attn2_to_v.lora_up.weight': + 'output_blocks.11.1.transformer_blocks.0.attn2.to_v.lora_B.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_attn2_to_out_0.lora_down.weight': + 'output_blocks.11.1.transformer_blocks.0.attn2.to_out.0.lora_A.0_SwiftLoRA.weight', + 'up_blocks_3_attentions_2_transformer_blocks_0_attn2_to_out_0.lora_up.weight': + 'output_blocks.11.1.transformer_blocks.0.attn2.to_out.0.lora_B.0_SwiftLoRA.weight' +} + + +def convert_tuner_civitai_to_scepter(ckpt): + params_dict = CIVITAI_TO_SCEPTER_PARAMS_DICT + swift_lora, lora_config = {}, {} + lora_config = { + 'alpha_pattern': {}, + 'auto_mapping': None, + 'base_model_name_or_path': None, + 'bias': 'none', + 'enable_lora': None, + 'fan_in_fan_out': False, + 'inference_mode': False, + 'init_lora_weights': True, + 'layer_replication': None, + 'layers_pattern': None, + 'layers_to_transform': None, + 'loftq_config': {}, + 'lora_alpha': 256, + 'lora_dropout': 0.0, + 'lora_dtype': None, + 'lorap_emb_lr': 1e-06, + 'lorap_lr_ratio': 16.0, + 'megatron_config': None, + 'megatron_core': 'megatron.core', + 'model_key_mapping': None, + 'modules_to_save': None, + 'peft_type': 'LORA', + 'r': 256, + 'rank_pattern': {}, + 'revision': None, + 'swift_type': 'LORA', + '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))$', # noqa + 'task_type': None, + 'use_dora': False, + 'use_merged_linear': False, + 'use_qa_lora': False, + 'use_rslora': False, + } + alpha, r = -1, -1 + unload_params = [] + for k, v in ckpt.items(): + if k[len('lora_unet_'):] in params_dict and 'lora_unet' in k: + swift_key = 'model.' + params_dict[k[len('lora_unet_'):]] + swift_lora[swift_key] = v + elif 'lora_te' in k: + # 'lora_te_text_model_encoder_layers_0_mlp_fc1.lora_down.weight' + # 'cond_stage_model.transformer.text_model.encoder.layers.0.self_attn.k_proj.lora_A.0_SwiftLoRA.weight' + swift_key = k.replace('lora_te_', + 'transformer.') # .replace('_', '.') + swift_key = swift_key.replace('lora_down', 'lora_A').replace( + 'lora_up', 'lora_B') + swift_key = swift_key.replace('_', '.').replace( + '.model', '_model').replace('.A', '_A').replace('.B', '_B') + swift_key = swift_key.replace('self.', + 'self_').replace('.proj', '_proj') + swift_key = 'cond_stage_model.' + swift_key.replace( + '.weight', '.0_SwiftLoRA.weight') + swift_lora[swift_key] = v + elif 'alpha' not in k: + unload_params.append(k) + if 'alpha' in k and alpha == -1: + alpha = v.item() + if 'lora_down' in k and r == -1: + r = v.size(0) + assert r != -1 and alpha != -1 + lora_config['r'] = r + lora_config['lora_alpha'] = alpha + + return lora_config, swift_lora, unload_params + + +def convert_lora_checkpoint(ckpt_text=None, + ckpt_unet=None, + lora_prefix_text='lora_te', + lora_prefix_unet='lora_unet'): + model_dict = {} + if ckpt_text is not None: + for key, val in ckpt_text.items(): + key = (lora_prefix_text + '.' + key).replace('.', '_').replace( + '_0_SwiftLoRA_weight', '') + if key.endswith('_lora_A'): + key = key.replace('_lora_A', '.lora_down.weight') + if key.endswith('_lora_B'): + key = key.replace('_lora_B', '.lora_up.weight') + model_dict[key] = val + if ckpt_unet is not None: + for key, val in ckpt_unet.items(): + key = (lora_prefix_unet + '.' + key).replace('.', '_').replace( + '_0_SwiftLoRA_weight', '') + if key.endswith('_lora_A'): + key = key.replace('_lora_A', '.lora_down.weight') + if key.endswith('_lora_B'): + key = key.replace('_lora_B', '.lora_up.weight') + model_dict[key] = val + + return model_dict + + +def create_unet_diffusers_config(v2): + """ + Creates a config for the diffusers based on the config of the LDM model. + """ + # unet_params = original_config.model.params.unet_config.params + + block_out_channels = [ + UNET_PARAMS_MODEL_CHANNELS * mult for mult in UNET_PARAMS_CHANNEL_MULT + ] + + down_block_types = [] + resolution = 1 + for i in range(len(block_out_channels)): + block_type = 'CrossAttnDownBlock2D' if resolution in UNET_PARAMS_ATTENTION_RESOLUTIONS else 'DownBlock2D' + down_block_types.append(block_type) + if i != len(block_out_channels) - 1: + resolution *= 2 + + up_block_types = [] + for i in range(len(block_out_channels)): + block_type = 'CrossAttnUpBlock2D' if resolution in UNET_PARAMS_ATTENTION_RESOLUTIONS else 'UpBlock2D' + up_block_types.append(block_type) + resolution //= 2 + + config = dict( + sample_size=UNET_PARAMS_IMAGE_SIZE, + in_channels=UNET_PARAMS_IN_CHANNELS, + out_channels=UNET_PARAMS_OUT_CHANNELS, + down_block_types=tuple(down_block_types), + up_block_types=tuple(up_block_types), + block_out_channels=tuple(block_out_channels), + layers_per_block=UNET_PARAMS_NUM_RES_BLOCKS, + cross_attention_dim=UNET_PARAMS_CONTEXT_DIM + if not v2 else V2_UNET_PARAMS_CONTEXT_DIM, + attention_head_dim=UNET_PARAMS_NUM_HEADS + if not v2 else V2_UNET_PARAMS_ATTENTION_HEAD_DIM, + ) + + return config + + +def convert_ldm_clip_checkpoint_v1(checkpoint): + keys = list(checkpoint.keys()) + text_model_dict = {} + for key in keys: + if key.startswith('cond_stage_model.transformer'): + text_model_dict[ + key[len('cond_stage_model.transformer.'):]] = checkpoint[key] + return text_model_dict + + +def convert_ldm_unet_tuner_checkpoint(v2, + checkpoint, + config, + unet_key='model.diffusion_model.'): + """ + Takes a state dict and a config, and returns a converted checkpoint. + """ + + # extract state_dict for UNet + unet_state_dict = {} + keys = list(checkpoint.keys()) + for key in keys: + if key.startswith(unet_key): + unet_state_dict[key.replace(unet_key, '')] = checkpoint.pop(key) + + new_checkpoint = {} + + if 'time_embed.0.weight' in unet_state_dict: + new_checkpoint['time_embedding.linear_1.weight'] = unet_state_dict[ + 'time_embed.0.weight'] + if 'time_embedding.linear_1.bias' in unet_state_dict: + new_checkpoint['time_embedding.linear_1.bias'] = unet_state_dict[ + 'time_embed.0.bias'] + if 'time_embedding.linear_2.weight' in unet_state_dict: + new_checkpoint['time_embedding.linear_2.weight'] = unet_state_dict[ + 'time_embed.2.weight'] + if 'time_embedding.linear_2.bias' in unet_state_dict: + new_checkpoint['time_embedding.linear_2.bias'] = unet_state_dict[ + 'time_embed.2.bias'] + + if 'conv_in.weight' in unet_state_dict: + new_checkpoint['conv_in.weight'] = unet_state_dict[ + 'input_blocks.0.0.weight'] + if 'conv_in.bias' in unet_state_dict: + new_checkpoint['conv_in.bias'] = unet_state_dict[ + 'input_blocks.0.0.bias'] + + if 'conv_norm_out.weight' in unet_state_dict: + new_checkpoint['conv_norm_out.weight'] = unet_state_dict[ + 'out.0.weight'] + if 'conv_norm_out.bias' in unet_state_dict: + new_checkpoint['conv_norm_out.bias'] = unet_state_dict['out.0.bias'] + if 'conv_out.weight' in unet_state_dict: + new_checkpoint['conv_out.weight'] = unet_state_dict['out.2.weight'] + if 'conv_out.bias' in unet_state_dict: + new_checkpoint['conv_out.bias'] = unet_state_dict['out.2.bias'] + + # Retrieves the keys for the input blocks only + # num_input_blocks_list = len({".".join(layer.split(".")[]) for layer in unet_state_dict + # if "input_blocks" in layer}) + num_input_blocks_list = set([ + int(layer.split('.')[1]) for layer in unet_state_dict + if 'input_blocks' in layer + ]) + input_blocks = { + layer_id: + [key for key in unet_state_dict if f'input_blocks.{layer_id}.' in key] + for layer_id in num_input_blocks_list + } + + # Retrieves the keys for the middle blocks only + # num_middle_blocks_list = len({".".join(layer.split(".")[:2]) for layer in unet_state_dict + # if "middle_block" in layer}) + num_middle_blocks_list = set([ + int(layer.split('.')[1]) for layer in unet_state_dict + if 'middle_block' in layer + ]) + middle_blocks = { + layer_id: + [key for key in unet_state_dict if f'middle_block.{layer_id}.' in key] + for layer_id in num_middle_blocks_list + } + + # Retrieves the keys for the output blocks only + # num_output_blocks_list = len({".".join(layer.split(".")[:2]) for layer in unet_state_dict + # if "output_blocks" in layer}) + num_output_blocks_list = set([ + int(layer.split('.')[1]) for layer in unet_state_dict + if 'output_blocks' in layer + ]) + output_blocks = { + layer_id: [ + key for key in unet_state_dict + if f'output_blocks.{layer_id}.' in key + ] + for layer_id in num_output_blocks_list + } + + for i in num_input_blocks_list: + block_id = (i - 1) // (config['layers_per_block'] + 1) + layer_in_block_id = (i - 1) % (config['layers_per_block'] + 1) + + resnets = [ + key for key in input_blocks[i] if f'input_blocks.{i}.0' in key + and f'input_blocks.{i}.0.op' not in key + ] + attentions = [ + key for key in input_blocks[i] if f'input_blocks.{i}.1' in key + ] + + if f'input_blocks.{i}.0.op.weight' in unet_state_dict: + new_checkpoint[ + f'down_blocks.{block_id}.downsamplers.0.conv.weight'] = unet_state_dict.pop( + f'input_blocks.{i}.0.op.weight') + new_checkpoint[ + f'down_blocks.{block_id}.downsamplers.0.conv.bias'] = unet_state_dict.pop( + f'input_blocks.{i}.0.op.bias') + + paths = renew_resnet_paths(resnets) + meta_path = { + 'old': f'input_blocks.{i}.0', + 'new': f'down_blocks.{block_id}.resnets.{layer_in_block_id}' + } + assign_to_checkpoint(paths, + new_checkpoint, + unet_state_dict, + additional_replacements=[meta_path], + config=config) + + if len(attentions): + paths = renew_attention_paths(attentions) + meta_path = { + 'old': f'input_blocks.{i}.1', + 'new': f'down_blocks.{block_id}.attentions.{layer_in_block_id}' + } + assign_to_checkpoint(paths, + new_checkpoint, + unet_state_dict, + additional_replacements=[meta_path], + config=config) + + if 0 in middle_blocks: + resnet_0 = middle_blocks[0] + resnet_0_paths = renew_resnet_paths(resnet_0) + assign_to_checkpoint(resnet_0_paths, + new_checkpoint, + unet_state_dict, + config=config) + + if 2 in middle_blocks: + resnet_1 = middle_blocks[2] + resnet_1_paths = renew_resnet_paths(resnet_1) + assign_to_checkpoint(resnet_1_paths, + new_checkpoint, + unet_state_dict, + config=config) + + if 1 in middle_blocks: + attentions = middle_blocks[1] + attentions_paths = renew_attention_paths(attentions) + meta_path = {'old': 'middle_block.1', 'new': 'mid_block.attentions.0'} + assign_to_checkpoint(attentions_paths, + new_checkpoint, + unet_state_dict, + additional_replacements=[meta_path], + config=config) + + for i in num_output_blocks_list: + block_id = i // (config['layers_per_block'] + 1) + layer_in_block_id = i % (config['layers_per_block'] + 1) + output_block_layers = [ + shave_segments(name, 2) for name in output_blocks[i] + ] + output_block_list = {} + + for layer in output_block_layers: + layer_id, layer_name = layer.split('.')[0], shave_segments( + layer, 1) + if layer_id in output_block_list: + output_block_list[layer_id].append(layer_name) + else: + output_block_list[layer_id] = [layer_name] + + # if len(output_block_list) > 1: + if len(output_block_list) > 1 or (len(output_block_list) == 1 + and '1' in output_block_list): + resnets = [ + key for key in output_blocks[i] + if f'output_blocks.{i}.0' in key + ] + attentions = [ + key for key in output_blocks[i] + if f'output_blocks.{i}.1' in key + ] + + resnet_0_paths = renew_resnet_paths(resnets) + paths = renew_resnet_paths(resnets) + + meta_path = { + 'old': f'output_blocks.{i}.0', + 'new': f'up_blocks.{block_id}.resnets.{layer_in_block_id}' + } + assign_to_checkpoint(paths, + new_checkpoint, + unet_state_dict, + additional_replacements=[meta_path], + config=config) + + # if ["conv.weight", "conv.bias"] in output_block_list.values(): + # index = list(output_block_list.values()).index(["conv.weight", "conv.bias"]) + + for v in output_block_list.values(): + v.sort() + + if ['conv.bias', 'conv.weight'] in output_block_list.values(): + index = list(output_block_list.values()).index( + ['conv.bias', 'conv.weight']) + new_checkpoint[ + f'up_blocks.{block_id}.upsamplers.0.conv.bias'] = unet_state_dict[ + f'output_blocks.{i}.{index}.conv.bias'] + new_checkpoint[ + f'up_blocks.{block_id}.upsamplers.0.conv.weight'] = unet_state_dict[ + f'output_blocks.{i}.{index}.conv.weight'] + + # Clear attentions as they have been attributed above. + if len(attentions) == 2: + attentions = [] + + if len(attentions): + paths = renew_attention_paths(attentions) + meta_path = { + 'old': f'output_blocks.{i}.1', + 'new': + f'up_blocks.{block_id}.attentions.{layer_in_block_id}', + } + assign_to_checkpoint(paths, + new_checkpoint, + unet_state_dict, + additional_replacements=[meta_path], + config=config) + else: + resnet_0_paths = renew_resnet_paths(output_block_layers, + n_shave_prefix_segments=1) + for path in resnet_0_paths: + old_path = '.'.join(['output_blocks', str(i), path['old']]) + new_path = '.'.join([ + 'up_blocks', + str(block_id), 'resnets', + str(layer_in_block_id), path['new'] + ]) + + new_checkpoint[new_path] = unet_state_dict[old_path] + + if v2: + linear_transformer_to_conv(new_checkpoint) + + return new_checkpoint + + +def renew_resnet_paths(old_list, n_shave_prefix_segments=0): + """ + Updates paths inside resnets to the new naming scheme (local renaming) + """ + mapping = [] + for old_item in old_list: + new_item = old_item.replace('in_layers.0', 'norm1') + new_item = new_item.replace('in_layers.2', 'conv1') + + new_item = new_item.replace('out_layers.0', 'norm2') + new_item = new_item.replace('out_layers.3', 'conv2') + + new_item = new_item.replace('emb_layers.1', 'time_emb_proj') + new_item = new_item.replace('skip_connection', 'conv_shortcut') + + new_item = shave_segments( + new_item, n_shave_prefix_segments=n_shave_prefix_segments) + + mapping.append({'old': old_item, 'new': new_item}) + + return mapping + + +def linear_transformer_to_conv(checkpoint): + keys = list(checkpoint.keys()) + tf_keys = ['proj_in.weight', 'proj_out.weight'] + for key in keys: + if '.'.join(key.split('.')[-2:]) in tf_keys: + if checkpoint[key].ndim == 2: + checkpoint[key] = checkpoint[key].unsqueeze(2).unsqueeze(2) + + +def assign_to_checkpoint(paths, + checkpoint, + old_checkpoint, + attention_paths_to_split=None, + additional_replacements=None, + config=None): + """ + This does the final conversion step: take locally converted weights and apply a global renaming + to them. It splits attention layers, and takes into account additional replacements + that may arise. + + Assigns the weights to the new checkpoint. + """ + assert isinstance( + paths, list + ), "Paths should be a list of dicts containing 'old' and 'new' keys." + + # Splits the attention layers into three variables. + if attention_paths_to_split is not None: + for path, path_map in attention_paths_to_split.items(): + old_tensor = old_checkpoint[path] + channels = old_tensor.shape[0] // 3 + + target_shape = (-1, + channels) if len(old_tensor.shape) == 3 else (-1) + + num_heads = old_tensor.shape[0] // config['num_head_channels'] // 3 + + old_tensor = old_tensor.reshape((num_heads, 3 * channels // + num_heads) + old_tensor.shape[1:]) + query, key, value = old_tensor.split(channels // num_heads, dim=1) + + checkpoint[path_map['query']] = query.reshape(target_shape) + checkpoint[path_map['key']] = key.reshape(target_shape) + checkpoint[path_map['value']] = value.reshape(target_shape) + + for path in paths: + new_path = path['new'] + + # These have already been assigned + if attention_paths_to_split is not None and new_path in attention_paths_to_split: + continue + + # Global renaming happens here + new_path = new_path.replace('middle_block.0', 'mid_block.resnets.0') + new_path = new_path.replace('middle_block.1', 'mid_block.attentions.0') + new_path = new_path.replace('middle_block.2', 'mid_block.resnets.1') + + if additional_replacements is not None: + for replacement in additional_replacements: + new_path = new_path.replace(replacement['old'], + replacement['new']) + + # proj_attn.weight has to be converted from conv 1D to linear + if 'proj_attn.weight' in new_path: + checkpoint[new_path] = old_checkpoint[path['old']][:, :, 0] + else: + checkpoint[new_path] = old_checkpoint[path['old']] + + +def shave_segments(path, n_shave_prefix_segments=1): + """ + Removes segments. Positive values shave the first segments, negative shave the last segments. + """ + if n_shave_prefix_segments >= 0: + return '.'.join(path.split('.')[n_shave_prefix_segments:]) + else: + return '.'.join(path.split('.')[:n_shave_prefix_segments]) + + +def renew_attention_paths(old_list, n_shave_prefix_segments=0): + """ + Updates paths inside attentions to the new naming scheme (local renaming) + """ + mapping = [] + for old_item in old_list: + new_item = old_item + + # new_item = new_item.replace('norm.weight', 'group_norm.weight') + # new_item = new_item.replace('norm.bias', 'group_norm.bias') + + # new_item = new_item.replace('proj_out.weight', 'proj_attn.weight') + # new_item = new_item.replace('proj_out.bias', 'proj_attn.bias') + + # new_item = shave_segments(new_item, n_shave_prefix_segments=n_shave_prefix_segments) + + mapping.append({'old': old_item, 'new': new_item}) + + return mapping diff --git a/scepter/modules/utils/probe.py b/scepter/modules/utils/probe.py index 2dc7dcc..cbdefe2 100644 --- a/scepter/modules/utils/probe.py +++ b/scepter/modules/utils/probe.py @@ -7,7 +7,6 @@ from numbers import Number import numpy as np import torch from PIL import Image - from scepter.modules.utils.file_system import FS @@ -200,18 +199,18 @@ class ProbeData(): build_label, dict) self.build_label = build_label - def save_image(self, file_prefix, images): + def save_image(self, file_prefix, images, image_postfix): np_shape = images.shape # 4D shape_str = '_'.join([str(v) for v in np_shape]) if len(np_shape) == 4: # channel is 1 or 3 - if np_shape[-1] == 1 or np_shape[-1] == 3: + if np_shape[-1] == 1 or np_shape[-1] == 3 or np_shape[-1] == 4: if np_shape[-1] == 1: images = images.reshape(images.shape[:-1]) file_list = [] for idx in range(np_shape[0]): - file_path = file_prefix + f'_probe_{idx}_[{shape_str}].jpg' + file_path = file_prefix + f'_probe_{idx}_[{shape_str}].{image_postfix}' with FS.put_to(file_path) as local_path: Image.fromarray(images[idx, ...]).save(local_path) file_list.append(file_path) @@ -219,18 +218,18 @@ class ProbeData(): else: raise f"Ensure your data's dim is BWHC, and channel is 1 or 3 for {file_prefix}" elif len(np_shape) == 3: - if np_shape[-1] == 1 or np_shape[-1] == 3: + if np_shape[-1] == 1 or np_shape[-1] == 3 or np_shape[-1] == 4: if np_shape[-1] == 1: images = images.reshape(images.shape[:-1]) - file_path = file_prefix + f'_probe_[{shape_str}].jpg' + file_path = file_prefix + f'_probe_[{shape_str}].{image_postfix}' with FS.put_to(file_path) as local_path: Image.fromarray(images).save(local_path) return file_path else: images = images.reshape(list(images.shape) + [1]) - return self.save_image(file_prefix, images) + return self.save_image(file_prefix, images, image_postfix) elif len(np_shape) == 2: - file_path = file_prefix + f'_probe_[{shape_str}].jpg' + file_path = file_prefix + f'_probe_[{shape_str}].{image_postfix}' with FS.put_to(file_path) as local_path: Image.fromarray(images).save(local_path) return file_path @@ -278,13 +277,13 @@ class ProbeData(): def distribute(self): return self._distribute_dict - def to_log(self, prefix=None): + def to_log(self, prefix=None, image_postfix='jpg'): if isinstance(self.data, np.ndarray): if prefix is None: raise 'You should provide the save prefix for array sample.' # save jpg if self.is_image: - ret_data = self.save_image(prefix, self.data) + ret_data = self.save_image(prefix, self.data, image_postfix) if isinstance(ret_data, list): ret_data = [ret_data] if self.build_html: @@ -314,7 +313,8 @@ class ProbeData(): for idx, v in enumerate(self.data): prefix_path = os.path.join(prefix, f'{idx}') if self.is_image: - ret_images = self.save_image(prefix_path, v) + ret_images = self.save_image(prefix_path, v, + image_postfix) ret_data.append(ret_images if isinstance( ret_images, list) else [ret_images]) if self.build_html: @@ -354,7 +354,8 @@ class ProbeData(): for k, v in self.data: prefix_path = os.path.join(prefix, f'{k}_') if self.is_image: - ret_images = self.save_image(prefix_path, v) + ret_images = self.save_image(prefix_path, v, + image_postfix) if isinstance(ret_images, list): ret_data.append(ret_images) else: diff --git a/scepter/modules/utils/video_reader/frame_sampler.py b/scepter/modules/utils/video_reader/frame_sampler.py index 943eb12..aea2687 100644 --- a/scepter/modules/utils/video_reader/frame_sampler.py +++ b/scepter/modules/utils/video_reader/frame_sampler.py @@ -53,7 +53,6 @@ import math import random import torch - from scepter.modules.utils.config import Config from scepter.modules.utils.registry import Registry diff --git a/scepter/modules/utils/video_reader/video_reader.py b/scepter/modules/utils/video_reader/video_reader.py index ff6684e..3fad856 100644 --- a/scepter/modules/utils/video_reader/video_reader.py +++ b/scepter/modules/utils/video_reader/video_reader.py @@ -9,7 +9,6 @@ import cv2 import numpy as np import torch import torch.utils.dlpack as dlpack - from scepter.modules.utils.file_system import FS from scepter.modules.utils.video_reader.frame_sampler import do_frame_sample diff --git a/scepter/studio/home/home.py b/scepter/studio/home/home.py index 9b87e80..0c48594 100644 --- a/scepter/studio/home/home.py +++ b/scepter/studio/home/home.py @@ -2,7 +2,6 @@ # Copyright (c) Alibaba, Inc. and its affiliates. 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 diff --git a/scepter/studio/home/home_ui/desc_ui.py b/scepter/studio/home/home_ui/desc_ui.py index 1748a83..1d964d2 100644 --- a/scepter/studio/home/home_ui/desc_ui.py +++ b/scepter/studio/home/home_ui/desc_ui.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. import gradio as gr - from scepter.studio.home.home_ui.component_names import DescUIName from scepter.studio.utils.uibase import UIBase diff --git a/scepter/studio/home/home_ui/guide_ui.py b/scepter/studio/home/home_ui/guide_ui.py index 54105a6..2098bf0 100644 --- a/scepter/studio/home/home_ui/guide_ui.py +++ b/scepter/studio/home/home_ui/guide_ui.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. import gradio as gr - from scepter.studio.home.home_ui.component_names import GuideUIName from scepter.studio.utils.uibase import UIBase diff --git a/scepter/studio/inference/inference.py b/scepter/studio/inference/inference.py index e7c2fc0..090bf54 100644 --- a/scepter/studio/inference/inference.py +++ b/scepter/studio/inference/inference.py @@ -5,7 +5,6 @@ from collections import OrderedDict 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 @@ -156,54 +155,70 @@ class InferenceUI(): def change_setting_tab(check_box, default_diffusion_model, *args): selected_tab = 'diffusion_ui' - ui_tabs_state = [False] * len(args) - largen_index = self.check_box_controlled_tabs.index('largen') - largen_key = self.component_names.check_box_for_setting[ - largen_index] - largen_status = args[largen_index] - stylebooth_index = self.check_box_controlled_tabs.index( - 'stylebooth') - stylebooth_key = self.component_names.check_box_for_setting[ - stylebooth_index] - stylebooth_status = args[stylebooth_index] - for key in check_box: - i = self.component_names.check_box_for_setting.index(key) - ui_tabs_state[i] = True - if ui_tabs_state[i] != args[i]: - selected_tab = self.check_box_controlled_tabs[i] + '_ui' + name2key_map = dict( + zip(self.component_names.check_box_for_setting, + self.check_box_controlled_tabs)) + key2name_map = dict( + zip(self.check_box_controlled_tabs, + self.component_names.check_box_for_setting)) + ui_tabs_state = dict.fromkeys(self.check_box_controlled_tabs, + False) + gr_state = dict(zip(self.check_box_controlled_tabs, args)) + for name in check_box: + key = name2key_map[name] + ui_tabs_state[key] = True + if ui_tabs_state[key] != gr_state[key]: + selected_tab = key + '_ui' + if len(check_box) >= 1 and selected_tab == 'diffusion_ui': + selected_tab = name2key_map[check_box[0]] + '_ui' + new_check_box_value = check_box - for key in check_box: - i = self.component_names.check_box_for_setting.index(key) - if ui_tabs_state[i] != args[i]: - if i in [largen_index, stylebooth_index]: - new_check_box_value = [key] - for j in range(len(ui_tabs_state)): - ui_tabs_state[j] = j == i - else: - new_check_box_value = [ - k for k in check_box - if k not in [largen_key, stylebooth_key] + for name in check_box: + key = name2key_map[name] + if ui_tabs_state[key] != gr_state[key]: + if key == 'largen': + allowed_keys = [key] + elif key == 'stylebooth': + allowed_keys = [key, 'tuner'] + elif key == 'tuner': + allowed_keys = [ + key for key in self.check_box_controlled_tabs + if key not in ('largen') ] - ui_tabs_state[largen_index] = False - ui_tabs_state[stylebooth_index] = False + else: + allowed_keys = [ + key for key in self.check_box_controlled_tabs + if key not in ('largen', 'stylebooth') + ] + allowed_names = [key2name_map[key] for key in allowed_keys] + new_check_box_value = [ + n for n in check_box if n in allowed_names + ] + ui_tabs_state = { + key: (value and key in allowed_keys) + for key, value in ui_tabs_state.items() + } - ui_tabs_updates = [gr.update(visible=v) for v in ui_tabs_state] + ui_tabs_updates = [ + gr.update(visible=ui_tabs_state[key]) + for key in self.check_box_controlled_tabs + ] - if ui_tabs_state[largen_index]: + if ui_tabs_state['largen']: diffusion_model = gr.Dropdown( label=self.model_manage_ui.component_names.diffusion_model, choices=self.model_manage_ui. default_choices['diffusion_model']['choices'], value='LARGEN_LargenUNetXL', interactive=False) - elif ui_tabs_state[stylebooth_index]: + elif ui_tabs_state['stylebooth']: diffusion_model = gr.Dropdown( label=self.model_manage_ui.component_names.diffusion_model, choices=self.model_manage_ui. default_choices['diffusion_model']['choices'], value='EDIT_DiffusionUNet', interactive=False) - elif largen_status or stylebooth_status: + elif gr_state['largen'] or gr_state['stylebooth']: diffusion_model = gr.Dropdown( label=self.model_manage_ui.component_names.diffusion_model, choices=self.model_manage_ui. @@ -219,12 +234,18 @@ class InferenceUI(): value=default_diffusion_model, interactive=True) - return gr.CheckboxGroup( + app_choices = self.stylebooth_ui.component_names.apps[ + -1 if ui_tabs_state['stylebooth'] and ui_tabs_state['tuner'] + else 0] + ui_tabs_state = [ + ui_tabs_state[key] for key in self.check_box_controlled_tabs + ] + return (gr.CheckboxGroup( choices=self.component_names.check_box_for_setting, value=new_check_box_value, - show_label=False), gr.update( - selected=selected_tab - ), *ui_tabs_state, *ui_tabs_updates, diffusion_model + show_label=False), gr.update(selected=selected_tab), + *ui_tabs_state, *ui_tabs_updates, diffusion_model, + gr.update(value=app_choices)) gr_states = [ self.tab_ui[name].state for name in self.check_box_controlled_tabs @@ -240,7 +261,8 @@ class InferenceUI(): ], outputs=[ self.check_box_for_setting, self.setting_tab, *gr_states, - *gr_tabs, self.model_manage_ui.diffusion_model + *gr_tabs, self.model_manage_ui.diffusion_model, + self.stylebooth_ui.selected_app ], queue=True) diff --git a/scepter/studio/inference/inference_ui/component_names.py b/scepter/studio/inference/inference_ui/component_names.py index 70f8ccd..98dab99 100644 --- a/scepter/studio/inference/inference_ui/component_names.py +++ b/scepter/studio/inference/inference_ui/component_names.py @@ -505,8 +505,10 @@ class StyleboothUIName(): def __init__(self, language='en'): if language == 'en': self.dropdown_name = 'Application' - self.apps = ['Text-based Style Editing'] - # self.apps = ["Text-based Style Editing", "Exemplar-based Style Editing"] + self.apps = [ + 'Text-based Style Editing', 'Editing Image with Tuners' + ] + # self.apps = ["Text-based Style Editing", "Exemplar-based Style Editing", 'Editing Image with Tuners'] self.source_image = 'Source Image' self.exemplar_image = 'Exemplar Image' self.ins_format = 'Instruction Format (select or rewrite, en only)' @@ -518,8 +520,8 @@ class StyleboothUIName(): self.compose_button = 'Assemble Style Editing Instruction to Prompt' elif language == 'zh': self.dropdown_name = '应用' - self.apps = ['根据文本编辑风格'] - # self.apps = ["根据文本编辑风格", "根据风格样例编辑风格"] + self.apps = ['根据文本编辑风格', '使用微调编辑图像'] + # self.apps = ["根据文本编辑风格", "根据风格样例编辑风格", '使用微调编辑图像'] self.source_image = '源图片' self.exemplar_image = '样例图片' self.ins_format = '指令模版 (选择或者新写,仅英文)' diff --git a/scepter/studio/inference/inference_ui/control_ui.py b/scepter/studio/inference/inference_ui/control_ui.py index 05c8a19..a065c54 100644 --- a/scepter/studio/inference/inference_ui/control_ui.py +++ b/scepter/studio/inference/inference_ui/control_ui.py @@ -5,7 +5,6 @@ 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 diff --git a/scepter/studio/inference/inference_ui/diffusion_ui.py b/scepter/studio/inference/inference_ui/diffusion_ui.py index d23023a..c7146e9 100644 --- a/scepter/studio/inference/inference_ui/diffusion_ui.py +++ b/scepter/studio/inference/inference_ui/diffusion_ui.py @@ -4,7 +4,6 @@ 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 diff --git a/scepter/studio/inference/inference_ui/gallery_ui.py b/scepter/studio/inference/inference_ui/gallery_ui.py index 15cd893..6eb3c3a 100644 --- a/scepter/studio/inference/inference_ui/gallery_ui.py +++ b/scepter/studio/inference/inference_ui/gallery_ui.py @@ -6,7 +6,6 @@ from collections import OrderedDict import gradio as gr import numpy as np from PIL import Image - from scepter.modules.utils.file_system import FS from scepter.studio.inference.inference_ui.component_names import GalleryUIName from scepter.studio.utils.uibase import UIBase diff --git a/scepter/studio/inference/inference_ui/largen_ui.py b/scepter/studio/inference/inference_ui/largen_ui.py index 327d366..4845499 100644 --- a/scepter/studio/inference/inference_ui/largen_ui.py +++ b/scepter/studio/inference/inference_ui/largen_ui.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. +import albumentations as A import cv2 import gradio as gr import numpy as np @@ -8,8 +9,6 @@ import torch import torchvision.transforms as T import torchvision.transforms.functional as TF from PIL import Image - -import albumentations as A from scepter.modules.annotator.registry import ANNOTATORS from scepter.modules.model.utils.data_utils import (box2squre, expand_bbox, get_bbox_from_mask, diff --git a/scepter/studio/inference/inference_ui/mantra_ui.py b/scepter/studio/inference/inference_ui/mantra_ui.py index 654251c..23bb5a3 100644 --- a/scepter/studio/inference/inference_ui/mantra_ui.py +++ b/scepter/studio/inference/inference_ui/mantra_ui.py @@ -2,9 +2,9 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import os -import gradio as gr from tqdm import tqdm +import gradio as gr 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 diff --git a/scepter/studio/inference/inference_ui/model_manage_ui.py b/scepter/studio/inference/inference_ui/model_manage_ui.py index 14a0b73..4de6fb5 100644 --- a/scepter/studio/inference/inference_ui/model_manage_ui.py +++ b/scepter/studio/inference/inference_ui/model_manage_ui.py @@ -2,7 +2,6 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import gradio as gr - from scepter.studio.inference.inference_ui.component_names import \ ModelManageUIName from scepter.studio.utils.uibase import UIBase diff --git a/scepter/studio/inference/inference_ui/refiner_ui.py b/scepter/studio/inference/inference_ui/refiner_ui.py index 4b27aac..e925e58 100644 --- a/scepter/studio/inference/inference_ui/refiner_ui.py +++ b/scepter/studio/inference/inference_ui/refiner_ui.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. import gradio as gr - from scepter.studio.inference.inference_ui.component_names import RefinerUIName from scepter.studio.utils.uibase import UIBase diff --git a/scepter/studio/inference/inference_ui/stylebooth_ui.py b/scepter/studio/inference/inference_ui/stylebooth_ui.py index edff6cb..334b3a6 100644 --- a/scepter/studio/inference/inference_ui/stylebooth_ui.py +++ b/scepter/studio/inference/inference_ui/stylebooth_ui.py @@ -2,7 +2,6 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import gradio as gr - from scepter.studio.inference.inference_ui.component_names import \ StyleboothUIName from scepter.studio.utils.uibase import UIBase @@ -22,7 +21,6 @@ class StyleboothUI(UIBase): label=self.component_names.dropdown_name, choices=self.component_names.apps, value=self.component_names.apps[0], - type='index', interactive=False) with gr.Row(equal_height=True): with gr.Column(variant='panel', @@ -38,38 +36,32 @@ class StyleboothUI(UIBase): scale=1, min_width=0, visible=True) as self.col2: - with gr.Group(visible=True): + with gr.Group(): self.exemplar_image = gr.Image( label=self.component_names.exemplar_image, type='pil', interactive=True, visible=False) - with gr.Row(equal_height=True): - with gr.Group(visible=True): - self.instruction_format = gr.Dropdown( - label=self.component_names.ins_format, - choices=self.component_names. - tb_ins_format_choice, - value=self.component_names. - tb_ins_format_choice[0], - multiselect=False, - interactive=True, - allow_custom_value=True) - self.target_style = gr.Dropdown( - label=self.component_names.style_format. - format(self.component_names.tb_identifier), - choices=self.component_names. - tb_target_style, - value=None, - multiselect=False, - interactive=True, - allow_custom_value=True) - self.compose_instruction = gr.Button( - label=self.component_names.compose_button, - value=self.component_names.compose_button, - elem_classes='type_row', - elem_id='push', - visible=True) + self.instruction_format = gr.Dropdown( + label=self.component_names.ins_format, + choices=self.component_names.tb_ins_format_choice, + value=self.component_names.tb_ins_format_choice[0], + multiselect=False, + interactive=True, + allow_custom_value=True) + self.target_style = gr.Dropdown( + label=self.component_names.style_format.format( + self.component_names.tb_identifier), + choices=self.component_names.tb_target_style, + value=None, + multiselect=False, + interactive=True, + allow_custom_value=True) + self.compose_instruction = gr.Button( + label=self.component_names.compose_button, + value=self.component_names.compose_button, + elem_classes='type_row', + elem_id='push') with gr.Column(variant='panel', scale=1, min_width=0): with gr.Group(visible=True): self.guide_scale_text = gr.Slider( @@ -130,42 +122,51 @@ class StyleboothUI(UIBase): def set_callbacks(self, model_manage_ui, diffusion_ui, gallery_ui, **kwargs): def app_change(app): - selected = app - # selected = None - # for i, name in enumerate(self.component_names.apps): - # if name == app: - # selected = i - # continue - # assert selected in (0, 1) - if not selected: + if app == self.component_names.apps[-1]: + format_choices = [''] + style_choices = [''] + identifier = '<>' + image_visible = False + style_visible = False + elif app == self.component_names.apps[0]: format_choices = self.component_names.tb_ins_format_choice style_choices = self.component_names.tb_target_style + identifier = self.component_names.tb_identifier + image_visible = False + style_visible = True else: format_choices = self.component_names.eb_ins_format_choice style_choices = self.component_names.eb_target_style + identifier = self.component_names.eb_identifier + image_visible = True + style_visible = True - identifier = self.component_names.tb_identifier if selected == 0 else self.component_names.eb_identifier - return (gr.update(value=None, visible=(selected != 0)), + return (gr.update(value=None, visible=image_visible), gr.update(choices=format_choices, value=format_choices[0]), - gr.update(choices=style_choices, - value=style_choices[0], - interactive=(selected == 0), - label=self.component_names.style_format.format( - identifier))) + gr.update( + choices=style_choices, + value=style_choices[0], + interactive=(app == self.component_names.apps[0]), + label=self.component_names.style_format.format( + identifier)), gr.update(visible=style_visible)) self.selected_app.change(app_change, inputs=[self.selected_app], outputs=[ self.exemplar_image, - self.instruction_format, self.target_style + self.instruction_format, + self.target_style, self.col2 ], queue=False) def compose_instruction(format, style, app): - if app == 1: + if app == self.component_names.apps[-1]: + return '' + elif app == self.component_names.apps[0]: + identifier = self.component_names.tb_identifier + return format.replace(identifier, style) + else: return format - identifier = self.component_names.tb_identifier if app == 0 else self.component_names.eb_identifier - return format.replace(identifier, style) self.compose_instruction.click(compose_instruction, inputs=[ diff --git a/scepter/studio/inference/inference_ui/tuner_ui.py b/scepter/studio/inference/inference_ui/tuner_ui.py index 111ae5e..cbe646a 100644 --- a/scepter/studio/inference/inference_ui/tuner_ui.py +++ b/scepter/studio/inference/inference_ui/tuner_ui.py @@ -2,9 +2,9 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import os -import gradio as gr from tqdm import tqdm +import gradio as gr 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 @@ -145,10 +145,22 @@ class TunerUI(UIBase): if tuner_model is not None and len(tuner_model) > 0: tuner_info = self.name_level_tuners.get(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) + if tuner_info.get('IMAGE_PATH', None): + if not FS.exists(tuner_info.IMAGE_PATH): + if FS.exists( + os.path.join(tuner_info.MODEL_PATH, + tuner_info.IMAGE_PATH)): + local_image_path = FS.get_from( + os.path.join(tuner_info.MODEL_PATH, + tuner_info.IMAGE_PATH)) + else: + local_image_path = FS.get_from(tuner_info.IMAGE_PATH) + else: + local_image_path = FS.get_from(tuner_info.IMAGE_PATH) + + if FS.exists(local_image_path): + tuner_info.IMAGE_PATH = str(local_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', '')), @@ -181,10 +193,23 @@ class TunerUI(UIBase): if tuner_model is not None and len(tuner_model) > 0: tuner_info = self.name_level_tuners.get(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) + + if tuner_info.get('IMAGE_PATH', None): + if not FS.exists(tuner_info.IMAGE_PATH): + if FS.exists( + os.path.join(tuner_info.MODEL_PATH, + tuner_info.IMAGE_PATH)): + local_image_path = FS.get_from( + os.path.join(tuner_info.MODEL_PATH, + tuner_info.IMAGE_PATH)) + else: + local_image_path = FS.get_from(tuner_info.IMAGE_PATH) + else: + local_image_path = FS.get_from(tuner_info.IMAGE_PATH) + + if FS.exists(local_image_path): + tuner_info.IMAGE_PATH = str(local_image_path) + return (gr.Tabs(selected='tuner_manager'), gr.Text(value=tuner_info.NAME), gr.Text(value=''), gr.Text(value=tuner_info.get('TUNER_TYPE', '')), diff --git a/scepter/studio/preprocess/caption_editor_ui/component_names.py b/scepter/studio/preprocess/caption_editor_ui/component_names.py index 5945944..76e4464 100644 --- a/scepter/studio/preprocess/caption_editor_ui/component_names.py +++ b/scepter/studio/preprocess/caption_editor_ui/component_names.py @@ -30,9 +30,19 @@ class CreateDatasetUIName(): self.zip_file = 'Upload Dataset(Zip/Txt)' self.zip_file_url = 'Dataset Url' self.default_dataset_repo = 'https://www.modelscope.cn/api/v1/models/iic/scepter/' - self.default_dataset_zip = \ - self.default_dataset_repo + 'repo?Revision=master&FilePath=datasets/3D_example_csv.zip' - self.default_dataset_name = '3D_example' + self.default_dataset_zip = { + 'scepter_txt2img': + f' {self.default_dataset_repo}repo?Revision=master&FilePath=datasets/3D_example_csv.zip ', + 'scepter_img2img': + f' {self.default_dataset_repo}repo?Revision=master&FilePath=datasets/hed_pair.zip ' + } + self.default_dataset_zip = ' and '.join([f"[{k}]({v})" for k, v in self.default_dataset_zip.items()]) + + self.default_dataset_name = { + 'scepter_txt2img': '3D_example', + 'scepter_img2img': 'hed_example' + } + self.btn_create_datasets_from_file = 'Create Dataset From File' self.user_direction = ( '### User Guide: \n' + @@ -45,8 +55,8 @@ class CreateDatasetUIName(): "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.' - f'The ZIP example is: {self.default_dataset_zip}. \n' # noqa + 'one level subfolder of images whose format are in jpg, jpeg, png, webp. ' + f'See the ZIP examples: {self.default_dataset_zip}. \n' # noqa 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' '* For processing and training with large-scale data(for example more than 10K samples), ' @@ -93,9 +103,18 @@ class CreateDatasetUIName(): self.zip_file = '上传数据集' self.zip_file_url = '数据集链接' self.default_dataset_repo = 'https://www.modelscope.cn/api/v1/models/iic/scepter/' - self.default_dataset_zip = \ - self.default_dataset_repo + 'repo?Revision=master&FilePath=datasets/3D_example_csv.zip' - self.default_dataset_name = '3D_example' + self.default_dataset_zip = { + 'scepter_txt2img': + f' {self.default_dataset_repo}repo?Revision=master&FilePath=datasets/3D_example_csv.zip ', + 'scepter_img2img': + f' {self.default_dataset_repo}repo?Revision=master&FilePath=datasets/hed_pair.zip ' + } + self.default_dataset_zip = ' 和 '.join([f"[{k}]({v})" for k, v in self.default_dataset_zip.items()]) + + self.default_dataset_name = { + 'scepter_txt2img': '3D_example', + 'scepter_img2img': 'hed_example' + } self.btn_create_datasets_from_file = '从文件新建' self.user_direction = ( '### 使用说明 \n' + @@ -129,23 +148,30 @@ class CreateDatasetUIName(): class DatasetGalleryUIName(): def __init__(self, language='en'): if language == 'en': - self.system_log = 'System Log: {} ' - self.upload_image = 'Upload Image' + self.system_log = 'Operation Log: {} ' + self.illegal_blank_dataset = 'Illgal or blank dataset is not allowed editing.' + self.delete_blank_dataset = 'Blank dataset is not allowed deleting.' + self.upload_image = 'Upload Target Image' + self.upload_src_image = 'Upload Source Image' self.upload_image_btn = '\U00002714' # ✔️ self.cancel_upload_btn = '\U00002716' # ✖️ self.image_caption = 'Image Caption' - self.ori_caption = 'Original Caption' self.btn_modify = '\U0001F4DD' # 📝 self.btn_delete = '\U0001f5d1' # 🗑️ self.btn_add = '\U00002795' # ➕ + self.ori_caption = 'Original Caption' self.dataset_images = f'Original Images,click{self.btn_modify} into editable mode.' + self.dataset_src_images = f'Source Images to be edited,click{self.btn_modify} into editable mode.' + self.edit_caption = f'Editable Caption,click{self.btn_modify} into editable mode.' - self.dataset_images = f'Original Images,click{self.btn_modify} into editable mode.' + self.edit_dataset_images = f'Editable Images,click{self.btn_modify} into editable mode.' + self.edit_dataset_src_images = 'Editable Source Images to be edited.' self.ori_dataset = 'Original Data Height({}) * Width({}) and Image Format({})' self.edit_dataset = 'Editable Data Height({}) * Width({}) and Image Format({})' - self.upload_image_info = 'Image Information: Height({}) * Width({}) and Image Format({})' + self.upload_image_info = 'Image Information: Height({}) * Width({})' + self.upload_src_image_info = 'Source Image Information: Height({}) * Width({})' self.range_mode_name = [ 'Current sample', 'All samples', 'Samples in range' @@ -190,18 +216,21 @@ class DatasetGalleryUIName(): # Error or Warning elif language == 'zh': - self.system_log = '系统日志: {} ' - self.upload_image = '上传图片' + self.system_log = '操作日志: {} ' + self.illegal_blank_dataset = '不合法或空白数据集不允许编辑。' + self.delete_blank_dataset = '空白数据集不允许删除。' + self.upload_image = '上传目标图片' + self.upload_src_image = '上传待编辑图片' self.upload_image_btn = '\U00002714' # ✔️ self.cancel_upload_btn = '\U00002716' # ✖️ self.image_caption = '图片描述' - # self.image_height = '高度' - # self.image_width = '宽度' - # self.image_format = '格式' - self.btn_modify = '\U0001F4DD' # 📝 self.dataset_images = f'图片数据,点击{self.btn_modify}进入编辑模式' + self.dataset_src_images = f'待编辑图片数据,点击{self.btn_modify}进入编辑模式' + + self.edit_dataset_images = '可编辑图片数据' + self.edit_dataset_src_images = '可编辑待编辑图片数据' self.btn_delete = '\U0001f5d1' # 🗑️ self.btn_add = '\U00002795' # ➕ @@ -213,6 +242,7 @@ class DatasetGalleryUIName(): self.ori_dataset = '原始数据 高({}) * 宽({}) 图像格式({})' self.edit_dataset = '可编辑数据 高({}) * 宽({}) 图像格式({})' self.upload_image_info = '图像信息 高({}) * 宽({})' + self.upload_src_image_info = '源图像信息 高({}) * 宽({})' self.range_mode_name = ['当前样本', '全部样本', '指定范围'] self.samples_range = '处理样本范围' @@ -262,6 +292,7 @@ class ExportDatasetUIName(): self.upload_err1 = 'Failed to compress the file!' self.go_to_train = 'Go to train...' + self.dataset_source = 'Dataset Management' elif language == 'zh': self.btn_export_zip = '导出数据' self.btn_export_list = '导出列表' @@ -270,6 +301,7 @@ class ExportDatasetUIName(): self.upload_err1 = '压缩文件失败!' self.go_to_train = '去训练...' + self.dataset_source = '数据管理器' class Text2ImageDataCardName(): diff --git a/scepter/studio/preprocess/caption_editor_ui/create_dataset_ui.py b/scepter/studio/preprocess/caption_editor_ui/create_dataset_ui.py index 0815d7e..9a764ef 100644 --- a/scepter/studio/preprocess/caption_editor_ui/create_dataset_ui.py +++ b/scepter/studio/preprocess/caption_editor_ui/create_dataset_ui.py @@ -6,12 +6,16 @@ import datetime import os.path from collections import OrderedDict -import gradio as gr +from tqdm import tqdm +import gradio as gr from scepter.modules.utils.file_system import FS from scepter.studio.preprocess.caption_editor_ui.component_names import \ CreateDatasetUIName -from scepter.studio.preprocess.utils.data_card import Text2ImageDataCard +from scepter.studio.preprocess.utils.img2img_data_card import \ + Image2ImageDataCard +from scepter.studio.preprocess.utils.txt2img_data_card import \ + Text2ImageDataCard from scepter.studio.utils.uibase import UIBase refresh_symbol = '\U0001f504' # 🔄 @@ -31,8 +35,12 @@ class CreateDatasetUI(UIBase): def __init__(self, cfg, is_debug=False, language='en'): self.work_dir = cfg.WORK_DIR self.language = language - self.dataset_type_dict = OrderedDict( - {'scepter_txt2img': Text2ImageDataCard}) + self.dataset_type_dict = OrderedDict({ + 'scepter_txt2img': + Text2ImageDataCard, + 'scepter_img2img': + Image2ImageDataCard + }) self.components_name = CreateDatasetUIName(language) self.default_dataset_type = list(self.dataset_type_dict.keys())[0] self.default_dataset_cls = Text2ImageDataCard @@ -54,32 +62,47 @@ class CreateDatasetUI(UIBase): } ''' self.init_example() + self.default_dataset = self.example_dataset_ins[ + self.default_dataset_type] self.user_level_dataset_list = self.load_history() + self.load_history_time = datetime.datetime.now() def init_example(self): - file_url = self.components_name.default_dataset_zip - file_name, surfix = os.path.splitext(file_url) - save_file = os.path.join( - self.work_dir, - f'{self.components_name.default_dataset_name}{surfix}') - save_file, res = wget_file(file_url, save_file) - if not FS.exists(save_file): - print('Init example eroor, skip!') - self.example_dataset_ins = None - return + self.example_dataset_ins = {} + for example_type, example_name in self.components_name.default_dataset_name.items( + ): + dataset_folder = os.path.join( + self.work_dir, '_'.join([example_type, example_name])) - dataset_folder = os.path.join( - self.work_dir, '_'.join([ - self.default_dataset_type, - self.components_name.default_dataset_name - ])) - self.example_dataset_ins = self.default_dataset_cls( - dataset_folder, - dataset_name=self.components_name.default_dataset_name, - src_file=save_file, - surfix=surfix, - user_name='example', - language=self.language) + meta_file = os.path.join(dataset_folder, 'meta.json') + if FS.exists(meta_file): + self.example_dataset_ins[ + example_type] = self.dataset_type_dict[example_type]( + dataset_folder, + dataset_name=self.components_name.default_dataset_name, + user_name='example', + language=self.language) + continue + file_url = self.components_name.default_dataset_zip[example_type] + file_name, surfix = os.path.splitext(file_url) + save_file = os.path.join( + self.work_dir, + f'{self.components_name.default_dataset_name[example_type]}{surfix}' + ) + save_file, res = wget_file(file_url, save_file) + if not FS.exists(save_file): + print('Init example eroor, skip!') + self.example_dataset_ins[example_type] = None + continue + + self.example_dataset_ins[example_type] = self.dataset_type_dict[ + example_type](dataset_folder, + dataset_name=self.components_name. + default_dataset_name[example_type], + src_file=save_file, + surfix=surfix, + user_name='example', + language=self.language) # add to list by load_history. def user_filter(self, dataset_ins, login_user_name): @@ -93,10 +116,28 @@ class CreateDatasetUI(UIBase): return False def load_history(self, login_user_name='admin'): + # load history every day + if hasattr(self, 'load_history_time') and ( + datetime.datetime.now() - + self.load_history_time).days < 1 and hasattr( + self, 'user_level_dataset_list'): + if login_user_name not in self.user_level_dataset_list: + self.user_level_dataset_list[login_user_name] = {} + for dataset_t, name_dataset_ins in self.dataset_dict.items(): + for dataset_name, dataset_ins in name_dataset_ins.items(): + if self.user_filter(dataset_ins, login_user_name): + if dataset_t not in self.user_level_dataset_list[ + login_user_name]: + self.user_level_dataset_list[login_user_name][ + dataset_t] = [] + self.user_level_dataset_list[login_user_name][ + dataset_t].append(dataset_ins.dataset_name) + self.load_history_time = datetime.datetime.now() + return self.user_level_dataset_list dataset_list = {login_user_name: {}} self.dir_list = FS.walk_dir(self.work_dir, recurse=False) # From v0.0.5 we use the classname of DataCard as prefix of folder to indicate the type of data. - for one_dir in self.dir_list: + for one_dir in tqdm(self.dir_list): if not FS.isdir(one_dir): continue # the meta.json is the unique sign for dataset @@ -140,23 +181,23 @@ class CreateDatasetUI(UIBase): interactive=True, value=self.components_name.dataset_type_name[ self.default_dataset_type]) - with gr.Column(scale=3, min_width=0): + with gr.Column(scale=4, min_width=0): self.dataset_name = gr.Dropdown( label=self.components_name.dataset_name, choices=self.user_level_dataset_list.get( 'admin', {}).get(self.default_dataset_type, []), - value=None if self.example_dataset_ins is None else - self.example_dataset_ins.dataset_name, + value=None if self.default_dataset is None else + self.default_dataset.dataset_name, interactive=True) - with gr.Column(scale=3, min_width=0): + with gr.Column(scale=4, min_width=0): self.user_dataset_name = gr.Text( label=self.components_name.user_data_name, - value='' if self.example_dataset_ins is None else - self.example_dataset_ins.dataset_name, + value='' if self.default_dataset is None else + self.default_dataset.dataset_name, interactive=True) self.user_data_name_state = gr.State( - value=None if self.example_dataset_ins is None else - self.example_dataset_ins.dataset_name) + value=None if self.default_dataset is None else self. + default_dataset.dataset_name) self.create_mode = gr.State(value=0) with gr.Column(scale=1, min_width=0): with gr.Column(scale=1, min_width=0): diff --git a/scepter/studio/preprocess/caption_editor_ui/dataset_gallery_ui.py b/scepter/studio/preprocess/caption_editor_ui/dataset_gallery_ui.py index c3f7761..f32cea5 100644 --- a/scepter/studio/preprocess/caption_editor_ui/dataset_gallery_ui.py +++ b/scepter/studio/preprocess/caption_editor_ui/dataset_gallery_ui.py @@ -8,7 +8,6 @@ import time import gradio as gr import imagehash from PIL import Image - 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 \ @@ -31,7 +30,7 @@ class DatasetGalleryUI(UIBase): self.component_names = DatasetGalleryUIName(language) if create_ins is not None: - self.default_dataset = create_ins.example_dataset_ins + self.default_dataset = create_ins.default_dataset current_info = self.default_dataset.current_record self.default_ori_caption = current_info.get('caption', '') self.default_edit_caption = current_info.get('edit_caption', '') @@ -56,6 +55,7 @@ class DatasetGalleryUI(UIBase): for v in self.default_dataset.data ] self.default_image_list = image_list + self.default_dataset_type = create_ins.default_dataset_type else: self.default_dataset = None self.default_ori_caption = '' @@ -69,6 +69,7 @@ class DatasetGalleryUI(UIBase): self.default_select_index = -1 self.default_image_list = [] self.default_info = '' + self.default_dataset_type = 'scepter_txt2img' def create_ui(self): with gr.Row(variant='panel', @@ -81,66 +82,93 @@ class DatasetGalleryUI(UIBase): self.mode_state = gr.Text(label='mode_state', value='view', visible=False) - with gr.Column(min_width=0, visible=False) as self.edit_panel: + self.src_dataset_state = gr.Checkbox(label='src_state', + value=False, + visible=False) + with gr.Column(variant='panel', min_width=0, + visible=False) as self.edit_panel: + with gr.Row(): self.edit_image_info = gr.Markdown( self.component_names.edit_dataset.format( self.default_edit_image_height, self.default_edit_image_width, self.default_edit_image_format)) + with gr.Row(): + self.edit_caption = gr.Textbox( + label=self.component_names.edit_caption, + placeholder='', + value=self.default_edit_caption, + lines=4, + autoscroll=False, + interactive=True, + visible=False) with gr.Row(equal_height=True): - with gr.Column(scale=3, min_width=0): - with gr.Row(): - self.edit_gl_dataset_images = gr.Gallery( - label=self.component_names.dataset_images, - elem_id='dataset_tag_editor_dataset_gallery', - value=self.default_image_list, - selected_index=self.default_select_index, - columns=4, - visible=False, - interactive=False) - with gr.Column(ariant='panel', scale=2, min_width=0): - with gr.Row(): - self.edit_caption = gr.Textbox( - label=self.component_names.edit_caption, - placeholder='', - value=self.default_edit_caption, - lines=18, - autoscroll=False, - interactive=True, - visible=False) + with gr.Column(scale=1, min_width=0, + visible=False) as self.edit_src_panel: + self.edit_src_gl_dataset_images = gr.Gallery( + label=self.component_names.edit_dataset_src_images, + elem_id='dataset_tag_editor_dataset_src_gallery', + value=self.default_image_list, + selected_index=self.default_select_index, + columns=4, + visible=False, + interactive=False) + with gr.Column(scale=1, min_width=0): + self.edit_gl_dataset_images = gr.Gallery( + label=self.component_names.edit_dataset_images, + elem_id='dataset_tag_editor_dataset_gallery', + value=self.default_image_list, + selected_index=self.default_select_index, + columns=4, + visible=False, + interactive=False) + # with gr.Column(ariant='panel', scale=2, min_width=0): - with gr.Column(min_width=0): + with gr.Column(variant='panel', min_width=0): with gr.Row(): self.image_info = gr.Markdown( self.component_names.ori_dataset.format( self.default_image_height, self.default_image_width, self.default_image_format)) + with gr.Row(): + self.ori_caption = gr.Textbox( + label=self.component_names.ori_caption, + placeholder='', + value=self.default_ori_caption, + lines=4, + autoscroll=False, + interactive=False) with gr.Row(equal_height=True): - with gr.Column(scale=3, min_width=0): + with gr.Column(scale=1, min_width=0, + visible=False) as self.src_panel: + self.src_gl_dataset_images = gr.Gallery( + label=self.component_names.dataset_src_images, + elem_id='dataset_tag_editor_dataset_src_gallery', + value=self.default_image_list, + selected_index=self.default_select_index, + columns=4, + visible=False, + interactive=False) + with gr.Column(scale=1, min_width=0): with gr.Row(): self.gl_dataset_images = gr.Gallery( label=self.component_names.dataset_images, elem_id='dataset_tag_editor_dataset_gallery', value=self.default_image_list, selected_index=self.default_select_index, - columns=4) - with gr.Column(variant='panel', scale=2, min_width=0): - with gr.Row(): - self.ori_caption = gr.Textbox( - label=self.component_names.ori_caption, - placeholder='', - value=self.default_ori_caption, - lines=18, - autoscroll=False, - interactive=False) + columns=4, + preview=True, + allow_preview=True, + object_fit='fill') + # with gr.Column(variant='panel', scale=2, min_width=0): # with gr.Row(visible=False) as : with gr.Row(visible=False) as self.edit_setting_panel: self.sys_log = gr.Markdown( self.component_names.system_log.format('')) - with gr.Row(): + with (gr.Row()): with gr.Column(variant='panel', visible=False, scale=1, @@ -180,19 +208,34 @@ class DatasetGalleryUI(UIBase): value=None) with gr.Column(variant='panel', visible=False, - scale=1, + scale=2, min_width=0) as self.upload_panel: with gr.Row(): - self.upload_image = gr.Image( - label=self.component_names.upload_image, type='pil') + self.upload_src_image_info = gr.Markdown(value='', + visible=False) with gr.Row(): self.upload_image_info = gr.Markdown(value='') + with gr.Row(): - self.caption = gr.Textbox( + self.upload_caption = gr.Textbox( label=self.component_names.image_caption, placeholder='', value='', lines=5) + with gr.Row(): + with gr.Column( + variant='panel', + scale=1, + min_width=0, + visible=self.default_dataset_type == + 'scepter_img2img') as self.upload_src_image_panel: + self.upload_src_image = gr.Image( + label=self.component_names.upload_src_image, + type='pil') + with gr.Column(variant='panel', scale=1, min_width=0): + self.upload_image = gr.Image( + label=self.component_names.upload_image, + type='pil') with gr.Row(): with gr.Column(min_width=0): self.upload_button = gr.Button( @@ -203,201 +246,222 @@ class DatasetGalleryUI(UIBase): with gr.Column(variant='panel', visible=False, scale=2, - min_width=0) as self.image_preprocess_panel: - with gr.Box(): - with gr.Column(variant='panel', min_width=0): - with gr.Row(): - self.image_preprocess_method = gr.Dropdown( - label=self.component_names. - image_processor_type, - choices=self.processors_manager.get_choices( - 'image'), - value=self.processors_manager.get_default( - 'image'), - interactive=True) - image_processor_ins = self.processors_manager.get_processor( - 'image', - self.processors_manager.get_default('image')) - with gr.Row(): - default_height_ratio = image_processor_ins.system_para.get( - 'HEIGHT_RATIO', {}) - self.height_ratio = gr.Slider( - label=self.component_names.height_ratio, - minimum=default_height_ratio.get('MIN', 1), - maximum=default_height_ratio.get('MAX', 10), - step=default_height_ratio.get('STEP', 1), - value=default_height_ratio.get('VALUE', 1), - visible=len(default_height_ratio) > 0, - interactive=True) - with gr.Row(): - default_width_ratio = image_processor_ins.system_para.get( - 'WIDTH_RATIO', {}) - self.width_ratio = gr.Slider( - label=self.component_names.width_ratio, - minimum=default_width_ratio.get('MIN', 1), - maximum=default_width_ratio.get('MAX', 10), - step=default_width_ratio.get('STEP', 1), - value=default_width_ratio.get('VALUE', 1), - visible=len(default_width_ratio) > 0, - interactive=True) - with gr.Row(): - self.image_preprocess_btn = gr.Button( - value=self.component_names.image_preprocess_btn - ) - with gr.Column(variant='panel', - visible=False, - scale=2, - min_width=0) as self.caption_preprocess_panel: - with gr.Box(): - with gr.Column(variant='panel', min_width=0): - with gr.Row(): - self.caption_preprocess_method = gr.Dropdown( - label=self.component_names. - caption_processor_type, - choices=self.processors_manager.get_choices( - 'caption'), - value=self.processors_manager.get_default( - 'caption'), - interactive=True) - with gr.Row(): - with gr.Column(scale=1, min_width=0): - self.caption_use_device = gr.Text( - label=self.component_names.used_device, - value=self.processors_manager. - get_default_device('caption'), - interactive=False) - with gr.Column(scale=1, min_width=0): - self.caption_use_memory = gr.Text( - label=self.component_names.used_memory, - value=self.processors_manager. - get_default_memory('caption'), - interactive=False) - default_processor_method = self.processors_manager.get_default( - 'caption') - default_processor_ins = self.processors_manager.get_processor( - 'caption', default_processor_method) - with gr.Column(scale=1, min_width=0): - self.caption_language = gr.Dropdown( - label=self.component_names. - caption_language, - choices=default_processor_ins. - get_language_choice, - value=default_processor_ins. - get_language_default) - with gr.Column(scale=1, min_width=0): - self.caption_update_mode = gr.Dropdown( - label=self.component_names. - caption_update_mode, - choices=self.component_names. - caption_update_choices, - value=self.component_names. - caption_update_choices[0] if - len(self.component_names. - caption_update_choices) > 0 else None) - with gr.Accordion( - label=self.component_names.advance_setting, - open=False): + min_width=0) as self.preprocess_panel: + with gr.Row( + variant='panel', + visible=False, + ) as self.image_preprocess_panel: + with gr.Box(): + with gr.Column(variant='panel', min_width=0): with gr.Row(): - self.sys_prompt = gr.Text( - label=self.component_names.system_prompt, - interactive=True, - value=default_processor_ins. - get_para_by_language( + self.image_preprocess_method = gr.Dropdown( + label=self.component_names. + image_processor_type, + choices=self.processors_manager. + get_choices('image'), + value=self.processors_manager.get_default( + 'image'), + interactive=True) + image_processor_ins = self.processors_manager.get_processor( + 'image', + self.processors_manager.get_default('image')) + with gr.Row(): + default_height_ratio = image_processor_ins.system_para.get( + 'HEIGHT_RATIO', {}) + self.height_ratio = gr.Slider( + label=self.component_names.height_ratio, + minimum=default_height_ratio.get('MIN', 1), + maximum=default_height_ratio.get( + 'MAX', 10), + step=default_height_ratio.get('STEP', 1), + value=default_height_ratio.get('VALUE', 1), + visible=len(default_height_ratio) > 0, + interactive=True) + with gr.Row(): + default_width_ratio = image_processor_ins.system_para.get( + 'WIDTH_RATIO', {}) + self.width_ratio = gr.Slider( + label=self.component_names.width_ratio, + minimum=default_width_ratio.get('MIN', 1), + maximum=default_width_ratio.get('MAX', 10), + step=default_width_ratio.get('STEP', 1), + value=default_width_ratio.get('VALUE', 1), + visible=len(default_width_ratio) > 0, + interactive=True) + with gr.Row(): + self.image_preprocess_btn = gr.Button( + value=self.component_names. + image_preprocess_btn) + with gr.Row(variant='panel', + visible=False) as self.caption_preprocess_panel: + with gr.Box(): + with gr.Column(variant='panel', min_width=0): + with gr.Row(): + self.caption_preprocess_method = gr.Dropdown( + label=self.component_names. + caption_processor_type, + choices=self.processors_manager. + get_choices('caption'), + value=self.processors_manager.get_default( + 'caption'), + interactive=True) + with gr.Row(): + with gr.Column(scale=1, min_width=0): + self.caption_use_device = gr.Text( + label=self.component_names.used_device, + value=self.processors_manager. + get_default_device('caption'), + interactive=False) + with gr.Column(scale=1, min_width=0): + self.caption_use_memory = gr.Text( + label=self.component_names.used_memory, + value=self.processors_manager. + get_default_memory('caption'), + interactive=False) + default_processor_method = self.processors_manager.get_default( + 'caption') + default_processor_ins = self.processors_manager.get_processor( + 'caption', default_processor_method) + with gr.Column(scale=1, min_width=0): + self.caption_language = gr.Dropdown( + label=self.component_names. + caption_language, + choices=default_processor_ins. + get_language_choice, + value=default_processor_ins. + get_language_default) + with gr.Column(scale=1, min_width=0): + self.caption_update_mode = gr.Dropdown( + label=self.component_names. + caption_update_mode, + choices=self.component_names. + caption_update_choices, + value=self.component_names. + caption_update_choices[0] + if len(self.component_names. + caption_update_choices) > 0 else + None) + with gr.Accordion( + label=self.component_names.advance_setting, + open=False): + with gr.Row(): + self.sys_prompt = gr.Text( + label=self.component_names. + system_prompt, + interactive=True, + value=default_processor_ins. + get_para_by_language( + default_processor_ins. + get_language_default).get( + 'PROMPT', ''), + lines=2, + visible='PROMPT' + in default_processor_ins. + get_para_by_language( + default_processor_ins. + get_language_default)) + with gr.Row(): + default_max_new_tokens = default_processor_ins.get_para_by_language( default_processor_ins. get_language_default).get( - 'PROMPT', ''), - lines=2, - visible='PROMPT' in - default_processor_ins.get_para_by_language( + 'MAX_NEW_TOKENS', {}) + self.max_new_tokens = gr.Slider( + label=self.component_names. + max_new_tokens, + minimum=default_max_new_tokens.get( + 'MIN', 0), + maximum=default_max_new_tokens.get( + 'MAX', 1.0), + step=default_max_new_tokens.get( + 'STEP', 0.1), + value=default_max_new_tokens.get( + 'VALUE', 0.1), + visible=len(default_max_new_tokens) > + 0, + interactive=True) + with gr.Row(): + default_min_new_tokens = default_processor_ins.get_para_by_language( default_processor_ins. - get_language_default)) + get_language_default).get( + 'MIN_NEW_TOKENS', {}) + + self.min_new_tokens = gr.Slider( + label=self.component_names. + min_new_tokens, + minimum=default_min_new_tokens.get( + 'MIN', 0), + maximum=default_min_new_tokens.get( + 'MAX', 1.0), + step=default_min_new_tokens.get( + 'STEP', 0.1), + value=default_min_new_tokens.get( + 'VALUE', 0.1), + visible=len(default_min_new_tokens) > + 0, + interactive=True) + with gr.Row(): + default_num_beams = default_processor_ins.get_para_by_language( + default_processor_ins. + get_language_default).get( + 'NUM_BEAMS', {}) + + self.num_beams = gr.Slider( + label=self.component_names.num_beams, + minimum=default_num_beams.get( + 'MIN', 0), + maximum=default_num_beams.get( + 'MAX', 1.0), + step=default_num_beams.get( + 'STEP', 0.1), + value=default_num_beams.get( + 'VALUE', 0.1), + visible=len(default_num_beams) > 0, + interactive=True) + with gr.Row(): + default_repetition_penalty = default_processor_ins.get_para_by_language( + default_processor_ins. + get_language_default).get( + 'REPETITION_PENALTY', {}) + + self.repetition_penalty = gr.Slider( + label=self.component_names. + repetition_penalty, + minimum=default_repetition_penalty.get( + 'MIN', 0), + maximum=default_repetition_penalty.get( + 'MAX', 1.0), + step=default_repetition_penalty.get( + 'STEP', 0.1), + value=default_repetition_penalty.get( + 'VALUE', 0.1), + visible=len(default_repetition_penalty) + > 0, + interactive=True) + with gr.Row(): + default_temperature = default_processor_ins.get_para_by_language( + default_processor_ins. + get_language_default).get( + 'TEMPERATURE', {}) + + self.temperature = gr.Slider( + label=self.component_names.temperature, + minimum=default_temperature.get( + 'MIN', 0), + maximum=default_temperature.get( + 'MAX', 1.0), + step=default_temperature.get( + 'STEP', 0.1), + value=default_temperature.get( + 'VALUE', 0.1), + visible=len(default_temperature) > 0, + interactive=True) + with gr.Row(): - default_max_new_tokens = default_processor_ins.get_para_by_language( - default_processor_ins.get_language_default - ).get('MAX_NEW_TOKENS', {}) - self.max_new_tokens = gr.Slider( - label=self.component_names.max_new_tokens, - minimum=default_max_new_tokens.get( - 'MIN', 0), - maximum=default_max_new_tokens.get( - 'MAX', 1.0), - step=default_max_new_tokens.get( - 'STEP', 0.1), - value=default_max_new_tokens.get( - 'VALUE', 0.1), - visible=len(default_max_new_tokens) > 0, - interactive=True) - with gr.Row(): - default_min_new_tokens = default_processor_ins.get_para_by_language( - default_processor_ins.get_language_default - ).get('MIN_NEW_TOKENS', {}) - self.min_new_tokens = gr.Slider( - label=self.component_names.min_new_tokens, - minimum=default_min_new_tokens.get( - 'MIN', 0), - maximum=default_min_new_tokens.get( - 'MAX', 1.0), - step=default_min_new_tokens.get( - 'STEP', 0.1), - value=default_min_new_tokens.get( - 'VALUE', 0.1), - visible=len(default_min_new_tokens) > 0, - interactive=True) - with gr.Row(): - default_num_beams = default_processor_ins.get_para_by_language( - default_processor_ins.get_language_default - ).get('NUM_BEAMS', {}) - - self.num_beams = gr.Slider( - label=self.component_names.num_beams, - minimum=default_num_beams.get('MIN', 0), - maximum=default_num_beams.get('MAX', 1.0), - step=default_num_beams.get('STEP', 0.1), - value=default_num_beams.get('VALUE', 0.1), - visible=len(default_num_beams) > 0, - interactive=True) - with gr.Row(): - default_repetition_penalty = default_processor_ins.get_para_by_language( - default_processor_ins.get_language_default - ).get('REPETITION_PENALTY', {}) - - self.repetition_penalty = gr.Slider( - label=self.component_names. - repetition_penalty, - minimum=default_repetition_penalty.get( - 'MIN', 0), - maximum=default_repetition_penalty.get( - 'MAX', 1.0), - step=default_repetition_penalty.get( - 'STEP', 0.1), - value=default_repetition_penalty.get( - 'VALUE', 0.1), - visible=len(default_repetition_penalty) > - 0, - interactive=True) - with gr.Row(): - default_temperature = default_processor_ins.get_para_by_language( - default_processor_ins.get_language_default - ).get('TEMPERATURE', {}) - - self.temperature = gr.Slider( - label=self.component_names.temperature, - minimum=default_temperature.get('MIN', 0), - maximum=default_temperature.get( - 'MAX', 1.0), - step=default_temperature.get('STEP', 0.1), - value=default_temperature.get( - 'VALUE', 0.1), - visible=len(default_temperature) > 0, - interactive=True) - - with gr.Row(): - - with gr.Column(scale=1, min_width=0): - self.caption_preprocess_btn = gr.Button( - value=self.component_names. - caption_preprocess_btn) + with gr.Column(scale=1, min_width=0): + self.caption_preprocess_btn = gr.Button( + value=self.component_names. + caption_preprocess_btn) with gr.Row(variant='panel', equal_height=True): with gr.Column(scale=1, min_width=0): @@ -426,40 +490,88 @@ class DatasetGalleryUI(UIBase): hit_range_mode = reverse_mode[range_mode] return hit_range_mode + # Used to change the target gallery state( is not used now) def change_gallery(dataset_type, dataset_name): dataset_type = create_dataset.get_trans_dataset_type(dataset_type) - dataset_ins = create_dataset.dataset_dict[dataset_type][ - dataset_name] + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None: + return gr.Gallery(), gr.Gallery(), gr.Column(), gr.Text() cursor = dataset_ins.cursor image_list = [ os.path.join(dataset_ins.meta['local_work_dir'], v['relative_path']) for v in dataset_ins.data ] - if cursor >= 0: - return gr.Gallery(label=dataset_name, - value=image_list, - selected_index=cursor) + if dataset_type == 'scepter_img2img': + src_image_list = [ + os.path.join(dataset_ins.meta['local_work_dir'], + v['src_relative_path']) + for v in dataset_ins.data + ] + if cursor >= 0: + ret_src_gallery = gr.Gallery(label=dataset_name, + value=src_image_list, + selected_index=cursor, + visible=True) + else: + ret_src_gallery = gr.Gallery(label=dataset_name, + value=src_image_list, + selected_index=None, + visible=True) + ret_src_panel = gr.Column(visible=True) else: - return gr.Gallery(label=dataset_name, - value=image_list, - selected_index=None) + ret_src_gallery = gr.Gallery(visible=False) + ret_src_panel = gr.Column(visible=False) + + if cursor >= 0: + return (gr.Gallery(label=dataset_name, + value=image_list, + selected_index=cursor), ret_src_gallery, + ret_src_panel, gr.Text(value='view')) + else: + return (gr.Gallery(label=dataset_name, + value=image_list, + selected_index=None), ret_src_gallery, + ret_src_panel, gr.Text(value='view')) self.gallery_state.change( change_gallery, inputs=[create_dataset.dataset_type, create_dataset.dataset_name], - outputs=[self.gl_dataset_images], + outputs=[ + self.gl_dataset_images, self.src_gl_dataset_images, + self.src_panel, self.mode_state + ], queue=False) + # select one target image return new select index for source image and target image def select_image(dataset_type, dataset_name, evt: gr.SelectData): dataset_type = create_dataset.get_trans_dataset_type(dataset_type) - dataset_ins = create_dataset.dataset_dict[dataset_type][ - dataset_name] + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None: + return gr.Gallery(), gr.Gallery(), gr.Textbox(), '', gr.Text() dataset_ins.set_cursor(evt.index) current_info = dataset_ins.current_record all_number = len(dataset_ins) - - ret_image_gl = gr.Gallery(selected_index=dataset_ins.cursor) if dataset_ins.cursor >= 0 \ + image_list = [ + os.path.join(dataset_ins.meta['local_work_dir'], + v['relative_path']) for v in dataset_ins.data + ] + ret_image_gl = gr.Gallery( + value=image_list, + selected_index=dataset_ins.cursor) if dataset_ins.cursor >= 0 \ else gr.Gallery(value=[], selected_index=None) + if dataset_type == 'scepter_img2img': + src_image_list = [ + os.path.join(dataset_ins.meta['local_work_dir'], + v['src_relative_path']) + for v in dataset_ins.data + ] + ret_src_image_gl = gr.Gallery(value=src_image_list, selected_index=dataset_ins.cursor, visible=True) \ + if dataset_ins.cursor >= 0 else gr.Gallery(value=[], selected_index=None) + else: + ret_src_image_gl = gr.Gallery(visible=False) + ret_caption = gr.Textbox(value=current_info.get('caption', '')) ret_info = gr.Text(value=f'{dataset_ins.cursor+1}/{all_number}') @@ -471,22 +583,27 @@ class DatasetGalleryUI(UIBase): image_info = self.component_names.ori_dataset.format( ret_image_height, ret_image_width, ret_image_format) - return (ret_image_gl, ret_caption, image_info, ret_info) + return (ret_image_gl, ret_src_image_gl, ret_caption, image_info, + ret_info) self.gl_dataset_images.select( select_image, inputs=[create_dataset.dataset_type, create_dataset.dataset_name], outputs=[ - self.gl_dataset_images, self.ori_caption, self.image_info, - self.info + self.gl_dataset_images, self.src_gl_dataset_images, + self.ori_caption, self.image_info, self.info ], queue=False) + # select one target image return new select index for source image and target image in edit mode def edit_select_image(dataset_type, dataset_name, mode_state, evt: gr.SelectData): dataset_type = create_dataset.get_trans_dataset_type(dataset_type) - dataset_ins = create_dataset.dataset_dict[dataset_type][ - dataset_name] + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None: + return gr.Gallery(), gr.Gallery(), gr.Gallery(), gr.Gallery( + ), gr.Textbox(), '', gr.Text() cursor = dataset_ins.cursor_from_edit_index(evt.index) dataset_ins.set_cursor(cursor) @@ -496,7 +613,20 @@ class DatasetGalleryUI(UIBase): ret_image_gl = gr.Gallery(selected_index=dataset_ins.cursor) if dataset_ins.cursor >= 0 \ else gr.Gallery(value=[], selected_index=None) dataset_ins.edit_cursor = evt.index - ret_edit_image_gl = gr.Gallery(selected_index=evt.index) + ret_edit_image_gl = gr.Gallery( + selected_index=dataset_ins.edit_cursor) + + if dataset_type == 'scepter_img2img': + ret_src_image_gl = gr.Gallery(selected_index=dataset_ins.cursor, visible=True) \ + if dataset_ins.cursor >= 0 \ + else gr.Gallery(value=[], selected_index=None, visible=True) + ret_src_edit_image_gl = gr.Gallery(selected_index=dataset_ins.edit_cursor, visible=True) \ + if dataset_ins.cursor >= 0 \ + else gr.Gallery(value=[], selected_index=None, visible=True) + else: + ret_src_image_gl = gr.Gallery(visible=False) + ret_src_edit_image_gl = gr.Gallery(visible=False) + ret_edit_caption = gr.Textbox(value=current_info.get( 'edit_caption', ''), visible=True) @@ -514,27 +644,71 @@ class DatasetGalleryUI(UIBase): ret_edit_image_format) ret_info = gr.Text(value=f'{dataset_ins.cursor+1}/{all_number}') - return (ret_image_gl, ret_edit_image_gl, ret_edit_caption, - edit_image_info, ret_info) + return (ret_image_gl, ret_src_image_gl, ret_edit_image_gl, + ret_src_edit_image_gl, ret_edit_caption, edit_image_info, + ret_info) - self.edit_gl_dataset_images.select(edit_select_image, - inputs=[ - create_dataset.dataset_type, - create_dataset.dataset_name, - self.mode_state - ], - outputs=[ - self.gl_dataset_images, - self.edit_gl_dataset_images, - self.edit_caption, - self.edit_image_info, self.info - ], - queue=False) + self.edit_gl_dataset_images.select( + edit_select_image, + inputs=[ + create_dataset.dataset_type, create_dataset.dataset_name, + self.mode_state + ], + outputs=[ + self.gl_dataset_images, self.src_gl_dataset_images, + self.edit_gl_dataset_images, self.edit_src_gl_dataset_images, + self.edit_caption, self.edit_image_info, self.info + ], + queue=False) + def src_select_image(dataset_type, dataset_name, evt: gr.SelectData): + dataset_type = create_dataset.get_trans_dataset_type(dataset_type) + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None: + return gr.Gallery(), gr.Gallery(), gr.Textbox(), '', gr.Text() + dataset_ins.set_cursor(evt.index) + ret_image_gl = gr.Gallery(selected_index=dataset_ins.cursor) if dataset_ins.cursor >= 0 \ + else gr.Gallery(value=[], selected_index=None) + + return ret_image_gl + + self.src_gl_dataset_images.select( + src_select_image, + inputs=[create_dataset.dataset_type, create_dataset.dataset_name], + outputs=[self.gl_dataset_images], + queue=False) + + def edit_src_select_image(dataset_type, dataset_name, mode_state, + evt: gr.SelectData): + dataset_type = create_dataset.get_trans_dataset_type(dataset_type) + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None: + return gr.Gallery() + cursor = dataset_ins.cursor_from_edit_index(evt.index) + dataset_ins.set_cursor(cursor) + dataset_ins.edit_cursor = evt.index + ret_edit_image_gl = gr.Gallery( + selected_index=dataset_ins.edit_cursor) + return ret_edit_image_gl + + self.edit_src_gl_dataset_images.select( + edit_src_select_image, + inputs=[ + create_dataset.dataset_type, create_dataset.dataset_name, + self.mode_state + ], + outputs=[self.edit_gl_dataset_images], + queue=False) + + # target image gallery changed def change_gallery(dataset_type, dataset_name): dataset_type = create_dataset.get_trans_dataset_type(dataset_type) - dataset_ins = create_dataset.dataset_dict[dataset_type][ - dataset_name] + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None: + return gr.Textbox(), '', gr.Textbox(), '', gr.Text() current_info = dataset_ins.current_record ret_image_height = current_info.get('height', -1) ret_image_width = current_info.get('width', -1) @@ -588,10 +762,13 @@ class DatasetGalleryUI(UIBase): outputs=[self.mode_state], queue=False) + # reset edit information to clean the status of editing def reset_edit(dataset_type, dataset_name): dataset_type = create_dataset.get_trans_dataset_type(dataset_type) - dataset_ins = create_dataset.dataset_dict[dataset_type][ - dataset_name] + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None: + return gr.Gallery(), gr.Text(), '' for idx, one_data in enumerate(dataset_ins.edit_samples): current_cursor = dataset_ins.cursor_from_edit_index(idx) dataset_ins.edit_samples[idx][ @@ -607,6 +784,19 @@ class DatasetGalleryUI(UIBase): current_cursor]['width'] dataset_ins.edit_samples[idx][ 'edit_height'] = dataset_ins.data[current_cursor]['height'] + if dataset_type == 'scepter_img2img': + dataset_ins.edit_samples[idx][ + 'edit_src_relative_path'] = dataset_ins.data[ + current_cursor]['src_relative_path'] + dataset_ins.edit_samples[idx][ + 'edit_src_image_path'] = dataset_ins.data[ + current_cursor]['src_image_path'] + dataset_ins.edit_samples[idx][ + 'edit_src_width'] = dataset_ins.data[current_cursor][ + 'src_width'] + dataset_ins.edit_samples[idx][ + 'edit_src_height'] = dataset_ins.data[current_cursor][ + 'src_height'] image_list = [ os.path.join(dataset_ins.meta['local_work_dir'], @@ -640,15 +830,21 @@ class DatasetGalleryUI(UIBase): ], queue=False) + # confirm edit upload sample def confirm_edit(dataset_type, dataset_name): dataset_type = create_dataset.get_trans_dataset_type(dataset_type) - dataset_ins = create_dataset.dataset_dict[dataset_type][ - dataset_name] + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None: + return (gr.Gallery(), gr.Gallery(), gr.Textbox(), gr.Text(), + gr.Text(), gr.Text(), + self.component_names.system_log.format('None'), + gr.Text()) is_flg, msg = dataset_ins.apply_changes() if not is_flg: - return (gr.Gallery(), gr.Textbox(), gr.Text(), gr.Text(), - gr.Text(), self.component_names.system_log.format(msg), - gr.Text()) + return (gr.Gallery(), gr.Gallery(), gr.Textbox(), gr.Text(), + gr.Text(), gr.Text(), + self.component_names.system_log.format(msg), gr.Text()) image_list = [ os.path.join(dataset_ins.local_work_dir, v['relative_path']) for v in dataset_ins.data @@ -661,8 +857,23 @@ class DatasetGalleryUI(UIBase): image_info = self.component_names.ori_dataset.format( ret_image_height, ret_image_width, ret_image_format) + + if dataset_type == 'scepter_img2img': + src_image_list = [ + os.path.join(dataset_ins.local_work_dir, + v['src_relative_path']) + for v in dataset_ins.data + ] + ret_src_image_gl = gr.Gallery( + value=src_image_list, + selected_index=dataset_ins.cursor, + visible=True) + else: + ret_src_image_gl = gr.Gallery(visible=False) + return (gr.Gallery(value=image_list, selected_index=dataset_ins.cursor), + ret_src_image_gl, gr.Textbox(value=current_record.get('caption', '')), image_info, self.component_names.system_log.format(''), gr.Text(value='view')) @@ -671,8 +882,9 @@ class DatasetGalleryUI(UIBase): confirm_edit, inputs=[create_dataset.dataset_type, create_dataset.dataset_name], outputs=[ - self.gl_dataset_images, self.ori_caption, self.image_info, - self.sys_log, self.mode_state + self.gl_dataset_images, self.src_gl_dataset_images, + self.ori_caption, self.image_info, self.sys_log, + self.mode_state ], queue=False) @@ -688,23 +900,31 @@ class DatasetGalleryUI(UIBase): image_proc_status = True elif hit_status == 1: caption_proc_status = True - return gr.Column(visible=image_proc_status), gr.Column( - visible=caption_proc_status) + return ( + # gr.Column(visible=image_proc_status), gr.Column( + # visible=caption_proc_status) + gr.Column(visible=image_proc_status or caption_proc_status), + gr.Row(visible=image_proc_status), + gr.Row(visible=caption_proc_status)) self.preprocess_checkbox.change(preprocess_box_change, inputs=[self.preprocess_checkbox], outputs=[ + self.preprocess_panel, self.image_preprocess_panel, self.caption_preprocess_panel ], queue=False) def preprocess_image(mode_state, preprocess_method, upload_image, - upload_caption, height_ratio, width_ratio, - dataset_type, dataset_name): + upload_src_image, upload_caption, height_ratio, + width_ratio, dataset_type, dataset_name): dataset_type = create_dataset.get_trans_dataset_type(dataset_type) - dataset_ins = create_dataset.dataset_dict[dataset_type][ - dataset_name] + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None: + return (gr.Gallery(), gr.Gallery(), '', gr.Image(), gr.Image(), + '', '', self.component_names.system_log.format('None')) if hasattr(manager, 'inference'): for k, v in manager.inference.pipe_manager.pipeline_level_modules.items( ): @@ -714,32 +934,38 @@ class DatasetGalleryUI(UIBase): 'image', preprocess_method) if processor_ins is None: sys_log = 'Current processor is illegal' - return (gr.Gallery(), '', gr.Image(), '', + return (gr.Gallery(), gr.Gallery(), '', gr.Image(), + gr.Image(), '', '', self.component_names.system_log.format(sys_log)) is_flag, msg = processor_ins.load_model() if not is_flag: sys_log = f'Load processor failed: {msg}' - return (gr.Gallery(), '', gr.Image(), '', + return (gr.Gallery(), gr.Gallery(), '', gr.Image(), + gr.Image(), '', '', self.component_names.system_log.format(sys_log)) if mode_state == 'edit': + save_folders = 'edit_images' + os.makedirs(os.path.join(dataset_ins.meta['local_work_dir'], + save_folders), + exist_ok=True) + edit_index_list = dataset_ins.edit_list for index in edit_index_list: one_data = dataset_ins.data[index] + # process target image relative_image_path = one_data.get( 'edit_relative_path', one_data['relative_path']) file_name, surfix = os.path.splitext(relative_image_path) - src_image = os.path.join( + + input_image = os.path.join( dataset_ins.meta['local_work_dir'], relative_image_path) - target_image = processor_ins( - Image.open(src_image).convert('RGB'), + output_image = processor_ins( + Image.open(input_image).convert('RGB'), height_ratio=height_ratio, width_ratio=width_ratio) - now_time = time.time() - save_folders = 'edit_images' - os.makedirs(os.path.join( - dataset_ins.meta['local_work_dir'], save_folders), - exist_ok=True) + + now_time = int(time.time()) save_file_name = f'{os.path.basename(file_name)}_{now_time}' save_relative_image_path = os.path.join( save_folders, f'{get_md5(save_file_name)}{surfix}') @@ -748,17 +974,58 @@ class DatasetGalleryUI(UIBase): local_save_image_math = os.path.join( dataset_ins.meta['local_work_dir'], save_relative_image_path) - target_image.save(local_save_image_math) + output_image.save(local_save_image_math) FS.put_object_from_local_file(local_save_image_math, save_image_path) + dataset_ins.data[index][ 'edit_relative_path'] = save_relative_image_path dataset_ins.data[index][ 'edit_image_path'] = save_image_path - dataset_ins.data[index]['edit_width'] = target_image.size[ + dataset_ins.data[index]['edit_width'] = output_image.size[ 0] - dataset_ins.data[index]['edit_height'] = target_image.size[ + dataset_ins.data[index]['edit_height'] = output_image.size[ 1] + + if dataset_type == 'scepter_img2img': + # process target image + src_relative_image_path = one_data.get( + 'edit_src_relative_path', + one_data['src_relative_path']) + file_name, surfix = os.path.splitext( + src_relative_image_path) + + input_image = os.path.join( + dataset_ins.meta['local_work_dir'], + src_relative_image_path) + output_image = processor_ins( + Image.open(input_image).convert('RGB'), + height_ratio=height_ratio, + width_ratio=width_ratio) + + now_time = int(time.time()) + save_file_name = f'{os.path.basename(file_name)}_{now_time}' + save_src_relative_image_path = os.path.join( + save_folders, f'{get_md5(save_file_name)}{surfix}') + save_src_image_path = os.path.join( + dataset_ins.meta['work_dir'], + save_src_relative_image_path) + local_save_src_image_math = os.path.join( + dataset_ins.meta['local_work_dir'], + save_src_relative_image_path) + output_image.save(local_save_src_image_math) + FS.put_object_from_local_file( + local_save_src_image_math, save_src_image_path) + + dataset_ins.data[index][ + 'edit_src_relative_path'] = save_src_relative_image_path + dataset_ins.data[index][ + 'edit_src_image_path'] = save_src_image_path + dataset_ins.data[index][ + 'edit_src_width'] = output_image.size[0] + dataset_ins.data[index][ + 'edit_src_height'] = output_image.size[1] + dataset_ins.update_dataset() image_list = [ os.path.join( @@ -787,8 +1054,23 @@ class DatasetGalleryUI(UIBase): edit_image_info = '' ret_image_gallery = gr.Gallery(value=image_list) + + if dataset_type == 'scepter_img2img': + src_image_list = [ + os.path.join( + dataset_ins.meta['local_work_dir'], + v.get('edit_src_relative_path', + v['src_relative_path'])) + for v in dataset_ins.edit_samples + ] + ret_src_image_gallery = gr.Gallery(value=src_image_list) + else: + ret_src_image_gallery = gr.Gallery() + ret_upload_image = gr.Image() + ret_src_upload_image = gr.Image() ret_upload_image_info = '' + ret_upload_src_image_info = gr.Markdown(visible=False) elif mode_state == 'add': if isinstance(upload_image, dict): image = upload_image['image'] @@ -799,37 +1081,63 @@ class DatasetGalleryUI(UIBase): width_ratio=width_ratio) w, h = target_image.size ret_image_gallery = gr.Gallery() + ret_src_image_gallery = gr.Gallery() ret_upload_image = gr.Image(target_image) + ret_upload_image_info = self.component_names.upload_image_info.format( h, w) + if dataset_type == 'scepter_img2img': + if isinstance(upload_src_image, dict): + src_image = upload_src_image['image'] + else: + src_image = upload_src_image + src_target_image = processor_ins(src_image.convert('RGB'), + height_ratio=height_ratio, + width_ratio=width_ratio) + + ret_src_upload_image = gr.Image(src_target_image) + src_w, src_h = src_target_image.size + ret_upload_src_image_info = gr.Markdown( + value=self.component_names.upload_src_image_info. + format(src_h, src_w), + visible=True) + else: + ret_src_upload_image = gr.Image() + ret_upload_src_image_info = gr.Markdown(visible=False) edit_image_info = '' else: ret_image_gallery = gr.Gallery() + ret_src_image_gallery = gr.Gallery() ret_upload_image = gr.Image() + ret_src_upload_image = gr.Image() ret_upload_image_info = '' + ret_upload_src_image_info = gr.Markdown() edit_image_info = '' is_flag, msg = processor_ins.unload_model() if not is_flag: sys_log = f'Unoad processor failed: {msg}' return (ret_image_gallery, edit_image_info, ret_upload_image, - ret_upload_image_info, + ret_src_upload_image, ret_upload_image_info, self.component_names.system_log.format(sys_log)) - return (ret_image_gallery, edit_image_info, ret_upload_image, - ret_upload_image_info, + return (ret_image_gallery, ret_src_image_gallery, edit_image_info, + ret_upload_image, ret_src_upload_image, + ret_upload_image_info, ret_upload_src_image_info, self.component_names.system_log.format('')) self.image_preprocess_btn.click( preprocess_image, inputs=[ self.mode_state, self.image_preprocess_method, - self.upload_image, self.caption, self.height_ratio, - self.width_ratio, create_dataset.dataset_type, - create_dataset.dataset_name + self.upload_image, self.upload_src_image, self.upload_caption, + self.height_ratio, self.width_ratio, + create_dataset.dataset_type, create_dataset.dataset_name ], outputs=[ - self.edit_gl_dataset_images, self.edit_image_info, - self.upload_image, self.upload_image_info, self.sys_log + self.edit_gl_dataset_images, self.edit_src_gl_dataset_images, + self.edit_image_info, self.upload_image, self.upload_src_image, + self.upload_image_info, self.upload_src_image_info, + self.sys_log ], queue=False) @@ -946,7 +1254,8 @@ class DatasetGalleryUI(UIBase): max_new_tokens, min_new_tokens, num_beams, repetition_penalty, temperature, caption_update_mode, upload_image, - upload_caption, dataset_type, dataset_name): + upload_src_image, upload_caption, dataset_type, + dataset_name): reverse_update_mode = { v: idx @@ -969,8 +1278,11 @@ class DatasetGalleryUI(UIBase): return gr.Textbox(), gr.Textbox( ), self.component_names.system_log.format(sys_log) dataset_type = create_dataset.get_trans_dataset_type(dataset_type) - dataset_ins = create_dataset.dataset_dict[dataset_type][ - dataset_name] + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None: + return gr.Textbox(), gr.Textbox( + ), self.component_names.system_log.format('None') if mode_state == 'edit': edit_index_list = dataset_ins.edit_list for index in edit_index_list: @@ -988,9 +1300,28 @@ class DatasetGalleryUI(UIBase): num_beams=num_beams, repetition_penalty=repetition_penalty, temperature=temperature) + + if dataset_type == 'scepter_img2img': + relative_image_path = one_data.get( + 'edit_relative_path', + one_data['src_relative_path']) + src_image = os.path.join( + dataset_ins.meta['local_work_dir'], + relative_image_path) + src_response = processor_ins( + src_image, + prompt=sys_prompt, + max_new_tokens=max_new_tokens, + min_new_tokens=min_new_tokens, + num_beams=num_beams, + repetition_penalty=repetition_penalty, + temperature=temperature) + response = 'src: ' + src_response + ' target: ' + response + if update_mode == 0: - dataset_ins.data[index][ - 'edit_caption'] += ';' + response + if len(dataset_ins.data[index]['edit_caption']) > 0: + dataset_ins.data[index]['edit_caption'] += ';' + dataset_ins.data[index]['edit_caption'] += response elif update_mode == 1: dataset_ins.data[index]['edit_caption'] = response @@ -1019,9 +1350,33 @@ class DatasetGalleryUI(UIBase): num_beams=num_beams, repetition_penalty=repetition_penalty, temperature=temperature) + + if dataset_type == 'scepter_img2img': + if isinstance(upload_src_image, dict): + src_image = upload_src_image['image'] + else: + src_image = upload_src_image + w, h = src_image.size + src_image_path = os.path.join( + save_folder, + f'{imagehash.phash(src_image)}_{w}_{h}.png') + if not os.path.exists(src_image_path): + src_image.save(src_image_path) + src_response = processor_ins( + src_image_path, + prompt=sys_prompt, + max_new_tokens=max_new_tokens, + min_new_tokens=min_new_tokens, + num_beams=num_beams, + repetition_penalty=repetition_penalty, + temperature=temperature) + response = 'src: ' + src_response + ' target: ' + response + ret_edit_caption = gr.Textbox() if update_mode == 0: - upload_caption += ';' + response + if len(upload_caption) > 0: + upload_caption += ';' + upload_caption += response elif update_mode == 1: upload_caption = response ret_upload_caption = gr.Textbox(value=upload_caption) @@ -1045,19 +1400,46 @@ class DatasetGalleryUI(UIBase): self.mode_state, self.caption_preprocess_method, self.sys_prompt, self.max_new_tokens, self.min_new_tokens, self.num_beams, self.repetition_penalty, self.temperature, - self.caption_update_mode, self.upload_image, self.caption, + self.caption_update_mode, self.upload_image, + self.upload_src_image, self.upload_caption, create_dataset.dataset_type, create_dataset.dataset_name ], - outputs=[self.edit_caption, self.caption, self.sys_log], + outputs=[self.edit_caption, self.upload_caption, self.sys_log], queue=False) def mode_state_change(mode_state, dataset_type, dataset_name): # default is editing current sample + dataset_type = create_dataset.get_trans_dataset_type(dataset_type) if mode_state == 'edit': - dataset_type = create_dataset.get_trans_dataset_type( - dataset_type) - dataset_ins = create_dataset.dataset_dict[dataset_type][ - dataset_name] + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None or len(dataset_ins) < 1: + return ( + gr.Gallery(), + gr.Gallery(), + gr.Column(), + gr.Row(visible=True), + gr.Column(), + gr.Column(), + gr.Image(), + gr.Column(), + '', + gr.Markdown(), + gr.Textbox(), + gr.CheckboxGroup(), + gr.Column(), + # gr.Column(), + gr.Row(), + # gr.Column(), + gr.Row(), + gr.Column(), + gr.Gallery(), + gr.Gallery(), + gr.Column(), + gr.Dropdown(), + gr.Dropdown(value=[]), + self.component_names.system_log.format( + self.component_names.illegal_blank_dataset)) dataset_ins.set_edit_range(str(dataset_ins.cursor + 1)) image_list = [ os.path.join( @@ -1068,29 +1450,192 @@ class DatasetGalleryUI(UIBase): selected_index = dataset_ins.edit_index_from_cursor( dataset_ins.cursor) dataset_ins.edit_cursor = selected_index - return (gr.Row(visible=True), gr.Column(visible=True), - gr.Column(visible=False), gr.CheckboxGroup(value=None), - gr.Column(visible=False), gr.Column(visible=False), - gr.Column(visible=True), - gr.Gallery(value=image_list, - selected_index=selected_index, - visible=True), - gr.Dropdown( - value=self.component_names.range_mode_name[0])) + current_info = dataset_ins.current_record + ret_edit_caption = gr.Textbox(value=current_info.get( + 'edit_caption', ''), + visible=True) + + if dataset_type == 'scepter_img2img': + src_image_list = [ + os.path.join( + dataset_ins.meta['local_work_dir'], + v.get('edit_src_relative_path', + v['src_relative_path'])) + for v in dataset_ins.edit_samples + ] + if dataset_ins.edit_cursor >= 0: + ret_edit_src_gallery = gr.Gallery( + label=dataset_name, + value=src_image_list, + selected_index=selected_index, + visible=True) + else: + ret_edit_src_gallery = gr.Gallery(label=dataset_name, + value=src_image_list, + selected_index=None, + visible=True) + ret_edit_src_panel = gr.Column(visible=True) + else: + ret_edit_src_gallery = gr.Gallery(visible=False) + ret_edit_src_panel = gr.Column(visible=False) + return ( + gr.Gallery(), + gr.Gallery(), + gr.Column(), + gr.Row(visible=True), + gr.Column(visible=True), + gr.Column(visible=False), + gr.Image(), + gr.Column(), + '', + gr.Markdown(visible=False), + gr.Textbox(), + gr.CheckboxGroup(value=None), + gr.Column(visible=False), + # gr.Column(visible=False), + gr.Row(visible=False), + # gr.Column(visible=False), + gr.Row(visible=False), + gr.Column(visible=True), + gr.Gallery(value=image_list, + selected_index=selected_index, + visible=True), + ret_edit_caption, + ret_edit_src_gallery, + ret_edit_src_panel, + gr.Dropdown( + # choices=self.component_names.range_mode_name, + # value=self.component_names.range_mode_name[0] + ), + gr.Dropdown(value=[]), + self.component_names.system_log.format('')) elif mode_state == 'add': - return (gr.Row(visible=False), gr.Column(visible=False), - gr.Column(visible=True), gr.CheckboxGroup(), - gr.Column(visible=True), gr.Column(visible=True), - gr.Column(visible=False), gr.Gallery(visible=False), - gr.Dropdown( - value=self.component_names.range_mode_name[0])) + return ( + gr.Gallery(), + gr.Gallery(), + gr.Column(), + gr.Row(visible=False), + gr.Column(visible=False), + gr.Column(visible=True), + gr.Image(), + gr.Column(visible=True) if dataset_type + == 'scepter_img2img' else gr.Column(visible=False), + '', + gr.Markdown(visible=True) if dataset_type + == 'scepter_img2img' else gr.Markdown(visible=False), + gr.Textbox(value=''), + gr.CheckboxGroup(), + gr.Column(visible=True), + # gr.Column(visible=True), + gr.Row(visible=True), + # gr.Column(visible=True), + gr.Row(visible=True), + gr.Column(visible=False), + gr.Gallery(visible=False), + gr.Textbox(), + gr.Gallery(visible=False), + gr.Column(visible=False), + gr.Dropdown( + # choices=self.component_names.range_mode_name, + # value=self.component_names.range_mode_name[0] + ), + gr.Dropdown(value=[]), + self.component_names.system_log.format('')) else: - return (gr.Row(visible=False), gr.Column(visible=False), - gr.Column(visible=False), gr.CheckboxGroup(value=None), - gr.Column(visible=False), gr.Column(visible=False), - gr.Column(visible=False), gr.Gallery(visible=False), - gr.Dropdown( - value=self.component_names.range_mode_name[0])) + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None: + return ( + gr.Gallery(), + gr.Gallery(), + gr.Column(), + gr.Row(visible=True), + gr.Column(), + gr.Column(), + gr.Image(), + gr.Column(), + '', + gr.Markdown(), + gr.Textbox(), + gr.CheckboxGroup(), + gr.Column(), + # gr.Column(), + gr.Row(), + # gr.Column(), + gr.Row(), + gr.Column(), + gr.Gallery(), + gr.Textbox(), + gr.Gallery(), + gr.Column(), + gr.Dropdown(), + gr.Dropdown(value=[]), + self.component_names.system_log.format( + self.component_names.illegal_blank_dataset)) + cursor = dataset_ins.cursor + image_list = [ + os.path.join(dataset_ins.meta['local_work_dir'], + v['relative_path']) for v in dataset_ins.data + ] + if dataset_type == 'scepter_img2img': + src_image_list = [ + os.path.join(dataset_ins.meta['local_work_dir'], + v['src_relative_path']) + for v in dataset_ins.data + ] + if cursor >= 0: + ret_src_gallery = gr.Gallery(label=dataset_name, + value=src_image_list, + selected_index=cursor, + visible=True) + else: + ret_src_gallery = gr.Gallery(label=dataset_name, + value=src_image_list, + selected_index=None, + visible=True) + ret_src_panel = gr.Column(visible=True) + else: + ret_src_gallery = gr.Gallery(visible=False) + ret_src_panel = gr.Column(visible=False) + + if cursor >= 0: + ret_gl_gallery = gr.Gallery(label=dataset_name, + value=image_list, + selected_index=cursor) + else: + ret_gl_gallery = gr.Gallery(label=dataset_name, + value=image_list, + selected_index=None) + + return ( + ret_gl_gallery, + ret_src_gallery, + ret_src_panel, + gr.Row(visible=False), + gr.Column(visible=False), + gr.Column(visible=False), + gr.Image(), + gr.Column(), + '', + gr.Markdown(visible=False), + gr.Textbox(value=''), + gr.CheckboxGroup(value=None), + gr.Column(visible=False), + # gr.Column(visible=False), + gr.Row(visible=False), + # gr.Column(visible=False), + gr.Row(visible=False), + gr.Column(visible=False), + gr.Gallery(visible=False), + gr.Textbox(), + gr.Gallery(visible=False), + gr.Column(visible=False), + gr.Dropdown( + # choices=self.component_names.range_mode_name, + # value=self.component_names.range_mode_name[0] + ), + gr.Dropdown(value=[]), + '') self.mode_state.change( mode_state_change, @@ -1099,22 +1644,31 @@ class DatasetGalleryUI(UIBase): create_dataset.dataset_name ], outputs=[ - self.edit_setting_panel, self.edit_confirm_panel, - self.upload_panel, self.preprocess_checkbox, + self.gl_dataset_images, self.src_gl_dataset_images, + self.src_panel, self.edit_setting_panel, + self.edit_confirm_panel, self.upload_panel, self.upload_image, + self.upload_src_image_panel, self.upload_image_info, + self.upload_src_image_info, self.upload_caption, + self.preprocess_checkbox, self.preprocess_panel, self.image_preprocess_panel, self.caption_preprocess_panel, - self.edit_panel, self.edit_gl_dataset_images, self.range_mode + self.edit_panel, self.edit_gl_dataset_images, + self.edit_caption, self.edit_src_gl_dataset_images, + self.edit_src_panel, self.range_mode, self.data_range, + self.sys_log ], queue=False) def range_change(range_mode, dataset_type, dataset_name): hit_range_mode = range_state_trans(range_mode) if hit_range_mode == 2: - return (gr.Dropdown(visible=True), gr.Gallery()) + return (gr.Dropdown(visible=True), gr.Gallery(), gr.Gallery()) else: dataset_type = create_dataset.get_trans_dataset_type( dataset_type) - dataset_ins = create_dataset.dataset_dict[dataset_type][ - dataset_name] + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None: + return (gr.Dropdown(), gr.Gallery(), gr.Gallery()) if hit_range_mode == 1: dataset_ins.set_edit_range(-1) else: @@ -1128,39 +1682,66 @@ class DatasetGalleryUI(UIBase): selected_index = dataset_ins.edit_index_from_cursor( dataset_ins.cursor) dataset_ins.edit_cursor = selected_index + if dataset_type == 'scepter_img2img': + src_image_list = [ + os.path.join( + dataset_ins.meta['local_work_dir'], + v.get('edit_src_relative_path', + v['src_relative_path'])) + for v in dataset_ins.edit_samples + ] + if dataset_ins.edit_cursor >= 0: + ret_edit_src_gallery = gr.Gallery( + label=dataset_name, + value=src_image_list, + selected_index=selected_index) + else: + ret_edit_src_gallery = gr.Gallery(label=dataset_name, + value=src_image_list, + selected_index=None) + else: + ret_edit_src_gallery = gr.Gallery() return (gr.Dropdown(visible=False), gr.Gallery(value=image_list, selected_index=selected_index, - visible=True)) + visible=True), ret_edit_src_gallery) - self.range_mode.change( - range_change, - inputs=[ - self.range_mode, create_dataset.dataset_type, - create_dataset.dataset_name - ], - outputs=[self.data_range, self.edit_gl_dataset_images], - queue=False) + self.range_mode.change(range_change, + inputs=[ + self.range_mode, + create_dataset.dataset_type, + create_dataset.dataset_name + ], + outputs=[ + self.data_range, + self.edit_gl_dataset_images, + self.edit_src_gl_dataset_images + ], + queue=False) def set_range(data_range, dataset_type, dataset_name): if len(data_range) == 0: - return (gr.Gallery(), gr.Gallery(), gr.Textbox(), gr.Text(), - gr.Textbox(), gr.Text(), gr.Text(), + return (gr.Gallery(), gr.Gallery(), gr.Gallery(), gr.Textbox(), + gr.Text(), gr.Textbox(), gr.Text(), gr.Text(), self.component_names.system_log.format('')) data_range = ','.join(data_range) dataset_type = create_dataset.get_trans_dataset_type(dataset_type) - dataset_ins = create_dataset.dataset_dict[dataset_type][ - dataset_name] + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None: + return (gr.Gallery(), gr.Gallery(), gr.Gallery(), gr.Textbox(), + gr.Text(), gr.Textbox(), gr.Text(), gr.Text(), 'None') flg, msg = dataset_ins.set_edit_range(data_range) if not flg: sys_log = self.component_names.system_log.format(msg) - return (gr.Gallery(), gr.Gallery(), gr.Textbox(), gr.Text(), - gr.Textbox(), gr.Text(), gr.Text(), sys_log) + return (gr.Gallery(), gr.Gallery(), gr.Gallery(), gr.Textbox(), + gr.Text(), gr.Textbox(), gr.Text(), gr.Text(), sys_log) image_list = [ os.path.join(dataset_ins.meta['local_work_dir'], v.get('edit_relative_path', v['relative_path'])) for v in dataset_ins.edit_samples ] + selected_index = 0 if len(image_list) > 0 else -1 if selected_index >= 0: cursor = dataset_ins.cursor_from_edit_index(selected_index) @@ -1173,6 +1754,21 @@ class DatasetGalleryUI(UIBase): ret_edit_image_gl = gr.Gallery(value=image_list, selected_index=selected_index, visible=True) + if dataset_type == 'scepter_img2img': + src_image_list = [ + os.path.join( + dataset_ins.meta['local_work_dir'], + v.get('edit_src_relative_path', + v['src_relative_path'])) + for v in dataset_ins.edit_samples + ] + ret_edit_src_image_gl = gr.Gallery( + value=src_image_list, + selected_index=selected_index, + visible=True) + else: + ret_edit_src_image_gl = gr.Gallery() + ret_caption = gr.Textbox(value=current_info.get('caption', ''), visible=True) ret_edit_caption = gr.Textbox(value=current_info.get( @@ -1205,72 +1801,53 @@ class DatasetGalleryUI(UIBase): else: ret_image_gl = gr.Gallery() ret_edit_image_gl = gr.Gallery() + ret_edit_src_image_gl = gr.Gallery() ret_caption = gr.Textbox() ret_edit_caption = gr.Textbox() image_info = '' edit_image_info = '' ret_info = gr.Text() - return (ret_image_gl, ret_edit_image_gl, ret_caption, image_info, - ret_edit_caption, edit_image_info, ret_info, - self.component_names.system_log.format('')) + return (ret_image_gl, ret_edit_image_gl, ret_edit_src_image_gl, + ret_caption, image_info, ret_edit_caption, edit_image_info, + ret_info, self.component_names.system_log.format('')) - self.data_range.change(set_range, - inputs=[ - self.data_range, - create_dataset.dataset_type, - create_dataset.dataset_name - ], - outputs=[ - self.gl_dataset_images, - self.edit_gl_dataset_images, self.caption, - self.image_info, self.edit_caption, - self.edit_image_info, self.info, - self.sys_log - ], - queue=False) + self.data_range.change( + set_range, + inputs=[ + self.data_range, create_dataset.dataset_type, + create_dataset.dataset_name + ], + outputs=[ + self.gl_dataset_images, self.edit_gl_dataset_images, + self.edit_src_gl_dataset_images, self.ori_caption, + self.image_info, self.edit_caption, self.edit_image_info, + self.info, self.sys_log + ], + queue=False) def delete_file(dataset_type, dataset_name): dataset_type = create_dataset.get_trans_dataset_type(dataset_type) - dataset_ins = create_dataset.dataset_dict[dataset_type][ - dataset_name] + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None or len(dataset_ins) < 1: + return (gr.Gallery(), gr.Checkbox(), gr.Row(visible=True), + self.component_names.system_log.format( + self.component_names.delete_blank_dataset)) dataset_ins.delete_record() - current_info = dataset_ins.current_record - - ret_image_height = current_info.get('height', -1) - ret_image_width = current_info.get('width', -1) - ret_image_format = os.path.splitext( - current_info.get('relative_path', ''))[-1] - - image_info = self.component_names.ori_dataset.format( - ret_image_height, ret_image_width, ret_image_format) - - ret_edit_image_width = current_info.get( - 'edit_width', current_info.get('width', -1)) - ret_edit_image_height = current_info.get( - 'edit_height', current_info.get('height', -1)) - ret_edit_image_format = os.path.splitext( - current_info.get('edit_relative_path', - current_info.get('relative_path', '')))[-1] - - edit_image_info = self.component_names.edit_dataset.format( - ret_edit_image_height, ret_edit_image_width, - ret_edit_image_format) - - image_list = [ - os.path.join(dataset_ins.local_work_dir, v['relative_path']) - for v in dataset_ins.data - ] - return (gr.Gallery(value=image_list, - selected_index=dataset_ins.cursor), - gr.Textbox(value=current_info.get('caption', '')), - image_info, - gr.Textbox( - value=current_info.get('caption', '') if current_info. - get('edit_caption', '') == - '' else current_info['edit_caption']), edit_image_info, - gr.Text( - value=f'{dataset_ins.cursor + 1}/{len(dataset_ins)}')) + if len(dataset_ins) > 0: + image_list = [ + os.path.join(dataset_ins.local_work_dir, + v['relative_path']) for v in dataset_ins.data + ] + ret_gallery = gr.Gallery(value=image_list, + selected_index=dataset_ins.cursor) + ret_state = gr.Checkbox(value=False) + else: + ret_gallery = gr.Gallery(value=[], selected_index=None) + ret_state = gr.Checkbox(value=True) + return (ret_gallery, ret_state, gr.Row(visible=True), + self.component_names.system_log.format('')) self.delete_button.click(delete_file, inputs=[ @@ -1278,12 +1855,55 @@ class DatasetGalleryUI(UIBase): create_dataset.user_dataset_name ], outputs=[ - self.gl_dataset_images, self.ori_caption, - self.image_info, self.edit_caption, - self.edit_image_info, self.info + self.gl_dataset_images, + self.src_dataset_state, + self.edit_setting_panel, self.sys_log ], queue=False) + def src_dataset_change(src_dataset_state, dataset_type, dataset_name): + dataset_type = create_dataset.get_trans_dataset_type(dataset_type) + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None: + return (gr.Gallery(), gr.Row(visible=True), + self.component_names.system_log.format( + self.component_names.illegal_blank_dataset)) + if src_dataset_state: + if dataset_type == 'scepter_img2img': + src_image_list = [ + os.path.join(dataset_ins.meta['local_work_dir'], + v['src_relative_path']) + for v in dataset_ins.data + ] + if len(dataset_ins) > 0: + ret_src_image_gl = gr.Gallery( + value=src_image_list, + selected_index=dataset_ins.cursor, + visible=True) + else: + ret_src_image_gl = gr.Gallery(value=[], + selected_index=None, + visible=True) + else: + ret_src_image_gl = gr.Gallery(visible=False) + else: + ret_src_image_gl = gr.Gallery() + return (ret_src_image_gl, gr.Row(visible=True), + self.component_names.system_log.format('')) + + self.src_dataset_state.change(src_dataset_change, + inputs=[ + self.src_dataset_state, + create_dataset.dataset_type, + create_dataset.user_dataset_name + ], + outputs=[ + self.src_gl_dataset_images, + self.edit_setting_panel, self.sys_log + ], + queue=False) + def image_upload(upload_image): if isinstance(upload_image, dict): image = upload_image['image'] @@ -1297,14 +1917,37 @@ class DatasetGalleryUI(UIBase): outputs=[self.upload_image_info], queue=False) + def image_src_upload(upload_image): + if isinstance(upload_image, dict): + image = upload_image['image'] + else: + image = upload_image + w, h = image.size + return gr.Markdown( + value=self.component_names.upload_src_image_info.format(h, w), + visible=True) + + self.upload_src_image.upload(image_src_upload, + inputs=[self.upload_src_image], + outputs=[self.upload_src_image_info], + queue=False) + def image_clear(): - return '' + return gr.Markdown(visible=False) self.upload_image.clear(image_clear, inputs=[], outputs=[self.upload_image_info], queue=False) + def src_image_clear(): + return '' + + self.upload_src_image.clear(image_clear, + inputs=[], + outputs=[self.upload_src_image_info], + queue=False) + def show_add_record_panel(): return gr.Text(value='add') @@ -1314,69 +1957,52 @@ class DatasetGalleryUI(UIBase): outputs=[self.mode_state], ) - def add_file(dataset_type, dataset_name, upload_image, caption): + def add_file(dataset_type, dataset_name, upload_image, + upload_src_image, caption): if upload_image is None: return (gr.Gallery(), gr.Textbox(), '', gr.Textbox(), '', - gr.Image(), '', '', gr.Text(value='')) + gr.Text(), gr.Image(), gr.Image(), gr.Text(), '', '', + gr.Text()) if isinstance(upload_image, dict): image = upload_image['image'] else: image = upload_image + + if isinstance(upload_src_image, dict): + src_image = upload_src_image['image'] + else: + src_image = upload_src_image + dataset_type = create_dataset.get_trans_dataset_type(dataset_type) - dataset_ins = create_dataset.dataset_dict[dataset_type][ - dataset_name] - dataset_ins.add_record(image, caption) + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None: + return (gr.Gallery(), gr.Textbox(), '', gr.Textbox(), '', + gr.Text(), gr.Image(), gr.Image(), gr.Text(), '', '', + gr.Text()) + dataset_ins.add_record(image, caption, src_image=src_image) + return (gr.Image(value=None), gr.Image(value=None), + gr.Text(value=''), '', '', gr.Text(value='view')) - current_info = dataset_ins.current_record - - ret_image_height = current_info.get('height', -1) - ret_image_width = current_info.get('width', -1) - ret_image_format = os.path.splitext( - current_info.get('relative_path', ''))[-1] - - image_info = self.component_names.ori_dataset.format( - ret_image_height, ret_image_width, ret_image_format) - - image_list = [ - os.path.join(dataset_ins.local_work_dir, v['relative_path']) - for v in dataset_ins.data - ] - - ret_edit_image_width = current_info.get( - 'edit_width', current_info.get('width', -1)) - ret_edit_image_height = current_info.get( - 'edit_height', current_info.get('height', -1)) - ret_edit_image_format = os.path.splitext( - current_info.get('edit_relative_path', - current_info.get('relative_path', '')))[-1] - - edit_image_info = self.component_names.edit_dataset.format( - ret_edit_image_height, ret_edit_image_width, - ret_edit_image_format) - - return (gr.Gallery(value=image_list, - selected_index=dataset_ins.cursor), - gr.Textbox(value=caption), image_info, - gr.Textbox(value=caption), edit_image_info, - gr.Text( - value=f'{dataset_ins.cursor + 1}/{len(dataset_ins)}'), - gr.Image(value=None), gr.Text(value=''), '', - gr.Text(value='view')) - - self.upload_button.click(add_file, - inputs=[ - create_dataset.dataset_type, - create_dataset.dataset_name, - self.upload_image, self.caption - ], - outputs=[ - self.gl_dataset_images, self.ori_caption, - self.image_info, self.edit_caption, - self.edit_image_info, self.info, - self.upload_image, self.caption, - self.upload_image_info, self.mode_state - ], - queue=False) + self.upload_button.click( + add_file, + inputs=[ + create_dataset.dataset_type, create_dataset.dataset_name, + self.upload_image, self.upload_src_image, self.upload_caption + ], + outputs=[ + # self.gl_dataset_images, + # self.ori_caption, + # self.image_info, self.edit_caption, + # self.edit_image_info, self.info, + self.upload_image, + self.upload_src_image, + self.upload_caption, + self.upload_image_info, + self.upload_src_image_info, + self.mode_state + ], + queue=False) def cancel_add_file(): return gr.Text(value='view') @@ -1388,8 +2014,10 @@ class DatasetGalleryUI(UIBase): def edit_caption_change(dataset_type, dataset_name, edit_caption): dataset_type = create_dataset.get_trans_dataset_type(dataset_type) - dataset_ins = create_dataset.dataset_dict[dataset_type][ - dataset_name] + dataset_ins = create_dataset.dataset_dict.get( + dataset_type, {}).get(dataset_name, None) + if dataset_ins is None: + return dataset_ins.edit_caption(edit_caption) self.edit_caption.change(edit_caption_change, diff --git a/scepter/studio/preprocess/caption_editor_ui/export_dataset_ui.py b/scepter/studio/preprocess/caption_editor_ui/export_dataset_ui.py index e2ff71d..aeeb59f 100644 --- a/scepter/studio/preprocess/caption_editor_ui/export_dataset_ui.py +++ b/scepter/studio/preprocess/caption_editor_ui/export_dataset_ui.py @@ -5,7 +5,6 @@ from __future__ import annotations import os import gradio as gr - from scepter.studio.preprocess.caption_editor_ui.component_names import \ ExportDatasetUIName from scepter.studio.utils.uibase import UIBase @@ -56,20 +55,25 @@ class ExportDatasetUI(UIBase): queue=False) def go_to_train(dataset_type, dataset_name): - dataset_type = create_dataset.get_trans_dataset_type(dataset_type) - dataset_ins = create_dataset.dataset_dict[dataset_type][ + dataset_type_ori = create_dataset.get_trans_dataset_type( + dataset_type) + dataset_ins = create_dataset.dataset_dict[dataset_type_ori][ dataset_name] dataset_ins.update_dataset() return (gr.Tabs(selected='self_train'), + gr.Dropdown(value=self.component_names.dataset_source), + gr.Dropdown(value=dataset_type), gr.Textbox( value=os.path.abspath(dataset_ins.local_work_dir)), - dataset_name) + gr.Textbox(value=dataset_name)) self.go_to_train.click( go_to_train, inputs=[create_dataset.dataset_type, create_dataset.dataset_name], outputs=[ - manager.tabs, manager.self_train.trainer_ui.ms_data_name, + manager.tabs, manager.self_train.trainer_ui.data_source, + manager.self_train.trainer_ui.data_type, + manager.self_train.trainer_ui.ms_data_name, manager.self_train.trainer_ui.ori_data_name ], queue=False) diff --git a/scepter/studio/preprocess/preprocess.py b/scepter/studio/preprocess/preprocess.py index 1432a73..666e0b3 100644 --- a/scepter/studio/preprocess/preprocess.py +++ b/scepter/studio/preprocess/preprocess.py @@ -3,7 +3,6 @@ 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 \ diff --git a/scepter/studio/preprocess/processors/base_processor.py b/scepter/studio/preprocess/processors/base_processor.py index b4219a2..adcb6fd 100644 --- a/scepter/studio/preprocess/processors/base_processor.py +++ b/scepter/studio/preprocess/processors/base_processor.py @@ -2,7 +2,6 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import torch - from scepter.studio.utils.env import get_available_memory diff --git a/scepter/studio/preprocess/processors/caption_processors.py b/scepter/studio/preprocess/processors/caption_processors.py index ac2b600..4568252 100644 --- a/scepter/studio/preprocess/processors/caption_processors.py +++ b/scepter/studio/preprocess/processors/caption_processors.py @@ -7,7 +7,6 @@ import time import torch from PIL import Image - from scepter.modules.utils.distribute import we from scepter.modules.utils.file_system import FS from scepter.studio.preprocess.processors.base_processor import \ diff --git a/scepter/studio/preprocess/processors/image_processors.py b/scepter/studio/preprocess/processors/image_processors.py index 82213a1..920a6f8 100644 --- a/scepter/studio/preprocess/processors/image_processors.py +++ b/scepter/studio/preprocess/processors/image_processors.py @@ -2,7 +2,6 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import torchvision.transforms as TT - from scepter.studio.preprocess.processors.base_processor import \ BaseImageProcessor diff --git a/scepter/studio/preprocess/utils/data_card.py b/scepter/studio/preprocess/utils/data_card.py index a3364d4..c2f4b0e 100644 --- a/scepter/studio/preprocess/utils/data_card.py +++ b/scepter/studio/preprocess/utils/data_card.py @@ -2,20 +2,12 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import copy -import csv import datetime import json import os.path -import gradio as gr -import imagehash 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 \ - Text2ImageDataCardName def find_prefix(file_path): @@ -45,7 +37,7 @@ def del_prefix(file_path, prefix=''): def get_image_meta(image): img = Image.open(image) - return img.size + return *img.size, img class BaseDataCard(object): @@ -99,7 +91,8 @@ class BaseDataCard(object): } if FS.exists(self.meta_file): FS.get_dir_to_local_dir(self.dataset_folder, - self.local_dataset_folder) + self.local_dataset_folder, + sign_key=self.meta_file) if FS.exists(self.local_meta): self.meta = self.check_legal_dataset( json.load(open(self.local_meta, 'r'))) @@ -340,6 +333,8 @@ class BaseDataCard(object): def current_record(self): if self.cursor >= len(self): self.set_cursor(0) + if len(self) < 1: + self.set_cursor(-1) if self.cursor >= 0: return self.meta['file_list'][self.cursor] else: @@ -357,823 +352,3 @@ class BaseDataCard(object): if self.cursor >= 0: self.data[self.cursor]['caption'] = self.data[self.cursor][ 'edit_caption'] if edit_caption is None else edit_caption - - -class Text2ImageDataCard(BaseDataCard): - def __init__(self, - dataset_folder, - dataset_name=None, - src_file=None, - surfix=None, - user_name='admin', - language='en'): - super().__init__(dataset_folder, - dataset_name=dataset_name, - user_name=user_name) - self.meta['task_type'] = 'txt2img' - self.components_name = Text2ImageDataCardName(language) - if self.new_dataset: - # new dataset - if surfix == '.zip': - file_list = self.load_from_zip(src_file, dataset_folder, - self.local_dataset_folder) - elif surfix in ['.txt', '.csv']: - file_list = self.load_from_list(src_file, dataset_folder, - self.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(self.local_dataset_folder, - dataset_folder, - multi_thread=True) - if not is_flag: - raise gr.Error(f'{self.components_name.illegal_data_err3}') - - self.meta['cursor'] = 0 if len(file_list) > 0 else -1 - self.meta['file_list'] = file_list - self.update_dataset() - else: - for da_idx, cur_data in enumerate(self.data): - if 'edit_caption' not in cur_data: - self.data[da_idx]['edit_caption'] = cur_data['caption'] - if 'edit_image_path' not in cur_data: - self.data[da_idx]['edit_image_path'] = cur_data[ - 'image_path'] - if 'edit_relative_path' not in cur_data: - self.data[da_idx]['edit_relative_path'] = cur_data[ - 'relative_path'] - if 'edit_width' not in cur_data: - self.data[da_idx]['edit_width'] = cur_data['width'] - if 'edit_height' not in cur_data: - self.data[da_idx]['edit_height'] = cur_data['height'] - - 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'Unzip {save_file} failed {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): - if one_dir.endswith('images') or one_dir.endswith('images/'): - file_folder = one_dir - hit_dir = one_dir - else: - 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')): - file_name, surfix = os.path.splitext(one_s_dir) - txt_file = file_name + '.txt' - if os.path.exists(txt_file): - raw_list[one_s_dir] = txt_file - else: - raw_list[one_s_dir] = None - elif one_dir.endswith('train.csv'): - train_list = one_dir - else: - if (one_dir.endswith('.jpg') or one_dir.endswith('.jpeg') - or one_dir.endswith('.png') - or one_dir.endswith('.webp')): - file_name, surfix = os.path.splitext(one_dir) - txt_file = file_name + '.txt' - if os.path.exists(txt_file): - raw_list[one_dir] = txt_file - else: - raw_list[one_dir] = None - if file_folder is not None and train_list is not None: - break - 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: - _ = FS.get_dir_to_local_dir(file_folder, new_file_folder) - elif len(raw_list) > 0: - raw_list = [[k, v] for k, v in raw_list.items()] - for img_id, cur_image in enumerate(raw_list): - image_name, surfix = os.path.splitext(cur_image[0]) - if cur_image[1] is not None and os.path.exists(cur_image[1]): - prompt = open(cur_image[1], 'r').read() - else: - prompt = image_name.split('/')[-1] - try: - os.rename( - os.path.abspath(cur_image[0]), - f'{new_file_folder}/{get_md5(cur_image[0])}{surfix}') - raw_list[img_id] = [ - os.path.join('images', - f'{get_md5(cur_image[0])}{surfix}'), - prompt - ] - 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)}') - if not file_folder == hit_dir: - try: - res = os.popen(f"rm -rf '{hit_dir}/images/*'") - _ = res.readlines() - res = os.popen(f"rm -rf '{hit_dir}'") - _ = res.readlines() - except Exception: - pass - file_list = self.load_train_file(new_train_list, data_folder) - # remove unused data - for one_dir in FS.walk_dir(local_dataset_folder): - if "images" in one_dir or one_dir.endswith("file.csv") or one_dir.endswith("train.csv"): - continue - try: - os.system(f"rm -rf {one_dir}") - except: - pass - return file_list - - def load_train_file(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 = 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, - 'edit_image_path': - os.path.join(data_folder, image_path), - 'edit_relative_path': - image_path, - 'edit_width': - w, - 'edit_height': - h, - }) - return file_list - - 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( - self.components_name.illegal_data_err1) - is_legal, new_path, prefix = find_prefix(image_path) - try: - int(width), int(height) - except Exception: - raise gr.Error( - self.components_name.illegal_data_err4.format( - width, height)) - - if not is_legal: - raise gr.Error( - self.components_name.illegal_data_err5.format( - image_path)) - 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, - 'edit_image_path': - os.path.join(dataset_folder, image_path), - 'edit_relative_path': - image_path, - 'edit_width': - int(width), - 'edit_height': - int(height), - }) - 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( - self.components_name.illegal_data_err6.format( - 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( - self.components_name.illegal_data_err7.format(local_path)) - if os.path.exists(local_path): - try: - os.remove(local_path) - except Exception: - pass - - return file_list - - def write_train_file(self): - file_list = self.meta['file_list'] - with open(self.local_train_file, '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']]) - FS.put_object_from_local_file(self.local_train_file, self.train_file) - - def write_data_file(self): - file_list = self.meta['file_list'] - with open(self.local_save_file_list, 'w') as f: - for one_file in file_list: - is_flag, file_path = 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'])) - FS.put_object_from_local_file(self.local_save_file_list, - self.save_file_list) - - def add_record(self, image, caption, **kwargs): - local_work_dir = self.meta['local_work_dir'] - work_dir = self.meta['work_dir'] - - save_folder = os.path.join(local_work_dir, 'images') - os.makedirs(save_folder, exist_ok=True) - - w, h = image.size - 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) - - FS.put_object_from_local_file(local_image_path, image_path) - - self.data.append({ - 'image_path': image_path, - 'relative_path': relative_path, - 'width': w, - 'height': h, - 'caption': caption, - 'prefix': '', - 'edit_caption': caption, - 'edit_image_path': image_path, - 'edit_relative_path': relative_path, - 'edit_width': w, - 'edit_height': h - }) - - self.set_cursor(len(self.meta['file_list']) - 1) - self.update_dataset() - return True - - def delete_record(self): - if len(self) < 1: - raise gr.Error(self.components_name.delete_err1) - current_file = self.data.pop(self.cursor) - local_file = os.path.join(self.meta['local_work_dir'], - current_file['relative_path']) - try: - os.remove(local_file) - except Exception: - print(f'remove file {local_file} error') - if self.cursor >= len(self.meta['file_list']): - self.set_cursor(0) - if len(self.meta['file_list']) == 0: - self.set_cursor(-1) - self.update_dataset() - - def export_zip(self, export_folder): - self.update_dataset() - zip_path = os.path.join(export_folder, f'{self.dataset_name}.zip') - local_zip, _ = FS.map_to_local(zip_path) - os.makedirs(os.path.dirname(local_zip), exist_ok=True) - res = os.popen( - f"cd '{self.local_work_dir}' && mkdir -p '{self.dataset_name}' " - f"&& cp -rf images '{self.dataset_name}/images' " - f"&& cp -rf train.csv '{self.dataset_name}/train.csv' " - f"&& zip -r '{os.path.abspath(local_zip)}' '{self.dataset_name}'/* " - f"&& rm -rf '{self.dataset_name}'") - print(res.readlines()) - if not FS.exists(zip_path): - raise gr.Error(self.components_name.export_zip_err1) - return local_zip - - -class Image2ImageDataCard(BaseDataCard): - def __init__(self, - dataset_folder, - dataset_name=None, - src_file=None, - surfix=None, - user_name='admin', - language='en'): - super().__init__(dataset_folder, - dataset_name=dataset_name, - user_name=user_name) - self.meta['task_type'] = 'txt2img' - self.components_name = Text2ImageDataCardName(language) - if self.new_dataset: - # new dataset - if surfix == '.zip': - file_list = self.load_from_zip(src_file, dataset_folder, - self.local_dataset_folder) - elif surfix in ['.txt', '.csv']: - file_list = self.load_from_list(src_file, dataset_folder, - self.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(self.local_dataset_folder, - dataset_folder, - multi_thread=True) - if not is_flag: - raise gr.Error(f'{self.components_name.illegal_data_err3}') - - self.meta['cursor'] = 0 if len(file_list) > 0 else -1 - self.meta['file_list'] = file_list - self.update_dataset() - - 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'Unzip {save_file} failed {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): - if one_dir.endswith('images') or one_dir.endswith('images/'): - file_folder = one_dir - hit_dir = one_dir - else: - 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')): - file_name, surfix = os.path.splitext(one_s_dir) - txt_file = file_name + '.txt' - if os.path.exists(txt_file): - raw_list[one_s_dir] = txt_file - else: - raw_list[one_s_dir] = None - elif one_dir.endswith('train.csv'): - train_list = one_dir - else: - if (one_dir.endswith('.jpg') or one_dir.endswith('.jpeg') - or one_dir.endswith('.png') - or one_dir.endswith('.webp')): - file_name, surfix = os.path.splitext(one_dir) - txt_file = file_name + '.txt' - if os.path.exists(txt_file): - raw_list[one_dir] = txt_file - else: - raw_list[one_dir] = None - if file_folder is not None and train_list is not None: - break - if file_folder is None and len(raw_list) < 1: - raise gr.Error( - "images doesn't exist, or nothing exists in your zip") - - if train_list is None: - raise gr.Error("pair list doesn't exist") - new_file_folder = f'{local_dataset_folder}/images' - os.makedirs(new_file_folder, exist_ok=True) - - images_dict = {} - if file_folder is not None: - _ = FS.get_dir_to_local_dir(file_folder, new_file_folder) - elif len(raw_list) > 0: - raw_list = [[k, v] for k, v in raw_list.items()] - for img_id, cur_image in enumerate(raw_list): - image_name, surfix = os.path.splitext(cur_image[0]) - try: - os.rename( - os.path.abspath(cur_image[0]), - f'{new_file_folder}/{get_md5(cur_image[0])}{surfix}') - images_dict[os.path.basename(image_name)] = os.path.join( - 'images', f'{get_md5(cur_image[0])}{surfix}'), - 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' - 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)}') - if not file_folder == hit_dir: - try: - res = os.popen(f"rm -rf '{hit_dir}/images/*'") - _ = res.readlines() - res = os.popen(f"rm -rf '{hit_dir}'") - _ = res.readlines() - except Exception: - pass - file_list = self.load_train_file(new_train_list, data_folder, - images_dict) - return file_list - - def load_train_file(self, file_path, data_folder, images_dict={}): - base_folder = os.path.dirname(file_path) - file_list = [] - with open(file_path, 'r') as f: - reader = csv.reader(f) - for row in reader: - src_image_path, image_path, prompt = row[0], row[1], row[2] - if image_path == 'Target:FILE': - continue - - src_image_name, surfix = os.path.splitext(src_image_path) - src_image_path = images_dict.get( - src_image_path, os.path.basename(src_image_name)) - local_src_image_path = os.path.join(base_folder, - src_image_path) - src_w, src_h = get_image_meta(local_src_image_path) - - image_name, surfix = os.path.splitext(image_path) - image_path = images_dict.get(image_path, - os.path.basename(image_name)) - local_image_path = os.path.join(base_folder, image_path) - w, h = 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, - 'src_image_path': - os.path.join(data_folder, src_image_path), - 'src_relative_path': - src_image_path, - 'src_width': - src_w, - 'src_height': - src_h, - 'caption': - prompt, - 'prefix': - '', - 'edit_caption': - prompt - }) - return file_list - - 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_src_remote_list, all_src_local_list = [], [] - all_save_list, all_src_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, src_image_path, src_width, src_height, caption = line.split( - '#;#', 6) - except Exception: - try: - image_path, width, height, src_image_path, src_width, src_height, caption = line.split( - ',', 6) - except Exception: - raise gr.Error( - self.components_name.illegal_data_err1) - is_legal, new_path, prefix = find_prefix(image_path) - try: - int(width), int(height) - except Exception: - raise gr.Error( - self.components_name.illegal_data_err4.format( - width, height)) - - is_legal, new_src_path, src_prefix = find_prefix( - src_image_path) - try: - int(src_width), int(src_height) - except Exception: - raise gr.Error( - self.components_name.illegal_data_err4.format( - src_width, src_height)) - - if not is_legal: - raise gr.Error( - self.components_name.illegal_data_err5.format( - image_path + ' ' + src_image_path)) - relative_path = os.path.join('images', - image_path.split('/')[-1]) - - src_relative_path = os.path.join( - 'images', - src_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)) - - all_src_remote_list.append(new_src_path) - all_src_local_list.append( - os.path.join(local_dataset_folder, src_relative_path)) - all_src_save_list.append( - os.path.join(dataset_folder, src_relative_path)) - - file_list.append({ - 'image_path': - os.path.join(dataset_folder, relative_path), - 'src_image_path': - os.path.join(dataset_folder, src_relative_path), - 'relative_path': - relative_path, - 'src_relative_path': - src_relative_path, - 'width': - int(width), - 'height': - int(height), - 'src_width': - int(src_width), - 'src_height': - int(src_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( - self.components_name.illegal_data_err6.format( - 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( - self.components_name.illegal_data_err7.format(local_path)) - if os.path.exists(local_path): - try: - os.remove(local_path) - except Exception: - pass - - cache_src_file_list = [] - for idx, local_path in enumerate( - FS.get_batch_objects_from(all_src_remote_list)): - if local_path is None: - raise gr.Error( - self.components_name.illegal_data_err6.format( - all_src_remote_list[idx])) - _ = FS.put_object_from_local_file(local_path, - all_src_local_list[idx]) - cache_src_file_list.append(local_path) - - for local_path, target_path, flg in FS.put_batch_objects_to( - cache_src_file_list, all_src_save_list): - if not flg: - raise gr.Error( - self.components_name.illegal_data_err7.format(local_path)) - if os.path.exists(local_path): - try: - os.remove(local_path) - except Exception: - pass - return file_list - - def write_train_file(self): - file_list = self.meta['file_list'] - with open(self.local_train_file, 'w') as f: - writer = csv.writer(f) - writer.writerow(['Target:FILE', 'Source:FILE', 'Prompt']) - for one_file in file_list: - relative_file = one_file['relative_path'] - if relative_file.startswith('/'): - relative_file = relative_file[1:] - - src_relative_file = one_file['src_relative_path'] - if src_relative_file.startswith('/'): - src_relative_file = src_relative_file[1:] - - writer.writerow( - [relative_file, src_relative_file, one_file['caption']]) - FS.put_object_from_local_file(self.local_train_file, self.train_file) - - def write_data_file(self): - file_list = self.meta['file_list'] - with open(self.local_save_file_list, 'w') as f: - for one_file in file_list: - is_flag, file_path = del_prefix(one_file['image_path'], - prefix=one_file['prefix']) - is_flag, src_file_path = del_prefix(one_file['src_image_path'], - prefix=one_file['prefix']) - f.write('{}#;#{}#;#{}#;#{}#;#{}#;#{}#;#{}\n'.format( - file_path, one_file['width'], one_file['height'], - src_file_path, one_file['src_width'], - one_file['src_height'], one_file['caption'])) - FS.put_object_from_local_file(self.local_save_file_list, - self.save_file_list) - - def add_record(self, images, caption, **kwargs): - local_work_dir = self.meta['local_work_dir'] - work_dir = self.meta['work_dir'] - - save_folder = os.path.join(local_work_dir, 'images') - os.makedirs(save_folder, exist_ok=True) - image, src_image = images - - w, h = image.size - 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) - image.save(local_image_path) - FS.put_object_from_local_file(local_image_path, image_path) - - src_w, src_h = src_image.size - src_relative_path = os.path.join('images', - f'{imagehash.phash(src_image)}.png') - src_image_path = os.path.join(work_dir, src_relative_path) - local_src_image_path = os.path.join(local_work_dir, src_relative_path) - image.save(local_src_image_path) - FS.put_object_from_local_file(local_src_image_path, src_image_path) - - self.data.append({ - 'image_path': image_path, - 'relative_path': relative_path, - 'width': w, - 'height': h, - 'src_image_path': src_image_path, - 'src_relative_path': src_relative_path, - 'src_width': src_w, - 'src_height': src_h, - 'caption': caption, - 'prefix': '', - 'edit_caption': caption - }) - - self.set_cursor(len(self.meta['file_list']) - 1) - self.update_dataset() - return True - - def delete_record(self): - if len(self) < 1: - raise gr.Error(self.components_name.delete_err1) - current_file = self.data.pop(self.cursor) - local_file = os.path.join(self.meta['local_work_dir'], - current_file['relative_path']) - try: - os.remove(local_file) - except Exception: - print(f'remove file {local_file} error') - if self.cursor >= len(self.meta['file_list']): - self.set_cursor(0) - if len(self.meta['file_list']) == 0: - self.set_cursor(-1) - self.update_dataset() - - def export_zip(self, export_folder): - self.update_dataset() - zip_path = os.path.join(export_folder, f'{self.dataset_name}.zip') - local_zip, _ = FS.map_to_local(zip_path) - os.makedirs(os.path.dirname(local_zip), exist_ok=True) - res = os.popen( - f"cd '{self.local_work_dir}' && mkdir -p '{self.dataset_name}' " - f"&& cp -rf images '{self.dataset_name}/images' " - f"&& cp -rf train.csv '{self.dataset_name}/train.csv' " - f"&& zip -r '{os.path.abspath(local_zip)}' '{self.dataset_name}'/* " - f"&& rm -rf '{self.dataset_name}'") - print(res.readlines()) - if not FS.exists(zip_path): - raise gr.Error(self.components_name.export_zip_err1) - return local_zip diff --git a/scepter/studio/preprocess/utils/img2img_data_card.py b/scepter/studio/preprocess/utils/img2img_data_card.py new file mode 100644 index 0000000..1ef3864 --- /dev/null +++ b/scepter/studio/preprocess/utils/img2img_data_card.py @@ -0,0 +1,511 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import csv +import os +import time + +from tqdm import tqdm + +import gradio as gr +import imagehash +from scepter.modules.utils.file_system import FS +from scepter.studio.preprocess.caption_editor_ui.component_names import \ + Image2ImageDataCardName +from scepter.studio.preprocess.utils.data_card import (BaseDataCard, + del_prefix, find_prefix, + get_image_meta) + + +class Image2ImageDataCard(BaseDataCard): + def __init__(self, + dataset_folder, + dataset_name=None, + src_file=None, + surfix=None, + user_name='admin', + language='en'): + super().__init__(dataset_folder, + dataset_name=dataset_name, + user_name=user_name) + self.meta['task_type'] = 'img2img' + self.components_name = Image2ImageDataCardName(language) + if self.new_dataset: + # new dataset + if surfix == '.zip': + file_list = self.load_from_zip(src_file, dataset_folder, + self.local_dataset_folder) + elif surfix in ['.txt', '.csv']: + file_list = self.load_from_list(src_file, dataset_folder, + self.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(self.local_dataset_folder, + dataset_folder, + multi_thread=True) + if not is_flag: + raise gr.Error(f'{self.components_name.illegal_data_err3}') + + self.meta['cursor'] = 0 if len(file_list) > 0 else -1 + self.meta['file_list'] = file_list + self.update_dataset() + else: + for da_idx, cur_data in enumerate(self.data): + if 'edit_caption' not in cur_data: + self.data[da_idx]['edit_caption'] = cur_data['caption'] + if 'edit_image_path' not in cur_data: + self.data[da_idx]['edit_image_path'] = cur_data[ + 'image_path'] + if 'edit_relative_path' not in cur_data: + self.data[da_idx]['edit_relative_path'] = cur_data[ + 'relative_path'] + if 'edit_width' not in cur_data: + self.data[da_idx]['edit_width'] = cur_data['width'] + if 'edit_height' not in cur_data: + self.data[da_idx]['edit_height'] = cur_data['height'] + + if 'edit_src_image_path' not in cur_data: + self.data[da_idx]['edit_src_image_path'] = cur_data[ + 'src_image_path'] + if 'edit_relative_path' not in cur_data: + self.data[da_idx]['edit_src_relative_path'] = cur_data[ + 'src_relative_path'] + if 'edit_width' not in cur_data: + self.data[da_idx]['edit_src_width'] = cur_data['src_width'] + if 'edit_height' not in cur_data: + self.data[da_idx]['edit_src_height'] = cur_data[ + 'src_height'] + + 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'Unzip {save_file} failed {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): + if one_dir.endswith('images') or one_dir.endswith('images/'): + file_folder = one_dir + hit_dir = one_dir + else: + 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 + elif one_dir.endswith('train.csv'): + train_list = one_dir + else: + continue + if file_folder is not None and train_list is not None: + break + if file_folder is None and len(raw_list) < 1: + raise gr.Error( + "images doesn't exist, or nothing exists in your zip") + + if train_list is None: + raise gr.Error("pair list doesn't exist") + new_file_folder = f'{local_dataset_folder}/images' + os.makedirs(new_file_folder, exist_ok=True) + + if file_folder is not None: + _ = FS.get_dir_to_local_dir(file_folder, new_file_folder) + + if not os.path.exists(new_file_folder): + raise gr.Error(f'{str(res)}') + new_train_list = f'{local_dataset_folder}/train.csv' + 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)}') + if not file_folder == hit_dir: + try: + res = os.popen(f"rm -rf '{hit_dir}/images/*'") + _ = res.readlines() + res = os.popen(f"rm -rf '{hit_dir}'") + _ = res.readlines() + except Exception: + pass + file_list = self.load_train_file(new_train_list, data_folder) + # remove unused data + for one_dir in FS.walk_dir(local_dataset_folder): + if 'images' in one_dir or one_dir.endswith( + 'file.csv') or one_dir.endswith('train.csv'): + continue + # try: + # os.system(f'rm -rf {one_dir}') + # except: + # pass + os.system(f'rm -rf {one_dir}') + return file_list + + def load_train_file(self, file_path, data_folder): + base_folder = os.path.dirname(file_path) + file_list = [] + image_set = set() + with open(file_path, 'r') as f: + reader = csv.reader(f) + for row in reader: + src_image_path, image_path, prompt = row[0], row[1], row[2] + if image_path == 'Target:FILE': + continue + + local_src_image_path = os.path.join(base_folder, + src_image_path) + src_w, src_h, src_img = get_image_meta(local_src_image_path) + if src_image_path in image_set: + src_image_name, surfix = os.path.splitext(src_image_path) + src_image_path = f'{src_image_name}_{int(time.time())}{surfix}' + new_local_image_path = os.path.join( + base_folder, src_image_path) + src_img.save(new_local_image_path) + image_set.add(src_image_path) + + local_image_path = os.path.join(base_folder, image_path) + w, h, img = get_image_meta(local_image_path) + if image_path in image_set: + image_name, surfix = os.path.splitext(image_path) + image_path = f'{image_name}_{int(time.time())}{surfix}' + new_local_image_path = os.path.join( + base_folder, image_path) + img.save(new_local_image_path) + image_set.add(image_path) + + file_list.append({ + 'image_path': + os.path.join(data_folder, image_path), + 'relative_path': + image_path, + 'width': + w, + 'height': + h, + 'src_image_path': + os.path.join(data_folder, src_image_path), + 'src_relative_path': + src_image_path, + 'src_width': + src_w, + 'src_height': + src_h, + 'caption': + prompt, + 'prefix': + '', + 'edit_caption': + prompt, + 'edit_image_path': + os.path.join(data_folder, image_path), + 'edit_relative_path': + image_path, + 'edit_width': + w, + 'edit_height': + h, + 'edit_src_image_path': + os.path.join(data_folder, src_image_path), + 'edit_src_relative_path': + src_image_path, + 'edit_src_width': + src_w, + 'edit_src_height': + src_h, + }) + return file_list + + 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_src_remote_list, all_src_local_list = [], [] + all_save_list, all_src_save_list = [], [] + with open(local_path, 'r') as f: + for line in tqdm(f): + line = line.strip() + if line == '': + continue + try: + src_image_path, src_width, src_height, image_path, width, height, caption = line.split( + '#;#', 6) + except Exception: + try: + src_image_path, src_width, src_height, image_path, width, height, caption = line.split( + ',', 6) + except Exception: + raise gr.Error( + self.components_name.illegal_data_err1) + is_legal, new_path, prefix = find_prefix(image_path) + try: + int(width), int(height) + except Exception: + raise gr.Error( + self.components_name.illegal_data_err4.format( + width, height)) + + is_legal, new_src_path, src_prefix = find_prefix( + src_image_path) + try: + int(src_width), int(src_height) + except Exception: + raise gr.Error( + self.components_name.illegal_data_err4.format( + src_width, src_height)) + + if not is_legal: + raise gr.Error( + self.components_name.illegal_data_err5.format( + image_path + ' ' + src_image_path)) + relative_path = os.path.join( + 'images', + f'{int(time.time())}_' + image_path.split('/')[-1]) + + src_relative_path = os.path.join( + 'images', + f'{int(time.time())}_' + src_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)) + + all_src_remote_list.append(new_src_path) + all_src_local_list.append( + os.path.join(local_dataset_folder, src_relative_path)) + all_src_save_list.append( + os.path.join(dataset_folder, src_relative_path)) + + file_list.append({ + 'image_path': + os.path.join(dataset_folder, relative_path), + 'src_image_path': + os.path.join(dataset_folder, src_relative_path), + 'relative_path': + relative_path, + 'src_relative_path': + src_relative_path, + 'width': + int(width), + 'height': + int(height), + 'src_width': + int(src_width), + 'src_height': + int(src_height), + 'caption': + caption, + 'prefix': + prefix, + 'edit_caption': + caption, + 'edit_image_path': + os.path.join(dataset_folder, relative_path), + 'edit_relative_path': + relative_path, + 'edit_width': + int(width), + 'edit_height': + int(height), + 'edit_src_image_path': + os.path.join(dataset_folder, src_relative_path), + 'edit_src_relative_path': + src_image_path, + 'edit_src_width': + int(src_width), + 'edit_src_height': + int(src_height) + }) + 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( + self.components_name.illegal_data_err6.format( + 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( + self.components_name.illegal_data_err7.format(local_path)) + if os.path.exists(local_path): + try: + os.remove(local_path) + except Exception: + pass + + cache_src_file_list = [] + for idx, local_path in enumerate( + FS.get_batch_objects_from(all_src_remote_list)): + if local_path is None: + raise gr.Error( + self.components_name.illegal_data_err6.format( + all_src_remote_list[idx])) + _ = FS.put_object_from_local_file(local_path, + all_src_local_list[idx]) + cache_src_file_list.append(local_path) + + for local_path, target_path, flg in FS.put_batch_objects_to( + cache_src_file_list, all_src_save_list): + if not flg: + raise gr.Error( + self.components_name.illegal_data_err7.format(local_path)) + if os.path.exists(local_path): + try: + os.remove(local_path) + except Exception: + pass + return file_list + + def write_train_file(self): + file_list = self.meta['file_list'] + with open(self.local_train_file, 'w') as f: + writer = csv.writer(f) + writer.writerow(['Source:FILE', 'Target:FILE', 'Prompt']) + for one_file in file_list: + relative_file = one_file['relative_path'] + if relative_file.startswith('/'): + relative_file = relative_file[1:] + + src_relative_file = one_file['src_relative_path'] + if src_relative_file.startswith('/'): + src_relative_file = src_relative_file[1:] + + writer.writerow( + [src_relative_file, relative_file, one_file['caption']]) + FS.put_object_from_local_file(self.local_train_file, self.train_file) + + def write_data_file(self): + file_list = self.meta['file_list'] + with open(self.local_save_file_list, 'w') as f: + for one_file in file_list: + is_flag, file_path = del_prefix(one_file['image_path'], + prefix=one_file['prefix']) + is_flag, src_file_path = del_prefix(one_file['src_image_path'], + prefix=one_file['prefix']) + f.write('{}#;#{}#;#{}#;#{}#;#{}#;#{}#;#{}\n'.format( + src_file_path, one_file['src_width'], + one_file['src_height'], file_path, one_file['width'], + one_file['height'], one_file['caption'])) + FS.put_object_from_local_file(self.local_save_file_list, + self.save_file_list) + + def add_record(self, image, caption, **kwargs): + local_work_dir = self.meta['local_work_dir'] + work_dir = self.meta['work_dir'] + + save_folder = os.path.join(local_work_dir, 'images') + os.makedirs(save_folder, exist_ok=True) + + w, h = image.size + relative_path = os.path.join( + 'images', f'{imagehash.phash(image)}_{int(time.time())}.jpg') + image_path = os.path.join(work_dir, relative_path) + local_image_path = os.path.join(local_work_dir, relative_path) + image.save(local_image_path) + FS.put_object_from_local_file(local_image_path, image_path) + + src_image = kwargs.pop('src_image') + src_w, src_h = src_image.size + src_relative_path = os.path.join( + 'images', f'{imagehash.phash(src_image)}_{int(time.time())}.jpg') + src_image_path = os.path.join(work_dir, src_relative_path) + local_src_image_path = os.path.join(local_work_dir, src_relative_path) + src_image.save(local_src_image_path) + FS.put_object_from_local_file(local_src_image_path, src_image_path) + + self.data.append({ + 'image_path': image_path, + 'relative_path': relative_path, + 'width': w, + 'height': h, + 'src_image_path': src_image_path, + 'src_relative_path': src_relative_path, + 'src_width': src_w, + 'src_height': src_h, + 'caption': caption, + 'prefix': '', + 'edit_caption': caption, + 'edit_image_path': image_path, + 'edit_relative_path': relative_path, + 'edit_width': w, + 'edit_height': h, + 'edit_src_image_path': src_image_path, + 'edit_src_relative_path': src_relative_path, + 'edit_src_width': src_w, + 'edit_src_height': src_h + }) + + self.set_cursor(len(self.meta['file_list']) - 1) + self.update_dataset() + return True + + def delete_record(self): + if len(self) < 1: + raise gr.Error(self.components_name.delete_err1) + current_file = self.data.pop(self.cursor) + self.set_cursor(self.cursor - 1) + local_file = os.path.join(self.meta['local_work_dir'], + current_file['relative_path']) + try: + os.remove(local_file) + except Exception: + print(f'remove file {local_file} error') + + local_src_file = os.path.join(self.meta['local_work_dir'], + current_file['src_relative_path']) + try: + os.remove(local_src_file) + except Exception: + print(f'remove file {local_src_file} error') + + if self.cursor >= len(self.meta['file_list']): + self.set_cursor(0) + if self.cursor < 0: + self.set_cursor(len(self) - 1) + if len(self.meta['file_list']) == 0: + self.set_cursor(-1) + self.update_dataset() + + def export_zip(self, export_folder): + self.update_dataset() + zip_path = os.path.join(export_folder, f'{self.dataset_name}.zip') + local_zip, _ = FS.map_to_local(zip_path) + os.makedirs(os.path.dirname(local_zip), exist_ok=True) + res = os.popen( + f"cd '{self.local_work_dir}' && mkdir -p '{self.dataset_name}' " + f"&& cp -rf images '{self.dataset_name}/images' " + f"&& cp -rf train.csv '{self.dataset_name}/train.csv' " + f"&& zip -r '{os.path.abspath(local_zip)}' '{self.dataset_name}'/* " + f"&& rm -rf '{self.dataset_name}'") + print(res.readlines()) + FS.put_object_from_local_file(local_zip, zip_path) + if not FS.exists(zip_path): + raise gr.Error(self.components_name.export_zip_err1) + return local_zip diff --git a/scepter/studio/preprocess/utils/txt2img_data_card.py b/scepter/studio/preprocess/utils/txt2img_data_card.py new file mode 100644 index 0000000..2e45313 --- /dev/null +++ b/scepter/studio/preprocess/utils/txt2img_data_card.py @@ -0,0 +1,418 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import csv +import os +import time + +from tqdm import tqdm + +import gradio as gr +import imagehash +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 \ + Text2ImageDataCardName +from scepter.studio.preprocess.utils.data_card import (BaseDataCard, + find_prefix, + get_image_meta) + + +class Text2ImageDataCard(BaseDataCard): + def __init__(self, + dataset_folder, + dataset_name=None, + src_file=None, + surfix=None, + user_name='admin', + language='en'): + super().__init__(dataset_folder, + dataset_name=dataset_name, + user_name=user_name) + self.meta['task_type'] = 'txt2img' + self.components_name = Text2ImageDataCardName(language) + if self.new_dataset: + # new dataset + if surfix == '.zip': + file_list = self.load_from_zip(src_file, dataset_folder, + self.local_dataset_folder) + elif surfix in ['.txt', '.csv']: + file_list = self.load_from_list(src_file, dataset_folder, + self.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(self.local_dataset_folder, + dataset_folder, + multi_thread=True) + if not is_flag: + raise gr.Error(f'{self.components_name.illegal_data_err3}') + + self.meta['cursor'] = 0 if len(file_list) > 0 else -1 + self.meta['file_list'] = file_list + self.update_dataset() + else: + for da_idx, cur_data in enumerate(self.data): + if 'edit_caption' not in cur_data: + self.data[da_idx]['edit_caption'] = cur_data['caption'] + if 'edit_image_path' not in cur_data: + self.data[da_idx]['edit_image_path'] = cur_data[ + 'image_path'] + if 'edit_relative_path' not in cur_data: + self.data[da_idx]['edit_relative_path'] = cur_data[ + 'relative_path'] + if 'edit_width' not in cur_data: + self.data[da_idx]['edit_width'] = cur_data['width'] + if 'edit_height' not in cur_data: + self.data[da_idx]['edit_height'] = cur_data['height'] + + 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'Unzip {save_file} failed {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): + if one_dir.endswith('images') or one_dir.endswith('images/'): + file_folder = one_dir + hit_dir = one_dir + else: + 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')): + file_name, surfix = os.path.splitext(one_s_dir) + txt_file = file_name + '.txt' + if os.path.exists(txt_file): + raw_list[one_s_dir] = txt_file + else: + raw_list[one_s_dir] = None + elif one_dir.endswith('train.csv'): + train_list = one_dir + else: + if (one_dir.endswith('.jpg') or one_dir.endswith('.jpeg') + or one_dir.endswith('.png') + or one_dir.endswith('.webp')): + file_name, surfix = os.path.splitext(one_dir) + txt_file = file_name + '.txt' + if os.path.exists(txt_file): + raw_list[one_dir] = txt_file + else: + raw_list[one_dir] = None + if file_folder is not None and train_list is not None: + break + 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: + _ = FS.get_dir_to_local_dir(file_folder, new_file_folder) + elif len(raw_list) > 0: + raw_list = [[k, v] for k, v in raw_list.items()] + for img_id, cur_image in enumerate(raw_list): + image_name, surfix = os.path.splitext(cur_image[0]) + if cur_image[1] is not None and os.path.exists(cur_image[1]): + prompt = open(cur_image[1], 'r').read() + else: + prompt = image_name.split('/')[-1] + try: + new_name = f'{get_md5(cur_image[0])}_{int(time.time())}{surfix}' + os.rename(os.path.abspath(cur_image[0]), + f'{new_file_folder}/{new_name}') + raw_list[img_id] = [ + os.path.join('images', new_name), prompt + ] + 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)}') + if not file_folder == hit_dir: + try: + res = os.popen(f"rm -rf '{hit_dir}/images/*'") + _ = res.readlines() + res = os.popen(f"rm -rf '{hit_dir}'") + _ = res.readlines() + except Exception: + pass + file_list = self.load_train_file(new_train_list, data_folder) + # remove unused data + for one_dir in FS.walk_dir(local_dataset_folder): + if 'images' in one_dir or one_dir.endswith( + 'file.csv') or one_dir.endswith('train.csv'): + continue + # try: + # os.system(f'rm -rf {one_dir}') + # except: + # pass + os.system(f'rm -rf {one_dir}') + return file_list + + def load_train_file(self, file_path, data_folder): + base_folder = os.path.dirname(file_path) + file_list = [] + image_set = set() + 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, img = get_image_meta(local_image_path) + # deal with the duplication + if image_path in image_set: + basename, surfix = os.path.splitext(local_image_path) + image_path = f'{basename}_{int(time.time())}{surfix}' + new_local_image_path = os.path.join( + base_folder, image_path) + img.save(new_local_image_path) + image_set.add(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, + 'edit_image_path': + os.path.join(data_folder, image_path), + 'edit_relative_path': + image_path, + 'edit_width': + w, + 'edit_height': + h, + }) + return file_list + + 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( + self.components_name.illegal_data_err1) + is_legal, new_path, prefix = find_prefix(image_path) + try: + int(width), int(height) + except Exception: + raise gr.Error( + self.components_name.illegal_data_err4.format( + width, height)) + + if not is_legal: + raise gr.Error( + self.components_name.illegal_data_err5.format( + image_path)) + relative_path = os.path.join( + 'images', + f'{int(time.time())}_' + 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, + 'edit_image_path': + os.path.join(dataset_folder, image_path), + 'edit_relative_path': + image_path, + 'edit_width': + int(width), + 'edit_height': + int(height), + }) + 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( + self.components_name.illegal_data_err6.format( + 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( + self.components_name.illegal_data_err7.format(local_path)) + if os.path.exists(local_path): + try: + os.remove(local_path) + except Exception: + pass + + return file_list + + def write_train_file(self): + file_list = self.meta['file_list'] + with open(self.local_train_file, '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']]) + FS.put_object_from_local_file(self.local_train_file, self.train_file) + + def write_data_file(self): + file_list = self.meta['file_list'] + with open(self.local_save_file_list, 'w') as f: + for one_file in file_list: + file_path = os.path.join(self.local_work_dir, + one_file['relative_path']) + f.write('{}#;#{}#;#{}#;#{}\n'.format(file_path, + one_file['width'], + one_file['height'], + one_file['caption'])) + FS.put_object_from_local_file(self.local_save_file_list, + self.save_file_list) + + def add_record(self, image, caption, **kwargs): + local_work_dir = self.meta['local_work_dir'] + work_dir = self.meta['work_dir'] + + save_folder = os.path.join(local_work_dir, 'images') + os.makedirs(save_folder, exist_ok=True) + + w, h = image.size + relative_path = os.path.join( + 'images', f'{imagehash.phash(image)}_{int(time.time())}.jpg') + image_path = os.path.join(work_dir, relative_path) + local_image_path = os.path.join(local_work_dir, relative_path) + image.save(local_image_path) + FS.put_object_from_local_file(local_image_path, image_path) + + self.data.append({ + 'image_path': image_path, + 'relative_path': relative_path, + 'width': w, + 'height': h, + 'caption': caption, + 'prefix': '', + 'edit_caption': caption, + 'edit_image_path': image_path, + 'edit_relative_path': relative_path, + 'edit_width': w, + 'edit_height': h + }) + + self.set_cursor(len(self.meta['file_list']) - 1) + self.update_dataset() + return True + + def delete_record(self): + if len(self) < 1: + raise gr.Error(self.components_name.delete_err1) + current_file = self.data.pop(self.cursor) + self.set_cursor(self.cursor + 1) + local_file = os.path.join(self.meta['local_work_dir'], + current_file['relative_path']) + try: + os.remove(local_file) + except Exception: + print(f'remove file {local_file} error') + if self.cursor >= len(self.meta['file_list']): + self.set_cursor(0) + if len(self.meta['file_list']) == 0: + self.set_cursor(-1) + self.update_dataset() + + def export_zip(self, export_folder): + self.update_dataset() + zip_path = os.path.join(export_folder, f'{self.dataset_name}.zip') + local_zip, _ = FS.map_to_local(zip_path) + os.makedirs(os.path.dirname(local_zip), exist_ok=True) + res = os.popen( + f"cd '{self.local_work_dir}' && mkdir -p '{self.dataset_name}' " + f"&& cp -rf images '{self.dataset_name}/images' " + f"&& cp -rf train.csv '{self.dataset_name}/train.csv' " + f"&& zip -r '{os.path.abspath(local_zip)}' '{self.dataset_name}'/* " + f"&& rm -rf '{self.dataset_name}'") + print(res.readlines()) + FS.put_object_from_local_file(local_zip, zip_path) + if not FS.exists(zip_path): + raise gr.Error(self.components_name.export_zip_err1) + return local_zip diff --git a/scepter/studio/self_train/scripts/run_task.py b/scepter/studio/self_train/scripts/run_task.py index 20bc89f..c00b279 100644 --- a/scepter/studio/self_train/scripts/run_task.py +++ b/scepter/studio/self_train/scripts/run_task.py @@ -6,7 +6,6 @@ import os import cv2 import numpy as np import torch - from scepter.modules.solver.hooks.checkpoint import CheckpointHook from scepter.modules.solver.hooks.data_probe import ProbeDataHook from scepter.modules.solver.registry import SOLVERS diff --git a/scepter/studio/self_train/scripts/trainer.py b/scepter/studio/self_train/scripts/trainer.py index e6948ce..7680254 100644 --- a/scepter/studio/self_train/scripts/trainer.py +++ b/scepter/studio/self_train/scripts/trainer.py @@ -8,7 +8,6 @@ import time import psutil import torch - from scepter.modules.utils.file_system import FS from scepter.modules.utils.logger import as_time @@ -25,9 +24,9 @@ class TaskStatus(): @property def error_msg(self): if os.path.exists(self.error_log): - return "\n".join(open(self.error_log, "r").readlines()[-50:]) + return '\n'.join(open(self.error_log, 'r').readlines()[-50:]) else: - return "No error msg." + return 'No error msg.' def kill_job(pid): @@ -52,9 +51,9 @@ class Trainer(): def __call__(self, task_name): torch.cuda.empty_cache() - error_folder = "./error_logs" + error_folder = './error_logs' os.makedirs(error_folder, exist_ok=True) - self.status_message.error_log = f"{error_folder}/{int(time.time())}.log" + self.status_message.error_log = f'{error_folder}/{int(time.time())}.log' cmd = f'PYTHONPATH=. python {self.run_script} ' \ f'--cfg={task_name}/train.yaml 2> {self.status_message.error_log}' # cmd = [f"python {self.run_script}"] diff --git a/scepter/studio/self_train/self_train.py b/scepter/studio/self_train/self_train.py index d2d4727..e16a512 100644 --- a/scepter/studio/self_train/self_train.py +++ b/scepter/studio/self_train/self_train.py @@ -3,7 +3,6 @@ import os import gradio as gr - import scepter from scepter.modules.utils.config import Config from scepter.modules.utils.file_system import FS diff --git a/scepter/studio/self_train/self_train_ui/component_names.py b/scepter/studio/self_train/self_train_ui/component_names.py index 7c27e32..7b34118 100644 --- a/scepter/studio/self_train/self_train_ui/component_names.py +++ b/scepter/studio/self_train/self_train_ui/component_names.py @@ -71,54 +71,73 @@ class ModelUIName(): class TrainerUIName(): def __init__(self, language='en'): + self.task_choices = ['Text2Image', 'Image Editing'] + self.data_task_map = { + 'scepter_txt2img': None, + 'scepter_img2img': 'edit' + } 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. + - Data: Data preparation is done through the Data Manager. (zip example: [3D](https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=datasets/3D_example_csv.zip)) - Parameters: You can try modifying the related parameters. - Training: Click on [Start Training]. - - Testing: After completing the training, click [Go to inference ]. + - 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://www.modelscope.cn/api/v1/models/iic/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.data_source_choices = [ + 'Dataset zip', 'MaaS Dataset', 'Dataset Management' + ] + self.data_source_value = 'Dataset zip' + self.data_source_name = 'Data Source' + self.data_type_map = { + 'scepter_txt2img': 'Text2Image Generation', + 'scepter_img2img': 'Image Edit Generation' + } + self.data_type_choices = list(self.data_type_map.keys()) + self.data_type_value = 'scepter_txt2img' + self.data_type_name = 'Data Type' self.ori_data_name = 'Data Name' - self.ms_data_name_place_hold = 'Supports MaaS dataset/local/HTTP Zip package' + # Supports MaaS dataset/local/HTTP Zip package + self.ms_data_name_place_hold = 'Please use Dataset Management.' self.ms_data_space = 'ModelScope Space' self.ms_data_subname = 'MaaS Dataset - Subset' + self.task = 'Eval Editing Image' + self.eval_data = 'Evaluation Data' + self.train_data = 'Training Data' + self.eval_prompts = 'Eval Prompts' + self.eval_image = 'Eval Image' self.training_block = 'Training Parameters' self.base_model = 'Base Model' self.tuner_name = 'Tuner Method' self.base_model_revision = 'Model Version Number' - self.resolution_height = 'Resolution Height' - self.resolution_width = 'Resolution Width' + self.resolution_height = 'Train Image Height' + self.resolution_width = 'Train Image Width' self.resolution_height_max = 'Resolution Height Max' self.resolution_width_max = 'Resolution Width Max' - self.train_epoch = 'Number of Training Epochs' + self.train_epoch = 'Total Training Epochs' self.learning_rate = 'Learning Rate' - self.save_interval = 'Save Interval' + self.save_interval = 'Checkpoint Save Interval (Epochs)' 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.training_button = 'Start Training' - self.eval_prompts = 'Eval Prompts' self.tuner_param = 'Tuner Parameters' self.enable_resolution_bucket = 'Enable Resolution Bucket' + self.enable_resolution_bucket_ins = 'Automatically Pack Multi-Resolution Batches' self.resolution_param = 'Resolution Parameters' self.min_bucket_resolution = 'Min Bucket Resolution' self.max_bucket_resolution = 'Max Bucket Resolution' self.bucket_resolution_steps = 'Bucket Resolution Steps' self.bucket_no_upscale = 'Bucket No Upscale' + self.bucket_no_upscale_ins = 'Disable Automatic Image Upscaling' # Error or Warning self.training_err1 = 'CUDA is unavailable.' self.training_err2 = 'Currently insufficient VRAM, training failed!' @@ -130,45 +149,57 @@ class TrainerUIName(): elif language == 'zh': self.user_direction = ''' ### 使用说明 - - 数据: 选择Example的模版数据或可以按照样例中dog.zip包的格式准备自定义数据进行上传 + - 数据: 通过数据管理器进行数据的准备(ZIP样例:[3D](https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=datasets/3D_example_csv.zip)) - 参数: 可尝试进行相关参数的修改 - 训练: 点击【开始训练】 - 测试: 完成训练后点击【使用模型】 - 注意:超时可能导致连接断开(出现Error),可以等差不多可能训完后,刷新界面再点击页面最后的[刷新模型],即可在[产出模型名称中]出现已经完成训练的模型,若不存在则没有完成训练或训练失败 - - ZIP样例:https://www.modelscope.cn/api/v1/models/iic/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.data_source_choices = ['数据集zip', 'MaaS数据集', '数据管理器'] + self.data_source_value = '数据集zip' + self.data_source_name = '数据集来源' + self.data_type_map = { + 'scepter_txt2img': '文生图数据', + 'scepter_img2img': '图像编辑(图生图)数据' + } + self.data_type_choices = list(self.data_type_map.keys()) + self.data_type_value = 'scepter_txt2img' + self.data_type_name = '数据类型' self.ori_data_name = '数据集名称' - self.ms_data_name_place_hold = '支持MaaS数据集/本地/Http Zip包' + self.ms_data_name_place_hold = '请使用数据管理器导入' # '支持MaaS数据集/本地/Http Zip包' self.ms_data_space = 'ModelScope 空间' self.ms_data_subname = 'MaaS数据集-子集' + self.task = '任务' + self.eval_data = '评测数据' + self.train_data = '训练数据' + self.eval_prompts = '评测文本' + self.eval_image = '评测图片' self.training_block = '训练参数' self.base_model = '基础模型' self.tuner_name = '微调方法' self.base_model_revision = '模型版本号' - self.resolution_height = '训练高度' - self.resolution_width = '训练宽度' + self.resolution_height = '训练图片高度' + self.resolution_width = '训练图片宽度' self.resolution_height_max = '最大训练高度' self.resolution_width_max = '最大训练宽度' - self.train_epoch = '训练轮数' + self.train_epoch = '总训练轮数' self.learning_rate = '学习率' - self.save_interval = '存储间隔' - self.train_batch_size = '训练批次' + self.save_interval = '中间结果存储间隔(轮数)' + self.train_batch_size = '每批次数据条数(Batch Size)' self.prompt_prefix = '前缀' self.replace_keywords = '触发关键词' self.work_name = '保存模型名称(刷新获得随机值)' self.push_to_hub = '推送魔搭社区' - self.eval_prompts = '评测文本' self.tuner_param = '微调参数' self.enable_resolution_bucket = '开启分辨率分桶' + self.enable_resolution_bucket_ins = '自动组装多分辨率Batch' self.resolution_param = '分辨率参数' self.min_bucket_resolution = '最小分桶分辨率' self.max_bucket_resolution = '最大分桶分辨率' self.bucket_resolution_steps = '分桶分辨率步长' self.bucket_no_upscale = '分桶分辨率不做放大' + self.bucket_no_upscale_ins = '禁止图片分辨率上采样' # Error or Warning self.training_err1 = 'CUDA不可用.' self.training_err2 = '目前显存不足,训练失败!' diff --git a/scepter/studio/self_train/self_train_ui/model_ui.py b/scepter/studio/self_train/self_train_ui/model_ui.py index a37e158..0852661 100644 --- a/scepter/studio/self_train/self_train_ui/model_ui.py +++ b/scepter/studio/self_train/self_train_ui/model_ui.py @@ -6,9 +6,9 @@ import os import queue import time -import gradio as gr import yaml +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 ModelUIName @@ -422,11 +422,20 @@ class ModelUI(UIBase): manager.inference.tuner_ui.name_level_tuners[base_model][ output_model] = tuner_cfg + if tuner_cfg.BASE_MODEL == 'EDIT': + selected_tab = 'stylebooth_ui' + checkboxes = [ + '使用微调', 'StyleBooth' + ] if self.language == 'zh' else ['Use Tuners', 'StyleBooth'] + else: + selected_tab = 'tuner_ui' + checkboxes = ['使用微调' + ] if self.language == 'zh' else ['Use Tuners'] + return ( gr.Tabs(selected='inference'), cfg_file, - gr.Tabs(selected='tuner_ui'), - gr.CheckboxGroup( - value='使用微调' if self.language == 'zh' else 'Use Tuners'), + gr.Tabs(selected=selected_tab), + gr.CheckboxGroup(value=checkboxes), gr.Dropdown(value=diffusion_model), gr.Dropdown(choices=tunner_choices, value=tunner_default) # gr.Text(value=tuner_cfg.get('TUNER_TYPE', '')), diff --git a/scepter/studio/self_train/self_train_ui/trainer_ui.py b/scepter/studio/self_train/self_train_ui/trainer_ui.py index 0aaa2d1..f9488cd 100644 --- a/scepter/studio/self_train/self_train_ui/trainer_ui.py +++ b/scepter/studio/self_train/self_train_ui/trainer_ui.py @@ -8,10 +8,10 @@ import random from collections import OrderedDict import gradio as gr -import torch import yaml import scepter +import torch from scepter.modules.utils.file_system import FS from scepter.studio.self_train.scripts.trainer import TrainManager from scepter.studio.self_train.self_train_ui.component_names import \ @@ -100,58 +100,98 @@ class TrainerUI(UIBase): def create_ui(self): with gr.Box(): with gr.Row(variant='panel', equal_height=True): - with gr.Column(variant='panel'): + with gr.Column(scale=1, min_width=0, 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.ori_data_name = gr.Textbox( - label=self.component_names.ori_data_name, - max_lines=1, - placeholder=self.component_names.ori_data_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.train_data) + self.data_source = gr.Dropdown( + choices=self.component_names.data_source_choices, + value=self.component_names.data_source_value, + label=self.component_names.data_source_name, + placeholder=self.component_names.data_source_name, + interactive=False) + self.data_type = gr.Dropdown( + choices=[ + self.component_names.data_type_map[key] + for key in self.component_names.data_type_choices + ], + value=self.component_names.data_type_map[ + self.component_names.data_type_value], + label=self.component_names.data_type_name, + placeholder=self.component_names.data_type_name, + interactive=False) + self.ori_data_name = gr.Textbox( + label=self.component_names.ori_data_name, + max_lines=1, + placeholder=self.component_names.ori_data_name, + interactive=False) + self.ms_data_name = gr.Textbox( + label=' or '.join( + self.component_names.data_source_choices), + max_lines=1, + placeholder=self.component_names. + ms_data_name_place_hold, + visible=False, + interactive=False) + 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.Box(): + gr.Markdown(self.component_names.eval_data) + self.eval_prompts = gr.Dropdown( + value=None, + choices=self.train_para_data.get( + 'EVAL_PROMPTS', []), + label=self.component_names.eval_prompts, + interactive=True, + multiselect=True, + allow_custom_value=True, + max_choices=20) + # self.task = gr.Radio( + # choices=self.component_names.task_choices, + # label=self.component_names.task, + # value=self.component_names.task_choices[0], + # interactive=False) + self.eval_image = gr.Image( + label=self.component_names.eval_image, + type='pil', + tool='editor', + interactive=False, + visible=False) + with gr.Column(scale=2, min_width=0, 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.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.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) + 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.Box(): + gr.Markdown(self.component_names.tuner_param) + # with gr.Column(scale=1, min_width=0): + if 'TUNER' in self.para_data: + lora_visible, text_lora_visible, sce_visible = judge_tuner_visible( + self.para_data['TUNER']) + else: + lora_visible, text_lora_visible, sce_visible = False, False, False + with gr.Row(): self.tuner_name = gr.Dropdown( choices=self.para_data.get( 'tuner_choices', []), @@ -159,18 +199,8 @@ class TrainerUI(UIBase): 'tuner_default', ''), label=self.component_names.tuner_name, interactive=True) - - with gr.Row(): - with gr.Accordion( - label=self.component_names.tuner_param, - open=False): - if 'TUNER' in self.para_data: - lora_visible, text_lora_visible, sce_visible = judge_tuner_visible( - self.para_data['TUNER']) - else: - lora_visible, text_lora_visible, sce_visible = False, False, False - with gr.Row(visible=lora_visible - ) as self.lora_param: + with gr.Row(): + with gr.Row(visible=lora_visible) as self.lora_param: self.lora_alpha = gr.Number( label='LoRA Alpha', value=self.para_data.get( @@ -181,8 +211,7 @@ class TrainerUI(UIBase): value=self.para_data.get( 'lora_rank', 256), interactive=True) - with gr.Row(visible=text_lora_visible - ) as self.text_lora_param: + with gr.Row(visible=text_lora_visible) as self.text_lora_param: self.text_lora_alpha = gr.Number( label='Text LoRA Alpha', value=self.para_data.get( @@ -193,19 +222,18 @@ class TrainerUI(UIBase): value=self.para_data.get( 'text_lora_rank', 256), interactive=True) - with gr.Row( - visible=sce_visible) as self.sce_param: - self.sce_ratio = gr.Slider( - label='SCE Ratio', - minimum=0.2, - maximum=2.0, - step=0.1, - value=self.para_data.get( - 'sce_ratio', 1.0), - interactive=True) - - with gr.Row(): - with gr.Column(scale=2, min_width=0): + self.sce_ratio = gr.Slider( + label='SCE Ratio', + minimum=0.2, + maximum=2.0, + step=0.1, + value=self.para_data.get( + 'sce_ratio', 1.0), + interactive=True, + visible=sce_visible) + with gr.Box(): + gr.Markdown(self.component_names.resolution_param) + with gr.Row(equal_height=True): self.resolution_height = gr.Dropdown( choices=list(self.h_level_dict.keys()), value=self.para_data.get( @@ -214,8 +242,6 @@ class TrainerUI(UIBase): resolution_height, allow_custom_value=True, interactive=True) - - with gr.Column(scale=2, min_width=0): self.resolution_width = gr.Dropdown( choices=self.h_level_dict[ self.resolution_height.value], @@ -225,102 +251,79 @@ class TrainerUI(UIBase): resolution_width, allow_custom_value=True, interactive=True) - - with gr.Row(): - with gr.Accordion(label=self.component_names. - resolution_param, - open=False): - self.enable_resolution_bucket = gr.Checkbox( - value=False, - container=True, - interactive=True, - label=self.component_names. - enable_resolution_bucket) - with gr.Column( - visible=self.enable_resolution_bucket. + with gr.Box(): + self.enable_resolution_bucket = gr.Checkbox( + value=False, + container=True, + interactive=True, + label=self.component_names.enable_resolution_bucket, + info=self.component_names.enable_resolution_bucket_ins) + with gr.Column(visible=self.enable_resolution_bucket. value) as self.resolution_bucket_param: - with gr.Row(): - self.min_bucket_resolution = gr.Number( - label=self.component_names. - min_bucket_resolution, - value=self.para_data.get( - 'min_bucket_resolution', 256), - interactive=True) - self.max_bucket_resolution = gr.Number( - label=self.component_names. - max_bucket_resolution, - value=self.para_data.get( - 'max_bucket_resolution', 1024), - interactive=True) - with gr.Row(): - self.bucket_resolution_steps = gr.Number( - label=self.component_names. - bucket_resolution_steps, - value=self.para_data.get( - 'bucket_resolution_steps', 64), - interactive=True) + with gr.Row(): + self.min_bucket_resolution = gr.Number( + label=self.component_names. + min_bucket_resolution, + value=self.para_data.get( + 'min_bucket_resolution', 256), + interactive=True) + self.max_bucket_resolution = gr.Number( + label=self.component_names. + max_bucket_resolution, + value=self.para_data.get( + 'max_bucket_resolution', 1024), + interactive=True) + with gr.Row(equal_height=True): + self.bucket_resolution_steps = gr.Number( + label=self.component_names. + bucket_resolution_steps, + value=self.para_data.get( + 'bucket_resolution_steps', 64), + interactive=True) + with gr.Box(): self.bucket_no_upscale = gr.Checkbox( value=False, container=True, interactive=True, - label=self.component_names. - bucket_no_upscale) + label=self.component_names.bucket_no_upscale, + info=self.component_names.bucket_no_upscale_ins) 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) + self.train_epoch = gr.Number( + label=self.component_names.train_epoch, + value=self.para_data.get('EPOCHS', 10), + precision=0, + interactive=True) + 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) + self.save_interval = gr.Number( + label=self.component_names.save_interval, + value=self.para_data.get( + 'SAVE_INTERVAL', 10), + precision=0, + interactive=True) + 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=1, min_width=0): - self.eval_prompts = gr.Dropdown( - value=None, - choices=self.train_para_data.get( - 'EVAL_PROMPTS', []), - label=self.component_names.eval_prompts, - interactive=True, - multiselect=True, - allow_custom_value=True, - max_choices=20) - + self.prompt_prefix = gr.Text( + label=self.component_names.prompt_prefix, + value=self.para_data.get( + 'TRAIN_PREFIX', '')) + self.replace_keywords = gr.Text( + label=self.component_names. + replace_keywords, + value='') with gr.Row(variant='panel', equal_height=True): with gr.Box(): with gr.Row(variant='panel', equal_height=True): @@ -345,33 +348,64 @@ class TrainerUI(UIBase): self.examples = gr.Examples( examples=[ [ - self.component_names.data_type_choices[0], + self.component_names.data_source_choices[0], + self.component_names.data_type_map[ + self.component_names.data_type_value], '', 'https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=datasets/3D_example_csv.zip', # noqa + '3D_example_csv', '' ], [ - self.component_names.data_type_choices[1], 'damo', - 'style_custom_dataset', '3D' + self.component_names.data_source_choices[1], + self.component_names.data_type_map[ + self.component_names.data_type_value], 'damo', + 'style_custom_dataset', 'style_custom_dataset', + '3D' ] ], inputs=[ - self.data_type, self.ms_data_space, self.ms_data_name, + self.data_source, self.data_type, self.ms_data_space, + self.ms_data_name, self.ori_data_name, self.ms_data_subname ]) with gr.Row(variant='panel', equal_height=True): self.training_button = gr.Button() + def get_trans_dataset_type(self, dataset_type): + reverse_data_type = { + v: k + for k, v in self.component_names.data_type_map.items() + } + trans_dataset_type = reverse_data_type[dataset_type] + return trans_dataset_type + def set_callbacks(self, inference_ui, manager): - def change_data_type(data_type): - if data_type == self.component_names.data_type_choices[0]: + def change_data_source(data_source): + if data_source in [ + self.component_names.data_source_choices[0], + self.component_names.data_source_choices[2] + ]: return gr.Box(visible=False) - elif data_type == self.component_names.data_type_choices[1]: + elif data_source == self.component_names.data_source_choices[1]: return gr.Box(visible=True) + self.data_source.change(fn=change_data_source, + inputs=[self.data_source], + outputs=[self.ms_data_box], + queue=False) + + def change_data_type(data_type): + data_type_key = self.get_trans_dataset_type(data_type) + if data_type_key in self.component_names.data_task_map and self.component_names.data_task_map[ + data_type_key] is not None: + return self.component_names.data_task_map[data_type_key] + else: + return self.para_data.get('model_default', '') # gr.Dropdown() + self.data_type.change(fn=change_data_type, inputs=[self.data_type], - outputs=[self.ms_data_box], + outputs=[self.base_model], queue=False) self.work_name_button.click(fn=get_work_name, @@ -383,6 +417,16 @@ class TrainerUI(UIBase): outputs=[self.work_name], queue=False) + # def change_eval_image_by_task(task): + # # ret_data.get('EVAL_PROMPTS', eval_prompts) + # visible = True if task == 'Image Editing' else False + # return gr.Image(interactive=visible, visible=visible), \ + # gr.Dropdown(choices=, multiselect=False) + # self.task.change(fn=change_eval_image_by_task, + # inputs=[self.task], + # outputs=[self.eval_image], + # queue=False) + def change_train_value_by_model(base_model): ''' Changes to the base model will affect the training parameters, @@ -397,6 +441,11 @@ class TrainerUI(UIBase): Prefix for Saved Model: ''' ret_data = get_values_by_model(self.BASE_CFG_VALUE, base_model) + task = ret_data.get('TASK', 'Text2Image') + is_edit = task == 'Image Editing' + eval_prompts = [] if is_edit else self.train_para_data.get( + 'EVAL_PROMPTS', []) + eval_prompts = ret_data.get('EVAL_PROMPTS', eval_prompts) return ret_data.get('EPOCHS', 10), \ ret_data.get('LEARNING_RATE', 0.0001), \ ret_data.get('SAVE_INTERVAL', 10), \ @@ -411,19 +460,29 @@ class TrainerUI(UIBase): interactive=True), \ gr.Dropdown(value=ret_data.get('RESOLUTION', 1024)[1], choices=self.h_level_dict[ret_data.get('RESOLUTION', 1024)[0]], - interactive=True) + interactive=True), \ + gr.Image(visible=is_edit, interactive=is_edit, value=None), \ + gr.Dropdown(choices=eval_prompts, multiselect=not is_edit) + # gr.Dropdown(value=task) - 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_height, - self.resolution_width - ], - queue=False) + 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_height, + self.resolution_width, + self.eval_image, + self.eval_prompts, + # self.task + ], + queue=False) # def change_train_value_by_model_version(base_model, @@ -516,7 +575,7 @@ class TrainerUI(UIBase): self.save_interval, self.train_batch_size, self.prompt_prefix, self.resolution_height, self.resolution_width, self.lora_param, - self.text_lora_param, self.sce_param + self.text_lora_param, self.sce_ratio ], queue=False) @@ -552,16 +611,16 @@ class TrainerUI(UIBase): ], queue=False) - def run_train(work_name, data_type, ori_data_name, ms_data_space, - ms_data_name, ms_data_subname, base_model, + def run_train(work_name, data_source, data_type, ori_data_name, + ms_data_space, ms_data_name, ms_data_subname, base_model, base_model_revision, tuner_name, resolution_height, resolution_width, train_epoch, learning_rate, save_interval, train_batch_size, prompt_prefix, - replace_keywords, push_to_hub, eval_prompts, lora_alpha, - lora_rank, text_lora_alpha, text_lora_rank, sce_ratio, - enable_resolution_bucket, min_bucket_resolution, - max_bucket_resolution, bucket_resolution_steps, - bucket_no_upscale): + replace_keywords, push_to_hub, eval_prompts, eval_image, + lora_alpha, lora_rank, text_lora_alpha, text_lora_rank, + sce_ratio, enable_resolution_bucket, + min_bucket_resolution, max_bucket_resolution, + bucket_resolution_steps, bucket_no_upscale): # Check Cuda if not torch.cuda.is_available() and not self.is_debug: raise gr.Error(self.component_names.training_err1) @@ -579,12 +638,14 @@ class TrainerUI(UIBase): with open(f'.flag/{work_name}.tmp', 'w') as f: f.write('new line.') # save params + exclude_keys = ['exclude_keys', 'ms_data_name'] with open(os.path.join(work_dir, 'params.json'), 'w') as f_out: json.dump( { key: val for key, val in locals().items() if is_basic_or_container_type(val) + and key not in exclude_keys }, f_out, ensure_ascii=False) @@ -613,7 +674,7 @@ class TrainerUI(UIBase): int(resolution_height), int(resolution_width) ] - if data_type in self.component_names.data_type_choices: + if data_source in self.component_names.data_source_choices: if ms_data_name.startswith( 'http') or ms_data_name.endswith('zip'): work_data_dir = os.path.join(work_dir, 'data') @@ -724,7 +785,18 @@ class TrainerUI(UIBase): int(resolution_height), int(resolution_width) ] - data_cfg['PROMPT_DATA'] = eval_prompts + if eval_image is not None: + ep = eval_prompts + ep = '' if ep is None else ep + ep = ep[0] if isinstance(ep, list) else ep + + eval_image_path = os.path.join(work_dir, 'eval_image.jpg') + with FS.put_to(eval_image_path) as local_file: + eval_image.save(local_file) + data_cfg['PROMPT_DATA'] = [ep + '#;#' + eval_image_path] + data_cfg['FIELDS'] = ['prompt', 'src_path'] + else: + data_cfg['PROMPT_DATA'] = eval_prompts return data_cfg def prepare_train_config(): @@ -837,15 +909,16 @@ class TrainerUI(UIBase): self.training_button.click( run_train, inputs=[ - self.work_name, self.data_type, self.ori_data_name, - self.ms_data_space, self.ms_data_name, self.ms_data_subname, - self.base_model, self.base_model_revision, self.tuner_name, + self.work_name, self.data_source, self.data_type, + self.ori_data_name, self.ms_data_space, self.ms_data_name, + self.ms_data_subname, self.base_model, + self.base_model_revision, self.tuner_name, self.resolution_height, self.resolution_width, self.train_epoch, self.learning_rate, self.save_interval, self.train_batch_size, self.prompt_prefix, self.replace_keywords, self.push_to_hub, self.eval_prompts, - self.lora_alpha, self.lora_rank, self.text_lora_alpha, - self.text_lora_rank, self.sce_ratio, + self.eval_image, self.lora_alpha, self.lora_rank, + self.text_lora_alpha, self.text_lora_rank, self.sce_ratio, self.enable_resolution_bucket, self.min_bucket_resolution, self.max_bucket_resolution, self.bucket_resolution_steps, self.bucket_no_upscale diff --git a/scepter/studio/tuner_manager/manager_ui/browser_ui.py b/scepter/studio/tuner_manager/manager_ui/browser_ui.py index b0f21bc..271f4d9 100644 --- a/scepter/studio/tuner_manager/manager_ui/browser_ui.py +++ b/scepter/studio/tuner_manager/manager_ui/browser_ui.py @@ -1,28 +1,42 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. import os +import shutil from collections import OrderedDict import gradio as gr -from swift import push_to_hub +from huggingface_hub import HfApi, snapshot_download import scepter from scepter.modules.utils.config import Config from scepter.modules.utils.file_system import FS +from scepter.modules.utils.module_transform import \ + convert_tuner_civitai_to_scepter from scepter.studio.tuner_manager.manager_ui.component_names import \ TunerManagerNames from scepter.studio.tuner_manager.utils.dict import (delete_2level_dict, update_2level_dict) -from scepter.studio.tuner_manager.utils.path import is_valid_filename +from scepter.studio.tuner_manager.utils.path import ( + is_valid_filename, is_valid_huggingface_filename, + is_valid_modelscope_filename) from scepter.studio.tuner_manager.utils.yaml import save_yaml from scepter.studio.utils.uibase import UIBase +from swift import push_to_hub + + +def wget_file(file_url, save_file): + if 'oss' in file_url: + file_url = file_url.split('?')[0] + local_path, _ = FS.map_to_local(save_file) + res = os.popen(f"wget -c '{file_url}' -O '{local_path}'") + res.readlines() + FS.put_object_from_local_file(local_path, save_file) + return save_file, res class BrowserUI(UIBase): def __init__(self, cfg, language='en'): self.work_dir = cfg.WORK_DIR - self.train_dir = cfg.SELF_TRAIN_DIR - self.base_model_tuner_methods = cfg.BASE_MODEL_VERSION self.yaml = os.path.join(self.work_dir, cfg.TUNER_LIST_YAML) if not FS.exists(self.yaml): self.saved_tuners = [] @@ -37,13 +51,22 @@ class BrowserUI(UIBase): self.language = language self.export_folder = os.path.join(self.work_dir, cfg.EXPORT_DIR) self.readme_file = cfg.README_EN if self.language == 'en' else cfg.README_ZH - self.readme_file = os.path.join(os.path.dirname(scepter.dirname), self.readme_file) + self.readme_file = os.path.join(os.path.dirname(scepter.dirname), + self.readme_file) + self.base_model_tuner_methods = cfg.BASE_MODEL_VERSION + self.base_model_tuner_methods_map = {} + for base_model_item in self.base_model_tuner_methods: + self.base_model_tuner_methods_map[ + base_model_item.BASE_MODEL] = base_model_item.TUNER_TYPE def saved_tuners_to_category(self): self.saved_tuners_category = OrderedDict() for tuner in self.saved_tuners: first_level = f"{tuner['BASE_MODEL']}-{tuner['TUNER_TYPE']}" second_level = f"{tuner['NAME']}" + local_tuner_work_dir, _ = FS.map_to_local(tuner['MODEL_PATH']) + if not os.path.exists(local_tuner_work_dir): + FS.get_dir_to_local_dir(tuner['MODEL_PATH']) update_2level_dict(self.saved_tuners_category, {first_level: { second_level: tuner @@ -102,9 +125,9 @@ class BrowserUI(UIBase): elem_classes='type_row', elem_id='delete_button', visible=False) - self.model_upload = gr.Button( - label='ModelScope Upload', - value=self.component_names.upload, + self.model_export = gr.Button( + label='Model Export', + value=self.component_names.model_export, elem_classes='type_row', elem_id='save_button', visible=True) @@ -115,30 +138,32 @@ class BrowserUI(UIBase): elem_classes='type_row', elem_id='refresh_button', visible=True) - self.model_download = gr.Button( - label='ModelScope Download', - value=self.component_names.download, + self.model_import = gr.Button( + label='Model Import', + value=self.component_names.model_import, elem_classes='type_row', elem_id='save_button', visible=True) - with gr.Box(visible=False) as self.upload_setting: + with gr.Box(visible=False) as self.export_setting: gr.Markdown(self.component_names.export_desc) with gr.Column(variant='panel'): with gr.Row(equal_height=True): with gr.Column(scale=9, min_width=0): - self.import_src = gr.Dropdown( - choices=['modelscope'], + self.export_to = gr.Dropdown( + choices=['modelscope', 'huggingface'], value='modelscope', label=None, show_label=False) with gr.Column(scale=1, min_width=0): - self.ms_upload_close = gr.Button( - label='Close MS Upload', + self.export_close = gr.Button( + label='Close Export', value=self.component_names.close, elem_classes='type_row', elem_id='save_button') - with gr.Row(equal_height=True): + + with gr.Row( + equal_height=True) as self.ms_export_setting: with gr.Column(scale=3, min_width=0): self.ms_sdk = gr.Text( label=self.component_names.ms_sdk, @@ -147,39 +172,71 @@ class BrowserUI(UIBase): placeholder='ModelScope SDK Token', value='') with gr.Column(scale=3, min_width=0): - self.ms_upload_username = gr.Text( + self.ms_export_username = gr.Text( label=self.component_names.ms_username, show_label=False, container=False, placeholder='ModelScope UserName', value='') with gr.Column(scale=3, min_width=0): - self.model_private = gr.Checkbox( - label=self.component_names.model_private, + self.ms_model_private = gr.Checkbox( + label=self.component_names. + ms_model_private, value=False) with gr.Column(scale=1, min_width=0): - self.ms_upload_submit = gr.Button( + self.ms_export_submit = gr.Button( label='Submit MS', - value=self.component_names.ms_submit, + value=self.component_names.submit, elem_classes='type_row', elem_id='save_button') - with gr.Box(visible=False) as self.download_setting: + with gr.Row(equal_height=True, + visible=False) as self.hf_export_setting: + with gr.Column(scale=3, min_width=0): + self.hf_sdk = gr.Text( + label=self.component_names.hf_sdk, + show_label=False, + container=False, + placeholder='HuggingFace SDK Token', + value='') + with gr.Column(scale=3, min_width=0): + self.hf_export_username = gr.Text( + label=self.component_names.hf_username, + show_label=False, + container=False, + placeholder='HuggingFace UserName', + value='') + with gr.Column(scale=3, min_width=0): + self.hf_model_private = gr.Checkbox( + label=self.component_names. + hf_model_private, + value=False) + with gr.Column(scale=1, min_width=0): + self.hf_export_submit = gr.Button( + label='Submit HF', + value=self.component_names.submit, + elem_classes='type_row', + elem_id='save_button') + + with gr.Box(visible=False) as self.import_setting: gr.Markdown(self.component_names.import_desc) with gr.Column(variant='panel'): with gr.Row(equal_height=True): with gr.Column(scale=9, min_width=0): - self.import_src = gr.Dropdown( - choices=['modelscope', 'local'], + self.import_from = gr.Dropdown( + choices=[ + 'modelscope', 'huggingface', 'local' + ], value='modelscope', label=None, show_label=False) with gr.Column(scale=1, min_width=0): - self.ms_download_close = gr.Button( - label='Close MS Download', + self.import_close = gr.Button( + label='Close Download', value=self.component_names.close, elem_classes='type_row', elem_id='save_button') + with gr.Row( equal_height=True) as self.ms_import_setting: with gr.Column(scale=4.5, min_width=0): @@ -190,25 +247,62 @@ class BrowserUI(UIBase): placeholder='ModelScope Model Path', value='') with gr.Column(scale=4.5, min_width=0): - self.ms_download_username = gr.Text( + self.ms_import_username = gr.Text( label=self.component_names.ms_username, show_label=False, container=False, placeholder='ModelScope UserName', value='') with gr.Column(scale=1, min_width=0): - self.ms_download_submit = gr.Button( + self.ms_import_submit = gr.Button( label='Submit MS', - value=self.component_names.ms_submit, + value=self.component_names.submit, elem_classes='type_row', elem_id='save_button') + + with gr.Row(equal_height=True, + visible=False) as self.hf_import_setting: + with gr.Column(scale=3, min_width=0): + self.hf_modelid = gr.Text( + label=self.component_names.hf_modelid, + show_label=False, + container=False, + placeholder='HuggingFace Model Path', + value='') + with gr.Column(scale=3, min_width=0): + self.hf_import_username = gr.Text( + label=self.component_names.hf_username, + show_label=False, + container=False, + placeholder='HuggingFace UserName', + value='') + with gr.Column(scale=3, min_width=0): + self.hf_sdk2 = gr.Text( + label=self.component_names.hf_sdk, + show_label=False, + container=False, + placeholder='HuggingFace SDK Token', + value='') + with gr.Column(scale=1, min_width=0): + self.hf_import_submit = gr.Button( + label='Submit HF', + value=self.component_names.submit, + elem_classes='type_row', + elem_id='save_button') + with gr.Row(visible=False, equal_height=True ) as self.local_import_setting: - with gr.Column(scale=2, min_width=0): + with gr.Column(scale=1, min_width=0): self.file_path = gr.File( label=self.component_names.zip_file, min_width=0, - file_types=['.zip'], + file_types=['.zip', '.safetensors'], + elem_classes='upload_zone') + with gr.Column(scale=1, min_width=0): + self.file_url = gr.Text( + label=self.component_names.file_url, + min_width=0, + show_label=True, elem_classes='upload_zone') with gr.Column(scale=1, min_width=0): self.upload_base_models = gr.Dropdown( @@ -240,59 +334,72 @@ class BrowserUI(UIBase): value='') self.local_upload_bt = gr.Button( label='Submit Local Model', - value=self.component_names.ms_submit, + value=self.component_names.submit, elem_classes='type_row', elem_id='upload_button') def check_new_name(self, tuner_name): if tuner_name.strip() == '': - return False, f"'{tuner_name}' is whitespace! Only support 'a-z', 'A-Z', '0-9' and '_'." + return False, f"'{tuner_name}' is whitespace! Only support 'a-z', 'A-Z', '0-9', '@', '.', '-' and '_'." if not is_valid_filename(tuner_name): - return False, f"'{tuner_name}' is not a valid tuner name! Only support 'a-z', 'A-Z', '0-9' and '_'." + return False, ( + f"'{tuner_name}' is not a valid tuner name! " + f"Only support 'a-z', 'A-Z', '0-9', '@', '.', '-' and '_'.") for tuner in self.saved_tuners: if tuner_name == tuner['NAME']: return False, f"Tuner name '{tuner_name}' has been taken!" return True, 'legal' - def save_tuner(self, src_path, sub_dir, tuner_name, tuner_desc, - tuner_example, tuner_prompt_example): + def save_tuner_file_params(self, src_path, sub_dir, tuner_name, tuner_desc, + tuner_example, tuner_prompt_example): tar_path = os.path.join(self.work_dir, sub_dir) if not FS.exists(tar_path): FS.make_dir(tar_path) tar_path = os.path.join(tar_path, tuner_name) - + if FS.exists(tar_path): + raise gr.Error(self.component_names.same_name) + local_model_dir, _ = FS.map_to_local(tar_path) FS.put_dir_from_local_dir(src_path, tar_path) - # save image tuner_example_path = None if tuner_example is not None: from PIL import Image tuner_example_path = os.path.join(tar_path, 'image.jpg') - if not os.path.exists(tuner_example_path): + local_example_path = os.path.join(local_model_dir, 'image.jpg') + if not FS.exists(tuner_example_path): tuner_example = Image.fromarray(tuner_example) - with FS.put_to(tuner_example_path) as local_path: - tuner_example.save(local_path) + tuner_example.save(local_example_path) + FS.put_object_from_local_file(local_example_path, + tuner_example_path) # save param enable_share = True split_path = src_path.split('/') - if split_path[-2] == 'checkpoints': + if len(split_path) > 1 and split_path[-2] == 'checkpoints': src_dir = '/'.join(split_path[:-2]) ckpt_name = split_path[-1] meta_read = f'{src_dir}/meta_{ckpt_name}.yaml' + meta_local = f'{local_model_dir}/params.yaml' meta_save = f'{tar_path}/params.yaml' else: meta_read = f'{src_path}/params.yaml' + meta_local = f'{local_model_dir}/params.yaml' meta_save = f'{tar_path}/params.yaml' if os.path.exists(meta_read): meta = Config(cfg_file=meta_read) - with FS.put_to(meta_save) as local_path: - enable_share = Config.get_plain_cfg(meta.get('IS_SHARE', True)) - params = Config.get_plain_cfg(meta.get('PARAMS', {})) - params['work_dir'] = '' - params['work_name'] = '' - save_yaml({'PARAMS': params}, local_path) + enable_share = Config.get_plain_cfg(meta.get('IS_SHARE', True)) + params = Config.get_plain_cfg(meta.get('PARAMS', {})) + params['work_dir'] = '' + params['work_name'] = '' + save_yaml( + { + 'PARAMS': + params, + 'DESCRIPTION': + tuner_desc if len(tuner_desc) > 0 else tuner_name + }, meta_local) + FS.put_object_from_local_file(meta_local, meta_save) # rewrite readme with open(self.readme_file, 'r') as f: @@ -321,17 +428,81 @@ class BrowserUI(UIBase): meta['PARAMS'].get('data_type', '')) rc = rc.replace(r'{MS_DATA_SPACE}', meta['PARAMS'].get('ms_data_space', '')) - rc = rc.replace(r'{MS_DATA_NAME}', - meta['PARAMS'].get('ms_data_name', '')) + rc = rc.replace( + r'{MS_DATA_NAME}', + meta['PARAMS']['ms_data_name'] if 'ms_data_name' + in meta['PARAMS'] else meta['PARAMS'].get('ori_data_name', '')) rc = rc.replace(r'{MS_DATA_SUBNAME}', meta['PARAMS'].get('ms_data_subname', '')) - - with FS.put_to(os.path.join(tar_path, 'README.md')) as local_path: - with open(local_path, 'w') as f: - f.write(rc) - + local_readme_file = os.path.join(local_model_dir, 'README.md') + with open(local_readme_file, 'w') as f: + f.write(rc) + FS.put_object_from_local_file(local_readme_file, + os.path.join(tar_path, 'README.md')) + # repull to a official dir + # FS.get_dir_to_local_dir(tar_path) return tar_path, tuner_example_path, enable_share + def save_tuner(self, manager, tuner_name, new_name, tuner_desc, + tuner_example, tuner_prompt_example, base_model, + tuner_type): + is_legal, msg = self.check_new_name(new_name) + if not is_legal: + raise gr.Error('Save failed because ' + msg) + + sub_dir = f'{base_model}-{tuner_type}' + if hasattr(manager, 'self_train'): + self_train_work_dir = manager.self_train.trainer_ui.work_dir_pre + else: + self_train_work_dir = self.work_dir + if FS.exists(os.path.join(self_train_work_dir, '@'.join(tuner_name.split('@')[:-1]))) \ + and len(tuner_name.split('@')[:-1]) > 0: + steps = tuner_name.split('@')[-1] + source_dir = os.path.join(self_train_work_dir, + '@'.join(tuner_name.split('@')[:-1]), + 'checkpoints', steps) + else: + source_dir = self.saved_tuners_category.get(sub_dir, {}).get( + tuner_name, {}).get('MODEL_PATH', '') + if source_dir == '': + raise gr.Error(self.component_names.model_err4 + tuner_name) + + model_dir, tuner_example, enable_share = self.save_tuner_file_params( + source_dir, sub_dir, new_name, tuner_desc, tuner_example, + tuner_prompt_example) + # config info update + new_tuner = { + 'NAME': new_name, + 'NAME_ZH': new_name, + 'SOURCE': 'self_train', + 'DESCRIPTION': tuner_desc, + 'BASE_MODEL': base_model, + 'MODEL_PATH': model_dir, + 'TUNER_TYPE': tuner_type, + 'PROMPT_EXAMPLE': tuner_prompt_example, + 'ENABLE_SHARE': enable_share, + } + if tuner_example is not None: + new_tuner.update({'IMAGE_PATH': tuner_example.split('/')[-1]}) + pipeline_level_modules = manager.inference.model_manage_ui.pipe_manager.pipeline_level_modules + if new_tuner['BASE_MODEL'] not in pipeline_level_modules: + raise gr.Error(self.component_names.model_err3 + + new_tuner['BASE_MODEL']) + pipeline_ins = pipeline_level_modules[new_tuner['BASE_MODEL']] + now_diffusion_model = f"{new_tuner['BASE_MODEL']}_{pipeline_ins.diffusion_model['name']}" + + custom_tuner_choices = self.add_tuner(new_tuner, manager, + now_diffusion_model) + + gr.Info('Successfully save tuner model!') + + return (gr.update(choices=list(self.saved_tuners_category.keys()), + value=sub_dir), + gr.update(choices=list( + self.saved_tuners_category.get(sub_dir, {}).keys()), + value=new_name), gr.Text(value=new_name), + gr.Dropdown(choices=custom_tuner_choices)) + def add_tuner(self, new_tuner, manager, now_diffusion_model): self.saved_tuners.append(new_tuner) self.saved_tuners_to_category() @@ -433,90 +604,57 @@ class BrowserUI(UIBase): if tuner_model is None: # fix refresh bug return (gr.Text(), gr.Text(), gr.Text(), gr.Text(), gr.Text(), - gr.Image(), gr.Text(), gr.Text()) + gr.Image(), gr.Text(), gr.Text(), gr.Text()) tuner_info = self.saved_tuners_category[diffusion_model][ tuner_model] + local_model_dir, _ = FS.map_to_local(tuner_info['MODEL_PATH']) image_path = tuner_info.get('IMAGE_PATH', None) if image_path is not None: - image_path = FS.get_from(image_path) + local_image_path = os.path.join(local_model_dir, image_path) + if not FS.exists(local_image_path): + local_image_path = None + else: + local_image_path = None return (gr.Text(value=tuner_info.get('NAME', '')), gr.Text(value=tuner_info.get('NAME', ''), interactive=True), gr.Text(value=tuner_info.get('TUNER_TYPE', '')), gr.Text(value=tuner_info.get('BASE_MODEL', '')), gr.Text(value=tuner_info.get('DESCRIPTION', ''), - interactive=True), gr.Image(value=image_path), + interactive=True), + gr.Image(value=local_image_path), gr.Text(value=tuner_info.get('PROMPT_EXAMPLE', ''), interactive=True), gr.Text(value=tuner_info.get('MODELSCOPE_URL', ''), + interactive=False), + gr.Text(value=tuner_info.get('HUGGINGFACE_URL', ''), interactive=False)) self.tuner_models.change( tuner_model_change, inputs=[self.tuner_models, self.diffusion_models], outputs=[ - info_ui.tuner_name, info_ui.new_name, info_ui.tuner_type, - info_ui.base_model, info_ui.tuner_desc, info_ui.tuner_example, - info_ui.tuner_prompt_example, info_ui.ms_url + info_ui.tuner_name, + info_ui.new_name, + info_ui.tuner_type, + info_ui.base_model, + info_ui.tuner_desc, + info_ui.tuner_example, + info_ui.tuner_prompt_example, + info_ui.ms_url, + info_ui.hf_url, ], queue=False) - def save_tuner(tuner_name, new_name, tuner_desc, tuner_example, - tuner_prompt_example, base_model, tuner_type): - is_legal, msg = self.check_new_name(new_name) - if not is_legal: - gr.Info('Save failed because ' + msg) - return (gr.Dropdown(), gr.Dropdown(), gr.Text(), gr.Dropdown()) - - sub_dir = f'{base_model}-{tuner_type}' - if os.path.exists(os.path.join(self.train_dir, '@'.join(tuner_name.split('@')[:-1]))) \ - and len(tuner_name.split('@')[:-1]) > 0: - steps = tuner_name.split('@')[-1] - model_dir = os.path.join(self.train_dir, - '@'.join(tuner_name.split('@')[:-1]), - 'checkpoints', steps) - else: - model_dir = self.saved_tuners_category.get(sub_dir, {}).get( - tuner_name, {}).get('MODEL_PATH', '') - if model_dir == '': - gr.Error(self.component_names.model_err4 + tuner_name) - - model_dir, tuner_example, enable_share = self.save_tuner( - model_dir, sub_dir, new_name, tuner_desc, tuner_example, - tuner_prompt_example) - # config info update - new_tuner = { - 'NAME': new_name, - 'NAME_ZH': new_name, - 'SOURCE': 'self_train', - 'DESCRIPTION': tuner_desc, - 'BASE_MODEL': base_model, - 'MODEL_PATH': model_dir, - 'IMAGE_PATH': tuner_example, - 'TUNER_TYPE': tuner_type, - 'PROMPT_EXAMPLE': tuner_prompt_example, - 'ENABLE_SHARE': enable_share, - } - pipeline_level_modules = manager.inference.model_manage_ui.pipe_manager.pipeline_level_modules - if new_tuner['BASE_MODEL'] not in pipeline_level_modules: - gr.Error(self.component_names.model_err3 + - new_tuner['BASE_MODEL']) - pipeline_ins = pipeline_level_modules[new_tuner['BASE_MODEL']] - now_diffusion_model = f"{new_tuner['BASE_MODEL']}_{pipeline_ins.diffusion_model['name']}" - - custom_tuner_choices = self.add_tuner(new_tuner, manager, - now_diffusion_model) - - return (gr.update(choices=list(self.saved_tuners_category.keys()), - value=sub_dir), - gr.update(choices=list( - self.saved_tuners_category.get(sub_dir, {}).keys()), - value=new_name), gr.Text(value=new_name), - gr.Dropdown(choices=custom_tuner_choices)) + def save_tuner_func(tuner_name, new_name, tuner_desc, tuner_example, + tuner_prompt_example, base_model, tuner_type): + return self.save_tuner(manager, tuner_name, new_name, tuner_desc, + tuner_example, tuner_prompt_example, + base_model, tuner_type) self.save_button.click( - save_tuner, + save_tuner_func, inputs=[ info_ui.tuner_name, info_ui.new_name, info_ui.tuner_desc, info_ui.tuner_example, info_ui.tuner_prompt_example, @@ -554,67 +692,144 @@ class BrowserUI(UIBase): def change_visible(): return gr.update(visible=True), gr.update(visible=False) - self.model_upload.click( + self.model_export.click( fn=change_visible, inputs=[], - outputs=[self.upload_setting, self.download_setting], - queue=False) - self.model_download.click( - fn=change_visible, - inputs=[], - outputs=[self.download_setting, self.upload_setting], + outputs=[self.export_setting, self.import_setting], queue=False) + def change_visible_load_base_model_tuner(): + base_versions = list(self.base_model_tuner_methods_map.keys()) + default_version = base_versions[0] + default_tuner_type_choices = self.base_model_tuner_methods_map[ + default_version] + default_tuner_type = default_tuner_type_choices[0] + + return gr.update(visible=True), gr.update(visible=False), \ + gr.Dropdown( + label=self.component_names.ubase_model, + choices=base_versions, + value=default_version, + multiselect=False, + interactive=True), \ + gr.Dropdown( + label=self.component_names.utuner_type, + choices=default_tuner_type_choices, + value=default_tuner_type, + multiselect=False, + interactive=True + ) + + self.model_import.click(fn=change_visible_load_base_model_tuner, + inputs=[], + outputs=[ + self.import_setting, self.export_setting, + self.upload_base_models, + self.upload_tuner_type + ], + queue=False) + def change_invisible(): return gr.update(visible=False) - self.ms_upload_close.click(fn=change_invisible, - inputs=[], - outputs=[self.upload_setting], - queue=False) - self.ms_download_close.click(fn=change_invisible, - inputs=[], - outputs=[self.download_setting], - queue=False) + self.export_close.click(fn=change_invisible, + inputs=[], + outputs=[self.export_setting], + queue=False) + self.import_close.click(fn=change_invisible, + inputs=[], + outputs=[self.import_setting], + queue=False) - def change_import_source(import_src): - if import_src == 'modelscope': + def change_export_source(export_to): + if export_to == 'modelscope': ms_visible = True - local_visible = False - elif import_src == 'local': + hf_visible = False + elif export_to == 'huggingface': + hf_visible = True ms_visible = False + + return gr.update(visible=ms_visible), gr.update(visible=hf_visible) + + self.export_to.change( + fn=change_export_source, + inputs=[self.export_to], + outputs=[self.ms_export_setting, self.hf_export_setting], + queue=False) + + def change_import_source(import_from): + if import_from == 'modelscope': + ms_visible = True + hf_visible = False + local_visible = False + elif import_from == 'huggingface': + ms_visible = False + hf_visible = True + local_visible = False + elif import_from == 'local': + ms_visible = False + hf_visible = False local_visible = True return gr.update(visible=ms_visible), gr.update( - visible=local_visible) + visible=hf_visible), gr.update(visible=local_visible) - self.import_src.change( - fn=change_import_source, - inputs=[self.import_src], - outputs=[self.ms_import_setting, self.local_import_setting], - queue=False) + self.import_from.change(fn=change_import_source, + inputs=[self.import_from], + outputs=[ + self.ms_import_setting, + self.hf_import_setting, + self.local_import_setting + ], + queue=False) def push_to_modelscope(ms_sdk, username, private, base_model_name, tuner_model_name): + gr.Info('Start uploading tuner model to ModelScope!') + if (isinstance(base_model_name, list) and len(base_model_name) == 0 + ) or (isinstance(tuner_model_name, list) + and len(tuner_model_name) + == 0) or tuner_model_name is None or ( + base_model_name not in self.saved_tuners_category + and tuner_model_name + not in self.saved_tuners_category[base_model_name]): + raise gr.Error( + 'Please save model first or select a valid base model name.' + ) tuner = self.saved_tuners_category[base_model_name][ tuner_model_name] enable_share = tuner.get('ENABLE_SHARE', True) if enable_share: + if not is_valid_modelscope_filename(tuner_model_name): + raise gr.Error( + f"'{tuner_model_name}' is not a valid tuner name for modelscope! " + f"Only support 'a-z', 'A-Z', '0-9', '-' and '_'. Please rename it." + ) repo_name = f'{username}/{tuner_model_name}' ckpt_path = tuner['MODEL_PATH'] ms_url = f'https://www.modelscope.cn/models/{repo_name}' - - with open(os.path.join(ckpt_path, 'README.md'), 'r') as f: - rc = f.read() - rc = rc.replace(r'{MODEL_URL}', ms_url) - rc = rc.replace(r'{USER_NAME}', username) - with open(os.path.join(ckpt_path, 'README.md'), 'w') as f: - f.write(rc) + local_ckpt_path, _ = FS.map_to_local(ckpt_path) + local_readme = os.path.join(local_ckpt_path, 'README.md') + if FS.exists(local_readme): + with open(local_readme, 'r') as f: + rc = f.read() + rc = rc.replace(r'{MODEL_URL}', ms_url) + rc = rc.replace(r'{USER_NAME}', username) + with open(local_readme, 'w') as f: + f.write(rc) + local_configuration = os.path.join(local_ckpt_path, + 'configuration.json') + if not FS.exists(local_configuration): + with open(local_configuration, 'w') as f: + f.write('{}') push_status = push_to_hub(repo_name, - ckpt_path, + local_ckpt_path, token=ms_sdk, private=private) + if FS.exists(local_readme): + FS.put_object_from_local_file( + local_readme, os.path.join(ckpt_path, 'README.md')) if push_status: update_items = {'MODELSCOPE_URL': ms_url} self.update_tuner_info(base_model_name, tuner_model_name, @@ -622,59 +837,69 @@ class BrowserUI(UIBase): gr.Info( 'The tuner model has been uploaded to ModelScope Successfully!' ) - return update_items['MODELSCOPE_URL'] + return update_items['MODELSCOPE_URL'], gr.update( + visible=False) else: - gr.Info( + raise gr.Error( 'Error: The model failed to be uploaded to ModelScope!' ) - return '' else: - gr.Info( + raise gr.Error( 'Error: The model is not allowed to be shared to ModelScope!' ) - return '' - self.ms_upload_submit.click(fn=push_to_modelscope, - inputs=[ - self.ms_sdk, self.ms_upload_username, - self.model_private, - self.diffusion_models, - self.tuner_models - ], - outputs=[info_ui.ms_url], - queue=True) + self.ms_export_submit.click( + fn=push_to_modelscope, + inputs=[ + self.ms_sdk, self.ms_export_username, self.ms_model_private, + self.diffusion_models, self.tuner_models + ], + outputs=[info_ui.ms_url, self.export_setting], + queue=True) def pull_from_modelscope(modelid, username): - tar_path = os.path.join(self.work_dir, 'modelscope') + gr.Info('Start pulling tuner model from ModelScope to Local!') src_path = f'ms://{username}/{modelid}' - FS.get_dir_to_local_dir(src_path, tar_path) + local_work_dir, _ = FS.map_to_local(src_path) + FS.get_dir_to_local_dir(src_path, local_work_dir) + gr.Info( 'The tuner model has been downloaded from ModelScope Successfully!' ) - tar_path = f'{tar_path}/{username}/{modelid}' - meta_file = f'{tar_path}/params.yaml' + # + meta_file = f'{local_work_dir}/{username}/{modelid}/params.yaml' meta = Config(cfg_file=meta_file) base_model = meta['PARAMS']['base_model_revision'] tuner_type = meta['PARAMS']['tuner_name'] - tuner_prompt_example = meta['PARAMS']['eval_prompts'][0] + tuner_prompt_example = meta['PARAMS']['eval_prompts'] + if isinstance(tuner_prompt_example, list): + tuner_prompt_example = tuner_prompt_example[0] tuner_category = f'{base_model}-{tuner_type}' new_name = f'modelscope@{username}@{modelid}' + tar_path = os.path.join( + self.work_dir, + f'{tuner_category}/modelscope_{username}_{modelid}') + FS.put_dir_from_local_dir(f'{local_work_dir}/{username}/{modelid}', + tar_path) + if os.path.exists(local_work_dir): + shutil.rmtree(local_work_dir) + new_tuner = { 'NAME': new_name, 'NAME_ZH': new_name, 'SOURCE': 'modelscope', - 'DESCRIPTION': '', + 'DESCRIPTION': meta.get('DESCRIPTION', ''), 'BASE_MODEL': base_model, 'MODEL_PATH': tar_path, - 'IMAGE_PATH': f'{tar_path}/image.jpg', + 'IMAGE_PATH': 'image.jpg', 'TUNER_TYPE': tuner_type, 'PROMPT_EXAMPLE': tuner_prompt_example } pipeline_level_modules = manager.inference.model_manage_ui.pipe_manager.pipeline_level_modules if new_tuner['BASE_MODEL'] not in pipeline_level_modules: - gr.Error(self.component_names.model_err3 + - new_tuner['BASE_MODEL']) + raise gr.Error(self.component_names.model_err3 + + new_tuner['BASE_MODEL']) pipeline_ins = pipeline_level_modules[new_tuner['BASE_MODEL']] now_diffusion_model = f"{new_tuner['BASE_MODEL']}_{pipeline_ins.diffusion_model['name']}" @@ -695,26 +920,192 @@ class BrowserUI(UIBase): self.saved_tuners_category.get(tuner_category, {}).keys()), value=new_name), gr.Text(value=new_name), - gr.Dropdown(choices=custom_tuner_choices)) + gr.Dropdown(choices=custom_tuner_choices), + gr.update(visible=False)) - self.ms_download_submit.click( + self.ms_import_submit.click( fn=pull_from_modelscope, inputs=[ self.ms_modelid, - self.ms_download_username, + self.ms_import_username, ], outputs=[ self.diffusion_models, self.tuner_models, info_ui.tuner_name, - manager.inference.tuner_ui.custom_tuner_model + manager.inference.tuner_ui.custom_tuner_model, + self.import_setting + ], + queue=True) + + def push_to_huggingface(sdk, username, private, base_model_name, + tuner_model_name): + gr.Info('Start uploading tuner model to HuggingFace!') + if (isinstance(base_model_name, list) and len(base_model_name) == 0 + ) or (isinstance(tuner_model_name, list) + and len(tuner_model_name) + == 0) or tuner_model_name is None or ( + base_model_name not in self.saved_tuners_category + and tuner_model_name + not in self.saved_tuners_category[base_model_name]): + raise gr.Error( + 'Please save model first or select a valid base model name.' + ) + tuner = self.saved_tuners_category[base_model_name][ + tuner_model_name] + + enable_share = tuner.get('ENABLE_SHARE', True) + if enable_share: + if not is_valid_huggingface_filename(tuner_model_name): + raise gr.Error( + f"'{tuner_model_name}' is not a valid tuner name for huggingface! " + f"Only support 'a-z', 'A-Z', '0-9', '-' and '_'. Please rename it." + ) + repo_name = f'{username}/{tuner_model_name}' + ckpt_path = tuner['MODEL_PATH'] + hf_url = f'https://huggingface.co/{repo_name}' + + local_readme = os.path.join(ckpt_path, 'README.md') + if FS.exists(local_readme): + with open(local_readme, 'r') as f: + rc = f.read() + rc = rc.replace(r'{MODEL_URL}', hf_url) + rc = rc.replace(r'{USER_NAME}', username) + with open(local_readme, 'w') as f: + f.write(rc) + local_configuration = os.path.join(ckpt_path, + 'configuration.json') + if not FS.exists(local_configuration): + with open(local_configuration, 'w') as f: + f.write('{}') + + api = HfApi(token=sdk) + api.create_repo(repo_id=repo_name, + private=private, + exist_ok=True) + commit_info = api.upload_folder(folder_path=ckpt_path, + repo_id=repo_name, + repo_type='model', + commit_message='') + if commit_info: + update_items = {'HUGGINGFACE_URL': hf_url} + self.update_tuner_info(base_model_name, tuner_model_name, + update_items) + gr.Info( + 'The tuner model has been uploaded to HuggingFace Successfully!' + ) + return update_items['HUGGINGFACE_URL'], gr.update( + visible=False) + else: + raise gr.Error( + 'Error: The model failed to be uploaded to HuggingFace!' + ) + else: + raise gr.Error( + 'Error: The model is not allowed to be shared to HuggingFace!' + ) + + self.hf_export_submit.click( + fn=push_to_huggingface, + inputs=[ + self.hf_sdk, self.hf_export_username, self.hf_model_private, + self.diffusion_models, self.tuner_models + ], + outputs=[info_ui.hf_url, self.export_setting], + queue=True) + + def pull_from_huggingface(modelid, username, hf_sdk): + gr.Info('Start pulling tuner model from HuggingFace to Local!') + src_path = f'{username}/{modelid}' + + local_tar_path = f'cache/temp_dir/{src_path}' + snapshot_download(repo_id=src_path, + repo_type='model', + local_dir=local_tar_path, + local_dir_use_symlinks=False, + token=hf_sdk if len(hf_sdk) > 0 else None) + + meta_file = f'{local_tar_path}/params.yaml' + if not os.path.exists(meta_file): + raise gr.Error( + 'The tuner model failed to be downloaded from HuggingFace!' + ) + + gr.Info( + 'The tuner model has been downloaded from HuggingFace Successfully!' + ) + meta = Config(cfg_file=meta_file) + base_model = meta['PARAMS']['base_model_revision'] + tuner_type = meta['PARAMS']['tuner_name'] + tuner_prompt_example = meta['PARAMS']['eval_prompts'] + if isinstance(tuner_prompt_example, list): + tuner_prompt_example = tuner_prompt_example[0] + tuner_category = f'{base_model}-{tuner_type}' + new_name = f'huggingface@{username}@{modelid}' + tar_path = os.path.join( + self.work_dir, + f'{tuner_category}/huggingface_{username}_{modelid}') + FS.put_dir_from_local_dir(local_tar_path, tar_path) + if os.path.exists(local_tar_path): + shutil.rmtree(local_tar_path) + + new_tuner = { + 'NAME': new_name, + 'NAME_ZH': new_name, + 'SOURCE': 'huggingface', + 'DESCRIPTION': meta.get('DESCRIPTION', ''), + 'BASE_MODEL': base_model, + 'MODEL_PATH': tar_path, + 'IMAGE_PATH': 'image.jpg', + 'TUNER_TYPE': tuner_type, + 'PROMPT_EXAMPLE': tuner_prompt_example + } + pipeline_level_modules = manager.inference.model_manage_ui.pipe_manager.pipeline_level_modules + if new_tuner['BASE_MODEL'] not in pipeline_level_modules: + raise gr.Error(self.component_names.model_err3 + + new_tuner['BASE_MODEL']) + pipeline_ins = pipeline_level_modules[new_tuner['BASE_MODEL']] + now_diffusion_model = f"{new_tuner['BASE_MODEL']}_{pipeline_ins.diffusion_model['name']}" + + custom_tuner_choices = self.add_tuner(new_tuner, manager, + now_diffusion_model) + + update_items = { + 'HUGGINGFACE_URL': + f'https://huggingface.co/{username}/{modelid}' + } + self.update_tuner_info(tuner_category, + new_name, + update_items=update_items) + + return (gr.update(choices=list(self.saved_tuners_category.keys()), + value=tuner_category), + gr.update(choices=list( + self.saved_tuners_category.get(tuner_category, + {}).keys()), + value=new_name), gr.Text(value=new_name), + gr.Dropdown(choices=custom_tuner_choices), + gr.update(visible=False)) + + self.hf_import_submit.click( + fn=pull_from_huggingface, + inputs=[ + self.hf_modelid, + self.hf_import_username, + self.hf_sdk2, + ], + outputs=[ + self.diffusion_models, self.tuner_models, info_ui.tuner_name, + manager.inference.tuner_ui.custom_tuner_model, + self.import_setting ], queue=True) def change_tuner_type_by_model_version(base_model_revision): - for base_model_tuner in self.base_model_tuner_methods: - if base_model_tuner.BASE_MODEL == base_model_revision: - return gr.Dropdown(value=base_model_tuner.TUNER_TYPE[0], - choices=base_model_tuner.TUNER_TYPE, - interactive=True) + if base_model_revision in self.base_model_tuner_methods_map: + base_model_tuner = self.base_model_tuner_methods_map[ + base_model_revision] + return gr.Dropdown(value=base_model_tuner[0], + choices=base_model_tuner, + interactive=True) return gr.Dropdown(value='', choices=[], interactive=True) self.upload_base_models.change(fn=change_tuner_type_by_model_version, @@ -722,36 +1113,105 @@ class BrowserUI(UIBase): outputs=[self.upload_tuner_type], queue=False) - def upload_zip(file_path, tuner_name, base_model, tuner_type): + def analyse_lora(model_path, model_dir): + from safetensors import safe_open + import json + import torch + civitai_lora = {} + with safe_open(model_path, framework='pt', device='cpu') as f: + for k in f.keys(): + civitai_lora[k] = f.get_tensor(k) + lora_config, swift_lora, unload_params = convert_tuner_civitai_to_scepter( + civitai_lora) + local_model_dir, _ = FS.map_to_local(model_dir) + os.makedirs(local_model_dir, exist_ok=True) + config_path = os.path.join(model_dir, '0_SwiftLoRA', + 'adapter_config.json') + module_path = os.path.join(model_dir, '0_SwiftLoRA', + 'adapter_model.bin') + with FS.put_to(config_path) as local_config: + with open(local_config, 'w') as fw: + fw.write(json.dumps(lora_config)) + with FS.put_to(module_path) as local_module: + torch.save(swift_lora, local_module) + FS.get_dir_to_local_dir(model_dir, local_model_dir) + return model_dir, local_model_dir + + def upload_zip(file_path, file_url, tuner_name, base_model, + tuner_type): sub_dir = f'{base_model}-{tuner_type}' - save_file = os.path.join(self.work_dir, sub_dir, - f'{tuner_name}.zip') - model_dir = os.path.join(self.work_dir, sub_dir, tuner_name) - with FS.put_to(save_file) as local_zip: - res = os.popen(f"cp '{file_path.name}' '{local_zip}'") + sub_work_dir = os.path.join(self.work_dir, sub_dir) + if not FS.exists(sub_work_dir): + FS.make_dir(sub_work_dir) + model_dir = os.path.join(sub_work_dir, tuner_name) + if FS.exists(model_dir): + raise gr.Error(self.component_names.same_name) + if file_url == '': + if file_path is None: + raise gr.Error(self.component_names.files_null) + model_input_path = file_path.name + else: + if '.zip' in file_url: + save_file = os.path.join(self.work_dir, sub_dir, + f'{tuner_name}.zip') + elif '.safetensors' in file_url: + save_file = os.path.join(self.work_dir, sub_dir, + f'{tuner_name}.safetensors') + else: + raise gr.Error(self.component_names.url_invalid) + save_file, _ = wget_file(file_url, save_file=save_file) + model_input_path, _ = FS.map_to_local(save_file) + if not FS.exists(model_input_path): + raise gr.Error(self.component_names.upload_file_error2) + + if model_input_path.endswith('.safetensors'): + # analyse lora from civitai.com + model_dir, local_model_dir = analyse_lora( + model_input_path, model_dir) + else: + save_file = os.path.join(self.work_dir, sub_dir, + f'{tuner_name}.zip') + FS.put_object_from_local_file(model_input_path, save_file) + local_model_dir, _ = FS.map_to_local(model_dir) + os.makedirs(local_model_dir, exist_ok=True) + with FS.get_from(save_file) as local_path: + res = os.popen( + f"unzip -o '{local_path}' -d '{local_model_dir}/tmp'") + res = res.readlines() + local_model_subdir = '' + for root_path, dirs, files in os.walk(f'{local_model_dir}/tmp', + topdown=False): + if 'adapter_model.bin' in files: + local_model_subdir = '/'.join( + root_path.split('/')[:-1]) + break + if local_model_subdir == '': + raise gr.Error(self.component_names.upload_file_error) + res = os.popen( + f"cp -r '{local_model_subdir}'/* '{local_model_dir}' " + f"&& rm -rf '{local_model_dir}'/tmp") res = res.readlines() - with FS.get_from(save_file) as local_path: - res = os.popen(f"unzip -o '{local_path}' -d '{model_dir}'") - res = res.readlines() - if not os.path.exists(model_dir): - raise gr.Error(f'解压{save_file}失败{str(res)}') + + FS.put_dir_from_local_dir(local_model_dir, model_dir) + if not FS.exists(model_dir): + raise gr.Error(f'unzip {save_file} failed, {str(res)}') + # find meta.yaml - if os.path.exists(os.path.join(model_dir, 'meta.yaml')): - meta = Config(cfg_file=os.path.join(model_dir, 'meta.yaml')) + if FS.exists(os.path.join(model_dir, 'meta.yaml')): + local_meta_file = os.path.join(local_model_dir, 'meta.yaml') + if not FS.exists(local_meta_file): + FS.get_from(os.path.join(model_dir, 'meta.yaml'), + local_meta_file) + meta = Config(cfg_file=local_meta_file) tuner_desc = meta.get('DESCRIPTION', '') tuner_example = meta.get('IMAGE_PATH', None) if tuner_example is not None: tuner_example = os.path.join( model_dir, os.path.basename(tuner_example)) - if os.path.exists(tuner_example): - from PIL import Image - tuner_example_path = os.path.join( - model_dir, 'image.jpg') - if not os.path.exists(tuner_example_path): - tuner_example = Image.open(tuner_example) - with FS.put_to(tuner_example_path) as local_path: - tuner_example.save(local_path) - tuner_example = tuner_example_path + if FS.exists(tuner_example): + tuner_example = tuner_example.split('/')[-1] + elif FS.exists(os.path.join(model_dir, 'image.jpg')): + tuner_example = 'image.jpg' else: tuner_example = None tuner_prompt_example = meta.get('PROMPT_EXAMPLE', '') @@ -771,19 +1231,25 @@ class BrowserUI(UIBase): 'DESCRIPTION': tuner_desc, 'BASE_MODEL': base_model, 'MODEL_PATH': model_dir, - 'IMAGE_PATH': tuner_example, 'TUNER_TYPE': tuner_type, 'PROMPT_EXAMPLE': tuner_prompt_example } + if tuner_example is not None: + new_tuner.update({'IMAGE_PATH': tuner_example}) + local_tuner_example = os.path.join(local_model_dir, + tuner_example) + else: + local_tuner_example = None pipeline_level_modules = manager.inference.model_manage_ui.pipe_manager.pipeline_level_modules if new_tuner['BASE_MODEL'] not in pipeline_level_modules: - gr.Error(self.component_names.model_err3 + - new_tuner['BASE_MODEL']) + raise gr.Error(self.component_names.model_err3 + + new_tuner['BASE_MODEL']) pipeline_ins = pipeline_level_modules[new_tuner['BASE_MODEL']] now_diffusion_model = f"{new_tuner['BASE_MODEL']}_{pipeline_ins.diffusion_model['name']}" custom_tuner_choices = self.add_tuner(new_tuner, manager, now_diffusion_model) + gr.Info(self.component_names.upload_success) return (gr.Dropdown(choices=list( self.saved_tuners_category.keys()), @@ -794,19 +1260,21 @@ class BrowserUI(UIBase): gr.Text(value=tuner_type), gr.Text(value=base_model), gr.Text(value=tuner_desc), gr.Text(value=tuner_prompt_example), - gr.Image(value=tuner_example), - gr.Dropdown(choices=custom_tuner_choices)) + gr.Image(value=local_tuner_example), + gr.Dropdown(choices=custom_tuner_choices), + gr.update(visible=False)) self.local_upload_bt.click( upload_zip, inputs=[ - self.file_path, self.upload_tuner_name, + self.file_path, self.file_url, self.upload_tuner_name, self.upload_base_models, self.upload_tuner_type ], outputs=[ self.diffusion_models, self.tuner_models, info_ui.tuner_name, info_ui.tuner_type, info_ui.base_model, info_ui.tuner_desc, info_ui.tuner_prompt_example, info_ui.tuner_example, - manager.inference.tuner_ui.custom_tuner_model + manager.inference.tuner_ui.custom_tuner_model, + self.import_setting ], queue=False) diff --git a/scepter/studio/tuner_manager/manager_ui/component_names.py b/scepter/studio/tuner_manager/manager_ui/component_names.py index e6892e4..df81c99 100644 --- a/scepter/studio/tuner_manager/manager_ui/component_names.py +++ b/scepter/studio/tuner_manager/manager_ui/component_names.py @@ -8,9 +8,9 @@ class TunerManagerNames(): self.save_symbol = '\U0001F4BE' # 💾 self.delete_symbol = '\U0001f5d1' # 🗑️ self.refresh_symbol = '\U0001f504' # 🔄 - self.upload = '\U0001F517' # 🔗 - self.download = '\U00002795' # ➕ - self.ms_submit = '\U00002714' # ✔️ + self.model_export = '\U0001F517' # 🔗 + self.model_import = '\U00002795' # ➕ + self.submit = '\U00002714' # ✔️ self.close = '\U00002716' # ✖️ if language == 'en': @@ -28,29 +28,50 @@ class TunerManagerNames(): self.tuner_prompt_example = 'Prompt Example' self.model_err3 = "Doesn't surpport this base model" self.model_err4 = \ - "This model maybe not finish training, because model doesn't exist. Please save model first." + f'Custom model does not exist. Please save{self.save_symbol} model first.' self.model_err5 = 'Model name not registered locally.' self.go_to_inference = 'Go To Inference' self.save = 'save changes' self.delete = 'Delete' + self.ms_sdk = 'ModelScope API Token' self.ms_username = 'ModelScope User Name' - self.model_private = 'Model Private' + self.ms_model_private = 'ModelScope Model Private' self.ms_modelid = 'ModelScope Model ID' self.ms_url = 'ModelScope Model Url' - self.ms_model_path = 'Hub Model ID' + + self.hf_sdk = 'HuggingFace API Token' + self.hf_username = 'HuggingFace User Name' + self.hf_model_private = 'HuggingFace Model Private' + self.hf_modelid = 'HuggingFace Model ID' + self.hf_url = 'HuggingFace Model Url' + self.export_file = 'Download Model' + self.save_start = 'Start export model...' + self.save_end = 'Export model successfully!' self.export_zip_err1 = 'export model failure' self.zip_file = 'upload model' + self.file_url = 'upload model url' + self.upload_success = 'Upload Successfully' + self.same_name = 'Upload model name already exists' + self.upload_file_error = 'Upload without .bin file' + self.upload_file_error2 = 'Upload file failed' + self.url_invalid = 'Url is invalid' + self.files_null = 'Upload files/url Null' self.utuner_name = 'Upload Tuner Name' self.ubase_model = 'Upload Base Model' self.utuner_type = 'Upload Tuner Type' self.illegal_data_err1 = 'Upload File Format Error(not .zip)' self.download_to_local = 'Download to Local' - self.export_desc = 'Model Export To ModelScope (\U00002714: Submit; \U00002716: Close)' - self.import_desc = 'Model Import From **ModelScope/Local** (\U00002714: Submit; \U00002716: Close)' + self.export_desc = 'Model Export To **ModelScope/HuggingFace** (\U00002714: Submit; \U00002716: Close)' + self.import_desc = ( + 'Model Import From **ModelScope/HuggingFace/Local** ' + '(\U00002714: Submit; \U00002716: Close)') elif language == 'zh': - self.browser_block_name = '微调模型查找 (\U0001F4BE: 保存; \U0001f504: 刷新; \U0001F517: 导出; \U00002795: 导入)' + self.browser_block_name = ( + '微调模型查找 ' + '(\U0001F4BE: 保存; \U0001f504: 刷新; \U0001F517: 导出; \U00002795: 导入)' + ) self.base_models = '基模型-微调类型' self.tuner_models = '微调模型名称' self.info_block_name = '微调模型详情' @@ -62,24 +83,40 @@ class TunerManagerNames(): self.tuner_example = '示例结果' self.tuner_prompt_example = '示例提示词' self.model_err3 = '不支持的基础模型' - self.model_err4 = '模型可能没有训练完成或者模型不存在,请先保存模型' + self.model_err4 = f'自定义模型不存在,请先保存{self.save_symbol}模型' self.model_err5 = '模型名未本地注册' self.go_to_inference = '使用模型' self.save = '保存修改' self.delete = '删除' + self.ms_sdk = 'ModelScope API Token' self.ms_username = 'ModelScope用户名' - self.model_private = '模型不公开' + self.ms_model_private = 'ModelScope模型不公开' self.ms_modelid = 'ModelScope模型ID' self.ms_url = 'ModelScope模型地址' - self.ms_model_path = 'MS模型地址' + + self.hf_sdk = 'HuggingFace API Token' + self.hf_username = 'HuggingFace 用户名' + self.hf_model_private = 'HuggingFace 模型不公开' + self.hf_modelid = 'HuggingFace 模型ID' + self.hf_url = 'HuggingFace 模型地址' + self.export_file = '下载数据' + self.save_start = '开始导出模型...' + self.save_end = '导出模型成功!' self.export_zip_err1 = '导出模型失败' self.zip_file = '上传模型' + self.file_url = '上传模型链接' + self.upload_success = '上传成功' + self.same_name = '上传模型名已存在' + self.upload_file_error = '上传缺少.bin文件' + self.upload_file_error2 = '上传文件失败' + self.url_invalid = '链接无效' + self.files_null = '上传文件为空' self.utuner_name = '上传微调模型名称' self.ubase_model = '上传基模型类型' self.utuner_type = '上传微调模型类型' self.illegal_data_err1 = '上传文件格式错误(not .zip)' self.download_to_local = '下载至本地' - self.export_desc = '模型导出至modelscope (\U00002714: 提交; \U00002716: 关闭)' - self.import_desc = '模型从 **modelscope/本地** 导入 (\U00002714: 提交; \U00002716: 关闭)' + self.export_desc = '模型导出至**ModelScope/HuggingFace** (\U00002714: 提交; \U00002716: 关闭)' + self.import_desc = '模型从 **ModelScope/HuggingFace/本地** 导入 (\U00002714: 提交; \U00002716: 关闭)' diff --git a/scepter/studio/tuner_manager/manager_ui/info_ui.py b/scepter/studio/tuner_manager/manager_ui/info_ui.py index a69908e..bcbcd84 100644 --- a/scepter/studio/tuner_manager/manager_ui/info_ui.py +++ b/scepter/studio/tuner_manager/manager_ui/info_ui.py @@ -3,16 +3,37 @@ import copy import os -import gradio as gr import yaml +import gradio as gr +import torch +from safetensors.torch import save_file from scepter.modules.utils.config import Config -from scepter.modules.utils.file_system import FS +from scepter.modules.utils.directory import get_md5 +from scepter.modules.utils.file_system import FS, IoString +from scepter.modules.utils.module_transform import ( + convert_ldm_clip_checkpoint_v1, convert_ldm_unet_tuner_checkpoint, + convert_lora_checkpoint, create_unet_diffusers_config) from scepter.studio.tuner_manager.manager_ui.component_names import \ TunerManagerNames from scepter.studio.utils.uibase import UIBase +def check_data(data): + if isinstance(data, dict): + for k, v in data.items(): + data[k] = check_data(v) + return data + elif isinstance(data, list): + for idx, v in enumerate(data): + data[idx] = check_data(v) + return data + else: + if isinstance(data, IoString): + return str(data) + return data + + class InfoUI(UIBase): def __init__(self, cfg, language='en'): self.component_names = TunerManagerNames(language) @@ -49,11 +70,22 @@ class InfoUI(UIBase): label=self.component_names. base_model_name, interactive=False) + with gr.Row(equal_height=True): with gr.Column(scale=1): self.tuner_desc = gr.Text( value='', label=self.component_names.tuner_desc, lines=4) + with gr.Row(equal_height=True): + with gr.Column(scale=1): + self.save_bt2 = gr.Button( + value=self.component_names.save_symbol, + label='Save', + elem_classes='type_row', + elem_id='save_button', + visible=True, + # lines=4 + ) with gr.Column(variant='panel', scale=1, min_width=0): with gr.Group(visible=True): with gr.Row(equal_height=True): @@ -72,7 +104,12 @@ class InfoUI(UIBase): self.ms_url = gr.Text( value='', label=self.component_names.ms_url, - lines=2) + lines=1) + with gr.Row(equal_height=True): + self.hf_url = gr.Text( + value='', + label=self.component_names.hf_url, + lines=1) with gr.Row(equal_height=True): with gr.Column(scale=1, min_width=0): self.go_to_inferece_btn = gr.Button( @@ -84,28 +121,44 @@ class InfoUI(UIBase): download_to_local, # elem_classes='type_row', elem_id='save_button') - self.export_url = gr.File( - label=self.component_names.export_file, - visible=False, - value=None, - interactive=False, - show_label=True) + with gr.Row( + equal_height=True, + visible=False, + variant='panel') as self.download_choices: + with gr.Column(scale=4, min_width=0): + self.download_select = gr.Dropdown( + choices=['.zip', '.safetensors'], + value='.zip', + interactive=True, + label='Select Download Format', + show_label=False) + with gr.Column(scale=1, min_width=0): + self.download_confirm = gr.Button( + label='Confirm Download Format', + value=self.component_names.submit, + elem_classes='type_row', + elem_id='save_button') + with gr.Row(equal_height=True): + self.export_url = gr.File( + label=self.component_names.export_file, + visible=False, + value=None, + interactive=False, + show_label=True) - def set_callbacks(self, manager): + def set_callbacks(self, manager, browser_ui): + # def set_callbacks(self, manager): def go_to_inferece(new_name, tuner_desc, tuner_prompt_example, tuner_type, base_model): + all_tuners = manager.tuner_manager.browser_ui.saved_tuners_category sub_dir = f'{base_model}-{tuner_type}' - tar_path = os.path.join(self.work_dir, sub_dir) - model_dir = os.path.join(tar_path, new_name) + current_model = all_tuners.get(sub_dir, {}).get(new_name, None) + if current_model is None: + raise gr.Error(self.component_names.model_err4) + model_dir, _ = FS.map_to_local(current_model['MODEL_PATH']) if not os.path.exists(model_dir): - tuner_list = Config( - cfg_file=os.path.join(self.work_dir, 'tuner_list.yaml')) - for tuner_item in tuner_list.get('TUNERS', []): - if tuner_item.NAME == new_name: - model_dir = tuner_item.MODEL_PATH - tuner_example = os.path.join(model_dir, 'image.jpg') - if not os.path.exists(tuner_example): - tuner_example = None + FS.get_dir_to_local_dir(current_model['MODEL_PATH']) + tuner_dict = { 'NAME': new_name, 'NAME_ZH': new_name, @@ -113,19 +166,24 @@ class InfoUI(UIBase): 'DESCRIPTION': tuner_desc, 'BASE_MODEL': base_model, 'MODEL_PATH': model_dir, - 'IMAGE_PATH': tuner_example, 'TUNER_TYPE': tuner_type, 'PROMPT_EXAMPLE': tuner_prompt_example } + if 'IMAGE_PATH' in current_model: + tuner_example_abspath = os.path.join( + model_dir, current_model['IMAGE_PATH']) + if FS.exists(tuner_example_abspath): + tuner_dict.update({'IMAGE_PATH': tuner_example_abspath}) + tuner_cfg = Config(cfg_dict=tuner_dict, load=False) cfg_file = os.path.join(model_dir, 'meta.yaml') if not os.path.exists(model_dir): - gr.Error(self.component_names.model_err4) + raise gr.Error(self.component_names.model_err4) pipeline_level_modules = 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.model_err3 + - tuner_cfg.BASE_MODEL) + raise gr.Error(self.component_names.model_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']}" @@ -139,11 +197,11 @@ class InfoUI(UIBase): tunner_default = tuner_cfg.NAME if self.language == 'en' else tuner_cfg.NAME_ZH if tunner_default not in tunner_choices: if self.language == 'zh': - gr.Error(self.component_names.model_err5 + - tuner_cfg.NAME_ZH) + raise gr.Error(self.component_names.model_err5 + + tuner_cfg.NAME_ZH) else: - gr.Error(self.component_names.model_err5 + - tuner_cfg.NAME) + raise gr.Error(self.component_names.model_err5 + + tuner_cfg.NAME) if not isinstance(tunner_default, list): tunner_default = [tunner_default] else: @@ -151,7 +209,7 @@ class InfoUI(UIBase): tunner_default = [] with open(cfg_file, 'w') as f_out: - yaml.dump(copy.deepcopy(tuner_cfg.cfg_dict), + yaml.dump(copy.deepcopy(check_data(tuner_cfg.cfg_dict)), f_out, encoding='utf-8', allow_unicode=True, @@ -166,13 +224,21 @@ class InfoUI(UIBase): manager.inference.tuner_ui.name_level_tuners[base_model][ tuner_cfg.NAME] = tuner_cfg - return ( - gr.Tabs(selected='inference'), cfg_file, - gr.Tabs(selected='tuner_ui'), - gr.CheckboxGroup( - value='使用微调' if self.language == 'zh' else 'Use Tuners'), - gr.Dropdown(value=diffusion_model), - gr.Dropdown(choices=tunner_choices, value=tunner_default)) + if tuner_cfg.BASE_MODEL == 'EDIT': + selected_tab = 'stylebooth_ui' if tuner_cfg.BASE_MODEL == 'EDIT' else 'tuner_ui' + checkboxes = [ + '使用微调', 'StyleBooth' + ] if self.language == 'zh' else ['Use Tuners', 'StyleBooth'] + else: + selected_tab = 'tuner_ui' + checkboxes = ['使用微调' + ] if self.language == 'zh' else ['Use Tuners'] + + return (gr.Tabs(selected='inference'), cfg_file, + gr.Tabs(selected=selected_tab), + gr.CheckboxGroup(value=checkboxes), + gr.Dropdown(value=diffusion_model), + gr.Dropdown(choices=tunner_choices, value=tunner_default)) self.go_to_inferece_btn.click( go_to_inferece, @@ -190,33 +256,118 @@ class InfoUI(UIBase): queue=True) def export_zip(tuner_name, base_model, tuner_type): + all_tuners = manager.tuner_manager.browser_ui.saved_tuners_category sub_dir = f'{base_model}-{tuner_type}' - if os.path.exists(os.path.join(self.work_dir, sub_dir, - tuner_name)): - model_dir = os.path.join(self.work_dir, sub_dir, tuner_name) - else: - model_dir = '' - tuner_list = Config( - cfg_file=os.path.join(self.work_dir, 'tuner_list.yaml')) - for tuner_item in tuner_list.get('TUNERS', []): - if tuner_item.NAME == tuner_name: - model_dir = tuner_item.MODEL_PATH - break - if not os.path.exists(model_dir) or model_dir == '': - raise gr.Error(self.component_names.model_err4) - zip_path = os.path.join(self.export_folder, f'{tuner_name}.zip') + current_model = all_tuners.get(sub_dir, {}).get(tuner_name, None) + if current_model is None: + raise gr.Error(self.component_names.model_err4) + enable_share = current_model.get('ENABLE_SHARE', True) + if not enable_share: + gr.Info('Error: The model is not allowed to Export!') + return gr.File() + model_dir = FS.get_dir_to_local_dir(current_model['MODEL_PATH']) + zip_path = get_md5(os.path.join(self.export_folder, + tuner_name)) + '.zip' with FS.put_to(zip_path) as local_zip: res = os.popen( - f"cd '{model_dir}' " + f"cd '{os.path.abspath(model_dir)}' " f"&& zip -r '{os.path.abspath(local_zip)}' ./* ") print(res.readlines()) if not FS.exists(zip_path): raise gr.Error(self.component_names.export_zip_err1) local_zip = FS.get_from(zip_path) + gr.Info(self.component_names.save_end) return gr.File(value=local_zip, visible=True) - self.local_download_bt.click( - export_zip, - inputs=[self.tuner_name, self.base_model, self.tuner_type], - outputs=[self.export_url], - queue=False) + def export_safetensors(tuner_name, base_model, tuner_type): + # only support sd1.5 + all_tuners = manager.tuner_manager.browser_ui.saved_tuners_category + sub_dir = f'{base_model}-{tuner_type}' + current_model = all_tuners.get(sub_dir, {}).get(tuner_name, None) + if current_model is None: + raise gr.Error(self.component_names.model_err4) + enable_share = current_model.get('ENABLE_SHARE', True) + if not enable_share: + gr.Info('Error: The model is not allowed to Export!') + return gr.File() + + model_dir = FS.get_dir_to_local_dir(current_model['MODEL_PATH']) + + swift_checkpoint = {} + swift_dirs = os.listdir(model_dir) + for swift_dir in swift_dirs: + if not os.path.isdir(os.path.join(model_dir, swift_dir)): + continue + swift_files = os.listdir(os.path.join(model_dir, swift_dir)) + for swift_file in swift_files: + if '.bin' in swift_file: + checkpoint_path = os.path.join(model_dir, swift_dir, + swift_file) + checkpoint = torch.load(checkpoint_path, + map_location='cpu') + swift_checkpoint.update(checkpoint) + + unet_config = create_unet_diffusers_config(v2=False) + ckpt_unet = convert_ldm_unet_tuner_checkpoint( + v2=False, + checkpoint=swift_checkpoint, + config=unet_config, + unet_key='model.') + lora_state_dict = convert_lora_checkpoint(ckpt_unet=ckpt_unet) + ckpt_te = convert_ldm_clip_checkpoint_v1(swift_checkpoint) + lora_te_state_dict = convert_lora_checkpoint(ckpt_text=ckpt_te) + lora_state_dict.update(lora_te_state_dict) + + save_path = get_md5(os.path.join(self.export_folder, + tuner_name)) + '.safetensors' + with FS.put_to(save_path) as local_file: + save_file(lora_state_dict, local_file) + if not FS.exists(save_path): + raise gr.Error(self.component_names.export_zip_err1) + local_zip = FS.get_from(save_path) + gr.Info(self.component_names.save_end) + return gr.File(value=local_zip, visible=True) + + def export_file(tuner_name, base_model, tuner_type, download_type): + gr.Info(self.component_names.save_start) + if download_type == '.zip': + return export_zip(tuner_name, base_model, tuner_type) + elif download_type == '.safetensors': + return export_safetensors(tuner_name, base_model, tuner_type) + + def change_visible(): + return gr.update(visible=True) + + self.local_download_bt.click(change_visible, + inputs=[], + outputs=[self.download_choices], + queue=False) + + self.download_confirm.click(export_file, + inputs=[ + self.tuner_name, self.base_model, + self.tuner_type, self.download_select + ], + outputs=[self.export_url], + queue=True) + + def save_tuner_func(tuner_name, new_name, tuner_desc, tuner_example, + tuner_prompt_example, base_model, tuner_type): + return browser_ui.save_tuner(manager, tuner_name, new_name, + tuner_desc, tuner_example, + tuner_prompt_example, base_model, + tuner_type) + + self.save_bt2.click(save_tuner_func, + inputs=[ + self.tuner_name, self.new_name, + self.tuner_desc, self.tuner_example, + self.tuner_prompt_example, self.base_model, + self.tuner_type + ], + outputs=[ + browser_ui.diffusion_models, + browser_ui.tuner_models, self.tuner_name, + manager.inference.tuner_ui.custom_tuner_model + ], + queue=True) diff --git a/scepter/studio/tuner_manager/tuner_manager.py b/scepter/studio/tuner_manager/tuner_manager.py index 17217aa..e0b50ad 100644 --- a/scepter/studio/tuner_manager/tuner_manager.py +++ b/scepter/studio/tuner_manager/tuner_manager.py @@ -18,8 +18,6 @@ class TunerManagerUI(): cfg_general = Config(cfg_file=cfg_general_file) cfg_general.WORK_DIR = os.path.join(root_work_dir, cfg_general.WORK_DIR) - cfg_general.SELF_TRAIN_DIR = os.path.join(root_work_dir, - cfg_general.SELF_TRAIN_DIR) if not FS.exists(cfg_general.WORK_DIR): FS.make_dir(cfg_general.WORK_DIR) @@ -32,5 +30,5 @@ class TunerManagerUI(): self.info_ui.create_ui() def set_callbacks(self, manager): - self.info_ui.set_callbacks(manager) + self.info_ui.set_callbacks(manager, self.browser_ui) self.browser_ui.set_callbacks(manager, self.info_ui) diff --git a/scepter/studio/tuner_manager/utils/path.py b/scepter/studio/tuner_manager/utils/path.py index 45aae38..f8a1f2a 100644 --- a/scepter/studio/tuner_manager/utils/path.py +++ b/scepter/studio/tuner_manager/utils/path.py @@ -4,7 +4,21 @@ import re def is_valid_filename(filename): - if re.match('^[A-Za-z0-9_@]+$', filename): + if re.match('^[A-Za-z0-9_@.-]+$', filename): + return True + else: + return False + + +def is_valid_modelscope_filename(filename): + if re.match('^[A-Za-z0-9_-]+$', filename): + return True + else: + return False + + +def is_valid_huggingface_filename(filename): + if re.match('^[A-Za-z0-9_-]+$', filename): return True else: return False diff --git a/scepter/studio/tuner_manager/utils/yaml.py b/scepter/studio/tuner_manager/utils/yaml.py index 2b4db07..b94b2b7 100644 --- a/scepter/studio/tuner_manager/utils/yaml.py +++ b/scepter/studio/tuner_manager/utils/yaml.py @@ -2,10 +2,27 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import yaml +from scepter.modules.utils.file_system import IoString + + +def check_data(data): + if isinstance(data, dict): + for k, v in data.items(): + data[k] = check_data(v) + return data + elif isinstance(data, list): + for idx, v in enumerate(data): + data[idx] = check_data(v) + return data + else: + if isinstance(data, IoString): + return str(data) + return data + def save_yaml(data, file_path): with open(file_path, 'w') as f_out: - yaml.dump(data, + yaml.dump(check_data(data), f_out, encoding='utf-8', allow_unicode=True, diff --git a/scepter/tools/convert_tuner.py b/scepter/tools/convert_tuner.py new file mode 100644 index 0000000..7b91a81 --- /dev/null +++ b/scepter/tools/convert_tuner.py @@ -0,0 +1,137 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import argparse +import importlib +# from safetensors.torch import save_file +# from safetensors import safe_open +import json +import os +import sys + +import safetensors +import torch +from scepter.modules.utils.config import Config +from scepter.modules.utils.file_system import FS +from scepter.modules.utils.module_transform import ( + convert_ldm_clip_checkpoint_v1, convert_ldm_unet_tuner_checkpoint, + convert_lora_checkpoint, convert_tuner_civitai_to_scepter, + create_unet_diffusers_config) + +if os.path.exists('__init__.py'): + package_name = 'scepter_ext' + spec = importlib.util.spec_from_file_location(package_name, '__init__.py') + package = importlib.util.module_from_spec(spec) + sys.modules[package_name] = package + spec.loader.exec_module(package) + + +def str2bool(v): + if isinstance(v, bool): + return v + if v.lower() in ('yes', 'true', 't', 'y', '1'): + return True + elif v.lower() in ('no', 'false', 'f', 'n', '0'): + return False + else: + raise argparse.ArgumentTypeError('Boolean value expected.') + + +def scepter_to_civitai(cfg): + scepter_checkpoint = {} + local_source, _ = FS.map_to_local(cfg.args.source) + if not FS.exists(local_source): + FS.get_dir_to_local_dir(cfg.args.source, local_source) + for name in FS.walk_dir(local_source): + path = os.path.join(local_source, name) + if not FS.isdir(path): + continue + for sub_name in FS.walk_dir(path): + if '.bin' in sub_name: + checkpoint_path = os.path.join(local_source, name, sub_name) + checkpoint = torch.load(checkpoint_path, map_location='cpu') + scepter_checkpoint.update(checkpoint) + unet_config = create_unet_diffusers_config(v2=False) + ckpt_unet = convert_ldm_unet_tuner_checkpoint( + v2=False, + checkpoint=scepter_checkpoint, + config=unet_config, + unet_key='model.') + lora_state_dict = convert_lora_checkpoint(ckpt_unet=ckpt_unet) + ckpt_te = convert_ldm_clip_checkpoint_v1(scepter_checkpoint) + lora_te_state_dict = convert_lora_checkpoint(ckpt_text=ckpt_te) + lora_state_dict.update(lora_te_state_dict) + with FS.put_to(cfg.args.target) as local_file: + safetensors.torch.save_file(lora_state_dict, local_file) + if not FS.exists(cfg.args.target): + raise Exception( + f'Transform Error From {cfg.args.source} To {cfg.args.target}.') + else: + print( + f'Transform Success From {cfg.args.source} To {cfg.args.target}.') + + +def civitai_to_scepter(cfg): + civitai_lora = {} + local_source, _ = FS.map_to_local(cfg.args.source) + if not FS.exists(local_source): + FS.get_from(cfg.args.source, local_source) + with safetensors.safe_open(local_source, framework='pt', + device='cpu') as f: + for k in f.keys(): + civitai_lora[k] = f.get_tensor(k) + tuner_config, scepter_tuner, unload_params = convert_tuner_civitai_to_scepter( + civitai_lora) + local_target_dir, _ = FS.map_to_local(cfg.args.target) + FS.make_dir(local_target_dir) + config_path = os.path.join(local_target_dir, '0_SwiftLoRA', + 'adapter_config.json') + module_path = os.path.join(local_target_dir, '0_SwiftLoRA', + 'adapter_model.bin') + with FS.put_to(config_path) as local_config: + with open(local_config, 'w') as fw: + fw.write(json.dumps(tuner_config)) + with FS.put_to(module_path) as local_module: + torch.save(scepter_tuner, local_module) + if not FS.exists(cfg.args.target): + raise Exception( + f'Transform Error From {cfg.args.source} To {cfg.args.target}.') + else: + print( + f'Transform Success From {cfg.args.source} To {cfg.args.target}.') + + +def transform_module_format(cfg): + if 'FILE_SYSTEM' in cfg: + if isinstance(cfg.FILE_SYSTEM, list): + for file_cfg in cfg.FILE_SYSTEM: + FS.init_fs_client(file_cfg) + else: + FS.init_fs_client(cfg.FILE_SYSTEM) + if cfg.args.export: + scepter_to_civitai(cfg) + else: + civitai_to_scepter(cfg) + + +def run(): + parser = argparse.ArgumentParser(description='Argparser for Scepter:\n') + parser.add_argument('--source', + dest='source', + help='The source model path!', + default=None) + parser.add_argument('--target', + dest='target', + help='The target model path!', + default=None) + parser.add_argument('--export', + dest='export', + type=str2bool, + help='Use export mode', + default=True) + + cfg = Config(load=True, parser_ins=parser) + transform_module_format(cfg) + + +if __name__ == '__main__': + run() diff --git a/scepter/tools/process_watcher.py b/scepter/tools/process_watcher.py new file mode 100644 index 0000000..74a2bae --- /dev/null +++ b/scepter/tools/process_watcher.py @@ -0,0 +1,114 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import argparse +import os +import random +import subprocess +import time +from datetime import datetime + +import psutil + +parser = argparse.ArgumentParser( + description='Argparser for process watcher:\n') + +parser.add_argument( + '--python_engine', + dest='python_engine', + help='the engine path of python interpreter!', + default='/home/pai/envs/scepter/bin/python', + type=str, +) + +parser.add_argument( + '--script', + dest='script', + help='the script to run!', + default='main_mmpose.py', + type=str, +) +parser.add_argument( + '--cfg', + dest='cfg', + help='the cfg file for script!', + default='', + type=str, +) + +parser.add_argument( + '--offset', + dest='offset', + help='the offset for modify the current seed!', + default=0, + type=int, +) + +parser.add_argument( + '--interval', + dest='interval', + help='the interval bettween two tasks!', + default=0, + type=int, +) + +parser.add_argument( + '--ins', + dest='ins', + help='the number of instance to start!', + default=1, + type=int, +) + +parser.add_argument( + '--runtime', + dest='runtime', + help='total runtime for all tasks!', + default=144, + type=int, +) + +args = parser.parse_args() +seed = datetime.now().hour +random.seed(seed + args.offset) +random_port_start = random.randint(1100, 7080) +all_tasks = [] +start_time = time.time() +for i in range(args.ins): + cmd = ( + f'MASTER_PORT={random_port_start + i} {args.python_engine} -W ignore ' + f'{args.script} --cfg={args.cfg} ') + print(cmd) + proc = subprocess.Popen(cmd, shell=True) + all_tasks.append([proc, cmd]) + time.sleep(args.interval) + +while True: + if time.time() - start_time > args.runtime * 60 * 60: + print(f'reach to the max running time {args.runtime}h') + for proc, cmd in all_tasks: + print(f'kill process {proc.pid} with cmd {cmd}') + os.system('kill -term {}'.format(proc.pid)) + break + time.sleep(120) + print(f'Have processed {time.time() - start_time}s') + is_finished = False + status_list = [] + for idx, (proc, cmd) in enumerate(all_tasks): + current_process = psutil.Process(proc.pid) + if not current_process.status() in ('running', 'sleeping', + 'disk-sleep', 'waking'): + retcode = proc.wait() + print( + f'process {proc.pid} with cmd {cmd} exit with code {retcode}') + if retcode == 0: + print(f'task {proc.pid} finished!') + status_list.append(idx) + else: + print(f'restart {proc.pid} with cmd {cmd}.') + proc = subprocess.Popen(cmd, shell=True) + all_tasks[idx] = [proc, cmd] + for idx in status_list: + all_tasks.pop(idx) + if len(all_tasks) == 0: + print('all tasks finished!') + break diff --git a/scepter/tools/run_inference.py b/scepter/tools/run_inference.py index 5bb9bdc..349da04 100644 --- a/scepter/tools/run_inference.py +++ b/scepter/tools/run_inference.py @@ -10,7 +10,6 @@ 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 from scepter.modules.utils.data import transfer_data_to_cuda diff --git a/scepter/tools/webui.py b/scepter/tools/webui.py index 6e28aac..086ed5d 100644 --- a/scepter/tools/webui.py +++ b/scepter/tools/webui.py @@ -8,7 +8,6 @@ import random import sys import gradio as gr - import scepter from scepter.modules.utils.config import Config from scepter.modules.utils.file_system import FS diff --git a/scepter/version.py b/scepter/version.py index 230866d..737ae04 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.5.post1' +__version__ = '1.0.0' version_info = tuple(int(x) for x in __version__.split('.')[0:3]) diff --git a/tests/modules/test_diffusion_inference.py b/tests/modules/test_diffusion_inference.py index dc963e9..fc95c08 100644 --- a/tests/modules/test_diffusion_inference.py +++ b/tests/modules/test_diffusion_inference.py @@ -8,8 +8,6 @@ import numpy as np import torchvision.transforms as TT import torchvision.transforms.functional as TF from PIL import Image -from torchvision.utils import save_image - from scepter.modules.annotator.registry import ANNOTATORS from scepter.modules.inference.diffusion_inference import DiffusionInference from scepter.modules.inference.stylebooth_inference import StyleboothInference @@ -17,6 +15,7 @@ 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 +from torchvision.utils import save_image class DiffusionInferenceTest(unittest.TestCase): @@ -68,7 +67,7 @@ class DiffusionInferenceTest(unittest.TestCase): 'sdxl_test_prompt_a_cute_dog.png') save_image(output['images'], save_path) - # @unittest.skip('') + @unittest.skip('') def test_sd15_scedit_t2i_2D(self): # init model config_file = 'scepter/methods/studio/inference/stable_diffusion/sd15_pro.yaml' @@ -84,7 +83,7 @@ class DiffusionInferenceTest(unittest.TestCase): 'IMAGE_PATH': None, 'TUNER_TYPE': 'SwiftSCE', 'MODEL_PATH': - 'ms://damo/scepter_scedit@tuners_model/SD1.5/Flat2DArt', + 'ms://iic/scepter_scedit@tuners_model/SD1.5/Flat2DArt', 'PROMPT_EXAMPLE': None } tuner_model = Config(cfg_dict=tuner_model, load=False) @@ -100,6 +99,61 @@ class DiffusionInferenceTest(unittest.TestCase): save_image(output['images'], save_path) # @unittest.skip('') + def test_sd21_scedit_ctr_canny(self): + # init model + config_file = 'scepter/methods/studio/inference/stable_diffusion/sd21_pro.yaml' + cfg = Config(cfg_file=config_file) + diff_infer = DiffusionInference(logger=self.logger) + diff_infer.init_from_cfg(cfg) + # extract condition + 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) + output_height, output_width = 768, 768 + control_cond_image = Image.open('asset/images/flower.jpg') + control_cond_image = TT.Resize(min(output_height, + output_width))(control_cond_image) + control_cond_image = TT.CenterCrop( + (output_height, output_width))(control_cond_image) + control_cond_image = canny_ins(np.array(control_cond_image)) + control_save_path = os.path.join(self.tmp_dir, + 'sd21_flower_canny_preproccess.png') + save_image(TF.to_tensor(control_cond_image), control_save_path) + control_cond_image = Image.open(control_save_path) + # load control model + control_model = { + 'NAME': + 'canny', + 'NAME_ZH': + None, + 'DESCRIPTION': + None, + 'BASE_MODEL': + 'SD2.1', + 'TYPE': + 'Canny', + 'MODEL_PATH': + 'ms://iic/scepter_scedit@controllable_model/SD2.1/canny_control' + } + control_model = Config(cfg_dict=control_model, load=False) + # prepare data + input_data = {'prompt': 'a single flower is shown in front of a tree'} + input_params = { + 'control_model': control_model, + 'control_cond_image': control_cond_image, + 'control_scale': 1.0, + 'crop_type': 'CenterCrop', + 'seed': 2024 + } + output = diff_infer(input_data, **input_params) + save_path = os.path.join(self.tmp_dir, 'sd21_flower_canny.png') + save_image(output['images'], save_path) + + @unittest.skip('') def test_sdxl_scedit_ctr_canny(self): # init model config_file = 'scepter/methods/studio/inference/sdxl/sdxl1.0_pro.yaml' @@ -138,7 +192,7 @@ class DiffusionInferenceTest(unittest.TestCase): 'TYPE': 'Canny', 'MODEL_PATH': - 'ms://damo/scepter_scedit@controllable_model/SD_XL1.0/canny_control' + 'ms://iic/scepter_scedit@controllable_model/SD_XL1.0/canny_control' } control_model = Config(cfg_dict=control_model, load=False) # prepare data @@ -154,7 +208,7 @@ class DiffusionInferenceTest(unittest.TestCase): save_path = os.path.join(self.tmp_dir, 'sdxl_flower_canny.png') save_image(output['images'], save_path) - # @unittest.skip('') + @unittest.skip('') def test_stylebooth(self): config_file = 'scepter/methods/studio/inference/edit/stylebooth_tb_pro.yaml' cfg = Config(cfg_file=config_file) @@ -166,7 +220,7 @@ class DiffusionInferenceTest(unittest.TestCase): style_edit_image=Image.open( 'asset/images/inpainting_text_ref/ex4_scene_im.jpg'), style_guide_scale_text=7.5, - style_guide_scale_image=0.5) + style_guide_scale_image=1.5) save_path = os.path.join(self.tmp_dir, 'stylebooth_test_lowpoly_cute_dog.png') save_image(output['images'], save_path) diff --git a/tests/tools/test_annotators.py b/tests/tools/test_annotators.py index 89b42c0..b7107ab 100644 --- a/tests/tools/test_annotators.py +++ b/tests/tools/test_annotators.py @@ -6,7 +6,6 @@ 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 @@ -79,7 +78,7 @@ class AnnotatorTest(unittest.TestCase): 'NAME': 'HedAnnotator', 'PRETRAINED_MODEL': - 'ms://damo/scepter_scedit@annotator/ckpts/ControlNetHED.pth' + 'ms://iic/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) @@ -95,9 +94,9 @@ class AnnotatorTest(unittest.TestCase): 'NAME': 'OpenposeAnnotator', 'BODY_MODEL_PATH': - 'ms://damo/scepter_scedit@annotator/ckpts/body_pose_model.pth', + 'ms://iic/scepter_scedit@annotator/ckpts/body_pose_model.pth', 'HAND_MODEL_PATH': - 'ms://damo/scepter_scedit@annotator/ckpts/hand_pose_model.pth' + 'ms://iic/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) @@ -112,7 +111,7 @@ class AnnotatorTest(unittest.TestCase): midas_dict = { 'NAME': 'MidasDetector', 'PRETRAINED_MODEL': - 'ms://damo/scepter_scedit@annotator/ckpts/dpt_hybrid-midas-501f0c75.pt', + 'ms://iic/scepter_scedit@annotator/ckpts/dpt_hybrid-midas-501f0c75.pt', 'A': 6.2, 'BG_TH': 0.1 } @@ -129,7 +128,7 @@ class AnnotatorTest(unittest.TestCase): mlsd_dict = { 'NAME': 'MLSDdetector', 'PRETRAINED_MODEL': - 'ms://damo/scepter_scedit@annotator/ckpts/mlsd_large_512_fp32.pth', + 'ms://iic/scepter_scedit@annotator/ckpts/mlsd_large_512_fp32.pth', 'THR_V': 0.1, 'THR_D': 0.1 } @@ -184,30 +183,30 @@ class AnnotatorTest(unittest.TestCase): hed_dict = { 'NAME': 'HedAnnotator', 'PRETRAINED_MODEL': - 'ms://damo/scepter_scedit@annotator/ckpts/ControlNetHED.pth', + 'ms://iic/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', + 'ms://iic/scepter_scedit@annotator/ckpts/body_pose_model.pth', 'HAND_MODEL_PATH': - 'ms://damo/scepter_scedit@annotator/ckpts/hand_pose_model.pth', + 'ms://iic/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', + 'ms://iic/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', + 'ms://iic/scepter_scedit@annotator/ckpts/mlsd_large_512_fp32.pth', 'INPUT_KEYS': ['img'], 'OUTPUT_KEYS': ['mlsd_img'] } diff --git a/tests/tools/test_convert_tuner.py b/tests/tools/test_convert_tuner.py new file mode 100644 index 0000000..3a6f106 --- /dev/null +++ b/tests/tools/test_convert_tuner.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. + +import os +import unittest + +from scepter.modules.utils.config import Config +from scepter.modules.utils.file_system import FS + + +class ConvertTunerTest(unittest.TestCase): + def setUp(self): + print(('Testing %s.%s' % (type(self).__name__, self._testMethodName))) + self.convert_path = './cache/save_data/module_transform' + self.convert_source_path = './cache/save_data/module_transform/source' + self.convert_target_path = './cache/save_data/module_transform/target' + if not os.path.exists(self.convert_target_path): + os.makedirs(self.convert_target_path) + fs_info = { + 'NAME': 'ModelscopeFs', + 'TEMP_DIR': self.convert_source_path + } + config = Config(load=False, cfg_dict=fs_info) + FS.init_fs_client(config) + + def tearDown(self): + super().tearDown() + + # @unittest.skip('') + def test_scepter_to_civitai(self): + save_path = os.path.join(self.convert_target_path, 'civitai_tuner', + 'tuner.safetensors') + scepter_tuner_path = 'ms://sd_lora/SD15-LoRA-3DStyle-Scepter-Test' + with FS.get_dir_to_local_dir(scepter_tuner_path, + wait_finish=True) as local_path: + print(f'Download from {scepter_tuner_path} to {local_path}') + self.assertTrue(os.path.exists(local_path)) + os.system('python scepter/tools/convert_tuner.py ' + f'--source {local_path} ' + f'--target {save_path} ' + f'--export true') + + # @unittest.skip('') + def test_civitai_to_scepter(self): + save_path = os.path.join(self.convert_target_path, 'scepter_tuner') + civitai_tuner_path = 'ms://sd_lora/SD15-LoRA-AnimeLineartStyle@animeoutlineV4_16.safetensors' + with FS.get_dir_to_local_dir(civitai_tuner_path, + wait_finish=True) as local_path: + print(f'Download from {civitai_tuner_path} to {local_path}') + self.assertTrue(os.path.exists(local_path)) + os.system('python scepter/tools/convert_tuner.py ' + f'--source {local_path} ' + f'--target {save_path} ' + f'--export false') + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/tools/test_inference.py b/tests/tools/test_inference.py index e77f133..76cc20a 100644 --- a/tests/tools/test_inference.py +++ b/tests/tools/test_inference.py @@ -166,7 +166,7 @@ class InferenceTest(unittest.TestCase): "--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' + 'ms://iic/scepter_scedit@controllable_model/SD2.1/canny_control/0_SwiftSCETuning/pytorch_model.bin' ) os.system( @@ -175,7 +175,7 @@ class InferenceTest(unittest.TestCase): "--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' + 'ms://iic/scepter_scedit@controllable_model/SD2.1/pose_control/0_SwiftSCETuning/pytorch_model.bin' ) diff --git a/tests/tools/test_train.py b/tests/tools/test_train.py index 418de33..431a4b2 100644 --- a/tests/tools/test_train.py +++ b/tests/tools/test_train.py @@ -13,11 +13,19 @@ class TrainTest(unittest.TestCase): os.makedirs(self.tmp_dir) self.data_dir = './cache/datasets' if not os.path.exists(self.data_dir): - data_cmd = """mkdir -p cache/datasets/ && wget 'https://www.modelscope.cn/api/v1/models - /iic/scepter/repo?Revision=master&FilePath=datasets/3D_example_txt.zip' - -O cache/datasets/3D_example_txt.zip && - unzip cache/datasets/3D_example_txt.zip - -d cache/datasets/ && rm cache/datasets/3D_example_txt.zip""" + data_cmd = ( + 'mkdir -p cache/datasets/ ' + "&& wget 'https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=" + "datasets/3D_example_txt.zip' -O cache/datasets/3D_example_txt.zip " + '&& unzip cache/datasets/3D_example_txt.zip -d cache/datasets/ ' + '&& rm cache/datasets/3D_example_txt.zip') + os.system(data_cmd) + data_cmd = ( + 'mkdir -p cache/datasets/ ' + "&& wget 'https://www.modelscope.cn/api/v1/models/iic/scepter/repo?Revision=master&FilePath=" + "datasets/hed_pair.zip' -O cache/datasets/hed_pair.zip " + '&& unzip cache/datasets/hed_pair.zip -d cache/datasets/ ' + '&& rm cache/datasets/hed_pair.zip') os.system(data_cmd) def tearDown(self): @@ -209,6 +217,14 @@ class TrainTest(unittest.TestCase): os.path.join(self.tmp_dir, 'sdxl_1024_sce_ctr_color_datatxt/checkpoints'))) + def test_edit_example(self): + os.system('python scepter/tools/run_train.py ' + '--cfg scepter/methods/edit/edit_512_lora.yaml ' + '--max_steps 100') + self.assertTrue( + os.path.exists( + os.path.join(self.tmp_dir, 'edit_512_lora/checkpoints'))) + if __name__ == '__main__': unittest.main() diff --git a/tests/utils/test_fs.py b/tests/utils/test_fs.py index 4023e53..06b7a5e 100644 --- a/tests/utils/test_fs.py +++ b/tests/utils/test_fs.py @@ -80,7 +80,7 @@ class FSTest(unittest.TestCase): FS.init_fs_client(config) st_time = time.time() - path = 'ms://damo/scepter_scedit' + path = 'ms://iic/scepter_scedit' with FS.get_dir_to_local_dir(path, wait_finish=True) as local_path: print( f'Download from {path} to {local_path}, take {time.time()-st_time}' @@ -88,7 +88,7 @@ class FSTest(unittest.TestCase): self.assertTrue(os.path.exists(local_path)) st_time = time.time() - path = 'ms://damo/scepter_scedit' + path = 'ms://iic/scepter_scedit' with FS.get_dir_to_local_dir(path, wait_finish=True) as local_path: print( f'Download from {path} to {local_path}, take {time.time()-st_time}' @@ -96,7 +96,7 @@ class FSTest(unittest.TestCase): self.assertTrue(os.path.exists(local_path)) st_time = time.time() - path = 'ms://damo/scepter_scedit@controllable_model/SD2.1/canny_control/' + path = 'ms://iic/scepter_scedit@controllable_model/SD2.1/canny_control/' with FS.get_dir_to_local_dir(path, wait_finish=True) as local_path: print( f'Download from {path} to {local_path}, take {time.time()-st_time}' @@ -104,7 +104,7 @@ class FSTest(unittest.TestCase): self.assertTrue(os.path.exists(local_path)) st_time = time.time() - path = 'ms://damo/scepter_scedit@controllable_model/SD2.1/canny_control/' + path = 'ms://iic/scepter_scedit@controllable_model/SD2.1/canny_control/' with FS.get_dir_to_local_dir(path, wait_finish=True) as local_path: print( f'Download from {path} to {local_path}, take {time.time()-st_time}' @@ -112,7 +112,7 @@ class FSTest(unittest.TestCase): self.assertTrue(os.path.exists(local_path)) st_time = time.time() - path = 'ms://damo/scepter@mantra_images/SD_XL1.0/894f40ed44b37c3372e6a22b8ae577a4.png' + path = 'ms://iic/scepter@mantra_images_jpg/SD_XL1.0/894f40ed44b37c3372e6a22b8ae577a4.jpg' with FS.get_from(path, wait_finish=True) as local_path: print( f'Download from {path} to {local_path}, take {time.time()-st_time}' @@ -120,7 +120,7 @@ class FSTest(unittest.TestCase): self.assertTrue(os.path.exists(local_path)) st_time = time.time() - path = 'ms://damo/scepter@mantra_images/SD2.1/894f40ed44b37c3372e6a22b8ae577a4.png' + path = 'ms://iic/scepter@mantra_images_jpg/SD2.1/894f40ed44b37c3372e6a22b8ae577a4.jpg' with FS.get_from(path, wait_finish=True) as local_path: print( f'Download from {path} to {local_path}, take {time.time()-st_time}' @@ -128,7 +128,7 @@ class FSTest(unittest.TestCase): self.assertTrue(os.path.exists(local_path)) st_time = time.time() - path = 'ms://damo/scepter@mantra_images/SD2.1/894f40ed44b37c3372e6a22b8ae577a4.png' + path = 'ms://iic/scepter@mantra_images_jpg/SD2.1/894f40ed44b37c3372e6a22b8ae577a4.jpg' with FS.get_from(path, wait_finish=True) as local_path: print( f'Download from {path} to {local_path}, take {time.time()-st_time}'