inspiration finished
This commit is contained in:
parent
dc66540629
commit
bb0f1a2cda
|
@ -1,25 +1,31 @@
|
|||
function public_image_index_in_gallery(item, gallery){
|
||||
var imgs = gallery.querySelectorAll("img.h-full")
|
||||
var index;
|
||||
var i = 0;
|
||||
gallery.querySelectorAll("img").forEach(function(e){
|
||||
imgs.forEach(function(e){
|
||||
if (e == item)
|
||||
index = i;
|
||||
i += 1;
|
||||
});
|
||||
var num = imgs.length / 2
|
||||
index = (index < num) ? index : (index - num)
|
||||
return index;
|
||||
}
|
||||
|
||||
function inspiration_selected(name, types, name_list){
|
||||
function inspiration_selected(name, name_list){
|
||||
var btn = gradioApp().getElementById("inspiration_select_button")
|
||||
return [gradioApp().getElementById("inspiration_select_button").getAttribute("img-index"), types];
|
||||
}
|
||||
return [gradioApp().getElementById("inspiration_select_button").getAttribute("img-index")];
|
||||
}
|
||||
function inspiration_click_get_button(){
|
||||
gradioApp().getElementById("inspiration_get_button").click();
|
||||
}
|
||||
var inspiration_image_click = function(){
|
||||
var index = public_image_index_in_gallery(this, gradioApp().getElementById("inspiration_gallery"));
|
||||
var btn = gradioApp().getElementById("inspiration_select_button")
|
||||
btn.setAttribute("img-index", index)
|
||||
setTimeout(function(btn){btn.click();}, 10, btn)
|
||||
var btn = gradioApp().getElementById("inspiration_select_button");
|
||||
btn.setAttribute("img-index", index);
|
||||
setTimeout(function(btn){btn.click();}, 10, btn);
|
||||
}
|
||||
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
var mutationObserver = new MutationObserver(function(m){
|
||||
var gallery = gradioApp().getElementById("inspiration_gallery")
|
||||
|
@ -27,11 +33,10 @@ document.addEventListener("DOMContentLoaded", function() {
|
|||
var node = gallery.querySelector(".absolute.backdrop-blur.h-full")
|
||||
if (node) {
|
||||
node.style.display = "None"; //parentNode.removeChild(node)
|
||||
}
|
||||
|
||||
}
|
||||
gallery.querySelectorAll('img').forEach(function(e){
|
||||
e.onclick = inspiration_image_click
|
||||
})
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -1,122 +1,182 @@
|
|||
import os
|
||||
import random
|
||||
import gradio
|
||||
inspiration_path = "inspiration"
|
||||
inspiration_system_path = os.path.join(inspiration_path, "system")
|
||||
def read_name_list(file):
|
||||
import gradio
|
||||
from modules.shared import opts
|
||||
inspiration_system_path = os.path.join(opts.inspiration_dir, "system")
|
||||
def read_name_list(file, types=None, keyword=None):
|
||||
if not os.path.exists(file):
|
||||
return []
|
||||
f = open(file, "r")
|
||||
ret = []
|
||||
f = open(file, "r")
|
||||
line = f.readline()
|
||||
while len(line) > 0:
|
||||
line = line.rstrip("\n")
|
||||
ret.append(line)
|
||||
print(ret)
|
||||
if types is not None:
|
||||
dirname = os.path.split(line)
|
||||
if dirname[0] in types and keyword in dirname[1]:
|
||||
ret.append(line)
|
||||
else:
|
||||
ret.append(line)
|
||||
line = f.readline()
|
||||
return ret
|
||||
|
||||
def save_name_list(file, name):
|
||||
print(file)
|
||||
f = open(file, "a")
|
||||
f.write(name + "\n")
|
||||
with open(file, "a") as f:
|
||||
f.write(name + "\n")
|
||||
|
||||
def get_inspiration_images(source, types):
|
||||
path = os.path.join(inspiration_path , types)
|
||||
def get_types_list():
|
||||
files = os.listdir(opts.inspiration_dir)
|
||||
types = []
|
||||
for x in files:
|
||||
path = os.path.join(opts.inspiration_dir, x)
|
||||
if x[0] == ".":
|
||||
continue
|
||||
if not os.path.isdir(path):
|
||||
continue
|
||||
if path == inspiration_system_path:
|
||||
continue
|
||||
types.append(x)
|
||||
return types
|
||||
|
||||
def get_inspiration_images(source, types, keyword):
|
||||
get_num = int(opts.inspiration_rows_num * opts.inspiration_cols_num)
|
||||
if source == "Favorites":
|
||||
names = read_name_list(os.path.join(inspiration_system_path, types + "_faverites.txt"))
|
||||
names = random.sample(names, 25)
|
||||
names = read_name_list(os.path.join(inspiration_system_path, "faverites.txt"), types, keyword)
|
||||
names = random.sample(names, get_num) if len(names) > get_num else names
|
||||
elif source == "Abandoned":
|
||||
names = read_name_list(os.path.join(inspiration_system_path, types + "_abondened.txt"))
|
||||
names = random.sample(names, 25)
|
||||
elif source == "Exclude abandoned":
|
||||
abondened = read_name_list(os.path.join(inspiration_system_path, types + "_abondened.txt"))
|
||||
all_names = os.listdir(path)
|
||||
names = []
|
||||
while len(names) < 25:
|
||||
name = random.choice(all_names)
|
||||
if name not in abondened:
|
||||
names.append(name)
|
||||
names = read_name_list(os.path.join(inspiration_system_path, "abandoned.txt"), types, keyword)
|
||||
print(names)
|
||||
names = random.sample(names, get_num) if len(names) > get_num else names
|
||||
elif source == "Exclude abandoned":
|
||||
abandoned = read_name_list(os.path.join(inspiration_system_path, "abandoned.txt"), types, keyword)
|
||||
all_names = []
|
||||
for tp in types:
|
||||
name_list = os.listdir(os.path.join(opts.inspiration_dir, tp))
|
||||
all_names += [os.path.join(tp, x) for x in name_list if keyword in x]
|
||||
|
||||
if len(all_names) > get_num:
|
||||
names = []
|
||||
while len(names) < get_num:
|
||||
name = random.choice(all_names)
|
||||
if name not in abandoned:
|
||||
names.append(name)
|
||||
else:
|
||||
names = all_names
|
||||
else:
|
||||
names = random.sample(os.listdir(path), 25)
|
||||
names = random.sample(names, 25)
|
||||
all_names = []
|
||||
for tp in types:
|
||||
name_list = os.listdir(os.path.join(opts.inspiration_dir, tp))
|
||||
all_names += [os.path.join(tp, x) for x in name_list if keyword in x]
|
||||
names = random.sample(all_names, get_num) if len(all_names) > get_num else all_names
|
||||
image_list = []
|
||||
for a in names:
|
||||
image_path = os.path.join(path, a)
|
||||
image_path = os.path.join(opts.inspiration_dir, a)
|
||||
images = os.listdir(image_path)
|
||||
image_list.append(os.path.join(image_path, random.choice(images)))
|
||||
return image_list, names
|
||||
image_list.append((os.path.join(image_path, random.choice(images)), a))
|
||||
return image_list, names, ""
|
||||
|
||||
def select_click(index, types, name_list):
|
||||
def select_click(index, name_list):
|
||||
name = name_list[int(index)]
|
||||
path = os.path.join(inspiration_path, types, name)
|
||||
path = os.path.join(opts.inspiration_dir, name)
|
||||
images = os.listdir(path)
|
||||
return name, [os.path.join(path, x) for x in images]
|
||||
return name, [os.path.join(path, x) for x in images], ""
|
||||
|
||||
def give_up_click(name, types):
|
||||
file = os.path.join(inspiration_system_path, types + "_abandoned.txt")
|
||||
def give_up_click(name):
|
||||
file = os.path.join(inspiration_system_path, "abandoned.txt")
|
||||
name_list = read_name_list(file)
|
||||
if name not in name_list:
|
||||
save_name_list(file, name)
|
||||
return "Added to abandoned list"
|
||||
|
||||
def collect_click(name, types):
|
||||
file = os.path.join(inspiration_system_path, types + "_faverites.txt")
|
||||
print(file)
|
||||
def collect_click(name):
|
||||
file = os.path.join(inspiration_system_path, "faverites.txt")
|
||||
name_list = read_name_list(file)
|
||||
print(name_list)
|
||||
if name not in name_list:
|
||||
save_name_list(file, name)
|
||||
return "Added to faverite list"
|
||||
|
||||
def moveout_click(name, types):
|
||||
file = os.path.join(inspiration_system_path, types + "_faverites.txt")
|
||||
def moveout_click(name, source):
|
||||
if source == "Abandoned":
|
||||
file = os.path.join(inspiration_system_path, "abandoned.txt")
|
||||
if source == "Favorites":
|
||||
file = os.path.join(inspiration_system_path, "faverites.txt")
|
||||
else:
|
||||
return None
|
||||
name_list = read_name_list(file)
|
||||
if name not in name_list:
|
||||
save_name_list(file, name)
|
||||
os.remove(file)
|
||||
with open(file, "a") as f:
|
||||
for a in name_list:
|
||||
if a != name:
|
||||
f.write(a)
|
||||
return "Moved out {name} from {source} list"
|
||||
|
||||
def source_change(source):
|
||||
if source == "Abandoned" or source == "Favorites":
|
||||
return gradio.Button.update(visible=True, value=f"Move out {source}")
|
||||
if source in ["Abandoned", "Favorites"]:
|
||||
return gradio.update(visible=True), []
|
||||
else:
|
||||
return gradio.Button.update(visible=False)
|
||||
return gradio.update(visible=False), []
|
||||
def add_to_prompt(name, prompt):
|
||||
print(name, prompt)
|
||||
name = os.path.basename(name)
|
||||
return prompt + "," + name
|
||||
|
||||
def ui(gr, opts):
|
||||
def ui(gr, opts, txt2img_prompt, img2img_prompt):
|
||||
with gr.Blocks(analytics_enabled=False) as inspiration:
|
||||
flag = os.path.exists(inspiration_path)
|
||||
flag = os.path.exists(opts.inspiration_dir)
|
||||
if flag:
|
||||
types = os.listdir(inspiration_path)
|
||||
types = [x for x in types if x != "system"]
|
||||
types = get_types_list()
|
||||
flag = len(types) > 0
|
||||
if not flag:
|
||||
os.mkdir(inspiration_path)
|
||||
else:
|
||||
os.makedirs(opts.inspiration_dir)
|
||||
if not flag:
|
||||
gr.HTML("""
|
||||
<div align='center' width="50%>You need get "inspiration" images first. You can create these images by run "Create inspiration images" script in txt2img page, or download zip file from here and unzip these file under fold "inpiration".</div>"
|
||||
<div align='center' width="50%"><h2>To activate inspiration function, you need get "inspiration" images first. </h2><br>
|
||||
You can create these images by run "Create inspiration images" script in txt2img page, <br> you can get the artists or art styles list from here<br>
|
||||
<a>https://github.com/pharmapsychotic/clip-interrogator/tree/main/data</a><br>
|
||||
download these files, and select these files in the "Create inspiration images" script UI<br>
|
||||
There about 6000 artists and art styles in these files. <br>This takes server hours depending on your GPU type and how many pictures you generate for each artist/style
|
||||
<br>I suggest at least four images for each<br><br><br>
|
||||
<h2>You can also download generated pictures from here:</h2><br>
|
||||
<a>https://huggingface.co/datasets/yfszzx/inspiration</a><br>
|
||||
unzip the file to the project directory of webui<br>
|
||||
and restart webui, and enjoy the joy of creation!<br></div>
|
||||
""")
|
||||
return inspiration
|
||||
if not os.path.exists(inspiration_system_path):
|
||||
os.mkdir(inspiration_system_path)
|
||||
gallery, names = get_inspiration_images("Exclude abandoned", types[0])
|
||||
with gr.Row():
|
||||
with gr.Column(scale=2):
|
||||
inspiration_gallery = gr.Gallery(gallery, show_label=False, elem_id="inspiration_gallery").style(grid=5, height='auto')
|
||||
inspiration_gallery = gr.Gallery(show_label=False, elem_id="inspiration_gallery").style(grid=opts.inspiration_cols_num, height='auto')
|
||||
with gr.Column(scale=1):
|
||||
types = gr.Dropdown(choices=types, value=types[0], label="Type", visible=len(types) > 1)
|
||||
print(types)
|
||||
types = gr.CheckboxGroup(choices=types, value=types)
|
||||
keyword = gr.Textbox("", label="Key word")
|
||||
with gr.Row():
|
||||
source = gr.Dropdown(choices=["All", "Favorites", "Exclude abandoned", "Abandoned"], value="Exclude abandoned", label="Source")
|
||||
get_inspiration = gr.Button("Get inspiration")
|
||||
get_inspiration = gr.Button("Get inspiration", elem_id="inspiration_get_button")
|
||||
name = gr.Textbox(show_label=False, interactive=False)
|
||||
with gr.Row():
|
||||
send_to_txt2img = gr.Button('to txt2img')
|
||||
send_to_img2img = gr.Button('to img2img')
|
||||
style_gallery = gr.Gallery(show_label=False, elem_id="inspiration_style_gallery").style(grid=2, height='auto')
|
||||
|
||||
style_gallery = gr.Gallery(show_label=False).style(grid=2, height='auto')
|
||||
collect = gr.Button('Collect')
|
||||
give_up = gr.Button("Don't show any more")
|
||||
give_up = gr.Button("Don't show again")
|
||||
moveout = gr.Button("Move out", visible=False)
|
||||
with gr.Row():
|
||||
warning = gr.HTML()
|
||||
with gr.Row(visible=False):
|
||||
select_button = gr.Button('set button', elem_id="inspiration_select_button")
|
||||
name_list = gr.State(names)
|
||||
source.change(source_change, inputs=[source], outputs=[moveout])
|
||||
get_inspiration.click(get_inspiration_images, inputs=[source, types], outputs=[inspiration_gallery, name_list])
|
||||
select_button.click(select_click, _js="inspiration_selected", inputs=[name, types, name_list], outputs=[name, style_gallery])
|
||||
give_up.click(give_up_click, inputs=[name, types], outputs=None)
|
||||
collect.click(collect_click, inputs=[name, types], outputs=None)
|
||||
name_list = gr.State()
|
||||
|
||||
get_inspiration.click(get_inspiration_images, inputs=[source, types, keyword], outputs=[inspiration_gallery, name_list, keyword])
|
||||
source.change(source_change, inputs=[source], outputs=[moveout, style_gallery])
|
||||
source.change(fn=None, _js="inspiration_click_get_button", inputs=None, outputs=None)
|
||||
keyword.submit(fn=None, _js="inspiration_click_get_button", inputs=None, outputs=None)
|
||||
select_button.click(select_click, _js="inspiration_selected", inputs=[name, name_list], outputs=[name, style_gallery, warning])
|
||||
give_up.click(give_up_click, inputs=[name], outputs=[warning])
|
||||
collect.click(collect_click, inputs=[name], outputs=[warning])
|
||||
moveout.click(moveout_click, inputs=[name, source], outputs=[warning])
|
||||
send_to_txt2img.click(add_to_prompt, inputs=[name, txt2img_prompt], outputs=[txt2img_prompt])
|
||||
send_to_img2img.click(add_to_prompt, inputs=[name, img2img_prompt], outputs=[img2img_prompt])
|
||||
send_to_txt2img.click(None, _js='switch_to_txt2img', inputs=None, outputs=None)
|
||||
send_to_img2img.click(None, _js="switch_to_img2img_img2img", inputs=None, outputs=None)
|
||||
return inspiration
|
||||
|
|
|
@ -316,6 +316,12 @@ options_templates.update(options_section(('sampler-params', "Sampler parameters"
|
|||
'eta_noise_seed_delta': OptionInfo(0, "Eta noise seed delta", gr.Number, {"precision": 0}),
|
||||
}))
|
||||
|
||||
options_templates.update(options_section(('inspiration', "Inspiration"), {
|
||||
"inspiration_dir": OptionInfo("inspiration", "Directory of inspiration", component_args=hide_dirs),
|
||||
"inspiration_max_samples": OptionInfo(4, "Maximum number of samples, used to determine which folders to skip when continue running the create script", gr.Slider, {"minimum": 1, "maximum": 20, "step": 1}),
|
||||
"inspiration_rows_num": OptionInfo(4, "Rows of inspiration interface frame", gr.Slider, {"minimum": 4, "maximum": 16, "step": 1}),
|
||||
"inspiration_cols_num": OptionInfo(8, "Columns of inspiration interface frame", gr.Slider, {"minimum": 4, "maximum": 16, "step": 1}),
|
||||
}))
|
||||
|
||||
class Options:
|
||||
data = None
|
||||
|
|
|
@ -1180,7 +1180,7 @@ def create_ui(wrap_gradio_gpu_call):
|
|||
}
|
||||
|
||||
browser_interface = images_history.create_history_tabs(gr, opts, wrap_gradio_call(modules.extras.run_pnginfo), images_history_switch_dict)
|
||||
inspiration_interface = inspiration.ui(gr, opts)
|
||||
inspiration_interface = inspiration.ui(gr, opts, txt2img_prompt, img2img_prompt)
|
||||
|
||||
with gr.Blocks() as modelmerger_interface:
|
||||
with gr.Row().style(equal_height=False):
|
||||
|
|
3
webui.py
3
webui.py
|
@ -72,6 +72,7 @@ def wrap_gradio_gpu_call(func, extra_outputs=None):
|
|||
return modules.ui.wrap_gradio_call(f, extra_outputs=extra_outputs)
|
||||
|
||||
def initialize():
|
||||
modules.scripts.load_scripts(os.path.join(script_path, "scripts"))
|
||||
if cmd_opts.ui_debug_mode:
|
||||
class enmpty():
|
||||
name = None
|
||||
|
@ -84,7 +85,7 @@ def initialize():
|
|||
shared.face_restorers.append(modules.face_restoration.FaceRestoration())
|
||||
modelloader.load_upscalers()
|
||||
|
||||
modules.scripts.load_scripts(os.path.join(script_path, "scripts"))
|
||||
|
||||
|
||||
shared.sd_model = modules.sd_models.load_model()
|
||||
shared.opts.onchange("sd_model_checkpoint", wrap_queued_call(lambda: modules.sd_models.reload_model_weights(shared.sd_model)))
|
||||
|
|
Loading…
Reference in New Issue
Block a user