240630 - ComfyUI Inpainting
Spis Treści #
- Co próbujemy zrobić?
- Tło - substrat
- Wynik
- Nowe węzły - Math Nodes
- Wpływ parametrów na rysunek
- Prosty Inpainting by dodać kota
- Wpierw - jak dodać maskę do rysunku?
- Niewielka zmiana - usprawnijmy serwerownię; węzeł 'Set Latent Noise Mask' i drugi KSampler.
- Dodajemy kota
- Czyszczący KSampler

1. Co próbujemy zrobić? #
Poziom wizji jest dość prosty / fajny. Jako, że Kić wyjechała na obóz TaiChi, chcę coś TAKIEGO:

- Na froncie radosny kot biegnący z PRAWEJ strony na LEWĄ stronę
- W tle po prawej mroczna kraina grzybów z komputerami, po lewej ćwiczący tai-chi ludzie
2. Tło - substrat #
2.1. Wynik #
Żeby zrobić tło wykorzystamy techniki, które już do tej pory wykorzystaliśmy. Area Composition.
Wynik:

Jak to zrobiliśmy?
2.2. Nowe węzły - Math Nodes #
Oki - mamy szerokość rysunku typu 1024. Ustawiamy połówkę po lewej (512) i offset po prawej (512). Nakładamy overlap ręcznie.
I człowieka szlag trafia, gdy chce mieć SZERSZY rysunek. Wszystkie offsety musi liczyć z palca.
Po to są węzły matematyczne:
- Ustawiamy wartość, np. "szerokość rysunku: 1024"
- Modyfikujemy Empty Latent Image by szerokość stała się wejściem
- Łączymy je

I to właśnie zrobiliśmy robiąc nasz substrat (patrzcie na żółte węzły):

Czyli:
- Ustalmy szerokość obrazka. W tym wypadku to jest Picture Width o wartości 1536 (pamiętajcie, MUSI być wielokrotność ósemek!)
- Ustalmy overlap, czyli obszar, gdzie obie części się połączą embeddingami. W moim wypadku, 80.
- Mając szerokość i overlap, LEWA część to szerokość/2 + overlap a PRAWA część zaczyna się na szerokość/2 - overlap.
- w ten sposób overlap jest wspólny dla obu części rysunku
I ostatecznie całkowity pipeline budujący substrat (z jednym KSamplerem; nie potrzeba było dwóch przez siłę ConditioningSetAreaStrength który wyczyścił obrazek):

Nie ma tu nic dziwnego ani nic nowego. Wszystko to zrobiliśmy w poprzednim dokumencie. To tylko kwestia kalibracji prompta i stylu (na poziomie embeddingów, nie ma tu lory ani controlneta).
W czym jest ciekawa obserwacja:
2.3. Wpływ parametrów na rysunek #
Co ciekawe, w wypadku tego rysunku ogromną różnicą na plus było podniesienie wagi kompozycji całościowej i obniżenie (docelowo) do 0.8 wag kompozycji cząstkowych:

Też jak weźmiemy wynikowy rysunek i zobaczymy co się stanie jak zwiększę overlap (część "wspólną" między lewym rysunkiem i prawym):

To, że to jakkolwiek działa to jest ogromna zasługa tego ostatniego prompta który je integruje w jedną całość. Jeśli chciałbym mieć bardzo różnorodne style, popatrzcie co się dzieje jak ustawię:
overlap na 80 / 0 / 240 oraz wagę kompozytora na 0.1:

Niewykluczone, że powinienem zrobić coś w ten deseń - niski overlap i niska waga kompozytora - ale to z czym teraz pracuję wizualnie podoba mi się bardziej.
3. Prosty Inpainting by dodać kota #
3.1. Wpierw - jak dodać maskę do rysunku? #
Muszę być w stanie zrobić maskę i pokazać który fragment rysunku ma zostać zmieniony:

I oznaczam odpowiednią część:

Oki. Przejdźmy do konkretów.
3.2. Niewielka zmiana - usprawnijmy serwerownię; węzeł 'Set Latent Noise Mask' i drugi KSampler. #
Nie muszę używać specjalnych modeli ani zaawansowanych technik, by móc zrobić drobne zmiany. Zacznijmy od czegoś prostego - usprawnijmy serwerownię po prawej stronie rysunku.
- Podpinam ten sam model, ten sam CLIP, tą samą VAE itp.
- Wycinam maską fragment, który chcę mieć zmieniony
- Podaję rysunek z wyciętą maską do węzła 'Set Latent Noise Mask'
- Ustawiam denoise na dość wysoki (~0.8, ale nie 1.0; 1.0 zastąpi i nie uwzględni oryginału)
- Zmieniam prompt na to co chcę zobaczyć
- Zapewniam ten sam styl
(mógłbym LEPIEJ ustawić maskę, ale wtedy by nie było widać co dokładnie robię)
I znowu, mam kilka strategii do wyboru:
- Zrobić to JEDNYM krokiem i JEDNYM KSamplerem
- Zrobić to w kilku krokach i kilkoma KSamplerami
Na potrzeby tutoriala zrobię to jednym ruchem, ale da się wieloma (tak jak by dostać idealny wynik możemy próbować po znalezieniu fajnego seeda eksperymentować z różnymi wartościami denoisingu w KSamplerze).
Czyli jak to zrobić (wyjaśnię pipeline za moment):

- BRĄZOWY KSampler po lewej (oznaczony jako "zbudował oryginalny obrazek po prawej") to ten, który zrobił nasz oryginał.
- SZARY KSampler jest oznaczony jako "inpaintuje zaawansowany grzybo-komputer". To nasz KSampler, który zrobił ten obrazek jaki widzimy (dół lewo)
- LATENT output z brązowego KSamplera wchodzi do 'Set Latent Noise Mask'.
- ten output to oryginalny rysunek, ale w latent space. On jeszcze nie jest zdekodowany do pikseli.
- Do oryginalnego rysunku dodałem maskę. Ta maska outputem MASK została dodana do 'Set Latent Noise Mask'.
- 'Set Latent Noise Mask' trafia do szarego KSamplera jako latent_image. To pokazuje mu na czym ma pracować.
- Denoise jest ustawiony około 0.85. Dlaczego?

W końcu stanęło na tym, co mi się spodobało najbardziej:

3.3. Dodajemy kota #
Na razie nie rozwiązałem jeszcze węzła VAE Inpainting, nie rozwiązałem też problemu inpainting modelu. Oki. Na razie.
Więc robię to tak samo jak powyżej. Dojdę do tego. Ale jeszcze nie dziś.

Wynik:

4. Czyszczący KSampler #
Rysunek który mamy ma dość... specyficzne artefakty:

By to naprawić, puszczę jeszcze jednego KSamplera całościowego kilka razy. Na którymś inkremencie zadziała. To naprawi nam cienie, usunie te uszkodzenia i defekty i ogólnie da nam fajny rysunek :-).
Takie czyszczenie robimy tak:

- Czyszczenie ma 0.4-0.6 (im lepszy rysunek tym mniej zmian czyli w stronę na 0.4). Nie chcemy DODAWAĆ nowych rzeczy. Chcemy USUNĄĆ problemy.
- Mi się sprawdza wyższe cfg i wystarczająco dobry opis sceny; model sam naprawi rzeczy o których nie mówiłem
- Można scenę naprawiać wielokrotnie i ją troszkę ewoluować w ten sposób
Wynik czyszczenia:

Wielokrotny pipeline czyszczenia:

I wynik ostateczny:

(tak, mogę jeszcze doczyścić rzeczy inpaintingiem i kolejnymi ksamplerami, ale naprawdę mi się już nie chce; lub photoshopem, ale tego nie umiem)
Ostateczny pipeline:
