Spaces:
Runtime error
Runtime error
Upload 49 files
Browse files
app.py
CHANGED
|
@@ -5,14 +5,16 @@ import torch
|
|
| 5 |
from PIL import Image
|
| 6 |
import spaces
|
| 7 |
from diffusers import DiffusionPipeline
|
|
|
|
|
|
|
| 8 |
from huggingface_hub import hf_hub_download, HfFileSystem, ModelCard, snapshot_download
|
| 9 |
import copy
|
| 10 |
import random
|
| 11 |
import time
|
| 12 |
|
| 13 |
-
from mod import (models, clear_cache, get_repo_safetensors,
|
| 14 |
description_ui, num_loras, compose_lora_json, is_valid_lora, fuse_loras,
|
| 15 |
-
get_trigger_word, enhance_prompt,
|
| 16 |
get_control_union_mode, set_control_union_mode, get_control_params)
|
| 17 |
from flux import (search_civitai_lora, select_civitai_lora, search_civitai_lora_json,
|
| 18 |
download_my_lora, get_all_lora_tupled_list, apply_lora_prompt,
|
|
@@ -21,6 +23,44 @@ from tagger.tagger import predict_tags_wd, compose_prompt_to_copy
|
|
| 21 |
from tagger.fl2cog import predict_tags_fl2_cog
|
| 22 |
from tagger.fl2flux import predict_tags_fl2_flux
|
| 23 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
|
| 25 |
# Load LoRAs from JSON file
|
| 26 |
with open('loras.json', 'r') as f:
|
|
@@ -65,14 +105,14 @@ def update_selection(evt: gr.SelectData, width, height):
|
|
| 65 |
)
|
| 66 |
|
| 67 |
@spaces.GPU(duration=70)
|
| 68 |
-
def generate_image(prompt_mash, steps, seed, cfg_scale, width, height, lora_scale, cn_on, progress):
|
| 69 |
pipe.to("cuda")
|
| 70 |
generator = torch.Generator(device="cuda").manual_seed(seed)
|
| 71 |
|
| 72 |
with calculateDuration("Generating image"):
|
| 73 |
# Generate image
|
| 74 |
modes, images, scales = get_control_params()
|
| 75 |
-
if not cn_on or
|
| 76 |
progress(0, desc="Start Inference.")
|
| 77 |
image = pipe(
|
| 78 |
prompt=prompt_mash,
|
|
@@ -85,7 +125,6 @@ def generate_image(prompt_mash, steps, seed, cfg_scale, width, height, lora_scal
|
|
| 85 |
).images[0]
|
| 86 |
else:
|
| 87 |
progress(0, desc="Start Inference with ControlNet.")
|
| 88 |
-
print(modes, scales) #
|
| 89 |
image = pipe(
|
| 90 |
prompt=prompt_mash,
|
| 91 |
control_image=images,
|
|
@@ -337,7 +376,7 @@ with gr.Blocks(theme='Nymbo/Nymbo_Theme', fill_width=True, css=css) as app:
|
|
| 337 |
for i in range(num_loras):
|
| 338 |
lora_download[i] = gr.Button(f"Get and set LoRA to {int(i+1)}")
|
| 339 |
|
| 340 |
-
with gr.Accordion("ControlNet", open=
|
| 341 |
with gr.Column():
|
| 342 |
cn_on = gr.Checkbox(False, label="Use ControlNet")
|
| 343 |
cn_mode = [None] * num_cns
|
|
|
|
| 5 |
from PIL import Image
|
| 6 |
import spaces
|
| 7 |
from diffusers import DiffusionPipeline
|
| 8 |
+
from diffusers.pipelines.flux.pipeline_flux_controlnet import FluxControlNetPipeline
|
| 9 |
+
from diffusers.models.controlnet_flux import FluxControlNetModel, FluxMultiControlNetModel
|
| 10 |
from huggingface_hub import hf_hub_download, HfFileSystem, ModelCard, snapshot_download
|
| 11 |
import copy
|
| 12 |
import random
|
| 13 |
import time
|
| 14 |
|
| 15 |
+
from mod import (models, clear_cache, get_repo_safetensors, is_repo_name, is_repo_exists,
|
| 16 |
description_ui, num_loras, compose_lora_json, is_valid_lora, fuse_loras,
|
| 17 |
+
get_trigger_word, enhance_prompt, num_cns, set_control_union_image,
|
| 18 |
get_control_union_mode, set_control_union_mode, get_control_params)
|
| 19 |
from flux import (search_civitai_lora, select_civitai_lora, search_civitai_lora_json,
|
| 20 |
download_my_lora, get_all_lora_tupled_list, apply_lora_prompt,
|
|
|
|
| 23 |
from tagger.fl2cog import predict_tags_fl2_cog
|
| 24 |
from tagger.fl2flux import predict_tags_fl2_flux
|
| 25 |
|
| 26 |
+
# Initialize the base model
|
| 27 |
+
base_model = models[0]
|
| 28 |
+
controlnet_model_union_repo = 'InstantX/FLUX.1-dev-Controlnet-Union'
|
| 29 |
+
pipe = DiffusionPipeline.from_pretrained(base_model, torch_dtype=torch.bfloat16)
|
| 30 |
+
last_model = models[0]
|
| 31 |
+
last_cn_on = False
|
| 32 |
+
|
| 33 |
+
# https://huggingface.co/InstantX/FLUX.1-dev-Controlnet-Union
|
| 34 |
+
# https://huggingface.co/spaces/jiuface/FLUX.1-dev-Controlnet-Union
|
| 35 |
+
def change_base_model(repo_id: str, cn_on: bool, progress=gr.Progress(track_tqdm=True)):
|
| 36 |
+
global pipe
|
| 37 |
+
global last_model
|
| 38 |
+
global last_cn_on
|
| 39 |
+
try:
|
| 40 |
+
if (repo_id == last_model and cn_on is last_cn_on) or not is_repo_name(repo_id) or not is_repo_exists(repo_id): return
|
| 41 |
+
if cn_on:
|
| 42 |
+
progress(0, desc=f"Loading model: {repo_id} / Loading ControlNet: {controlnet_model_union_repo}")
|
| 43 |
+
print(f"Loading model: {repo_id} / Loading ControlNet: {controlnet_model_union_repo}")
|
| 44 |
+
clear_cache()
|
| 45 |
+
controlnet_union = FluxControlNetModel.from_pretrained(controlnet_model_union_repo, torch_dtype=torch.bfloat16)
|
| 46 |
+
controlnet = FluxMultiControlNetModel([controlnet_union])
|
| 47 |
+
pipe = FluxControlNetPipeline.from_pretrained(repo_id, controlnet=controlnet, torch_dtype=torch.bfloat16)
|
| 48 |
+
last_model = repo_id
|
| 49 |
+
progress(1, desc=f"Model loaded: {repo_id} / ControlNet Loaded: {controlnet_model_union_repo}")
|
| 50 |
+
print(f"Model loaded: {repo_id} / ControlNet Loaded: {controlnet_model_union_repo}")
|
| 51 |
+
else:
|
| 52 |
+
progress(0, desc=f"Loading model: {repo_id}")
|
| 53 |
+
print(f"Loading model: {repo_id}")
|
| 54 |
+
clear_cache()
|
| 55 |
+
pipe = DiffusionPipeline.from_pretrained(repo_id, torch_dtype=torch.bfloat16)
|
| 56 |
+
last_model = repo_id
|
| 57 |
+
progress(1, desc=f"Model loaded: {repo_id}")
|
| 58 |
+
print(f"Model loaded: {repo_id}")
|
| 59 |
+
except Exception as e:
|
| 60 |
+
print(e)
|
| 61 |
+
return gr.update(visible=True)
|
| 62 |
+
|
| 63 |
+
change_base_model.zerogpu = True
|
| 64 |
|
| 65 |
# Load LoRAs from JSON file
|
| 66 |
with open('loras.json', 'r') as f:
|
|
|
|
| 105 |
)
|
| 106 |
|
| 107 |
@spaces.GPU(duration=70)
|
| 108 |
+
def generate_image(prompt_mash, steps, seed, cfg_scale, width, height, lora_scale, cn_on, progress=gr.Progress(track_tqdm=True)):
|
| 109 |
pipe.to("cuda")
|
| 110 |
generator = torch.Generator(device="cuda").manual_seed(seed)
|
| 111 |
|
| 112 |
with calculateDuration("Generating image"):
|
| 113 |
# Generate image
|
| 114 |
modes, images, scales = get_control_params()
|
| 115 |
+
if not cn_on or len(modes) == 0:
|
| 116 |
progress(0, desc="Start Inference.")
|
| 117 |
image = pipe(
|
| 118 |
prompt=prompt_mash,
|
|
|
|
| 125 |
).images[0]
|
| 126 |
else:
|
| 127 |
progress(0, desc="Start Inference with ControlNet.")
|
|
|
|
| 128 |
image = pipe(
|
| 129 |
prompt=prompt_mash,
|
| 130 |
control_image=images,
|
|
|
|
| 376 |
for i in range(num_loras):
|
| 377 |
lora_download[i] = gr.Button(f"Get and set LoRA to {int(i+1)}")
|
| 378 |
|
| 379 |
+
with gr.Accordion("ControlNet", open=False):
|
| 380 |
with gr.Column():
|
| 381 |
cn_on = gr.Checkbox(False, label="Use ControlNet")
|
| 382 |
cn_mode = [None] * num_cns
|
mod.py
CHANGED
|
@@ -1,9 +1,7 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
import torch
|
| 3 |
import spaces
|
| 4 |
-
|
| 5 |
-
from diffusers.pipelines.flux.pipeline_flux_controlnet import FluxControlNetPipeline
|
| 6 |
-
from diffusers.models.controlnet_flux import FluxControlNetModel, FluxMultiControlNetModel
|
| 7 |
from pathlib import Path
|
| 8 |
import gc
|
| 9 |
import subprocess
|
|
@@ -35,16 +33,9 @@ models = [
|
|
| 35 |
|
| 36 |
num_loras = 3
|
| 37 |
num_cns = 2
|
| 38 |
-
# Initialize the base model
|
| 39 |
-
base_model = models[0]
|
| 40 |
-
controlnet_model_union_repo = 'InstantX/FLUX.1-dev-Controlnet-Union'
|
| 41 |
-
pipe = DiffusionPipeline.from_pretrained(base_model, torch_dtype=torch.bfloat16)
|
| 42 |
-
controlnet = None
|
| 43 |
control_images = [None] * num_cns
|
| 44 |
control_modes = [-1] * num_cns
|
| 45 |
control_scales = [0] * num_cns
|
| 46 |
-
last_model = models[0]
|
| 47 |
-
last_cn_on = False
|
| 48 |
|
| 49 |
|
| 50 |
def is_repo_name(s):
|
|
@@ -84,39 +75,6 @@ def get_repo_safetensors(repo_id: str):
|
|
| 84 |
else: return gr.update(value=files[0], choices=files)
|
| 85 |
|
| 86 |
|
| 87 |
-
# https://huggingface.co/spaces/DamarJati/FLUX.1-DEV-Canny
|
| 88 |
-
# https://huggingface.co/InstantX/FLUX.1-dev-Controlnet-Union
|
| 89 |
-
# https://huggingface.co/spaces/jiuface/FLUX.1-dev-Controlnet-Union
|
| 90 |
-
def change_base_model(repo_id: str, cn_on: bool, progress=gr.Progress(track_tqdm=True)):
|
| 91 |
-
global pipe
|
| 92 |
-
global controlnet
|
| 93 |
-
global last_model
|
| 94 |
-
global last_cn_on
|
| 95 |
-
try:
|
| 96 |
-
if (repo_id == last_model and cn_on is last_cn_on) or not is_repo_name(repo_id) or not is_repo_exists(repo_id): return
|
| 97 |
-
if cn_on:
|
| 98 |
-
progress(0, desc=f"Loading model: {repo_id} / Loading ControlNet: {controlnet_model_union_repo}")
|
| 99 |
-
print(f"Loading model: {repo_id} / Loading ControlNet: {controlnet_model_union_repo}")
|
| 100 |
-
clear_cache()
|
| 101 |
-
controlnet_union = FluxControlNetModel.from_pretrained(controlnet_model_union_repo, torch_dtype=torch.bfloat16)
|
| 102 |
-
controlnet = FluxMultiControlNetModel([controlnet_union])
|
| 103 |
-
pipe = FluxControlNetPipeline.from_pretrained(repo_id, controlnet=controlnet, torch_dtype=torch.bfloat16)
|
| 104 |
-
last_model = repo_id
|
| 105 |
-
progress(1, desc=f"Model loaded: {repo_id} / ControlNet Loaded: {controlnet_model_union_repo}")
|
| 106 |
-
print(f"Model loaded: {repo_id} / ControlNet Loaded: {controlnet_model_union_repo}")
|
| 107 |
-
else:
|
| 108 |
-
progress(0, desc=f"Loading model: {repo_id}")
|
| 109 |
-
print(f"Loading model: {repo_id}")
|
| 110 |
-
clear_cache()
|
| 111 |
-
pipe = DiffusionPipeline.from_pretrained(repo_id, torch_dtype=torch.bfloat16)
|
| 112 |
-
last_model = repo_id
|
| 113 |
-
progress(1, desc=f"Model loaded: {repo_id}")
|
| 114 |
-
print(f"Model loaded: {repo_id}")
|
| 115 |
-
except Exception as e:
|
| 116 |
-
print(e)
|
| 117 |
-
return gr.update(visible=True)
|
| 118 |
-
|
| 119 |
-
|
| 120 |
def expand2square(pil_img: Image.Image, background_color: tuple=(0, 0, 0)):
|
| 121 |
width, height = pil_img.size
|
| 122 |
if width == height:
|
|
@@ -183,7 +141,8 @@ def get_control_params():
|
|
| 183 |
|
| 184 |
|
| 185 |
from preprocessor import Preprocessor
|
| 186 |
-
def preprocess_image(image: Image.Image, control_mode: str, height: int, width: int,
|
|
|
|
| 187 |
if control_mode == "None": return image
|
| 188 |
image_resolution = max(width, height)
|
| 189 |
image_before = resize_image(expand2square(image), image_resolution, image_resolution, False)
|
|
@@ -239,7 +198,6 @@ def preprocess_image(image: Image.Image, control_mode: str, height: int, width:
|
|
| 239 |
|
| 240 |
image_after = resize_image(control_image, width, height, False)
|
| 241 |
print(f"generate control image success: {image_width}x{image_height} => {width}x{height}")
|
| 242 |
-
|
| 243 |
return image_after
|
| 244 |
|
| 245 |
|
|
@@ -347,5 +305,4 @@ def enhance_prompt(input_prompt):
|
|
| 347 |
|
| 348 |
|
| 349 |
load_prompt_enhancer.zerogpu = True
|
| 350 |
-
change_base_model.zerogpu = True
|
| 351 |
fuse_loras.zerogpu = True
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
import torch
|
| 3 |
import spaces
|
| 4 |
+
|
|
|
|
|
|
|
| 5 |
from pathlib import Path
|
| 6 |
import gc
|
| 7 |
import subprocess
|
|
|
|
| 33 |
|
| 34 |
num_loras = 3
|
| 35 |
num_cns = 2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
control_images = [None] * num_cns
|
| 37 |
control_modes = [-1] * num_cns
|
| 38 |
control_scales = [0] * num_cns
|
|
|
|
|
|
|
| 39 |
|
| 40 |
|
| 41 |
def is_repo_name(s):
|
|
|
|
| 75 |
else: return gr.update(value=files[0], choices=files)
|
| 76 |
|
| 77 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 78 |
def expand2square(pil_img: Image.Image, background_color: tuple=(0, 0, 0)):
|
| 79 |
width, height = pil_img.size
|
| 80 |
if width == height:
|
|
|
|
| 141 |
|
| 142 |
|
| 143 |
from preprocessor import Preprocessor
|
| 144 |
+
def preprocess_image(image: Image.Image, control_mode: str, height: int, width: int,
|
| 145 |
+
preprocess_resolution: int, progress=gr.Progress(track_tqdm=True)):
|
| 146 |
if control_mode == "None": return image
|
| 147 |
image_resolution = max(width, height)
|
| 148 |
image_before = resize_image(expand2square(image), image_resolution, image_resolution, False)
|
|
|
|
| 198 |
|
| 199 |
image_after = resize_image(control_image, width, height, False)
|
| 200 |
print(f"generate control image success: {image_width}x{image_height} => {width}x{height}")
|
|
|
|
| 201 |
return image_after
|
| 202 |
|
| 203 |
|
|
|
|
| 305 |
|
| 306 |
|
| 307 |
load_prompt_enhancer.zerogpu = True
|
|
|
|
| 308 |
fuse_loras.zerogpu = True
|