Skip to main content
RD EZ

240627 - ComfyUI Conditioning

Spis Treści #

  1. Dwa słowa teorii
    1. Koncept: Conditioning
  2. Co próbujemy i da się zrobić?
  3. Wyjaśnienie kluczowych węzłów
    1. KSampler
      1. Parametr CFG
      2. Samplery i schedulery - jak z nimi pracować i jakie mają reguły
    2. Węzły Strategii Conditioning
      1. Czym są te węzły?
      2. Conditioning Concat
      3. Conditioning Combine
      4. Conditioning Average
      5. Conditioning SetTimestep Range
  4. Linki powiązane

[.]

1. Dwa słowa teorii #

1.1. Koncept: Conditioning #

2. Co próbujemy i da się zrobić #

Zacznijmy wizualnie (wszystkie rysunki niżej są na tym samym seedzie):

Mamy węzeł CLIP Text Encoding, czyli prompt. Ten prompt (zielony) mówi: "crystal mushroom statue on top of a beautiful, sleepy ocean, nebula in the background".

To ten rysunek który widać po prawej.

[.]

Mamy inny węzeł CLIP Text Encoding. Ten prompt (żółty) mówi: "glittering, iridescent, red green yellow reflective crystals sparkling with light".

Znowu widać rysunek po prawej.

[.]

Chcemy połączyć conditioning. Dodać w jakiś sposób aspekty "odbijających się kryształów" na naszego grzyba. Do tego służą węzły Conditioning.

Tutaj nakładamy aspekt odbijających się kryształów na grzyba - popatrzcie na kolejność węzłów w niebieskim (conditioning_to i conditioning_from):

[.]

A tutaj mamy efekt na odwrót:

[.]

Czyli te węzły pozwalają na łączenie aspektów różnych rzeczy.

3. Wyjaśnienie kluczowych węzłów #

3.1. KSampler #

3.1.1. Parametr CFG #

To implikuje, że np. ten sam rysunek na wyższym cfg zachowa się inaczej niż na niższym. Znowu, demonstracja niżej:

CFG 2, czyli "model decyduje jak to ma wyglądać, prompt jest mniej istotny":

[.]

CFG 12, czyli "prompt absolutnie dominuje":

[.]

CFG 20 (ZDECYDOWANIE za dużo, tak wysoko się nie robi, bo się "przegrzewa" / "przepala"):

[.]

3.1.2. Samplery i schedulery - jak z nimi pracować i jakie mają reguły #

Tu ważne jest to, by wiedzieć 2 rzeczy:

Sampler - scheduler

Znowu, popatrzmy na wyniki.

Wychodzimy od tego (sampler: heun, scheduler: normal, cfg: 8):

[.]

Tu jest różnica między Heun a Euler; Euler jest "smoother", bardziej rozmyte.

[.]

Tu jest większa różnica (dpm_2_ancestral vs hein):

[.]

A tu zmieniłem jedynie scheduler na ddim_uniform:

[.]

A tu, by pokazać, zmieniłem ilość iteracji (steps) z 30 do 80. Kompozycja zmieniła się bardziej niż w wypadku euler - normal.

[.]

Punkt odniesienia: Euler - normal, 80 steps (powinno być podobne do referencji Heun - normal):

[.]

Oki. To już wszystko jasne :-). Możemy przejść do akcji.

3.2. Węzły Strategii Conditioning #

3.2.1. Czym są te węzły? #

Najpierw wyjaśnijmy koncept Clip Conditioning:

[.]

To, co nazywamy "Checkpoint" jest agregatem na 3 byty:

CLIP Text Encode bierze tekst i generuje z tego odpowiedni conditioning do generowania rysunku "kierowanego".

Teraz - możemy użyć specjalnych węzłów, by w odpowiedni sposób manipulować tymi wektorami embeddingowymi.

[Conditioning concat REF_001]

Idealny prompt (pogrubienie moje):

Różnice są trafiają do różnych strategii na tym samym seedzie.

Jakie mamy więc strategie?

3.2.2. Conditioning Concat #

Normalnie leci jeden wektor o długości 77 tokenów.

Ten węzeł działa tak:

[.]

Więc mamy następujący wynik (dla Euler Exponential 30 iteracji cfg 12 (by wzmocnić prompt)):

[.]

Lub dla prostszego promptu:

[.]

A teraz zrobimy porównanie dla spójnej sceny. Czyli:

[.]

Co ważne, jeśli to "ta sama scena", jesteśmy w stanie zachować wysoką spójność kompozycji między różnymi cfg. A jeśli scena jest różna, czasem nie wie co i jak dodać.

3.2.3. Conditioning Combine #

Normalnie leci jeden wektor o długości 77 tokenów.

[.]

To też sprawia, że w tym wypadku nie mówimy "co nakładamy na co" - po prostu nakładamy potem na siebie określone szumy.

Jak widać, to FAKTYCZNIE wygląda jak "płaskie inteligentne połączenie obu światów".

[.]

Dla niskiego cfg (3) mamy... coś, gdzie się pogubił:

[.]

To jeszcze lepiej widać dla prostszego promptu. Tu mamy taki wynik (cfg 12):

[.]

A przy niższym cfg się CAŁKOWICIE pogubił (cfg 3):

[.]

To pokazuje, że jeśli chcemy robić niskie cfg, WAŻNE jest by prompt miał ten sam kształt w obu połączeniach jeśli robimy Combine.

Zmieńmy ten prompt by to sprawdzić - powinien opisywać dość podobną scenę, ale w inny sposób:

[.]

Przy '3' utraciliśmy trochę strachu i aspekt ilustracji, ale jak widać - obecność "spójnej sceny" zdecydowanie pomogła w zachowaniu spójności logicznej.

3.2.4. Conditioning Average #

NO TEN TO JUŻ W OGÓLE DZIAŁA ZUPEŁNIE INACZEJ.

[.]

Ten węzeł ma nie tylko conditioning_to i conditioning_from, ale do tego jeszcze siłę sygnału (conditioning_to_strength).

Jak to wygląda - wpierw zbadajmy SKRAJNOŚCI:

Dla: siła sygnału 100% from: mushroom statue to: crystals

[.]

Dla: siła sygnału 0% from: mushroom statue to: crystals

[.]

Dla: siła sygnału 100% from: crystals to: mushroom statue

[.]

Jak widać, rysunek 1 i rysunek 3 są identyczne. Czyli kolejność "nie ma znaczenia" jeśli da się 50% :-). Chodzi o to które wektory embeddingów mają mieć jaką wagę per iteracja.

Spójrzmy na 50% (ważne: patrzcie na cfg!):

[.]

70%, czyli "from CRYSTAL MUSHROOMS... nakładamy na GLITTERING CRYSTALS" gdzie kryształy mają wagę 70% a grzyby tylko 30%:

[.]

30%, czyli całkowicie na odwrót. Nakładamy kryształowość na grzyby:

[.]

I na 10% - pomniejszy kryształowy aspekt nałożony na grzyby:

[.]

Widać mniej więcej jak działa ten węzeł.

Sprawdźmy go na kotach, na mocy 20%.

[.]

A teraz na mocy 50%

[.]

I na mocy 80%.

[.]

Jak widać, przy niskim cfg ten węzeł niewiele robi, wszystkie rysunki są podobne. Nie jest to dziwne - cfg określa jak dużą moc ma prompt a niski cfg mówi, że KSampler robi "po swojemu", prompt nie jest dlań aż tak ważny.

Wynik więc nie dziwi - Conditioning Average działa na przestrzeni modyfikacji Embeddings (wektorów).

3.2.5. Conditioning SetTimestep Range #

TEN TO JUŻ JEST W OGÓLE Z INNEGO ŚWIATA.

Oki - wiecie, że gdy obrazek się generuje, to on się odszumia.

[.]

Czyli mamy serię kroków (iteracji), które sukcesywnie robią szum. PIERWSZE kroki są ważniejsze niż późniejsze kroki, bo budują kształt tego, co jest generowane.

Wiedząc to co wiemy, popatrzmy na te węzły i przejdźmy przez to:

[.]

Popatrzcie na NIEBIESKIE węzły:

Ale mamy teraz dwa "zestawy" szumów. Musimy je połączyć. Dlatego łączymy je techniką COMBINE, która polega na łączeniu szumów.

Popatrzcie na jeszcze jeden wariant powyższego:

[.]

NAWET przy nędznym 30% - 70% mamy bardzo dużo lasu i bardzo mało miasta. Jeśli mamy rzeczy, które są "sprzeczne", zwykle to co jest wcześniej będzie dominować.

Wróćmy do problemu promptu z grzybami, gdzie nakładamy kryształy na grzyby:

Tu mamy zamknięcie jednego i otwarcie drugiego:

[.]

A tu zaczynamy od kształtu, ale od pewnego momentu generujemy oba obrazy jednocześnie:

[.]

Największą siłą jest możliwość zbudowania KSZTAŁTU i nałożenie na to czegoś nowego. Popatrzcie co się dzieje, jeśli dam pierwotny grzyb na pierwsze 20% a potem nakładam na to "obcy" kształt diamentów (w czym cfg 3 jest, jak zwykle, specyficzne):

[.]

4. Linki powiązane #