Spaces:
Running
Running
updated
Browse files
app.py
CHANGED
|
@@ -6,8 +6,10 @@ from PIL import Image
|
|
| 6 |
from huggingface_hub import hf_hub_download
|
| 7 |
from utils import utils, tools, preprocess
|
| 8 |
|
|
|
|
|
|
|
| 9 |
VAE_PATH = "madebyollin/sdxl-vae-fp16-fix"
|
| 10 |
-
|
| 11 |
UNET_FILENAME = "ControlAny-SDXL/anime_canny/unet.safetensors"
|
| 12 |
CONTROLNET_FILENAME = "ControlAny-SDXL/anime_canny/controlnet.safetensors"
|
| 13 |
CACHE_DIR = None
|
|
@@ -19,17 +21,17 @@ DEFAULT_NEGATIVE_PROMPT = "worst quality, abstract, clumsy pose, deformed hand,
|
|
| 19 |
def ui():
|
| 20 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
| 21 |
model_file = hf_hub_download(
|
| 22 |
-
repo_id=
|
| 23 |
-
filename=
|
| 24 |
cache_dir=CACHE_DIR,
|
| 25 |
)
|
| 26 |
unet_file = hf_hub_download(
|
| 27 |
-
repo_id=
|
| 28 |
filename=UNET_FILENAME,
|
| 29 |
cache_dir=CACHE_DIR,
|
| 30 |
)
|
| 31 |
controlnet_file = hf_hub_download(
|
| 32 |
-
repo_id=
|
| 33 |
filename=CONTROLNET_FILENAME,
|
| 34 |
cache_dir=CACHE_DIR,
|
| 35 |
)
|
|
@@ -45,7 +47,6 @@ def ui():
|
|
| 45 |
use_safetensors=True,
|
| 46 |
)
|
| 47 |
|
| 48 |
-
preprocessors = ['canny']
|
| 49 |
schedulers = ['Euler A', 'UniPC', 'Euler', 'DDIM', 'DDPM']
|
| 50 |
|
| 51 |
css = """
|
|
@@ -57,7 +58,7 @@ def ui():
|
|
| 57 |
|
| 58 |
with gr.Blocks(css=css) as demo:
|
| 59 |
gr.Markdown(f"""
|
| 60 |
-
# [ControlNeXt-SDXL](https://github.com/dvlab-research/ControlNeXt) Demo
|
| 61 |
Base model: [Neta-Art-XL-2.0](https://civitai.com/models/410737/neta-art-xl)
|
| 62 |
""")
|
| 63 |
with gr.Row():
|
|
@@ -80,13 +81,11 @@ def ui():
|
|
| 80 |
show_download_button=True,
|
| 81 |
show_share_button=True,
|
| 82 |
)
|
| 83 |
-
with gr.
|
| 84 |
-
|
| 85 |
-
label='
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
)
|
| 89 |
-
process_button = gr.Button("Process", variant='primary', min_width=96, scale=0)
|
| 90 |
with gr.Row():
|
| 91 |
scheduler = gr.Dropdown(
|
| 92 |
label='Scheduler',
|
|
@@ -142,7 +141,6 @@ def ui():
|
|
| 142 |
seed,
|
| 143 |
):
|
| 144 |
pipeline.scheduler = tools.get_scheduler(scheduler, pipeline.scheduler.config)
|
| 145 |
-
|
| 146 |
generator = torch.Generator(device=device).manual_seed(max(0, min(seed, np.iinfo(np.int32).max))) if seed != -1 else None
|
| 147 |
|
| 148 |
if control_image is None:
|
|
@@ -167,13 +165,12 @@ def ui():
|
|
| 167 |
|
| 168 |
def process(
|
| 169 |
image,
|
| 170 |
-
|
|
|
|
| 171 |
):
|
| 172 |
-
if
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
image = processor(image)
|
| 176 |
-
return image
|
| 177 |
|
| 178 |
generate_button.click(
|
| 179 |
fn=generate,
|
|
@@ -183,7 +180,7 @@ def ui():
|
|
| 183 |
|
| 184 |
process_button.click(
|
| 185 |
fn=process,
|
| 186 |
-
inputs=[control_image,
|
| 187 |
outputs=[control_image],
|
| 188 |
)
|
| 189 |
|
|
|
|
| 6 |
from huggingface_hub import hf_hub_download
|
| 7 |
from utils import utils, tools, preprocess
|
| 8 |
|
| 9 |
+
BASE_MODEL_REPO_ID = "neta-art/neta-xl-2.0"
|
| 10 |
+
BASE_MODEL_FILENAME = "neta-xl-v2.fp16.safetensors"
|
| 11 |
VAE_PATH = "madebyollin/sdxl-vae-fp16-fix"
|
| 12 |
+
CONTROLNEXT_REPO_ID = "Pbihao/ControlNeXt"
|
| 13 |
UNET_FILENAME = "ControlAny-SDXL/anime_canny/unet.safetensors"
|
| 14 |
CONTROLNET_FILENAME = "ControlAny-SDXL/anime_canny/controlnet.safetensors"
|
| 15 |
CACHE_DIR = None
|
|
|
|
| 21 |
def ui():
|
| 22 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
| 23 |
model_file = hf_hub_download(
|
| 24 |
+
repo_id=BASE_MODEL_REPO_ID,
|
| 25 |
+
filename=BASE_MODEL_FILENAME,
|
| 26 |
cache_dir=CACHE_DIR,
|
| 27 |
)
|
| 28 |
unet_file = hf_hub_download(
|
| 29 |
+
repo_id=CONTROLNEXT_REPO_ID,
|
| 30 |
filename=UNET_FILENAME,
|
| 31 |
cache_dir=CACHE_DIR,
|
| 32 |
)
|
| 33 |
controlnet_file = hf_hub_download(
|
| 34 |
+
repo_id=CONTROLNEXT_REPO_ID,
|
| 35 |
filename=CONTROLNET_FILENAME,
|
| 36 |
cache_dir=CACHE_DIR,
|
| 37 |
)
|
|
|
|
| 47 |
use_safetensors=True,
|
| 48 |
)
|
| 49 |
|
|
|
|
| 50 |
schedulers = ['Euler A', 'UniPC', 'Euler', 'DDIM', 'DDPM']
|
| 51 |
|
| 52 |
css = """
|
|
|
|
| 58 |
|
| 59 |
with gr.Blocks(css=css) as demo:
|
| 60 |
gr.Markdown(f"""
|
| 61 |
+
# [ControlNeXt-SDXL](https://github.com/dvlab-research/ControlNeXt) Demo (Anime Canny)
|
| 62 |
Base model: [Neta-Art-XL-2.0](https://civitai.com/models/410737/neta-art-xl)
|
| 63 |
""")
|
| 64 |
with gr.Row():
|
|
|
|
| 81 |
show_download_button=True,
|
| 82 |
show_share_button=True,
|
| 83 |
)
|
| 84 |
+
with gr.Accordion(label='Preprocess', open=True):
|
| 85 |
+
with gr.Row():
|
| 86 |
+
threshold1 = gr.Slider(minimum=-1, maximum=255, step=1, value=100, label='Threshold 1', info='-1 for auto')
|
| 87 |
+
threshold2 = gr.Slider(minimum=-1, maximum=255, step=1, value=200, label='Threshold 2', info='-1 for auto')
|
| 88 |
+
process_button = gr.Button("Process", variant='primary', min_width=96, scale=0)
|
|
|
|
|
|
|
| 89 |
with gr.Row():
|
| 90 |
scheduler = gr.Dropdown(
|
| 91 |
label='Scheduler',
|
|
|
|
| 141 |
seed,
|
| 142 |
):
|
| 143 |
pipeline.scheduler = tools.get_scheduler(scheduler, pipeline.scheduler.config)
|
|
|
|
| 144 |
generator = torch.Generator(device=device).manual_seed(max(0, min(seed, np.iinfo(np.int32).max))) if seed != -1 else None
|
| 145 |
|
| 146 |
if control_image is None:
|
|
|
|
| 165 |
|
| 166 |
def process(
|
| 167 |
image,
|
| 168 |
+
threshold1,
|
| 169 |
+
threshold2,
|
| 170 |
):
|
| 171 |
+
threshold1 = None if threshold1 == -1 else threshold1
|
| 172 |
+
threshold2 = None if threshold2 == -1 else threshold2
|
| 173 |
+
return preprocess.canny_extractor(image, threshold1, threshold2)
|
|
|
|
|
|
|
| 174 |
|
| 175 |
generate_button.click(
|
| 176 |
fn=generate,
|
|
|
|
| 180 |
|
| 181 |
process_button.click(
|
| 182 |
fn=process,
|
| 183 |
+
inputs=[control_image, threshold1, threshold2],
|
| 184 |
outputs=[control_image],
|
| 185 |
)
|
| 186 |
|