Spaces:
Paused
Paused
P01yH3dr0n
commited on
Commit
•
b3cf1cf
1
Parent(s):
cea8836
adaptive scheduler and new option
Browse files- app.py +31 -19
- pnginfo.py +6 -5
- utils.py +2 -0
app.py
CHANGED
@@ -24,8 +24,18 @@ def get_count():
|
|
24 |
today_count = 0
|
25 |
return today_count
|
26 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
def control_ui():
|
28 |
-
prompt = gr.TextArea(value="{breast expansion},{gigantic breasts},[artist:ningen_mame],artist:ciloranko,[artist:sho_(sho_lwlw)],[artist:foifoi (marfoyfoyfoy)],1girl,skinny,narrow waist,loli,", elem_id='txt2img_prompt', label="提示词", lines=3)
|
29 |
quality_tags = gr.TextArea(
|
30 |
elem_id='txt2img_qua_prompt', label="质量词", lines=1,
|
31 |
value=client_config['default_quality'],
|
@@ -40,14 +50,14 @@ def control_ui():
|
|
40 |
with gr.Row():
|
41 |
sampler = gr.Dropdown(
|
42 |
choices=[
|
43 |
-
"k_euler", "k_euler_ancestral", "k_dpmpp_2s_ancestral",
|
44 |
"k_dpmpp_2m", "k_dpmpp_sde", "ddim_v3"
|
45 |
],
|
46 |
value="k_euler",
|
47 |
label="采样器",
|
48 |
interactive=True
|
49 |
)
|
50 |
-
scale = gr.Slider(label="CFG Scale", value=5.0, minimum=
|
51 |
steps = gr.Slider(label="步数", value=28, minimum=1, maximum=50, step=1)
|
52 |
with gr.Row():
|
53 |
seed = gr.Number(label="种子", value=-1, step=1, maximum=2**32-1, minimum=-1, scale=3)
|
@@ -100,32 +110,34 @@ def control_ui():
|
|
100 |
choices=[
|
101 |
"native", "karras", "exponential", "polyexponential"
|
102 |
],
|
103 |
-
value="
|
104 |
label="Scheduler",
|
105 |
interactive=True
|
106 |
)
|
107 |
with gr.Row():
|
108 |
smea = gr.Checkbox(False, label="SMEA")
|
109 |
dyn = gr.Checkbox(False, label="SMEA DYN")
|
|
|
110 |
with gr.Row():
|
111 |
-
dyn_threshold = gr.Checkbox(False, label="
|
112 |
cfg_rescale = gr.Slider(0, 1, 0, step=0.01, label="CFG rescale")
|
113 |
with gr.Column():
|
114 |
save = gr.Checkbox(value=True, label='云端保存图片')
|
115 |
gen_btn = gr.Button(value="生成", variant="primary")
|
116 |
stop_btn = gr.Button(value="取消", variant="stop", visible=False)
|
|
|
117 |
rand_seed.click(fn=lambda: -1, inputs=None, outputs=seed)
|
118 |
i2i.select(lambda: 'i2i', inputs=None, outputs=selection)
|
119 |
inp.select(lambda: 'inp', inputs=None, outputs=selection)
|
120 |
-
return gen_btn, stop_btn, [prompt, quality_tags, neg_prompt, seed, scale, width, height, steps, sampler, scheduler, smea, dyn, dyn_threshold, cfg_rescale, ref_images, info_extracts, ref_strs, i2i_image, i2i_str, i2i_noise, overlay, inp_img, selection], [save, rand_seed, reuse_seed, reuse_img_i2i, reuse_img_inp, vibe_tab, i2i_tab]
|
121 |
|
122 |
-
def generate(prompt, quality_tags, neg_prompt, seed, scale, width, height, steps, sampler, scheduler, smea, dyn, dyn_threshold, cfg_rescale, ref_images, info_extracts, ref_strs, i2i_image, i2i_str, i2i_noise, overlay, inp_img, selection):
|
123 |
global today_count
|
124 |
set_token(os.environ.get('token'))
|
125 |
img_data, payload = generate_novelai_image(
|
126 |
f"{prompt}, {quality_tags}", neg_prompt, seed, scale,
|
127 |
width, height, steps, sampler, scheduler,
|
128 |
-
smea, dyn, dyn_threshold, cfg_rescale, ref_images, info_extracts, ref_strs,
|
129 |
i2i_image, i2i_str, i2i_noise, overlay, inp_img, selection
|
130 |
)
|
131 |
if not isinstance(img_data, bytes):
|
@@ -176,7 +188,7 @@ def main_ui():
|
|
176 |
gen_btn, stop_btn, paras, others = control_ui()
|
177 |
with gr.Column():
|
178 |
image, info, send_dtool = preview_ui()
|
179 |
-
cost_list = paras[5:8] + paras[10:12] + paras[
|
180 |
for component in cost_list:
|
181 |
component.change(update_btn_cost, inputs=cost_list, outputs=gen_btn)
|
182 |
gen = gen_btn.click(lambda: (gr.Button(visible=False), gr.Button(visible=True)), inputs=None, outputs=[gen_btn, stop_btn]).then(
|
@@ -184,8 +196,8 @@ def main_ui():
|
|
184 |
rename_save_img, inputs=[image, info, others[0]], outputs=image, trigger_mode="once").then(
|
185 |
lambda: (gr.Button(visible=True), gr.Button(visible=False)), inputs=None, outputs=[gen_btn, stop_btn])
|
186 |
others[2].click(lambda o, s: o if len(s) == 0 else s['parameters']['seed'], inputs=[paras[3], info], outputs=paras[3])
|
187 |
-
others[3].click(lambda i: i, inputs=image, outputs=paras[
|
188 |
-
others[4].click(lambda i: gr.ImageEditor(value=i), inputs=image, outputs=paras[
|
189 |
stop_btn.click(lambda: (gr.Button(visible=True), gr.Button(visible=False)), inputs=None, outputs=[gen_btn, stop_btn], cancels=[gen])
|
190 |
return image, paras, others, send_dtool
|
191 |
|
@@ -255,16 +267,16 @@ def ui():
|
|
255 |
loadTagComplete.click(fn=None, js="() => {document.getElementById('client_ui_main-button').click();run();}")
|
256 |
clearTagCache = gr.Button(value="清除tag补全缓存")
|
257 |
clearTagCache.click(fn=None, js="() => {localStorage.clear();}")
|
258 |
-
send_and_jump(png2main, send_paras, [png_items] + paras[:
|
259 |
-
send_and_jump(gal2main, send_paras, [gal_items] + paras[:
|
260 |
from_t2i.click(lambda x: x, inputs=image, outputs=in_image)
|
261 |
-
send_jump_select(send_i2i, send_outputs, [out_image, d_index], paras[
|
262 |
-
send_jump_select(send_inp, send_outputs, [out_image, d_index], paras[
|
263 |
-
send_jump_select(send_vib, (lambda l, i: l if i == -1 else [l[i]]), [out_image, d_index], paras[
|
264 |
send_and_jump(send_dtool, (lambda x: x), image, in_image, "client_ui_dtool", image)
|
265 |
-
send_jump_select(history2i2i, send_outputs, [gallery, h_index], paras[
|
266 |
-
send_jump_select(history2inp, send_outputs, [gallery, h_index], paras[
|
267 |
-
send_jump_select(history2ref, (lambda l, i: None if i == -1 else [l[i]]), [gallery, h_index], paras[
|
268 |
send_and_jump(history2dtl, send_outputs, [gallery, h_index], in_image, "client_ui_dtool", gal_items)
|
269 |
read_image.change(read_info_from_image, inputs=read_image, outputs=[info, png_items])
|
270 |
return website
|
|
|
24 |
today_count = 0
|
25 |
return today_count
|
26 |
|
27 |
+
def change_schedule(sampler):
|
28 |
+
if sampler == "ddim_v3":
|
29 |
+
return gr.Dropdown(value="native", interactive=False)
|
30 |
+
elif sampler == "k_euler_ancestral":
|
31 |
+
return gr.Dropdown(value="native", interactive=True)
|
32 |
+
elif sampler == "k_dpmpp_2m":
|
33 |
+
return gr.Dropdown(value="exponential", interactive=True)
|
34 |
+
else:
|
35 |
+
return gr.Dropdown(value="karras", interactive=True)
|
36 |
+
|
37 |
def control_ui():
|
38 |
+
prompt = gr.TextArea(value="{breast expansion},{gigantic breasts},[artist:ningen_mame],artist:ciloranko,[artist:sho_(sho_lwlw)],[artist:foifoi (marfoyfoyfoy)],1girl,skinny,narrow waist,loli,child,solo,", elem_id='txt2img_prompt', label="提示词", lines=3)
|
39 |
quality_tags = gr.TextArea(
|
40 |
elem_id='txt2img_qua_prompt', label="质量词", lines=1,
|
41 |
value=client_config['default_quality'],
|
|
|
50 |
with gr.Row():
|
51 |
sampler = gr.Dropdown(
|
52 |
choices=[
|
53 |
+
"k_euler", "k_euler_ancestral", "k_dpmpp_2s_ancestral", "k_dpmpp_2m_sde",
|
54 |
"k_dpmpp_2m", "k_dpmpp_sde", "ddim_v3"
|
55 |
],
|
56 |
value="k_euler",
|
57 |
label="采样器",
|
58 |
interactive=True
|
59 |
)
|
60 |
+
scale = gr.Slider(label="CFG Scale", value=5.0, minimum=0, maximum=10, step=0.1)
|
61 |
steps = gr.Slider(label="步数", value=28, minimum=1, maximum=50, step=1)
|
62 |
with gr.Row():
|
63 |
seed = gr.Number(label="种子", value=-1, step=1, maximum=2**32-1, minimum=-1, scale=3)
|
|
|
110 |
choices=[
|
111 |
"native", "karras", "exponential", "polyexponential"
|
112 |
],
|
113 |
+
value="karras",
|
114 |
label="Scheduler",
|
115 |
interactive=True
|
116 |
)
|
117 |
with gr.Row():
|
118 |
smea = gr.Checkbox(False, label="SMEA")
|
119 |
dyn = gr.Checkbox(False, label="SMEA DYN")
|
120 |
+
variety = gr.Checkbox(False, label="Variety+")
|
121 |
with gr.Row():
|
122 |
+
dyn_threshold = gr.Checkbox(False, label="Decrisp")
|
123 |
cfg_rescale = gr.Slider(0, 1, 0, step=0.01, label="CFG rescale")
|
124 |
with gr.Column():
|
125 |
save = gr.Checkbox(value=True, label='云端保存图片')
|
126 |
gen_btn = gr.Button(value="生成", variant="primary")
|
127 |
stop_btn = gr.Button(value="取消", variant="stop", visible=False)
|
128 |
+
sampler.change(change_schedule, sampler, scheduler)
|
129 |
rand_seed.click(fn=lambda: -1, inputs=None, outputs=seed)
|
130 |
i2i.select(lambda: 'i2i', inputs=None, outputs=selection)
|
131 |
inp.select(lambda: 'inp', inputs=None, outputs=selection)
|
132 |
+
return gen_btn, stop_btn, [prompt, quality_tags, neg_prompt, seed, scale, width, height, steps, sampler, scheduler, smea, dyn, dyn_threshold, cfg_rescale, variety, ref_images, info_extracts, ref_strs, i2i_image, i2i_str, i2i_noise, overlay, inp_img, selection], [save, rand_seed, reuse_seed, reuse_img_i2i, reuse_img_inp, vibe_tab, i2i_tab]
|
133 |
|
134 |
+
def generate(prompt, quality_tags, neg_prompt, seed, scale, width, height, steps, sampler, scheduler, smea, dyn, dyn_threshold, cfg_rescale, variety, ref_images, info_extracts, ref_strs, i2i_image, i2i_str, i2i_noise, overlay, inp_img, selection):
|
135 |
global today_count
|
136 |
set_token(os.environ.get('token'))
|
137 |
img_data, payload = generate_novelai_image(
|
138 |
f"{prompt}, {quality_tags}", neg_prompt, seed, scale,
|
139 |
width, height, steps, sampler, scheduler,
|
140 |
+
smea, dyn, dyn_threshold, cfg_rescale, variety, ref_images, info_extracts, ref_strs,
|
141 |
i2i_image, i2i_str, i2i_noise, overlay, inp_img, selection
|
142 |
)
|
143 |
if not isinstance(img_data, bytes):
|
|
|
188 |
gen_btn, stop_btn, paras, others = control_ui()
|
189 |
with gr.Column():
|
190 |
image, info, send_dtool = preview_ui()
|
191 |
+
cost_list = paras[5:8] + paras[10:12] + paras[18:20] + paras[22:24]
|
192 |
for component in cost_list:
|
193 |
component.change(update_btn_cost, inputs=cost_list, outputs=gen_btn)
|
194 |
gen = gen_btn.click(lambda: (gr.Button(visible=False), gr.Button(visible=True)), inputs=None, outputs=[gen_btn, stop_btn]).then(
|
|
|
196 |
rename_save_img, inputs=[image, info, others[0]], outputs=image, trigger_mode="once").then(
|
197 |
lambda: (gr.Button(visible=True), gr.Button(visible=False)), inputs=None, outputs=[gen_btn, stop_btn])
|
198 |
others[2].click(lambda o, s: o if len(s) == 0 else s['parameters']['seed'], inputs=[paras[3], info], outputs=paras[3])
|
199 |
+
others[3].click(lambda i: i, inputs=image, outputs=paras[18])
|
200 |
+
others[4].click(lambda i: gr.ImageEditor(value=i), inputs=image, outputs=paras[22])
|
201 |
stop_btn.click(lambda: (gr.Button(visible=True), gr.Button(visible=False)), inputs=None, outputs=[gen_btn, stop_btn], cancels=[gen])
|
202 |
return image, paras, others, send_dtool
|
203 |
|
|
|
267 |
loadTagComplete.click(fn=None, js="() => {document.getElementById('client_ui_main-button').click();run();}")
|
268 |
clearTagCache = gr.Button(value="清除tag补全缓存")
|
269 |
clearTagCache.click(fn=None, js="() => {localStorage.clear();}")
|
270 |
+
send_and_jump(png2main, send_paras, [png_items] + paras[:15], paras[:15], "client_ui_main", read_image)
|
271 |
+
send_and_jump(gal2main, send_paras, [gal_items] + paras[:15], paras[:15], "client_ui_main", gal_items)
|
272 |
from_t2i.click(lambda x: x, inputs=image, outputs=in_image)
|
273 |
+
send_jump_select(send_i2i, send_outputs, [out_image, d_index], paras[18], "client_ui_main", others[6], out_image, "i2i_block")
|
274 |
+
send_jump_select(send_inp, send_outputs, [out_image, d_index], paras[22], "client_ui_main", others[6], out_image, "inp_block")
|
275 |
+
send_jump_select(send_vib, (lambda l, i: l if i == -1 else [l[i]]), [out_image, d_index], paras[15], "client_ui_main", others[5], out_image)
|
276 |
send_and_jump(send_dtool, (lambda x: x), image, in_image, "client_ui_dtool", image)
|
277 |
+
send_jump_select(history2i2i, send_outputs, [gallery, h_index], paras[18], "client_ui_main", others[6], gal_items, "i2i_block")
|
278 |
+
send_jump_select(history2inp, send_outputs, [gallery, h_index], paras[22], "client_ui_main", others[6], gal_items, "inp_block")
|
279 |
+
send_jump_select(history2ref, (lambda l, i: None if i == -1 else [l[i]]), [gallery, h_index], paras[15], "client_ui_main", others[5], gal_items)
|
280 |
send_and_jump(history2dtl, send_outputs, [gallery, h_index], in_image, "client_ui_dtool", gal_items)
|
281 |
read_image.change(read_info_from_image, inputs=read_image, outputs=[info, png_items])
|
282 |
return website
|
pnginfo.py
CHANGED
@@ -103,13 +103,14 @@ Steps: {json_info["steps"]}, Sampler: {json_info['sampler']}, CFG scale: {json_i
|
|
103 |
def send_paras(*args):
|
104 |
if len(args[0]) == 0:
|
105 |
return args[1:]
|
106 |
-
items, prompt, quality_tags, neg_prompt, seed, scale, width, height, steps, sampler, scheduler, smea, dyn, dyn_threshold, cfg_rescale = args
|
107 |
-
paras = [prompt, quality_tags, neg_prompt, seed, scale, width, height, steps, sampler, scheduler, smea, dyn, dyn_threshold, cfg_rescale]
|
108 |
-
for i, keys in enumerate([('prompt',), ('',), ('uc', 'negative prompt'), ('seed',), ('scale', 'cfg scale'), ('width', 'size-1'), ('height', 'size-2'), ('steps',), ('sampler',), ('noise_schedule',), ('sm',), ('sm_dyn',), ('dynamic_thresholding',), ('cfg_rescale',)]):
|
109 |
for key in keys:
|
110 |
if key in items:
|
111 |
paras[i] = items[key]
|
112 |
-
prompt, quality_tags, neg_prompt, seed, scale, width, height, steps, sampler, scheduler, smea, dyn, dyn_threshold, cfg_rescale = paras
|
|
|
113 |
if prompt.endswith(', ' + quality_tags):
|
114 |
prompt = prompt[:-(len(quality_tags) + 2)]
|
115 |
-
return prompt, quality_tags, neg_prompt, seed, scale, width, height, steps, sampler, scheduler, smea, dyn, dyn_threshold, cfg_rescale
|
|
|
103 |
def send_paras(*args):
|
104 |
if len(args[0]) == 0:
|
105 |
return args[1:]
|
106 |
+
items, prompt, quality_tags, neg_prompt, seed, scale, width, height, steps, sampler, scheduler, smea, dyn, dyn_threshold, cfg_rescale, variety = args
|
107 |
+
paras = [prompt, quality_tags, neg_prompt, seed, scale, width, height, steps, sampler, scheduler, smea, dyn, dyn_threshold, cfg_rescale, variety]
|
108 |
+
for i, keys in enumerate([('prompt',), ('',), ('uc', 'negative prompt'), ('seed',), ('scale', 'cfg scale'), ('width', 'size-1'), ('height', 'size-2'), ('steps',), ('sampler',), ('noise_schedule',), ('sm',), ('sm_dyn',), ('dynamic_thresholding',), ('cfg_rescale',), ('skip_cfg_above_sigma',)]):
|
109 |
for key in keys:
|
110 |
if key in items:
|
111 |
paras[i] = items[key]
|
112 |
+
prompt, quality_tags, neg_prompt, seed, scale, width, height, steps, sampler, scheduler, smea, dyn, dyn_threshold, cfg_rescale, variety = paras
|
113 |
+
variety = (variety != None) if 'skip_cfg_above_sigma' in items else variety
|
114 |
if prompt.endswith(', ' + quality_tags):
|
115 |
prompt = prompt[:-(len(quality_tags) + 2)]
|
116 |
+
return prompt, quality_tags, neg_prompt, seed, scale, width, height, steps, sampler, scheduler, smea, dyn, dyn_threshold, cfg_rescale, variety
|
utils.py
CHANGED
@@ -57,6 +57,7 @@ def generate_novelai_image(
|
|
57 |
dyn=False,
|
58 |
dyn_threshold=False,
|
59 |
cfg_rescale=0,
|
|
|
60 |
ref_images=None,
|
61 |
info_extracts=[],
|
62 |
ref_strs=[],
|
@@ -98,6 +99,7 @@ def generate_novelai_image(
|
|
98 |
"reference_information_extracted_multiple": info_extracts,
|
99 |
"reference_strength_multiple": ref_strs,
|
100 |
"seed": seed,
|
|
|
101 |
"sm": smea,
|
102 |
"sm_dyn": dyn,
|
103 |
"uncond_scale": 1,
|
|
|
57 |
dyn=False,
|
58 |
dyn_threshold=False,
|
59 |
cfg_rescale=0,
|
60 |
+
variety=None,
|
61 |
ref_images=None,
|
62 |
info_extracts=[],
|
63 |
ref_strs=[],
|
|
|
99 |
"reference_information_extracted_multiple": info_extracts,
|
100 |
"reference_strength_multiple": ref_strs,
|
101 |
"seed": seed,
|
102 |
+
"skip_cfg_above_sigma": None if variety is None else 19,
|
103 |
"sm": smea,
|
104 |
"sm_dyn": dyn,
|
105 |
"uncond_scale": 1,
|