@ -159,24 +159,12 @@ def run_pnginfo(image):
return ' ' , geninfo , info
return ' ' , geninfo , info
def run_modelmerger ( primary_model_name , secondary_model_name , teritary_model_name , interp_method , interp_amount , save_as_half , custom_name ) :
def run_modelmerger ( primary_model_name , secondary_model_name , teritary_model_name , interp_method , multiplier , save_as_half , custom_name ) :
# Linear interpolation (https://en.wikipedia.org/wiki/Linear_interpolation)
def weighted_sum ( theta0 , theta1 , theta2 , alpha ) :
def weighted_sum ( theta0 , theta1 , theta2 , alpha ) :
return ( ( 1 - alpha ) * theta0 ) + ( alpha * theta1 )
return ( ( 1 - alpha ) * theta0 ) + ( alpha * theta1 )
# Smoothstep (https://en.wikipedia.org/wiki/Smoothstep)
def sigmoid ( theta0 , theta1 , theta2 , alpha ) :
alpha = alpha * alpha * ( 3 - ( 2 * alpha ) )
return theta0 + ( ( theta1 - theta0 ) * alpha )
# Inverse Smoothstep (https://en.wikipedia.org/wiki/Smoothstep)
def inv_sigmoid ( theta0 , theta1 , theta2 , alpha ) :
import math
alpha = 0.5 - math . sin ( math . asin ( 1.0 - 2.0 * alpha ) / 3.0 )
return theta0 + ( ( theta1 - theta0 ) * alpha )
def add_difference ( theta0 , theta1 , theta2 , alpha ) :
def add_difference ( theta0 , theta1 , theta2 , alpha ) :
return theta0 + ( theta1 - theta2 ) * ( 1.0 - alpha )
return theta0 + ( theta1 - theta2 ) * alpha
primary_model_info = sd_models . checkpoints_list [ primary_model_name ]
primary_model_info = sd_models . checkpoints_list [ primary_model_name ]
secondary_model_info = sd_models . checkpoints_list [ secondary_model_name ]
secondary_model_info = sd_models . checkpoints_list [ secondary_model_name ]
@ -198,9 +186,7 @@ def run_modelmerger(primary_model_name, secondary_model_name, teritary_model_nam
theta_2 = None
theta_2 = None
theta_funcs = {
theta_funcs = {
" Weighted Sum " : weighted_sum ,
" Weighted sum " : weighted_sum ,
" Sigmoid " : sigmoid ,
" Inverse Sigmoid " : inv_sigmoid ,
" Add difference " : add_difference ,
" Add difference " : add_difference ,
}
}
theta_func = theta_funcs [ interp_method ]
theta_func = theta_funcs [ interp_method ]
@ -213,7 +199,7 @@ def run_modelmerger(primary_model_name, secondary_model_name, teritary_model_nam
if t2 is None :
if t2 is None :
t2 = torch . zeros_like ( theta_0 [ key ] )
t2 = torch . zeros_like ( theta_0 [ key ] )
theta_0 [ key ] = theta_func ( theta_0 [ key ] , theta_1 [ key ] , t2 , ( 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 ] , t2 , multiplier )
if save_as_half :
if save_as_half :
theta_0 [ key ] = theta_0 [ key ] . half ( )
theta_0 [ key ] = theta_0 [ key ] . half ( )
@ -227,7 +213,7 @@ def run_modelmerger(primary_model_name, secondary_model_name, teritary_model_nam
ckpt_dir = shared . cmd_opts . ckpt_dir or sd_models . model_path
ckpt_dir = shared . cmd_opts . ckpt_dir or sd_models . model_path
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 = primary_model_info . model_name + ' _ ' + str ( round ( 1 - multiplier , 2 ) ) + ' - ' + secondary_model_info . model_name + ' _ ' + str ( round ( multiplier , 2 ) ) + ' - ' + interp_method . replace ( " " , " _ " ) + ' -merged.ckpt '
filename = filename if custom_name == ' ' else ( custom_name + ' .ckpt ' )
filename = filename if custom_name == ' ' else ( custom_name + ' .ckpt ' )
output_modelname = os . path . join ( ckpt_dir , filename )
output_modelname = os . path . join ( ckpt_dir , filename )