Hier mal meinen auf alter Photographie getrimmter SteamPunk Shot:
Dann möchte ich euch an einem Beispiel meinen Workflow mit zwei KSamplern und einem Latent Upscale by zeigen (damit ich hier nicht nur Bilder, sondern auch mal Infos teile ^^ evtl. kann hier der eine oder andere was damit anfangen für seinen Workflow ^^).
Da ich das selbst recherchiert habe, hat das natürlich keinen Anspruch auf Vollständigkeit oder hundertprozentige Richtigkeit. Ich gebe es in meinen eigenen Worten so wieder, wie ich es verstehe und wie ich es durch Testen gelernt habe.
Ich fange mal grob von vorne an ^^
Am Anfang legt man mit dem Latent die Größe des „verborgenen Raums“ fest (kommt wohl aus dem Lateinischen von latere = verborgen sein). Der Raum hat zu dem Zeitpunkt nur eine Größe, aber noch keinen Inhalt.
Durch den Seed, den man im KSampler angibt, wird dieser Raum mit einem zufälligen Rauschen gefüllt. Dieses Rauschen wird durch den KSampler, das Modell, den Prompt sowie die gewählten Sampler und Scheduler in eine Ordnung gebracht. Das am Ende ausgespuckte Latent wird dann mit dem VAE-Decoder aus dem verborgenen Raum in den sichtbaren gehievt, sprich in Pixel umgewandelt, die ein Bild ergeben.
Das ist das klassische Setup, das die meisten nutzen. Hängt man noch ein LoRA dazwischen, kommt ein weiterer Faktor hinzu, der das Rauschen beeinflusst usw.
Ich gehe bei mir aber einen Schritt weiter und nehme das fertige Latent, jage es durch ein Latent Upscale by mit 1.5x und vergrößere so den latenten Raum. Je nach Upscale-Methode verändert man damit das bereits geordnete Rauschen.
Wenn ich das nun durch einen weiteren KSampler jage, muss der neue Raum wieder gefüllt werden. Das heißt, mit dem gleichen Prompt und den gleichen Einstellungen käme mit einem hohen Denoise-Wert am Ende ein ganz anderes Bild heraus. Das hängt nämlich stark vom gewählten Denoise-Wert ab. Bei einem Denoise-Wert von 1.0 berechnet man 100 % des Latents beim Sampeln neu. Bei einem Denoise-Wert von 0.50 beeinflusst man nur 50 % des latenten Raums.
Bei meinem Setup wähle ich beim ersten Sampler einen Denoise-Wert von 1.0, damit er den ganzen Raum neu berechnen darf. Damit habe ich im Grunde bereits ein fertiges Bild. Beim ersten Step ist es also immer sinnvoll, auf einen Denoise-Wert von 1.0 zu stellen.
Die Standard-Workflows sind hier meist zu Ende, aber ich gehe mit einem zweiten KSampler noch weiter.
Ich nehme das bereits geordnete Latent und übergebe es an den zweiten KSampler, diesmal mit einem Denoise-Wert von 0.50. So erlaube ich ihm, das Bild weiter zu verändern, aber eben nur zu 50 %. Dadurch bleibt die Grundstruktur des ersten Bildes erhalten, während durch die zusätzlichen Schritte feine Details hinzugefügt werden.
Normalerweise reichen bei einem Turbo-Modell etwa 8 Schritte aus, um ein brauchbares Bild zu bekommen. Jeder weitere Schritt kann mehr Details bringen, aber zu viele Steps können auch Chaos anrichten. Das habe ich durch Ausprobieren herausgefunden, und je nach Modell muss man diesen Wert anpassen.
Erklärung der einzelnen Regler, so wie ich sie verstehe:
Seed: legt das Basis-Rauschen fest.
Steps: legt fest, wie viele Berechnungsschritte der KSampler machen soll
CFG (Classifier Free Guidance): legt fest, wie streng oder frei der KSampler den Prompt auslegt (über das positive und negative Conditioning)
Sampler: ist der verwendete Algorithmus zur Berechnung der Ordnung. Je nach Wahl beeinflusst er auch die Berechnungsdauer.
Scheduler: beeinflusst die Reduktion des Rauschens über die Schritte hinweg.
Denoise: legt fest, wie viel Einfluss der KSampler auf das Latent nehmen darf.
Das ist alles nur grob beschrieben und erklrät im großen und ganzen aber was ganz grob so passiert.
Hier sind nun die Einstellungen, die ich verwende (ich nutze einen Fixed Seed, um bei ähnlichen Beschreibungen immer ein ähnliches Ergebnis zu erhalten):
KSampler 1:
Seed: 1976, Steps: 14, CFG: 1.0, Sampler: exp_heun_2_x0_sde, Scheduler: sgm_uniform, Denoise: 1.0
KSampler 2:
Seed: 1976, Steps: 8, CFG: 1.2, Sampler: exp_heun_2_x0_sde, Scheduler: sgm_uniform, Denoise: 0.5
Nachfolgend werde ich nun denselben Prompt als Bild generieren und hier posten:
Einmal nur Step 1, Step 2 ohne Upscaler, Step 2 nearest_exact, Step 2 bilinear, Step 2 area, Step 2 bicubic und Step 2 bislerp.
Step 1 erstelle ich mit einer Größe von 1344x768. Das zweite Bild (also Step 2 ohne Upscaler) wird die gleiche Größe haben. Alle Upscale-Varianten dnnach haben dann durch die 1.5x Vergrößerung eine Auflösung von 2016x1152 Pixeln.
Hier Kurz ein überblick über meinen Workflow:
Step 1:
Ich fange mal von links nach rechts an:
Links ist eine Custom Node für Technical Settings, die ich nutze, um immer wiederkehrende Anweisungen wie wide angle, eye level, dramatic lighting etc. mitzugeben. Auch habe ich dort noch ein Feld für manuelle Anweisungen oder für LoRA Activation Words. Diese Infos werden dann mit meinem Prompt übergeben. Ich kann diese aber auch leer lassen, so wie auf dem Bild.
Das Zweite ist meine Custom Positive Prompt Node, die eigentlich aus Bequemlichkeit entstanden ist. Im Endeffekt ist es eine Positive Node für Conditioning. Für den Komfort kann ich hier einfach zwischen dem Prompt vom AI Prompter und dem klassischen Prompt hin und her schalten. Dafür gibt es den Eingang für den AI Prompt, das ist ein String, genau wie bei den Technical Settings. Der CLIP wird aus Komfort durchgeschliffen und dann kommen die Outputs für Positive Conditioning und Conditioning Zero raus. Die Turbo-Modelle können meist eh nicht viel mit Negativ-Prompts anfangen. Dann wird noch der gesamte Prompt mit den Technical Settings als String ausgegeben, weil ich den mit abspeichere.
Darunter ist ein Subgraph, wo ich aus Bequemlichkeit die ganzen Loader zusammengefasst habe, ebenso wie die Node für das Model Shift.
In der Mitte ist eine kleine Custom Node, die nur ein Passthrough ist. Die habe ich für die Ordnung geschrieben. Das heißt, dass ich nicht immer alle Anschlüsse suchen muss, wo es hingeht, sondern einfach einen zentralen Punkt habe, wo ich die Basis-Modelle anschließen kann.
In der Mitte oben habe ich eine kleine Passthrough Node, mit der ich über den Prompt als String und den CLIP den Token Count sowie die Länge des Prompts in Worten ermittle. Das ist nicht zwingend notwendig, aber je nach Modell sieht man hier direkt, ob man in einen Bereich kommt, wo der Prompt Bleed beginnt oder Chaos entsteht, weil der CLIP Text Interpreter es nicht mehr verarbeiten kann. Ich nutze das für mich, wenn das Endresultat nicht stimmt, um an dieser Stelle gezielt Kürzungen vorzunehmen und näher an den offiziellen Token Count zu kommen. KREA2 zum Beispiel kann offiziell 512 Token verarbeiten, aber ich habe festgestellt, dass man mit einem bf16 Text Interpreter auch mal an die 600 bis 650 Token gehen kann und es im Detail immer noch passt. Wobei manchmal auch das vertauschen eines Satzes mit einem anderen auch die Ergbnisse beineflussen kann.
Rechts oben ist ein LoRA Stack Loader aus einem anderen Paket, das macht es der Übersicht wegen einfacher, wenn man mehrere LoRAs verwendet.
Darunter ist ein Subgraph, der nur den KSampler und den VAE Decode enthält sowie ein paar Reroute Nodes. Im Endeffekt ist das nur eine Zusammenfassung für die Ordnung und das Durchschleifen von Model, VAE, CLIP, Positiv und Negativ. Latent und Image sind hier die Ergebnisse des KSamplers.
Darunter befindet sich meine Custom Latent Node. Das ist ebenfalls nur aus Bequemlichkeit: Hier sind feste Auflösungen hinterlegt und mit dem Switch kann ich das Seitenverhältnis einfach vertauschen. Dann noch klassisch die Batch Size.
Ganz rechts ist eine Custom Passthrough Node, einfach um einen zentralen Anlaufpunkt zum Abgreifen zu haben. Das ist praktisch für einen zweiten Step, Refiner etc. Das Ganze macht meinen Workflow somit modular. Der Aufbau bringt primär Ordnung rein.
Step 2:
Links sieht man noch die Custom Passthrough Node von Step 1.
Dann kommt ein Subgraph, der nur ein Passthrough ist, um einen zentralen Eingang zu haben (Ordnung und so ^^).
Dann eine Custom Upscale Latent By Node, die im Endeffekt die normale Node ist, wie es sie gibt, nur mit einem On/Off-Schalter. Ihr fragt warum? Aus Bequemlichkeit. Wenn er auf Off steht, kann ich ohne Probleme die ganze Gruppe bypassen und wieder aus dem Bypass holen, ohne dass ich hier den Upscale manuell bypassen muss.
Dann kommt wieder ein LoRA Stack Loader, der nur für den zweiten Step ist.
Dann folgt ein Subgraph für den KSampler, den ich allerdings um ein zusätzliches Textfeld ergänzt habe. So kann ich dem Conditioning noch einmal Anweisungen hinzufügen, um eventuell nochmal Details wie Haut, Haare, Augen, Beleuchtung usw. anzupassen. Das ist aktuell noch Beta, weil die Ergebnisse nicht immer genau das bringen, was ich möchte.
Danach kommt noch ein zentraler Ausgang für die Modularität.
Ich könnte diese sichtbare Gruppe einfach nochmal kopieren und hinten anhängen und hätte direkt einen Step 3.
Nun der Abschluss wieder von links nach rechts:
Links eine Custom Node für das einfache Benennen der finalen Datei, wobei der Filter nicht nur eine Kategorie festlegt, sondern auch direkt den passenden Ordner. Den Filter kann ich mittels einer ini-Datei im Custom-Node-Ordner nach meinem Belieben erweitern.
Dann wieder eine Custom Passthrough Node für die Ordnung.
Dann ein Subgraph, in dem die Save Node aus einem anderen Paket steckt, damit ich Bilder als JXL speichern kann, weil diese einfach weniger Speicher brauchen. Da ich in der JXL keine Metainformationen speichere, speichere ich dort eine Mini-PNG mit der längsten Seite von 55 Pixeln, damit ich ein Not-Backup mit Workflow habe. Auch werden hier die Infos gesammelt und mit der genanten Save Node speichere ich eine JSON-Datei, in der alle Informationen nochmal als Text zusammengefasst werden.
Darunter ist eine klassische Upscale Node, wo ich dann nochmal einen Image Upscaler zuschalten könnte.
Dann habe ich eine Custom Preview Node, die ich erstellt habe. Die erkennt automatisch, welcher Anschluss vorhanden ist, und speichert dann das Bild. Sind beide angeschlossen, kann ich mit dem Schalter bestimmen, welches Bild ich speichern möchte. Das Feld für den Scale habe ich, weil die Vorschaubilder in PNG zwischengespeichert werden. Bilder mit 2K+ belegen ja entsprechend Speicher, und das kann ich damit veringern.
So, nun die Bildreihe hierzu für euch zum Vergleichen:
Nur Step 1:
Step 2 - ohne Upscaler:
Step2 - nearest exact:
Step2 - bilinear:
Step2 - area:
Step2 - bicubic:
Step2 - bislerb:
So, ich hoffe, so ein Post stört euch nicht, und viel Spaß beim Finden der kleinen Details, die sich ändern. Kleiner Tipp: Achtet mal auf die Brille, die Werkzeuge links und die Kleinigkeiten im Vordergrund, um nur ein paar zu nennen.
[UpDate]
Als Update noch mal die Szene als nativ 2016x1152 erstellt.
Step1 - 2016x1152 mit 8 Steps:
Step1 - 2016x1152 mit 14 Steps:
Step1 - 2016x1152 mit 14 Steps:
Die Bilder zeigen, warum ich sie eher in einer kleineren Auflösung von 1344x768 erstelle und dann mit Latent Upscale by mit dem Faktor 1,5x noch einmal einen zweiten KSampler füttere, für die letzten Details.
KREA2 im Turbo-Modell hat schnell die Tendenz, Schweiß, Feuchtigkeit und übertriebene Highlights zu generieren. Das liegt meist daran, dass man über die Größe der Bilder der Trainingsdaten hinausgeht, oft liegen diese bei 1024x1024, was ca. 1 Megapixel ist.
Von daher habe ich für mich den Weg eines zweistufigen Setups gewählt, um Bilder größer als FHD ohne oder mit weniger solcher Anomalien zu generieren.
Der Vollständigkeit halber noch der verwendete Prompt:
Photorealistic steampunk workshop scene, a 45-year-old Irish woman with a soft hourglass silhouette dominating the center of the frame, her face colossal and front-facing, green eyes peering through thin copper-framed round spectacles with a small magnifier lens attached to the right rim, red hair swept into a messy high bun secured by a small golden hair clip, a delicate golden septum hoop ring nestled in the bridge of her nose, warm amber workshop lighting catching the sheen on her skin, freckled complexion, focused and intent expression with slightly parted lips, tweezers held in her right hand pinching a tiny brass gear component, her left hand steadying the miniature diorama resting on a heavy wooden workbench cluttered with scattered tools, oil-stained rags, and small brass fittings. The diorama in front of her is a meticulous steampunk race track diorama, a looping silver rail track with tiny riveted iron posts and copper piping, two miniature figures in full steampunk racing silks and goggles perched on foreheads seated side by side on ornate steampunk racing motorcycles with exposed pistons, riveted copper plating, and spinning propeller exhausts, the first rider a tiny version of the Irish woman in a deep burgundy leather racing jacket with brass buttons and a fur-lined collar, the second rider a tiny Asian woman in a forest-green leather racing jacket with silver trim, both motorcycles trailing a blue-luminous power core glowing beneath the chassis on the first bike and a green-luminous power core on the second, each fitted with a rear-facing jet drive nozzle emitting a faint heat-haze, the track detailed with a miniature open toolbox with tiny wrenches and spools, a neat stack of miniature motorcycle tires with treaded rubber texture, two small brass fuel canisters with etched labels, and a tiny checkered finish-line flag on a riveted pole, the overall diorama sitting on a workbench in a dim workshop with copper lamps, glass vials, and brass gears in the soft-focus background, shallow depth of field keeping the woman's face and the diorama in crisp focus while the workshop recedes into warm bokeh, photorealistic 85mm lens, soft key light from a desk lamp above and to the left, warm tungsten fill, cool teal rim light from the diorama cores, rich color grading with deep amber and copper tones, subtle film grain, the very bottom center of the frame bearing a tiny neon-teal stylized handwritten artist signature reading CountSero with a decorative flowing underline, (45-year-old Irish woman: 1.3) (face composition: 1.2) steampunk diorama detail.
Dann habe ich den Prompt nochmal bei Duck.ai mittels GPT(LUNA?) erstellt (hier hat man ein tägliches kostenloses Kontingent ohne Account) :
Dann möchte ich anmerken, dass KREA2 wohl die Tendenz hat, den Anfang des Prompts stärker zu bewerten als den Rest, sprich die Aufmerksamkeit sinkt, desto weiter hinten etwas im Prompt steht. Krea2 kann normal was um die 512 Token verarbeiten, das heißt je nachdem was man schreibt sind das ca. 300 bis 400 Worte. Aber aus Erfahrung habe ich gelernt, dass hier auch mal 600 bis 650 Token durchgehen ohne großes Prompt Bleeding (das Verhalten, Farben auf andere Objekte zu übertragen, Objekte zu vertauschen usw.). Um das immer im Auge zu behalten, habe ich eine Node für mich, die die Wörter zählt und mittels des verwendeten CLIP Text Interpreters den Token Count ermittelt.
Auch wenn man sicher unter den Token Count bleibt, wie hier bei 512 Token für KREA2, garantiert es aber nicht, dass ein Bild sauber erstellt wird. Manchmal reicht ein Komma an einer anderen Stelle oder das Umstellen von Promptelementen, um ganz andere Ergebnisse im Bild zu erhalten.
Da ich mich nach dem Ausprobieren auf KREA2 festgelegt habe, kann ich hier nicht sagen, wie es bei anderen Modellen ist, das kann man aber sicher leicht recherchieren.
Auch mag KREA2 einen Prompt, der aus einem Fluss ist und nicht aus einer Aneinanderreihung von Worten oder Textblöcken besteht. Ja, es funktioniert, aber man kann durch diesen längeren Prompt wesentlich mehr Einfluss auf das gewünschte Ergebnis nehmen.
KREA2 ist gerne nah dran an einer Person, weil man etwas mehr Raum hinten dran angeben kann wie "(extrem) Wide Angle" oder "Full Body". Ein weiterer Trick ist, den Raum als Erstes zu beschreiben. Wenn man den Raum an den Anfang setzt, bekommt er mehr Gewichtung und bringt mehr Tiefe. Es funktioniert nicht immer, aber es ist einen Versuch wert, wenn man eine größere Szene haben möchte.
So, das war mal kurz so meine Erfahrung mit KREA2 und zu meinem Workflow.
Ok, wenn ihr Fragen habt, versuche ich die gern zu beantworten^^
[UpDate 2]
Zur Vollständikeit noch meine System-Infos:
CPU: Intel i7-14700
RAM: 32GB RAM
GPU: Radeon RX 9070 16GB VRAM
OS: Fedorra 44 KDE Plasma
Hier noch die Auslastung beim Rendern:
GPU auf anschlag wie es sein soll und die CPU selber ist nur mit 1-3 Threads belastet.