Spaces:
Runtime error
Runtime error
hyper
Browse files
README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
---
|
| 2 |
-
title: InstantStyle + Hyper
|
| 3 |
emoji: 🖼🎨⚡️
|
| 4 |
colorFrom: blue
|
| 5 |
colorTo: purple
|
|
|
|
| 1 |
---
|
| 2 |
+
title: InstantStyle + Hyper SD
|
| 3 |
emoji: 🖼🎨⚡️
|
| 4 |
colorFrom: blue
|
| 5 |
colorTo: purple
|
app.py
CHANGED
|
@@ -5,15 +5,17 @@ import tempfile
|
|
| 5 |
import numpy as np
|
| 6 |
from pathlib import Path
|
| 7 |
from PIL import Image
|
| 8 |
-
from diffusers import
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
import spaces
|
| 10 |
import gradio as gr
|
| 11 |
from huggingface_hub import hf_hub_download, snapshot_download
|
| 12 |
-
from ip_adapter import
|
| 13 |
|
| 14 |
-
snapshot_download(
|
| 15 |
-
repo_id="h94/IP-Adapter", allow_patterns="sdxl_models/*", local_dir="."
|
| 16 |
-
)
|
| 17 |
|
| 18 |
# global variable
|
| 19 |
MAX_SEED = np.iinfo(np.int32).max
|
|
@@ -21,48 +23,44 @@ device = "cuda" if torch.cuda.is_available() else "cpu"
|
|
| 21 |
dtype = torch.float16 if str(device).__contains__("cuda") else torch.float32
|
| 22 |
|
| 23 |
# initialization
|
| 24 |
-
base_model_path = "
|
| 25 |
-
image_encoder_path = "
|
| 26 |
-
ip_ckpt = "
|
| 27 |
|
| 28 |
-
controlnet_path = "
|
| 29 |
controlnet = ControlNetModel.from_pretrained(
|
| 30 |
controlnet_path, use_safetensors=False, torch_dtype=torch.float16
|
| 31 |
).to(device)
|
| 32 |
|
| 33 |
# load Hyper SD
|
| 34 |
|
| 35 |
-
pipe =
|
| 36 |
base_model_path,
|
| 37 |
controlnet=controlnet,
|
| 38 |
torch_dtype=torch.float16,
|
| 39 |
variant="fp16",
|
| 40 |
-
add_watermarker=False,
|
| 41 |
).to(device)
|
| 42 |
pipe.set_progress_bar_config(disable=True)
|
| 43 |
pipe.scheduler = TCDScheduler.from_config(pipe.scheduler.config)
|
| 44 |
pipe.load_lora_weights(
|
| 45 |
-
hf_hub_download("ByteDance/Hyper-SD", "Hyper-
|
| 46 |
)
|
|
|
|
|
|
|
| 47 |
eta = 1.0
|
| 48 |
|
| 49 |
-
|
| 50 |
-
# target_blocks=["block"] for original IP-Adapter
|
| 51 |
-
# target_blocks=["up_blocks.0.attentions.1"] for style blocks only
|
| 52 |
-
# target_blocks = ["up_blocks.0.attentions.1", "down_blocks.2.attentions.1"] # for style+layout blocks
|
| 53 |
-
ip_model = IPAdapterXL(
|
| 54 |
pipe,
|
| 55 |
image_encoder_path,
|
| 56 |
ip_ckpt,
|
| 57 |
device,
|
| 58 |
-
target_blocks=["up_blocks.0.attentions.1"],
|
| 59 |
)
|
| 60 |
|
| 61 |
|
| 62 |
def resize_img(
|
| 63 |
input_image,
|
| 64 |
max_side=1280,
|
| 65 |
-
min_side=
|
| 66 |
size=None,
|
| 67 |
pad_to_max_side=False,
|
| 68 |
mode=Image.BILINEAR,
|
|
@@ -165,42 +163,44 @@ def create_image(
|
|
| 165 |
seed = random.randint(0, MAX_SEED) if seed == -1 else seed
|
| 166 |
if target == "Load original IP-Adapter":
|
| 167 |
# target_blocks=["blocks"] for original IP-Adapter
|
| 168 |
-
ip_model =
|
| 169 |
pipe, image_encoder_path, ip_ckpt, device, target_blocks=["blocks"]
|
| 170 |
)
|
| 171 |
elif target == "Load only style blocks":
|
| 172 |
# target_blocks=["up_blocks.0.attentions.1"] for style blocks only
|
| 173 |
-
ip_model =
|
| 174 |
pipe,
|
| 175 |
image_encoder_path,
|
| 176 |
ip_ckpt,
|
| 177 |
device,
|
| 178 |
-
target_blocks=["up_blocks.
|
| 179 |
)
|
| 180 |
elif target == "Load style+layout block":
|
| 181 |
# target_blocks = ["up_blocks.0.attentions.1", "down_blocks.2.attentions.1"] # for style+layout blocks
|
| 182 |
-
ip_model =
|
| 183 |
pipe,
|
| 184 |
image_encoder_path,
|
| 185 |
ip_ckpt,
|
| 186 |
device,
|
| 187 |
-
target_blocks=["
|
| 188 |
)
|
| 189 |
|
| 190 |
if input_image is not None:
|
| 191 |
-
input_image = resize_img(input_image, max_side=
|
| 192 |
cv_input_image = pil_to_cv2(input_image)
|
| 193 |
detected_map = cv2.Canny(cv_input_image, 50, 200)
|
| 194 |
canny_map = Image.fromarray(cv2.cvtColor(detected_map, cv2.COLOR_BGR2RGB))
|
| 195 |
else:
|
| 196 |
-
canny_map = Image.new("RGB", (
|
| 197 |
control_scale = 0
|
| 198 |
|
| 199 |
if float(control_scale) == 0:
|
| 200 |
-
canny_map = canny_map.resize((
|
| 201 |
|
| 202 |
if len(neg_content_prompt) > 0 and neg_content_scale != 0:
|
| 203 |
images = ip_model.generate(
|
|
|
|
|
|
|
| 204 |
pil_image=image_pil,
|
| 205 |
prompt=prompt,
|
| 206 |
negative_prompt=n_prompt,
|
|
@@ -217,6 +217,8 @@ def create_image(
|
|
| 217 |
)
|
| 218 |
else:
|
| 219 |
images = ip_model.generate(
|
|
|
|
|
|
|
| 220 |
pil_image=image_pil,
|
| 221 |
prompt=prompt,
|
| 222 |
negative_prompt=n_prompt,
|
|
@@ -340,7 +342,7 @@ with block:
|
|
| 340 |
minimum=1,
|
| 341 |
maximum=10.0,
|
| 342 |
step=1.0,
|
| 343 |
-
value=
|
| 344 |
label="num inference steps",
|
| 345 |
)
|
| 346 |
seed = gr.Slider(
|
|
|
|
| 5 |
import numpy as np
|
| 6 |
from pathlib import Path
|
| 7 |
from PIL import Image
|
| 8 |
+
from diffusers import (
|
| 9 |
+
ControlNetModel,
|
| 10 |
+
StableDiffusionControlNetPipeline,
|
| 11 |
+
TCDScheduler,
|
| 12 |
+
)
|
| 13 |
import spaces
|
| 14 |
import gradio as gr
|
| 15 |
from huggingface_hub import hf_hub_download, snapshot_download
|
| 16 |
+
from ip_adapter import IPAdapter
|
| 17 |
|
| 18 |
+
snapshot_download(repo_id="h94/IP-Adapter", allow_patterns="models/*", local_dir=".")
|
|
|
|
|
|
|
| 19 |
|
| 20 |
# global variable
|
| 21 |
MAX_SEED = np.iinfo(np.int32).max
|
|
|
|
| 23 |
dtype = torch.float16 if str(device).__contains__("cuda") else torch.float32
|
| 24 |
|
| 25 |
# initialization
|
| 26 |
+
base_model_path = "runwayml/stable-diffusion-v1-5"
|
| 27 |
+
image_encoder_path = "models/image_encoder"
|
| 28 |
+
ip_ckpt = "models/ip-adapter_sd15.bin"
|
| 29 |
|
| 30 |
+
controlnet_path = "lllyasviel/control_v11p_sd15_canny"
|
| 31 |
controlnet = ControlNetModel.from_pretrained(
|
| 32 |
controlnet_path, use_safetensors=False, torch_dtype=torch.float16
|
| 33 |
).to(device)
|
| 34 |
|
| 35 |
# load Hyper SD
|
| 36 |
|
| 37 |
+
pipe = StableDiffusionControlNetPipeline.from_pretrained(
|
| 38 |
base_model_path,
|
| 39 |
controlnet=controlnet,
|
| 40 |
torch_dtype=torch.float16,
|
| 41 |
variant="fp16",
|
|
|
|
| 42 |
).to(device)
|
| 43 |
pipe.set_progress_bar_config(disable=True)
|
| 44 |
pipe.scheduler = TCDScheduler.from_config(pipe.scheduler.config)
|
| 45 |
pipe.load_lora_weights(
|
| 46 |
+
hf_hub_download("ByteDance/Hyper-SD", "Hyper-SD15-1step-lora.safetensors")
|
| 47 |
)
|
| 48 |
+
pipe.enable_vae_tiling()
|
| 49 |
+
|
| 50 |
eta = 1.0
|
| 51 |
|
| 52 |
+
ip_model = IPAdapter(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
pipe,
|
| 54 |
image_encoder_path,
|
| 55 |
ip_ckpt,
|
| 56 |
device,
|
|
|
|
| 57 |
)
|
| 58 |
|
| 59 |
|
| 60 |
def resize_img(
|
| 61 |
input_image,
|
| 62 |
max_side=1280,
|
| 63 |
+
min_side=512,
|
| 64 |
size=None,
|
| 65 |
pad_to_max_side=False,
|
| 66 |
mode=Image.BILINEAR,
|
|
|
|
| 163 |
seed = random.randint(0, MAX_SEED) if seed == -1 else seed
|
| 164 |
if target == "Load original IP-Adapter":
|
| 165 |
# target_blocks=["blocks"] for original IP-Adapter
|
| 166 |
+
ip_model = IPAdapter(
|
| 167 |
pipe, image_encoder_path, ip_ckpt, device, target_blocks=["blocks"]
|
| 168 |
)
|
| 169 |
elif target == "Load only style blocks":
|
| 170 |
# target_blocks=["up_blocks.0.attentions.1"] for style blocks only
|
| 171 |
+
ip_model = IPAdapter(
|
| 172 |
pipe,
|
| 173 |
image_encoder_path,
|
| 174 |
ip_ckpt,
|
| 175 |
device,
|
| 176 |
+
target_blocks=["up_blocks.1"],
|
| 177 |
)
|
| 178 |
elif target == "Load style+layout block":
|
| 179 |
# target_blocks = ["up_blocks.0.attentions.1", "down_blocks.2.attentions.1"] # for style+layout blocks
|
| 180 |
+
ip_model = IPAdapter(
|
| 181 |
pipe,
|
| 182 |
image_encoder_path,
|
| 183 |
ip_ckpt,
|
| 184 |
device,
|
| 185 |
+
target_blocks=["down_blocks.2", "mid_block", "up_blocks.1"],
|
| 186 |
)
|
| 187 |
|
| 188 |
if input_image is not None:
|
| 189 |
+
input_image = resize_img(input_image, max_side=512)
|
| 190 |
cv_input_image = pil_to_cv2(input_image)
|
| 191 |
detected_map = cv2.Canny(cv_input_image, 50, 200)
|
| 192 |
canny_map = Image.fromarray(cv2.cvtColor(detected_map, cv2.COLOR_BGR2RGB))
|
| 193 |
else:
|
| 194 |
+
canny_map = Image.new("RGB", (512, 512), color=(255, 255, 255))
|
| 195 |
control_scale = 0
|
| 196 |
|
| 197 |
if float(control_scale) == 0:
|
| 198 |
+
canny_map = canny_map.resize((512, 512))
|
| 199 |
|
| 200 |
if len(neg_content_prompt) > 0 and neg_content_scale != 0:
|
| 201 |
images = ip_model.generate(
|
| 202 |
+
width=512,
|
| 203 |
+
height=512,
|
| 204 |
pil_image=image_pil,
|
| 205 |
prompt=prompt,
|
| 206 |
negative_prompt=n_prompt,
|
|
|
|
| 217 |
)
|
| 218 |
else:
|
| 219 |
images = ip_model.generate(
|
| 220 |
+
width=512,
|
| 221 |
+
height=512,
|
| 222 |
pil_image=image_pil,
|
| 223 |
prompt=prompt,
|
| 224 |
negative_prompt=n_prompt,
|
|
|
|
| 342 |
minimum=1,
|
| 343 |
maximum=10.0,
|
| 344 |
step=1.0,
|
| 345 |
+
value=3,
|
| 346 |
label="num inference steps",
|
| 347 |
)
|
| 348 |
seed = gr.Slider(
|