From c70ef0fc4713cf11e7abf0ad3252b31da4169d88 Mon Sep 17 00:00:00 2001 From: hanzhn Date: Mon, 27 May 2024 13:15:48 +0800 Subject: [PATCH] v1.0.0 update --- .gitignore | 2 +- asset/images/edit_tuner/cat_512.jpg | Bin 0 -> 92386 bytes asset/images/edit_tuner/depth.jpg | Bin 0 -> 67826 bytes asset/images/edit_tuner/depth2image.jpeg | Bin 0 -> 67133 bytes asset/images/edit_tuner/detext.jpeg | Bin 0 -> 27772 bytes asset/images/edit_tuner/hed.jpeg | Bin 0 -> 88646 bytes asset/images/edit_tuner/house.jpg | Bin 0 -> 93330 bytes asset/images/edit_tuner/image2depth.jpeg | Bin 0 -> 27220 bytes asset/images/edit_tuner/text.jpg | Bin 0 -> 74173 bytes docs/en/conf.py | 1 + docs/en/tasks/stylebooth.md | 17 +- docs/en/tutorials/dataset.md | 7 +- docs/en/tutorials/inference.md | 4 +- docs/zh_cn/conf.py | 1 + example/classifier/classifier_dataset.py | 1 - readme.md | 37 +- scepter/methods/edit/edit_512_lora.yaml | 250 +++ .../scedit/ctr/sd15_512_sce_ctr_hed.yaml | 2 +- .../scedit/ctr/sd21_768_sce_ctr_pose.yaml | 4 +- .../scedit/ctr/sdxl_1024_sce_ctr_depth.yaml | 2 +- .../controllers/official_controllers.yaml | 20 +- .../extensions/mantra_book/mantra_book.yaml | 1278 +++++++------- .../extensions/tuners/official_tuners.yaml | 320 ++-- .../inference/edit/stylebooth_tb_pro.yaml | 2 +- .../methods/studio/inference/inference.yaml | 11 +- .../self_train/edit/stylebooth_tb_pro.yaml | 376 ++++ .../methods/studio/tuner_manager/readme_en.md | 2 +- .../methods/studio/tuner_manager/readme_zh.md | 2 +- .../studio/tuner_manager/tuner_manager.yaml | 11 +- scepter/modules/annotator/base_annotator.py | 1 - scepter/modules/annotator/canny.py | 1 - scepter/modules/annotator/color.py | 1 - scepter/modules/annotator/hed.py | 27 +- scepter/modules/annotator/midas/__init__.py | 2 + scepter/modules/annotator/midas/api.py | 1 + scepter/modules/annotator/midas/base_model.py | 1 + scepter/modules/annotator/midas/blocks.py | 1 + scepter/modules/annotator/midas/dpt_depth.py | 1 + scepter/modules/annotator/midas/midas_net.py | 1 + .../annotator/midas/midas_net_custom.py | 1 + scepter/modules/annotator/midas/transforms.py | 1 + scepter/modules/annotator/midas/utils.py | 1 + scepter/modules/annotator/midas/vit.py | 1 + scepter/modules/annotator/midas_op.py | 1 - scepter/modules/annotator/mlsd/__init__.py | 2 + .../modules/annotator/mlsd/mbv2_mlsd_large.py | 1 + .../modules/annotator/mlsd/mbv2_mlsd_tiny.py | 1 + scepter/modules/annotator/mlsd/utils.py | 1 + scepter/modules/annotator/mlsd_op.py | 1 - scepter/modules/annotator/openpose.py | 5 +- scepter/modules/annotator/utils.py | 10 +- scepter/modules/data/dataset/base_dataset.py | 3 +- scepter/modules/data/dataset/dataset.py | 6 +- scepter/modules/data/dataset/ms_dataset.py | 29 +- scepter/modules/data/dataset/registry.py | 3 +- scepter/modules/data/sampler/base_sampler.py | 3 +- scepter/modules/data/sampler/sampler.py | 1 - .../modules/inference/control_inference.py | 1 - .../modules/inference/diffusion_inference.py | 5 +- .../modules/inference/stylebooth_inference.py | 2 +- scepter/modules/inference/tuner_inference.py | 1 - .../model/backbone/autoencoder/ae_module.py | 3 +- scepter/modules/model/backbone/image/mlp.py | 1 - .../model/backbone/image/utils/clip.py | 6 +- .../model/backbone/image/vit_modify.py | 1 - .../model/backbone/unet/unet_module.py | 1 - .../modules/model/backbone/unet/unet_utils.py | 6 +- .../model/backbone/video/bricks/csn_branch.py | 1 - .../model/backbone/video/bricks/non_local.py | 1 - .../backbone/video/bricks/r2d3d_branch.py | 1 - .../backbone/video/bricks/r2plus1d_branch.py | 1 - .../video/bricks/stems/base_2d_stem.py | 1 - .../video/bricks/stems/base_3d_stem.py | 1 - .../video/bricks/stems/down_sample_stem.py | 1 - .../video/bricks/stems/embedding_stem.py | 1 - .../video/bricks/stems/r2plus1d_stem.py | 1 - .../model/backbone/video/bricks/tada_conv.py | 1 - .../video/bricks/transformer_branch.py | 1 - .../video/bricks/visualize_3d_module.py | 1 - .../modules/model/backbone/video/resnet_3d.py | 1 - .../model/backbone/video/video_transformer.py | 1 - scepter/modules/model/base_model.py | 1 - scepter/modules/model/embedder/embedder.py | 3 +- scepter/modules/model/head/classifier_head.py | 3 +- scepter/modules/model/loss/base_losses.py | 4 +- scepter/modules/model/loss/rec_loss.py | 3 +- .../modules/model/metric/classification.py | 1 - .../model/neck/global_average_pooling.py | 1 - .../model/network/autoencoder/ae_kl.py | 1 - scepter/modules/model/network/classifier.py | 5 +- .../model/network/diffusion/diffusion.py | 71 +- .../model/network/diffusion/solvers.py | 188 +- scepter/modules/model/network/ldm/__init__.py | 1 + scepter/modules/model/network/ldm/ldm.py | 1 - scepter/modules/model/network/ldm/ldm_edit.py | 302 ++++ scepter/modules/model/network/ldm/ldm_sce.py | 1 - scepter/modules/model/network/ldm/ldm_xl.py | 1 - scepter/modules/model/network/train_module.py | 1 - scepter/modules/model/tokenizer/tokenizer.py | 3 +- scepter/modules/model/tuner/sce/scetuning.py | 1 - .../model/tuner/sce/scetuning_component.py | 1 - .../opt/lr_schedulers/define_schedulers.py | 3 +- .../opt/lr_schedulers/official_schedulers.py | 1 - scepter/modules/opt/lr_schedulers/warmup.py | 3 +- .../opt/optimizers/official_optimizers.py | 1 - scepter/modules/solver/base_solver.py | 3 +- scepter/modules/solver/diffusion_solver.py | 33 +- scepter/modules/solver/hooks/backward.py | 1 - scepter/modules/solver/hooks/checkpoint.py | 52 +- scepter/modules/solver/hooks/data_probe.py | 6 +- scepter/modules/solver/hooks/ema.py | 6 +- scepter/modules/solver/hooks/log.py | 1 - scepter/modules/solver/hooks/safetensors.py | 1 - scepter/modules/solver/train_val_solver.py | 1 - scepter/modules/transform/augmention.py | 3 +- scepter/modules/transform/image.py | 1 - scepter/modules/transform/io.py | 1 - scepter/modules/transform/io_video.py | 1 - scepter/modules/transform/tensor.py | 1 - scepter/modules/transform/transform_xl.py | 1 - scepter/modules/transform/utils.py | 3 +- scepter/modules/transform/video.py | 6 +- scepter/modules/utils/__init__.py | 3 +- scepter/modules/utils/config.py | 16 + scepter/modules/utils/data.py | 17 +- scepter/modules/utils/distribute.py | 5 +- scepter/modules/utils/export_model.py | 3 +- .../utils/file_clients/aliyun_oss_fs.py | 22 +- scepter/modules/utils/file_clients/http_fs.py | 7 +- .../utils/file_clients/huggingface_fs.py | 7 +- .../modules/utils/file_clients/local_fs.py | 7 +- .../utils/file_clients/modelscope_fs.py | 7 +- scepter/modules/utils/file_system.py | 11 +- scepter/modules/utils/logger.py | 1 - scepter/modules/utils/module_transform.py | 1195 +++++++++++++ scepter/modules/utils/probe.py | 25 +- .../utils/video_reader/frame_sampler.py | 1 - .../utils/video_reader/video_reader.py | 1 - scepter/studio/home/home.py | 1 - scepter/studio/home/home_ui/desc_ui.py | 1 - scepter/studio/home/home_ui/guide_ui.py | 1 - scepter/studio/inference/inference.py | 98 +- .../inference/inference_ui/component_names.py | 10 +- .../inference/inference_ui/control_ui.py | 1 - .../inference/inference_ui/diffusion_ui.py | 1 - .../inference/inference_ui/gallery_ui.py | 1 - .../inference/inference_ui/largen_ui.py | 3 +- .../inference/inference_ui/mantra_ui.py | 2 +- .../inference/inference_ui/model_manage_ui.py | 1 - .../inference/inference_ui/refiner_ui.py | 1 - .../inference/inference_ui/stylebooth_ui.py | 97 +- .../studio/inference/inference_ui/tuner_ui.py | 43 +- .../caption_editor_ui/component_names.py | 70 +- .../caption_editor_ui/create_dataset_ui.py | 111 +- .../caption_editor_ui/dataset_gallery_ui.py | 1572 ++++++++++++----- .../caption_editor_ui/export_dataset_ui.py | 14 +- scepter/studio/preprocess/preprocess.py | 1 - .../preprocess/processors/base_processor.py | 1 - .../processors/caption_processors.py | 1 - .../preprocess/processors/image_processors.py | 1 - scepter/studio/preprocess/utils/data_card.py | 835 +-------- .../preprocess/utils/img2img_data_card.py | 511 ++++++ .../preprocess/utils/txt2img_data_card.py | 418 +++++ scepter/studio/self_train/scripts/run_task.py | 1 - scepter/studio/self_train/scripts/trainer.py | 9 +- scepter/studio/self_train/self_train.py | 1 - .../self_train_ui/component_names.py | 81 +- .../self_train/self_train_ui/model_ui.py | 17 +- .../self_train/self_train_ui/trainer_ui.py | 469 ++--- .../tuner_manager/manager_ui/browser_ui.py | 886 +++++++--- .../manager_ui/component_names.py | 65 +- .../tuner_manager/manager_ui/info_ui.py | 263 ++- scepter/studio/tuner_manager/tuner_manager.py | 4 +- scepter/studio/tuner_manager/utils/path.py | 16 +- scepter/studio/tuner_manager/utils/yaml.py | 19 +- scepter/tools/convert_tuner.py | 137 ++ scepter/tools/process_watcher.py | 114 ++ scepter/tools/run_inference.py | 1 - scepter/tools/webui.py | 1 - scepter/version.py | 2 +- tests/modules/test_diffusion_inference.py | 68 +- tests/tools/test_annotators.py | 21 +- tests/tools/test_convert_tuner.py | 58 + tests/tools/test_inference.py | 4 +- tests/tools/test_train.py | 26 +- tests/utils/test_fs.py | 14 +- 186 files changed, 7505 insertions(+), 3117 deletions(-) create mode 100644 asset/images/edit_tuner/cat_512.jpg create mode 100644 asset/images/edit_tuner/depth.jpg create mode 100644 asset/images/edit_tuner/depth2image.jpeg create mode 100644 asset/images/edit_tuner/detext.jpeg create mode 100644 asset/images/edit_tuner/hed.jpeg create mode 100644 asset/images/edit_tuner/house.jpg create mode 100644 asset/images/edit_tuner/image2depth.jpeg create mode 100644 asset/images/edit_tuner/text.jpg create mode 100644 scepter/methods/edit/edit_512_lora.yaml create mode 100644 scepter/methods/studio/self_train/edit/stylebooth_tb_pro.yaml create mode 100644 scepter/modules/model/network/ldm/ldm_edit.py create mode 100644 scepter/modules/utils/module_transform.py create mode 100644 scepter/studio/preprocess/utils/img2img_data_card.py create mode 100644 scepter/studio/preprocess/utils/txt2img_data_card.py create mode 100644 scepter/tools/convert_tuner.py create mode 100644 scepter/tools/process_watcher.py create mode 100644 tests/tools/test_convert_tuner.py 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 0000000000000000000000000000000000000000..afac5908019d7beb6b52b8e63f068be38e565694 GIT binary patch literal 92386 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

w(g~iEUatph;4yKN|VR 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 literal 0 HcmV?d00001 diff --git a/asset/images/edit_tuner/depth.jpg b/asset/images/edit_tuner/depth.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d632883c920c00fa035cf6a4c586d56a3520da2c GIT binary patch literal 67826 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 literal 0 HcmV?d00001 diff --git a/asset/images/edit_tuner/detext.jpeg b/asset/images/edit_tuner/detext.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..6ddb0d3f412fe0045f447493a735dc702b985078 GIT binary patch literal 27772 zcmbTdcUTi`@HV=kgCHV7A@nK%3nlat1gX-i0*V3x3B5^^CL)SdsYXg@0YpHg7X?A8 z)C2+Pz4t0DeCzxDzH_eY{B_P*u4Fe)vit1pGjq?(J;TMw#WZk5OHES^fIt8M0{#IP zV}J@kML|JHK~6nxeS?eVCNCSCpcMS3 zh$sSq;JhKDAT1_;TO1+w?;;RtYHHd`w9IsL%wpVZ++zQqw~Ho#fr(kAt5Crr=X;wrnv3*Fn)m>f^Z>(grtcRa<@`U}{}$~3Ar}KE7YP{|DH-KIxgaDy;ER-jjGSAP;_6)k%BSv(JYu0#Q04fn zvLDpE;)dHy)*b^i*Z2@K{5$_d`%kj}cY?kA|0UV~CD{Kh*C;?s3IP|7lmS2j+u?8K z^30yT=BZa5fasH)wO4wKMweSm$=lj|dqzEJDvSQ%@d&z{@1&UMeCKnO2WSS}}_5gMuJ^Y{G=QQ>jVamZJAy+Sg{;cEgBL!UIaE=fkH$T?fz3%GkKtV}5AKu9JLOv< zKCJZN{WnP*YUOomNY_G{Lo!;Ie z`f>KguGcpn&j-uy2d^*eLo@&US{D3D+8g|J^8#3kKU?`f2Wtb3<-`33=NaE$zT=Xg z`=66jPKExv$T!wgg+Ox7KWqPUa>;)uFB7}!FMtg7y;Aj4k`o%eFL$un9j5;?bLPL9 zOOF@9nXSMta%KHb3~VXWgY6y#_lc_?J{vyUlUU9KuL!^VZ%*!!y~g!l|NS0W?h?H8 z;cTt{0swExNH?Q#0{W0VR)N@C%emW4^vZlv1I}u{SE?j=>3j;G>UBU|2A_u;^69^E zyM%Q!&b{toe{gt1WMvI}#xL719m;@r{2}+0ujMbD58adRNvsb_^R6jNmzL|Cw`d;v zsc*y9dm>M0qDJz;HNK4ONI1nMbOmo>)}kZ*jh$^X5{<_-pQ!`-wD( z^M;#HZwZ+<{>CRSShr^N70~vZtzTz2P=ZGaFXhPWmDKq{e2+?{cAN{sOpR6_1@m42 z!=;uF;$1b2Y3frJZsZ?JEKbV4xwR_7%;6Z@JjDD`=l+#T#Z68Ggb;-mz;H>Y5aqI6yun@#M*v=3Y{wGcF`CdP!*R7tIntXy#S#SLu0fqIK<#?x5{i^mf;Q z&8q)CcUqPU8xz@F+Wca}R(si5M>{bfbK!9UikU=0==u^FeF0gp`Q8P+ zm8e|+f%HaM!Iy&~0Cj=1BE7Lam`AaH)ZWiahM)Sul^cvwHBT~4GR-r=+L(YVv!In^ z7{Xj+C`1^N{daUV*SL_0Tm!35=E$zadzepa)XD|pEhM2a&?5=C!nL3O>M)Oq>qMV~ z?6B|}5)BP7YR88_xeg0S?i@q=QL2CjNvyfsvvpjmV#Tx|WM-!gelMaQ57Fhc)F*k% zicepZ!sc=s=#uR>VaX>4>&J#dG>8nxco079LKp-5@tdyZkBILyGtq#QR6*`Iv7)v; z7@xvhi>26naXxduwrTCe@HNZYUEVTqBp5B<-j4QRUQ-ji(kJ?ja!KPEZ>4mkP6aSA zhmT8AXw)+NK8VlN7tMFgLxkruA@FnnqM)Gb)c6$)1%+I?gHP?Ce`<6E^$G@*48&?h z=P=oVHjfrpVlo#B&z5kDv=O`jctQj#?D5&Q5`Kxs+7%GZ_c^vjPL+%_PmFB~J_wD` zyiE>;{t=SYs`_QX1gbz%(faEjN7o-k7XV|S?*)*IJQXRibgbfd9HGk) zbaLZUvrmPS=*v?z(d z={$b@9X!{4a{++sn`x6^D44@WNHqK0C+!hxSb!@igc?WrN5-p4sA^@0uw~~N=zta~ z2vL=%F#!!Xj*cXkB#l8;9iOWc7HiL4oAAmro z;mW75IQY?70R&6y-Xq9y0VHWIWUBlnG?cHL^plbhB6KUZ_)dZ<4#K_@l;{AX?*`*` z8C(i+M6VgAsqxuRhK0bwrqVpkLwoRv+U(_D@(X}tZSST`=8^|oK{Zc0oj1c@ybZ1y zq_R)VXw189yx)rKOlYu+YnqrtQwXS0P_=)%v!JkAa{9atOZkMOIpr7MwXvon zoIPi=!%gYg(95D}_M|(wjbJS?K|YS9JuKPi)Wo?1@7ZEp{3_~_5zxxbu^3kczZ4h@ zQ{py={iY)vv!55u?TQ9aMr+zasD;AtXh6-Fzzj<)!(GQxX-Ke8u0X}-Y(_SIQkOp2Kmt^P_uIZZ0^ds1-HLl8QNOvymZ+N9iska>3I0k zT=)g>*74-L=mfS|oTG6TPRgt_(x)AUnK^Tf{UUt<Wl=9eL*OLH6}Fu0vRnnk;qA?5Q_iIJRrY(GETU~rI^vNk{5N=4~y=o_EHYZ_>v z=zMA@Lj)P3PuA?vz8&c^YV1Y2TkvCFHJ_yAuh}k+?3af^qmWx2a^hS_q;C}|%r{m$p?AkgH6HdKCAG_z)9rm9P*B}`^kq`%Ht!2-wu0Apdt#PvR*5| zeFE?hx}Q^fKTwJTcYMj=uKvn_@DP@?3*Z+$KJM2Apslx{hN8xjiIw{5E$E2=CEIfjZfM4skMDbG=yT36v8pvra3%rr$KbL( z)Zr1w-!({We*zB&)&(K!@6LA&zMhESk~kvvaB&KHOG=i8^u;3YTAs5z=c|Nz5$6JTFCp=ePR{s1u_0DIB_}Kl#j5qjuMBxC_ zX{|q-jC9_3#W1HN>bXy;bH;<|Kg;kr_brVEqtIN^mxCcjstOK}CgZRbZRm~?JrmC& zreYfo>|p%U{`+R8aHcRjL-5KrYBsf!s}+#;)CCM_LB*vvr(lLIwBwVMj|6f}9*_5v zsw>bTZ`9@sWgSZJ%#8_={z{+ho{<|`MKe-`<)9?2 z`NM-Pjg|Ne_cMVn8sNu}j{$^UADht5V;wg;ml2;`IXBKWxq2*bI@E(~7qTxLe^wN= z(|8u3?cP+!c|!O6s_65#V}&2|6#RkUbPo>6_QSx={o2@LGxC2ShOu|vKTS}fT}+a- zPE!|%qlKMN_|Asvl0+J4kV6l0Nh95`Dy{NHrWt}D0+EZNRk1d$3aSXBp-_5~G;)Ly zxbQ};B1Ua+;Gj^A(*F%7I$p0*gpZ5?pFtrcLYb#kyPS!P3zR%u$F z?8g_6%XD%*3KxLvTMGr#3?@AfTnOKubPI|4H-zM6YHmHW(ob6w_}EuPryyvE@`&{G zX{04-A2JCcB-+kJ*j0a=ksU${8I$1o6t8{k{v)rGvJoG`9zxHPUU$=mQi4TBK1`SP zdm^xvFm8C|?o8obGPlfPcoWOCKB@R$d?2X$7T7Zs)zTs|3E+0}$%o(A97sBYd*tUs zfse6XoaSa@ZOlQ?p&&Og$`VxGb(x6-ZJ@58X)zV=-U_#-R6<4lJOsUJ_*-0p?#%#* zHs4$x7tCE7v8$t|1Bejl3rq0y=*VuY!4W}JZs#k|RISBDLy#T^BuSqFHV5VY!wffcO zpEh=Hg5dUUS9bY}^Q@5X-rY7?4ml#zFW>PC;OF<{!@W6Vo>!dIucoGPHo8A-QL%d) zmcucZ5o={>GqcD%za5`qPGcVlw8y>-sS>m%muX*nhrA80DmZVTbQz2p{@L|G;Wf~% zv6Kbio?M;=h@*+4i85+)AW?!hr_#yj02(5w8C5k{1}u)ABo~4f89Z?6CyP{|(|~Lk z#00`ubC0mpX1rzj(;R-#-=^zR#Tr=`K!YGak;t&3JNmbi6sbkw*%b+hh)<@GTmW8p zhOl_hyNnPiLI5SCM~GfNbeb)rElyaUWGO>B@1{jqY;)|by*T(9Bjb@Oz*DvipQt4X zWu#b&q~gV5fh2aIM>Iy)U2C9rRZz5%O`lW~@qu?TgW(wJ>@o;UiN-$FVvFyJWTCg5 zO}jGpQV97!Y0f$~amZ0W`xC_cWvWMRVOBT@Qz*OWGvtX`MmRc0x~v<<*%6d<{js2x(XD zZ>zKW52t)Yj^8n=zeD8Rm%5pIvtZr5mTKOgHrRae%<1RIL?Ab^w|brLjtfbYlLu0E z=?qO(mgeTk_DJrmt)cGrLC$Kd+NVkxf3}V#PAx&*>@+pH!29x$YnhP_(1Us75D3PN z8A}WEg*KTKUc-P3Oa?+HJW}Yc(q%T|m#OgP5WatkkS2qr1mH8O2*{ctpnw9hGelQ3 zfc$VMFjL)6^g0+@MPX@t0Us=7;RS%k83uoEj8+mgygfPHPu9e_bqkqrX0ulik(A~l zlOG<7I|1S?*skYw5RcCaLm5xock`*{+9$E($9iWKh@#5ig)FREPChbPTCi`zsy75W zceDaMAU%ZDOmo|oHV8*#>I zg~w=cwjM{4vDqZ~E8A?c8P10uwMw~jwh00p`b2@V!av&Qdum`9VLMQhQKa;<3v$%M z{b$%OkMFtBv5|#~9MKpclvnB8>xplk&1kaU3QA%zI6om%(^K4Up8U<-e)LH!2aF&r z5O~yrda+38ni4~ru`Nwp!2yox2usxqe--Ixu%^uu!tAaskfACP37`;dh&=-g@DwK@ zPoNWlp(66633ObnLn%<~6T3Jz421-7r6i?U24?<+Mb4_)L&wwbyx9@A{gr-w&6by| zO_Orm{$w~IP0rwPepbqzpvU1of@fcGn_BbqmZqFhYRHIHom_P(_{~rX3*DAl$>;z;Q!}K@199=8%)YkP~AS ziVQj~eu_k!68OsuMO^4rI1|s8eI_cNG^%|Z*)*ITK5|q*F{R}@w(LNnPj81ft3HZd z(2xGUzp1cH@}wuWAy~*twB7yKScbje%z?y8G}istsQP3U+jnYgfBp%`46a_g>xvHJ zJsqq)I(J}^ya1jcVe);Ydj+2R$Y`<);44yANz3ZH(g}@x_mRwF@U}o+p&KRmjX#NlJ*ZM;BhCBPvgI-io~zz@cHYLrY@Dh zL92fisU52Y(9dZjatWGPiZp^o9wOr3Dl+KuU>qQ?Q&r_7pMtTQwgk5X3ziDRdOsYD zLWJPnBaN3L3E}k|#R$q{1WDvxkCA4oN{sw{NL5kI#r6hZUe(l^E!Dln59;->JGNwG zj@+Y&CM<#2S$bVIXx?CDq39t~MH|nm6m#3Onx0nP+*NjaF3tm9(9BRmlL>p;1|ie- znfVuhd692Z&`PS81MB{?QrU>ppSmZFr28@t+SF$Zv)Z8@6vlz@zb$4%;!Em=k%B84 zlr(W3LfnS80C}SjaDlPZ6!1BwD~N3elDn~5z7kgy2e;etaaY4ObSX!3$OvKjWY|-q z(8Gcjqc9kd$cgrKMZb}dmH@O_N7GnGv*~o{z;xs=pW?7U1?Gk(`!@{Bp3;J)GP)>M z)W;U9X6D^q1ybB|{0e*m1{x>ht{z9=6S@^&W>0OYZ50Fe7dg>V0md>M`}X7gWMkh7 z#ubp}5sLdRN9XWR$(?1StbCKKHFkpNu30}CaziZhuIA#o5D9V66#=O#?vk!!#rHL6gSl>qtRsu#{n2x?}_(-#V1Ovrntq-bUf9 zdGgQwaj9|bzze|DMz?=|MM4KX+6#w?^UkE}QW|D-aUUmB%Sl1{j%S! zO}%2c<~@|8U*%##A*w}c==!y})81F~eR;+*rB4X*0r_YP?!?=+l)MUM<0hO}e1)}t z7f&9kIZW5CRU&`a?(_cD`$m)fWVTO8AVET6p`t2<4%%U;D*em_`}@W35tThPRCc0= zy9W8vP+WrUrovyWzjX*}f|`!pb}nBa97sDcY-cMU=Wk$;Cp1pPNbqGgnQYw9O)(zi zstkkRteH|@bx9cKS&zfa>@fqG#Vj2?HzdAZcK?czC^Hkpw-Ve=HX2#t_DHP4AyRLRfnEr3alH zASIp#75fQh(YfHZjYJDJJ0-4lerVR|VkQ=6d~Wcu^N+>pQWAO$A0 zEndByGxW>!y(pqe;P8%iWaaF0PTQ0}4=#YY*99xlA8YiE-cXeIrX@H_w;{dS_gg(w zgNQe5zf*W5XYOof-Zd5PF)f#=Qdt*r^DF(d{9?<%AC@2k4BDl$Y^*6oa8zW!4^`@f z4!+Ey$TiZSR+Tq?LI}m)%T5y#K{fT0Wv9{I1GN)~GYVIulm534`G+L>q^;64Pta~? zz?W13aqOE4`xxeH*;u9WJ`w|nPyYocPGSoyz+OqcnsU&8F?f$q26FWpYWUp#?PAN=~%cK z#PgEQ)b|gdo`m$~UT-3;{C2lQ6zewvW^yUCxD8xPLfHy{O z?V(9xZQ#VOe5Rf)j`Eyu-;)Y|AtK8@S)_;clOUVSZtZZk_N&^hG0nZTyv(TJP8cn# z*kY75AD=iYz17A5VG&IK#i@&HXtDZzU4L*=<4>*$A7w&%yL{U7612XnnxmnnqOBFd z)%EtK{BTkdb?^O!*rmrU+nX~(%{w1`L$llt6%pK=+p7*tu*Cr{st%LjLPH4W! z{&uAQyRTI~`8_{tuhe~_fDLx{zS3LSJyjl#!Bq;ud{XUv8YL|{d1EwcHuNfu8;-^e zOBv~gBh{qgfud!YK zP*Zy2#N?WLOr?$1U~;>m&QG!+R*7_nYC2h%0ZPy4<&IryvUuz*t?B7K%TZp98H4+x z%fR9{^;zh(VN;x=ty~1(FzXD}G;u0ogN7xLsvz&S!>Vk5#joVp&yzeOI?(#p*FB@I zd=oC|uV539UF%($E2LRd)ox zDm-Kj_vcEYY;>NkQU~u@mE*VsGbv0;@j5CCUzb)k!%?l3z1a13t&K2bGnp z@yaK=$=(iD8EQCvOqd&#SK7EX;F1QpXRAHq88CC_)tDh@QRy0y+-?45&*q9%Z%f#g zzY1gjx*@$%|IK(iKhjxV0mp0|QW379@YRvR@$Kyrz6_(3_;-w3W;%g5d&TC(_X!BQ zN-jEnmfRkIZ6H!y%>hD%n@vHy!b3zgBMm`=5W!&#QMFhy1VKv&fdNoB(R@Y&uwKKc zEszG17gq>+B+02dq)-Fpqg*Tn*F@2S*b~&baB0LjYSXVoc`DtdDY!~+<&l&6Q8A&g zG@}<8`HkN37LoNp<{R==yW4EFge5|Uxaj^D)>3}sMOf&bT~+B@--w1MK}mf^f8VBG zvWX`2o$#FNm@A<3BCgH*ixvest|oUJFV#a~=1=nVxtpd3vGc}=eFRmYw4q_73LAVC z1?H$qm%(%d0nwe-=WYgBDu(;t|0OWS7SSwN>emXWrdab=M&W=?jp1fN>um?fY2hV; zr;b1>P2XCp=gGu04X=L0xD@Yp@dw)x>drGNVr9?jS4~M>foB{agR!5KOsX3POY&oW z-|uF7Mbpl^Q+mH&UhWx3bad8@iI8&zG5Xy?;;xY|^*8N`%??4rxJ;4I(Ei*X2msz}o57HlKh^_`S8Mgp-4!__0fce6^xwdsND~ zFI&|Mk6OL_T|V+Q@xBMf=x@HOI9aR+o}qj1V^3Sq;N0}%%u&($Q0BpY&WlOwO`&h> ziD3lkVtV>zk5vOJ^DKsAx5QC1E>Y6V?x4zVc|Sa7PODzdznx8s%W)BL(+m10WJU6b zfA}!Ef37>d^AMOjF|1K2@x5HPCs3uYLd;npo#LzJO!vM3=$v%Ri`5+kZ?QQv>&lXd z$$SFc6<5`}S%q2dZm0S;Mp2@qCrf*!27e!+o`GOQ)!ZF)>La1|h-@OMi+bjZgj}la zk6q2j>FVa~-^+C*O>STJc&{8sy-rEFQ>yH2*vrW>QRyYyO&U+2M@P)t!)s*U){cD*)*47XaK=i>yw z8I7AW0&Q%fGW@liN#a`gw<%sLFzM;_O*lGr6H~kQwV|*;I^K3qe2;=GwvVY_xy6B{ z^JF-9=f)4}h1+HMW7(Zl=d10^-C@J|=6gjbO@kKN*jbs98gvZGPQFMqKGqU4l2FlA9;)@`NS^g-E0|(m@z{f(`|N2@==g3E{Odz{Jg_I*^F# zAm((yOaq^TSVW9c2ri@G;;k%LvdX1LUpcoj@pT=$0=$j#X8g~38y(k6&x$@NlYMqy zYbs6esVv@AXsG_HH@Nh_1IRDu+*8@*D}4Z7%&8 z^ClkJ=940=TVx137%)ItC6B>CY%^%?cvzFC`kLO9|ekD@>&T$%%wIHN(GxR@ct zB*BHC0wcD6c|L6%%vatzn<5cLrrD1tklIID_LHvM#n~nP3+6%#%Ky0@igZjYq83ZZ zs3Q=mqD?jbwEE@U6T4F1`z{A58U8eg>t2_;KD{Kr+X91Rrbf=n zKirAX8F*}QUz+@P$Mjy4;$nmPPsN+RU+DPmSy_riosa0x7zdj-_gZ}P0<;LSgP*bLPcMXUhy_fnR6Y#+c~pE z#TG3v(+GDmZp841>~s&7WM$^pXLn_eN`B2$HvDpSXI20Cwh_f%7j|O!DZ5H2!Flz@ zo8&G1#+t^svZRyS9vYl8M2Tf9I&ai|DqmIoj|a2kHN6%YuWJb|JPl1c^YbS*+Xuzp zB=Q&`FsJ9r*X~J^*<|(28T4f3ME7#GeHW~8Wm}cn=^~oHQh$>nxwE@8mDxS?DB`Cp zWkc1nhcD7s;zG;PYgf`dBfrh2v%)g6(9>^A<{oC*5e1a)8vTXM*#52*^fK*d ziTo2-w4p;CW#99sT&B(6J@U`PVr{-re~z7*zNqa-56aPk?XKh@^PDP=?B30NqkmY- zX_qeFJ-sV#C9#5W?uOkXXh`~XOBS)Q(e9lLJ*W*t>Ob7T9S<%EO${1*WS81(EZwWC zxVeW*rE8Z3FyOmE4#VEH|1&vEDUUT|tjBAbTBKCw zr)43Hne2}A8eSVMT6~QXjD4|^$U@t}2bG5mWLxnpD|vy4kWihLnUZq3hm51PQ z2=h{8ulu6iK#Gw3lKDXLrE)Gq=FD04)uE5L57&8Fwqjll9ldSHb)vN|p*Mf0La{Ix z{lIUN@4#_o2i)rdzu`6pwF=da%}XfJo9PGNyem^8SrNiT&S${D7Li+GNez zW6ilK63Pr6-QN%O=Q}93Gp+LdYpSo?DDe3``cpr6>+z%J$u1EejV03BCiXt29$hD! zxZ*lZo){?&cQDwD$@ivVq{kf5)Hb^`7u$`k9HkT!V^PAfhgae)1gwwP$#-7rZ@18V zS$@9RzJxg;ozZ(+8K|f89=;`zVtqa|PoE_*GvMo?id;!~KJ;!}KBVz{FKxK!g;b0) ze=1)=e`YPh<~Z!(;IrmCg?c~BM2Aa8a)UfX$Bnq+SJnTT>dSx?sb7qaYg`Y`79T4$ zGwySN^(arg@V&qBEaLrA$BT6~pN&M5=gQTPH8pfdNl>_#{|fRTbFK-dT6Ca8bVoEhK2=YOd z_@$+#{$cT);Erdp*@EYeIj)UU@m6vl9Nz>*)P@jgM7WU+2~%|DWgM^exlC2dy5DBb z8q%RH(%M>TKCkgQuvJ*?96d*_6oM?;%iDKck!yL{bbI5Fbd zJuEoVJ>6)7c`KRbpO+tGYQ2*w^l7JF80Iaqap!09Yfu9(MKe|5%QX30pI+7z-bb9OMOu<)p7w?XdWyqJYI5)N&a8&+y zIBF(axEjkHaLUx%=?&$@8|b|=t)^W3{#%r|TfJ8tFec}~=R8y_(szm+D(APj2YDsw z&Nyn5a11eT%eB3S9SFi7Dc3%EziJj=wskA*rtqgP+fGtlU&qkN3A~r7%A@t>DlPy~ zOIq2N?cBS)8271liwodZhvS#+rFYz~O-x}gzCMo`(^a%5s=Nix(PNI*CUqH|(|sg4{dVDG3P%*;OA4vnTaD zZG@`i2fMx^T@&ZyH(LG3lk0=?ta^MLC5Jw;yzu@(xh=z#=QH<6>yYJ|Vl z-k2OlrE$=`INdJ)nIdai8R%t#VVNDd?zT| zenFI&5jGHi1fnT2rI5QrhE2gY&5C@VQ*GS(SH>UDTuZplfuo;u#41eB!&*Q#_(d`T18%)?A+ZKE| z5sw1>ssV3jZjTh=L$2s?t^gPlYmnz4#s`#|Fj|5LAQA6=*HtSD0~r2h0eveq7Qj6H zpFIiz29KekAb1FX&i3JenzxJ|R&UWUH*UkVw|3$Z=jd&{Pr>3A!&hxGwT`=6EL9Z7 zFDDv=QU1E~MdoZxcYN31L-g;ErF`A|0hwuZxo!MDq6lUrQ`VN_k6g*qpzkqggjFtI z0FH?DJu4Me;^vKTi@)y=I6!tX3g%W!+aBqL_|MZKu!MgA5O^DvSOH9fs2~ne^9*lTN+AZW4f{O{{z- zda0PK2j11TSOn#G!0_GbOZ$yA%e*1X!`-c>wa&9o2R(Z~u0#j<$;A^SGH@WhY3i!A$b__>zTL+*s5spC1))L7mur}shmP&Uy|QpLo->P3a+Xbo~@Et zo81u{&-v?rU2%ypgvHF>e=F7D?*=df{*VzfLvyyT{uos8qp_b?`_Ge^YC)eA9Kfa*eh`NzZ+{9J0o@H);6{*Cy3aizB)r)#Wjvkfr?2P zyW(Yh?@@Or4z{-L!39@kOcqVmlB#n5?rtjDkwVgJ8J1gWh$dMiZ4bn9)XpV0mzL?> z4;H@+C|ZhitOp9~4*RFs))6bkzmC*A+Vo1UR+C`%nWVG~)~c&JZ<=5$tPLn!Ip9c2 zr|INlHDwBtttKN%JaCz)3=_T_+L(+k$nE?zis1X$lki-VokCZGMkPWIZ7~xBJ}mD_?ou7kppDm9R6zYeH;d$#xdT_{a23C z%=>2w-2dY$|0R)h+z46~9f3rQ4Tm607ItpqJtM)N=65ESn|S<#6V5x_>@OCGCY7E| zPh|I*_G;RR{e7O)XV53g^L*NYe#H+i^K%>|z-HJ3Wta+Ge8^lMSFG_AmS<*0qxV(? z5h?PHKEdJewZ|LuGwS_2ju*hy$2mV{)96HXq+$IXpksvO+l5|+u0F}b+U(s2!%l2J zDY$=ji-Z&7_MbcCgVy3G@;b1Tws^bPwn#uc60~cOGJ-@aEoQW3d1_O!cKc9Yxw-VE zn3Y{T_Cxpk%x@L*cjk-@a^uemcBQ<>+7|+ou6N*dRF zxy1Z{a4X85sn6<9B4ygJeWBWF9yEMz(X)NQ^4qLxhyLytA}_v{`-bNy15=q!UjF*Q zd)6hEMG4XMNLWGF-L=fT=c;L*Dh^m$483_aNhEyiu69gLF(8@AA+xHO*p1GYOX08oDeRMB{}LLSiD!O@bM$=phjliR$+DB9^dT5=O;vzw z(3bGFU^E2QhV?Y8R050JxjY+r;q_mns)b<(4mmO}0y19KKN86qN&P&n!L7~FkXhO| zRLgmJxf+)A177PqxTr=Mw(NWgJ{PJR7gsUYc;UPZT6XuW4f_vip-z=9WJ}) zC_N?YPQu!QljM(38rqVwLN>@`or0dJMwU-`gePRToHRt?drgVj16KjNtAk{j9^D{Hb0{h9-3Vddr%kgdl6S9MZ$kUz#G^AB)Ms8f~sNgdi;3{0l+k=a1bGUAXQE*}Durn{xYSzLu=dr-&VE z1_CIkx4G6>U4(U>=WB9bPAjc7CuikpA$mc753@5>w`hAWExED#&=!_>St4)aP+bqB zQ3FFOd54giq!tClXl+&e*bEU*xaKYLpjMfoL%ONmss%YeEc3Z_;hF`Wi8Z%C(ekkC zzHmLT2+fBJ1#EFyBtst~^n({k$so1v*~ec_L2H882=(O()$ zaW80<4PmeOrxjczDDnG|+WI7hFmq)=2rdqfLH(CN=pg##=s<{s;}SG(BL2bUN2TV} z3Had9iV}>2vv)SYFZQg+pch(=bG&m`I*RiUQ<1tYJ|(d?lI|!z(Sp)sp$VGVmoBPm zkYUPXxS4h!A0&~5_PE<#R#Z>{WqDWVUeZTg#u*(bN^~mp8+)(MG=_7kbo>myrV=ju zQA^l{VHQlj^J!E#;Hd0$3`jn!N+zd9fYg{n9#-WCPa5Y?DjfADXa>YcDD86;m;pIl zd7U~4wvzyD1rdpCEbo~5CJe;_zZGt(1v!sg0QSXJc;_dz4bj|R{O0YBjjMtg!|tWW z;p-*53MF)uRGAu-g^iJX2Iu3aN66lKQQZA`suEkDME0@k1t%wg)Wyznnt_UKaQ+7~ zi6tZ(r?vZFA*20jS+c1{?4x(Dk%o>vX`B0UPg!~5%gd{xs4rvvmA*%R>aIxIf|hJslziOG=OJ+|45OnWjMdj})a% zY<_!Af1;4Bloz=*7XLSM&9dzNyPrO(EcqYa+@lQN%0v&W}e@-Vb^psZzYIS`sCC?dTclCSzuv)v55i zdrsSHO&nohVe|2xWJ)ybge0i`F44Px z_T;Z%-e)7U*>#Pg#NsD3PDhH|RrtR=@FDrE!M6!1AHS+gu#|s%(=ni&?!4j+b9y;X zT<+ntJw-jcoaIXo-kV=ZAiZuZ8fyoiN1w4pM0wpRXCdl|9D0rZJbBH=*^Zfg?;v0TPG|;?{`PWO+ zWlq+PU&PSeM!k8C^3>^p0_%7~18o3fV-zh~a3%7V7+v=+&r;mmgtN7Q1_f{2@*%^w zSBlRD!xnCkC;F#(ojLaWDV{UolYj3mGowxzszl8HmUv*wl-TOxnH1$Qm2UI!ksplk z+&&NYjj6?6(Wyk*vyXjSD5k7rrOvV$WfiR5CS!7V3Zln z%-*?WIge32-&papeDQWS?C9y^be;+{)KdkgxA@wfR0)0-haYtP?yUlxlL$=WKwq_ELCBStB7a8Y=!;|c%&j!_I}2ZWZX6hhKIT}@@cw$IEc)TSC+)Be?g$St(8nuQ-uk&k z_vZujbG%qtyE_5dTakI6#(B=QCI+T*608+N6ukFZ`|R^|_kAGY?9=U!5>>Ai^B~Ud zvu#pU!Lq9ye~NL0Y0@K)Ei=;UF88ydBq>+#!doqA;=c&}?vI{DU1uDr5Qj^NTF){L z3)e&i`V$iuzSc5SPQ>_*`e{r#kgcbFN?0MP@8K*SsoVQ~HM!*~AO_i3RZMdIDXQsO zOhw)8)U~Sc=5v*HZWtw%qG7;`rqC0UTc+6kku?mnx1;ZjJ;m-HaaVUv3Wsy#BuA2p z*3MnRmbMwT>(iLeoMUYJXl=c-@?z(pIyZ#XjfH3xR}z|!e{qkggsS|zG}7J zz%S>Y`GM84zk(T8vga)xXSYhJroQ+QVUTutE~ zhpT)Hmy(RBQZ?H}tK=95?e}HcDKc@ZugVy;78PnEtfbrH_W{`furGio?R zl)=@DMx%E053}N2<4}QP4+r)&%WNdd*uE>#>BhtZFJzu|OR%T+v(wiG9dee8W#1Ik zajFKHCg~S|XTX~g($`2a#&!S5H~Aj(zhnHTRoOOR$MLdh2=Ty$6OL#dCjPO{DX+9P zMHJ0Q`2qvgzbVr*jaSKV%!6r9Kg!|C`T)lH7H}H{7wqApQFcHORNKfv*PY9g)FyzU zyM^c%g;Qhk`lLFNX&@I*6Z4oCsr5c9^V}j(kkm?jwo~tv$y%kUFVBpiHURluQ#yeAsB8EPVPajEv>j=x^R3DPgkwtRuT6e9v~B zB?zql!gvCTer1a0j<$b}9idkl#o-Fv2GTd$O6^_IKF-E%Oa^|Odcpp)m98vZ$1m{` zulZ#Fx<88fgQpnpb-D$rpJ3m}q|NWfli%SI8SM}o@>BclQ_Ormv$w3>f-{Yol$jaf zdTshdEML9Xr=F;3ufnBhUb(yD#NW4~-;a0U{K)hZqT3tsb;+Y_(Q>P1;Tqlf;g5;u zMKccX4#^zy5h9{P9`bs6%HUA@W_aIS-Pc$N#Ny1`-JN1WlDi{$?@SNmM9 z^ESVR$y;$tNxf5E7NWO68H$&lM>MoSs-LO}6m;%{U{KVr~n)A z&OA$R9`h>*`))y*C+<4B%=XfK(uMqT_SW=r?mxn_nvYXRIdnY>O4saf;&qPS$Uk=|{k;e^Ush1iHsJEB z1H2&s{dSMWu(Zol5G=8Rsr;bNI(olKifRy+j+_Q~|9ow4<)qtUOfNX#u5ZkxsrNh19>2@rs60 z?aKroDvwId)V$NW7)L+E-nF#`h}vX%+R{$LJ9B_OwMOuT!YK^wa1l8sxbBp+I;{D1 zInS~(@tnJHnoHKqsSZhGN*36H z3o|rRPUHno)Si_+qqdzoG=PTQr`WGKt5>mk5ZYR9`3i|;AonMa(wS-H$tT$^GFU!i zW9#Yo)n4S<$7f?8g{^Je=j|g1eSpvM2C?rg43`t!Ofq1Vfcg>$t?e!}zDpSu3caMh zTLaW^Rn7cvZQ$8rG8FfDkKXw&%Nq(xklfV-3m^S|uik;yZ# zD2m&F>Kl*;@-^r>y}Y-YJ&Z2E%IOoo-~s+X*A1u>_SvDgJMFyYk?de)v&ck0z zl?ahf%5YTnAoMkQ1a%{D+WGmEjtTXsbc@UnBabkAp-)KxKXm^9pXplC+jM18qz(fP zK>q3V_BD-0?_;8pR=GHNgh8NV9Ds5N$f{0SXJ=&C=dRv_{VQI<4di}NUoEl7Ab@?x zq54y9^hx7$zsv`-9!Jocno>#Gl~yh4jHL#p6(qJ-HrVrGaJ`!x8ekRIboM!IVMQ$f zQs7jv*eIpqmx@3(lNA0b2?BxGZYe2Ck4kRiKmiofN@)%#0j8TyG=_j0X(`l)6bxyk zG^Ub(5}~>O08rIFDhsdmMu0bA1Xzz`9DWq42bKx!Ij2OSp~2`e$FCFsRFopT7rQ;B zu?GRc?b47ECK%{=G>yWk_ooBY54@)}WE8d0i;FY<@T#O$-E)_-{{VS~RmT3Q(!=_V@Z%Z)1NIt%|!u!Xh)eU%w&s zIp(+{EaK%-(k;>x^0N)i{{Ysmw@T95V6xrIB=axdcRwtDhpltsE!5hHXHu3+xR}P< zBgR>P$KWfTh5$U>j1VspTsKjlO6YZDd1CV520L{epI`p~U2{@fN|+LpBQtr1Jb)Rx zD&w#nO>@H5Hj!fE`#CI(fDvxIDbFl@y-%sENY-6a@+hED6d%Hi+uZxrtGjt`UMpx6 z%61ix91NbVT}GXz!Qq`L^&5e{K!0?AWue&wj_s=y$ z!#5H`s@_1%cu7Fdsa6%gadb6kVY%8o$z$F4j=#?oHD(E!)~*apNDsgAu*KczQOix<~cWO9VaoOK`muj^YEQbYZnd~M`Dd@yft z2P$$1Kar|>rL?+?F>6*h5~CHkkGe7I_;>dN(?H64Wu3gTg&0=gs}D^705Ev1YwNYP zb%p-`b#jG{`Ha~z@^ zZ`k9b0h-5`Q%3YTuM(tD+$@mAEDFb}Ht5^@D;ZlOu4_X6>utj&#D6j2iUOxTxaexB zjS82JMI-yCgI%=Uqh@kVYBH9SG`p&a4ru0#(q@1c6qurtfCGU^kwK)O1fvF*b}0)J zKnaRMDS4zc3~3bFeI)=l8KV^Jkjfj&mJ2{mt3u6vg!HY3uh{eJaFO)Ikbk!)6OZ{@?VfVaVwY_=IR5P$)btbx zZrWT^vb1qPSZ*mwnI%u?c=wwxA#u^uR? zHc}L(1ZSm2)j3`&7ZlMflEF((SjZuTIg(O2$DsGEIJNoYbcVv+n%ziP!w}mh>u|r$@4e3?O9h>A7+PjtR_iAZAK>wAKTXgxnSN zg^z~xi8Twf63ABx3i90a9@WfS-0Hq4*B0jXK$ek}E~?l_&>Z9I#w%oL^Gj{zUP>iw ziCswyP-7X!I`jHgRQFcamhWwyw()StyoQ*K!zcK$j2?q071I}?%_KT~UMK$2Sn{xv zv7;V~h{ynXaz9$x)31YQ#pEjN=o~z)G@N4~a0m1J z>!Z<@51uw)5gaoH;A3|j_Ule)QDRx?&uy$N++@AHsL1E8GB6M4kJhuT?xwTyZDq=s zXWG1DD%m6T{*}{3eI2Fz@glRt81Dpac#o*{6`SHK2&csBwOw$^%6?KiVv?6eQ;$?7 z!|tJgCO=if9$97r%M}LX`&Z!1dWcr?wZoEhT9Tc z+z`mDtH-G)0;^<6S67y4b(zYpNVeEm^isu7@~!)8Xl%4Mhs+U{2+VPeF5o#n{M45= za6@V5Oxv1vQygoIw%(-saamJb8?7%;x|zZ>vBbm%$UsTJ{*;@z(y@!8T${afP!h_j zmvBuM<~Rd9kL6J5+MVBp^(l(F%A!*g(2_DpWJdt zAE^Cm8K#PMj%Sa|nc~?h{{YWIhxBc@IrjIh439&fQPQq7MY>4X!6N?ZR39`(7_L_d6 zOGbrMKI9-^qXWwS0QIX0HPq;Z`Wv>&xltj<0H%FCKMH&5sck>l?+3{L04OXtK8G~R zB~^>;`^vo`R`MR$i2=uIC)$Gk>wandOdwFLOx!UW%EIIs7aqrf$ zfC9BHVTR_+oxv_*;iEn4HCKx5r?JUBSfZRL3r@oN)d)&Tc)>Kd_n>1b4L@l;1qLVn z>7WR)MhA0F+ex?HfmlGQd(c-D75AjU^`HWZFljzuXbS4%!m38^?bJzb}Q;oPkU(s+bCv7$>$j2sU?P} z2l|CS@F86s5yx!^NRhbYmLnwkns}9oKe}O$ab48v#u4SY#X54FxvX=aV${d{x{v$p zQj1Mf{(T4i_A8?@oDY$|3V1Ae5xB=)epZBTbBa#Q=)V{SI;q`eOxU|%N=gI#7@1g!Qzhu;Z=gI#7G5$5yoT`Jfulrc3 zVMmd70IEIYqw7&0)!D~=mr(xzpE*AC4wMr3&33$Kn z>Hh!DhS>gf_3|=^aK2A7kKQVUKcTC*@(_K=so$VBtoo(&OkXo zUc#ZekIlCP{{R!^zW^(WGSusF(1%WWB(S-=xhx%^X-+zw*xElsT-LghPvQ%R!t9J4 z*asm;Qhzc}<6UaH#R{WviWT4R91qM^ABi1g(k-Tk<=o{aY;yPmW`7UmT~z9O);X#| z(K4lcOM$r&<2wQV;0GV5&1z}R%X=(avF1QyZhweigZfrCm>rRyB~m9;KG%v5a>m8im8%#AIemh=>EI5)AkE$Mdbr`J;OVRbmmw_{aAM>c2|F z)$LU-@It6ZAze>F*c#NZcz(oTl2GrFf~i-PaxJ`Z2O*J<8R?9H z{VSu?U2 zOgu@cOB{B#f^6Io=E_0)xjZkmO>r`t32nx3EmzIsy6wmQ&H2`S#4yQs_NUzLa?Vdd z>Hh%gsn+bxpz1PtV=NVO^(XpL?P8Zx9vK+LgqF-xX6y! z>Ifho<_%LDn%ii|G5qWF@BKeo+VI-6w^Q7e8Bw^OeAP|z#j+r|q><45p;j*@Gq>bd z3af+io=88J6%00Q4cxNE#iE$*bnD-!{c5e^Fw`Nrh=QAl!1Ou)0PEJBk=%iC#yI*{ z6z0;o-56b#A(P5r`8${O$NvCYuH48R9iPNEs}9DiMkDh|xWQwPed}FqA$S2$1E|Rc zrZOCtLzLAdS!7ux%FH-nj=w`${$LgA8da{HbjAydV(pLaZX@)~YK;%W*7ASIGVPny zEM2qtEpJ7^JpUS;i?Jb!8?@J+g{{WT}AN`h~lFedL-($h-1+zQ(zwQdG!eD-DVh8)QzOaYvUvtm==|AU;zxTnQ%`g1>&Hn&=8t;n8 zdGcI;+d6B9MahYY&-Zah))0FJa9(u%t)~9~z6~B_$?0h^{{Vm*?aYsi>|yv*OuTgc zDEiDp*fWdYdD_N*`{2@M{PeJ!@~+6ukKu2?Qv~dKpzeFmLT9}yHP4*1dRJBsM=`vZFDC+f}Uu2h_zr;9qv;E6cpq*7^r1Wvw~wR z&=2o*Pp_!=r$*p|gT-)4Han9sm1Mhq0ayoC=v&xUfSH#8R0JFVDiM8cJSuI`gJ5L> zF$46f^W8jLkm^0*YSPbZ664n8{qnXzJo;vkhbRFo4_sDP_Nyvj$${7XNvO`QyRv2( z_l(i(=h&WQ-|;sVcT51IA6|x>lDS@R4tXW30BZ4!=6=8Q%+toP5&r;|;~(xCmqvYy zQ;&0@iT+~kD9$hiSVsgLvu8bb0bJMiybL+HPsL3+bx3iKwJ+sax-%_KJ+7Me8-khXd-91KQjR#YSIZR4CqYc%SX ztX3#Q-azfmwf5B)MUtjbR0i24uR;;8=sX~ua7 z`2PT|gZyeisUh8%-=4oX{{R{vFj*GMl|W-g$9%`um(6@<$~(GajE~Z&wxbgf@;D#w zkMXB2p%*_Z5uETx_|bU_l^20*V{cDW{{YsfEW48dKyUZQKc#02=#GEZa&y5Pezfs= zxdlwPqnU}szGd6dRF7l-0M@1ZK-r%u^XtV>`)c>|diGk4@6>b>yZ%*%4WhHHk(cKAA zL2M>4Jz2Y-rA={@Y^6^eocq=d#p#E9-*n>c^;`3d`=1vPt5+I34tLy)o|`g;DgQsy%YJV118=lN5#=>lCu=Z%aH z*9N=ZsN%JqjT^^lbw@k52_2Pz=mEzy0lIY$7-m;MP>l5hpVF+{$cZ$>Cjvv9cUJ!Z z3{@G`RDk3OR051TIH^NqR~JTGxa3}>VAbcG2$#$M0G4B74^xi6g=4g!H_C(PdsdaC z(5fM2`@ElXRQ4t=?6ELq)7l}D@He=)5}!gH67hc5{Uo^v){+1XpBJ z{{ZV1zF+KC2?!(^0=MN;S>1A?sYhOBKF!)oc8Q0s(t8k1U9x8B(586&D;^1p6+Je$ zBl*^Vx<~^sa+h;O1=zj)p?WaF;hXSkU+rt<00ofxkMX9p;OV)~g{B8-VS(u4s2jjR1UVm3{xuo9i$CiB z08vdris;ZUAv~}@N2JWT&i7USao23;6|$wAtdyOb>RHJ z{c4B%Lf9|-eZnc}duYnQ-owvONUMsH-3hq9r+Q;Z(+Z#;K~bb(+i}SQflr_2eTsQC zBCY@(g=X1GAP^7-Qfcc1WaOwIds6e9W0Tj~oX!ymJOC;i9f;*f!faGc&C`y9)~dC% z903ex>Y}F%a#^~c(x7=nWd8t#bIzl0LgNHVmUgYy2#!5tAK_LLOw-5(tZhm6g@3}K zwk3c#&wN#hqyaXLtU3CBo+{xtZCNvdD9xtnvb#6-eW+9SN07ZedR1ei>3GNXb*KIL zU+}APIb+X3O%0MNT}gK>Q(cG#kERp<03hp6`|!WvTAFW#^kW-N`emat{HhEqfHT(^ zsG*F?>WVpIis;JuQK~O&D6MGDPVKWgu}aAqr^5OX1f3$tfKON#{3%a{G#;PW))_fG zTd!}zw2NRU@79+&T!Htydsh7KxtA(4WALtk<8x^CUW4~5{uP<2cxOO+jjN>EAVIY3 zj4ppF>E@g4@E7Af2f3_QImslS@vQ3AX<0Jq!97`r{{RT4hNF!(9y#y+HDW&s=$-V- ze4qAfNOc3Lt12=AKC8GLjf*jDA1o6>)8n(azj>Uq+1OZI}=G>fhs87rI8103=(Gdw%i1#<#Do z@t$}U$ZEHYLvz-*ibP1m)h+A{g_Rg%rW~K=Ssr+W+Ew6x59Lq2nVF6W_N>-mTjoC~ z917}$ZjMRH%+p)f`#;V1x(Zn?mPKV_&{kBFWT+jvG#Q2))rhP1NRMn>x&va9$z=yV zPQNpQKwdR41Sceu27&kDdTT(i@B*>XMNiD)yIpR{Wx6V; zH#;2r3O$|G(BnO9&Q{-oFgfd1H9MWo6&oQkr|JIy>os;QIo4CRA0W;@&*ND-+(y$_ zxQKn+WRykR`6{SS@{{TrK@-sVCXYhuW z9C2_z?YndO*I{y|NKQJhBC}-VV~ln+GMtxDrE?5;LrCD5Wnu3#{{W3B@P3HLn=(QF z0H)9WHL|R6z~ofRhU9mqs!O;yqmX|H=`l!SYgQy5`Re@swD|ldqX`3jm9zcRBM^UD z=`Z38izppFR{DSX>Y9?nY3e!=N3@!Iu;q(e6(aDqg6cQvaS}h;Y@WIAPhSRjb9Tqm zREGPkBz}Kdy&QoU6UKkZ{{R}dkjwtbJpTZ)eQQNhO>RSqM=;(F(XFL1J&LwE679(K z>rY<_XaoXu#6R#i{{R~3u9c>PB!2cU)KvwSY0qQ%R63JSb~wQ`u|<3-;r!rfaOd2y z{GFRc`p_xS>^_ar-sc!%qt6Ljkm_bveTv6OY!U zJ{Qpy%Krdm+j|X_viRH|83%@^6x^W+<@NWezEgq@6!NFg)hWK@w2Vk&WAn%eE!0%~2Jgsv z`_U-_=5B|8qxn#oIcNLd%Ccc6kvaiD>l)`(0kWJebr-{TDy)U7a$xC1voc3^yyHZ z2mtawT5Qs6PCA|iUG1qhxfRsjW9F#Q#dHi^%lgAXs_8fGsR{5RTyj75~^7-@? zZro-}{{VDn^WcA4trCoM>sKKKVlCX9{$Jn8f#(=9#X3!6Y>HLbkV~Yw0B2S z=Alu8-npN$J(N=xI6Hr>NejsylW8Kc-S)mY?TYD)m6Jv`YeqfqCArfsV~~>DaNqC} zG5u=_ww@xlHz=d!Nm*ET!Q!O1@XYg~uqTn4nw4V|oQjPpP5Y(|Dd;P!Uj)un6CoM) zroV!&K>1__u=>?5<^5K#V4PISOS&~c*fsApe@3{5<0KP#rL3B%< zD^P{x>4H?_@cy+5gt74jyh=tRAy|)7*ZJ37IjKXMJ2M$Y!P-X5+LSSUuOBwhBW!jj zBR{X{SX%AFUe5*FE*eOecO6)D{)h3Wva}kl-K&6n{Khlbk_a^TA#Fwom4Pxv`?H>L z>H2Z_RZ3p#8eGoCAO!FQScci${nK52pM~-B6({hmX!ICkW%+m`9XcBF=Z=EW9gxAj z*~-}I(i63l@ve@;N^-f{cP}-$ZKa|C^7K7xTF%v19Ang14NOCmJ0VF$5LsL83xm!( z`d00r@`%CU@y}|`jtz$$LXt3jD(peA)o^=*`5MEW+}o7bjs9$BuOsVDpP1FX4M7uS zLubD~)~pe^SvwI{^+a0CiZhT!IZg+?Lkn^__CH#b@Z=sd(z8XfP6^g!ZJIOyL_#;H4#Ycjq|HgSXL?^kW)0XgIj z8{BsP06x`6>(q6}^QoeJjv2aiAao=D0IYediwPpb$nic$EWh~h?Nsh#5y%}s)XUTT zmhLL-fcbe*mXDzR@HJfuHs~cef^JcV@Set;kui26f>NZ${M7g=ayi9PcwRRtClW?+ z^%ZUx-x%j4aBD4%e94uA3=@!PV=P-?BrxO}h_2I~#-t#~po4~9L9HUp5)>LBFjx#(yLIO;eQs4%(bkMsR$_{quj&*Up3OO915!0Une)y4r- zDDA+gVjHGaT^q7EsMs05MTo<8P1XkOVK^lK+R@G)0!q|L!x=W2oYpYkg{L&h?CR8Crz6`@_+gR~lfqVon0a(St7!Twa>1~d3n zTx_Rp0XI%S#s&xGY0Uz>lVyHY!2bY0omsR^l1Rsf~7!x6_lzO*f5mFy{K zu6b99cB9U#jBW}s`I@Tm6J@5xtff(d$U*2?x_xn4jigVf_-9bR*0;2_@-4lUv&p!5 zvU1LFe}z}*Ng3!tiaU5C@Xnsm{{Y9!+%ELbCk251V!oOwD5RO+^f0o z^EL%~M~?00Z7SYNWo8k`%Hc;iU^)K)$7(MJX#x)n&X*DGd(h>So=kf{AFgZJrHF+* z96f(i&8tRLF%5rP97e7d^4{N3i1W2lTy+Q6{QFbhM}aN12nblN7i$6hE~lsCfZvT( zNsWU~Z7|%4A&y1<@Z@Lkts84gkFnio;wF)$3v*_}_=w<-#D1c?+@pKFj#$Os%X8Fp z$fCQ`ZSJA~q^KNYpTqF!ME1DKh4<&RX8b*eRD(&mwbX6iDC3YlxqkW1;rJ1s#Meu6 z7s?HMz9K4}R}}7h6lCQT*_Z;VhQYxdeX7(;^XDCDii2avp8lO_@r*AgETsPcpY!Wj z+}M+E?}*0?xgNO`_=X=D`CFm)rm+E)@_tt5=y<7Fa!4fmRa^@&w#LExr}Q;#8wVNf zRMZDd9=PZ6snGBV?bftRmWD_+NI)I)RtVmKz~od?u2eR9arxAit(7QqOQ>`llwfot zgZ!u~vB*Dk{*>aom+AWZ)e_m0EM_?xGJ16Ps>I-&bn1SUr+psu5`c1ppQUH8{x3?# zO3d0W=tUt&&qG!L-lbmz5zoC=3OaW+Ds%&%V^ez!r16-fXwOl|KB9ypcHYg%{DC9qG^4+NppYK||M-KJ}_(mf(CS4arZHkGEq=&@S@>aIMT|(DxMpeniR%0AbU) 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 Uo=5KO{Hn<-rlrb7y5Yz(KHXW3 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 Xs|${mJvma+Zo;a*Lr@61zdrpJ)rKM< literal 0 HcmV?d00001 diff --git a/asset/images/edit_tuner/house.jpg b/asset/images/edit_tuner/house.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f4b67fdac1c0de41796ad57efae0510416cdf075 GIT binary patch literal 93330 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�F$mI9>UY-C=frNDb$|VDkuLr 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 IfUL95G_DCT*opCMB| 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

@r7|DdK8vC>n7Y79p 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 Pi}3S>;f=FX{%QRmcI!~! literal 0 HcmV?d00001 diff --git a/asset/images/edit_tuner/image2depth.jpeg b/asset/images/edit_tuner/image2depth.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a97213206184cb4eb156e2cf45fc058e40ee0836 GIT binary patch literal 27220 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

?SAF>Y|&YZvRqHeiX;SCZ1<#y_f*|- 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 literal 0 HcmV?d00001 diff --git a/asset/images/edit_tuner/text.jpg b/asset/images/edit_tuner/text.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16b37c2a64b0c871594e103f92a189e127b89860 GIT binary patch literal 74173 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 Jg0woL|Jh4rIOPBU literal 0 HcmV?d00001 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}'