From 0bd8aa937f9172b44de30d158258c51b2174f136 Mon Sep 17 00:00:00 2001 From: Bernard Maltais Date: Tue, 27 Sep 2022 10:29:52 -0400 Subject: Add interpolation method and weight to output filename --- modules/extras.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'modules/extras.py') diff --git a/modules/extras.py b/modules/extras.py index 15873204..c4ee2b62 100644 --- a/modules/extras.py +++ b/modules/extras.py @@ -186,7 +186,7 @@ def run_modelmerger(modelname_0, modelname_1, interp_method, interp_amount): if 'model' in key and key not in theta_0: theta_0[key] = theta_1[key] - output_modelname = 'models/' + modelname_0 + '-' + modelname_1 + '-merged.ckpt' + output_modelname = 'models/' + modelname_0 + '-' + modelname_1 + '-' + interp_method.replace(" ", "_") + '-' + str(interp_amount) + '-merged.ckpt' print(f"Saving to {output_modelname}...") torch.save(model_0, output_modelname) -- cgit v1.2.3 From 20b41b7be708a501fbc7e10dceebababfd48ffda Mon Sep 17 00:00:00 2001 From: Bernard Maltais Date: Tue, 27 Sep 2022 15:21:25 -0400 Subject: (feat): Rework Checkpoint Merger UI for better clarity - Rename variables to better align with field input - Improve merged checkpoint output file name --- modules/extras.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'modules/extras.py') diff --git a/modules/extras.py b/modules/extras.py index c4ee2b62..9c3b421d 100644 --- a/modules/extras.py +++ b/modules/extras.py @@ -140,7 +140,7 @@ def run_pnginfo(image): return '', geninfo, info -def run_modelmerger(modelname_0, modelname_1, interp_method, interp_amount): +def run_modelmerger(from_model_name, to_model_name, interp_method, interp_amount): # Linear interpolation (https://en.wikipedia.org/wiki/Linear_interpolation) def weighted_sum(theta0, theta1, alpha): return ((1 - alpha) * theta0) + (alpha * theta1) @@ -150,23 +150,23 @@ def run_modelmerger(modelname_0, modelname_1, interp_method, interp_amount): alpha = alpha * alpha * (3 - (2 * alpha)) return theta0 + ((theta1 - theta0) * alpha) - if os.path.exists(modelname_0): - model0_filename = modelname_0 - modelname_0 = os.path.splitext(os.path.basename(modelname_0))[0] + if os.path.exists(to_model_name): + to_model_filename = to_model_name + to_model_name = os.path.splitext(os.path.basename(to_model_name))[0] else: - model0_filename = 'models/' + modelname_0 + '.ckpt' + to_model_filename = 'models/' + to_model_name + '.ckpt' - if os.path.exists(modelname_1): - model1_filename = modelname_1 - modelname_1 = os.path.splitext(os.path.basename(modelname_1))[0] + if os.path.exists(from_model_name): + from_model_filename = from_model_name + from_model_name = os.path.splitext(os.path.basename(from_model_name))[0] else: - model1_filename = 'models/' + modelname_1 + '.ckpt' + from_model_filename = 'models/' + from_model_name + '.ckpt' - print(f"Loading {model0_filename}...") - model_0 = torch.load(model0_filename, map_location='cpu') + print(f"Loading {to_model_filename}...") + model_0 = torch.load(to_model_filename, map_location='cpu') - print(f"Loading {model1_filename}...") - model_1 = torch.load(model1_filename, map_location='cpu') + print(f"Loading {from_model_filename}...") + model_1 = torch.load(from_model_filename, map_location='cpu') theta_0 = model_0['state_dict'] theta_1 = model_1['state_dict'] @@ -186,7 +186,7 @@ def run_modelmerger(modelname_0, modelname_1, interp_method, interp_amount): if 'model' in key and key not in theta_0: theta_0[key] = theta_1[key] - output_modelname = 'models/' + modelname_0 + '-' + modelname_1 + '-' + interp_method.replace(" ", "_") + '-' + str(interp_amount) + '-merged.ckpt' + output_modelname = 'models/' + from_model_name + str(interp_amount) + '-' + to_model_name + str(float(1.0) - interp_amount) + '-' + interp_method.replace(" ", "_") + '-' + '-merged.ckpt' print(f"Saving to {output_modelname}...") torch.save(model_0, output_modelname) -- cgit v1.2.3 From e258f89080b8ff38f040dc786290da9144860d38 Mon Sep 17 00:00:00 2001 From: Bernard Maltais Date: Tue, 27 Sep 2022 15:31:00 -0400 Subject: Fix file name --- modules/extras.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'modules/extras.py') diff --git a/modules/extras.py b/modules/extras.py index 9c3b421d..9e1efeda 100644 --- a/modules/extras.py +++ b/modules/extras.py @@ -186,7 +186,7 @@ def run_modelmerger(from_model_name, to_model_name, interp_method, interp_amount if 'model' in key and key not in theta_0: theta_0[key] = theta_1[key] - output_modelname = 'models/' + from_model_name + str(interp_amount) + '-' + to_model_name + str(float(1.0) - interp_amount) + '-' + interp_method.replace(" ", "_") + '-' + '-merged.ckpt' + output_modelname = 'models/' + from_model_name + '_' + str(interp_amount) + '-' + to_model_name + '_' + str(float(1.0) - interp_amount) + '-' + interp_method.replace(" ", "_") + '-merged.ckpt' print(f"Saving to {output_modelname}...") torch.save(model_0, output_modelname) -- cgit v1.2.3 From d641af6a7d6f1edb7dbc584f72f95e036d830c85 Mon Sep 17 00:00:00 2001 From: Bernard Maltais Date: Tue, 27 Sep 2022 21:09:28 -0400 Subject: - Add gradio dropdown list to select checkpoints - Update checkpoint model fields labels --- modules/extras.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'modules/extras.py') diff --git a/modules/extras.py b/modules/extras.py index 9e1efeda..90968352 100644 --- a/modules/extras.py +++ b/modules/extras.py @@ -140,7 +140,7 @@ def run_pnginfo(image): return '', geninfo, info -def run_modelmerger(from_model_name, to_model_name, interp_method, interp_amount): +def run_modelmerger(primary_model_name, secondary_model_name, interp_method, interp_amount): # Linear interpolation (https://en.wikipedia.org/wiki/Linear_interpolation) def weighted_sum(theta0, theta1, alpha): return ((1 - alpha) * theta0) + (alpha * theta1) @@ -150,23 +150,23 @@ def run_modelmerger(from_model_name, to_model_name, interp_method, interp_amount alpha = alpha * alpha * (3 - (2 * alpha)) return theta0 + ((theta1 - theta0) * alpha) - if os.path.exists(to_model_name): - to_model_filename = to_model_name - to_model_name = os.path.splitext(os.path.basename(to_model_name))[0] + if os.path.exists(secondary_model_name): + secondary_model_filename = secondary_model_name + secondary_model_name = os.path.splitext(os.path.basename(secondary_model_name))[0] else: - to_model_filename = 'models/' + to_model_name + '.ckpt' + secondary_model_filename = 'models/' + secondary_model_name + '.ckpt' - if os.path.exists(from_model_name): - from_model_filename = from_model_name - from_model_name = os.path.splitext(os.path.basename(from_model_name))[0] + if os.path.exists(primary_model_name): + primary_model_filename = primary_model_name + primary_model_name = os.path.splitext(os.path.basename(primary_model_name))[0] else: - from_model_filename = 'models/' + from_model_name + '.ckpt' + primary_model_filename = 'models/' + primary_model_name + '.ckpt' - print(f"Loading {to_model_filename}...") - model_0 = torch.load(to_model_filename, map_location='cpu') + print(f"Loading {secondary_model_filename}...") + model_0 = torch.load(secondary_model_filename, map_location='cpu') - print(f"Loading {from_model_filename}...") - model_1 = torch.load(from_model_filename, map_location='cpu') + print(f"Loading {primary_model_filename}...") + model_1 = torch.load(primary_model_filename, map_location='cpu') theta_0 = model_0['state_dict'] theta_1 = model_1['state_dict'] @@ -186,7 +186,7 @@ def run_modelmerger(from_model_name, to_model_name, interp_method, interp_amount if 'model' in key and key not in theta_0: theta_0[key] = theta_1[key] - output_modelname = 'models/' + from_model_name + '_' + str(interp_amount) + '-' + to_model_name + '_' + str(float(1.0) - interp_amount) + '-' + interp_method.replace(" ", "_") + '-merged.ckpt' + output_modelname = 'models/' + primary_model_name + '_' + str(interp_amount) + '-' + secondary_model_name + '_' + str(float(1.0) - interp_amount) + '-' + interp_method.replace(" ", "_") + '-merged.ckpt' print(f"Saving to {output_modelname}...") torch.save(model_0, output_modelname) -- cgit v1.2.3 From 8c48ede135586a3473e4252d166931cefe64aafb Mon Sep 17 00:00:00 2001 From: Bernard Maltais Date: Tue, 27 Sep 2022 21:34:24 -0400 Subject: Fix variable conversion code issue --- modules/extras.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'modules/extras.py') diff --git a/modules/extras.py b/modules/extras.py index 90968352..f6704382 100644 --- a/modules/extras.py +++ b/modules/extras.py @@ -150,26 +150,26 @@ def run_modelmerger(primary_model_name, secondary_model_name, interp_method, int alpha = alpha * alpha * (3 - (2 * alpha)) return theta0 + ((theta1 - theta0) * alpha) - if os.path.exists(secondary_model_name): - secondary_model_filename = secondary_model_name - secondary_model_name = os.path.splitext(os.path.basename(secondary_model_name))[0] - else: - secondary_model_filename = 'models/' + secondary_model_name + '.ckpt' - if os.path.exists(primary_model_name): primary_model_filename = primary_model_name primary_model_name = os.path.splitext(os.path.basename(primary_model_name))[0] else: primary_model_filename = 'models/' + primary_model_name + '.ckpt' - print(f"Loading {secondary_model_filename}...") - model_0 = torch.load(secondary_model_filename, map_location='cpu') + if os.path.exists(secondary_model_name): + secondary_model_filename = secondary_model_name + secondary_model_name = os.path.splitext(os.path.basename(secondary_model_name))[0] + else: + secondary_model_filename = 'models/' + secondary_model_name + '.ckpt' print(f"Loading {primary_model_filename}...") - model_1 = torch.load(primary_model_filename, map_location='cpu') - - theta_0 = model_0['state_dict'] - theta_1 = model_1['state_dict'] + primary_model = torch.load(primary_model_filename, map_location='cpu') + + print(f"Loading {secondary_model_filename}...") + secondary_model = torch.load(secondary_model_filename, map_location='cpu') + + theta_0 = primary_model['state_dict'] + theta_1 = secondary_model['state_dict'] theta_funcs = { "Weighted Sum": weighted_sum, @@ -180,7 +180,7 @@ def run_modelmerger(primary_model_name, secondary_model_name, interp_method, int print(f"Merging...") for key in tqdm.tqdm(theta_0.keys()): if 'model' in key and key in theta_1: - theta_0[key] = theta_func(theta_0[key], theta_1[key], interp_amount) + theta_0[key] = theta_func(theta_0[key], theta_1[key], (float(1.0) - interp_amount)) # Need to reverse the interp_amount to match the desired mix ration in the merged checkpoint for key in theta_1.keys(): if 'model' in key and key not in theta_0: @@ -188,7 +188,7 @@ def run_modelmerger(primary_model_name, secondary_model_name, interp_method, int output_modelname = 'models/' + primary_model_name + '_' + str(interp_amount) + '-' + secondary_model_name + '_' + str(float(1.0) - interp_amount) + '-' + interp_method.replace(" ", "_") + '-merged.ckpt' print(f"Saving to {output_modelname}...") - torch.save(model_0, output_modelname) + torch.save(primary_model, output_modelname) print(f"Checkpoint saved.") return "Checkpoint saved to " + output_modelname -- cgit v1.2.3 From 4c9c2a67028097dd41a46d6b6fa52d7831e359bf Mon Sep 17 00:00:00 2001 From: Bernard Maltais Date: Tue, 27 Sep 2022 22:16:25 -0400 Subject: -Fix interp_amount rounding in filename -Sort list of checkpoints in list --- modules/extras.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'modules/extras.py') diff --git a/modules/extras.py b/modules/extras.py index f6704382..b8ebc619 100644 --- a/modules/extras.py +++ b/modules/extras.py @@ -186,9 +186,9 @@ def run_modelmerger(primary_model_name, secondary_model_name, interp_method, int if 'model' in key and key not in theta_0: theta_0[key] = theta_1[key] - output_modelname = 'models/' + primary_model_name + '_' + str(interp_amount) + '-' + secondary_model_name + '_' + str(float(1.0) - interp_amount) + '-' + interp_method.replace(" ", "_") + '-merged.ckpt' + output_modelname = 'models/' + primary_model_name + '_' + str(round(interp_amount,2)) + '-' + secondary_model_name + '_' + str(round((float(1.0) - interp_amount),2)) + '-' + interp_method.replace(" ", "_") + '-merged.ckpt' print(f"Saving to {output_modelname}...") torch.save(primary_model, output_modelname) print(f"Checkpoint saved.") - return "Checkpoint saved to " + output_modelname + return "Checkpoint saved to " + output_modelname \ No newline at end of file -- cgit v1.2.3 From fe2f0e172923d4714cfef137400841f9ff7541fc Mon Sep 17 00:00:00 2001 From: Bernard Maltais Date: Wed, 28 Sep 2022 08:52:46 -0400 Subject: Adding support for inverse sigmoid interpolation --- modules/extras.py | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'modules/extras.py') diff --git a/modules/extras.py b/modules/extras.py index b8ebc619..15de033a 100644 --- a/modules/extras.py +++ b/modules/extras.py @@ -150,6 +150,12 @@ def run_modelmerger(primary_model_name, secondary_model_name, interp_method, int alpha = alpha * alpha * (3 - (2 * alpha)) return theta0 + ((theta1 - theta0) * alpha) + # Inverse Smoothstep (https://en.wikipedia.org/wiki/Smoothstep) + def inv_sigmoid(theta0, theta1, alpha): + import math + alpha = 0.5 - math.sin(math.asin(1.0 - 2.0 * alpha) / 3.0) + return theta0 + ((theta1 - theta0) * alpha) + if os.path.exists(primary_model_name): primary_model_filename = primary_model_name primary_model_name = os.path.splitext(os.path.basename(primary_model_name))[0] @@ -174,6 +180,7 @@ def run_modelmerger(primary_model_name, secondary_model_name, interp_method, int theta_funcs = { "Weighted Sum": weighted_sum, "Sigmoid": sigmoid, + "Inverse Sigmoid": inv_sigmoid } theta_func = theta_funcs[interp_method] -- cgit v1.2.3 From 791808c890fc2fc3417f827f8744765970b23f13 Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Thu, 29 Sep 2022 00:21:54 +0300 Subject: correctly list and display model names for #1261 --- modules/extras.py | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) (limited to 'modules/extras.py') diff --git a/modules/extras.py b/modules/extras.py index 15de033a..dcc0148c 100644 --- a/modules/extras.py +++ b/modules/extras.py @@ -6,7 +6,7 @@ from PIL import Image import torch import tqdm -from modules import processing, shared, images, devices +from modules import processing, shared, images, devices, sd_models from modules.shared import opts import modules.gfpgan_model from modules.ui import plaintext_to_html @@ -156,17 +156,8 @@ def run_modelmerger(primary_model_name, secondary_model_name, interp_method, int alpha = 0.5 - math.sin(math.asin(1.0 - 2.0 * alpha) / 3.0) return theta0 + ((theta1 - theta0) * alpha) - if os.path.exists(primary_model_name): - primary_model_filename = primary_model_name - primary_model_name = os.path.splitext(os.path.basename(primary_model_name))[0] - else: - primary_model_filename = 'models/' + primary_model_name + '.ckpt' - - if os.path.exists(secondary_model_name): - secondary_model_filename = secondary_model_name - secondary_model_name = os.path.splitext(os.path.basename(secondary_model_name))[0] - else: - secondary_model_filename = 'models/' + secondary_model_name + '.ckpt' + primary_model_filename = sd_models.checkpoints_list[primary_model_name].filename + secondary_model_filename = sd_models.checkpoints_list[secondary_model_name].filename print(f"Loading {primary_model_filename}...") primary_model = torch.load(primary_model_filename, map_location='cpu') @@ -180,7 +171,7 @@ def run_modelmerger(primary_model_name, secondary_model_name, interp_method, int theta_funcs = { "Weighted Sum": weighted_sum, "Sigmoid": sigmoid, - "Inverse Sigmoid": inv_sigmoid + "Inverse Sigmoid": inv_sigmoid, } theta_func = theta_funcs[interp_method] @@ -193,9 +184,11 @@ def run_modelmerger(primary_model_name, secondary_model_name, interp_method, int if 'model' in key and key not in theta_0: theta_0[key] = theta_1[key] - output_modelname = 'models/' + primary_model_name + '_' + str(round(interp_amount,2)) + '-' + secondary_model_name + '_' + str(round((float(1.0) - interp_amount),2)) + '-' + interp_method.replace(" ", "_") + '-merged.ckpt' + filename = primary_model_name + '_' + str(round(interp_amount,2)) + '-' + secondary_model_name + '_' + str(round((float(1.0) - interp_amount),2)) + '-' + interp_method.replace(" ", "_") + '-merged.ckpt' + output_modelname = os.path.join(shared.cmd_opts.ckpt_dir, filename) + print(f"Saving to {output_modelname}...") torch.save(primary_model, output_modelname) print(f"Checkpoint saved.") - return "Checkpoint saved to " + output_modelname \ No newline at end of file + return "Checkpoint saved to " + output_modelname -- cgit v1.2.3 From 7acfaca05a13352a7d86d281db6ad64dfd9350e0 Mon Sep 17 00:00:00 2001 From: AUTOMATIC <16777216c@gmail.com> Date: Thu, 29 Sep 2022 00:59:44 +0300 Subject: update lists of models after merging them in checkpoints tab support saving as half --- modules/extras.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'modules/extras.py') diff --git a/modules/extras.py b/modules/extras.py index dcc0148c..9a825530 100644 --- a/modules/extras.py +++ b/modules/extras.py @@ -13,6 +13,7 @@ from modules.ui import plaintext_to_html import modules.codeformer_model import piexif import piexif.helper +import gradio as gr cached_images = {} @@ -140,7 +141,7 @@ def run_pnginfo(image): return '', geninfo, info -def run_modelmerger(primary_model_name, secondary_model_name, interp_method, interp_amount): +def run_modelmerger(primary_model_name, secondary_model_name, interp_method, interp_amount, save_as_half): # Linear interpolation (https://en.wikipedia.org/wiki/Linear_interpolation) def weighted_sum(theta0, theta1, alpha): return ((1 - alpha) * theta0) + (alpha * theta1) @@ -156,14 +157,14 @@ def run_modelmerger(primary_model_name, secondary_model_name, interp_method, int alpha = 0.5 - math.sin(math.asin(1.0 - 2.0 * alpha) / 3.0) return theta0 + ((theta1 - theta0) * alpha) - primary_model_filename = sd_models.checkpoints_list[primary_model_name].filename - secondary_model_filename = sd_models.checkpoints_list[secondary_model_name].filename + primary_model_info = sd_models.checkpoints_list[primary_model_name] + secondary_model_info = sd_models.checkpoints_list[secondary_model_name] - print(f"Loading {primary_model_filename}...") - primary_model = torch.load(primary_model_filename, map_location='cpu') + print(f"Loading {primary_model_info.filename}...") + primary_model = torch.load(primary_model_info.filename, map_location='cpu') - print(f"Loading {secondary_model_filename}...") - secondary_model = torch.load(secondary_model_filename, map_location='cpu') + print(f"Loading {secondary_model_info.filename}...") + secondary_model = torch.load(secondary_model_info.filename, map_location='cpu') theta_0 = primary_model['state_dict'] theta_1 = secondary_model['state_dict'] @@ -178,17 +179,23 @@ def run_modelmerger(primary_model_name, secondary_model_name, interp_method, int print(f"Merging...") for key in tqdm.tqdm(theta_0.keys()): if 'model' in key and key in theta_1: - theta_0[key] = theta_func(theta_0[key], theta_1[key], (float(1.0) - interp_amount)) # Need to reverse the interp_amount to match the desired mix ration in the merged checkpoint + theta_0[key] = theta_func(theta_0[key], theta_1[key], (float(1.0) - interp_amount)) # Need to reverse the interp_amount to match the desired mix ration in the merged checkpoint + if save_as_half: + theta_0[key] = theta_0[key].half() for key in theta_1.keys(): if 'model' in key and key not in theta_0: theta_0[key] = theta_1[key] + if save_as_half: + theta_0[key] = theta_0[key].half() - filename = primary_model_name + '_' + str(round(interp_amount,2)) + '-' + secondary_model_name + '_' + str(round((float(1.0) - interp_amount),2)) + '-' + interp_method.replace(" ", "_") + '-merged.ckpt' + filename = primary_model_info.model_name + '_' + str(round(interp_amount, 2)) + '-' + secondary_model_info.model_name + '_' + str(round((float(1.0) - interp_amount), 2)) + '-' + interp_method.replace(" ", "_") + '-merged.ckpt' output_modelname = os.path.join(shared.cmd_opts.ckpt_dir, filename) print(f"Saving to {output_modelname}...") torch.save(primary_model, output_modelname) + sd_models.list_models() + print(f"Checkpoint saved.") - return "Checkpoint saved to " + output_modelname + return ["Checkpoint saved to " + output_modelname] + [gr.Dropdown.update(choices=sd_models.checkpoint_tiles()) for _ in range(3)] -- cgit v1.2.3 From 66fed8ffb8e75bbed4e36ae39c30df686b477677 Mon Sep 17 00:00:00 2001 From: safentisAuth Date: Thu, 29 Sep 2022 02:50:34 +0300 Subject: Add custom name and try-except --- modules/extras.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'modules/extras.py') diff --git a/modules/extras.py b/modules/extras.py index 9a825530..c2543fcf 100644 --- a/modules/extras.py +++ b/modules/extras.py @@ -141,7 +141,7 @@ def run_pnginfo(image): return '', geninfo, info -def run_modelmerger(primary_model_name, secondary_model_name, interp_method, interp_amount, save_as_half): +def run_modelmerger(primary_model_name, secondary_model_name, interp_method, interp_amount, save_as_half, custom_name): # Linear interpolation (https://en.wikipedia.org/wiki/Linear_interpolation) def weighted_sum(theta0, theta1, alpha): return ((1 - alpha) * theta0) + (alpha * theta1) @@ -190,6 +190,7 @@ def run_modelmerger(primary_model_name, secondary_model_name, interp_method, int theta_0[key] = theta_0[key].half() filename = primary_model_info.model_name + '_' + str(round(interp_amount, 2)) + '-' + secondary_model_info.model_name + '_' + str(round((float(1.0) - interp_amount), 2)) + '-' + interp_method.replace(" ", "_") + '-merged.ckpt' + filename = filename if custom_name == '' else (custom_name + '.ckpt') output_modelname = os.path.join(shared.cmd_opts.ckpt_dir, filename) print(f"Saving to {output_modelname}...") -- cgit v1.2.3