Compare commits

...

54 Commits

Author SHA1 Message Date
55dfcfc792 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-04-22 06:43:07 -05:00
93cebc336b Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-04-15 07:03:07 -05:00
5d70923d51 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-04-11 22:48:23 -05:00
b5d02452bc Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-04-08 06:06:25 -05:00
8564159677 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-04-07 16:49:25 -05:00
3bff9abae0 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-04-07 07:24:19 -05:00
72351a7aea Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-04-06 18:05:56 -05:00
1ff569b56d Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-31 10:30:10 -05:00
8b1a24a92c Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-30 17:09:33 -05:00
ddaa28b226 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-28 22:45:20 -05:00
3d1164f94f Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-26 09:08:59 -05:00
7b78496509 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-25 12:19:23 -05:00
0e925be1c4 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-24 20:29:30 -05:00
da2577620d Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-24 14:56:04 -05:00
ac6fbee866 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-23 17:51:51 -05:00
fe5f6ac3cf Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-23 06:25:10 -05:00
a78aff4016 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-22 06:45:08 -05:00
c4f5ff2b15 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-19 19:44:13 -05:00
3584605d5f Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-16 06:29:47 -05:00
46cc20ad94 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-14 18:14:38 -05:00
ca9a29b960 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-14 08:31:45 -05:00
93a0f36472 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-14 06:15:39 -05:00
f21062f144 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-13 11:19:10 -05:00
44b863e5de Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-13 08:50:05 -05:00
938700d2f3 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-12 06:18:15 -05:00
a12558f947 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-11 23:04:17 -06:00
37189721fc Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-10 22:25:18 -06:00
9eba24f7ab Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-10 12:35:15 -06:00
9f8f85e922 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-10 07:29:30 -06:00
ba5ef93b5d Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-09 06:08:34 -06:00
733361735b Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-07 08:29:13 -06:00
09751a7c97 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-06 20:19:37 -06:00
40a84c29d0 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-06 16:17:14 -06:00
2471643226 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-06 13:39:24 -06:00
1103e49d3e Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-06 06:00:32 -06:00
1417d33188 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-05 22:16:44 -06:00
c4c531fa65 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-05 18:06:54 -06:00
a91dddcbe1 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-05 16:50:48 -06:00
c619a8a026 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-05 05:55:14 -06:00
2690c9f28b Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-04 16:44:37 -06:00
2c9ec0baae Fixed typo. 2023-03-03 20:33:37 -06:00
9ec6fbfee0 Updated from main. 2023-03-03 20:28:03 -06:00
4765e707bf Merge remote-tracking branch 'origin/main' into JPPhoto-symmetry-enhancements 2023-03-03 20:26:11 -06:00
c9eec1e576 Merge remote-tracking branch 'origin/main' into JPPhoto-symmetry-enhancements 2023-03-03 20:14:09 -06:00
65e33962ec Preparing for merge with main 2023-03-03 19:47:48 -06:00
e880754745 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-03-03 10:43:57 -06:00
d186c8fde5 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-02-28 20:13:33 -06:00
e9f1b5e3b1 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-02-27 12:48:33 -06:00
33411ec79e Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-02-26 20:41:40 -06:00
43a8352958 Merge remote-tracking branch 'origin/JPPhoto-symmetry-enhancements' into JPPhoto-symmetry-enhancements 2023-02-26 18:01:03 -06:00
c0f259173d Cleaned up and refactored new symmetry. 2023-02-26 18:00:51 -06:00
a48610598a Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-02-26 06:09:06 -06:00
9d97b106b0 Merge branch 'main' into JPPhoto-symmetry-enhancements 2023-02-25 19:00:22 -06:00
bb6772498a Add symmetry types and a new symmetry implementation. 2023-02-25 09:05:49 -06:00

View File

@ -1,3 +1,4 @@
from enum import Enum
from contextlib import contextmanager
from dataclasses import dataclass
from math import ceil
@ -6,6 +7,7 @@ from typing import Any, Callable, Dict, Optional, Union
import numpy as np
import torch
from diffusers.models.cross_attention import AttnProcessor
from einops import einops
from typing_extensions import TypeAlias
from invokeai.backend.globals import Globals
@ -31,12 +33,17 @@ ModelForwardCallback: TypeAlias = Union[
]
SymmetryType = Enum('SymmetryType', ['MIRROR', 'FADE'])
@dataclass(frozen=True)
class PostprocessingSettings:
threshold: float
warmup: float
h_symmetry_time_pct: Optional[float]
v_symmetry_time_pct: Optional[float]
symmetry_type: Optional[SymmetryType] = None
class InvokeAIDiffuserComponent:
@ -529,25 +536,44 @@ class InvokeAIDiffuserComponent:
):
v_symmetry_time_pct = None
width = latents.shape[3]
height = latents.shape[2]
dev = latents.device.type
dtype = latents.dtype
symmetry_type = postprocessing_settings.symmetry_type or SymmetryType.FADE
latents.to(device="cpu")
def make_ramp(ease_in: int, total: int) -> torch.Tensor:
ramp1 = torch.linspace(start=1.0, end=0.5, steps=ease_in, device=dev)
ramp2 = torch.linspace(start=0.5, end=1.0, steps=total - ease_in, device=dev)
ramp = torch.cat((ramp1, ramp2))
return ramp
if (
h_symmetry_time_pct != None
and self.last_percent_through < h_symmetry_time_pct
and percent_through >= h_symmetry_time_pct
):
# Horizontal symmetry occurs on the 3rd dimension of the latent
width = latents.shape[3]
x_flipped = torch.flip(latents, dims=[3])
latents = torch.cat(
[
latents[:, :, :, 0 : int(width / 2)],
x_flipped[:, :, :, int(width / 2) : int(width)],
],
dim=3,
)
if symmetry_type is SymmetryType.MIRROR:
latents = torch.cat(
[
latents[:, :, :, 0 : int(width / 2)],
x_flipped[:, :, :, int(width / 2) : int(width)],
],
dim=3,
)
elif symmetry_type is SymmetryType.FADE:
apply_width = width // 2
# Create a linear ramp so the middle gets perfect symmetry but the edges retain their original latents
ramp = make_ramp(ease_in=apply_width, total=width)
fade1 = einops.repeat(tensor=ramp, pattern='m -> 1 4 k m', k=height).to(latents.device).type(dtype)
fade0 = 1 - fade1
# Multiply the crossover region to retain details and avoid a "muddy" appearance
multiplier = (fade1 * fade0) * 1.25 + 1
latents = ((latents * fade1) + (x_flipped * fade0)) * multiplier
if (
v_symmetry_time_pct != None
@ -555,15 +581,24 @@ class InvokeAIDiffuserComponent:
and percent_through >= v_symmetry_time_pct
):
# Vertical symmetry occurs on the 2nd dimension of the latent
height = latents.shape[2]
y_flipped = torch.flip(latents, dims=[2])
latents = torch.cat(
[
latents[:, :, 0 : int(height / 2)],
y_flipped[:, :, int(height / 2) : int(height)],
],
dim=2,
)
if symmetry_type is SymmetryType.MIRROR:
latents = torch.cat(
[
latents[:, :, 0 : int(height / 2)],
y_flipped[:, :, int(height / 2) : int(height)],
],
dim=2,
)
elif symmetry_type is SymmetryType.FADE:
apply_height = height // 2
# Create a linear ramp so the middle gets perfect symmetry but the edges retain their original latents
ramp = make_ramp(ease_in=apply_height, total=height)
fade1 = einops.repeat(tensor=ramp, pattern='m -> 1 4 m k', k=width).to(latents.device).type(dtype)
fade0 = 1 - fade1
# Multiply the crossover region to retain details and avoid a "muddy" appearance
multiplier = (fade1 * fade0) * 1.25 + 1
latents = ((latents * fade1) + (y_flipped * fade0)) * multiplier
self.last_percent_through = percent_through
return latents.to(device=dev)