|
import argparse |
|
import gc |
|
import os |
|
import os.path |
|
import re |
|
import shutil |
|
from importlib import reload |
|
from pprint import pprint |
|
import gradio as gr |
|
from modules import (devices, script_callbacks, scripts, sd_hijack, sd_models,sd_vae, shared) |
|
from modules.scripts import basedir |
|
from modules.sd_models import checkpoints_loaded |
|
from modules.shared import opts |
|
from modules.ui import create_output_panel, create_refresh_button |
|
import scripts.mergers.mergers |
|
import scripts.mergers.pluslora |
|
import scripts.mergers.xyplot |
|
reload(scripts.mergers.mergers) |
|
reload(scripts.mergers.xyplot) |
|
reload(scripts.mergers.pluslora) |
|
import csv |
|
import scripts.mergers.pluslora as pluslora |
|
from scripts.mergers.mergers import (TYPESEG, freezemtime, rwmergelog, simggen,smergegen) |
|
from scripts.mergers.xyplot import freezetime, nulister, numaker, numanager |
|
|
|
gensets=argparse.Namespace() |
|
|
|
def on_ui_train_tabs(params): |
|
txt2img_preview_params=params.txt2img_preview_params |
|
gensets.txt2img_preview_params=txt2img_preview_params |
|
return None |
|
|
|
path_root = basedir() |
|
|
|
def on_ui_tabs(): |
|
weights_presets="" |
|
userfilepath = os.path.join(path_root, "scripts","mbwpresets.txt") |
|
if os.path.isfile(userfilepath): |
|
try: |
|
with open(userfilepath) as f: |
|
weights_presets = f.read() |
|
filepath = userfilepath |
|
except OSError as e: |
|
pass |
|
else: |
|
filepath = os.path.join(path_root, "scripts","mbwpresets_master.txt") |
|
try: |
|
with open(filepath) as f: |
|
weights_presets = f.read() |
|
shutil.copyfile(filepath, userfilepath) |
|
except OSError as e: |
|
pass |
|
|
|
with gr.Blocks() as supermergerui: |
|
with gr.Tab("Merge"): |
|
with gr.Row().style(equal_height=False): |
|
with gr.Column(scale = 3): |
|
gr.HTML(value="<p>Merge models and load it for generation</p>") |
|
|
|
with gr.Row(): |
|
model_a = gr.Dropdown(sd_models.checkpoint_tiles(),elem_id="model_converter_model_name",label="Model A",interactive=True) |
|
create_refresh_button(model_a, sd_models.list_models,lambda: {"choices": sd_models.checkpoint_tiles()},"refresh_checkpoint_Z") |
|
|
|
model_b = gr.Dropdown(sd_models.checkpoint_tiles(),elem_id="model_converter_model_name",label="Model B",interactive=True) |
|
create_refresh_button(model_b, sd_models.list_models,lambda: {"choices": sd_models.checkpoint_tiles()},"refresh_checkpoint_Z") |
|
|
|
model_c = gr.Dropdown(sd_models.checkpoint_tiles(),elem_id="model_converter_model_name",label="Model C",interactive=True) |
|
create_refresh_button(model_c, sd_models.list_models,lambda: {"choices": sd_models.checkpoint_tiles()},"refresh_checkpoint_Z") |
|
|
|
mode = gr.Radio(label = "Merge Mode",choices = ["Weight sum:A*(1-alpha)+B*alpha", "Add difference:A+(B-C)*alpha", |
|
"Triple sum:A*(1-alpha-beta)+B*alpha+C*beta", |
|
"sum Twice:(A*(1-alpha)+B*alpha)*(1-beta)+C*beta", |
|
], value = "Weight sum:A*(1-alpha)+B*alpha") |
|
calcmode = gr.Radio(label = "Calcutation Mode",choices = ["normal", "cosineA", "cosineB", "smoothAdd","tensor"], value = "normal") |
|
with gr.Row(): |
|
useblocks = gr.Checkbox(label="use MBW") |
|
base_alpha = gr.Slider(label="alpha", minimum=-1.0, maximum=2, step=0.001, value=0.5) |
|
base_beta = gr.Slider(label="beta", minimum=-1.0, maximum=2, step=0.001, value=0.25) |
|
|
|
|
|
with gr.Row(): |
|
merge = gr.Button(elem_id="model_merger_merge", value="Merge!",variant='primary') |
|
mergeandgen = gr.Button(elem_id="model_merger_merge", value="Merge&Gen",variant='primary') |
|
gen = gr.Button(elem_id="model_merger_merge", value="Gen",variant='primary') |
|
stopmerge = gr.Button(elem_id="stopmerge", value="Stop",variant='primary') |
|
with gr.Row(): |
|
with gr.Column(scale = 4): |
|
save_sets = gr.CheckboxGroup(["save model", "overwrite","safetensors","fp16","save metadata"], value=["safetensors"], label="save settings") |
|
with gr.Column(scale = 2): |
|
id_sets = gr.CheckboxGroup(["image", "PNG info"], label="write merged model ID to") |
|
with gr.Row(): |
|
with gr.Column(min_width = 50, scale=2): |
|
with gr.Row(): |
|
custom_name = gr.Textbox(label="Custom Name (Optional)", elem_id="model_converter_custom_name") |
|
mergeid = gr.Textbox(label="merge from ID", elem_id="model_converter_custom_name",value = "-1") |
|
with gr.Column(min_width = 50, scale=1): |
|
with gr.Row():s_reverse= gr.Button(value="Set from ID(-1 for last)",variant='primary') |
|
|
|
with gr.Accordion("Restore faces, Tiling, Hires. fix, Batch size",open = False): |
|
batch_size = denois_str = gr.Slider(minimum=0, maximum=8, step=1, label='Batch size', value=1, elem_id="sm_txt2img_batch_size") |
|
genoptions = gr.CheckboxGroup(label = "Gen Options",choices=["Restore faces", "Tiling", "Hires. fix"], visible = True,interactive=True,type="value") |
|
with gr.Row(elem_id="txt2img_hires_fix_row1", variant="compact"): |
|
hrupscaler = gr.Dropdown(label="Upscaler", elem_id="txt2img_hr_upscaler", choices=[*shared.latent_upscale_modes, *[x.name for x in shared.sd_upscalers]], value=shared.latent_upscale_default_mode) |
|
hr2ndsteps = gr.Slider(minimum=0, maximum=150, step=1, label='Hires steps', value=0, elem_id="txt2img_hires_steps") |
|
denois_str = gr.Slider(minimum=0.0, maximum=1.0, step=0.01, label='Denoising strength', value=0.7, elem_id="txt2img_denoising_strength") |
|
hr_scale = gr.Slider(minimum=1.0, maximum=4.0, step=0.05, label="Upscale by", value=2.0, elem_id="txt2img_hr_scale") |
|
|
|
hiresfix = [genoptions,hrupscaler,hr2ndsteps,denois_str,hr_scale] |
|
|
|
with gr.Accordion("Elemental Merge",open = False): |
|
with gr.Row(): |
|
esettings1 = gr.CheckboxGroup(label = "settings",choices=["print change"],type="value",interactive=True) |
|
with gr.Row(): |
|
deep = gr.Textbox(label="Blocks:Element:Ratio,Blocks:Element:Ratio,...",lines=2,value="") |
|
|
|
with gr.Accordion("Tensor Merge",open = False,visible=False): |
|
tensor = gr.Textbox(label="Blocks:Tensors",lines=2,value="") |
|
|
|
with gr.Row(): |
|
x_type = gr.Dropdown(label="X type", choices=[x for x in TYPESEG], value="alpha", type="index") |
|
x_randseednum = gr.Number(value=3, label="number of -1", interactive=True, visible = True) |
|
xgrid = gr.Textbox(label="Sequential Merge Parameters",lines=3,value="0.25,0.5,0.75") |
|
y_type = gr.Dropdown(label="Y type", choices=[y for y in TYPESEG], value="none", type="index") |
|
ygrid = gr.Textbox(label="Y grid (Disabled if blank)",lines=3,value="",visible =False) |
|
with gr.Row(): |
|
gengrid = gr.Button(elem_id="model_merger_merge", value="Sequential XY Merge and Generation",variant='primary') |
|
stopgrid = gr.Button(elem_id="model_merger_merge", value="Stop XY",variant='primary') |
|
s_reserve1 = gr.Button(value="Reserve XY Plot",variant='primary') |
|
dtrue = gr.Checkbox(value = True, visible = False) |
|
dfalse = gr.Checkbox(value = False,visible = False) |
|
dummy_t = gr.Textbox(value = "",visible = False) |
|
blockid=["BASE","IN00","IN01","IN02","IN03","IN04","IN05","IN06","IN07","IN08","IN09","IN10","IN11","M00","OUT00","OUT01","OUT02","OUT03","OUT04","OUT05","OUT06","OUT07","OUT08","OUT09","OUT10","OUT11"] |
|
|
|
with gr.Column(scale = 2): |
|
currentmodel = gr.Textbox(label="Current Model",lines=1,value="") |
|
submit_result = gr.Textbox(label="Message") |
|
mgallery, mgeninfo, mhtmlinfo, mhtmllog = create_output_panel("txt2img", opts.outdir_txt2img_samples) |
|
with gr.Row(visible = False) as row_inputers: |
|
inputer = gr.Textbox(label="",lines=1,value="") |
|
addtox = gr.Button(value="Add to Sequence X") |
|
addtoy = gr.Button(value="Add to Sequence Y") |
|
with gr.Row(visible = False) as row_blockids: |
|
blockids = gr.CheckboxGroup(label = "block IDs",choices=[x for x in blockid],type="value",interactive=True) |
|
with gr.Row(visible = False) as row_calcmode: |
|
calcmodes = gr.CheckboxGroup(label = "calcmode",choices=["normal", "cosineA", "cosineB", "smoothAdd","tensor"],type="value",interactive=True) |
|
with gr.Row(visible = False) as row_checkpoints: |
|
checkpoints = gr.CheckboxGroup(label = "checkpoint",choices=[x.model_name for x in sd_models.checkpoints_list.values()],type="value",interactive=True) |
|
with gr.Row(visible = False) as row_esets: |
|
esettings = gr.CheckboxGroup(label = "effective chekcer settings",choices=["save csv","save anime gif","not save grid","print change"],type="value",interactive=True) |
|
|
|
with gr.Tab("Weights Setting"): |
|
with gr.Row(): |
|
setalpha = gr.Button(elem_id="copytogen", value="set to alpha",variant='primary') |
|
readalpha = gr.Button(elem_id="copytogen", value="read from alpha",variant='primary') |
|
setbeta = gr.Button(elem_id="copytogen", value="set to beta",variant='primary') |
|
readbeta = gr.Button(elem_id="copytogen", value="read from beta",variant='primary') |
|
setx = gr.Button(elem_id="copytogen", value="set to X",variant='primary') |
|
with gr.Row(): |
|
weights_a = gr.Textbox(label="weights for alpha, base alpha,IN00,IN02,...IN11,M00,OUT00,...,OUT11",value = "0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5") |
|
weights_b = gr.Textbox(label="weights,for beta, base beta,IN00,IN02,...IN11,M00,OUT00,...,OUT11",value = "0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2") |
|
with gr.Row(): |
|
base= gr.Slider(label="Base", minimum=0, maximum=1, step =0.01, value=0.5) |
|
in00 = gr.Slider(label="IN00", minimum=0, maximum=1, step=0.01, value=0.5) |
|
in01 = gr.Slider(label="IN01", minimum=0, maximum=1, step=0.01, value=0.5) |
|
in02 = gr.Slider(label="IN02", minimum=0, maximum=1, step=0.01, value=0.5) |
|
in03 = gr.Slider(label="IN03", minimum=0, maximum=1, step=0.01, value=0.5) |
|
with gr.Row(): |
|
in04 = gr.Slider(label="IN04", minimum=0, maximum=1, step=0.01, value=0.5) |
|
in05 = gr.Slider(label="IN05", minimum=0, maximum=1, step=0.01, value=0.5) |
|
in06 = gr.Slider(label="IN06", minimum=0, maximum=1, step=0.01, value=0.5) |
|
in07 = gr.Slider(label="IN07", minimum=0, maximum=1, step=0.01, value=0.5) |
|
in08 = gr.Slider(label="IN08", minimum=0, maximum=1, step=0.01, value=0.5) |
|
in09 = gr.Slider(label="IN09", minimum=0, maximum=1, step=0.01, value=0.5) |
|
with gr.Row(): |
|
in10 = gr.Slider(label="IN10", minimum=0, maximum=1, step=0.01, value=0.5) |
|
in11 = gr.Slider(label="IN11", minimum=0, maximum=1, step=0.01, value=0.5) |
|
mi00 = gr.Slider(label="M00", minimum=0, maximum=1, step=0.01, value=0.5) |
|
ou00 = gr.Slider(label="OUT00", minimum=0, maximum=1, step=0.01, value=0.5) |
|
ou01 = gr.Slider(label="OUT01", minimum=0, maximum=1, step=0.01, value=0.5) |
|
ou02 = gr.Slider(label="OUT02", minimum=0, maximum=1, step=0.01, value=0.5) |
|
with gr.Row(): |
|
ou03 = gr.Slider(label="OUT03", minimum=0, maximum=1, step=0.01, value=0.5) |
|
ou04 = gr.Slider(label="OUT04", minimum=0, maximum=1, step=0.01, value=0.5) |
|
ou05 = gr.Slider(label="OUT05", minimum=0, maximum=1, step=0.01, value=0.5) |
|
ou06 = gr.Slider(label="OUT06", minimum=0, maximum=1, step=0.01, value=0.5) |
|
ou07 = gr.Slider(label="OUT07", minimum=0, maximum=1, step=0.01, value=0.5) |
|
ou08 = gr.Slider(label="OUT08", minimum=0, maximum=1, step=0.01, value=0.5) |
|
with gr.Row(): |
|
ou09 = gr.Slider(label="OUT09", minimum=0, maximum=1, step=0.01, value=0.5) |
|
ou10 = gr.Slider(label="OUT10", minimum=0, maximum=1, step=0.01, value=0.5) |
|
ou11 = gr.Slider(label="OUT11", minimum=0, maximum=1, step=0.01, value=0.5) |
|
with gr.Tab("Weights Presets"): |
|
with gr.Row(): |
|
s_reloadtext = gr.Button(value="Reload Presets",variant='primary') |
|
s_reloadtags = gr.Button(value="Reload Tags",variant='primary') |
|
s_savetext = gr.Button(value="Save Presets",variant='primary') |
|
s_openeditor = gr.Button(value="Open TextEditor",variant='primary') |
|
weightstags= gr.Textbox(label="available",lines = 2,value=tagdicter(weights_presets),visible =True,interactive =True) |
|
wpresets= gr.TextArea(label="",value=weights_presets,visible =True,interactive = True) |
|
|
|
with gr.Tab("Reservation"): |
|
with gr.Row(): |
|
s_reserve = gr.Button(value="Reserve XY Plot",variant='primary') |
|
s_reloadreserve = gr.Button(value="Reloat List",variant='primary') |
|
s_startreserve = gr.Button(value="Start XY plot",variant='primary') |
|
s_delreserve = gr.Button(value="Delete list(-1 for all)",variant='primary') |
|
s_delnum = gr.Number(value=1, label="Delete num : ", interactive=True, visible = True,precision =0) |
|
with gr.Row(): |
|
numaframe = gr.Dataframe( |
|
headers=["No.","status","xtype","xmenber", "ytype","ymenber","model A","model B","model C","alpha","beta","mode","use MBW","weights alpha","weights beta"], |
|
row_count=5,) |
|
|
|
|
|
|
|
|
|
|
|
with gr.Row(): |
|
|
|
currentcache = gr.Textbox(label="Current Cache") |
|
loadcachelist = gr.Button(elem_id="model_merger_merge", value="Reload Cache List",variant='primary') |
|
unloadmodel = gr.Button(value="unload model",variant='primary') |
|
|
|
|
|
|
|
|
|
with gr.Tab("LoRA", elem_id="tab_lora"): |
|
pluslora.on_ui_tabs() |
|
|
|
with gr.Tab("History", elem_id="tab_history"): |
|
|
|
with gr.Row(): |
|
load_history = gr.Button(value="load_history",variant='primary') |
|
searchwrods = gr.Textbox(label="",lines=1,value="") |
|
search = gr.Button(value="search") |
|
searchmode = gr.Radio(label = "Search Mode",choices = ["or","and"], value = "or",type = "value") |
|
with gr.Row(): |
|
history = gr.Dataframe( |
|
headers=["ID","Time","Name","Weights alpha","Weights beta","Model A","Model B","Model C","alpha","beta","Mode","use MBW","custum name","save setting","use ID"], |
|
) |
|
|
|
with gr.Tab("Elements", elem_id="tab_deep"): |
|
with gr.Row(): |
|
smd_model_a = gr.Dropdown(sd_models.checkpoint_tiles(),elem_id="model_converter_model_name",label="Checkpoint A",interactive=True) |
|
create_refresh_button(smd_model_a, sd_models.list_models,lambda: {"choices": sd_models.checkpoint_tiles()},"refresh_checkpoint_Z") |
|
smd_loadkeys = gr.Button(value="load keys",variant='primary') |
|
with gr.Row(): |
|
keys = gr.Dataframe(headers=["No.","block","key"],) |
|
|
|
with gr.Tab("Metadeta", elem_id="tab_metadata"): |
|
with gr.Row(): |
|
meta_model_a = gr.Dropdown(sd_models.checkpoint_tiles(),elem_id="model_converter_model_name",label="read metadata",interactive=True) |
|
create_refresh_button(meta_model_a, sd_models.list_models,lambda: {"choices": sd_models.checkpoint_tiles()},"refresh_checkpoint_Z") |
|
smd_loadmetadata = gr.Button(value="load keys",variant='primary') |
|
with gr.Row(): |
|
metadata = gr.TextArea() |
|
|
|
smd_loadmetadata.click( |
|
fn=loadmetadata, |
|
inputs=[meta_model_a], |
|
outputs=[metadata] |
|
) |
|
|
|
smd_loadkeys.click( |
|
fn=loadkeys, |
|
inputs=[smd_model_a], |
|
outputs=[keys] |
|
) |
|
|
|
def unload(): |
|
if shared.sd_model == None: return "already unloaded" |
|
sd_hijack.model_hijack.undo_hijack(shared.sd_model) |
|
shared.sd_model = None |
|
gc.collect() |
|
devices.torch_gc() |
|
return "model unloaded" |
|
|
|
unloadmodel.click(fn=unload,outputs=[submit_result]) |
|
|
|
load_history.click(fn=load_historyf,outputs=[history ]) |
|
|
|
msettings=[weights_a,weights_b,model_a,model_b,model_c,base_alpha,base_beta,mode,calcmode,useblocks,custom_name,save_sets,id_sets,wpresets,deep,tensor] |
|
imagegal = [mgallery,mgeninfo,mhtmlinfo,mhtmllog] |
|
xysettings=[x_type,xgrid,y_type,ygrid,esettings] |
|
|
|
s_reverse.click(fn = reversparams, |
|
inputs =mergeid, |
|
outputs = [submit_result,*msettings[0:8],*msettings[9:13],deep,calcmode] |
|
) |
|
|
|
merge.click( |
|
fn=smergegen, |
|
inputs=[*msettings,esettings1,*gensets.txt2img_preview_params,*hiresfix,batch_size,currentmodel,dfalse], |
|
outputs=[submit_result,currentmodel] |
|
) |
|
|
|
mergeandgen.click( |
|
fn=smergegen, |
|
inputs=[*msettings,esettings1,*gensets.txt2img_preview_params,*hiresfix,batch_size,currentmodel,dtrue], |
|
outputs=[submit_result,currentmodel,*imagegal] |
|
) |
|
|
|
gen.click( |
|
fn=simggen, |
|
inputs=[*gensets.txt2img_preview_params,*hiresfix,batch_size,currentmodel,id_sets], |
|
outputs=[*imagegal], |
|
) |
|
|
|
s_reserve.click( |
|
fn=numaker, |
|
inputs=[*xysettings,*msettings,*gensets.txt2img_preview_params,*hiresfix,batch_size], |
|
outputs=[numaframe] |
|
) |
|
|
|
s_reserve1.click( |
|
fn=numaker, |
|
inputs=[*xysettings,*msettings,*gensets.txt2img_preview_params,*hiresfix,batch_size], |
|
outputs=[numaframe] |
|
) |
|
|
|
gengrid.click( |
|
fn=numanager, |
|
inputs=[dtrue,*xysettings,*msettings,*gensets.txt2img_preview_params,*hiresfix,batch_size], |
|
outputs=[submit_result,currentmodel,*imagegal], |
|
) |
|
|
|
s_startreserve.click( |
|
fn=numanager, |
|
inputs=[dfalse,*xysettings,*msettings,*gensets.txt2img_preview_params,*hiresfix,batch_size], |
|
outputs=[submit_result,currentmodel,*imagegal], |
|
) |
|
|
|
search.click(fn = searchhistory,inputs=[searchwrods,searchmode],outputs=[history]) |
|
|
|
s_reloadreserve.click(fn=nulister,inputs=[dfalse],outputs=[numaframe]) |
|
s_delreserve.click(fn=nulister,inputs=[s_delnum],outputs=[numaframe]) |
|
loadcachelist.click(fn=load_cachelist,inputs=[],outputs=[currentcache]) |
|
addtox.click(fn=lambda x:gr.Textbox.update(value = x),inputs=[inputer],outputs=[xgrid]) |
|
addtoy.click(fn=lambda x:gr.Textbox.update(value = x),inputs=[inputer],outputs=[ygrid]) |
|
|
|
stopgrid.click(fn=freezetime) |
|
stopmerge.click(fn=freezemtime) |
|
|
|
checkpoints.change(fn=lambda x:",".join(x),inputs=[checkpoints],outputs=[inputer]) |
|
blockids.change(fn=lambda x:" ".join(x),inputs=[blockids],outputs=[inputer]) |
|
calcmodes.change(fn=lambda x:",".join(x),inputs=[calcmodes],outputs=[inputer]) |
|
|
|
menbers = [base,in00,in01,in02,in03,in04,in05,in06,in07,in08,in09,in10,in11,mi00,ou00,ou01,ou02,ou03,ou04,ou05,ou06,ou07,ou08,ou09,ou10,ou11] |
|
|
|
setalpha.click(fn=slider2text,inputs=menbers,outputs=[weights_a]) |
|
setbeta.click(fn=slider2text,inputs=menbers,outputs=[weights_b]) |
|
setx.click(fn=add_to_seq,inputs=[xgrid,weights_a],outputs=[xgrid]) |
|
|
|
readalpha.click(fn=text2slider,inputs=weights_a,outputs=menbers) |
|
readbeta.click(fn=text2slider,inputs=weights_b,outputs=menbers) |
|
|
|
x_type.change(fn=showxy,inputs=[x_type,y_type], outputs=[row_blockids,row_checkpoints,row_inputers,ygrid,row_esets,row_calcmode]) |
|
y_type.change(fn=showxy,inputs=[x_type,y_type], outputs=[row_blockids,row_checkpoints,row_inputers,ygrid,row_esets,row_calcmode]) |
|
x_randseednum.change(fn=makerand,inputs=[x_randseednum],outputs=[xgrid]) |
|
|
|
import subprocess |
|
def openeditors(): |
|
subprocess.Popen(['start', filepath], shell=True) |
|
|
|
def reloadpresets(): |
|
try: |
|
with open(filepath) as f: |
|
return f.read() |
|
except OSError as e: |
|
pass |
|
|
|
def savepresets(text): |
|
with open(filepath,mode = 'w') as f: |
|
f.write(text) |
|
|
|
s_reloadtext.click(fn=reloadpresets,inputs=[],outputs=[wpresets]) |
|
s_reloadtags.click(fn=tagdicter,inputs=[wpresets],outputs=[weightstags]) |
|
s_savetext.click(fn=savepresets,inputs=[wpresets],outputs=[]) |
|
s_openeditor.click(fn=openeditors,inputs=[],outputs=[]) |
|
|
|
return (supermergerui, "SuperMerger", "supermerger"), |
|
|
|
msearch = [] |
|
mlist=[] |
|
|
|
def loadmetadata(model): |
|
import json |
|
checkpoint_info = sd_models.get_closet_checkpoint_match(model) |
|
if ".safetensors" not in checkpoint_info.filename: return "no metadata(not safetensors)" |
|
sdict = sd_models.read_metadata_from_safetensors(checkpoint_info.filename) |
|
if sdict == {}: return "no metadata" |
|
return json.dumps(sdict,indent=4) |
|
|
|
def load_historyf(): |
|
filepath = os.path.join(path_root,"mergehistory.csv") |
|
global mlist,msearch |
|
msearch = [] |
|
mlist=[] |
|
try: |
|
with open(filepath, 'r') as f: |
|
reader = csv.reader(f) |
|
mlist = [raw for raw in reader] |
|
mlist = mlist[1:] |
|
for m in mlist: |
|
msearch.append(" ".join(m)) |
|
maxlen = len(mlist[-1][0]) |
|
for i,m in enumerate(mlist): |
|
mlist[i][0] = mlist[i][0].zfill(maxlen) |
|
return mlist |
|
except: |
|
return [["no data","",""],] |
|
|
|
def searchhistory(words,searchmode): |
|
outs =[] |
|
ando = "and" in searchmode |
|
words = words.split(" ") if " " in words else [words] |
|
for i, m in enumerate(msearch): |
|
hit = ando |
|
for w in words: |
|
if ando: |
|
if w not in m:hit = False |
|
else: |
|
if w in m:hit = True |
|
print(i,len(mlist)) |
|
if hit :outs.append(mlist[i]) |
|
|
|
if outs == []:return [["no result","",""],] |
|
return outs |
|
|
|
|
|
|
|
def reversparams(id): |
|
def selectfromhash(hash): |
|
for model in sd_models.checkpoint_tiles(): |
|
if hash in model: |
|
return model |
|
return "" |
|
try: |
|
idsets = rwmergelog(id = id) |
|
except: |
|
return [gr.update(value = "ERROR: history file could not open"),*[gr.update() for x in range(14)]] |
|
if type(idsets) == str: |
|
print("ERROR") |
|
return [gr.update(value = idsets),*[gr.update() for x in range(14)]] |
|
if idsets[0] == "ID":return [gr.update(value ="ERROR: no history"),*[gr.update() for x in range(14)]] |
|
mgs = idsets[3:] |
|
if mgs[0] == "":mgs[0] = "0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5" |
|
if mgs[1] == "":mgs[1] = "0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2" |
|
mgs[2] = selectfromhash(mgs[2]) if len(mgs[2]) > 5 else "" |
|
mgs[3] = selectfromhash(mgs[3]) if len(mgs[3]) > 5 else "" |
|
mgs[4] = selectfromhash(mgs[4]) if len(mgs[4]) > 5 else "" |
|
mgs[8] = True if mgs[8] =="True" else False |
|
mgs[10] = mgs[10].replace("[","").replace("]","").replace("'", "") |
|
mgs[10] = [x.strip() for x in mgs[10].split(",")] |
|
mgs[11] = mgs[11].replace("[","").replace("]","").replace("'", "") |
|
mgs[11] = [x.strip() for x in mgs[11].split(",")] |
|
while len(mgs) < 14: |
|
mgs.append("") |
|
mgs[13] = "normal" if mgs[13] == "" else mgs[13] |
|
return [gr.update(value = "setting loaded") ,*[gr.update(value = x) for x in mgs[0:14]]] |
|
|
|
def add_to_seq(seq,maker): |
|
return gr.Textbox.update(value = maker if seq=="" else seq+"\r\n"+maker) |
|
|
|
def load_cachelist(): |
|
text = "" |
|
for x in checkpoints_loaded.keys(): |
|
text = text +"\r\n"+ x.model_name |
|
return text.replace("\r\n","",1) |
|
|
|
def makerand(num): |
|
text = "" |
|
for x in range(int(num)): |
|
text = text +"-1," |
|
text = text[:-1] |
|
return text |
|
|
|
|
|
def showxy(x,y): |
|
flags =[False]*6 |
|
t = TYPESEG |
|
txy = t[x] + t[y] |
|
if "model" in txy : flags[1] = flags[2] = True |
|
if "pinpoint" in txy : flags[0] = flags[2] = True |
|
if "effective" in txy or "element" in txy : flags[4] = True |
|
if "calcmode" in txy : flags[5] = True |
|
if not "none" in t[y] : flags[3] = flags[2] = True |
|
return [gr.update(visible = x) for x in flags] |
|
|
|
def text2slider(text): |
|
vals = [t.strip() for t in text.split(",")] |
|
return [gr.update(value = float(v)) for v in vals] |
|
|
|
def slider2text(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z): |
|
numbers = [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z] |
|
numbers = [str(x) for x in numbers] |
|
return gr.update(value = ",".join(numbers) ) |
|
|
|
def tagdicter(presets): |
|
presets=presets.splitlines() |
|
wdict={} |
|
for l in presets: |
|
w=[] |
|
if ":" in l : |
|
key = l.split(":",1)[0] |
|
w = l.split(":",1)[1] |
|
if "\t" in l: |
|
key = l.split("\t",1)[0] |
|
w = l.split("\t",1)[1] |
|
if len([w for w in w.split(",")]) == 26: |
|
wdict[key.strip()]=w |
|
return ",".join(list(wdict.keys())) |
|
|
|
def loadkeys(model_a): |
|
checkpoint_info = sd_models.get_closet_checkpoint_match(model_a) |
|
sd = sd_models.read_state_dict(checkpoint_info.filename,"cpu") |
|
keys = [] |
|
for i, key in enumerate(sd.keys()): |
|
re_inp = re.compile(r'\.input_blocks\.(\d+)\.') |
|
re_mid = re.compile(r'\.middle_block\.(\d+)\.') |
|
re_out = re.compile(r'\.output_blocks\.(\d+)\.') |
|
|
|
weight_index = -1 |
|
blockid=["BASE","IN00","IN01","IN02","IN03","IN04","IN05","IN06","IN07","IN08","IN09","IN10","IN11","M00","OUT00","OUT01","OUT02","OUT03","OUT04","OUT05","OUT06","OUT07","OUT08","OUT09","OUT10","OUT11","Not Merge"] |
|
|
|
NUM_INPUT_BLOCKS = 12 |
|
NUM_MID_BLOCK = 1 |
|
NUM_OUTPUT_BLOCKS = 12 |
|
NUM_TOTAL_BLOCKS = NUM_INPUT_BLOCKS + NUM_MID_BLOCK + NUM_OUTPUT_BLOCKS |
|
|
|
if 'time_embed' in key: |
|
weight_index = -2 |
|
elif '.out.' in key: |
|
weight_index = NUM_TOTAL_BLOCKS - 1 |
|
else: |
|
m = re_inp.search(key) |
|
if m: |
|
inp_idx = int(m.groups()[0]) |
|
weight_index = inp_idx |
|
else: |
|
m = re_mid.search(key) |
|
if m: |
|
weight_index = NUM_INPUT_BLOCKS |
|
else: |
|
m = re_out.search(key) |
|
if m: |
|
out_idx = int(m.groups()[0]) |
|
weight_index = NUM_INPUT_BLOCKS + NUM_MID_BLOCK + out_idx |
|
keys.append([i,blockid[weight_index+1],key]) |
|
return keys |
|
|
|
script_callbacks.on_ui_tabs(on_ui_tabs) |
|
script_callbacks.on_ui_train_tabs(on_ui_train_tabs) |
|
|