Spaces:
Sleeping
Sleeping
import transformers | |
transformers.utils.move_cache() | |
import random | |
import tempfile | |
import time | |
import gradio as gr | |
import numpy as np | |
import torch | |
import math | |
import re | |
import sys | |
from gradio import inputs | |
from diffusers import ( | |
AutoencoderKL, | |
#UNet2DConditionModel, | |
ControlNetModel, | |
DPMSolverMultistepScheduler, | |
EulerAncestralDiscreteScheduler, | |
EulerDiscreteScheduler, | |
HeunDiscreteScheduler, | |
KDPM2AncestralDiscreteScheduler, | |
KDPM2DiscreteScheduler, | |
LMSDiscreteScheduler, | |
PNDMScheduler, | |
UniPCMultistepScheduler, | |
DEISMultistepScheduler, | |
DDPMScheduler, | |
DDIMScheduler, | |
DPMSolverSDEScheduler, | |
DPMSolverSinglestepScheduler, | |
T2IAdapter, | |
SASolverScheduler, | |
EDMEulerScheduler, | |
EDMDPMSolverMultistepScheduler, | |
ConsistencyDecoderVAE, | |
) | |
from modules.u_net_condition_modify import UNet2DConditionModel | |
from modules.model_diffusers import ( | |
StableDiffusionPipeline_finetune, | |
StableDiffusionControlNetPipeline_finetune, | |
StableDiffusionControlNetImg2ImgPipeline_finetune, | |
StableDiffusionImg2ImgPipeline_finetune, | |
StableDiffusionInpaintPipeline_finetune, | |
StableDiffusionControlNetInpaintPipeline_finetune, | |
) | |
from modules.attention_modify import AttnProcessor,IPAdapterAttnProcessor,AttnProcessor2_0,IPAdapterAttnProcessor2_0 | |
from modules.model_k_diffusion import StableDiffusionPipeline | |
from torchvision import transforms | |
from transformers import CLIPTokenizer, CLIPTextModel,CLIPImageProcessor | |
from PIL import Image,ImageOps, ImageChops | |
from pathlib import Path | |
from safetensors.torch import load_file | |
import modules.safe as _ | |
from modules.lora import LoRANetwork | |
import os | |
import cv2 | |
from controlnet_aux import PidiNetDetector, HEDdetector,LineartAnimeDetector,LineartDetector,MLSDdetector,OpenposeDetector,MidasDetector,NormalBaeDetector,ContentShuffleDetector,ZoeDetector | |
from transformers import pipeline | |
from modules import samplers_extra_k_diffusion | |
import gc | |
import copy | |
from modules.preprocessing_segmentation import preprocessing_segmentation | |
import torch.nn.functional as F | |
from modules.t2i_adapter import setup_model_t2i_adapter | |
from diffusers.image_processor import IPAdapterMaskProcessor | |
from typing import Callable, Dict, List, Optional, Union | |
from insightface.app import FaceAnalysis | |
from insightface.utils import face_align | |
from diffusers.utils import load_image | |
from transformers import ( | |
CLIPImageProcessor, | |
CLIPVisionModelWithProjection, | |
) | |
embeddings_dict = dict() | |
lora_dict = dict() | |
lora_scale_dict = dict() | |
# lora_dict = {'Not using Lora':None,} | |
# lora_scale_dict = {'Not using Lora':1.0,} | |
# lora_lst = ['Not using Lora'] | |
lora_lst = ['Not using Lora'] | |
formula = [ | |
['w = token_weight_martix * sigma * std(qk)',0], | |
['w = token_weight_martix * log(1 + sigma) * max(qk)',1], | |
['w = token_weight_martix * log(1 + sigma) * std(qk)',2], | |
['w = token_weight_martix * log(1 + sigma^2) * std(qk)',3], | |
] | |
encoding_type ={ | |
"Automatic111 Encoding": 0, | |
"Long Prompt Encoding": 1, | |
"Short Prompt Encoding": 2, | |
} | |
model_ip_adapter_lst = ['IP-Adapter','IP-Adapter VIT-G','IP-Adapter Light','IP-Adapter Light v1.1','IP-Adapter Face','IP-Adapter FaceID','IP-Adapter Plus','IP-Adapter Plus Face',"IP-Adapter Plus FaceID","IP-Adapter Plus FaceIDv2"] | |
model_ip_adapter_type = { | |
"IP-Adapter": "ip-adapter_sd15.bin", | |
"IP-Adapter VIT-G": "ip-adapter_sd15_vit-G.bin", | |
"IP-Adapter Light": "ip-adapter_sd15_light.bin", | |
"IP-Adapter Light v1.1": "ip-adapter_sd15_light_v11.bin", | |
"IP-Adapter Face":"ip-adapter-full-face_sd15.bin", | |
"IP-Adapter FaceID":"ip-adapter-faceid_sd15.bin", | |
"IP-Adapter Plus": "ip-adapter-plus_sd15.bin", | |
"IP-Adapter Plus Face": "ip-adapter-plus-face_sd15.bin", | |
"IP-Adapter Plus FaceID": "ip-adapter-faceid-plus_sd15.bin", | |
"IP-Adapter Plus FaceIDv2": "ip-adapter-faceid-plusv2_sd15.bin", | |
} | |
controlnet_lst = ["Canny","Depth","Openpose","Soft Edge","Lineart","Lineart (anime)","Scribble","MLSD","Semantic Segmentation","Normal Map","Shuffle","Instruct Pix2Pix"] | |
adapter_lst = ["Canny","Sketch","Color","Depth","Openpose","Semantic Segmentation","Zoedepth"] | |
controlnet_type ={ | |
"Canny": "lllyasviel/control_v11p_sd15_canny", | |
"Depth": "lllyasviel/control_v11f1p_sd15_depth", | |
"Openpose": "lllyasviel/control_v11p_sd15_openpose", | |
"Soft Edge": "lllyasviel/control_v11p_sd15_softedge", | |
"Lineart":"ControlNet-1-1-preview/control_v11p_sd15_lineart", | |
"Lineart (anime)":"lllyasviel/control_v11p_sd15s2_lineart_anime", | |
"Scribble":"lllyasviel/control_v11p_sd15_scribble", | |
"MLSD":"lllyasviel/control_v11p_sd15_mlsd", | |
"Semantic Segmentation":"lllyasviel/control_v11p_sd15_seg", | |
"Normal Map":"lllyasviel/control_v11p_sd15_normalbae", | |
"Shuffle":"lllyasviel/control_v11e_sd15_shuffle", | |
"Instruct Pix2Pix":"lllyasviel/control_v11e_sd15_ip2p", | |
} | |
adapter_type ={ | |
"Canny": "TencentARC/t2iadapter_canny_sd15v2", | |
"Sketch": "TencentARC/t2iadapter_sketch_sd15v2", | |
"Color": "TencentARC/t2iadapter_color_sd14v1", | |
"Depth": "TencentARC/t2iadapter_depth_sd15v2", | |
"Openpose":"TencentARC/t2iadapter_openpose_sd14v1", | |
"Semantic Segmentation":"TencentARC/t2iadapter_seg_sd14v1", | |
"Zoedepth":"TencentARC/t2iadapter_zoedepth_sd15v1", | |
} | |
models_single_file = [] | |
models = [ | |
("AbyssOrangeMix2", "Korakoe/AbyssOrangeMix2-HF"), | |
("BloodOrangeMix", "WarriorMama777/BloodOrangeMix"), | |
("ElyOrangeMix", "WarriorMama777/ElyOrangeMix"), | |
("Pastal Mix", "JamesFlare/pastel-mix"), | |
("Basil Mix", "nuigurumi/basil_mix"), | |
("Stable Diffusion v1.5", "runwayml/stable-diffusion-v1-5"), | |
("Stable Diffusion v2.1", "stabilityai/stable-diffusion-2-1-base"), | |
("Realistic Vision v1.4", "SG161222/Realistic_Vision_V1.4"), | |
("Dreamlike Photoreal v2.0", "dreamlike-art/dreamlike-photoreal-2.0"), | |
("Waifu-diffusion v1.4", "hakurei/waifu-diffusion"), | |
("Stable diffusion PixelArt v1.4", "Onodofthenorth/SD_PixelArt_SpriteSheet_Generator"), | |
("Anything v3", "Linaqruf/anything-v3.0"), | |
("Sketch style", "Cosk/sketchstyle-cutesexyrobutts"), | |
("Anything v5", "stablediffusionapi/anything-v5"), | |
("Counterfeit v2.5", "gsdf/Counterfeit-V2.5"), | |
("Edge of realism", "stablediffusionapi/edge-of-realism"), | |
("Photorealistic fuen", "claudfuen/photorealistic-fuen-v1"), | |
("Protogen x5.8 (Scifi-Anime)", "darkstorm2150/Protogen_x5.8_Official_Release"), | |
("Dreamlike Anime", "dreamlike-art/dreamlike-anime-1.0"), | |
("Something V2.2", "NoCrypt/SomethingV2_2"), | |
("Realistic Vision v3.0", "SG161222/Realistic_Vision_V3.0_VAE"), | |
("Noosphere v3.0", "digiplay/Noosphere_v3"), | |
("Beauty Fool v1.2", "digiplay/BeautyFool_v1.2VAE_pruned"), | |
("Prefix RealisticMix v1.0", "digiplay/PrefixRealisticMix_v1"), | |
("Prefix FantasyMix v1.0", "digiplay/PrefixFantasyMix_v1"), | |
("Unstable Diffusers YamerMIX v3.0", "digiplay/unstableDiffusersYamerMIX_v3"), | |
("GTA5 Artwork Diffusion", "ItsJayQz/GTA5_Artwork_Diffusion"), | |
("Open Journey", "prompthero/openjourney"), | |
("SoapMix2.5D v2.0", "digiplay/SoapMix2.5D_v2"), | |
("CoffeeMix v2.0", "digiplay/CoffeeMix_v2"), | |
("helloworld v3.0", "digiplay/helloworld_v3"), | |
("ARRealVX v1.1", "digiplay/ARRealVX1.1"), | |
("Fishmix v1.0", "digiplay/fishmix_other_v1"), | |
("DiamondCoalMix v2.0", "digiplay/DiamondCoalMix_v2_pruned_diffusers"), | |
("ISOMix v3.22", "digiplay/ISOmix_v3.22"), | |
("Pika v2", "digiplay/Pika_v2"), | |
("BluePencil v0.9b", "digiplay/bluePencil_v09b"), | |
("MeinaPastel v6", "Meina/MeinaPastel_V6"), | |
("Realistic Vision v4", "SG161222/Realistic_Vision_V4.0"), | |
("Revanimated v1.2.2", "stablediffusionapi/revanimated"), | |
("NeverEnding Dream v1.2.2", "Lykon/NeverEnding-Dream"), | |
("CetusMixCoda", "Stax124/CetusMixCoda"), | |
("NewMarsMix R11", "digiplay/NewMarsMix_R11"), | |
("Juggernaut Final", "digiplay/Juggernaut_final"), | |
("BlankCanvas v1.0", "digiplay/BlankCanvas_v1"), | |
("FumizukiMix v1.0", "digiplay/FumizukiMix_v1"), | |
("CampurSari v1.0", "digiplay/CampurSari_Gen1"), | |
("Realisian v1.0", "digiplay/Realisian_v5"), | |
("Real Epic Majic Revolution v1.0", "digiplay/RealEpicMajicRevolution_v1"), | |
("QuinceMix v2.0", "digiplay/quincemix_v2"), | |
("Counterfeit v3.0", "stablediffusionapi/counterfeit-v30"), | |
("MeinaMix v11.0", "Meina/MeinaMix_V11"), | |
("MeinaPastel V7.0", "Meina/MeinaPastel_V7"), | |
("Alter V3.0", "Meina/Alter_V3"), | |
("MeinaUnreal V5.0", "Meina/MeinaUnreal_V5"), | |
("MeinaHentai V5.0", "Meina/MeinaHentai_V5"), | |
("AnyOrangeMix Mint", "GraydientPlatformAPI/anyorange-mint"), | |
] | |
#Name / link / True = single file , False = need config.json | |
vae_link ={ | |
"Vae ft MSE": "stabilityai/sd-vae-ft-mse", | |
"Vae ft MSE original": "stabilityai/sd-vae-ft-mse-original/vae-ft-mse-840000-ema-pruned.safetensors", | |
"Vae ft EMA": "stabilityai/sd-vae-ft-ema", | |
"Vae ft EMA original": "stabilityai/sd-vae-ft-ema-original/vae-ft-ema-560000-ema-pruned.safetensors", | |
"ClearVAE V2.1" : "digiplay/VAE/ClearVAE_V2.1.safetensors", | |
"Blessed": "digiplay/VAE/blessed.vae.pt", | |
"Color101VAE v1": "digiplay/VAE/color101VAE_v1.safetensors", | |
"kl-f8-anime2": "digiplay/VAE/klF8Anime2VAE_klF8Anime2VAE.ckpt", | |
"Mangled Merge": "digiplay/VAE/mangledMergeVAE_v10.pt", | |
"Orangemix": "digiplay/VAE/orangemix.vae.pt", | |
"Stable 780000": "digiplay/VAE/stable-780000.vae.pt", | |
"CustomVAE Q6": "duongve/VAE/customvae_q6.safetensors", | |
"Voidnoise VAE": "duongve/VAE/voidnoiseVAE_baseonR0829.safetensors", | |
"Lastpiece Contrast": "duongve/VAE/lastpieceVAE_contrast.safetensors", | |
"Lastpiece Brightness": "duongve/VAE/lastpieceVAE_brightness.safetensors", | |
"Berry's Mix v1.0": "duongve/VAE/berrysMixVAE_v10.safetensors", | |
"Async's VAE v1.0": "duongve/VAE/asyncsVAE_v10.safetensors", | |
"WD-VAE v1.0": "duongve/VAE/wdVAE_v10.safetensors", | |
"Nocturnal": "duongve/VAE/nocturnalVAE_.safetensors", | |
"Apricots": "duongve/VAE/apricotsVAESeries_tensorQuantizerV10.safetensors", | |
"Earth & Dusk v1.0": "duongve/VAE/earthDuskVAE_v10.safetensors", | |
"HotaruVAE Anime v1.0": "duongve/VAE/hotaruvae_AnimeV10.safetensors", | |
"HotaruVAE Real v1.0": "duongve/VAE/hotaruvae_RealV10.safetensors", | |
"Consistency Decoder": "openai/consistency-decoder", | |
} | |
vae_single_file ={ | |
"Vae ft MSE": False, | |
"Vae ft MSE original": True, | |
"Vae ft EMA": False, | |
"Vae ft EMA original": True, | |
"ClearVAE V2.1": True, | |
"Blessed": True, | |
"Color101VAE v1": True, | |
"kl-f8-anime2": True, | |
"Mangled Merge": True, | |
"Orangemix": True, | |
"Stable 780000": True, | |
"CustomVAE Q6": True, | |
"Voidnoise VAE": True, | |
"Lastpiece Contrast": True, | |
"Lastpiece Brightness": True, | |
"Berry's Mix v1.0": True, | |
"Async's VAE v1.0": True, | |
"WD-VAE v1.0": True, | |
"Nocturnal": True, | |
"Apricots": True, | |
"Earth & Dusk v1.0": True, | |
"HotaruVAE Anime v1.0": True, | |
"HotaruVAE Real v1.0": True, | |
"Consistency Decoder": False, | |
} | |
vae_lst = [ | |
"Default", | |
"Vae ft MSE", | |
"Vae ft MSE original", | |
"Vae ft EMA", | |
"Vae ft EMA original", | |
"ClearVAE V2.1", | |
"Blessed", | |
"Color101VAE v1", | |
"kl-f8-anime2", | |
"Mangled Merge", | |
"Orangemix", | |
"Stable 780000", | |
"CustomVAE Q6", | |
"Voidnoise VAE", | |
"Lastpiece Contrast", | |
"Lastpiece Brightness", | |
"Berry's Mix v1.0", | |
"Async's VAE v1.0", | |
"WD-VAE v1.0", | |
"Nocturnal", | |
"Apricots", | |
"Earth & Dusk v1.0", | |
"HotaruVAE Anime v1.0", | |
"HotaruVAE Real v1.0", | |
"Consistency Decoder", | |
] | |
keep_vram = [ | |
"Korakoe/AbyssOrangeMix2-HF", | |
"WarriorMama777/BloodOrangeMix", | |
"WarriorMama777/ElyOrangeMix", | |
"JamesFlare/pastel-mix", | |
"nuigurumi/basil_mix", | |
"runwayml/stable-diffusion-v1-5", | |
"stabilityai/stable-diffusion-2-1-base", | |
"SG161222/Realistic_Vision_V1.4", | |
"dreamlike-art/dreamlike-photoreal-2.0", | |
"hakurei/waifu-diffusion", | |
"Onodofthenorth/SD_PixelArt_SpriteSheet_Generator", | |
"Linaqruf/anything-v3.0", | |
"Cosk/sketchstyle-cutesexyrobutts", | |
"stablediffusionapi/anything-v5", | |
"gsdf/Counterfeit-V2.5", | |
"stablediffusionapi/edge-of-realism", | |
"claudfuen/photorealistic-fuen-v1", | |
"darkstorm2150/Protogen_x5.8_Official_Release", | |
"dreamlike-art/dreamlike-anime-1.0", | |
"NoCrypt/SomethingV2_2", | |
"SG161222/Realistic_Vision_V3.0_VAE", | |
"digiplay/Noosphere_v3", | |
"digiplay/BeautyFool_v1.2VAE_pruned", | |
"digiplay/PrefixRealisticMix_v1", | |
"digiplay/PrefixFantasyMix_v1", | |
"digiplay/unstableDiffusersYamerMIX_v3", | |
"ItsJayQz/GTA5_Artwork_Diffusion", | |
"prompthero/openjourney", | |
"digiplay/SoapMix2.5D_v2", | |
"digiplay/CoffeeMix_v2", | |
"digiplay/helloworld_v3", | |
"digiplay/ARRealVX1.1", | |
"digiplay/fishmix_other_v1", | |
"digiplay/DiamondCoalMix_v2_pruned_diffusers", | |
"digiplay/ISOmix_v3.22", | |
"digiplay/Pika_v2", | |
"digiplay/bluePencil_v09b", | |
"Meina/MeinaPastel_V6", | |
"SG161222/Realistic_Vision_V4.0", | |
"stablediffusionapi/revanimated", | |
"Lykon/NeverEnding-Dream", | |
"Stax124/CetusMixCoda", | |
"digiplay/NewMarsMix_R11", | |
"digiplay/Juggernaut_final", | |
"digiplay/BlankCanvas_v1", | |
"digiplay/FumizukiMix_v1", | |
"digiplay/CampurSari_Gen1", | |
"digiplay/Realisian_v5", | |
"digiplay/RealEpicMajicRevolution_v1", | |
"stablediffusionapi/counterfeit-v30", | |
"Meina/MeinaMix_V11", | |
"Meina/MeinaPastel_V7", | |
"Meina/Alter_V3", | |
"Meina/MeinaUnreal_V5", | |
"Meina/MeinaHentai_V5", | |
"GraydientPlatformAPI/anyorange-mint", | |
] | |
base_name, base_model = models[0] | |
samplers_k_diffusion = [ | |
('Euler', 'sample_euler', {}), | |
('Euler a', 'sample_euler_ancestral', {"uses_ensd": True}), | |
('LMS', 'sample_lms', {}), | |
('LCM', samplers_extra_k_diffusion.sample_lcm, {"second_order": True}), | |
('Heun', 'sample_heun', {"second_order": True}), | |
('Heun++', samplers_extra_k_diffusion.sample_heunpp2, {"second_order": True}), | |
('DDPM', samplers_extra_k_diffusion.sample_ddpm, {"second_order": True}), | |
('DPM2', 'sample_dpm_2', {'discard_next_to_last_sigma': True}), | |
('DPM2 a', 'sample_dpm_2_ancestral', {'discard_next_to_last_sigma': True, "uses_ensd": True}), | |
('DPM++ 2S a', 'sample_dpmpp_2s_ancestral', {"uses_ensd": True, "second_order": True}), | |
('DPM++ 2M', 'sample_dpmpp_2m', {}), | |
('DPM++ SDE', 'sample_dpmpp_sde', {"second_order": True, "brownian_noise": True}), | |
('DPM++ 2M SDE', 'sample_dpmpp_2m_sde', {"brownian_noise": True}), | |
('DPM++ 3M SDE', 'sample_dpmpp_3m_sde', {'discard_next_to_last_sigma': True, "brownian_noise": True}), | |
('DPM fast (img-to-img)', 'sample_dpm_fast', {"uses_ensd": True}), | |
('DPM adaptive (img-to-img)', 'sample_dpm_adaptive', {"uses_ensd": True}), | |
('DPM++ 2M SDE Heun', 'sample_dpmpp_2m_sde', {"brownian_noise": True, "solver_type": "heun"}), | |
('Restart', samplers_extra_k_diffusion.restart_sampler, {"second_order": True}), | |
('Euler Karras', 'sample_euler', {'scheduler': 'karras'}), | |
('Euler a Karras', 'sample_euler_ancestral', {'scheduler': 'karras',"uses_ensd": True}), | |
('LMS Karras', 'sample_lms', {'scheduler': 'karras'}), | |
('LCM Karras', samplers_extra_k_diffusion.sample_lcm, {'scheduler': 'karras',"second_order": True}), | |
('Heun Karras', 'sample_heun', {'scheduler': 'karras',"second_order": True}), | |
('Heun++ Karras', samplers_extra_k_diffusion.sample_heunpp2, {'scheduler': 'karras',"second_order": True}), | |
('DDPM Karras', samplers_extra_k_diffusion.sample_ddpm, {'scheduler': 'karras', "second_order": True}), | |
('DPM2 Karras', 'sample_dpm_2', {'scheduler': 'karras', 'discard_next_to_last_sigma': True, "uses_ensd": True, "second_order": True}), | |
('DPM2 a Karras', 'sample_dpm_2_ancestral', {'scheduler': 'karras', 'discard_next_to_last_sigma': True, "uses_ensd": True, "second_order": True}), | |
('DPM++ 2S a Karras', 'sample_dpmpp_2s_ancestral', {'scheduler': 'karras', "uses_ensd": True, "second_order": True}), | |
('DPM++ 2M Karras', 'sample_dpmpp_2m', {'scheduler': 'karras'}), | |
('DPM++ SDE Karras', 'sample_dpmpp_sde', {'scheduler': 'karras', "second_order": True, "brownian_noise": True}), | |
('DPM++ 2M SDE Karras', 'sample_dpmpp_2m_sde', {'scheduler': 'karras', "brownian_noise": True}), | |
('DPM++ 2M SDE Heun Karras', 'sample_dpmpp_2m_sde', {'scheduler': 'karras', "brownian_noise": True, "solver_type": "heun"}), | |
('DPM++ 3M SDE Karras', 'sample_dpmpp_3m_sde', {'scheduler': 'karras', 'discard_next_to_last_sigma': True, "brownian_noise": True}), | |
('Restart Karras', samplers_extra_k_diffusion.restart_sampler, {'scheduler': 'karras', "second_order": True}), | |
('Euler Exponential', 'sample_euler', {'scheduler': 'exponential'}), | |
('Euler a Exponential', 'sample_euler_ancestral', {'scheduler': 'exponential',"uses_ensd": True}), | |
('LMS Exponential', 'sample_lms', {'scheduler': 'exponential'}), | |
('LCM Exponential', samplers_extra_k_diffusion.sample_lcm, {'scheduler': 'exponential',"second_order": True}), | |
('Heun Exponential', 'sample_heun', {'scheduler': 'exponential',"second_order": True}), | |
('Heun++ Exponential', samplers_extra_k_diffusion.sample_heunpp2, {'scheduler': 'exponential',"second_order": True}), | |
('DDPM Exponential', samplers_extra_k_diffusion.sample_ddpm, {'scheduler': 'exponential', "second_order": True}), | |
('DPM++ 2M Exponential', 'sample_dpmpp_2m', {'scheduler': 'exponential'}), | |
('DPM++ 2M SDE Exponential', 'sample_dpmpp_2m_sde', {'scheduler': 'exponential', "brownian_noise": True}), | |
('DPM++ 2M SDE Heun Exponential', 'sample_dpmpp_2m_sde', {'scheduler': 'exponential', "brownian_noise": True, "solver_type": "heun"}), | |
('DPM++ 3M SDE Exponential', 'sample_dpmpp_3m_sde', {'scheduler': 'exponential', 'discard_next_to_last_sigma': True, "brownian_noise": True}), | |
('Restart Exponential', samplers_extra_k_diffusion.restart_sampler, {'scheduler': 'exponential', "second_order": True}), | |
('Euler Polyexponential', 'sample_euler', {'scheduler': 'polyexponential'}), | |
('Euler a Polyexponential', 'sample_euler_ancestral', {'scheduler': 'polyexponential',"uses_ensd": True}), | |
('LMS Polyexponential', 'sample_lms', {'scheduler': 'polyexponential'}), | |
('LCM Polyexponential', samplers_extra_k_diffusion.sample_lcm, {'scheduler': 'polyexponential',"second_order": True}), | |
('Heun Polyexponential', 'sample_heun', {'scheduler': 'polyexponential',"second_order": True}), | |
('Heun++ Polyexponential', samplers_extra_k_diffusion.sample_heunpp2, {'scheduler': 'polyexponential',"second_order": True}), | |
('DDPM Polyexponential', samplers_extra_k_diffusion.sample_ddpm, {'scheduler': 'polyexponential', "second_order": True}), | |
('DPM++ 2M Polyexponential', 'sample_dpmpp_2m', {'scheduler': 'polyexponential'}), | |
('DPM++ 2M SDE Heun Polyexponential', 'sample_dpmpp_2m_sde', {'scheduler': 'polyexponential', "brownian_noise": True, "solver_type": "heun"}), | |
('DPM++ 3M SDE Polyexponential', 'sample_dpmpp_3m_sde', {'scheduler': 'polyexponential', 'discard_next_to_last_sigma': True, "brownian_noise": True}), | |
('Restart Polyexponential', samplers_extra_k_diffusion.restart_sampler, {'scheduler': 'polyexponential', "second_order": True}), | |
] | |
#Add to sigma sp which library is missing | |
'''class DEISMultistepScheduler_modify(DEISMultistepScheduler): | |
def _convert_to_karras(self, in_sigmas: torch.FloatTensor, num_inference_steps) -> torch.FloatTensor: | |
"""Constructs the noise schedule of Karras et al. (2022).""" | |
sigma_min: float = in_sigmas[-1].item() | |
sigma_max: float = in_sigmas[0].item() | |
rho = 7.0 # 7.0 is the value used in the paper | |
ramp = np.linspace(0, 1, num_inference_steps) | |
min_inv_rho = sigma_min ** (1 / rho) | |
max_inv_rho = sigma_max ** (1 / rho) | |
sigmas = (max_inv_rho + ramp * (min_inv_rho - max_inv_rho)) ** rho | |
return sigmas | |
def _sigma_to_t(self, sigma, log_sigmas): | |
# get log sigma | |
log_sigma = np.log(sigma) | |
# get distribution | |
dists = log_sigma - log_sigmas[:, np.newaxis] | |
# get sigmas range | |
low_idx = np.cumsum((dists >= 0), axis=0).argmax(axis=0).clip(max=log_sigmas.shape[0] - 2) | |
high_idx = low_idx + 1 | |
low = log_sigmas[low_idx] | |
high = log_sigmas[high_idx] | |
# interpolate sigmas | |
w = (low - log_sigma) / (low - high) | |
w = np.clip(w, 0, 1) | |
# transform interpolation to time range | |
t = (1 - w) * low_idx + w * high_idx | |
t = t.reshape(sigma.shape) | |
return t''' | |
samplers_diffusers = [ | |
('Euler a', lambda ddim_scheduler_config: EulerAncestralDiscreteScheduler.from_config(ddim_scheduler_config), {}), | |
('Euler', lambda ddim_scheduler_config: EulerDiscreteScheduler.from_config(ddim_scheduler_config), {}), | |
#('EDM Euler', lambda ddim_scheduler_config: EDMEulerScheduler.from_config(ddim_scheduler_config), {}), | |
('LMS', lambda ddim_scheduler_config: LMSDiscreteScheduler.from_config(ddim_scheduler_config), {}), | |
('Heun',lambda ddim_scheduler_config: HeunDiscreteScheduler.from_config(ddim_scheduler_config), {}), | |
('DPM2',lambda ddim_scheduler_config: KDPM2DiscreteScheduler.from_config(ddim_scheduler_config), {}), | |
('DPM2 a',lambda ddim_scheduler_config: KDPM2AncestralDiscreteScheduler.from_config(ddim_scheduler_config), {}), | |
('DPM++ 2S a',lambda ddim_scheduler_config: DPMSolverSinglestepScheduler.from_config(ddim_scheduler_config), {}), | |
('DPM++ 2M',lambda ddim_scheduler_config: DPMSolverMultistepScheduler.from_config(ddim_scheduler_config), {}), | |
#('EDM DPM++ 2M',lambda ddim_scheduler_config: EDMDPMSolverMultistepScheduler.from_config(ddim_scheduler_config), {}), | |
('DPM++ SDE',lambda ddim_scheduler_config: DPMSolverSDEScheduler.from_config(ddim_scheduler_config), {}), | |
('DPM++ 2M SDE',lambda ddim_scheduler_config: DPMSolverMultistepScheduler.from_config(ddim_scheduler_config,algorithm_type="sde-dpmsolver++"), {}), | |
#('EDM DPM++ 2M SDE',lambda ddim_scheduler_config: EDMDPMSolverMultistepScheduler.from_config(ddim_scheduler_config,algorithm_type="sde-dpmsolver++"), {}), | |
('DEIS',lambda ddim_scheduler_config: DEISMultistepScheduler.from_config(ddim_scheduler_config), {}), | |
('UniPC Time Uniform 1',lambda ddim_scheduler_config: UniPCMultistepScheduler.from_config(ddim_scheduler_config,solver_type = "bh1"), {}), | |
('UniPC Time Uniform 2',lambda ddim_scheduler_config: UniPCMultistepScheduler.from_config(ddim_scheduler_config,solver_type = "bh2"), {}), | |
('SA-Solver',lambda ddim_scheduler_config: SASolverScheduler.from_config(ddim_scheduler_config), {}), | |
('Euler Karras', lambda ddim_scheduler_config: EulerDiscreteScheduler.from_config(ddim_scheduler_config,use_karras_sigmas=True), {}), | |
('LMS Karras',lambda ddim_scheduler_config: LMSDiscreteScheduler.from_config(ddim_scheduler_config,use_karras_sigmas=True), {}), | |
('Heun Karras',lambda ddim_scheduler_config: HeunDiscreteScheduler.from_config(ddim_scheduler_config,use_karras_sigmas=True), {}), | |
('DPM2 Karras',lambda ddim_scheduler_config: KDPM2DiscreteScheduler.from_config(ddim_scheduler_config,use_karras_sigmas=True), {}), | |
('DPM2 a Karras',lambda ddim_scheduler_config: KDPM2AncestralDiscreteScheduler.from_config(ddim_scheduler_config,use_karras_sigmas=True), {}), | |
('DPM++ 2S a Karras',lambda ddim_scheduler_config: DPMSolverSinglestepScheduler.from_config(ddim_scheduler_config,use_karras_sigmas=True), {}), | |
('DPM++ 2M Karras',lambda ddim_scheduler_config: DPMSolverMultistepScheduler.from_config(ddim_scheduler_config,use_karras_sigmas=True), {}), | |
('DPM++ SDE Karras',lambda ddim_scheduler_config: DPMSolverSDEScheduler.from_config(ddim_scheduler_config,use_karras_sigmas=True), {}), | |
('DPM++ 2M SDE Karras',lambda ddim_scheduler_config: DPMSolverMultistepScheduler.from_config(ddim_scheduler_config,use_karras_sigmas=True,algorithm_type="sde-dpmsolver++"), {}), | |
('DEIS Karras',lambda ddim_scheduler_config: DEISMultistepScheduler.from_config(ddim_scheduler_config,use_karras_sigmas=True), {}), | |
('UniPC Time Uniform 1 Karras',lambda ddim_scheduler_config: UniPCMultistepScheduler.from_config(ddim_scheduler_config,solver_type = "bh1",use_karras_sigmas=True), {}), | |
('UniPC Time Uniform 2 Karras',lambda ddim_scheduler_config: UniPCMultistepScheduler.from_config(ddim_scheduler_config,solver_type = "bh2",use_karras_sigmas=True), {}), | |
('SA-Solver Karras',lambda ddim_scheduler_config: SASolverScheduler.from_config(ddim_scheduler_config,use_karras_sigmas=True), {}), | |
] | |
# samplers_diffusers = [ | |
# ("DDIMScheduler", "diffusers.schedulers.DDIMScheduler", {}) | |
# ("DDPMScheduler", "diffusers.schedulers.DDPMScheduler", {}) | |
# ("DEISMultistepScheduler", "diffusers.schedulers.DEISMultistepScheduler", {}) | |
# ] | |
start_time = time.time() | |
timeout = 360 | |
scheduler = DDIMScheduler.from_pretrained( | |
base_model, | |
subfolder="scheduler", | |
) | |
'''vae = AutoencoderKL.from_pretrained( | |
"stabilityai/sd-vae-ft-mse", | |
torch_dtype=torch.float16 | |
)''' | |
vae = AutoencoderKL.from_pretrained(base_model, | |
subfolder="vae", | |
torch_dtype=torch.float16, | |
) | |
if vae is None: | |
vae = AutoencoderKL.from_pretrained( | |
"stabilityai/sd-vae-ft-mse", | |
torch_dtype=torch.float16, | |
) | |
text_encoder = CLIPTextModel.from_pretrained( | |
base_model, | |
subfolder="text_encoder", | |
torch_dtype=torch.float16, | |
) | |
tokenizer = CLIPTokenizer.from_pretrained( | |
base_model, | |
subfolder="tokenizer", | |
torch_dtype=torch.float16, | |
) | |
unet = UNet2DConditionModel.from_pretrained( | |
base_model, | |
subfolder="unet", | |
torch_dtype=torch.float16, | |
) | |
feature_extract = CLIPImageProcessor.from_pretrained( | |
base_model, | |
subfolder="feature_extractor", | |
) | |
pipe = StableDiffusionPipeline( | |
text_encoder=text_encoder, | |
tokenizer=tokenizer, | |
unet=unet, | |
vae=vae, | |
scheduler=scheduler, | |
feature_extractor = feature_extract, | |
) | |
if torch.cuda.is_available(): | |
pipe = pipe.to("cuda") | |
def get_model_list(): | |
return models | |
scheduler_cache ={ | |
base_name: scheduler | |
} | |
te_cache = { | |
base_name: text_encoder | |
} | |
vae_cache = { | |
base_name: vae | |
} | |
unet_cache = { | |
base_name: unet | |
} | |
lora_cache = { | |
base_name: LoRANetwork(text_encoder, unet) | |
} | |
tokenizer_cache ={ | |
base_name: tokenizer | |
} | |
feature_cache ={ | |
base_name: feature_extract | |
} | |
controlnetmodel_cache ={ | |
} | |
adapter_cache ={ | |
} | |
vae_enhance_cache ={ | |
} | |
te_base_weight_length = text_encoder.get_input_embeddings().weight.data.shape[0] | |
original_prepare_for_tokenization = tokenizer.prepare_for_tokenization | |
current_model = base_name | |
def setup_controlnet(name_control,device): | |
global controlnet_type,controlnetmodel_cache | |
if name_control not in controlnetmodel_cache: | |
model_control = ControlNetModel.from_pretrained(name_control, torch_dtype=torch.float16).to(device) | |
controlnetmodel_cache[name_control] = model_control | |
return controlnetmodel_cache[name_control] | |
def setup_adapter(adapter_sp,device): | |
global model_ip_adapter_type,adapter_cache | |
if adapter_sp not in adapter_cache: | |
model_control = T2IAdapter.from_pretrained(adapter_sp, torch_dtype=torch.float16).to(device) | |
adapter_cache[adapter_sp] = model_control | |
return adapter_cache[adapter_sp] | |
def setup_vae(model,vae_used = "Default"): | |
global vae_link,vae_single_file | |
vae_model = None | |
if vae_used == "Default": | |
vae_model = AutoencoderKL.from_pretrained(model,subfolder="vae",torch_dtype=torch.float16) | |
elif vae_used == "Consistency Decoder": | |
vae_model = ConsistencyDecoderVAE.from_pretrained(vae_link[vae_used], torch_dtype=torch.float16) | |
else: | |
if vae_single_file[vae_used]: | |
vae_model = AutoencoderKL.from_single_file(vae_link[vae_used],torch_dtype=torch.float16) | |
else: | |
vae_model = AutoencoderKL.from_pretrained(vae_link[vae_used],torch_dtype=torch.float16) | |
if vae_model is None: | |
vae_model = AutoencoderKL.from_pretrained("stabilityai/sd-vae-ft-mse", torch_dtype=torch.float16) | |
return vae_model | |
def setup_model(name,clip_skip, lora_group=None,diffuser_pipeline = False ,control_net_model = None,img_input = None,device = "cpu",mask_inpaiting = None,vae_used = "Default"): | |
global current_model,vae_link,vae_single_file,models_single_file | |
keys = [k[0] for k in models] | |
model = models[keys.index(name)][1] | |
if name not in unet_cache: | |
if name not in models_single_file: | |
try: | |
vae_model = AutoencoderKL.from_pretrained(model,subfolder="vae",torch_dtype=torch.float16) | |
except OSError: | |
vae_model = AutoencoderKL.from_pretrained("stabilityai/sd-vae-ft-mse", torch_dtype=torch.float16) | |
try: | |
unet = UNet2DConditionModel.from_pretrained(model, subfolder="unet", torch_dtype=torch.float16) | |
except OSError: | |
unet = UNet2DConditionModel.from_pretrained(base_model, subfolder="unet", torch_dtype=torch.float16) | |
try: | |
text_encoder = CLIPTextModel.from_pretrained(model, subfolder="text_encoder", torch_dtype=torch.float16) | |
except OSError: | |
text_encoder = CLIPTextModel.from_pretrained(base_model, subfolder="text_encoder", torch_dtype=torch.float16) | |
try: | |
tokenizer = CLIPTokenizer.from_pretrained(model,subfolder="tokenizer",torch_dtype=torch.float16) | |
except OSError: | |
tokenizer = CLIPTokenizer.from_pretrained(base_model,subfolder="tokenizer",torch_dtype=torch.float16) | |
try: | |
scheduler = DDIMScheduler.from_pretrained(model,subfolder="scheduler") | |
except OSError: | |
scheduler = DDIMScheduler.from_pretrained(base_model,subfolder="scheduler") | |
try: | |
feature_extract = CLIPImageProcessor.from_pretrained(model,subfolder="feature_extractor") | |
except OSError: | |
feature_extract = CLIPImageProcessor.from_pretrained(base_model,subfolder="feature_extractor") | |
else: | |
pipe_get = StableDiffusionPipeline_finetune.from_single_file(model,safety_checker= None,requires_safety_checker = False,torch_dtype=torch.float16).to(device) | |
vae_model = pipe_get.vae | |
unet = pipe_get.unet | |
text_encoder = pipe_get.text_encoder | |
tokenizer = pipe_get.tokenizer | |
scheduler = pipe_get.scheduler | |
feature_extract = pipe_get.feature_extractor if pipe_get.feature_extractor is not None else CLIPImageProcessor.from_pretrained(base_model,subfolder="feature_extractor") | |
del pipe_get | |
# if vae_model is None: | |
# vae_model = AutoencoderKL.from_pretrained("stabilityai/sd-vae-ft-mse", torch_dtype=torch.float16) | |
scheduler_cache[name] = scheduler | |
unet_cache[name] = unet | |
te_cache[name] = text_encoder | |
vae_cache[name] = vae_model | |
tokenizer_cache[name] = tokenizer | |
feature_cache[name] = feature_extract | |
#lora_cache[model] = LoRANetwork(text_encoder, unet) | |
if vae_used != "Default" and vae_used not in vae_enhance_cache: | |
vae_enhance_cache[vae_used] = setup_vae(model,vae_used) | |
if current_model != name: | |
#if current_model not in keep_vram: | |
# offload current model | |
unet_cache[current_model].to(device) | |
te_cache[current_model].to(device) | |
vae_cache[current_model].to(device) | |
current_model = name | |
local_te, local_unet,local_sche,local_vae,local_token,local_feature = copy.deepcopy(te_cache[name]), copy.deepcopy(unet_cache[name]),scheduler_cache[name],vae_cache[name], copy.deepcopy(tokenizer_cache[name]),feature_cache[name] | |
if vae_used != "Default": | |
local_vae = vae_enhance_cache[vae_used] | |
if torch.cuda.is_available(): | |
local_unet.to("cuda") | |
local_te.to("cuda") | |
local_vae.to("cuda") | |
#local_unet.set_attn_processor(AttnProcessor()) | |
#local_lora.reset() | |
if diffuser_pipeline: | |
if control_net_model is not None: | |
if mask_inpaiting and img_input: | |
pipe = StableDiffusionControlNetInpaintPipeline_finetune( | |
vae= local_vae, | |
text_encoder= local_te, | |
tokenizer=local_token, | |
unet=local_unet, | |
controlnet = control_net_model, | |
safety_checker= None, | |
scheduler = local_sche, | |
feature_extractor=local_feature, | |
requires_safety_checker = False, | |
).to(device) | |
elif img_input is not None: | |
#pipe = StableDiffusionControlNetImg2ImgPipeline_finetune.from_pretrained(model,safety_checker = None,controlnet=control_net_model, torch_dtype=torch.float16).to(device) | |
pipe = StableDiffusionControlNetImg2ImgPipeline_finetune( | |
vae= local_vae, | |
text_encoder= local_te, | |
tokenizer=local_token, | |
unet=local_unet, | |
controlnet = control_net_model, | |
safety_checker= None, | |
scheduler = local_sche, | |
feature_extractor=local_feature, | |
requires_safety_checker = False, | |
).to(device) | |
else: | |
#pipe = StableDiffusionControlNetPipeline_finetune.from_pretrained(model,safety_checker = None,controlnet=control_net_model, torch_dtype=torch.float16).to(device) | |
pipe = StableDiffusionControlNetPipeline_finetune( | |
vae= local_vae, | |
text_encoder= local_te, | |
tokenizer=local_token, | |
unet=local_unet, | |
controlnet = control_net_model, | |
scheduler = local_sche, | |
safety_checker= None, | |
feature_extractor=local_feature, | |
requires_safety_checker = False, | |
).to(device) | |
else: | |
if mask_inpaiting and img_input: | |
pipe = StableDiffusionInpaintPipeline_finetune( | |
vae= local_vae, | |
text_encoder= local_te, | |
tokenizer=local_token, | |
unet=local_unet, | |
scheduler = local_sche, | |
safety_checker= None, | |
feature_extractor=local_feature, | |
requires_safety_checker = False, | |
).to(device) | |
elif img_input is not None: | |
#pipe = StableDiffusionImg2ImgPipeline_finetune.from_pretrained(model,safety_checker = None, torch_dtype=torch.float16).to(device) | |
pipe = StableDiffusionImg2ImgPipeline_finetune( | |
vae= local_vae, | |
text_encoder= local_te, | |
tokenizer=local_token, | |
unet=local_unet, | |
scheduler = local_sche, | |
safety_checker= None, | |
feature_extractor=local_feature, | |
requires_safety_checker = False, | |
).to(device) | |
else: | |
#pipe = StableDiffusionPipeline_finetune.from_pretrained(model,safety_checker = None, torch_dtype=torch.float16).to(device) | |
pipe = StableDiffusionPipeline_finetune( | |
vae= local_vae, | |
text_encoder= local_te, | |
tokenizer=local_token, | |
unet=local_unet, | |
scheduler = local_sche, | |
safety_checker= None, | |
feature_extractor=local_feature, | |
requires_safety_checker = False, | |
).to(device) | |
else: | |
#global pipe | |
#pipe.text_encoder, pipe.unet,pipe.scheduler,pipe.vae = local_te, local_unet,local_sche,local_vae | |
pipe = StableDiffusionPipeline( | |
text_encoder=local_te, | |
tokenizer=local_token, | |
unet=local_unet, | |
vae=local_vae, | |
scheduler=local_sche, | |
feature_extractor=local_feature, | |
).to(device) | |
#if lora_state is not None and lora_state != "": | |
if lora_group is not None and len(lora_group) > 0: | |
global lora_scale_dict | |
adapter_name_lst = [] | |
adapter_weights_lst = [] | |
for name, file in lora_group.items(): | |
pipe.load_lora_weights(file, adapter_name = name) | |
adapter_name_lst.append(name) | |
adapter_weights_lst.append(lora_scale_dict[name]) | |
pipe.set_adapters(adapter_name_lst, adapter_weights=adapter_weights_lst) | |
#pipe.fuse_lora(lora_scale=lora_scale_dict[name]) | |
#pipe = load_lora_control_pipeline(pipe,lora_state,lora_scale,device) | |
pipe.unet.set_attn_processor(AttnProcessor()) | |
if hasattr(F, "scaled_dot_product_attention"): | |
pipe.unet.set_attn_processor(AttnProcessor2_0()) | |
if diffuser_pipeline == False: | |
pipe.setup_unet(pipe.unet) | |
pipe.tokenizer.prepare_for_tokenization = local_token.prepare_for_tokenization | |
#pipe.tokenizer.added_tokens_encoder = {} | |
#pipe.tokenizer.added_tokens_decoder = {} | |
#pipe.setup_text_encoder(clip_skip, local_te) | |
'''if lora_state is not None and lora_state != "": | |
local_lora.load(lora_state, lora_scale) | |
local_lora.to(local_unet.device, dtype=local_unet.dtype) | |
pipe.text_encoder, pipe.unet,pipe.scheduler,pipe.vae = local_te, local_unet,local_sche,local_vae | |
pipe.setup_unet(local_unet) | |
pipe.tokenizer.prepare_for_tokenization = local_token.prepare_for_tokenization | |
pipe.tokenizer.added_tokens_encoder = {} | |
pipe.tokenizer.added_tokens_decoder = {} | |
pipe.setup_text_encoder(clip_skip, local_te)''' | |
torch.cuda.empty_cache() | |
gc.collect() | |
return pipe | |
def error_str(error, title="Error"): | |
return ( | |
f"""#### {title} | |
{error}""" | |
if error | |
else "" | |
) | |
def make_token_names(embs): | |
all_tokens = [] | |
for name, vec in embs.items(): | |
tokens = [f'emb-{name}-{i}' for i in range(len(vec))] | |
all_tokens.append(tokens) | |
return all_tokens | |
def setup_tokenizer(tokenizer, embs): | |
reg_match = [re.compile(fr"(?:^|(?<=\s|,)){k}(?=,|\s|$)") for k in embs.keys()] | |
clip_keywords = [' '.join(s) for s in make_token_names(embs)] | |
def parse_prompt(prompt: str): | |
for m, v in zip(reg_match, clip_keywords): | |
prompt = m.sub(v, prompt) | |
return prompt | |
def prepare_for_tokenization(self, text: str, is_split_into_words: bool = False, **kwargs): | |
text = parse_prompt(text) | |
r = original_prepare_for_tokenization(text, is_split_into_words, **kwargs) | |
return r | |
tokenizer.prepare_for_tokenization = prepare_for_tokenization.__get__(tokenizer, CLIPTokenizer) | |
return [t for sublist in make_token_names(embs) for t in sublist] | |
def convert_size(size_bytes): | |
if size_bytes == 0: | |
return "0B" | |
size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") | |
i = int(math.floor(math.log(size_bytes, 1024))) | |
p = math.pow(1024, i) | |
s = round(size_bytes / p, 2) | |
return "%s %s" % (s, size_name[i]) | |
def load_lora_control_pipeline(pipeline_control,file_path,lora_scale,device): | |
state_dict = load_file(file_path,device=device) | |
LORA_PREFIX_UNET = 'lora_unet' | |
LORA_PREFIX_TEXT_ENCODER = 'lora_te' | |
alpha = lora_scale | |
visited = [] | |
# directly update weight in diffusers model | |
for key in state_dict: | |
# it is suggested to print out the key, it usually will be something like below | |
# "lora_te_text_model_encoder_layers_0_self_attn_k_proj.lora_down.weight" | |
# as we have set the alpha beforehand, so just skip | |
if '.alpha' in key or key in visited: | |
continue | |
if 'text' in key: | |
layer_infos = key.split('.')[0].split(LORA_PREFIX_TEXT_ENCODER+'_')[-1].split('_') | |
curr_layer = pipeline_control.text_encoder | |
else: | |
layer_infos = key.split('.')[0].split(LORA_PREFIX_UNET+'_')[-1].split('_') | |
curr_layer = pipeline_control.unet | |
# find the target layer | |
temp_name = layer_infos.pop(0) | |
while len(layer_infos) > -1: | |
try: | |
curr_layer = curr_layer.__getattr__(temp_name) | |
if len(layer_infos) > 0: | |
temp_name = layer_infos.pop(0) | |
elif len(layer_infos) == 0: | |
break | |
except Exception: | |
if len(temp_name) > 0: | |
temp_name += '_'+layer_infos.pop(0) | |
else: | |
temp_name = layer_infos.pop(0) | |
# org_forward(x) + lora_up(lora_down(x)) * multiplier | |
pair_keys = [] | |
if 'lora_down' in key: | |
pair_keys.append(key.replace('lora_down', 'lora_up')) | |
pair_keys.append(key) | |
else: | |
pair_keys.append(key) | |
pair_keys.append(key.replace('lora_up', 'lora_down')) | |
# update weight | |
if len(state_dict[pair_keys[0]].shape) == 4: | |
weight_up = state_dict[pair_keys[0]].squeeze(3).squeeze(2).to(torch.float32) | |
weight_down = state_dict[pair_keys[1]].squeeze(3).squeeze(2).to(torch.float32) | |
curr_layer.weight.data += alpha * torch.mm(weight_up, weight_down).unsqueeze(2).unsqueeze(3) | |
else: | |
weight_up = state_dict[pair_keys[0]].to(torch.float32) | |
weight_down = state_dict[pair_keys[1]].to(torch.float32) | |
curr_layer.weight.data += alpha * torch.mm(weight_up, weight_down) | |
# update visited list | |
for item in pair_keys: | |
visited.append(item) | |
torch.cuda.empty_cache() | |
gc.collect() | |
return pipeline_control | |
def colorize(value, vmin=None, vmax=None, cmap='gray_r', invalid_val=-99, invalid_mask=None, background_color=(128, 128, 128, 255), gamma_corrected=False, value_transform=None): | |
"""Converts a depth map to a color image. | |
Args: | |
value (torch.Tensor, numpy.ndarry): Input depth map. Shape: (H, W) or (1, H, W) or (1, 1, H, W). All singular dimensions are squeezed | |
vmin (float, optional): vmin-valued entries are mapped to start color of cmap. If None, value.min() is used. Defaults to None. | |
vmax (float, optional): vmax-valued entries are mapped to end color of cmap. If None, value.max() is used. Defaults to None. | |
cmap (str, optional): matplotlib colormap to use. Defaults to 'magma_r'. | |
invalid_val (int, optional): Specifies value of invalid pixels that should be colored as 'background_color'. Defaults to -99. | |
invalid_mask (numpy.ndarray, optional): Boolean mask for invalid regions. Defaults to None. | |
background_color (tuple[int], optional): 4-tuple RGB color to give to invalid pixels. Defaults to (128, 128, 128, 255). | |
gamma_corrected (bool, optional): Apply gamma correction to colored image. Defaults to False. | |
value_transform (Callable, optional): Apply transform function to valid pixels before coloring. Defaults to None. | |
Returns: | |
numpy.ndarray, dtype - uint8: Colored depth map. Shape: (H, W, 4) | |
""" | |
if isinstance(value, torch.Tensor): | |
value = value.detach().cpu().numpy() | |
value = value.squeeze() | |
if invalid_mask is None: | |
invalid_mask = value == invalid_val | |
mask = np.logical_not(invalid_mask) | |
# normalize | |
vmin = np.percentile(value[mask],2) if vmin is None else vmin | |
vmax = np.percentile(value[mask],85) if vmax is None else vmax | |
if vmin != vmax: | |
value = (value - vmin) / (vmax - vmin) # vmin..vmax | |
else: | |
# Avoid 0-division | |
value = value * 0. | |
# squeeze last dim if it exists | |
# grey out the invalid values | |
value[invalid_mask] = np.nan | |
cmapper = matplotlib.cm.get_cmap(cmap) | |
if value_transform: | |
value = value_transform(value) | |
# value = value / value.max() | |
value = cmapper(value, bytes=True) # (nxmx4) | |
img = value[...] | |
img[invalid_mask] = background_color | |
if gamma_corrected: | |
img = img / 255 | |
img = np.power(img, 2.2) | |
img = img * 255 | |
img = img.astype(np.uint8) | |
return img | |
def adapter_preprocessing(model_adapter,img_control,low_threshold_adapter = None,high_threshold_adapter=None,has_body=False,has_hand=False,has_face=False,preprocessor_adapter=None,disable_preprocessing_adapter=False): | |
if disable_preprocessing_adapter == True : | |
return img_control.copy() | |
device = 'cpu' | |
if torch.cuda.is_available(): | |
device = 'cuda' | |
if model_adapter == 'Canny': | |
img_control = np.array(img_control) | |
img_control = cv2.Canny(img_control, low_threshold_adapter, high_threshold_adapter) | |
img_control = Image.fromarray(img_control) | |
elif model_adapter == 'Openpose': | |
#model_openpose = OpenposeDetector() | |
processor = OpenposeDetector.from_pretrained('lllyasviel/ControlNet').to(device) | |
img_control = processor(img_control, include_body=has_body, include_hand=has_hand, include_face=has_face) | |
#img_control = model_openpose(img_control, has_hand)[0] | |
elif model_adapter == 'Depth': | |
#model_midas = MidasDetector() | |
#img_control = model_midas(resize_image(img_control))[0] | |
if preprocessor_adapter == 'DPT': | |
processor = pipeline('depth-estimation') | |
img_control = processor(img_control)['depth'] | |
img_control = np.array(img_control) | |
img_control = img_control[:, :, None] | |
img_control = np.concatenate([img_control, img_control, img_control], axis=2) | |
img_control = Image.fromarray(img_control) | |
else: | |
processor = MidasDetector.from_pretrained("lllyasviel/Annotators").to(device) | |
img_control = processor(img_control) | |
elif model_adapter == 'Semantic Segmentation': | |
img_control = preprocessing_segmentation(preprocessor_adapter,img_control) | |
elif model_adapter == 'Color': | |
img_control = img_control.resize((8, 8)) | |
img_control = img_control.resize((512, 512), resample=Image.Resampling.NEAREST) | |
elif model_adapter == 'Zoedepth': | |
'''processor = torch.hub.load("isl-org/ZoeDepth", "ZoeD_N", pretrained=True).to(device) | |
img_control = processor.infer_pil(img_control) | |
img_control = Image.fromarray(colorize(img_control)).convert('RGB')''' | |
'''processor = ZoeDetector.from_pretrained("lllyasviel/Annotators").to(device) | |
img_control = processor(img_control)''' | |
processor = ZoeDetector.from_pretrained("valhalla/t2iadapter-aux-models", filename="zoed_nk.pth", model_type="zoedepth_nk").to(device) | |
img_control = processor(img_control, gamma_corrected=True) | |
else: | |
active_model = False | |
if model_adapter == 'Sketch': | |
active_model = True | |
if preprocessor_name == 'HED': | |
processor = HEDdetector.from_pretrained('lllyasviel/Annotators').to(device) | |
else: | |
processor = PidiNetDetector.from_pretrained('lllyasviel/Annotators').to(device) | |
img_control = processor(img_control,scribble=active_model) | |
#img_control = np.array(img_control) | |
#img = cv2.resize(img_control,(width, height)) | |
#img_input = img_input.resize((width, height), Image.LANCZOS) | |
#img_control = img_control.resize((width, height), Image.LANCZOS) | |
if model_adapter != 'Canny' and model_adapter != 'Semantic Segmentation' and model_adapter != 'Color': | |
del processor | |
torch.cuda.empty_cache() | |
gc.collect() | |
return img_control | |
def control_net_preprocessing(control_net_model,img_control,low_threshold = None,high_threshold=None,has_body=False,has_hand=False,has_face=False,preprocessor_name=None,disable_preprocessing=False): | |
if disable_preprocessing == True or control_net_model == 'Instruct Pix2Pix': | |
return img_control.copy() | |
device = 'cpu' | |
if torch.cuda.is_available(): | |
device = 'cuda' | |
if control_net_model == 'Canny': | |
img_control = np.array(img_control) | |
img_control = cv2.Canny(img_control, low_threshold, high_threshold) | |
img_control = img_control[:, :, None] | |
img_control = np.concatenate([img_control, img_control, img_control], axis=2) | |
img_control = Image.fromarray(img_control) | |
elif control_net_model == 'Openpose': | |
#model_openpose = OpenposeDetector() | |
processor = OpenposeDetector.from_pretrained('lllyasviel/ControlNet').to(device) | |
img_control = processor(img_control, include_body=has_body, include_hand=has_hand, include_face=has_face) | |
#img_control = model_openpose(img_control, has_hand)[0] | |
elif control_net_model == 'Depth': | |
#model_midas = MidasDetector() | |
#img_control = model_midas(resize_image(img_control))[0] | |
if preprocessor_name == 'DPT': | |
processor = pipeline('depth-estimation') | |
img_control = processor(img_control)['depth'] | |
img_control = np.array(img_control) | |
img_control = img_control[:, :, None] | |
img_control = np.concatenate([img_control, img_control, img_control], axis=2) | |
img_control = Image.fromarray(img_control) | |
else: | |
processor = MidasDetector.from_pretrained("lllyasviel/Annotators").to(device) | |
img_control = processor(img_control) | |
elif control_net_model == 'Lineart (anime)': | |
processor = LineartAnimeDetector.from_pretrained("lllyasviel/Annotators").to(device) | |
img_control = processor(img_control) | |
#img_control = np.array(img_control) | |
elif control_net_model == 'Lineart': | |
processor = LineartDetector.from_pretrained("lllyasviel/Annotators").to(device) | |
img_control = processor(img_control) | |
#img_control = np.array(img_control) | |
elif control_net_model == 'MLSD': | |
processor = MLSDdetector.from_pretrained("lllyasviel/ControlNet").to(device) | |
img_control = processor(img_control) | |
#img_control = np.array(img_control) | |
elif control_net_model == 'Semantic Segmentation': | |
img_control = preprocessing_segmentation(preprocessor_name,img_control) | |
elif control_net_model == 'Normal Map': | |
processor = NormalBaeDetector.from_pretrained("lllyasviel/Annotators").to(device) | |
img_control = processor(img_control) | |
elif control_net_model == 'Shuffle': | |
processor = ContentShuffleDetector() | |
img_control = processor(img_control) | |
else: | |
active_model = False | |
if control_net_model == 'Scribble': | |
active_model = True | |
if preprocessor_name == 'HED': | |
processor = HEDdetector.from_pretrained('lllyasviel/Annotators').to(device) | |
else: | |
processor = PidiNetDetector.from_pretrained('lllyasviel/Annotators').to(device) | |
img_control = processor(img_control,scribble=active_model) | |
#img_control = np.array(img_control) | |
#img = cv2.resize(img_control,(width, height)) | |
#img_input = img_input.resize((width, height), Image.LANCZOS) | |
#img_control = img_control.resize((width, height), Image.LANCZOS) | |
if control_net_model != 'Canny' and control_net_model != 'Semantic Segmentation': | |
del processor | |
torch.cuda.empty_cache() | |
gc.collect() | |
return img_control | |
def add_embedding(pipe_model,embs): | |
tokenizer, text_encoder = pipe_model.tokenizer, pipe_model.text_encoder | |
if embs is not None and len(embs) > 0: | |
ti_embs = {} | |
for name, file in embs.items(): | |
if str(file).endswith(".pt"): | |
loaded_learned_embeds = torch.load(file, map_location="cpu") | |
else: | |
loaded_learned_embeds = load_file(file, device="cpu") | |
loaded_learned_embeds = loaded_learned_embeds["string_to_param"]["*"] if "string_to_param" in loaded_learned_embeds else loaded_learned_embeds | |
if isinstance(loaded_learned_embeds, dict): | |
#loaded_learned_embeds = list(loaded_learned_embeds.values())[-1] | |
ti_embs.update(loaded_learned_embeds) | |
else: | |
ti_embs[name] = loaded_learned_embeds | |
if len(ti_embs) > 0: | |
'''for key, value in ti_embs.items(): | |
if isinstance(value, dict): | |
ti_embs.pop(key) | |
ti_embs.update(value)''' | |
tokens = setup_tokenizer(tokenizer, ti_embs) | |
added_tokens = tokenizer.add_tokens(tokens) | |
delta_weight = torch.cat([val for val in ti_embs.values()], dim=0) | |
assert added_tokens == delta_weight.shape[0] | |
text_encoder.resize_token_embeddings(len(tokenizer)) | |
token_embeds = text_encoder.get_input_embeddings().weight.data | |
token_embeds[-delta_weight.shape[0]:] = delta_weight | |
torch.cuda.empty_cache() | |
gc.collect() | |
return pipe_model | |
def add_embedding_with_diffusers(pipe,embs): | |
if embs is not None and len(embs) > 0: | |
for name, file in embs.items(): | |
pipe.load_textual_inversion(file) | |
torch.cuda.empty_cache() | |
gc.collect() | |
return pipe | |
def mask_region_apply_ip_adapter(mask,invert_ip_adapter_mask_mode): | |
if mask is None: | |
return None | |
#define black is region masked | |
if not isinstance(mask,List): | |
mask = [mask] | |
if len(mask) == 0: | |
return None | |
if invert_ip_adapter_mask_mode: | |
mask = [ImageOps.invert(i).convert('RGB') for i in mask] | |
processor = IPAdapterMaskProcessor() | |
masks = processor.preprocess(mask) | |
'''mask = mask.resize((width, height), Image.BICUBIC) | |
mask = np.array(mask).astype(np.float32) / 255.0 | |
#If the region is black apply ( 0 = black) | |
mask = np.expand_dims(np.where(mask==0, 1,0)[:, :, 0], axis=0) | |
if mask.ndim == 3: | |
mask = mask[..., None] | |
mask = torch.from_numpy(mask.transpose(0, 3, 1, 2)) | |
return mask[0]''' | |
return masks | |
def ip_adapter_face_id_embedding(lst_img_face_id_embed,device,dtype,guidance_scale,plus_faceid = False): | |
ref_images_embeds = [] | |
ref_unc_images_embeds = [] | |
ip_adapter_images = [] | |
app = FaceAnalysis(name="buffalo_l", providers=['CUDAExecutionProvider', 'CPUExecutionProvider']) | |
app.prepare(ctx_id=0, det_size=(640, 640)) | |
if not isinstance(lst_img_face_id_embed,list): | |
lst_img_face_id_embed = [lst_img_face_id_embed] | |
for im in lst_img_face_id_embed: | |
#im = load_image(im) | |
image = cv2.cvtColor(np.asarray(im), cv2.COLOR_BGR2RGB) | |
faces = app.get(image) #faces is a list | |
if len(faces) == 0: | |
raise ValueError( | |
"Can not find any faces in the image." | |
) | |
if plus_faceid: | |
ip_adapter_images.append(face_align.norm_crop(image, landmark=faces[0].kps, image_size=224)) #For plus faceid | |
image = torch.from_numpy(faces[0].normed_embedding) | |
image_embeds = image.unsqueeze(0) | |
uncond_image_embeds = torch.zeros_like(image_embeds) | |
ref_images_embeds.append(image_embeds) | |
ref_unc_images_embeds.append(uncond_image_embeds) | |
ref_images_embeds = torch.stack(ref_images_embeds, dim=0) | |
if guidance_scale > 1 : | |
ref_unc_images_embeds = torch.stack(ref_unc_images_embeds, dim=0) | |
single_image_embeds = torch.cat([ref_unc_images_embeds, ref_images_embeds], dim=0).to(device,dtype=dtype) | |
else: | |
single_image_embeds = ref_images_embeds.to(device,dtype=dtype) | |
return single_image_embeds,ip_adapter_images | |
lst_control = [] | |
lst_adapter =[] | |
lst_ip_adapter = [] | |
current_number_ip_adapter = 0 | |
current_number_control = 0 | |
current_number_adapter = 0 | |
def inference( | |
prompt, | |
guidance, | |
steps, | |
width=512, | |
height=512, | |
clip_skip =2, | |
seed=0, | |
neg_prompt="", | |
state=None, | |
img_input=None, | |
i2i_scale=0.5, | |
hr_enabled=False, | |
hr_method="Latent", | |
hr_scale=1.5, | |
hr_denoise=0.8, | |
sampler="DPM++ 2M Karras", | |
embs=None, | |
model=None, | |
lora_group = None, | |
#lora_state=None, | |
#lora_scale=None, | |
formula_setting = None, | |
controlnet_enabled = False, | |
control_net_model = None, | |
low_threshold = None, | |
high_threshold = None, | |
has_body = False, | |
has_hand = False, | |
has_face = False, | |
img_control = None, | |
image_condition = None, | |
controlnet_scale = 0, | |
preprocessor_name = None, | |
diffuser_pipeline = False, | |
sampler_hires="DPM++ 2M Karras", | |
latent_processing = 0, | |
control_guidance_start = 0.0, | |
control_guidance_end = 1.0, | |
multi_controlnet = False, | |
disable_preprocessing = False, | |
region_condition = False, | |
hr_process_enabled = False, | |
ip_adapter = False, | |
model_ip_adapter = None, | |
inf_adapt_image = None, | |
inf_adapt_image_strength = 1.0, | |
hr_region_condition = False, | |
adapter_enabled = False, | |
model_adapter = None, | |
low_threshold_adapter = None, | |
high_threshold_adapter = None, | |
has_body_openpose_adapter = False, | |
has_hand_openpose_adapter = False, | |
has_face_openpose_adapter = False, | |
adapter_img = None, | |
image_condition_adapter = None, | |
preprocessor_adapter = None, | |
adapter_conditioning_scale = 0, | |
adapter_conditioning_factor = None, | |
multi_adapter = False, | |
disable_preprocessing_adapter = False, | |
ip_adapter_multi = False, | |
guidance_rescale = 0, | |
inf_control_adapt_image = None, | |
long_encode = 0, | |
inpaiting_mode = False, | |
invert_mask_mode = False, | |
mask_upload = None, | |
inf_image_inpaiting = None, | |
invert_ip_adapter_mask_mode = True, | |
vae_used = "Default", | |
): | |
global formula,controlnet_type,lst_control,lst_adapter,model_ip_adapter_type,adapter_type,lst_ip_adapter,current_number_ip_adapter,encoding_type | |
img_control_input = None | |
device = "cpu" | |
if torch.cuda.is_available(): | |
device = "cuda" | |
if region_condition == False: | |
state = None | |
mask_inpaiting = None | |
if inpaiting_mode and isinstance(inf_image_inpaiting,dict): | |
mask_inpaiting = inf_image_inpaiting["mask"] | |
img_input = inf_image_inpaiting["image"] | |
diff = ImageChops.difference(mask_inpaiting, img_input) | |
if diff.getbbox() is None: | |
mask_inpaiting = None | |
if inpaiting_mode and mask_upload: | |
mask_inpaiting = mask_upload | |
if mask_inpaiting and invert_mask_mode: | |
mask_inpaiting = ImageOps.invert(mask_inpaiting).convert('RGB') | |
if adapter_enabled: | |
if len(lst_adapter) > 0 and multi_adapter: | |
adapter_img = [] | |
model_adapter = [] | |
adapter_conditioning_scale = [] | |
adapter_conditioning_factor = [] | |
for i in range( len(lst_adapter)): | |
setting_processing = list(lst_adapter[i].items()) | |
setting_processing = setting_processing[:-2] | |
setting_processing = dict(setting_processing) | |
image_sp_adapter = adapter_preprocessing(**setting_processing) | |
adapter_img.append(image_sp_adapter) | |
adapter_sp = adapter_type[lst_adapter[i]["model_adapter"]] | |
model_adapter.append(setup_adapter(adapter_sp,device)) | |
adapter_conditioning_scale.append(float(lst_adapter[i]["adapter_conditioning_scale"])) | |
adapter_conditioning_factor.append(float(lst_adapter[i]["adapter_conditioning_factor"])) | |
adapter_conditioning_factor = adapter_conditioning_factor[-1] | |
torch.cuda.empty_cache() | |
gc.collect() | |
elif adapter_img is not None and multi_adapter ==False: | |
adapter_img = adapter_preprocessing(model_adapter,adapter_img,low_threshold_adapter,high_threshold_adapter,has_body_openpose_adapter,has_hand_openpose_adapter,has_face_openpose_adapter,preprocessor_adapter,disable_preprocessing_adapter) | |
model_adapter = adapter_type[model_adapter] | |
adapter_conditioning_scale = float(adapter_conditioning_scale) | |
adapter_conditioning_factor = float(adapter_conditioning_factor) | |
torch.cuda.empty_cache() | |
gc.collect() | |
model_adapter=setup_adapter(model_adapter,device) | |
torch.cuda.empty_cache() | |
gc.collect() | |
else: | |
model_adapter = None | |
adapter_img = None | |
else: | |
model_adapter = None | |
adapter_img = None | |
if controlnet_enabled: | |
if len(lst_control) > 0 and multi_controlnet: | |
img_control = [] | |
control_net_model = [] | |
controlnet_scale = [] | |
control_guidance_start = [] | |
control_guidance_end = [] | |
for i in range( len(lst_control)): | |
setting_processing = list(lst_control[i].items()) | |
setting_processing = setting_processing[:-3] | |
setting_processing = dict(setting_processing) | |
image_sp_control = control_net_preprocessing(**setting_processing) | |
img_control.append(image_sp_control) | |
conrol_net_sp = controlnet_type[lst_control[i]["control_net_model"]] | |
control_net_model.append(setup_controlnet(conrol_net_sp,device)) | |
controlnet_scale.append(float(lst_control[i]["controlnet_scale"])) | |
control_guidance_start.append(float(lst_control[i]["control_guidance_start"])) | |
control_guidance_end.append(float(lst_control[i]["control_guidance_end"])) | |
torch.cuda.empty_cache() | |
gc.collect() | |
elif img_control is not None and multi_controlnet ==False: | |
img_control = control_net_preprocessing(control_net_model,img_control,low_threshold,high_threshold,has_body,has_hand,has_face,preprocessor_name,disable_preprocessing) | |
control_net_model = controlnet_type[control_net_model] | |
controlnet_scale = float(controlnet_scale) | |
control_guidance_start = float(control_guidance_start) | |
control_guidance_end = float(control_guidance_end) | |
torch.cuda.empty_cache() | |
gc.collect() | |
control_net_model=setup_controlnet(control_net_model,device) | |
torch.cuda.empty_cache() | |
gc.collect() | |
else: | |
control_net_model = None | |
img_control = None | |
else: | |
control_net_model = None | |
img_control = None | |
keys_f = [k[0] for k in formula] | |
formula_setting = formula[keys_f.index(formula_setting)][1] | |
if seed is None or seed < 0: | |
seed = random.randint(0, sys.maxsize) | |
#lora_state = lora_dict[lora_state] | |
pipe = setup_model(model,clip_skip, lora_group,diffuser_pipeline,control_net_model,img_input,device,mask_inpaiting,vae_used) | |
generator = torch.Generator(device).manual_seed(int(seed)) | |
if formula_setting == 0: | |
weight_func = lambda w, sigma, qk: w * sigma * qk.std() | |
elif formula_setting == 1: | |
weight_func = lambda w, sigma, qk: w * math.log(1 + sigma) * qk.max() | |
elif formula_setting == 2: | |
weight_func = lambda w, sigma, qk: w * math.log(1 + sigma) * qk.std() | |
else: | |
weight_func = lambda w, sigma, qk: w * math.log(1 + sigma**2) * qk.std() | |
start_time = time.time() | |
sampler_name, sampler_opt = None, None | |
'''for label, funcname, options in samplers_k_diffusion: | |
if label == sampler_hires: | |
sampler_name_hires, sampler_opt_hires = funcname, options''' | |
#add_Textual Inversion or text embeddings | |
pipe = add_embedding(pipe,embs) | |
width_resize_mask_ipadapter = width | |
height_resize_mask_ipadapter = height | |
if img_input is not None: | |
width_resize_mask_ipadapter = img_input.width | |
height_resize_mask_ipadapter = img_input.height | |
setup_model_t2i_adapter(pipe,model_adapter) | |
cross_attention_kwargs = {} | |
#Get type encoding | |
long_encode = encoding_type[long_encode] | |
ip_adapter_image_embeds = None | |
faceid_plus_v2 = False | |
#clip_embeds = None #Support for faceid_plus | |
if ip_adapter == True: | |
#inf_adapt_image = None | |
ip_adapter_images_faceid_plus = [] | |
if ip_adapter_multi and len(lst_ip_adapter) > 0: | |
ip_adapter_image_lst =[] | |
model_ip_adapter_lst = [] | |
scale_ip_adapter_lst = [] | |
region_aplly_lst = [] | |
ip_adapter_image_vitg_lst =[] | |
model_ip_adapter_vitg_lst = [] | |
scale_ip_adapter_vitg_lst = [] | |
region_aplly_vitg_lst = [] | |
ip_adapter_faceid_image_lst =[] | |
model_ip_adapter_faceid_lst = [] | |
scale_ip_adapter_faceid_lst = [] | |
region_aplly_lst_faceid = [] | |
ip_adapter_faceid_plus_image_lst =[] | |
model_ip_adapter_faceid_plus_lst = [] | |
scale_ip_adapter_faceid_plus_lst = [] | |
region_aplly_lst_faceid_plus = [] | |
#Support not marks | |
img_full_black = Image.new('RGB', (width, height), (0, 0, 0)) | |
img_full_white = Image.new('RGB', (width, height), (255, 255, 255)) | |
for i in lst_ip_adapter: | |
if 'VIT-G' in i["model"]: | |
ip_adapter_image_vitg_lst.append(i["image"]) | |
model_ip_adapter_vitg_lst.append(model_ip_adapter_type[i["model"]]) | |
scale_ip_adapter_vitg_lst.append(float(i["scale"])) | |
if i["region_apply"] is not None: | |
region_aplly_vitg_lst.append(i["region_apply"]) | |
else: | |
if invert_ip_adapter_mask_mode: | |
region_aplly_vitg_lst.append(img_full_black) | |
else: | |
region_aplly_vitg_lst.append(img_full_white) | |
elif 'FaceID' not in i["model"]: | |
ip_adapter_image_lst.append(i["image"]) | |
model_ip_adapter_lst.append(model_ip_adapter_type[i["model"]]) | |
scale_ip_adapter_lst.append(float(i["scale"])) | |
if i["region_apply"] is not None: | |
region_aplly_lst.append(i["region_apply"]) | |
else: | |
if invert_ip_adapter_mask_mode: | |
region_aplly_lst.append(img_full_black) | |
else: | |
region_aplly_lst.append(img_full_white) | |
elif 'Plus FaceID' in i["model"]: | |
if 'Plus FaceIDv2' in i["model"]: | |
faceid_plus_v2 = True | |
ip_adapter_faceid_plus_image_lst.append(i["image"]) | |
model_ip_adapter_faceid_plus_lst.append(model_ip_adapter_type[i["model"]]) | |
scale_ip_adapter_faceid_plus_lst.append(float(i["scale"])) | |
if i["region_apply"] is not None: | |
region_aplly_lst_faceid_plus.append(i["region_apply"]) | |
else: | |
if invert_ip_adapter_mask_mode: | |
region_aplly_lst_faceid_plus.append(img_full_black) | |
else: | |
region_aplly_lst_faceid_plus.append(img_full_white) | |
else: | |
ip_adapter_faceid_image_lst.append(i["image"]) | |
model_ip_adapter_faceid_lst.append(model_ip_adapter_type[i["model"]]) | |
scale_ip_adapter_faceid_lst.append(float(i["scale"])) | |
if i["region_apply"] is not None: | |
region_aplly_lst_faceid.append(i["region_apply"]) | |
else: | |
if invert_ip_adapter_mask_mode: | |
region_aplly_lst_faceid.append(img_full_black) | |
else: | |
region_aplly_lst_faceid.append(img_full_white) | |
#Concat faceid and ipadapter | |
none_img_encoder = False | |
# if len(model_ip_adapter_lst) == 0: | |
# only_face_id = 1 | |
if len(ip_adapter_faceid_image_lst) > 0 or len(ip_adapter_image_vitg_lst) > 0 or len(ip_adapter_faceid_plus_image_lst) > 0: | |
#Image_encode vit-H | |
ip_adapter_embeds = [] | |
ip_adapter_vitg_embeds = [] | |
ip_adapter_image_embeds_faceid = [] | |
ip_adapter_image_embeds_faceid_plus = [] | |
if len(model_ip_adapter_lst) > 0: | |
pipe.load_ip_adapter("h94/IP-Adapter", subfolder="models", weight_name=model_ip_adapter_lst) | |
pipe.set_ip_adapter_scale(scale_ip_adapter_lst) | |
ip_adapter_embeds = pipe.prepare_ip_adapter_image_embeds(ip_adapter_image_lst,None,device,1, guidance>1) | |
pipe.unload_ip_adapter() | |
if len(ip_adapter_faceid_image_lst) > 0: | |
ip_adapter_image_embeds_faceid,_ = ip_adapter_face_id_embedding(ip_adapter_faceid_image_lst,device,pipe.unet.dtype,guidance,False) | |
ip_adapter_image_embeds_faceid = [ip_adapter_image_embeds_faceid] | |
if len(ip_adapter_faceid_plus_image_lst) >0: | |
ip_adapter_image_embeds_faceid_plus,ip_adapter_images_faceid_plus = ip_adapter_face_id_embedding(ip_adapter_faceid_plus_image_lst,device,pipe.unet.dtype,guidance,True) | |
ip_adapter_image_embeds_faceid_plus = [ip_adapter_image_embeds_faceid_plus] | |
#Image encoder vit-G | |
if len(ip_adapter_image_vitg_lst) > 0: | |
pipe.load_ip_adapter("h94/IP-Adapter", subfolder="models", weight_name=model_ip_adapter_vitg_lst,image_encoder_folder=None) | |
pipe.set_ip_adapter_scale(scale_ip_adapter_vitg_lst) | |
pipe.image_encoder = CLIPVisionModelWithProjection.from_pretrained( | |
"h94/IP-Adapter", subfolder="sdxl_models/image_encoder", | |
).to(device, dtype=pipe.unet.dtype) | |
ip_adapter_vitg_embeds = pipe.prepare_ip_adapter_image_embeds(ip_adapter_image_vitg_lst,None,device,1, guidance>1) | |
pipe.unload_ip_adapter() | |
ip_adapter_image_embeds = ip_adapter_embeds + ip_adapter_image_embeds_faceid + ip_adapter_vitg_embeds + ip_adapter_image_embeds_faceid_plus | |
inf_adapt_image = None | |
none_img_encoder = True | |
if not isinstance(ip_adapter_image_embeds, list): | |
ip_adapter_image_embeds = [ip_adapter_image_embeds] | |
else: | |
inf_adapt_image = ip_adapter_image_lst | |
ip_adapter_image_embeds = None | |
region_aplly_lst = region_aplly_lst + region_aplly_lst_faceid + region_aplly_vitg_lst + region_aplly_lst_faceid_plus | |
load_model = ["h94/IP-Adapter"]*len(model_ip_adapter_lst) + ["h94/IP-Adapter-FaceID"]*len(model_ip_adapter_faceid_lst) + ["h94/IP-Adapter"]*len(model_ip_adapter_vitg_lst) + ["h94/IP-Adapter-FaceID"]*len(model_ip_adapter_faceid_plus_lst) | |
subfolder = ["models"]*len(model_ip_adapter_lst) + [None]*len(model_ip_adapter_faceid_lst) + ["models"] * len(model_ip_adapter_vitg_lst) + [None]*len(model_ip_adapter_faceid_plus_lst) | |
model_ip_adapter_lst = model_ip_adapter_lst + model_ip_adapter_faceid_lst + model_ip_adapter_vitg_lst + model_ip_adapter_faceid_plus_lst | |
scale_ip_adapter_lst = scale_ip_adapter_lst + scale_ip_adapter_faceid_lst + scale_ip_adapter_vitg_lst + scale_ip_adapter_faceid_plus_lst | |
clip_embeds = None | |
if len(ip_adapter_images_faceid_plus) > 0: | |
pipe.load_ip_adapter("h94/IP-Adapter-FaceID", subfolder=None, weight_name=model_ip_adapter_faceid_plus_lst,image_encoder_folder=None) | |
pipe.image_encoder = CLIPVisionModelWithProjection.from_pretrained( | |
"laion/CLIP-ViT-H-14-laion2B-s32B-b79K" | |
).to(device, dtype=pipe.unet.dtype) | |
# Extract CLIP embeddings | |
clip_embeds = pipe.prepare_ip_adapter_image_embeds([ip_adapter_images_faceid_plus], None, device, 1, guidance>1)[0] #num_images = 1 | |
pipe.unload_ip_adapter() | |
if none_img_encoder: | |
pipe.load_ip_adapter(load_model, subfolder=subfolder, weight_name=model_ip_adapter_lst,image_encoder_folder=None) | |
else: | |
pipe.load_ip_adapter(load_model, subfolder=subfolder, weight_name=model_ip_adapter_lst) | |
pipe.set_ip_adapter_scale(scale_ip_adapter_lst) | |
if len(ip_adapter_images_faceid_plus) > 0: | |
pipe.image_encoder = CLIPVisionModelWithProjection.from_pretrained( | |
"laion/CLIP-ViT-H-14-laion2B-s32B-b79K" | |
).to(device, dtype=pipe.unet.dtype) | |
# Set CLIP embeddings as class parameter | |
pipe.unet.encoder_hid_proj.image_projection_layers[0].clip_embeds = clip_embeds.to(dtype=pipe.unet.dtype) | |
pipe.unet.encoder_hid_proj.image_projection_layers[0].shortcut = faceid_plus_v2 | |
cross_attention_kwargs = {"ip_adapter_masks":mask_region_apply_ip_adapter(region_aplly_lst,invert_ip_adapter_mask_mode)} | |
elif inf_adapt_image is not None and ip_adapter_multi == False: | |
if 'VIT-G' in model_ip_adapter: | |
model_ip_adapter = model_ip_adapter_type[model_ip_adapter] | |
pipe.load_ip_adapter("h94/IP-Adapter", subfolder="models", weight_name=model_ip_adapter,image_encoder_folder=None) | |
pipe.set_ip_adapter_scale(float(inf_adapt_image_strength)) | |
pipe.image_encoder = CLIPVisionModelWithProjection.from_pretrained( | |
"h94/IP-Adapter", subfolder="sdxl_models/image_encoder", | |
).to(device, dtype=pipe.unet.dtype) | |
cross_attention_kwargs = {"ip_adapter_masks":mask_region_apply_ip_adapter(inf_control_adapt_image,invert_ip_adapter_mask_mode)} | |
elif 'FaceID' not in model_ip_adapter: | |
model_ip_adapter = model_ip_adapter_type[model_ip_adapter] | |
pipe.load_ip_adapter("h94/IP-Adapter", subfolder="models", weight_name=model_ip_adapter) | |
pipe.set_ip_adapter_scale(float(inf_adapt_image_strength)) | |
cross_attention_kwargs = {"ip_adapter_masks":mask_region_apply_ip_adapter(inf_control_adapt_image,invert_ip_adapter_mask_mode)} | |
elif 'Plus FaceID' in model_ip_adapter: | |
if 'Plus FaceIDv2' in model_ip_adapter: | |
faceid_plus_v2 = True | |
model_ip_adapter = model_ip_adapter_type[model_ip_adapter] | |
pipe.load_ip_adapter("h94/IP-Adapter-FaceID", subfolder=None, weight_name=model_ip_adapter,image_encoder_folder=None) | |
pipe.set_ip_adapter_scale(float(inf_adapt_image_strength)) | |
ip_adapter_image_embeds,ip_adapter_images_faceid_plus = ip_adapter_face_id_embedding([inf_adapt_image],device,pipe.unet.dtype,guidance,True) | |
if not isinstance(ip_adapter_image_embeds, list): | |
ip_adapter_image_embeds = [ip_adapter_image_embeds] | |
cross_attention_kwargs = {"ip_adapter_masks":mask_region_apply_ip_adapter(inf_control_adapt_image,invert_ip_adapter_mask_mode)} | |
if len(ip_adapter_images_faceid_plus) > 0: | |
pipe.image_encoder = CLIPVisionModelWithProjection.from_pretrained( | |
"laion/CLIP-ViT-H-14-laion2B-s32B-b79K" | |
).to(device, dtype=pipe.unet.dtype) | |
# Extract CLIP embeddings | |
clip_embeds = pipe.prepare_ip_adapter_image_embeds([ip_adapter_images_faceid_plus], None, device, 1, guidance>1)[0] #num_images = 1 | |
# Set CLIP embeddings as class parameter | |
pipe.unet.encoder_hid_proj.image_projection_layers[0].clip_embeds = clip_embeds.to(dtype=pipe.unet.dtype) | |
pipe.unet.encoder_hid_proj.image_projection_layers[0].shortcut = faceid_plus_v2 | |
#pipe.unload_ip_adapter() | |
inf_adapt_image = None | |
else: | |
model_ip_adapter = model_ip_adapter_type[model_ip_adapter] | |
pipe.load_ip_adapter("h94/IP-Adapter-FaceID", subfolder=None, weight_name=model_ip_adapter,image_encoder_folder=None) | |
pipe.set_ip_adapter_scale(float(inf_adapt_image_strength)) | |
ip_adapter_image_embeds,_ = ip_adapter_face_id_embedding([inf_adapt_image],device,pipe.unet.dtype,guidance,False) | |
if not isinstance(ip_adapter_image_embeds, list): | |
ip_adapter_image_embeds = [ip_adapter_image_embeds] | |
cross_attention_kwargs = {"ip_adapter_masks":mask_region_apply_ip_adapter(inf_control_adapt_image,invert_ip_adapter_mask_mode)} | |
inf_adapt_image = None | |
else: | |
inf_adapt_image = None | |
else: | |
inf_adapt_image = None | |
if diffuser_pipeline: | |
for label, funcname, options in samplers_diffusers: | |
if label == sampler: | |
sampler_name, sampler_opt = funcname, options | |
if label == sampler_hires: | |
sampler_name_hires, sampler_opt_hires = funcname, options | |
pipe.scheduler = sampler_name(pipe.scheduler.config) | |
output_type = 'pil' | |
if hr_enabled and img_input is None: | |
output_type = 'latent' | |
#Need to reduce clip_skip by 1 because when using clip_skip the value will increase in the encode_prompt | |
config = { | |
"prompt": prompt, | |
"negative_prompt": neg_prompt, | |
"num_inference_steps": int(steps), | |
"guidance_scale": guidance, | |
"generator": generator, | |
"region_map_state": state, | |
#"region_map_attn_weight": g_strength, | |
"latent_processing": latent_processing, | |
'weight_func':weight_func, | |
'clip_skip' :int(clip_skip), | |
"output_type" : output_type, | |
"image_t2i_adapter":adapter_img, | |
"adapter_conditioning_scale":adapter_conditioning_scale, | |
"adapter_conditioning_factor":adapter_conditioning_factor, | |
"guidance_rescale":guidance_rescale, | |
"long_encode" : int(long_encode), | |
"ip_adapter_image_embeds": ip_adapter_image_embeds, | |
"cross_attention_kwargs": cross_attention_kwargs | |
} | |
'''if ip_adapter == False: | |
inf_adapt_image = None''' | |
if mask_inpaiting and img_input and inpaiting_mode and control_net_model: | |
result = pipe(mask_image = mask_inpaiting,width=img_input.width,height=img_input.height, controlnet_conditioning_scale = controlnet_scale,inf_adapt_image=inf_adapt_image,image =img_input , control_image=img_control,strength = i2i_scale,control_guidance_start=control_guidance_start,control_guidance_end=control_guidance_end,**config) | |
elif control_net_model is not None and img_input is not None: | |
result = pipe(controlnet_conditioning_scale = controlnet_scale,inf_adapt_image=inf_adapt_image,image =img_input , control_image=img_control,strength = i2i_scale,control_guidance_start=control_guidance_start,control_guidance_end=control_guidance_end,**config) | |
elif control_net_model is not None: | |
result = pipe(width = width,height = height,controlnet_conditioning_scale = controlnet_scale, image=img_control,control_guidance_start=control_guidance_start,control_guidance_end=control_guidance_end,ip_adapter_image=inf_adapt_image,**config) | |
elif mask_inpaiting and img_input and inpaiting_mode: | |
result = pipe(image =img_input,ip_adapter_image=inf_adapt_image,mask_image = mask_inpaiting,strength=i2i_scale,width=img_input.width,height=img_input.height,**config) | |
elif img_input is not None: | |
result = pipe(image =img_input,strength = i2i_scale,ip_adapter_image=inf_adapt_image,**config) | |
else: | |
result = pipe(height = height, width = width,ip_adapter_image=inf_adapt_image,**config) | |
if hr_enabled and img_input is None: | |
del pipe | |
torch.cuda.empty_cache() | |
gc.collect() | |
pipe = setup_model(model,clip_skip, lora_group,diffuser_pipeline,control_net_model,True,device,vae_used) | |
#add_Textual Inversion or text embeddings | |
pipe = add_embedding(pipe,embs) | |
pipe.scheduler = sampler_name_hires(pipe.scheduler.config) | |
vae_scale_factor = 2 ** (len(pipe.vae.config.block_out_channels) - 1) | |
target_height = int(height * upscale_x // vae_scale_factor )* 8 | |
target_width = int(width * upscale_x // vae_scale_factor)*8 | |
latents = result[-1].unsqueeze(0) | |
#print(latents.shape) | |
latents = torch.nn.functional.interpolate( | |
latents, | |
size=( | |
int(target_height // vae_scale_factor), | |
int(target_width // vae_scale_factor), | |
), | |
mode=latent_upscale_modes[hr_method]["upscale_method"], | |
antialias=latent_upscale_modes[hr_method]["upscale_antialias"], | |
) | |
config = { | |
"prompt": prompt, | |
"negative_prompt": neg_prompt, | |
"num_inference_steps": int(steps), | |
"guidance_scale": guidance, | |
"generator": generator, | |
"region_map_state": state, | |
#"region_map_attn_weight": g_strength, | |
"latent_processing": hr_process_enabled, | |
'weight_func':weight_func, | |
'clip_skip' :int(clip_skip), | |
"image_t2i_adapter":adapter_img, | |
"adapter_conditioning_scale":adapter_conditioning_scale, | |
"adapter_conditioning_factor":adapter_conditioning_factor, | |
"guidance_rescale":guidance_rescale, | |
"long_encode" : int(long_encode), | |
"ip_adapter_image_embeds": ip_adapter_image_embeds, | |
"cross_attention_kwargs":cross_attention_kwargs, | |
} | |
if control_net_model is not None: | |
upscale_result = pipe(width=int(target_width),height=int(target_height),controlnet_conditioning_scale = controlnet_scale,image = latents, control_image=img_control,strength = hr_denoise,control_guidance_start=control_guidance_start,control_guidance_end=control_guidance_end,**config) | |
else: | |
upscale_result = pipe(width=int(target_width),height=int(target_height),image = latents,strength = hr_denoise,**config) | |
#print(type(upscale_result[-1])) | |
#print(upscale_result) | |
result = result[:-1] + upscale_result | |
else: | |
for label, funcname, options in samplers_k_diffusion: | |
if label == sampler: | |
sampler_name, sampler_opt = funcname, options | |
if label == sampler_hires: | |
sampler_name_hires, sampler_opt_hires = funcname, options | |
config = { | |
"negative_prompt": neg_prompt, | |
"num_inference_steps": int(steps), | |
"guidance_scale": guidance, | |
"generator": generator, | |
"sampler_name": sampler_name, | |
"sampler_opt": sampler_opt, | |
"region_map_state": state, | |
#"region_map_attn_weight": g_strength, | |
"start_time": start_time, | |
"timeout": timeout, | |
"latent_processing": latent_processing, | |
'weight_func':weight_func, | |
'seed': int(seed), | |
'sampler_name_hires': sampler_name_hires, | |
'sampler_opt_hires': sampler_opt_hires, | |
"latent_upscale_processing": hr_process_enabled, | |
"ip_adapter_image":inf_adapt_image, | |
"controlnet_conditioning_scale":controlnet_scale, | |
"control_img": img_control, | |
"control_guidance_start":control_guidance_start, | |
"control_guidance_end":control_guidance_end, | |
"image_t2i_adapter":adapter_img, | |
"adapter_conditioning_scale":adapter_conditioning_scale, | |
"adapter_conditioning_factor":adapter_conditioning_factor, | |
"guidance_rescale":guidance_rescale, | |
'clip_skip' :int(clip_skip), | |
"long_encode" : int(long_encode), | |
"ip_adapter_image_embeds": ip_adapter_image_embeds, | |
"cross_attention_kwargs":cross_attention_kwargs, | |
} | |
#if control_net_model is not None: | |
pipe.setup_controlnet(control_net_model) | |
if mask_inpaiting and img_input and inpaiting_mode: | |
result = pipe.inpaiting(prompt, image=img_input,mask_image = mask_inpaiting,strength=i2i_scale,width=img_input.width,height=img_input.height, **config) | |
elif img_input is not None: | |
result = pipe.img2img(prompt, image=img_input, strength=i2i_scale,width=img_input.width,height=img_input.height, **config) | |
elif hr_enabled: | |
result = pipe.txt2img( | |
prompt, | |
width=width, | |
height=height, | |
upscale=True, | |
upscale_x=hr_scale, | |
upscale_denoising_strength=hr_denoise, | |
**config, | |
**latent_upscale_modes[hr_method], | |
) | |
else: | |
result = pipe.txt2img(prompt, width=width, height=height, **config) | |
end_time = time.time() | |
vram_free, vram_total = torch.cuda.mem_get_info() | |
if ip_adapter : | |
pipe.unload_ip_adapter() | |
if lora_group is not None and len(lora_group) > 0: | |
#pipe.unfuse_lora()#Unload lora | |
pipe.unload_lora_weights() | |
#if embs is not None and len(embs) > 0: | |
#pipe.unload_textual_inversion() | |
del pipe | |
torch.cuda.empty_cache() | |
gc.collect() | |
print(f"done: model={model}, res={result[-1].width}x{result[-1].height}, step={steps}, time={round(end_time-start_time, 2)}s, vram_alloc={convert_size(vram_total-vram_free)}/{convert_size(vram_total)}") | |
return gr.Image.update(result[-1], label=f"Initial Seed: {seed}"),result | |
color_list = [] | |
def get_color(n): | |
for _ in range(n - len(color_list)): | |
color_list.append(tuple(np.random.random(size=3) * 256)) | |
return color_list | |
def create_mixed_img(current, state, w=512, h=512): | |
w, h = int(w), int(h) | |
image_np = np.full([h, w, 4], 255) | |
if state is None: | |
state = {} | |
colors = get_color(len(state)) | |
idx = 0 | |
for key, item in state.items(): | |
if item["map"] is not None: | |
m = item["map"] < 255 | |
alpha = 150 | |
if current == key: | |
alpha = 200 | |
image_np[m] = colors[idx] + (alpha,) | |
idx += 1 | |
return image_np | |
def apply_size_sketch(width,height,state,inf_image,inpaiting_mode,inf_image_inpaiting): | |
if inpaiting_mode and inf_image_inpaiting: | |
w_change = inf_image_inpaiting["image"].width | |
h_change = inf_image_inpaiting["image"].height | |
elif inf_image is not None: | |
w_change = inf_image.width | |
h_change = inf_image.height | |
#update_img = gr.Image.update(value=create_mixed_img("", state, w_change, h_change)) | |
#return state, update_img,gr.Image.update(width=w_change,height = h_change) | |
else: | |
w_change = int(width) | |
h_change = int(height) | |
if state is not None: | |
for key, item in state.items(): | |
if item["map"] is not None: | |
#inverted_image = PIL.ImageOps.invert(item["map"].convert('RGB')) | |
item["map"] = resize(item["map"], w_change, h_change) | |
update_img = gr.Image.update(value=create_mixed_img("", state, w_change, h_change)) | |
return state, update_img,gr.Image.update(width=w_change,height = h_change) | |
# width.change(apply_new_res, inputs=[width, height, global_stats], outputs=[global_stats, sp, rendered]) | |
'''def apply_new_res(w, h, state,inf_image,rendered): | |
if inf_image is not None: | |
return state, rendered | |
w, h = int(w), int(h) | |
if state is not None: | |
for key, item in state.items(): | |
if item["map"] is not None: | |
item["map"] = resize(item["map"], w, h) | |
update_img = gr.Image.update(value=create_mixed_img("", state, w, h)) | |
return state, update_img''' | |
def detect_text(text, state, width, height,formula_button,inf_image,inpaiting_mode,inf_image_inpaiting): | |
global formula | |
if text is None or text == "": | |
return None, None, gr.Radio.update(value=None,visible = False), None,gr.Dropdown.update(value = formula_button) | |
if inpaiting_mode and inf_image_inpaiting: | |
w_change = inf_image_inpaiting["image"].width | |
h_change = inf_image_inpaiting["image"].height | |
elif inf_image is not None: | |
w_change = inf_image.width | |
h_change = inf_image.height | |
else: | |
w_change = int(width) | |
h_change = int(height) | |
t = text.split(",") | |
new_state = {} | |
for item in t: | |
item = item.strip() | |
if item == "": | |
continue | |
if state is not None and item in state: | |
new_state[item] = { | |
"map": state[item]["map"], | |
"weight": state[item]["weight"], | |
"mask_outsides": state[item]["mask_outsides"], | |
} | |
else: | |
new_state[item] = { | |
"map": None, | |
"weight": 0.5, | |
"mask_outsides": 0 | |
} | |
update = gr.Radio.update(choices=[key for key in new_state.keys()], value=None,visible = True) | |
update_img = gr.update(value=create_mixed_img("", new_state, w_change, h_change)) | |
update_sketch = gr.update(value=None, interactive=False) | |
return new_state, update_sketch, update, update_img,gr.Dropdown.update(value = formula_button) | |
def detect_text1(text, state, width, height,formula_button,inf_image,inpaiting_mode,inf_image_inpaiting): | |
global formula | |
if text is None or text == "": | |
return None, None, gr.Radio.update(value=None,visible = False), None,gr.Dropdown.update(value = formula_button) | |
if inpaiting_mode and inf_image_inpaiting: | |
w_change = inf_image_inpaiting["image"].width | |
h_change = inf_image_inpaiting["image"].height | |
elif inf_image is not None: | |
w_change = inf_image.width | |
h_change = inf_image.height | |
else: | |
w_change = int(width) | |
h_change = int(height) | |
t = text.split(",") | |
new_state = {} | |
for item in t: | |
item = item.strip() | |
if item == "": | |
continue | |
if state is not None and item in state: | |
new_state[item] = { | |
"map": state[item]["map"], | |
"weight": state[item]["weight"], | |
"mask_outsides": state[item]["mask_outsides"], | |
} | |
else: | |
new_state[item] = { | |
"map": None, | |
"weight": 0.5, | |
"mask_outsides": False | |
} | |
update = gr.Radio.update(choices=[key for key in new_state.keys()], value=None,visible = True) | |
update_img = gr.update(value=create_mixed_img("", new_state, w_change, h_change)) | |
return new_state, update, update_img,gr.Dropdown.update(value = formula_button) | |
def resize(img, w, h): | |
trs = transforms.Compose( | |
[ | |
transforms.ToPILImage(), | |
#transforms.Resize(min(h, w)), | |
transforms.Resize((h, w),interpolation=transforms.InterpolationMode.BICUBIC), | |
transforms.CenterCrop((h, w)), | |
] | |
) | |
result = np.array(trs(img), dtype=np.uint8) | |
return result | |
def switch_canvas(entry, state, width, height,inf_image,inpaiting_mode,inf_image_inpaiting): | |
if inpaiting_mode and inf_image_inpaiting: | |
w_change = inf_image_inpaiting["image"].width | |
h_change = inf_image_inpaiting["image"].height | |
elif inf_image is not None: | |
w_change = inf_image.width | |
h_change = inf_image.height | |
else: | |
w_change = int(width) | |
h_change = int(height) | |
if entry is None or state is None: | |
return None, 0.5, False, create_mixed_img("", state, w_change, h_change) | |
return ( | |
gr.update(value=None, interactive=True), | |
gr.update(value=state[entry]["weight"] if entry in state else 0.5), | |
gr.update(value=state[entry]["mask_outsides"] if entry in state else False), | |
create_mixed_img(entry, state, w_change, h_change), | |
) | |
def apply_canvas(selected, draw, state, w, h,inf_image,inpaiting_mode,inf_image_inpaiting): | |
if inpaiting_mode and inf_image_inpaiting: | |
w_change = inf_image_inpaiting["image"].width | |
h_change = inf_image_inpaiting["image"].height | |
elif inf_image is not None: | |
w_change = inf_image.width | |
h_change = inf_image.height | |
else: | |
w_change = int(w) | |
h_change = int(h) | |
if state is not None and selected in state and draw is not None: | |
w, h = int(w_change), int(h_change) | |
state[selected]["map"] = resize(draw, w, h) | |
return state, gr.Image.update(value=create_mixed_img(selected, state, w, h)) | |
def apply_weight(selected, weight, state): | |
if state is not None and selected in state: | |
state[selected]["weight"] = weight | |
return state | |
def apply_option(selected, mask, state): | |
if state is not None and selected in state: | |
state[selected]["mask_outsides"] = mask | |
return state | |
clustering_image =[] | |
number_clustering = 0 | |
def is_image_black(image): | |
average_intensity = image.mean() | |
if average_intensity < 10: | |
return True | |
else: | |
return False | |
def change_diferent_black_to_white(image): | |
width, height = image.size | |
for x in range(width): | |
for y in range(height): | |
r, g, b = image.getpixel((x, y)) | |
if r != 0 and g != 0 and b != 0: | |
image.putpixel((x, y), (255, 255, 255)) | |
return image | |
def change_black_to_other_color(image,color_list): | |
width, height = image.size | |
new_pixel = (random.randrange(1,256), random.randrange(1,256), random.randrange(1,256)) | |
while new_pixel in color_list: | |
new_pixel = (random.randrange(1,256), random.randrange(1,256), random.randrange(1,256)) | |
for x in range(width): | |
for y in range(height): | |
pixel = image.getpixel((x, y)) | |
if pixel == (0, 0, 0): | |
image.putpixel((x, y), new_pixel) | |
return image | |
def get_color_mask(color, image, threshold=30): | |
""" | |
Returns a color mask for the given color in the given image. | |
""" | |
img_array = np.array(image, dtype=np.uint8) | |
color_diff = np.sum((img_array - color) ** 2, axis=-1) | |
img_array[color_diff > threshold] = img_array[color_diff > threshold] * 0 | |
return Image.fromarray(img_array) | |
def unique_colors(image, threshold=0.01): | |
colors = image.getcolors(image.size[0] * image.size[1]) | |
total_pixels = image.size[0] * image.size[1] | |
unique_colors = [] | |
for count, color in colors: | |
if count / total_pixels > threshold: | |
unique_colors.append(color) | |
return unique_colors | |
def extract_color_textboxes(color_map_image,MAX_NUM_COLORS): | |
#color_map_image = Image.open(color_map_image) | |
#color_map_image = cv2.imread(color_map_image) | |
color_map_image= Image.fromarray(color_map_image.astype('uint8'), 'RGB') | |
# Get unique colors in color_map_image | |
colors = unique_colors(color_map_image) | |
color_map_image = change_black_to_other_color(color_map_image,colors) | |
colors = unique_colors(color_map_image) | |
color_masks = [get_color_mask(color, color_map_image) for color in colors] | |
# Append white blocks to color_masks to fill up to MAX_NUM_COLORS | |
num_missing_masks = MAX_NUM_COLORS - len(color_masks) | |
white_mask = Image.new("RGB", color_map_image.size, color=(32, 32, 32)) | |
color_masks += [white_mask] * num_missing_masks | |
color_output =[] | |
for i in range(0,len(color_masks)) : | |
#color_masks[i] = color_masks[i].convert('L') | |
color_masks[i] = change_diferent_black_to_white(color_masks[i]) | |
color_masks[i] = np.array(color_masks[i]) | |
color_masks[i] = cv2.cvtColor(color_masks[i], cv2.COLOR_RGB2GRAY) | |
color_masks[i] = 255.0 - color_masks[i] | |
if is_image_black(color_masks[i]) == False: | |
color_masks[i] = color_masks[i].astype(np.uint8) | |
color_output.append(color_masks[i]) | |
return color_output | |
def apply_image_clustering(image, selected, w, h, strength, mask, state,inf_image,inpaiting_mode,inf_image_inpaiting): | |
if inpaiting_mode and inf_image_inpaiting: | |
w_change = inf_image_inpaiting["image"].width | |
h_change = inf_image_inpaiting["image"].height | |
elif inf_image is not None: | |
w_change = inf_image.width | |
h_change = inf_image.height | |
else: | |
w_change = int(w) | |
h_change = int(h) | |
if state is not None and selected in state: | |
state[selected] = { | |
"map": resize(image, w_change, h_change), | |
"weight": strength, | |
"mask_outsides": mask | |
} | |
return state, gr.Image.update(value=create_mixed_img(selected, state, w_change, h_change)) | |
# sp2, radio, width, height, global_stats | |
def apply_image(image, selected, w, h, strength, mask, state,inf_image,inpaiting_mode,inf_image_inpaiting): | |
if inpaiting_mode and inf_image_inpaiting: | |
w_change = inf_image_inpaiting["image"].width | |
h_change = inf_image_inpaiting["image"].height | |
elif inf_image is not None: | |
w_change = inf_image.width | |
h_change = inf_image.height | |
else: | |
w_change = int(w) | |
h_change = int(h) | |
if state is not None and selected in state: | |
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) | |
state[selected] = { | |
"map": resize(image, w_change, h_change), | |
"weight": strength, | |
"mask_outsides": mask | |
} | |
elif state is not None: | |
key_state = list(state.keys()) | |
global number_clustering,clustering_image | |
number_clustering = 0 | |
clustering_image = [] | |
clustering_image = extract_color_textboxes(image,len(state)+1) | |
number_clustering = len(clustering_image) | |
if len(state) > len(clustering_image): | |
amount_add = len(clustering_image) | |
else: | |
amount_add = len(state) | |
for i in range(0,amount_add): | |
state[key_state[i]] = { | |
"map": resize(clustering_image[i], w_change, h_change), | |
"weight": strength, | |
"mask_outsides": mask | |
} | |
return state, gr.Image.update(value=create_mixed_img(selected, state, w_change, h_change)) | |
#rendered, apply_style, apply_clustering_style,Previous,Next,Completed,sp2,sp3 | |
def apply_base_on_color(sp2,state, width, height,inf_image,inpaiting_mode,inf_image_inpaiting): | |
global number_clustering,clustering_image | |
if inpaiting_mode and inf_image_inpaiting: | |
w_change = inf_image_inpaiting["image"].width | |
h_change = inf_image_inpaiting["image"].height | |
elif inf_image is not None: | |
w_change = inf_image.width | |
h_change = inf_image.height | |
else: | |
w_change = int(width) | |
h_change = int(height) | |
number_clustering = 0 | |
clustering_image = [] | |
clustering_image = extract_color_textboxes(sp2,len(state)+1) | |
new_state = {} | |
for i in state: | |
new_state[i] = { | |
"map": None, | |
"weight": 0.5, | |
"mask_outsides": False | |
} | |
return gr.Image.update(value = create_mixed_img("", new_state, w_change, h_change)),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = True),gr.Button.update(visible = True),gr.Button.update(visible = True),gr.Image.update(visible = False),gr.Image.update(value=clustering_image[0],visible = True),gr.Button.update(visible = True),new_state | |
def completing_clustering(sp2): | |
return gr.Button.update(visible = True),gr.Button.update(visible = True),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Image.update(visible = True),gr.Image.update(visible = False),gr.Button.update(visible = False) | |
def previous_image_page(sp3): | |
global clustering_image,number_clustering | |
number_clustering = number_clustering - 1 | |
if number_clustering < 0: | |
number_clustering = len(clustering_image)-1 | |
return gr.Image.update(value = clustering_image[number_clustering]) | |
def next_image_page(sp3): | |
global clustering_image,number_clustering | |
number_clustering = number_clustering + 1 | |
if number_clustering >= len(clustering_image): | |
number_clustering = 0 | |
return gr.Image.update(value = clustering_image[number_clustering]) | |
# [ti_state, lora_state, ti_vals, lora_vals, uploads] | |
def get_file_link_sp(link): | |
import requests | |
import os | |
from urllib.parse import unquote | |
file_name = None | |
absolute_path = None | |
try: | |
response = requests.get(link) | |
response.raise_for_status() | |
except requests.exceptions.HTTPError as err: | |
print(f"There was an error downloading: {err}") | |
else: | |
content_disposition = response.headers.get("content-disposition") | |
if content_disposition: | |
file_name = content_disposition.split("filename=")[1] | |
file_name = unquote(file_name) | |
# remove quotation marks | |
file_name = file_name.strip('"') | |
else: | |
file_name = "downloaded_file" | |
with open(file_name, "wb") as f: | |
f.write(response.content) | |
#Get absolute_path | |
absolute_path = os.path.abspath(file_name) | |
#Change format file_name | |
file_name = file_name.split('.')[0] | |
file_name = file_name.replace('_',' ') | |
file_name = file_name.replace('-',' ') | |
file_name = file_name.title() | |
return absolute_path, file_name | |
def get_file_link(link): | |
import requests | |
import os | |
from urllib.parse import unquote | |
file_name = None | |
absolute_path = None | |
try: | |
with requests.get(link, stream=True) as response: | |
response.raise_for_status() | |
# Get file size from headers | |
total_size = int(response.headers.get('content-length', 0)) | |
content_disposition = response.headers.get("content-disposition") | |
if content_disposition: | |
file_name = content_disposition.split("filename=")[1] | |
file_name = unquote(file_name) | |
# remove quotation marks | |
file_name = file_name.strip('"') | |
else: | |
file_name = "downloaded_file" | |
# Stream download and write to file | |
chunk_size = 1024 | |
downloaded_size = 0 | |
with open(file_name, "wb") as f: | |
for chunk in response.iter_content(chunk_size=chunk_size): | |
if chunk: | |
f.write(chunk) | |
downloaded_size += len(chunk) | |
# Print download progress | |
progress = (downloaded_size / total_size) * 100 | |
if progress%10 == 0: | |
print(f"Download progress: {progress:.2f}% ({downloaded_size / 1024:.2f} KB / {total_size / 1024:.2f} KB)") | |
# Get absolute_path | |
absolute_path = os.path.abspath(file_name) | |
# Change format file_name | |
file_name = file_name.split('.')[0] | |
file_name = file_name.replace('_', ' ') | |
file_name = file_name.replace('-', ' ') | |
file_name = file_name.title() | |
except requests.exceptions.HTTPError as err: | |
print(f"There was an error downloading: {err}") | |
return absolute_path, file_name | |
def add_net(files,link_download): | |
global lora_scale_dict, lora_lst, lora_dict, embeddings_dict | |
if files is None and (link_download is None or link_download == ''): | |
return gr.CheckboxGroup.update(choices=list(embeddings_dict.keys())),gr.CheckboxGroup.update(choices=list(lora_dict.keys())),gr.Dropdown.update(choices=[k for k in lora_lst],value=lora_lst[0],),gr.File.update(value=None),gr.Textbox.update(value = ''), | |
if link_download is not None and link_download != '': | |
path_file, file_name_download = get_file_link(link_download) | |
if file_name_download: | |
items_dl = Path(path_file) | |
if items_dl.suffix == ".pt": | |
state_dict = torch.load(path_file, map_location="cpu") | |
else: | |
state_dict = load_file(path_file, device="cpu") | |
if any("lora" in k for k in state_dict.keys()): | |
#lora_state = file.name | |
if file_name_download not in lora_dict: | |
lora_lst.append(file_name_download) | |
lora_dict[file_name_download] = path_file | |
lora_scale_dict[file_name_download] = 1.0 | |
else: | |
if file_name_download not in embeddings_dict: | |
embeddings_dict[file_name_download] = path_file | |
if files is not None: | |
for file in files: | |
item = Path(file.name) | |
stripedname = str(item.stem).strip() | |
stripedname = stripedname.replace('_',' ') | |
stripedname = stripedname.replace('-',' ') | |
stripedname = stripedname.title() | |
if item.suffix == ".pt": | |
state_dict = torch.load(file.name, map_location="cpu") | |
else: | |
state_dict = load_file(file.name, device="cpu") | |
if any("lora" in k for k in state_dict.keys()): | |
#lora_state = file.name | |
if stripedname not in lora_dict: | |
lora_lst.append(stripedname) | |
lora_dict[stripedname] = file.name | |
lora_scale_dict[stripedname] = 1.0 | |
else: | |
#ti_state[stripedname] = file.name | |
if stripedname not in embeddings_dict: | |
embeddings_dict[stripedname] = file.name | |
return gr.CheckboxGroup.update(choices=list(embeddings_dict.keys())), gr.CheckboxGroup.update(choices=list(lora_dict.keys())),gr.Dropdown.update(choices=[k for k in lora_lst],value=lora_lst[0],),gr.File.update(value=None),gr.Textbox.update(value = ''), | |
def change_lora_value(lora_vals): | |
global lora_scale_dict | |
if len(lora_scale_dict) == 0 or lora_vals == 'Not using Lora': | |
return gr.Slider.update(value = 1.0) | |
return gr.Slider.update(value = lora_scale_dict[lora_vals]) | |
def update_lora_value(lora_scale,lora_vals): | |
global lora_scale_dict | |
if len(lora_scale_dict) and lora_vals != 'Not using Lora': | |
lora_scale_dict[lora_vals] = float(lora_scale) | |
# [ti_state, lora_state, ti_vals, lora_vals, uploads] | |
def clean_states(ti_state,lora_group): | |
global lora_dict,embeddings_dict,lora_lst,lora_scale_dict | |
delete_lora = list(lora_dict.values()) | |
for i in delete_lora: | |
os.remove(i) | |
delete_embed_lst = list(embeddings_dict.values()) | |
for i in delete_embed_lst: | |
os.remove(i) | |
embeddings_dict = dict() | |
lora_dict = dict() | |
lora_scale_dict = dict() | |
lora_lst = ['Not using Lora'] | |
return dict(),dict(),gr.CheckboxGroup.update(choices=list(embeddings_dict.keys()),value = None),gr.CheckboxGroup.update(choices=list(lora_dict.keys()),value = None),gr.Dropdown.update(choices=[k for k in lora_lst],value=lora_lst[0],),gr.File.update(value=None),gr.Text.update(f""),gr.Text.update(f""),gr.Textbox.update(value = ''), | |
def add_model(insert_model): | |
global models,keep_vram,models_single_file | |
insert_model=insert_model.replace(" ", "") | |
if len(insert_model) == 0: | |
return gr.Dropdown.update(choices=[k[0] for k in get_model_list()],value=base_name),gr.Textbox.update(value = '') | |
if 'https' in insert_model: | |
path_file, file_name_download = get_file_link(insert_model) | |
for i in models: | |
if file_name_download in i: | |
return gr.Dropdown.update(choices=[k[0] for k in get_model_list()],value=base_name),gr.Textbox.update(value = '') | |
models.append((file_name_download,path_file)) | |
keep_vram.append(path_file) | |
models_single_file.append(file_name_download) | |
else: | |
author,name = insert_model.split('/') | |
name = name.replace('_',' ') | |
name = name.replace('-',' ') | |
name = name.title() | |
for i in models: | |
if name in i or insert_model in i: | |
return gr.Dropdown.update(choices=[k[0] for k in get_model_list()],value=base_name),gr.Textbox.update(value = '') | |
models.append((name,insert_model)) | |
keep_vram.append(insert_model) | |
return gr.Dropdown.update(choices=[k[0] for k in get_model_list()],value=base_name),gr.Textbox.update(value = '') | |
def add_vae(insert_vae,single_load_file): | |
global vae_link,vae_single_file,vae_lst | |
insert_vae=insert_vae.replace(" ", "") | |
if len(insert_vae) == 0: | |
return gr.Dropdown.update(choices=[k for k in vae_lst],value=vae_lst[0]),gr.Textbox.update(value = ''),gr.Checkbox.update(value = False), | |
if 'https' in insert_vae: | |
path_file, file_name_download = get_file_link(insert_vae) | |
if file_name_download not in vae_lst: | |
vae_lst.append(file_name_download) | |
vae_link[file_name_download] = path_file | |
vae_single_file[file_name_download] = True | |
else: | |
name = insert_vae.split('/')[-1] | |
name = name.split('.')[0] | |
name = name.replace('_',' ') | |
name = name.replace('-',' ') | |
name = name.title() | |
if name not in vae_lst: | |
vae_lst.append(name) | |
vae_link[name] = insert_vae | |
vae_single_file[name] = single_load_file | |
return gr.Dropdown.update(choices=[k for k in vae_lst],value=vae_lst[0]),gr.Textbox.update(value = ''),gr.Checkbox.update(value = False), | |
def reset_model_button(insert_model): | |
return gr.Textbox.update(value = '') | |
def choose_tistate(ti_vals): | |
if len(ti_vals) == 0: | |
return dict(),gr.Text.update(""),gr.CheckboxGroup.update(choices=list(embeddings_dict.keys()),value = None) | |
dict_copy = dict() | |
for key, value in embeddings_dict.items(): | |
if key in ti_vals: | |
dict_copy[key] = value | |
lst_key = [key for key in dict_copy.keys()] | |
lst_key = '; '.join(map(str, lst_key)) | |
return dict_copy,gr.Text.update(lst_key),gr.CheckboxGroup.update(choices=list(embeddings_dict.keys()),value = None) | |
def choose_lora_function(lora_list): | |
global lora_dict | |
if len(lora_list) == 0: | |
return dict(),gr.Text.update(""),gr.CheckboxGroup.update(choices=list(lora_dict.keys()),value = None),gr.Dropdown.update(choices=[k for k in lora_lst],value=lora_lst[0],) | |
dict_copy = dict() | |
for key, value in lora_dict.items(): | |
if key in lora_list: | |
dict_copy[key] = value | |
lst_key = [key for key in dict_copy.keys()] | |
lst_key = '; '.join(map(str, lst_key)) | |
return dict_copy,gr.Text.update(lst_key),gr.CheckboxGroup.update(choices=list(lora_dict.keys()),value = None),gr.Dropdown.update(choices=[k for k in lora_lst],value=lora_lst[0],) | |
def delete_embed(ti_vals,ti_state,embs_choose): | |
if len(ti_vals) == 0: | |
return gr.CheckboxGroup.update(choices=list(embeddings_dict.keys())),ti_state,gr.Text.update(embs_choose) | |
for key in ti_vals: | |
if key in ti_state: | |
ti_state.pop(key) | |
if key in embeddings_dict: | |
os.remove(embeddings_dict[key]) | |
embeddings_dict.pop(key) | |
if len(ti_state) >= 1: | |
lst_key = [key for key in ti_state.keys()] | |
lst_key = '; '.join(map(str, lst_key)) | |
else: | |
lst_key ="" | |
return gr.CheckboxGroup.update(choices=list(embeddings_dict.keys()),value = None),ti_state,gr.Text.update(lst_key) | |
def delete_lora_function(lora_list,lora_group,lora_choose): | |
global lora_dict,lora_lst,lora_scale_dict | |
if len(lora_list) == 0: | |
return gr.CheckboxGroup.update(choices=list(lora_dict.keys())),lora_group,gr.Text.update(lora_choose),gr.Dropdown.update() | |
for key in lora_list: | |
if key in lora_group: | |
lora_group.pop(key) | |
if key in lora_scale_dict: | |
lora_scale_dict.pop(key) | |
if key in lora_dict: | |
os.remove(lora_dict[key]) | |
lora_dict.pop(key) | |
if len(lora_group) >= 1: | |
lst_key = [key for key in lora_group.keys()] | |
lst_key = '; '.join(map(str, lst_key)) | |
else: | |
lst_key ="" | |
lora_lst = ["Not using Lora"]+[key for key in lora_dict.keys()] | |
return gr.CheckboxGroup.update(choices=list(lora_dict.keys()),value = None),lora_group,gr.Text.update(lst_key),gr.Dropdown.update(choices=[k for k in lora_lst],value=lora_lst[0],) | |
def lora_delete(lora_vals): | |
global lora_dict | |
global lora_lst | |
if lora_vals == 'Not using Lora': | |
return gr.Dropdown.update(choices=[k for k in lora_lst],value=lora_lst[0],) | |
os.remove(lora_dict[lora_vals]) | |
lora_dict.pop(lora_vals) | |
lora_lst.remove(lora_vals) | |
return gr.Dropdown.update(choices=[k for k in lora_lst],value=lora_lst[0],) | |
#diffuser_pipeline,sampler,gallery,hr_enabled | |
def mode_diffuser_pipeline( controlnet_enabled): | |
if controlnet_enabled == True: | |
return gr.Checkbox.update(value = True),gr.Checkbox.update() | |
return gr.Checkbox.update(value = False),gr.Checkbox.update(value = False) | |
'''def mode_diffuser_pipeline1(diffuser_pipeline, controlnet_enabled): | |
assert diffuser_pipeline == False, "Please enable diffusers pipeline to use this option" | |
return gr.Checkbox.update(value = True)''' | |
def res_cap(g, w, h, x): | |
if g: | |
return f"Enable upscaler: {w}x{h} to {int(w*x)//8 *8}x{int(h*x)//8 *8}" | |
else: | |
return "Enable upscaler" | |
#diffuser_pipeline,hr_enabled,sampler,gallery,controlnet_enabled | |
def mode_upscale(diffuser_pipeline, hr_scale, width, height,hr_enabled): | |
if hr_enabled == True: | |
return gr.Checkbox.update(value = False),gr.Checkbox.update(value = True,label=res_cap(True, width, height, hr_scale)),gr.Dropdown.update(value="DPM++ 2M Karras",choices=[s[0] for s in samplers_k_diffusion]),gr.Checkbox.update(value = False) | |
return gr.Checkbox.update(value = False),gr.Checkbox.update(value = False,label=res_cap(False, width, height, hr_scale)),gr.Dropdown.update(value="DPM++ 2M Karras",choices=[s[0] for s in samplers_k_diffusion]),gr.Checkbox.update() | |
def change_control_net(model_control_net, low_threshold, high_threshold,has_body_openpose,has_hand_openpose,has_face_openpose): | |
if model_control_net == 'Canny': | |
return gr.Slider.update(visible = True),gr.Slider.update(visible = True),gr.Checkbox.update(visible = False),gr.Checkbox.update(visible = False),gr.Checkbox.update(visible = False),gr.Radio.update(visible = False) | |
if model_control_net == 'Depth': | |
return gr.Slider.update(visible = False),gr.Slider.update(visible = False),gr.Checkbox.update(visible = False),gr.Checkbox.update(visible = False),gr.Checkbox.update(visible = False),gr.Radio.update(visible = True,choices=["Midas","DPT"]) | |
if model_control_net == 'Openpose': | |
return gr.Slider.update(visible = False),gr.Slider.update(visible = False),gr.Checkbox.update(visible = True),gr.Checkbox.update(visible = True),gr.Checkbox.update(visible = True),gr.Radio.update(visible = False) | |
if model_control_net == 'Semantic Segmentation': | |
return gr.Slider.update(visible = False),gr.Slider.update(visible = False),gr.Checkbox.update(visible = False),gr.Checkbox.update(visible = False),gr.Checkbox.update(visible = False),gr.Radio.update(visible = True,choices=["Convnet tiny","Convnet small","Convnet base","Convnet large","Convnet xlarge","Swin tiny","Swin small","Swin base","Swin large"]) | |
if model_control_net =='Soft Edge' or model_control_net == 'Scribble' or model_control_net == 'Sketch': | |
return gr.Slider.update(visible = False),gr.Slider.update(visible = False),gr.Checkbox.update(visible = False),gr.Checkbox.update(visible = False),gr.Checkbox.update(visible = False),gr.Radio.update(visible = True,choices=["HED","PidiNet"]) | |
return gr.Slider.update(visible = False),gr.Slider.update(visible = False),gr.Checkbox.update(visible = False),gr.Checkbox.update(visible = False),gr.Checkbox.update(visible = False),gr.Radio.update(visible = False) | |
previous_sampler = 'DPM++ 2M Karras' | |
previous_sampler_hires = 'DPM++ 2M Karras' | |
#sampler,gallery,hr_enabled,controlnet_enabled | |
def mode_diffuser_pipeline_sampler(diffuser_pipeline, sampler,sampler_hires): | |
global previous_sampler, previous_sampler_hires | |
sample_now = previous_sampler | |
sampler_hires_now = previous_sampler_hires | |
previous_sampler = sampler | |
previous_sampler_hires = sampler_hires | |
if diffuser_pipeline == False: | |
return gr.Checkbox.update(value = False), gr.Dropdown.update(value=sample_now,choices=[s[0] for s in samplers_k_diffusion]),gr.Dropdown.update(value=sampler_hires_now,choices=[s[0] for s in samplers_k_diffusion]) | |
return gr.Checkbox.update(value = True),gr.Dropdown.update(value=sample_now,choices=[s[0] for s in samplers_diffusers]),gr.Dropdown.update(value=sampler_hires_now,choices=[s[0] for s in samplers_diffusers]) | |
def change_gallery(latent_processing,hr_process_enabled): | |
if latent_processing or hr_process_enabled: | |
return gr.Gallery.update(visible = True) | |
return gr.Gallery.update(visible = False) | |
in_edit_mode = False | |
in_edit_mode_adapter = False | |
def preview_image(model_control_net,low_threshold,high_threshold,has_body_openpose,has_hand_openpose,has_face_openpose,img_control,preprocessor_name,multi_controlnet,disable_preprocessing): | |
global in_edit_mode | |
if multi_controlnet == True and in_edit_mode == True: | |
global lst_control,current_number_control | |
if model_control_net == lst_control[current_number_control]["control_net_model"]: | |
setting_processing = list(lst_control[current_number_control].items()) | |
setting_processing = setting_processing[:-3] | |
setting_processing = dict(setting_processing) | |
else: | |
setting_processing = { | |
"control_net_model": model_control_net, | |
"img_control": img_control, | |
"low_threshold": low_threshold, | |
"high_threshold": high_threshold, | |
"has_body": has_body_openpose, | |
"has_face": has_face_openpose, | |
"has_hand": has_hand_openpose, | |
"preprocessor_name": preprocessor_name, | |
"disable_preprocessing":disable_preprocessing, | |
} | |
image_sp_control = control_net_preprocessing(**setting_processing) | |
return gr.Image.update(image_sp_control) | |
elif img_control is not None: | |
image_show = control_net_preprocessing(model_control_net,img_control,low_threshold,high_threshold,has_body_openpose,has_hand_openpose,has_face_openpose,preprocessor_name,disable_preprocessing) | |
return gr.Image.update(image_show) | |
return gr.Image.update(value = None) | |
def change_image_condition(image_condition): | |
if image_condition is None: | |
return gr.Image.update() | |
return gr.Image.update(value= None) | |
#control_net_model,img_control,low_threshold = None,high_threshold=None,has_hand=None,preprocessor_name=None | |
def control_net_muti(control_net_model,img_control,low_threshold ,high_threshold,has_body,has_hand,has_face,preprocessor_name,controlnet_scale,control_guidance_start,control_guidance_end,disable_preprocessing): | |
global lst_control | |
if img_control is not None: | |
config = { | |
"control_net_model": control_net_model, | |
"img_control": img_control, | |
"low_threshold": low_threshold, | |
"high_threshold": high_threshold, | |
"has_body": has_body, | |
"has_face": has_face, | |
"has_hand": has_hand, | |
"preprocessor_name": preprocessor_name, | |
"disable_preprocessing":disable_preprocessing, | |
"controlnet_scale": controlnet_scale, | |
"control_guidance_start": control_guidance_start, | |
"control_guidance_end": control_guidance_end, | |
} | |
lst_control.append(config) | |
return gr.Image.update(value = None) | |
def previous_view_control(): | |
global lst_control,current_number_control | |
if current_number_control <= 0: | |
current_number_control = len(lst_control)-1 | |
else: | |
current_number_control -= 1 | |
return gr.Dropdown.update(value = lst_control[current_number_control]["control_net_model"]),gr.Image.update(value = lst_control[current_number_control]["img_control"]),gr.Slider.update(value = lst_control[current_number_control]["low_threshold"]),gr.Slider.update(value = lst_control[current_number_control]["high_threshold"]),gr.Checkbox.update(value = lst_control[current_number_control]["has_body"]),gr.Checkbox.update(value = lst_control[current_number_control]["has_hand"]),gr.Checkbox.update(value = lst_control[current_number_control]["has_face"]),gr.Radio.update(value = lst_control[current_number_control]["preprocessor_name"]),gr.Slider.update(value= lst_control[current_number_control]["controlnet_scale"]),gr.Slider.update(value= lst_control[current_number_control]["control_guidance_start"]),gr.Slider.update(value= lst_control[current_number_control]["control_guidance_end"]),gr.Checkbox.update(value = lst_control[current_number_control]["disable_preprocessing"]) | |
def next_view_control(): | |
global lst_control,current_number_control | |
if current_number_control >= len(lst_control)-1: | |
current_number_control = 0 | |
else: | |
current_number_control += 1 | |
return gr.Dropdown.update(value = lst_control[current_number_control]["control_net_model"]),gr.Image.update(value = lst_control[current_number_control]["img_control"]),gr.Slider.update(value = lst_control[current_number_control]["low_threshold"]),gr.Slider.update(value = lst_control[current_number_control]["high_threshold"]),gr.Checkbox.update(value = lst_control[current_number_control]["has_body"]),gr.Checkbox.update(value = lst_control[current_number_control]["has_hand"]),gr.Checkbox.update(value = lst_control[current_number_control]["has_face"]),gr.Radio.update(value = lst_control[current_number_control]["preprocessor_name"]),gr.Slider.update(value= lst_control[current_number_control]["controlnet_scale"]),gr.Slider.update(value= lst_control[current_number_control]["control_guidance_start"]),gr.Slider.update(value= lst_control[current_number_control]["control_guidance_end"]),gr.Checkbox.update(value = lst_control[current_number_control]["disable_preprocessing"]) | |
def apply_edit_control_net(control_net_model,img_control,low_threshold ,high_threshold,has_body,has_hand,has_face,preprocessor_name,controlnet_scale,control_guidance_start,control_guidance_end,disable_preprocessing): | |
global lst_control,current_number_control,in_edit_mode | |
if img_control is not None: | |
config = { | |
"control_net_model": control_net_model, | |
"img_control": img_control, | |
"low_threshold": low_threshold, | |
"high_threshold": high_threshold, | |
"has_body": has_body, | |
"has_face": has_face, | |
"has_hand": has_hand, | |
"preprocessor_name": preprocessor_name, | |
"disable_preprocessing":disable_preprocessing, | |
"controlnet_scale": controlnet_scale, | |
"control_guidance_start": control_guidance_start, | |
"control_guidance_end": control_guidance_end, | |
} | |
lst_control[current_number_control] = config | |
return gr.Dropdown.update(),gr.Image.update(),gr.Slider.update(),gr.Slider.update(),gr.Checkbox.update(),gr.Checkbox.update(),gr.Checkbox.update(),gr.Radio.update(),gr.Checkbox.update(),gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Slider.update(),gr.Slider.update(),gr.Slider.update(),gr.Checkbox.update() | |
else: | |
lst_control.pop(current_number_control) | |
current_number_control -=1 | |
if current_number_control == -1: | |
current_number_control = len(lst_control)-1 | |
if len(lst_control) == 0: | |
in_edit_mode = False | |
return gr.Dropdown.update(),gr.Image.update(value = None),gr.Slider.update(),gr.Slider.update(),gr.Checkbox.update(),gr.Checkbox.update(),gr.Checkbox.update(),gr.Radio.update(),gr.Checkbox.update(value = False),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Slider.update(),gr.Slider.update(),gr.Slider.update(),gr.Checkbox.update() | |
return gr.Dropdown.update(value = lst_control[current_number_control]["control_net_model"]),gr.Image.update(value = lst_control[current_number_control]["img_control"]),gr.Slider.update(value = lst_control[current_number_control]["low_threshold"]),gr.Slider.update(value = lst_control[current_number_control]["high_threshold"]),gr.Checkbox.update(value = lst_control[current_number_control]["has_body"]),gr.Checkbox.update(value = lst_control[current_number_control]["has_hand"]),gr.Checkbox.update(value = lst_control[current_number_control]["has_face"]),gr.Radio.update(value = lst_control[current_number_control]["preprocessor_name"]),gr.Checkbox.update(),gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Slider.update(value= lst_control[current_number_control]["controlnet_scale"]),gr.Slider.update(value= lst_control[current_number_control]["control_guidance_start"]),gr.Slider.update(value= lst_control[current_number_control]["control_guidance_end"]),gr.Checkbox.update(value = lst_control[current_number_control]["disable_preprocessing"]) | |
def complete_edit_multi(): | |
global current_number_control,in_edit_mode | |
current_number_control = 0 | |
in_edit_mode = False | |
return gr.Button.update(visible = True),gr.Button.update(visible = True),gr.Image.update(value= None),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False) | |
def multi_controlnet_function(multi_controlnet): | |
if multi_controlnet: | |
return gr.Checkbox.update(value = True),gr.Button.update(visible = True),gr.Button.update(visible = True),gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Button.update() | |
return gr.Checkbox.update(),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False) | |
def edit_multi_control_image_function(): | |
global lst_control,current_number_control,in_edit_mode | |
if len(lst_control) > 0: | |
in_edit_mode = True | |
return gr.Button.update(visible = True),gr.Button.update(visible = True),gr.Button.update(visible = True),gr.Button.update(visible = True),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Dropdown.update(value = lst_control[current_number_control]["control_net_model"]),gr.Image.update(value = lst_control[current_number_control]["img_control"]),gr.Slider.update(value = lst_control[current_number_control]["low_threshold"]),gr.Slider.update(value = lst_control[current_number_control]["high_threshold"]),gr.Checkbox.update(value = lst_control[current_number_control]["has_body"]),gr.Checkbox.update(value = lst_control[current_number_control]["has_hand"]),gr.Checkbox.update(value = lst_control[current_number_control]["has_face"]),gr.Radio.update(value = lst_control[current_number_control]["preprocessor_name"]),gr.Slider.update(value= lst_control[current_number_control]["controlnet_scale"]),gr.Slider.update(value= lst_control[current_number_control]["control_guidance_start"]),gr.Slider.update(value= lst_control[current_number_control]["control_guidance_end"]),gr.Checkbox.update(value = lst_control[current_number_control]["disable_preprocessing"]) | |
in_edit_mode = False | |
return gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Dropdown.update(),gr.Image.update(),gr.Slider.update(),gr.Slider.update(),gr.Checkbox.update(),gr.Checkbox.update(),gr.Checkbox.update(),gr.Radio.update(),gr.Slider.update(),gr.Slider.update(),gr.Slider.update(),gr.Checkbox.update() | |
def ip_adapter_work(ip_adapter): | |
if ip_adapter: | |
return gr.Checkbox.update(value = True) | |
return gr.Checkbox.update() | |
def preview_image_adapter(model_adapter,low_threshold_adapter,high_threshold_adapter,has_body_openpose_adapter,has_hand_openpose_adapter,has_face_openpose_adapter,img_control,preprocessor_adapter,multi_adapter,disable_preprocessing_adapter): | |
global in_edit_mode_adapter | |
if multi_adapter == True and in_edit_mode_adapter == True: | |
global lst_adapter,current_number_adapter | |
if model_adapter == lst_adapter[current_number_adapter]["model_adapter"]: | |
setting_processing = list(lst_adapter[current_number_adapter].items()) | |
setting_processing = setting_processing[:-3] | |
setting_processing = dict(setting_processing) | |
else: | |
setting_processing = { | |
"model_adapter": model_adapter, | |
"img_control": img_control, | |
"low_threshold_adapter": low_threshold_adapter, | |
"high_threshold_adapter": high_threshold_adapter, | |
"has_body": has_body_openpose_adapter, | |
"has_face": has_face_openpose_adapter, | |
"has_hand": has_hand_openpose_adapter, | |
"preprocessor_adapter": preprocessor_adapter, | |
"disable_preprocessing_adapter":disable_preprocessing_adapter, | |
} | |
image_sp_control = adapter_preprocessing(**setting_processing) | |
return gr.Image.update(image_sp_control) | |
elif img_control is not None: | |
image_show = adapter_preprocessing(model_adapter,img_control,low_threshold_adapter,high_threshold_adapter,has_body_openpose_adapter,has_hand_openpose_adapter,has_face_openpose_adapter,preprocessor_adapter,disable_preprocessing_adapter) | |
return gr.Image.update(image_show) | |
return gr.Image.update(value = None) | |
def change_image_condition_adapter(image_condition_adapter): | |
if image_condition_adapter is None: | |
return gr.Image.update() | |
return gr.Image.update(value= None) | |
#control_net_model,img_control,low_threshold_adapter = None,high_threshold_adapter=None,has_hand=None,preprocessor_adapter=None | |
def adapter_muti(model_adapter,img_control,low_threshold_adapter ,high_threshold_adapter,has_body,has_hand,has_face,preprocessor_adapter,adapter_conditioning_scale,adapter_conditioning_factor,disable_preprocessing_adapter): | |
global lst_adapter | |
if img_control is not None: | |
config = { | |
"model_adapter": model_adapter, | |
"img_control": img_control, | |
"low_threshold_adapter": low_threshold_adapter, | |
"high_threshold_adapter": high_threshold_adapter, | |
"has_body": has_body, | |
"has_face": has_face, | |
"has_hand": has_hand, | |
"preprocessor_adapter": preprocessor_adapter, | |
"disable_preprocessing_adapter":disable_preprocessing_adapter, | |
"adapter_conditioning_scale": adapter_conditioning_scale, | |
"adapter_conditioning_factor": adapter_conditioning_factor, | |
} | |
lst_adapter.append(config) | |
return gr.Image.update(value = None) | |
def previous_view_adapter(): | |
global lst_adapter,current_number_adapter | |
if current_number_adapter <= 0: | |
current_number_adapter = len(lst_adapter)-1 | |
else: | |
current_number_adapter -= 1 | |
return gr.Dropdown.update(value = lst_adapter[current_number_adapter]["model_adapter"]),gr.Image.update(value = lst_adapter[current_number_adapter]["img_control"]),gr.Slider.update(value = lst_adapter[current_number_adapter]["low_threshold_adapter"]),gr.Slider.update(value = lst_adapter[current_number_adapter]["high_threshold_adapter"]),gr.Checkbox.update(value = lst_adapter[current_number_adapter]["has_body"]),gr.Checkbox.update(value = lst_adapter[current_number_adapter]["has_hand"]),gr.Checkbox.update(value = lst_adapter[current_number_adapter]["has_face"]),gr.Radio.update(value = lst_adapter[current_number_adapter]["preprocessor_adapter"]),gr.Slider.update(value= lst_adapter[current_number_adapter]["adapter_conditioning_scale"]),gr.Slider.update(value= lst_adapter[current_number_adapter]["adapter_conditioning_factor"]),gr.Checkbox.update(value = lst_adapter[current_number_adapter]["disable_preprocessing_adapter"]) | |
def next_view_adapter(): | |
global lst_adapter,current_number_adapter | |
if current_number_adapter >= len(lst_adapter)-1: | |
current_number_adapter = 0 | |
else: | |
current_number_adapter += 1 | |
return gr.Dropdown.update(value = lst_adapter[current_number_adapter]["model_adapter"]),gr.Image.update(value = lst_adapter[current_number_adapter]["img_control"]),gr.Slider.update(value = lst_adapter[current_number_adapter]["low_threshold_adapter"]),gr.Slider.update(value = lst_adapter[current_number_adapter]["high_threshold_adapter"]),gr.Checkbox.update(value = lst_adapter[current_number_adapter]["has_body"]),gr.Checkbox.update(value = lst_adapter[current_number_adapter]["has_hand"]),gr.Checkbox.update(value = lst_adapter[current_number_adapter]["has_face"]),gr.Radio.update(value = lst_adapter[current_number_adapter]["preprocessor_adapter"]),gr.Slider.update(value= lst_adapter[current_number_adapter]["adapter_conditioning_scale"]),gr.Slider.update(value= lst_adapter[current_number_adapter]["adapter_conditioning_factor"]),gr.Checkbox.update(value = lst_adapter[current_number_adapter]["disable_preprocessing_adapter"]) | |
def apply_edit_adapter(model_adapter,img_control,low_threshold_adapter ,high_threshold_adapter,has_body,has_hand,has_face,preprocessor_adapter,adapter_conditioning_scale,adapter_conditioning_factor,disable_preprocessing_adapter): | |
global lst_adapter,current_number_adapter,in_edit_mode_adapter | |
if img_control is not None: | |
config = { | |
"model_adapter": model_adapter, | |
"img_control": img_control, | |
"low_threshold_adapter": low_threshold_adapter, | |
"high_threshold_adapter": high_threshold_adapter, | |
"has_body": has_body, | |
"has_face": has_face, | |
"has_hand": has_hand, | |
"preprocessor_adapter": preprocessor_adapter, | |
"disable_preprocessing_adapter":disable_preprocessing_adapter, | |
"adapter_conditioning_scale": adapter_conditioning_scale, | |
"adapter_conditioning_factor": adapter_conditioning_factor, | |
} | |
lst_adapter[current_number_adapter] = config | |
return gr.Dropdown.update(),gr.Image.update(),gr.Slider.update(),gr.Slider.update(),gr.Checkbox.update(),gr.Checkbox.update(),gr.Checkbox.update(),gr.Radio.update(),gr.Checkbox.update(),gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Slider.update(),gr.Slider.update(),gr.Checkbox.update() | |
else: | |
lst_adapter.pop(current_number_adapter) | |
current_number_adapter -=1 | |
if current_number_adapter == -1: | |
current_number_adapter = len(lst_adapter)-1 | |
if len(lst_adapter) == 0: | |
in_edit_mode_adapter = False | |
return gr.Dropdown.update(),gr.Image.update(value = None),gr.Slider.update(),gr.Slider.update(),gr.Checkbox.update(),gr.Checkbox.update(),gr.Checkbox.update(),gr.Radio.update(),gr.Checkbox.update(value = False),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Slider.update(),gr.Slider.update(),gr.Checkbox.update() | |
return gr.Dropdown.update(value = lst_adapter[current_number_adapter]["model_adapter"]),gr.Image.update(value = lst_adapter[current_number_adapter]["img_control"]),gr.Slider.update(value = lst_adapter[current_number_adapter]["low_threshold_adapter"]),gr.Slider.update(value = lst_adapter[current_number_adapter]["high_threshold_adapter"]),gr.Checkbox.update(value = lst_adapter[current_number_adapter]["has_body"]),gr.Checkbox.update(value = lst_adapter[current_number_adapter]["has_hand"]),gr.Checkbox.update(value = lst_adapter[current_number_adapter]["has_face"]),gr.Radio.update(value = lst_adapter[current_number_adapter]["preprocessor_adapter"]),gr.Checkbox.update(),gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Slider.update(value= lst_adapter[current_number_adapter]["adapter_conditioning_scale"]),gr.Slider.update(value= lst_adapter[current_number_adapter]["adapter_conditioning_factor"]),gr.Checkbox.update(value = lst_adapter[current_number_adapter]["disable_preprocessing_adapter"]) | |
def complete_edit_multi_adapter(): | |
global current_number_adapter,in_edit_mode_adapter | |
current_number_adapter = 0 | |
in_edit_mode_adapter = False | |
return gr.Button.update(visible = True),gr.Button.update(visible = True),gr.Image.update(value= None),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False) | |
def multi_adapter_function(multi_adapter): | |
if multi_adapter: | |
return gr.Checkbox.update(value = True),gr.Button.update(visible = True),gr.Button.update(visible = True),gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Button.update() | |
return gr.Checkbox.update(),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False) | |
def edit_multi_adapter_image_function(): | |
global lst_adapter,current_number_adapter,in_edit_mode_adapter | |
if len(lst_adapter) > 0: | |
in_edit_mode_adapter = True | |
return gr.Button.update(visible = True),gr.Button.update(visible = True),gr.Button.update(visible = True),gr.Button.update(visible = True),gr.Button.update(visible = False),gr.Button.update(visible = False),gr.Dropdown.update(value = lst_adapter[current_number_adapter]["model_adapter"]),gr.Image.update(value = lst_adapter[current_number_adapter]["img_control"]),gr.Slider.update(value = lst_adapter[current_number_adapter]["low_threshold_adapter"]),gr.Slider.update(value = lst_adapter[current_number_adapter]["high_threshold_adapter"]),gr.Checkbox.update(value = lst_adapter[current_number_adapter]["has_body"]),gr.Checkbox.update(value = lst_adapter[current_number_adapter]["has_hand"]),gr.Checkbox.update(value = lst_adapter[current_number_adapter]["has_face"]),gr.Radio.update(value = lst_adapter[current_number_adapter]["preprocessor_adapter"]),gr.Slider.update(value= lst_adapter[current_number_adapter]["adapter_conditioning_scale"]),gr.Slider.update(value= lst_adapter[current_number_adapter]["adapter_conditioning_factor"]),gr.Checkbox.update(value = lst_adapter[current_number_adapter]["disable_preprocessing_adapter"]) | |
in_edit_mode_adapter = False | |
return gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Button.update(),gr.Dropdown.update(),gr.Image.update(),gr.Slider.update(),gr.Slider.update(),gr.Checkbox.update(),gr.Checkbox.update(),gr.Checkbox.update(),gr.Radio.update(),gr.Slider.update(),gr.Slider.update(),gr.Checkbox.update() | |
def ip_adpater_function(ip_adapter): | |
if ip_adapter: | |
return gr.Checkbox.update() | |
return gr.Checkbox.update(value = False) | |
#ip_adapter,inf_adapt_image,inf_adapt_image_multi,inf_adapt_image_strength,inf_adapt_image_strength_multi,edit_ip_adapter_setting,apply_ip_adapter_setting | |
def ip_adpater_multi_function(ip_adapter_multi): | |
if ip_adapter_multi: | |
return gr.Dropdown.update(choices=[k for k in model_ip_adapter_lst[:-2]],value=model_ip_adapter_lst[0]),gr.Checkbox.update(value = True), gr.Image.update(visible = False), gr.Image.update(visible = True), gr.Slider.update(visible = False), gr.Slider.update(visible = True),gr.Button.update(visible = True),gr.Button.update(visible = True), gr.Image.update(visible = False), gr.Image.update(visible = True) | |
return gr.Dropdown.update(choices=[k for k in model_ip_adapter_lst],value=model_ip_adapter_lst[0]),gr.Checkbox.update(), gr.Image.update(visible = True), gr.Image.update(visible = False), gr.Slider.update(visible = True), gr.Slider.update(visible = False),gr.Button.update(visible = False),gr.Button.update(visible = False), gr.Image.update(visible = True), gr.Image.update(visible = False) | |
def apply_ip_adapter_setting_function(model_ip_adapter,inf_adapt_image_multi,inf_adapt_image_strength_multi,inf_control_adapt_image_multi): | |
global lst_ip_adapter,current_number_ip_adapter | |
if inf_adapt_image_multi is not None: | |
config ={ | |
"model" : model_ip_adapter, | |
"image" : inf_adapt_image_multi, | |
"region_apply": inf_control_adapt_image_multi, | |
"scale" : float(inf_adapt_image_strength_multi), | |
} | |
lst_ip_adapter.append(config) | |
return gr.Image.update(value = None),gr.Image.update(value = None) | |
return gr.Image.update(value = None),gr.Image.update(value = None) | |
#model_ip_adapter,inf_adapt_image_multi,inf_adapt_image_strength_multi,previous_ip_adapter_setting,next_ip_adapter_setting,apply_edit_ip_adapter_setting,complete_cip_adapter_setting,edit_ip_adapter_setting,apply_ip_adapter_setting | |
def edit_ip_adapter_setting_function(): | |
global lst_ip_adapter,current_number_ip_adapter | |
if len(lst_ip_adapter) == 0: | |
return ( | |
gr.Dropdown.update(), | |
gr.Image.update(), | |
gr.Slider.update(), | |
gr.Button.update(), | |
gr.Button.update(), | |
gr.Button.update(), | |
gr.Button.update(), | |
gr.Button.update(), | |
gr.Button.update(), | |
gr.Image.update(), | |
) | |
return ( | |
gr.Dropdown.update(value = lst_ip_adapter[current_number_ip_adapter]["model"]), | |
gr.Image.update(value = lst_ip_adapter[current_number_ip_adapter]["image"]), | |
gr.Slider.update(value = lst_ip_adapter[current_number_ip_adapter]["scale"]), | |
gr.Button.update(visible = True), | |
gr.Button.update(visible = True), | |
gr.Button.update(visible = True), | |
gr.Button.update(visible = True), | |
gr.Button.update(visible = False), | |
gr.Button.update(visible = False), | |
gr.Image.update(value = lst_ip_adapter[current_number_ip_adapter]["region_apply"]), | |
) | |
def previous_ip_adapter_setting_function(): | |
global lst_ip_adapter,current_number_ip_adapter | |
current_number_ip_adapter -= 1 | |
if current_number_ip_adapter < 0: | |
current_number_ip_adapter = len(lst_ip_adapter) -1 | |
return ( | |
gr.Dropdown.update(value = lst_ip_adapter[current_number_ip_adapter]["model"]), | |
gr.Image.update(value = lst_ip_adapter[current_number_ip_adapter]["image"]), | |
gr.Slider.update(value = lst_ip_adapter[current_number_ip_adapter]["scale"]), | |
gr.Image.update(value = lst_ip_adapter[current_number_ip_adapter]["region_apply"]), | |
) | |
def next_ip_adapter_setting_function(): | |
global lst_ip_adapter,current_number_ip_adapter | |
current_number_ip_adapter += 1 | |
if current_number_ip_adapter == len(lst_ip_adapter): | |
current_number_ip_adapter = 0 | |
return ( | |
gr.Dropdown.update(value = lst_ip_adapter[current_number_ip_adapter]["model"]), | |
gr.Image.update(value = lst_ip_adapter[current_number_ip_adapter]["image"]), | |
gr.Slider.update(value = lst_ip_adapter[current_number_ip_adapter]["scale"]), | |
gr.Image.update(value = lst_ip_adapter[current_number_ip_adapter]["region_apply"]), | |
) | |
#inf_adapt_image_multi,previous_ip_adapter_setting,next_ip_adapter_setting,edit_ip_adapter_setting,apply_ip_adapter_setting,apply_edit_ip_adapter_setting,complete_cip_adapter_setting | |
def complete_cip_adapter_setting_function(): | |
return ( | |
gr.Image.update(value = None), | |
gr.Button.update(visible = False), | |
gr.Button.update(visible = False), | |
gr.Button.update(visible = True), | |
gr.Button.update(visible = True), | |
gr.Button.update(visible = False), | |
gr.Button.update(visible = False), | |
gr.Image.update(value = None), | |
) | |
#model_ip_adapter,inf_adapt_image_multi,inf_adapt_image_strength_multi,previous_ip_adapter_setting,next_ip_adapter_setting,edit_ip_adapter_setting,apply_ip_adapter_setting,apply_edit_ip_adapter_setting,complete_cip_adapter_setting | |
def apply_edit_ip_adapter_setting_function(model_ip_adapter,inf_adapt_image_multi,inf_adapt_image_strength_multi,inf_control_adapt_image_multi): | |
global lst_ip_adapter,current_number_ip_adapter | |
if inf_adapt_image_multi is not None: | |
config_change = lst_ip_adapter[current_number_ip_adapter] | |
config_change["model"] = model_ip_adapter | |
config_change["image"] = inf_adapt_image_multi | |
config_change["scale"] = float(inf_adapt_image_strength_multi) | |
config_change["region_apply"] = inf_control_adapt_image_multi | |
return ( | |
gr.Dropdown.update(), | |
gr.Image.update(), | |
gr.Slider.update(), | |
gr.Button.update(), | |
gr.Button.update(), | |
gr.Button.update(), | |
gr.Button.update(), | |
gr.Button.update(), | |
gr.Button.update(), | |
gr.Image.update(), | |
) | |
#Delete | |
lst_ip_adapter.pop(current_number_ip_adapter) | |
current_number_ip_adapter -= 1 | |
if len(lst_ip_adapter) == 0: | |
return ( | |
gr.Dropdown.update(), | |
gr.Image.update(value = None), | |
gr.Slider.update(), | |
gr.Button.update(visible = False), | |
gr.Button.update(visible = False), | |
gr.Button.update(visible = True), | |
gr.Button.update(visible = True), | |
gr.Button.update(visible = False), | |
gr.Button.update(visible = False), | |
gr.Image.update(value = None), | |
) | |
if current_number_ip_adapter == -1: | |
current_number_ip_adapter = len(lst_ip_adapter)-1 | |
return ( | |
gr.Dropdown.update(value = lst_ip_adapter[current_number_ip_adapter]["model"]), | |
gr.Image.update(value = lst_ip_adapter[current_number_ip_adapter]["image"]), | |
gr.Slider.update(value = lst_ip_adapter[current_number_ip_adapter]["scale"]), | |
gr.Button.update(), | |
gr.Button.update(), | |
gr.Button.update(), | |
gr.Button.update(), | |
gr.Button.update(), | |
gr.Button.update(), | |
gr.Image.update(value = lst_ip_adapter[current_number_ip_adapter]["region_apply"]), | |
) | |
def inpaiting_mode_fuction(inpaiting_mode): | |
if inpaiting_mode: | |
return gr.Image.update(visible = False),gr.Image.update(visible = True), gr.Image.update(visible = True),gr.Checkbox.update(visible = True),gr.Button.update(visible = True),gr.Slider.update(value = 1.0) | |
return gr.Image.update(visible = True),gr.Image.update(visible = False), gr.Image.update(visible = False),gr.Checkbox.update(visible = False),gr.Button.update(visible = False),gr.Slider.update(value = 0.5) | |
def get_mask_fuction(inf_image_inpaiting): | |
img_mask = None | |
if isinstance(inf_image_inpaiting,dict): | |
img_mask = inf_image_inpaiting["mask"].copy() | |
return gr.Image.update(img_mask) | |
latent_upscale_modes = { | |
"Latent (bilinear)": {"upscale_method": "bilinear", "upscale_antialias": False}, | |
"Latent (bilinear antialiased)": {"upscale_method": "bilinear", "upscale_antialias": True}, | |
"Latent (bicubic)": {"upscale_method": "bicubic", "upscale_antialias": False}, | |
"Latent (bicubic antialiased)": { | |
"upscale_method": "bicubic", | |
"upscale_antialias": True, | |
}, | |
"Latent (nearest)": {"upscale_method": "nearest", "upscale_antialias": False}, | |
"Latent (nearest-exact)": { | |
"upscale_method": "nearest-exact", | |
"upscale_antialias": False, | |
}, | |
#"Latent (linear)": {"upscale_method": "linear", "upscale_antialias": False}, | |
#"Latent (trilinear)": {"upscale_method": "trilinear", "upscale_antialias": False}, | |
"Latent (area)": {"upscale_method": "area", "upscale_antialias": False}, | |
} | |
css = """ | |
.finetuned-diffusion-div div{ | |
display:inline-flex; | |
align-items:center; | |
gap:.8rem; | |
font-size:1.75rem; | |
padding-top:2rem; | |
} | |
.finetuned-diffusion-div div h1{ | |
font-weight:900; | |
margin-bottom:7px | |
} | |
.finetuned-diffusion-div p{ | |
margin-bottom:10px; | |
font-size:94% | |
} | |
.box { | |
float: left; | |
height: 20px; | |
width: 20px; | |
margin-bottom: 15px; | |
border: 1px solid black; | |
clear: both; | |
} | |
a{ | |
text-decoration:underline | |
} | |
.tabs{ | |
margin-top:0; | |
margin-bottom:0 | |
} | |
#gallery{ | |
min-height:20rem | |
} | |
.no-border { | |
border: none !important; | |
} | |
""" | |
with gr.Blocks(css=css) as demo: | |
gr.HTML( | |
f""" | |
<div class="finetuned-diffusion-div"> | |
<div> | |
<h1>Demo for diffusion models</h1> | |
</div> | |
<p>Running on CPU 🥶 This demo does not work on CPU.</p> | |
</div> | |
""" | |
) | |
global_stats = gr.State(value={}) | |
with gr.Row(): | |
with gr.Column(scale=55): | |
model = gr.Dropdown( | |
choices=[k[0] for k in get_model_list()], | |
label="Model", | |
value=base_name, | |
) | |
with gr.Row(): | |
image_out = gr.Image() | |
gallery = gr.Gallery(label="Generated images", show_label=True, elem_id="gallery",visible = False).style(grid=[1], height="auto") | |
with gr.Column(scale=45): | |
with gr.Group(): | |
with gr.Row(): | |
with gr.Column(scale=70): | |
prompt = gr.Textbox( | |
label="Prompt", | |
value="loli cat girl, blue eyes, flat chest, solo, long messy silver hair, blue capelet, cat ears, cat tail, upper body", | |
show_label=True, | |
#max_lines=4, | |
placeholder="Enter prompt.", | |
) | |
neg_prompt = gr.Textbox( | |
label="Negative Prompt", | |
value="bad quality, low quality, jpeg artifact, cropped", | |
show_label=True, | |
#max_lines=4, | |
placeholder="Enter negative prompt.", | |
) | |
generate = gr.Button(value="Generate").style( | |
rounded=(False, True, True, False) | |
) | |
with gr.Tab("Options"): | |
with gr.Group(): | |
# n_images = gr.Slider(label="Images", value=1, minimum=1, maximum=4, step=1) | |
with gr.Row(): | |
diffuser_pipeline = gr.Checkbox(label="Using diffusers pipeline", value=False) | |
latent_processing = gr.Checkbox(label="Show processing", value=False) | |
region_condition = gr.Checkbox(label="Enable region condition", value=False) | |
with gr.Row(): | |
guidance = gr.Slider( | |
label="Guidance scale", value=7.5, maximum=20 | |
) | |
guidance_rescale = gr.Slider( | |
label="Guidance rescale", value=0, maximum=20 | |
) | |
with gr.Row(): | |
width = gr.Slider( | |
label="Width", value=512, minimum=64, maximum=1920, step=8 | |
) | |
height = gr.Slider( | |
label="Height", value=512, minimum=64, maximum=1920, step=8 | |
) | |
with gr.Row(): | |
clip_skip = gr.Slider( | |
label="Clip Skip", value=2, minimum=1, maximum=12, step=1 | |
) | |
steps = gr.Slider( | |
label="Steps", value=25, minimum=2, maximum=100, step=1 | |
) | |
with gr.Row(): | |
long_encode = sampler = gr.Dropdown( | |
value="Automatic111 Encoding", | |
label="Encoding prompt type", | |
choices=[s for s in encoding_type], | |
) | |
sampler = gr.Dropdown( | |
value="DPM++ 2M Karras", | |
label="Sampler", | |
choices=[s[0] for s in samplers_k_diffusion], | |
) | |
with gr.Row(): | |
seed = gr.Number(label="Seed (Lower than 0 = random)", value=-1) | |
Insert_model = gr.Textbox( | |
label="Insert model", | |
show_label=True, | |
placeholder="Enter a model's link.", | |
) | |
insert_model = gr.Button(value="Insert") | |
#reset_model = gr.Button(value="Reset") | |
insert_model.click( | |
add_model, | |
inputs=[Insert_model], | |
outputs=[model, Insert_model], | |
queue=False, | |
) | |
with gr.Tab("Image to image/Inpaiting"): | |
with gr.Group(): | |
with gr.Row(): | |
inpaiting_mode = gr.Checkbox(label="Inpaiting", value=False) | |
invert_mask_mode = gr.Checkbox(label="Black areas are used", value=False,visible = False) | |
with gr.Row(): | |
inf_image = gr.Image( | |
label="Image", source="upload", type="pil", | |
) | |
inf_image_inpaiting = gr.Image( | |
label="Image", source="upload", type="pil", tool="sketch",visible = False | |
) | |
mask_upload = gr.Image( | |
label="Mask", source="upload", type="pil",image_mode='L',visible = False, | |
) | |
inf_strength = gr.Slider( | |
label="Transformation strength", | |
minimum=0, | |
maximum=1, | |
step=0.01, | |
value=0.5, | |
) | |
get_mask = gr.Button(value="Get mask",visible = False) | |
inpaiting_mode.change( | |
inpaiting_mode_fuction, | |
inputs=[inpaiting_mode], | |
outputs=[inf_image,inf_image_inpaiting,mask_upload,invert_mask_mode,get_mask,inf_strength], | |
queue=False, | |
) | |
get_mask.click( | |
get_mask_fuction, | |
inputs=[inf_image_inpaiting], | |
outputs=[mask_upload], | |
queue=False, | |
) | |
with gr.Tab("Hires fix"): | |
with gr.Group(): | |
with gr.Row(): | |
hr_enabled = gr.Checkbox(label="Enable upscaler", value=False) | |
hr_process_enabled = gr.Checkbox(label="Show processing upscaler", value=False) | |
hr_region_condition = gr.Checkbox(label="Enable region condition upscaler", value=False) | |
with gr.Row(): | |
hr_method = gr.Dropdown( | |
[key for key in latent_upscale_modes.keys()], | |
value="Latent (bilinear)", | |
label="Upscale method", | |
) | |
sampler_hires = gr.Dropdown( | |
value="DPM++ 2M Karras", | |
label="Sampler", | |
choices=[s[0] for s in samplers_k_diffusion], | |
) | |
hr_scale = gr.Slider( | |
label="Upscale factor", | |
minimum=1.0, | |
maximum=2.0, | |
step=0.1, | |
value=1.2, | |
) | |
hr_denoise = gr.Slider( | |
label="Denoising strength", | |
minimum=0.0, | |
maximum=1.0, | |
step=0.1, | |
value=0.8, | |
) | |
hr_scale.change( | |
lambda g, x, w, h: gr.Checkbox.update( | |
label=res_cap(g, w, h, x) | |
), | |
inputs=[hr_enabled, hr_scale, width, height], | |
outputs=hr_enabled, | |
queue=False, | |
) | |
hr_process_enabled.change( | |
change_gallery, | |
inputs=[latent_processing,hr_process_enabled], | |
outputs=[gallery], | |
queue=False, | |
) | |
latent_processing.change( | |
change_gallery, | |
inputs=[latent_processing,hr_process_enabled], | |
outputs=[gallery], | |
queue=False, | |
) | |
with gr.Tab("IP-Adapter"): | |
with gr.Group(): | |
with gr.Row(): | |
ip_adapter = gr.Checkbox(label="Using IP-Adapter", value=False) | |
ip_adapter_multi = gr.Checkbox(label="Using Multi IP-Adapter", value=False) | |
invert_ip_adapter_mask_mode = gr.Checkbox(label="Black areas are used", value=True) | |
model_ip_adapter = gr.Dropdown( | |
choices=[k for k in model_ip_adapter_lst], | |
label="Model IP-Adapter", | |
value=model_ip_adapter_lst[0], | |
) | |
with gr.Row(): | |
inf_adapt_image = gr.Image( | |
label="IP-Adapter", source="upload", type="pil" | |
) | |
inf_control_adapt_image = gr.Image( | |
label="Region apply", source="upload", type="pil",image_mode='L' | |
) | |
inf_adapt_image_multi = gr.Image( | |
label="IP-Adapter", source="upload", type="pil",visible= False | |
) | |
inf_control_adapt_image_multi = gr.Image( | |
label="Region apply", source="upload", type="pil",image_mode='L',visible= False | |
) | |
inf_adapt_image_strength = gr.Slider( | |
label="IP-Adapter scale", | |
minimum=0, | |
maximum=2, | |
step=0.01, | |
value=1, | |
) | |
inf_adapt_image_strength_multi = gr.Slider( | |
label="IP-Adapter scale", | |
minimum=0, | |
maximum=2, | |
step=0.01, | |
value=1, | |
visible= False, | |
) | |
with gr.Row(): | |
previous_ip_adapter_setting = gr.Button(value="Previous setting",visible = False) | |
next_ip_adapter_setting = gr.Button(value="Next setting",visible = False) | |
with gr.Row(): | |
edit_ip_adapter_setting = gr.Button(value="Edit previous setting",visible = False) | |
apply_ip_adapter_setting = gr.Button(value="Apply setting",visible = False) | |
with gr.Row(): | |
apply_edit_ip_adapter_setting = gr.Button(value="Apply change",visible = False) | |
complete_cip_adapter_setting = gr.Button(value="Complete change",visible = False) | |
ip_adapter.change( | |
ip_adpater_function, | |
inputs=[ip_adapter], | |
outputs=[ip_adapter_multi], | |
queue=False, | |
) | |
ip_adapter_multi.change( | |
ip_adpater_multi_function, | |
inputs=[ip_adapter_multi], | |
outputs=[model_ip_adapter,ip_adapter,inf_adapt_image,inf_adapt_image_multi,inf_adapt_image_strength,inf_adapt_image_strength_multi,edit_ip_adapter_setting,apply_ip_adapter_setting,inf_control_adapt_image,inf_control_adapt_image_multi], | |
queue=False, | |
) | |
apply_ip_adapter_setting.click( | |
apply_ip_adapter_setting_function, | |
inputs = [model_ip_adapter,inf_adapt_image_multi,inf_adapt_image_strength_multi,inf_control_adapt_image_multi], | |
outputs = [inf_adapt_image_multi,inf_control_adapt_image_multi], | |
) | |
edit_ip_adapter_setting.click( | |
edit_ip_adapter_setting_function, | |
inputs = [], | |
outputs =[model_ip_adapter,inf_adapt_image_multi,inf_adapt_image_strength_multi,previous_ip_adapter_setting,next_ip_adapter_setting,apply_edit_ip_adapter_setting,complete_cip_adapter_setting,edit_ip_adapter_setting,apply_ip_adapter_setting,inf_control_adapt_image_multi], | |
queue =False, | |
) | |
previous_ip_adapter_setting.click( | |
previous_ip_adapter_setting_function, | |
inputs = [], | |
outputs = [model_ip_adapter,inf_adapt_image_multi,inf_adapt_image_strength_multi,inf_control_adapt_image_multi], | |
queue = False, | |
) | |
next_ip_adapter_setting.click( | |
next_ip_adapter_setting_function, | |
inputs = [], | |
outputs = [model_ip_adapter,inf_adapt_image_multi,inf_adapt_image_strength_multi,inf_control_adapt_image_multi], | |
queue = False, | |
) | |
apply_edit_ip_adapter_setting.click( | |
apply_edit_ip_adapter_setting_function, | |
inputs = [model_ip_adapter,inf_adapt_image_multi,inf_adapt_image_strength_multi,inf_control_adapt_image_multi], | |
outputs =[model_ip_adapter,inf_adapt_image_multi,inf_adapt_image_strength_multi,previous_ip_adapter_setting,next_ip_adapter_setting,edit_ip_adapter_setting,apply_ip_adapter_setting,apply_edit_ip_adapter_setting,complete_cip_adapter_setting,inf_control_adapt_image_multi], | |
queue = False, | |
) | |
complete_cip_adapter_setting.click( | |
complete_cip_adapter_setting_function, | |
inputs = [], | |
outputs = [inf_adapt_image_multi,previous_ip_adapter_setting,next_ip_adapter_setting,edit_ip_adapter_setting,apply_ip_adapter_setting,apply_edit_ip_adapter_setting,complete_cip_adapter_setting,inf_control_adapt_image_multi], | |
queue = False, | |
) | |
with gr.Tab("Controlnet"): | |
with gr.Group(): | |
with gr.Row(): | |
controlnet_enabled = gr.Checkbox(label="Enable Controlnet", value=False) | |
disable_preprocessing = gr.Checkbox(label="Disable preprocessing", value=False) | |
multi_controlnet = gr.Checkbox(label="Enable Multi Controlnet", value=False) | |
#sketch_enabled = gr.Checkbox(label="Sketch image", value=False) | |
model_control_net = gr.Dropdown( | |
choices=[k for k in controlnet_lst], | |
label="Model Controlnet", | |
value=controlnet_lst[0], | |
) | |
with gr.Row(): | |
low_threshold = gr.Slider( | |
label="Canny low threshold", value=100, minimum=1, maximum=255, step=1 | |
) | |
high_threshold = gr.Slider( | |
label="Canny high threshold", value=200, minimum=1, maximum=255, step=1 | |
) | |
with gr.Row(): | |
has_body_openpose = gr.Checkbox(label="Has body", value=True,visible= False) | |
has_hand_openpose = gr.Checkbox(label="Has hand", value=False,visible= False) | |
has_face_openpose = gr.Checkbox(label="Has face", value=False,visible= False) | |
preprocessor_name = gr.Radio( | |
label="Preprocessor", | |
type="value", | |
visible= False, | |
) | |
with gr.Row(): | |
control_guidance_start = gr.Slider( | |
label="Control guidance start", value=0, minimum=0, maximum=1, step=0.01 | |
) | |
control_guidance_end = gr.Slider( | |
label="Control guidance end", value=1, minimum=0, maximum=1, step=0.01 | |
) | |
controlnet_scale = gr.Slider( | |
label="Controlnet scale", value=1, minimum=0, maximum=2, step=0.01 | |
) | |
with gr.Row(): | |
controlnet_img = gr.Image( | |
image_mode="RGB", | |
source="upload", | |
label = "Image", | |
type = 'pil', | |
) | |
image_condition = gr.Image(interactive=False,image_mode="RGB",label = "Preprocessor Preview",type = 'pil') | |
control_image_click = gr.Button(value="Preview") | |
with gr.Row(): | |
previous_multi_control_image = gr.Button(value="Previous control setting",visible = False) | |
next_multi_control_image = gr.Button(value="Next control setting",visible = False) | |
with gr.Row(): | |
edit_multi_control_image = gr.Button(value="Edit previous setting",visible = False) | |
apply_multi_control_image = gr.Button(value="Apply setting",visible = False) | |
with gr.Row(): | |
apply_edit_multi = gr.Button(value="Apply change",visible = False) | |
complete_change_multi = gr.Button(value="Complete change",visible = False) | |
control_image_click.click( | |
preview_image, | |
inputs=[model_control_net,low_threshold,high_threshold,has_body_openpose,has_hand_openpose,has_face_openpose,controlnet_img,preprocessor_name,multi_controlnet,disable_preprocessing], | |
outputs=[image_condition], | |
queue=False, | |
) | |
multi_controlnet.change( | |
multi_controlnet_function, | |
inputs=[multi_controlnet], | |
outputs=[controlnet_enabled,edit_multi_control_image,apply_multi_control_image,previous_multi_control_image,next_multi_control_image,apply_edit_multi,complete_change_multi], | |
queue=False, | |
) | |
edit_multi_control_image.click( | |
edit_multi_control_image_function, | |
inputs=[], | |
outputs=[previous_multi_control_image,next_multi_control_image,apply_edit_multi,complete_change_multi,edit_multi_control_image,apply_multi_control_image,model_control_net,controlnet_img,low_threshold,high_threshold,has_body_openpose,has_hand_openpose,has_face_openpose,preprocessor_name,controlnet_scale,control_guidance_start,control_guidance_end,disable_preprocessing], | |
queue=False, | |
) | |
previous_multi_control_image.click( | |
previous_view_control, | |
inputs=[], | |
outputs=[model_control_net,controlnet_img,low_threshold,high_threshold,has_body_openpose,has_hand_openpose,has_face_openpose,preprocessor_name,controlnet_scale,control_guidance_start,control_guidance_end,disable_preprocessing], | |
queue=False, | |
) | |
next_multi_control_image.click( | |
next_view_control, | |
inputs=[], | |
outputs=[model_control_net,controlnet_img,low_threshold,high_threshold,has_body_openpose,has_hand_openpose,has_face_openpose,preprocessor_name,controlnet_scale,control_guidance_start,control_guidance_end,disable_preprocessing], | |
queue=False, | |
) | |
apply_multi_control_image.click( | |
control_net_muti, | |
inputs=[model_control_net,controlnet_img,low_threshold,high_threshold,has_body_openpose,has_hand_openpose,has_face_openpose,preprocessor_name,controlnet_scale,control_guidance_start,control_guidance_end,disable_preprocessing], | |
outputs=[controlnet_img], | |
queue=False, | |
) | |
apply_edit_multi.click( | |
apply_edit_control_net, | |
inputs=[model_control_net,controlnet_img,low_threshold,high_threshold,has_body_openpose,has_hand_openpose,has_face_openpose,preprocessor_name,controlnet_scale,control_guidance_start,control_guidance_end,disable_preprocessing], | |
outputs=[model_control_net,controlnet_img,low_threshold,high_threshold,has_body_openpose,has_hand_openpose,has_face_openpose,preprocessor_name,multi_controlnet,previous_multi_control_image,next_multi_control_image,apply_edit_multi,complete_change_multi,controlnet_scale,control_guidance_start,control_guidance_end,disable_preprocessing], | |
queue=False, | |
) | |
complete_change_multi.click( | |
complete_edit_multi, | |
inputs=[], | |
outputs=[edit_multi_control_image,apply_multi_control_image,controlnet_img,apply_edit_multi,complete_change_multi,next_multi_control_image,previous_multi_control_image], | |
queue=False, | |
) | |
controlnet_img.change( | |
change_image_condition, | |
inputs=[image_condition], | |
outputs=[image_condition], | |
queue=False, | |
) | |
model_control_net.change( | |
change_control_net, | |
inputs=[model_control_net, low_threshold, high_threshold,has_body_openpose,has_hand_openpose,has_face_openpose], | |
outputs=[low_threshold, high_threshold,has_body_openpose,has_hand_openpose,has_face_openpose,preprocessor_name], | |
queue=False, | |
) | |
with gr.Tab("T2I Adapter"): | |
with gr.Group(): | |
with gr.Row(): | |
adapter_enabled = gr.Checkbox(label="Enable T2I Adapter", value=False) | |
disable_preprocessing_adapter = gr.Checkbox(label="Disable preprocessing", value=False) | |
multi_adapter = gr.Checkbox(label="Enable Multi T2I Adapter", value=False) | |
#sketch_enabled = gr.Checkbox(label="Sketch image", value=False) | |
model_adapter = gr.Dropdown( | |
choices=[k for k in adapter_lst], | |
label="Model Controlnet", | |
value=adapter_lst[0], | |
) | |
with gr.Row(): | |
low_threshold_adapter = gr.Slider( | |
label="Canny low threshold", value=100, minimum=1, maximum=255, step=1 | |
) | |
high_threshold_adapter = gr.Slider( | |
label="Canny high threshold", value=200, minimum=1, maximum=255, step=1 | |
) | |
with gr.Row(): | |
has_body_openpose_adapter = gr.Checkbox(label="Has body", value=True,visible= False) | |
has_hand_openpose_adapter = gr.Checkbox(label="Has hand", value=False,visible= False) | |
has_face_openpose_adapter = gr.Checkbox(label="Has face", value=False,visible= False) | |
preprocessor_adapter = gr.Radio( | |
label="Preprocessor", | |
type="value", | |
visible= False, | |
) | |
with gr.Row(): | |
adapter_conditioning_scale = gr.Slider( | |
label="Conditioning scale", value=1, minimum=0, maximum=2, step=0.01 | |
) | |
adapter_conditioning_factor = gr.Slider( | |
label="Conditioning factor", value=1, minimum=0, maximum=1, step=0.01 | |
) | |
'''controlnet_scale = gr.Slider( | |
label="Controlnet scale", value=1, minimum=0, maximum=2, step=0.01 | |
)''' | |
with gr.Row(): | |
adapter_img = gr.Image( | |
image_mode="RGB", | |
source="upload", | |
label = "Image", | |
type = 'pil', | |
) | |
image_condition_adapter = gr.Image(interactive=False,image_mode="RGB",label = "Preprocessor Preview",type = 'pil') | |
adapter_image_click = gr.Button(value="Preview") | |
with gr.Row(): | |
previous_multi_adapter_image = gr.Button(value="Previous adapter setting",visible = False) | |
next_multi_adapter_image = gr.Button(value="Next adapter setting",visible = False) | |
with gr.Row(): | |
edit_multi_adapter_image = gr.Button(value="Edit previous setting",visible = False) | |
apply_multi_adapter_image = gr.Button(value="Apply setting",visible = False) | |
with gr.Row(): | |
apply_edit_multi_adapter = gr.Button(value="Apply change",visible = False) | |
complete_change_multi_adapter = gr.Button(value="Complete change",visible = False) | |
adapter_image_click.click( | |
preview_image_adapter, | |
inputs=[model_adapter,low_threshold_adapter,high_threshold_adapter,has_body_openpose_adapter,has_hand_openpose_adapter,has_face_openpose_adapter,adapter_img,preprocessor_adapter,multi_adapter,disable_preprocessing_adapter], | |
outputs=[image_condition_adapter], | |
queue=False, | |
) | |
multi_adapter.change( | |
multi_adapter_function, | |
inputs=[multi_adapter], | |
outputs=[adapter_enabled,edit_multi_adapter_image,apply_multi_adapter_image,previous_multi_adapter_image,next_multi_adapter_image,apply_edit_multi_adapter,complete_change_multi_adapter], | |
queue=False, | |
) | |
edit_multi_adapter_image.click( | |
edit_multi_adapter_image_function, | |
inputs=[], | |
outputs=[previous_multi_adapter_image,next_multi_adapter_image,apply_edit_multi_adapter,complete_change_multi_adapter,edit_multi_adapter_image,apply_multi_adapter_image,model_adapter,adapter_img,low_threshold_adapter,high_threshold_adapter,has_body_openpose_adapter,has_hand_openpose_adapter,has_face_openpose_adapter,preprocessor_adapter,adapter_conditioning_scale,adapter_conditioning_factor,disable_preprocessing_adapter], | |
queue=False, | |
) | |
previous_multi_adapter_image.click( | |
previous_view_adapter, | |
inputs=[], | |
outputs=[model_adapter,adapter_img,low_threshold_adapter,high_threshold_adapter,has_body_openpose_adapter,has_hand_openpose_adapter,has_face_openpose_adapter,preprocessor_adapter,adapter_conditioning_scale,adapter_conditioning_factor,disable_preprocessing_adapter], | |
queue=False, | |
) | |
next_multi_adapter_image.click( | |
next_view_adapter, | |
inputs=[], | |
outputs=[model_adapter,adapter_img,low_threshold_adapter,high_threshold_adapter,has_body_openpose_adapter,has_hand_openpose_adapter,has_face_openpose_adapter,preprocessor_adapter,adapter_conditioning_scale,adapter_conditioning_factor,disable_preprocessing_adapter], | |
queue=False, | |
) | |
apply_multi_adapter_image.click( | |
adapter_muti, | |
inputs=[model_adapter,adapter_img,low_threshold_adapter,high_threshold_adapter,has_body_openpose_adapter,has_hand_openpose_adapter,has_face_openpose_adapter,preprocessor_adapter,adapter_conditioning_scale,adapter_conditioning_factor,disable_preprocessing_adapter], | |
outputs=[adapter_img], | |
queue=False, | |
) | |
apply_edit_multi_adapter.click( | |
apply_edit_adapter, | |
inputs=[model_adapter,adapter_img,low_threshold_adapter,high_threshold_adapter,has_body_openpose_adapter,has_hand_openpose_adapter,has_face_openpose_adapter,preprocessor_adapter,adapter_conditioning_scale,adapter_conditioning_factor,disable_preprocessing_adapter], | |
outputs=[model_adapter,adapter_img,low_threshold_adapter,high_threshold_adapter,has_body_openpose_adapter,has_hand_openpose_adapter,has_face_openpose_adapter,preprocessor_adapter,multi_adapter,previous_multi_adapter_image,next_multi_adapter_image,apply_edit_multi_adapter,complete_change_multi_adapter,adapter_conditioning_scale,adapter_conditioning_factor,disable_preprocessing_adapter], | |
queue=False, | |
) | |
complete_change_multi_adapter.click( | |
complete_edit_multi_adapter, | |
inputs=[], | |
outputs=[edit_multi_adapter_image,apply_multi_adapter_image,adapter_img,apply_edit_multi_adapter,complete_change_multi_adapter,next_multi_adapter_image,previous_multi_adapter_image], | |
queue=False, | |
) | |
adapter_img.change( | |
change_image_condition_adapter, | |
inputs=[image_condition_adapter], | |
outputs=[image_condition_adapter], | |
queue=False, | |
) | |
model_adapter.change( | |
change_control_net, | |
inputs=[model_adapter, low_threshold_adapter, high_threshold_adapter,has_body_openpose_adapter,has_hand_openpose_adapter,has_face_openpose_adapter], | |
outputs=[low_threshold_adapter, high_threshold_adapter,has_body_openpose_adapter,has_hand_openpose_adapter,has_face_openpose_adapter,preprocessor_adapter], | |
queue=False, | |
) | |
diffuser_pipeline.change( | |
mode_diffuser_pipeline_sampler, | |
inputs=[diffuser_pipeline, sampler,sampler_hires], | |
outputs=[diffuser_pipeline,sampler,sampler_hires], | |
queue=False, | |
) | |
hr_enabled.change( | |
lambda g, x, w, h: gr.Checkbox.update( | |
label=res_cap(g, w, h, x) | |
), | |
inputs=[hr_enabled, hr_scale, width, height], | |
outputs=hr_enabled, | |
queue=False, | |
) | |
adapter_enabled.change( | |
mode_diffuser_pipeline, | |
inputs=[adapter_enabled], | |
outputs=[adapter_enabled,multi_adapter], | |
queue=False, | |
) | |
controlnet_enabled.change( | |
mode_diffuser_pipeline, | |
inputs=[controlnet_enabled], | |
outputs=[controlnet_enabled,multi_controlnet], | |
queue=False, | |
) | |
'''controlnet_enabled.change( | |
mode_diffuser_pipeline1, | |
inputs=[diffuser_pipeline, controlnet_enabled], | |
outputs=[controlnet_enabled], | |
queue=False, | |
)''' | |
with gr.Tab("Vae Setting"): | |
with gr.Group(): | |
vae_used = gr.Dropdown( | |
choices=[k for k in vae_lst], | |
label="Chosing Vae", | |
value=vae_lst[0], | |
) | |
with gr.Row(): | |
with gr.Column(): | |
Insert_vae = gr.Textbox( | |
label="Insert Vae's link", | |
show_label=True, | |
placeholder="Enter a Vae's link.", | |
) | |
single_load_file = gr.Checkbox(label="Is Single File", value=False) | |
insert_vae = gr.Button(value="Insert") | |
insert_vae.click( | |
add_vae, | |
inputs=[Insert_vae,single_load_file], | |
outputs=[vae_used, Insert_vae,single_load_file], | |
queue=False, | |
) | |
with gr.Tab("Embeddings/Loras"): | |
ti_state = gr.State(dict()) | |
lora_group = gr.State(dict()) | |
with gr.Group(): | |
with gr.Row(): | |
with gr.Column(): | |
ti_vals = gr.CheckboxGroup(label="Chosing embeddings") | |
embs_choose = gr.Text(label="Embeddings chosen") | |
with gr.Row(): | |
choose_em = gr.Button(value="Select Embeddings") | |
delete_em = gr.Button(value="Delete Embeddings") | |
choose_em.click(choose_tistate,inputs=[ti_vals],outputs=[ti_state,embs_choose,ti_vals],queue=False,) | |
delete_em.click(delete_embed,inputs=[ti_vals,ti_state,embs_choose],outputs=[ti_vals,ti_state,embs_choose],queue=False,) | |
with gr.Row(): | |
with gr.Column(): | |
lora_list = gr.CheckboxGroup(label="Chosing Loras") | |
lora_choose = gr.Text(label="Loras chosen") | |
with gr.Row(): | |
choose_lora = gr.Button(value="Select Loras") | |
delete_lora = gr.Button(value="Delete Loras") | |
lora_vals = gr.Dropdown(choices=[k for k in lora_lst],label="Loras Scale",value=lora_lst[0],) | |
choose_lora.click(choose_lora_function,inputs=[lora_list],outputs=[lora_group,lora_choose,lora_list,lora_vals],queue=False,) | |
delete_lora.click(delete_lora_function,inputs=[lora_list,lora_group,lora_choose],outputs=[lora_list,lora_group,lora_choose,lora_vals],queue=False,) | |
# delete_lora_but = gr.Button(value="Delete Lora") | |
link_download = gr.Textbox( | |
label="Insert lora's/embedding's link", | |
show_label=True, | |
placeholder="Enter a link download.", | |
) | |
#delete_lora_but.click(lora_delete,inputs=[lora_vals],outputs=[lora_vals],queue=False,) | |
with gr.Row(): | |
uploads = gr.Files(label="Upload new embeddings/lora") | |
with gr.Column(): | |
lora_scale = gr.Slider( | |
label="Lora scale", | |
minimum=0, | |
maximum=2, | |
step=0.01, | |
value=1.0, | |
) | |
btn = gr.Button(value="Upload/Download") | |
btn_del = gr.Button(value="Reset") | |
lora_vals.change( | |
change_lora_value, | |
inputs=[lora_vals], | |
outputs=[lora_scale], | |
queue=False, | |
) | |
lora_scale.change( | |
update_lora_value, | |
inputs=[lora_scale,lora_vals], | |
outputs=[], | |
queue=False, | |
) | |
btn.click( | |
add_net, | |
inputs=[uploads,link_download], | |
outputs=[ti_vals,lora_list, lora_vals, uploads,link_download], | |
queue=False, | |
) | |
btn_del.click( | |
clean_states, | |
inputs=[ti_state,lora_group], | |
outputs=[ti_state,lora_group, ti_vals,lora_list, lora_vals, uploads,embs_choose,lora_choose,link_download], | |
queue=False, | |
) | |
# error_output = gr.Markdown() | |
gr.HTML( | |
f""" | |
<div class="finetuned-diffusion-div"> | |
<div> | |
<h1>Define the object's region.</h1> | |
</div> | |
<p> | |
Using the following formula as default: w = scale * token_weight_martix * sigma * std(qk). | |
</p> | |
</div> | |
""" | |
) | |
with gr.Row(): | |
with gr.Column(scale=55): | |
formula_button = gr.Dropdown( | |
choices=[k[0] for k in formula], | |
label="Formual", | |
value=formula[0][0], | |
) | |
rendered = gr.Image( | |
invert_colors=True, | |
source="canvas", | |
interactive=False, | |
image_mode="RGBA", | |
) | |
with gr.Column(scale=45): | |
with gr.Group(): | |
with gr.Row(): | |
with gr.Column(scale=70): | |
# g_strength = gr.Slider( | |
# label="Compliance rate", | |
# minimum=0, | |
# maximum=2, | |
# step=0.01, | |
# value=0.4, | |
# ) | |
text = gr.Textbox( | |
lines=2, | |
interactive=True, | |
label="Token to Draw: (Separate by comma)", | |
) | |
radio = gr.Radio([], label="Tokens",visible = False) | |
sk_update = gr.Button(value="Update").style( | |
rounded=(False, True, True, False) | |
) | |
# g_strength.change(lambda b: gr.update(f"Scaled additional attn: $w = {b} \log (1 + \sigma) \std (Q^T K)$."), inputs=g_strength, outputs=[g_output]) | |
with gr.Tab("SketchPad"): | |
sp = gr.Image( | |
width = 512, | |
height = 512, | |
image_mode="L", | |
tool="sketch", | |
source="canvas", | |
interactive=False | |
) | |
'''mask_outsides = gr.Checkbox( | |
label="Mask other areas", | |
value=False | |
)''' | |
with gr.Row(): | |
mask_outsides = gr.Slider( | |
label="Decrease unmarked region weight", | |
minimum=0, | |
maximum=3, | |
step=0.01, | |
value=0, | |
) | |
strength = gr.Slider( | |
label="Token-Region strength", | |
minimum=0, | |
maximum=3, | |
step=0.01, | |
value=0.5, | |
) | |
width.change( | |
apply_size_sketch, | |
inputs=[width, height,global_stats,inf_image,inpaiting_mode,inf_image_inpaiting], | |
outputs=[global_stats, rendered,sp], | |
queue=False, | |
) | |
height.change( | |
apply_size_sketch, | |
inputs=[width, height,global_stats,inf_image,inpaiting_mode,inf_image_inpaiting], | |
outputs=[global_stats, rendered,sp], | |
queue=False, | |
) | |
inf_image.change( | |
apply_size_sketch, | |
inputs=[width, height,global_stats,inf_image,inpaiting_mode,inf_image_inpaiting], | |
outputs=[global_stats, rendered,sp], | |
queue=False, | |
) | |
sk_update.click( | |
detect_text, | |
inputs=[text, global_stats, width, height,formula_button,inf_image,inpaiting_mode,inf_image_inpaiting], | |
outputs=[global_stats, sp, radio, rendered,formula_button], | |
queue=False, | |
) | |
radio.change( | |
switch_canvas, | |
inputs=[radio, global_stats, width, height,inf_image,inpaiting_mode,inf_image_inpaiting], | |
outputs=[sp, strength, mask_outsides, rendered], | |
queue=False, | |
) | |
sp.edit( | |
apply_canvas, | |
inputs=[radio, sp, global_stats, width, height,inf_image,inpaiting_mode,inf_image_inpaiting], | |
outputs=[global_stats, rendered], | |
queue=False, | |
) | |
strength.change( | |
apply_weight, | |
inputs=[radio, strength, global_stats], | |
outputs=[global_stats], | |
queue=False, | |
) | |
mask_outsides.change( | |
apply_option, | |
inputs=[radio, mask_outsides, global_stats], | |
outputs=[global_stats], | |
queue=False, | |
) | |
with gr.Tab("UploadFile"): | |
sp2 = gr.Image( | |
image_mode="RGB", | |
source="upload", | |
) | |
sp3 = gr.Image( | |
image_mode="L", | |
source="canvas", | |
visible = False, | |
interactive = False, | |
) | |
with gr.Row(): | |
previous_page = gr.Button(value="Previous",visible = False,) | |
next_page = gr.Button(value="Next",visible = False,) | |
'''mask_outsides2 = gr.Checkbox( | |
label="Mask other areas", | |
value=False, | |
)''' | |
with gr.Row(): | |
mask_outsides2 = gr.Slider( | |
label="Decrease unmarked region weight", | |
minimum=0, | |
maximum=3, | |
step=0.01, | |
value=0, | |
) | |
strength2 = gr.Slider( | |
label="Token-Region strength", | |
minimum=0, | |
maximum=3, | |
step=0.01, | |
value=0.5, | |
) | |
'''sk_update.click( | |
detect_text1, | |
inputs=[text, global_stats, width, height,formula_button,inf_image], | |
outputs=[global_stats, radio, rendered,formula_button], | |
queue=False, | |
)''' | |
with gr.Row(): | |
apply_style = gr.Button(value="Apply") | |
apply_clustering_style = gr.Button(value="Extracting color regions") | |
with gr.Row(): | |
add_style = gr.Button(value="Apply",visible = False) | |
complete_clustering = gr.Button(value="Complete",visible = False) | |
apply_style.click( | |
apply_image, | |
inputs=[sp2, radio, width, height, strength2, mask_outsides2, global_stats,inf_image,inpaiting_mode,inf_image_inpaiting], | |
outputs=[global_stats, rendered], | |
queue=False, | |
) | |
apply_clustering_style.click( | |
apply_base_on_color, | |
inputs=[sp2,global_stats,width, height,inf_image,inpaiting_mode,inf_image_inpaiting], | |
outputs=[rendered,apply_style,apply_clustering_style,previous_page,next_page,complete_clustering,sp2,sp3,add_style,global_stats], | |
queue=False, | |
) | |
previous_page.click( | |
previous_image_page, | |
inputs=[sp3], | |
outputs=[sp3], | |
queue=False, | |
) | |
next_page.click( | |
next_image_page, | |
inputs=[sp3], | |
outputs=[sp3], | |
queue=False, | |
) | |
add_style.click( | |
apply_image_clustering, | |
inputs=[sp3, radio, width, height, strength2, mask_outsides2, global_stats,inf_image,inpaiting_mode,inf_image_inpaiting], | |
outputs=[global_stats,rendered], | |
queue=False, | |
) | |
complete_clustering.click( | |
completing_clustering, | |
inputs=[sp2], | |
outputs=[apply_style,apply_clustering_style,previous_page,next_page,complete_clustering,sp2,sp3,add_style], | |
queue=False, | |
) | |
'''width.change( | |
apply_new_res, | |
inputs=[width, height, global_stats,inf_image,rendered], | |
outputs=[global_stats, rendered], | |
queue=False, | |
) | |
height.change( | |
apply_new_res, | |
inputs=[width, height, global_stats,inf_image,rendered], | |
outputs=[global_stats, rendered], | |
queue=False, | |
)''' | |
# color_stats = gr.State(value={}) | |
# text.change(detect_color, inputs=[sp, text, color_stats], outputs=[color_stats, rendered]) | |
# sp.change(detect_color, inputs=[sp, text, color_stats], outputs=[color_stats, rendered]) | |
inputs = [ | |
prompt, | |
guidance, | |
steps, | |
width, | |
height, | |
clip_skip, | |
seed, | |
neg_prompt, | |
global_stats, | |
#g_strength, | |
inf_image, | |
inf_strength, | |
hr_enabled, | |
hr_method, | |
hr_scale, | |
hr_denoise, | |
sampler, | |
ti_state, | |
model, | |
lora_group, | |
#lora_vals, | |
#lora_scale, | |
formula_button, | |
controlnet_enabled, | |
model_control_net, | |
low_threshold, | |
high_threshold, | |
has_body_openpose, | |
has_hand_openpose, | |
has_face_openpose, | |
controlnet_img, | |
image_condition, | |
controlnet_scale, | |
preprocessor_name, | |
diffuser_pipeline, | |
sampler_hires, | |
latent_processing, | |
control_guidance_start, | |
control_guidance_end, | |
multi_controlnet, | |
disable_preprocessing, | |
region_condition, | |
hr_process_enabled, | |
ip_adapter, | |
model_ip_adapter, | |
inf_adapt_image, | |
inf_adapt_image_strength, | |
hr_region_condition, | |
adapter_enabled, | |
model_adapter, | |
low_threshold_adapter, | |
high_threshold_adapter, | |
has_body_openpose_adapter, | |
has_hand_openpose_adapter, | |
has_face_openpose_adapter, | |
adapter_img, | |
image_condition_adapter, | |
preprocessor_adapter, | |
adapter_conditioning_scale, | |
adapter_conditioning_factor, | |
multi_adapter, | |
disable_preprocessing_adapter, | |
ip_adapter_multi, | |
guidance_rescale, | |
inf_control_adapt_image, | |
long_encode, | |
inpaiting_mode, | |
invert_mask_mode, | |
mask_upload, | |
inf_image_inpaiting, | |
invert_ip_adapter_mask_mode, | |
vae_used, | |
] | |
outputs = [image_out,gallery] | |
prompt.submit(inference, inputs=inputs, outputs=outputs) | |
generate.click(inference, inputs=inputs, outputs=outputs) | |
print(f"Space built in {time.time() - start_time:.2f} seconds") | |
demo.queue().launch(share=True,debug=True) | |
demo.launch(enable_queue=True, server_name="0.0.0.0", server_port=7860) | |