Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
|
@@ -56,10 +56,10 @@ def save_images_with_unique_filenames(image_list, save_directory):
|
|
| 56 |
for image in image_list:
|
| 57 |
unique_filename = f"{uuid.uuid4()}.png"
|
| 58 |
file_path = os.path.join(save_directory, unique_filename)
|
| 59 |
-
|
| 60 |
image.save(file_path)
|
| 61 |
paths.append(file_path)
|
| 62 |
-
|
| 63 |
return paths
|
| 64 |
|
| 65 |
def convert_to_centered_scale(num):
|
|
@@ -68,7 +68,7 @@ def convert_to_centered_scale(num):
|
|
| 68 |
end = num // 2
|
| 69 |
else: # odd
|
| 70 |
start = -(num // 2)
|
| 71 |
-
end = num // 2
|
| 72 |
return tuple(range(start, end + 1))
|
| 73 |
|
| 74 |
def translate_if_korean(text):
|
|
@@ -84,41 +84,41 @@ def generate(prompt,
|
|
| 84 |
randomize_seed=True,
|
| 85 |
seed=42,
|
| 86 |
recalc_directions=True,
|
| 87 |
-
iterations=200,
|
| 88 |
-
steps=3,
|
| 89 |
-
interm_steps=33,
|
| 90 |
guidance_scale=3.5,
|
| 91 |
-
x_concept_1="", x_concept_2="",
|
| 92 |
-
avg_diff_x=None,
|
| 93 |
total_images=[],
|
| 94 |
-
|
| 95 |
):
|
| 96 |
# Translate prompt and concepts if Korean
|
| 97 |
prompt = translate_if_korean(prompt)
|
| 98 |
concept_1 = translate_if_korean(concept_1)
|
| 99 |
concept_2 = translate_if_korean(concept_2)
|
| 100 |
-
|
| 101 |
print(f"Prompt: {prompt}, ← {concept_2}, {concept_1} ➡️ . scale {scale}, interm steps {interm_steps}")
|
| 102 |
slider_x = [concept_2, concept_1]
|
| 103 |
# check if avg diff for directions need to be re-calculated
|
| 104 |
if randomize_seed:
|
| 105 |
seed = random.randint(0, MAX_SEED)
|
| 106 |
-
|
| 107 |
if not sorted(slider_x) == sorted([x_concept_1, x_concept_2]) or recalc_directions:
|
| 108 |
-
|
| 109 |
avg_diff = clip_slider.find_latent_direction(slider_x[0], slider_x[1], num_iterations=iterations)
|
| 110 |
x_concept_1, x_concept_2 = slider_x[0], slider_x[1]
|
| 111 |
|
| 112 |
images = []
|
| 113 |
high_scale = scale
|
| 114 |
low_scale = -1 * scale
|
| 115 |
-
for i in
|
| 116 |
cur_scale = low_scale + (high_scale - low_scale) * i / (interm_steps - 1)
|
| 117 |
-
image = clip_slider.generate(prompt,
|
| 118 |
width=768,
|
| 119 |
height=768,
|
| 120 |
-
guidance_scale=guidance_scale,
|
| 121 |
-
scale=cur_scale, seed=seed, num_inference_steps=steps, avg_diff=avg_diff)
|
| 122 |
images.append(image)
|
| 123 |
canvas = Image.new('RGB', (256*interm_steps, 256))
|
| 124 |
for i, im in enumerate(images):
|
|
@@ -138,25 +138,24 @@ def generate(prompt,
|
|
| 138 |
return x_concept_1,x_concept_2, avg_diff_x, export_to_video(images, video_path, fps=5), canvas, images, images[scale_middle], post_generation_slider_update, seed
|
| 139 |
|
| 140 |
def update_pre_generated_images(slider_value, total_images):
|
| 141 |
-
number_images = len(total_images)
|
| 142 |
if(number_images > 0):
|
| 143 |
scale_tuple = convert_to_centered_scale(number_images)
|
| 144 |
return total_images[scale_tuple.index(slider_value)][0]
|
| 145 |
else:
|
| 146 |
return None
|
| 147 |
-
|
| 148 |
def reset_recalc_directions():
|
| 149 |
return True
|
| 150 |
|
| 151 |
# Updated examples with English text
|
| 152 |
examples = [
|
| 153 |
["flower in mountain", "spring", "winter", 1.5],
|
| 154 |
-
["a tomato", "super fresh", "rotten", 2.5],
|
| 155 |
["여자", "아기", "노인", 2.5]
|
| 156 |
]
|
| 157 |
|
| 158 |
|
| 159 |
-
|
| 160 |
css = """
|
| 161 |
footer {
|
| 162 |
visibility: hidden;
|
|
@@ -201,7 +200,7 @@ footer {
|
|
| 201 |
with gr.Blocks(theme="Yntec/HaleyCH_Theme_Orange", css=css) as demo:
|
| 202 |
x_concept_1 = gr.State("")
|
| 203 |
x_concept_2 = gr.State("")
|
| 204 |
-
total_images = gr.
|
| 205 |
avg_diff_x = gr.State()
|
| 206 |
recalc_directions = gr.State(False)
|
| 207 |
|
|
@@ -230,7 +229,7 @@ with gr.Blocks(theme="Yntec/HaleyCH_Theme_Orange", css=css) as demo:
|
|
| 230 |
info="Final state",
|
| 231 |
placeholder="summer"
|
| 232 |
)
|
| 233 |
-
|
| 234 |
with gr.Row(elem_classes="slider-container"):
|
| 235 |
x = gr.Slider(
|
| 236 |
minimum=0,
|
|
@@ -240,7 +239,7 @@ with gr.Blocks(theme="Yntec/HaleyCH_Theme_Orange", css=css) as demo:
|
|
| 240 |
label=english_labels["Strength"],
|
| 241 |
info="Maximum strength for each direction (above 2.5 may be unstable)"
|
| 242 |
)
|
| 243 |
-
|
| 244 |
submit = gr.Button(english_labels["Generate directions"], size="lg", variant="primary")
|
| 245 |
|
| 246 |
# Advanced Options Panel
|
|
@@ -262,7 +261,7 @@ with gr.Blocks(theme="Yntec/HaleyCH_Theme_Orange", css=css) as demo:
|
|
| 262 |
step=0.1,
|
| 263 |
value=3.5
|
| 264 |
)
|
| 265 |
-
|
| 266 |
with gr.Row():
|
| 267 |
with gr.Column(scale=1):
|
| 268 |
iterations = gr.Slider(
|
|
@@ -280,7 +279,7 @@ with gr.Blocks(theme="Yntec/HaleyCH_Theme_Orange", css=css) as demo:
|
|
| 280 |
maximum=4,
|
| 281 |
step=1
|
| 282 |
)
|
| 283 |
-
|
| 284 |
with gr.Row():
|
| 285 |
with gr.Column(scale=1):
|
| 286 |
randomize_seed = gr.Checkbox(
|
|
|
|
| 56 |
for image in image_list:
|
| 57 |
unique_filename = f"{uuid.uuid4()}.png"
|
| 58 |
file_path = os.path.join(save_directory, unique_filename)
|
| 59 |
+
|
| 60 |
image.save(file_path)
|
| 61 |
paths.append(file_path)
|
| 62 |
+
|
| 63 |
return paths
|
| 64 |
|
| 65 |
def convert_to_centered_scale(num):
|
|
|
|
| 68 |
end = num // 2
|
| 69 |
else: # odd
|
| 70 |
start = -(num // 2)
|
| 71 |
+
end = num // 2
|
| 72 |
return tuple(range(start, end + 1))
|
| 73 |
|
| 74 |
def translate_if_korean(text):
|
|
|
|
| 84 |
randomize_seed=True,
|
| 85 |
seed=42,
|
| 86 |
recalc_directions=True,
|
| 87 |
+
iterations=200,
|
| 88 |
+
steps=3,
|
| 89 |
+
interm_steps=33,
|
| 90 |
guidance_scale=3.5,
|
| 91 |
+
x_concept_1="", x_concept_2="",
|
| 92 |
+
avg_diff_x=None,
|
| 93 |
total_images=[],
|
| 94 |
+
gradio_progress=gr.Progress() # Changed progress to gradio_progress
|
| 95 |
):
|
| 96 |
# Translate prompt and concepts if Korean
|
| 97 |
prompt = translate_if_korean(prompt)
|
| 98 |
concept_1 = translate_if_korean(concept_1)
|
| 99 |
concept_2 = translate_if_korean(concept_2)
|
| 100 |
+
|
| 101 |
print(f"Prompt: {prompt}, ← {concept_2}, {concept_1} ➡️ . scale {scale}, interm steps {interm_steps}")
|
| 102 |
slider_x = [concept_2, concept_1]
|
| 103 |
# check if avg diff for directions need to be re-calculated
|
| 104 |
if randomize_seed:
|
| 105 |
seed = random.randint(0, MAX_SEED)
|
| 106 |
+
|
| 107 |
if not sorted(slider_x) == sorted([x_concept_1, x_concept_2]) or recalc_directions:
|
| 108 |
+
gradio_progress(0, desc="Calculating directions...") # Changed progress to gradio_progress
|
| 109 |
avg_diff = clip_slider.find_latent_direction(slider_x[0], slider_x[1], num_iterations=iterations)
|
| 110 |
x_concept_1, x_concept_2 = slider_x[0], slider_x[1]
|
| 111 |
|
| 112 |
images = []
|
| 113 |
high_scale = scale
|
| 114 |
low_scale = -1 * scale
|
| 115 |
+
for i in gradio_progress.tqdm(range(interm_steps), desc="Generating images"): # Changed progress to gradio_progress
|
| 116 |
cur_scale = low_scale + (high_scale - low_scale) * i / (interm_steps - 1)
|
| 117 |
+
image = clip_slider.generate(prompt,
|
| 118 |
width=768,
|
| 119 |
height=768,
|
| 120 |
+
guidance_scale=guidance_scale,
|
| 121 |
+
scale=cur_scale, seed=seed, num_inference_steps=steps, avg_diff=avg_diff)
|
| 122 |
images.append(image)
|
| 123 |
canvas = Image.new('RGB', (256*interm_steps, 256))
|
| 124 |
for i, im in enumerate(images):
|
|
|
|
| 138 |
return x_concept_1,x_concept_2, avg_diff_x, export_to_video(images, video_path, fps=5), canvas, images, images[scale_middle], post_generation_slider_update, seed
|
| 139 |
|
| 140 |
def update_pre_generated_images(slider_value, total_images):
|
| 141 |
+
number_images = len(total_images) # This line was causing error when total_images was None.
|
| 142 |
if(number_images > 0):
|
| 143 |
scale_tuple = convert_to_centered_scale(number_images)
|
| 144 |
return total_images[scale_tuple.index(slider_value)][0]
|
| 145 |
else:
|
| 146 |
return None
|
| 147 |
+
|
| 148 |
def reset_recalc_directions():
|
| 149 |
return True
|
| 150 |
|
| 151 |
# Updated examples with English text
|
| 152 |
examples = [
|
| 153 |
["flower in mountain", "spring", "winter", 1.5],
|
| 154 |
+
["a tomato", "super fresh", "rotten", 2.5],
|
| 155 |
["여자", "아기", "노인", 2.5]
|
| 156 |
]
|
| 157 |
|
| 158 |
|
|
|
|
| 159 |
css = """
|
| 160 |
footer {
|
| 161 |
visibility: hidden;
|
|
|
|
| 200 |
with gr.Blocks(theme="Yntec/HaleyCH_Theme_Orange", css=css) as demo:
|
| 201 |
x_concept_1 = gr.State("")
|
| 202 |
x_concept_2 = gr.State("")
|
| 203 |
+
total_images = gr.State([]) # Initialize total_images as an empty list state
|
| 204 |
avg_diff_x = gr.State()
|
| 205 |
recalc_directions = gr.State(False)
|
| 206 |
|
|
|
|
| 229 |
info="Final state",
|
| 230 |
placeholder="summer"
|
| 231 |
)
|
| 232 |
+
|
| 233 |
with gr.Row(elem_classes="slider-container"):
|
| 234 |
x = gr.Slider(
|
| 235 |
minimum=0,
|
|
|
|
| 239 |
label=english_labels["Strength"],
|
| 240 |
info="Maximum strength for each direction (above 2.5 may be unstable)"
|
| 241 |
)
|
| 242 |
+
|
| 243 |
submit = gr.Button(english_labels["Generate directions"], size="lg", variant="primary")
|
| 244 |
|
| 245 |
# Advanced Options Panel
|
|
|
|
| 261 |
step=0.1,
|
| 262 |
value=3.5
|
| 263 |
)
|
| 264 |
+
|
| 265 |
with gr.Row():
|
| 266 |
with gr.Column(scale=1):
|
| 267 |
iterations = gr.Slider(
|
|
|
|
| 279 |
maximum=4,
|
| 280 |
step=1
|
| 281 |
)
|
| 282 |
+
|
| 283 |
with gr.Row():
|
| 284 |
with gr.Column(scale=1):
|
| 285 |
randomize_seed = gr.Checkbox(
|