Tech
Größere Bilder in ComfyUI: ein Resizer für Z-Image Turbo und Flux.1-Dev
In den letzten beiden Beiträgen - erst Flux.1-Dev, dann Z-Image Turbo - kam am Ende jeweils ein Bild mit 1216x832 heraus. Das ist ganz nett, aber irgendwie eben auch ein bisschen klein. Als Hintergrundbild ist es nicht wirklich zu gebrauchen, spätestens auf einem 2K- oder 4K-Monitor sieht man das sofort.
Wir müssen also größere Bilder bekommen. Nur haben wir dabei schon gelernt: Die Standardmodelle - Z-Image Turbo genauso wie Flux.1-Dev - verarbeiten sauber ungefähr eine Million Bildpunkte. Einfach eine größere Leinwand ins Empty Latent Image eintragen bringt uns also nicht weiter, das Bild fällt dann auseinander.
Es gibt aber spezielle Upscale Models. Die vervierfachen in der Regel die Bildgröße. Und wenn man ein so vergrößertes Bild anschließend wieder verkleinert, gehen bei weitem nicht so viele Informationen verloren wie beim direkten Vergrößern. Und wenn man dann noch einen KSampler mit ganz kleinem denoise drüber laufen lässt, wird richtig was daraus.
Vorbereitungen
Damit der Workflow übersichtlich bleibt, schieben wir erst einmal alles, was mit dem Sampling zu tun hat, in einen Subgraph. Am Beispiel von Z-Image Turbo heißt das: die Nodes Load Diffusion Model, Empty Latent Image, KSampler, Load VAE und VAE Decode selektieren und dann über das Kontextmenü Convert to Subgraph aufrufen. Die selektierten Nodes werden damit zu einem einzigen Node zusammengefasst.
Öffnet man den Subgraph, kann man weitere Ein- und Ausgänge nach außen reichen - bei mir sind das positive, negative, unet_name sowie width und height, damit ich die Bildgröße weiterhin bequem auf der Hauptseite einstellen kann. Und nach außen gehen neben dem fertigen Bild auch VAE und MODEL - die brauchen wir gleich im Resizer noch einmal. Bei mir schaut der fertige Subgraph so aus:

Der Resizer
Jetzt fügen wir auf der Hauptseite wieder einige neue Nodes hinzu:
Load Upscale Model: Es gibt verschiedene Upscale Models. Ich habe mich für RealESRGAN_x4plus entschieden, das kann man hier bei Hugging Face herunterladen. Es gibt noch einige andere, mit denen habe ich bis jetzt aber noch nicht herumprobiert - was da die Unterschiede sind, schaue ich mir sicher irgendwann noch an.
Upscale Image (using model): Damit wird das Eingangsbild auf die vierfache Größe gebracht. Genau dafür sind Upscaler ja da. Man darf sich nicht wundern, dass man hier keine Zielgröße angeben kann - es wird wirklich immer vervierfacht. Die konkrete Größe kommt im nächsten Schritt.
Upscale Image: Hier gibt man nun die Ziel-Größe ein (ich habe mal 2560x1440 verwendet) und vor allem die upscale_method, die dabei zum Einsatz kommt. Die besten Ergebnisse hatte ich bisher mit dem lanczos-Algorithmus. Das hängt aber, glaube ich, auch ein bisschen vom gewünschten Bild ab. crop lasse ich auf disabled.
VAE Encode: Damit der KSampler wieder arbeiten kann, brauchen wir das Bild zurück im Latent-Raum - und dafür wieder unseren VAE. Da nehmen wir denselben wie beim ursprünglichen Samplen. Also nicht vergessen, den VAE aus dem Subgraph als Ausgang nach außen zu geben, damit man ihn wiederverwenden kann.
KSampler: Den kennen wir schon aus dem Hauptgraphen, und hier passiert jetzt wieder die Magie. Mit den steps kann man ruhig herumspielen, ich bin irgendwie bei 15 hängen geblieben. cfg ist bei diesen Workflows wie gehabt 1.0. Und jetzt der wichtige Punkt: denoise auf einen kleinen Wert stellen, 0.2 oder 0.3 sind vollkommen ausreichend. Damit steuert man, dass der Inhalt des Bildes möglichst nicht verändert wird - der Sampler soll ja nur die Details nachschärfen, nicht ein neues Motiv erfinden.
Auch noch wichtig: Als positiven und negativen Prompt verwenden wir genau die gleichen wie im Hauptschritt. Also ebenfalls entsprechend durchreichen. Das Modell übrigens auch - deshalb der MODEL-Ausgang am Sampler-Subgraph.
VAE Decode: wie gehabt, das Ergebnis wieder zurück in ein Pixelbild. Der Save Image-Node liegt bei mir außerhalb auf der Hauptseite, aber das ist Geschmackssache.
Das Ganze habe ich bei mir auch wieder in einen Subgraph gepackt, und es sieht jetzt so aus:

Und damit man den Rest auch noch sieht - hier mein Haupt-Workflow, der jetzt richtig aufgeräumt aussieht:

Verwendung
Startet man den kompletten Workflow, stellt man schnell fest, dass das Turbo-Modell gar nicht mehr so turbomäßig ist: Das Resizing braucht seine Zeit. Deshalb habe ich mir eine eigene Arbeitsweise angewöhnt.
Im Haupt-Workflow kann man den Resizer-Node überspringen, indem man ihn selektiert und Bypass auswählt. Der Node wird dann andersfarbig dargestellt und bei den folgenden Runs einfach nicht mehr durchlaufen - man ist also wieder so schnell unterwegs wie vorher und kann in Ruhe Motive durchwürfeln.
Habe ich dann ein Motiv gefunden, das mir gefällt, ziehe ich das Bild aus den Assets in den Arbeitsbereich. Damit wird genau der Workflow geladen, mit dem das Bild erstellt wurde.
Und jetzt der ganz wichtige Schritt: den Seed des Samplers auf fixed stellen. Damit wird immer derselbe Seed verwendet, und es kommt entsprechend immer dasselbe Bild heraus. Dann nehme ich den Bypass vom Resizer weg - und bekomme genau dieses Motiv, nur eben durch den Resizer geschickt.
Fazit
Aus 1216x832 mach 2560x1440, ohne dass das Bild matschig wird - und ohne dass man dem Modell mehr Bildpunkte zumutet, als es sauber verarbeiten kann. Der Umweg über einen Upscaler, das Verkleinern auf die Wunschgröße und einen zweiten KSampler-Durchlauf mit kleinem denoise ist dafür überraschend simpel.
Und der Nebeneffekt gefällt mir fast noch besser: Durch die beiden Subgraphen ist mein Haupt-Workflow endlich wieder überschaubar, und mit dem Bypass-Trick habe ich beide Welten - schnelles Ausprobieren und, wenn es sich lohnt, das große Bild.