Replace channel_rescale cfg drift method with sharpen, which well, ends up sharpening the image.

Allow negative cfg drift multiplier
Allow negative rescale cfg phi
Allow negative spectral mod multiplier
Change default sharpness to 0
Move divisive norm to take place as the last step.
This commit is contained in:
Clybius
2024-01-02 15:56:10 -06:00
parent 2f25a1608a
commit 4eab09a3fa
+29 -29
View File
@@ -615,17 +615,16 @@ def center_0channel(tensor): #https://birchlabs.co.uk/machine-learning#combating
tensor[:, [3]] += torch.copysign(torch.pow(torch.abs(mean_3), 1.5), mean_3)
return tensor# - tensor.mean(dim=(2,3), keepdim=True)
def channel_rescale(tensor):
"""Rescales channels according to a vision I had."""
std_dev_0 = tensor[:, [0, 1, 2, 3]].std()
mean_0 = tensor[:, [0, 1, 2, 3]].mean()
mean_3 = tensor[:, [3]].mean()
def channel_sharpen(tensor):
"""Centers on 0 to combat CFG drift."""
flattened = tensor.flatten(2)
flat_std = flattened.std(dim=(2)).unsqueeze(2).expand(flattened.shape)
flattened *= flat_std
flattened -= flattened.mean(dim=(2)).unsqueeze(2).expand(flattened.shape)
flattened /= flat_std
tensor = flattened.unflatten(2, tensor.shape[2:])
return tensor
tensor[:, [0, 1, 2, 3]] = (tensor[:, [0, 1, 2, 3]] - mean_0) / std_dev_0
std_dev = tensor[:, [3]].std()
tensor[:, [3]] = (tensor[:, [3]] * std_dev) + mean_3
return tensor# - tensor.mean(dim=(2,3), keepdim=True)
def center_012channel(tensor): #https://birchlabs.co.uk/machine-learning#combating-mean-drift-in-cfg
"""Centers on 0 to combat CFG drift."""
@@ -878,24 +877,24 @@ class ModelSamplerLatentMegaModifier:
@classmethod
def INPUT_TYPES(s):
return {"required": { "model": ("MODEL",),
"sharpness_multiplier": ("FLOAT", {"default": 2.0, "min": -100.0, "max": 100.0, "step": 0.1}),
"sharpness_multiplier": ("FLOAT", {"default": 0.0, "min": -100.0, "max": 100.0, "step": 0.1}),
"sharpness_method": (["anisotropic", "joint-anisotropic", "gaussian", "cas"], ),
"tonemap_multiplier": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 100.0, "step": 0.01}),
"tonemap_method": (["reinhard", "reinhard_perchannel", "arctan", "quantile", "gated", "cfg-mimic", "spatial-norm"], ),
"tonemap_percentile": ("FLOAT", {"default": 100.0, "min": 0.0, "max": 100.0, "step": 0.005}),
"contrast_multiplier": ("FLOAT", {"default": 0.0, "min": -100.0, "max": 100.0, "step": 0.1}),
"combat_method": (["subtract", "subtract_channels", "subtract_median", "rescale_channels"], ),
"combat_cfg_drift": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.01}),
"rescale_cfg_phi": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.01}),
"combat_method": (["subtract", "subtract_channels", "subtract_median", "sharpen"], ),
"combat_cfg_drift": ("FLOAT", {"default": 0.0, "min": -10.0, "max": 10.0, "step": 0.01}),
"rescale_cfg_phi": ("FLOAT", {"default": 0.0, "min": -10.0, "max": 10.0, "step": 0.01}),
"extra_noise_type": (["gaussian", "uniform", "perlin", "pink", "green", "pyramid"], ),
"extra_noise_method": (["add", "add_scaled", "speckle", "cads", "cads_rescaled", "cads_speckle", "cads_speckle_rescaled"], ),
"extra_noise_multiplier": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 100.0, "step": 0.1}),
"extra_noise_lowpass": ("INT", {"default": 100, "min": 0, "max": 1000, "step": 1}),
"divisive_norm_size": ("INT", {"default": 127, "min": 1, "max": 255, "step": 1}),
"divisive_norm_multiplier": ("FLOAT", {"default": 0, "min": 0, "max": 1, "step": 0.01}),
"divisive_norm_multiplier": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.01}),
"spectral_mod_mode": (["hard_clamp", "soft_clamp"], ),
"spectral_mod_percentile": ("FLOAT", {"default": 5.0, "min": 0.0, "max": 50.0, "step": 0.01}),
"spectral_mod_multiplier": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 15.0, "step": 0.01}),
"spectral_mod_multiplier": ("FLOAT", {"default": 0.0, "min": -15.0, "max": 15.0, "step": 0.01}),
"affect_uncond": (["None", "Sharpness"], ),
"dyn_cfg_augmentation": (["None", "dyncfg-halfcosine", "dyncfg-halfcosine-mimic"], ),
},
@@ -1115,7 +1114,7 @@ class ModelSamplerLatentMegaModifier:
print("Could not tonemap, for the method was not found.")
# Spectral Modification
if spectral_mod_multiplier > 0:
if spectral_mod_multiplier > 0 or spectral_mod_multiplier < 0:
#alpha = 1. - (timestep / 999.0)[:, None, None, None].clone() # Get alpha multiplier, lower alpha at high sigmas/high noise
#alpha = spectral_mod_multiplier# User-input and weaken the strength so we don't annihilate the latent.
match spectral_mod_mode:
@@ -1144,16 +1143,9 @@ class ModelSamplerLatentMegaModifier:
x_rescaled = x_cfg * (ro_pos / ro_cfg)
x_final = rescale_cfg_phi * x_rescaled + (1.0 - rescale_cfg_phi) * x_cfg
if divisive_norm_multiplier > 0:
alpha = 1. - (timestep / 999.0)[:, None, None, None].clone()
alpha ** 0.025 # Alpha might as well be 1, but we want to protect the beginning steps (?).
alpha *= divisive_norm_multiplier
high_noise = divisive_normalization(x_final, (divisive_norm_size * 2) + 1)
x_final = high_noise * alpha + x_final * (1.0 - alpha)
if combat_cfg_drift > 0:
alpha = (1. - (timestep / 999.0)[:, None, None, None].clone()) * 2
alpha ** 0.025 # Alpha might as well be 1, but we want to protect the beginning steps (?).
if combat_cfg_drift > 0 or combat_cfg_drift < 0:
alpha = (1. - (timestep / 999.0)[:, None, None, None].clone())
alpha ** 0.025 # Alpha might as well be 1, but we want to protect the first steps (?).
alpha = alpha.clamp_(max=1)
match combat_method:
case "subtract":
@@ -1165,10 +1157,18 @@ class ModelSamplerLatentMegaModifier:
case "subtract_median":
combat_drift_func = center_latent_median
alpha *= combat_cfg_drift
case "rescale_channels":
combat_drift_func = center_rescale
case "sharpen":
combat_drift_func = channel_sharpen
alpha *= combat_cfg_drift
x_final = combat_drift_func(x_final) * alpha + x_final * (1.0 - alpha) # Mix the modified latent with the existing latent by the alpha
if divisive_norm_multiplier > 0:
alpha = 1. - (timestep / 999.0)[:, None, None, None].clone()
alpha ** 0.025 # Alpha might as well be 1, but we want to protect the beginning steps (?).
alpha *= divisive_norm_multiplier
high_noise = divisive_normalization(x_final, (divisive_norm_size * 2) + 1)
x_final = high_noise * alpha + x_final * (1.0 - alpha)
return x_input - (x - x_final * sigma / (sigma * sigma + 1.0) ** 0.5) # General formula for CFG. uncond + (cond - uncond) * cond_scale