171 lines
4.9 KiB
Python
171 lines
4.9 KiB
Python
# From https://github.com/cubiq/ComfyUI_IPAdapter_plus
|
|
|
|
from ..enums import StableDiffusionVersion, TransformerIDResult
|
|
|
|
|
|
def calc_weights(
|
|
weight_type: str,
|
|
weight: float,
|
|
sd_version: StableDiffusionVersion,
|
|
weight_composition: float = 0.0,
|
|
):
|
|
layers = sd_version.transformer_block_num
|
|
return [
|
|
_calc_weight(
|
|
weight_type,
|
|
weight,
|
|
sd_version,
|
|
t_idx,
|
|
weight_composition,
|
|
)
|
|
for t_idx in range(layers)
|
|
]
|
|
|
|
|
|
def _calc_weight(
|
|
weight_type: str,
|
|
weight: float,
|
|
sd_version: StableDiffusionVersion,
|
|
t_idx: int,
|
|
weight_composition: float = 0.0,
|
|
):
|
|
is_sdxl = sd_version == StableDiffusionVersion.SDXL
|
|
layers = sd_version.transformer_block_num
|
|
ids: TransformerIDResult = sd_version.transformer_ids
|
|
block_type = [i for i in ids.to_list() if i.transformer_index == t_idx][
|
|
0
|
|
].block_type.value
|
|
if weight_type == "normal":
|
|
return weight
|
|
elif weight_type == "ease in":
|
|
weight = weight * (0.05 + 0.95 * (1 - t_idx / layers))
|
|
elif weight_type == "ease out":
|
|
weight = weight * (0.05 + 0.95 * (t_idx / layers))
|
|
elif weight_type == "ease in-out":
|
|
weight = weight * (0.05 + 0.95 * (1 - abs(t_idx - (layers / 2)) / (layers / 2)))
|
|
elif weight_type == "reverse in-out":
|
|
weight = weight * (0.05 + 0.95 * (abs(t_idx - (layers / 2)) / (layers / 2)))
|
|
elif weight_type == "weak input":
|
|
weight = weight * 0.2 if block_type == "input" else weight
|
|
elif weight_type == "weak middle":
|
|
weight = weight * 0.2 if block_type == "middle" else weight
|
|
elif weight_type == "weak output":
|
|
weight = weight * 0.2 if block_type == "output" else weight
|
|
elif weight_type == "strong middle":
|
|
weight = (
|
|
weight * 0.2
|
|
if (block_type == "input" or block_type == "output")
|
|
else weight
|
|
)
|
|
elif weight_type.startswith("style transfer"):
|
|
weight = (
|
|
{6: weight}
|
|
if is_sdxl
|
|
else {
|
|
0: weight,
|
|
1: weight,
|
|
2: weight,
|
|
3: weight,
|
|
9: weight,
|
|
10: weight,
|
|
11: weight,
|
|
12: weight,
|
|
13: weight,
|
|
14: weight,
|
|
15: weight,
|
|
}
|
|
)
|
|
elif weight_type.startswith("composition"):
|
|
weight = {3: weight} if is_sdxl else {4: weight * 0.25, 5: weight}
|
|
elif weight_type == "strong style transfer":
|
|
if is_sdxl:
|
|
weight = {
|
|
0: weight,
|
|
1: weight,
|
|
2: weight,
|
|
4: weight,
|
|
5: weight,
|
|
6: weight,
|
|
7: weight,
|
|
8: weight,
|
|
9: weight,
|
|
10: weight,
|
|
}
|
|
else:
|
|
weight = {
|
|
0: weight,
|
|
1: weight,
|
|
2: weight,
|
|
3: weight,
|
|
6: weight,
|
|
7: weight,
|
|
8: weight,
|
|
9: weight,
|
|
10: weight,
|
|
11: weight,
|
|
12: weight,
|
|
13: weight,
|
|
14: weight,
|
|
15: weight,
|
|
}
|
|
elif weight_type == "style and composition":
|
|
if is_sdxl:
|
|
weight = {3: weight_composition, 6: weight}
|
|
else:
|
|
weight = {
|
|
0: weight,
|
|
1: weight,
|
|
2: weight,
|
|
3: weight,
|
|
4: weight_composition * 0.25,
|
|
5: weight_composition,
|
|
9: weight,
|
|
10: weight,
|
|
11: weight,
|
|
12: weight,
|
|
13: weight,
|
|
14: weight,
|
|
15: weight,
|
|
}
|
|
elif weight_type == "strong style and composition":
|
|
if is_sdxl:
|
|
weight = {
|
|
0: weight,
|
|
1: weight,
|
|
2: weight,
|
|
3: weight_composition,
|
|
4: weight,
|
|
5: weight,
|
|
6: weight,
|
|
7: weight,
|
|
8: weight,
|
|
9: weight,
|
|
10: weight,
|
|
}
|
|
else:
|
|
weight = {
|
|
0: weight,
|
|
1: weight,
|
|
2: weight,
|
|
3: weight,
|
|
4: weight_composition,
|
|
5: weight_composition,
|
|
6: weight,
|
|
7: weight,
|
|
8: weight,
|
|
9: weight,
|
|
10: weight,
|
|
11: weight,
|
|
12: weight,
|
|
13: weight,
|
|
14: weight,
|
|
15: weight,
|
|
}
|
|
else:
|
|
raise Exception("Unrecognized weight type!")
|
|
|
|
if isinstance(weight, dict):
|
|
return weight.get(t_idx, 0.0)
|
|
else:
|
|
return weight
|