Dies sind benutzerdefinierte Knoten für die native Implementierung von ComfyUI
Mein Beitrag beschränkt sich auf die ComfyUI-Anpassung und der gesamte Dank geht an die Autoren der Artikel.
16. Mai 2024. Interne Überarbeitung zur Verbesserung der Kompatibilität mit anderen Knoten. RAUNet ist implementiert.
12. Mai 2024. CutForInpaint-Knoten, siehe Beispiel.
11. Mai 2024. Bildstapel ist implementiert. Sie können BrushNet sogar zum AnimateDiff vid2vid-Workflow hinzufügen, aber sie funktionieren nicht zusammen – es handelt sich um unterschiedliche Modelle und beide versuchen, UNet zu patchen. Einige weitere Beispiele hinzugefügt.
6. Mai 2024. Das PowerPaint v2-Modell ist implementiert. Nach der Aktualisierung wird Ihr Workflow wahrscheinlich nicht mehr funktionieren. Keine Panik! Überprüfen Sie end_at
Parameter von BrushNode. Wenn er gleich 1 ist, ändern Sie ihn in eine große Zahl. Weitere Informationen zu Parametern finden Sie im Abschnitt „Verwendung“ weiter unten.
2. Mai 2024. BrushNet SDXL ist live. Es bedarf jedoch einer positiven und negativen Konditionierung, daher ändert sich der Arbeitsablauf ein wenig, siehe Beispiel.
28. April 2024. Noch eine Überarbeitung, bitte entschuldigen Sie die Unannehmlichkeiten. Aber jetzt ist BrushNet in ComfyUI integriert. Der berühmte IPAdapter Plus von cubiq funktioniert jetzt mit BrushNet! Ich hoffe... :) Bitte melden Sie alle Fehler, die Sie gefunden haben.
18. April 2024. Komplette Überarbeitung, keine benutzerdefinierten diffusers
mehr. Es ist möglich, LoRA-Modelle zu verwenden.
11. April 2024. Erstes Commit.
Klonen Sie das Repo in das Verzeichnis custom_nodes
und installieren Sie die Anforderungen:
git clone https://github.com/nullquant/ComfyUI-BrushNet.git
pip install -r requirements.txt
Checkpoints von BrushNet können hier heruntergeladen werden.
Der Prüfpunkt in segmentation_mask_brushnet_ckpt
stellt Prüfpunkte bereit, die auf BrushData trainiert wurden, das zuvor segmentiert wurde (Masken haben die gleiche Form von Objekten). Das random_mask_brushnet_ckpt
bietet ein allgemeineres Cckpt für zufällige Maskenformen.
segmentation_mask_brushnet_ckpt
und random_mask_brushnet_ckpt
enthalten BrushNet für SD 1.5-Modelle, während segmentation_mask_brushnet_ckpt_sdxl_v0
und random_mask_brushnet_ckpt_sdxl_v0
für SDXL enthalten.
Sie sollten die Dateien diffusion_pytorch_model.safetensors
in Ihrem models/inpaint
Ordner ablegen. Sie können auch den Ordner inpaint
in Ihrer extra_model_paths.yaml
angeben.
Für PowerPaint sollten Sie drei Dateien herunterladen. Sowohl diffusion_pytorch_model.safetensors
als auch pytorch_model.bin
von hier sollten in Ihrem models/inpaint
Ordner abgelegt werden.
Außerdem benötigen Sie das SD1.5-Text-Encoder-Modell model.safetensors
. Sie können es von hier oder von einem anderen Ort aus mitnehmen. Sie können auch die fp16-Version verwenden. Es sollte in Ihrem models/clip
-Ordner abgelegt werden.
Dies ist eine Struktur meines models/inpaint
Ordners:
Bei Ihnen kann es anders sein.
Nachfolgend finden Sie ein Beispiel für den vorgesehenen Arbeitsablauf. Der Workflow für das Beispiel befindet sich im Verzeichnis „example“.
Arbeitsablauf
Arbeitsablauf
Arbeitsablauf
Manchmal haben Inferenz und VAE das Bild beschädigt, daher müssen Sie das Inpaint-Bild mit dem Original-Workflow mischen. Nach dem Inpainting sieht man im ersten Bild verschwommenen und gebrochenen Text und wie ich ihn reparieren kann.
Arbeitsablauf
ControlNet Canny Edge
Arbeitsablauf
Arbeitsablauf
Zum Hochskalieren sollten Sie das Basismodell und nicht BrushNet verwenden. Das Gleiche gilt für die Konditionierung. Eine latente Hochskalierung zwischen BrushNet und KSampler funktioniert nicht oder führt zu seltsamen Ergebnissen. Diese Einschränkungen sind auf die Struktur von BrushNet und seinen Einfluss auf UNet-Berechnungen zurückzuführen.
Arbeitsablauf
Wenn Sie OOM-Probleme haben, können Sie Evolved Sampling von AnimateDiff-Evolved verwenden:
Arbeitsablauf
Legen Sie in den Kontextoptionen context_length auf die Anzahl der Bilder fest, die in den VRAM geladen werden können. Bilder werden in Blöcken dieser Größe verarbeitet.
Arbeitsablauf
Wenn Sie mit einem großen Bild arbeiten und Ihre Inpaint-Maske klein ist, ist es besser, einen Teil des Bildes auszuschneiden, damit zu arbeiten und es dann wieder zu überblenden. Ich habe einen Knoten für einen solchen Workflow erstellt, siehe Beispiel.
Arbeitsablauf
Arbeitsablauf
Es ist oft schwierig, das Objekt vollständig zu entfernen, insbesondere wenn es vorne liegt:
Sie sollten versuchen, der negativen Eingabeaufforderung eine Objektbeschreibung hinzuzufügen und eine leere Szene zu beschreiben, wie hier:
dtype
, der Standardwert ist torch.float16
. Der Torch.d-Typ von BrushNet. Wenn Sie über eine alte GPU oder eine Karte der NVIDIA 16-Serie verfügen, versuchen Sie, zu torch.float32
zu wechseln. scale
ist standardmäßig 1,0: Die „Stärke“ von BrushNet. Die Ausgaben des BrushNet werden mit scale
multipliziert, bevor sie zum Residuum in der ursprünglichen Einheit addiert werden.start_at
ist standardmäßig 0: Schritt, bei dem das BrushNet mit der Anwendung beginnt.end_at
, standardmäßig 10000: Schritt, bei dem das BrushNet nicht mehr angewendet wird.Hier sind Beispiele für die Verwendung dieser beiden letzten Parameter.
CLIP
: PowerPaint-CLIP, der vom PowerPaintCLIPLoader-Knoten übergeben werden soll.fitting
: PowerPaint-Fitting-Grad.function
: PowerPaint-Funktion, Einzelheiten finden Sie auf der entsprechenden Seite.save_memory
: Wenn diese Option gesetzt ist, teilt das Aufmerksamkeitsmodul den Eingabetensor in Slices auf, um die Aufmerksamkeit in mehreren Schritten zu berechnen. Dies ist nützlich, um etwas Speicher zu sparen und im Gegenzug die Geschwindigkeit zu verringern. Wenn Ihnen der VRAM ausgeht oder Error: total bytes of NDArray > 2**32
auf dem Mac angezeigt wird, versuchen Sie, diese Option auf max
zu setzen.Bei der Verwendung bestimmter Netzwerkfunktionen empfehlen die Autoren von PowerPaint, Phrasen zur Eingabeaufforderung hinzuzufügen:
empty scene blur
empty scene
empty scene
Viele ComfyUI-Benutzer verwenden benutzerdefinierte Textgenerierungsknoten, CLIP-Knoten und viele andere Konditionierungen. Ich möchte nicht alle diese Knoten zerstören, deshalb habe ich keine sofortige Aktualisierung hinzugefügt und mich stattdessen auf Benutzer verlassen. Auch meine eigenen Experimente zeigen, dass diese Ergänzungen zu prompt nicht unbedingt notwendig sind.
Das latente Bild kann vom BrushNet-Knoten stammen oder nicht, es sollte jedoch die gleiche Größe wie das Originalbild haben (geteilt durch 8 im latenten Raum).
Sowohl die positive
als auch negative
Konditionierung in den BrushNet- und PowerPaint-Knoten werden für die interne Berechnung verwendet, dann aber einfach in die Ausgabe kopiert.
Beachten Sie, dass aufgrund seiner Struktur nicht alle Workflows und Knoten mit BrushNet funktionieren. Platzieren Sie Modelländerungen auch vor BrushNet-Knoten, nicht danach. Wenn Sie ein Modell benötigen, das nach der BrushNet-Inferenz mit einem Bild arbeiten soll, verwenden Sie Basis eins (siehe Upscale-Beispiel unten).
du_start
ist standardmäßig 0: Schritt, bei dem die Downsample-/Upsample-Größenänderung angewendet wird.du_end
ist standardmäßig 4: Schritt, bei dem die Downsample-/Upsample-Größenänderung nicht mehr angewendet wird.xa_start
ist standardmäßig 4: Schritt, bei dem die CrossAttention-Größenänderung angewendet wird.xa_end
, standardmäßig 10: Schritt, bei dem die CrossAttention-Größenänderung nicht mehr angewendet wird.Beispiele und Erklärungen finden Sie hier.
BrushNet weist einige Einschränkungen auf (aus dem Papier):
Aufgrund der Natur des BrushNet-Codes sind einige Knoten leider nicht damit kompatibel, da wir versuchen, die gleichen ComfyUI-Funktionen zu patchen.
Liste bekannter inkompartibler Knoten.
Der Code basiert auf